src/pages/ (routes & endpoints)Before designing or restyling any page here, load and follow the
vayce-designskill (skills/vayce-design/SKILL.md) — pages assemble the workbench surfaces and must stay coherent. Don’t write tool or article content in pages (it lives insrc/content/, governed byvayce-writing-style); pages only render it.
File-based routes and a few dynamic endpoints. Pages compose src/layouts/Layout.astro, src/components/, and content collections — they should contain layout/wiring, not hardcoded copy.
pages/
├── index.astro # Homepage (FEATURED_APPS lives here)
├── tools/
│ ├── index.astro # Tools directory
│ ├── categories/[slug].astro # Per-category listing
│ ├── [slug]/index.astro # A tool page (non-variant entries)
│ ├── [slug]/[entry].astro # A tool variant page
│ ├── [slug]/tool.webmanifest.ts # Per-tool PWA manifest (dynamic)
│ └── [slug]/sw.js.ts # Per-tool service worker (dynamic)
├── workflows/
│ ├── index.astro # Workflows hub (hand-designed section per workflow)
│ └── [slug]/index.astro # A workflow page (workflows collection)
├── blog/
│ ├── index.astro / all.astro # Blog index
│ ├── [...slug].astro # A post or guide part (nested slugs)
│ └── topics/index.astro, [slug].astro
├── policies/index.astro, [slug].astro
├── llms.txt.ts / llms-full.txt.ts # AI-readable indexes of tools + posts
└── robots.txt.ts # robots.txt (also advertises sitemap + llms)
[slug]/index.astro runs getStaticPaths over the applications collection (non-variant entries). The URL slug is the content directory name. It dynamically imports the glue component named in the entry’s component: field, sets data-cat={categoryId} on #tool-root (this is what drives --cat), and renders the markdown body + FAQ + related sections. Never add a per-tool page file — adding a content entry is enough.workflows/[slug]/index.astro mirrors the tool route over the workflows collection — dynamic glue import from src/components/workflows/${component}.astro, data-cat from the category reference, markdown body + conditional FAQ. Never add a per-workflow page file; the hub (workflows/index.astro) gets one hand-designed full-width section per workflow, pulling its metadata from the collection.[slug]/[entry].astro handles entries whose slug contains /. Variant selection happens in the glue component by parsing the pathname (see src/components/AGENTS.md), not here.[...slug].astro maps every posts entry by its slug, so posts/<series>/<part>.md → /blog/<series>/<part>/. Multi-part guides nest automatically; it builds the series breadcrumb from the slug and the part label from the title after the first :.tool.webmanifest.ts and sw.js.ts emit one per non-variant tool. VITE_BUILD_ID versions the SW cache name. SW registration is not wired up yet (offline dormant). See the root README’s PWA section.vayce-writing-style.data-cat wiring or the dynamic component import; tools rely on them.FEATURED_APPS in index.astro.astro.config.mjs, not a stub page.dist/tools/ only if a route seems missing.