- Bumps vibn-frontend submodule to the new tabbed project shell - Adds PROJECT_PAGE_ARCHITECTURE.md documenting the section charters, boundary rules, and phased delivery plan Phase 1 ships only the tab shell + Product tab live data (Gitea file tree per codebase). Infra/Hosting tabs are stubbed and the old 15 sidebar routes are intentionally untouched during migration. Made-with: Cursor
10 KiB
Project Page Architecture — Product / Infrastructure / Hosting
The plan to collapse the 16-page sidebar mess at
/[workspace]/project/[projectId]/*into 3 founder-friendly sections, and to make/project/<id>actually reflect what the AI is doing in the dev container instead of stale Gitea/prod-Coolify data.Companion to:
AI_PATH_B_EXECUTION_PLAN.md(Path B is the engine; this doc is the dashboard for it).Status: week 1 doc + home-page redesign in flight (2026-04-28).
1. Why this exists
Today the project page (/[workspace]/project/[projectId]) shows two
tiles — Code + Infrastructure — and links to a sidebar with 16
sub-routes (build, run, infrastructure, deployment,
overview, insights, analytics, prd, tasks, settings,
assist, design, growth, grow, mvp-setup, code — the last
of which doesn't exist as a route, so the home tile is a dead link).
Two structural problems:
- The sidebar grew without an anchor concept. Founders have no mental model of what the 16 pages map to; they just see a list and click around hoping for the right one. Half the pages are placeholders ("Coming soon"); the rest overlap.
- None of the data sources have been updated for Path B. The
Code tile reads the Gitea repo (production master branch), but the
AI now writes to the dev container's
/workspace, often without pushing for hours. The Infrastructure tile reads production Coolify apps; newdev_server.startpreviews don't show up anywhere. So when AI does great work in chat, the project page doesn't update — the user has to tab back to chat to see anything.
2. The framing
Three sections, founder-friendly names, every project on Vibn maps cleanly into all three:
| Section | What it is | Founder asks… |
|---|---|---|
| Product | Custom code, design, content built for THIS vision | "What did I build?" |
| Infrastructure | Reusable, swappable third-party services (auth, db, email, payments…) | "What do I depend on?" |
| Hosting | Where the product runs and how people reach it (Coolify, domain, observability, cost) | "Where does it live?" |
The boundary rule
Custom code = Product. Third-party service = Infrastructure. Runtime + reachability = Hosting.
Concrete edge cases:
- A custom
/api/uploadendpoint that calls S3 → endpoint is Product, S3 bucket + credentials are Infrastructure. - Custom job that sends a welcome email → job is Product, the job runner (Sidekiq/BullMQ) and email service (Resend) are Infrastructure.
- Webhook handler that processes Stripe events → handler is Product, Stripe is Infrastructure.
- Coolify scheduled task that runs your code → your code is Product, Coolify itself is Hosting.
3. Charters
Product
Everything custom-built for this specific vision. The unique IP that wouldn't exist without this product.
Includes:
- Frontend web app
- Marketing site
- Custom backend code & APIs
- Custom business logic
- Custom jobs / runners (the code, not the runner)
- Brand, copy, design system
- The repository itself
- Customer base — the actual users you've earned
Rule: if you wrote it for this product, it's Product. If it's
node_modules or a third-party SDK, it's not.
Infrastructure
The reusable, swappable services your product depends on. The annoying multi-vendor world where you have to pick a provider.
Includes:
- Auth provider (Clerk, Pocketbase, Authentik, Google OAuth, …)
- Database (Postgres, MySQL, MongoDB, Redis, …)
- File storage (S3, R2, MinIO)
- Email (Resend, SendGrid, SES)
- Payments (Stripe, Paddle, Lemon Squeezy)
- Analytics (Plausible, PostHog, GA)
- Search (Algolia, Meili, Typesense)
- LLM provider (OpenAI, Anthropic, Gemini, Vertex)
- Queues, maps, SMS, push notifications, …
- Secrets and API keys that wire all of the above
Rule: if you could swap the vendor without changing your product code, it's Infrastructure.
Hosting
Where the product physically runs and how people reach it.
Includes:
- Container runtime (Coolify in our case)
- Domain + DNS + SSL
- CDN / edge
- Observability (logs, errors, uptime)
- Backups
- Monthly cost
Rule: it's about runtime and reachability, not about what the software does.
4. Future sections (deferred)
Add as separate top-level cards once they become real concerns:
- Models — for AI-heavy products: which LLMs, which embedding model, prompt versions, eval scores, cost-per-call.
- Analytics — when there are real users worth measuring.
- Marketing — campaigns, blog, SEO, social, when there's a growth motion.
- Compliance — Terms, Privacy, GDPR, SOC2, when shipping to paying customers.
- Support — helpdesk, chat, status page, when there are customers complaining.
- Team — when the project has more than one collaborator.
Same charter template each time. Same rule: code = Product, swappable = Infrastructure, runs/reachable = Hosting, otherwise it needs its own section.
5. Mapping today → tomorrow
| Today's page | Where it goes | Notes |
|---|---|---|
(home)/page.tsx |
New (home)/page.tsx (3-card grid) |
Full redesign |
code (404) |
product/ (new) |
Stub the route, point home tile at it |
build |
Subroute under product/files (later) |
Heavy 1626 lines; preserve the file tree component |
run |
hosting/ |
Production runtime |
infrastructure |
hosting/ |
Same data, different name |
deployment |
hosting/deploys (later) |
Deploy history is Hosting |
overview |
Subroute under product/ or merged into home |
Decide once we see how home feels |
prd |
Subroute under product/ (vision) |
Or its own "Define" section if we add one |
tasks |
Subroute under product/ (roadmap) |
Or its own section later |
assist |
product/ (it's emails/chat your product sends) |
These ARE product features |
design |
product/design |
Custom for this vision |
growth, grow, analytics, insights, mvp-setup |
Defer, probably absorbed into a future "Analytics" or "Marketing" section | Many are placeholders today |
settings |
Top-right gear (lives outside the 3 sections) | Project-level meta |
Net: 16 routes → 3 sections (+ settings). 8+ pages get rationalized into nothing because they were duplicating their neighbors.
6. Phased delivery
Phase 1 — Tab navigation + section stubs (this session)
The three sections are TABS at the project level, not a card-grid landing page. A founder lands on the project URL and is immediately inside Product (the default tab); flipping to Infrastructure or Hosting is one click and stays in the same view. No intermediate "click a tile to drill in" step.
URL shape:
/[workspace]/project/[id] → 308 redirect to /product
/[workspace]/project/[id]/product → Product tab
/[workspace]/project/[id]/infrastructure → Infrastructure tab
/[workspace]/project/[id]/hosting → Hosting tab
A shared layout at the project root renders:
- Project header (name, vision, stage pill, settings gear)
- Tab bar (Product · Infrastructure · Hosting) — active tab highlighted; each tab carries a tiny status dot (green/amber/grey)
- Slot for the active tab's page
The current (home)/page.tsx (the two-tile landing) is replaced by
the redirect.
Don't kill anything in (workspace)/. Existing 16 routes stay
alive while we migrate. Sidebar still works for them.
Phase 2 — Wire data sources
- Product card reads from the dev container's
/workspace:- File count + recent edits via
fs.listagainst the project's dev container - User count from the project's auth provider (Pocketbase / Clerk / etc.)
- Frontend URL from
dev_server.listor productionapps_list
- File count + recent edits via
- Infrastructure card reads from Coolify databases, env vars,
and known integrations:
- Database type + size
- Auth provider name
- Wired services (any env var matching
STRIPE_*,RESEND_*, etc.)
- Hosting card reads from Coolify apps + domains + container metrics:
- Production URL, SSL status, last deploy
- Monthly cost (Coolify resource usage × pricing)
- Recent error count (from logs)
Phase 3 — Section detail pages
Build each of /product, /infrastructure, /hosting as a real,
useful surface. Each page can have internal subnav for the bits
listed in its charter (e.g., Product has Frontend, Backend, Jobs,
Brand, Customers; Infrastructure has Auth, DB, Storage, Email,
Payments, …).
Phase 4 — Migration / deletion
Once the new structure is proven, redirect the legacy routes:
code→productbuild→product/filesrun→hostinginfrastructure→hostingdeployment→hosting/deploysprd,tasks,assist→product/...growth,grow,analytics,insights,mvp-setup→ soft-delete with a tombstone redirect toproductor to a future section page.
7. Open questions
- Where do the chat threads live? They're a per-project conversation surface today (right rail in the chat panel). I'd argue they're not a section — they're across sections, like the AI is. Keep as the persistent right rail.
- Settings is technically project-level meta, not one of the three sections. Where does it surface? Gear icon in the page header, opens settings as a side sheet or as a separate route. Decide when we get there.
- Mobile layout — three cards stack vertically; no special layout needed. The section detail pages need a layout pass when we get to phase 3.
8. Success criteria
You should be able to look at /project/<id> after AI activity in
chat and immediately see:
- "What did the AI just build?" → Product card updated count of files + recent diffs.
- "What's it depending on?" → Infrastructure card shows the new Postgres, the new Stripe key, etc.
- "Is it live?" → Hosting card shows the dev preview URL or the production URL with status.
If any of those three answers requires going back to the chat or checking another page, the redesign hasn't worked.