Developer docs
Reference

Frontend & routes

Every route, what it renders, and what it needs.

docs/FRONTEND.md

@verjson/web — Next.js App Router. No database driver, no database credentials. Everything comes over HTTP from @verjson/api, and the boundary is a lint rule rather than a convention.

Route groups

Groups exist so each set of pages ships only the JavaScript it needs.

GroupAuthShipsPurpose
(marketing)noneno providersThe landing page
(docs)nonemarkdown renderer/docs — this site
(board)nonedashboard only/dashboard, the build board
(auth)nonequery + auth + toastsLogin, signup, OAuth callback
(app)requiredquery + auth + toasts + shellThe product

The board sits outside the guard on purpose: it is an internal build board, and requiring a session to read the roadmap would be friction with no security benefit.

Routes

RouteRendersStatus
/Landing. Build status read from data/dashboard/, so it cannot claim progress the board disagrees with✅
/docs · /docs/[slug]This documentation, driven by data/docs/manifest.json✅
/dashboardSeven-tab command centre✅
/style-guideLive retheming; dev-only save back into globals.css✅
/login · /signup · /auth/callbackSession entry✅
/projectsProject list with budget roll-ups✅
/projects/[id]Marketing mix picker and the budget table✅
/approvalsThe queue humans and agents converge on✅
/billingPlan, usage against limits, Stripe portal✅
/calendarMarketing calendar🔲
/campaignsCampaign list and live control🔲
/kpisOne KPI surface🔲
/integrationsConnect channels, ad accounts, OpenSEO, GitHub, WhatsApp🔲

Responsive contract

Three real layouts, not one that scrolls sideways.

WidthNavigationContent
< md (768)Drawer behind a menu buttonSingle column; cards stack
md–lgIcons only, label as tooltip and accessible nameTwo columns where it helps
≥ lg (1024)Icon + labelFull layout; docs and dashboard get a sidebar

The page body never scrolls horizontally. Anything intrinsically wide — a table, a mermaid diagram, a code block — scrolls inside its own container. A nav that "fits" by hiding items behind a horizontal scroll is not responsive; it is broken at a width nobody tested. That was B-003.

Data access

LayerRule
lib/api.tsThe only module that knows the API's address. axios + transparent 401 refresh
lib/*.ts hooksReact Query per feature. Types imported from @verjson/contracts
Server componentsMay read data/ and docs/ from disk. Never the database
no-restricted-importsPrisma, @verjson/api and DB drivers are lint errors here