create-ailk 0.7.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (310) hide show
  1. package/README.md +112 -10
  2. package/component-catalog.json +798 -49
  3. package/component-catalog.md +9 -6
  4. package/dist/add-module.d.ts +20 -0
  5. package/dist/add-module.js +43 -7
  6. package/dist/add-route.d.ts +56 -0
  7. package/dist/add-route.js +286 -0
  8. package/dist/apply-design-md.d.ts +7 -0
  9. package/dist/apply-design-md.js +50 -0
  10. package/dist/apply-design.d.ts +64 -0
  11. package/dist/apply-design.js +273 -0
  12. package/dist/claude-md.d.ts +111 -0
  13. package/dist/claude-md.js +334 -0
  14. package/dist/cli.js +114 -28
  15. package/dist/derive-architecture.js +41 -36
  16. package/dist/design-compile.d.ts +71 -0
  17. package/dist/design-compile.js +98 -0
  18. package/dist/design-package.d.ts +83 -0
  19. package/dist/design-package.js +468 -0
  20. package/dist/design-presets.d.ts +86 -0
  21. package/dist/design-presets.js +642 -0
  22. package/dist/design-scaffold.d.ts +76 -0
  23. package/dist/design-scaffold.js +220 -0
  24. package/dist/index.d.ts +2 -1
  25. package/dist/index.js +4 -1
  26. package/dist/legacy-nav-renderers.d.ts +45 -0
  27. package/dist/legacy-nav-renderers.js +545 -0
  28. package/dist/lib/auth-secret-file.d.ts +19 -0
  29. package/dist/lib/auth-secret-file.js +112 -0
  30. package/dist/lib/design-checks.d.ts +78 -0
  31. package/dist/lib/design-checks.js +174 -0
  32. package/dist/lib/extract-module-bundle.js +5 -1
  33. package/dist/lib/license-key-files.d.ts +9 -0
  34. package/dist/lib/license-key-files.js +2 -2
  35. package/dist/lib/module-license-gate.d.ts +89 -0
  36. package/dist/lib/module-license-gate.js +171 -12
  37. package/dist/lib/module-tier.d.ts +45 -16
  38. package/dist/lib/module-tier.js +76 -0
  39. package/dist/lib/pro-callout.js +10 -2
  40. package/dist/lib/render-verdict.d.ts +52 -0
  41. package/dist/lib/render-verdict.js +77 -0
  42. package/dist/lib/scaffold-render-sweep.d.ts +105 -0
  43. package/dist/lib/scaffold-render-sweep.js +236 -0
  44. package/dist/module-architecture.d.ts +19 -16
  45. package/dist/module-architecture.js +64 -21
  46. package/dist/parse-args.d.ts +88 -10
  47. package/dist/parse-args.js +272 -21
  48. package/dist/programmatic.d.ts +66 -12
  49. package/dist/programmatic.js +361 -34
  50. package/dist/site-chrome.d.ts +19 -9
  51. package/dist/site-chrome.js +23 -13
  52. package/dist/site-manifest.d.ts +25 -0
  53. package/dist/site-manifest.js +254 -0
  54. package/dist/site-roster.d.ts +41 -0
  55. package/dist/site-roster.js +149 -11
  56. package/dist/starter-grid.d.ts +232 -0
  57. package/dist/starter-grid.js +545 -0
  58. package/dist/surfaces.d.ts +41 -9
  59. package/dist/surfaces.js +268 -92
  60. package/dist/template-manifest.d.ts +65 -29
  61. package/dist/template-manifest.js +161 -382
  62. package/dist/template-names.d.ts +14 -12
  63. package/dist/template-names.js +13 -17
  64. package/package.json +5 -4
  65. package/site-templates/_base/content/en/Feature/feature-1.mdx +69 -0
  66. package/site-templates/_base/content/en/Feature/feature-2.mdx +69 -0
  67. package/site-templates/_base/content/en/Feature/feature-3.mdx +69 -0
  68. package/site-templates/_base/content/en/FeaturesList/features.mdx +91 -0
  69. package/site-templates/_base/content/en/GlossaryList/glossary.mdx +0 -1
  70. package/site-templates/_base/content/en/NewsletterSignup/newsletter.mdx +0 -1
  71. package/site-templates/_base/content/en/PortfolioItem/sample-four.mdx +105 -0
  72. package/site-templates/_base/content/en/PortfolioItem/sample-one.mdx +34 -0
  73. package/site-templates/_base/content/en/PortfolioItem/sample-three.mdx +94 -0
  74. package/site-templates/_base/content/en/PortfolioItem/sample-two.mdx +45 -0
  75. package/site-templates/_base/content/en/PortfolioList/portfolio.mdx +169 -0
  76. package/site-templates/_base/content/en/PrivacyPage/privacy.mdx +15 -0
  77. package/site-templates/_base/content/en/UseCase/persona-1.mdx +70 -0
  78. package/site-templates/_base/content/en/UseCase/persona-2.mdx +70 -0
  79. package/site-templates/_base/content/en/UseCase/persona-3.mdx +70 -0
  80. package/site-templates/{minimalism-site/TEMPLATE-MANIFEST.json → aliases/minimalism-site.TEMPLATE-MANIFEST.json} +72 -40
  81. package/site-templates/designs/minimalism/DESIGN.md +98 -6
  82. package/site-templates/designs/minimalism/sample/README.md +48 -0
  83. package/site-templates/designs/standard/DESIGN.md +103 -6
  84. package/site-templates/marketing-site/DESIGN.md +103 -6
  85. package/site-templates/marketing-site/TEMPLATE-MANIFEST.json +144 -47
  86. package/site-templates/marketing-site/TEMPLATE-MANIFEST.md +82 -41
  87. package/site-templates/marketing-site-free/DESIGN.md +103 -6
  88. package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.json +150 -48
  89. package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.md +114 -67
  90. package/site-templates/marketing-site-free/ailk-template.json +1 -1
  91. package/site-templates/marketing-site-free/content/en/NewsletterSignup/newsletter.mdx +59 -0
  92. package/site-templates/marketing-site-free/content/en/Pricing/pricing.mdx +199 -0
  93. package/site-templates/saas-product/DESIGN.md +103 -6
  94. package/site-templates/saas-product/TEMPLATE-MANIFEST.md +9 -1
  95. package/site-templates/{simple-service → shapes/local-business-service}/TEMPLATE-MANIFEST.json +210 -81
  96. package/site-templates/shapes/local-business-service/TEMPLATE-MANIFEST.md +356 -0
  97. package/site-templates/shapes/local-business-service/ailk-template.json +10 -0
  98. package/site-templates/{simple-service → shapes/local-business-service}/content/en/AboutPage/about.mdx +4 -4
  99. package/site-templates/shapes/local-business-service/content/en/HomePage/home.mdx +70 -0
  100. package/site-templates/shapes/local-business-service/content/en/NewsletterSignup/newsletter.mdx +59 -0
  101. package/site-templates/shapes/local-business-service/content/en/PortfolioList/portfolio.mdx +171 -0
  102. package/site-templates/{minimalism-site → shapes/local-business-service}/content/en/PurchasePolicyPage/purchase-policy.mdx +7 -8
  103. package/site-templates/shapes/local-business-service/content/en/Service/first-job.mdx +39 -0
  104. package/site-templates/shapes/local-business-service/content/en/Service/second-job.mdx +39 -0
  105. package/site-templates/shapes/local-business-service/content/en/Service/third-job.mdx +39 -0
  106. package/site-templates/shapes/local-business-service/content/en/ServicesList/services.mdx +61 -0
  107. package/site-templates/shapes/local-business-service/provenance.json +4 -0
  108. package/site-templates/shapes/organization-service/TEMPLATE-MANIFEST.json +471 -0
  109. package/site-templates/shapes/organization-service/TEMPLATE-MANIFEST.md +354 -0
  110. package/site-templates/shapes/organization-service/ailk-template.json +10 -0
  111. package/site-templates/shapes/organization-service/content/en/AboutPage/about.mdx +38 -0
  112. package/site-templates/shapes/organization-service/content/en/HomePage/home.mdx +85 -0
  113. package/site-templates/shapes/organization-service/content/en/NewsletterSignup/newsletter.mdx +59 -0
  114. package/site-templates/shapes/organization-service/content/en/PortfolioList/portfolio.mdx +171 -0
  115. package/site-templates/shapes/organization-service/content/en/PurchasePolicyPage/purchase-policy.mdx +123 -0
  116. package/site-templates/{minimalism-site → shapes/organization-service}/content/en/ServicesList/services.mdx +3 -4
  117. package/site-templates/shapes/organization-service/provenance.json +4 -0
  118. package/site-templates/shapes/person-service/TEMPLATE-MANIFEST.json +478 -0
  119. package/site-templates/shapes/person-service/TEMPLATE-MANIFEST.md +353 -0
  120. package/site-templates/shapes/person-service/ailk-template.json +10 -0
  121. package/site-templates/shapes/person-service/content/_site.mdx +85 -0
  122. package/site-templates/shapes/person-service/content/en/AboutPage/about.mdx +39 -0
  123. package/site-templates/shapes/person-service/content/en/HomePage/home.mdx +97 -0
  124. package/site-templates/shapes/person-service/content/en/NewsletterSignup/newsletter.mdx +59 -0
  125. package/site-templates/shapes/person-service/content/en/PortfolioList/portfolio.mdx +171 -0
  126. package/site-templates/{simple-service → shapes/person-service}/content/en/PurchasePolicyPage/purchase-policy.mdx +10 -11
  127. package/site-templates/shapes/person-service/content/en/Service/first-engagement.mdx +38 -0
  128. package/site-templates/shapes/person-service/content/en/Service/second-engagement.mdx +38 -0
  129. package/site-templates/shapes/person-service/content/en/Service/third-engagement.mdx +38 -0
  130. package/site-templates/{simple-service → shapes/person-service}/content/en/ServicesList/services.mdx +16 -16
  131. package/site-templates/shapes/person-service/provenance.json +4 -0
  132. package/templates/.claude/rules/architecture.md +7 -0
  133. package/templates/.claude/skills/README.md +5 -3
  134. package/templates/.claude/skills/add-auth/references/env-vars.md +22 -15
  135. package/templates/.claude/skills/add-auth/references/oauth-app-setup.md +3 -2
  136. package/templates/.claude/skills/add-page/SKILL.md +241 -238
  137. package/templates/.claude/skills/add-page/references/page-types.md +85 -72
  138. package/templates/.claude/skills/add-page/scripts/site-pages.mjs +87 -0
  139. package/templates/.claude/skills/add-page/templates/comparison-page.mdx.tmpl +99 -0
  140. package/templates/.claude/skills/add-page/templates/content.mdx.tmpl +8 -18
  141. package/templates/.claude/skills/add-page/templates/flow-landing-page.mdx.tmpl +43 -0
  142. package/templates/.claude/skills/add-page/templates/report-page.mdx.tmpl +52 -0
  143. package/templates/.claude/skills/add-page/templates/reports-list.mdx.tmpl +38 -0
  144. package/templates/.claude/skills/check-site/SKILL.md +23 -0
  145. package/templates/.claude/skills/fill-page/SKILL.md +26 -7
  146. package/templates/.claude/skills/fill-page/profiles/plumbing.yaml +1 -1
  147. package/templates/.claude/skills/setup-database/SKILL.md +156 -0
  148. package/templates/.claude/skills/setup-database/scripts/verify-inbox.ts +154 -0
  149. package/templates/.claude/skills/setup-deploy/SKILL.md +64 -32
  150. package/templates/.claude/skills/setup-deploy/references/env-vars-template.md +44 -36
  151. package/templates/.claude/skills/setup-deploy/references/runbook-template.md +58 -102
  152. package/templates/.claude/skills/update-page/SKILL.md +117 -0
  153. package/templates/.claude/skills/update-page/scripts/update-page.ts +640 -0
  154. package/templates/.claude/skills/update-page/templates/redirects.mjs.tmpl +31 -0
  155. package/templates/.claude/skills/upgrade-plan/SKILL.md +12 -8
  156. package/templates/.github/workflows/ci.yml +4 -0
  157. package/templates/.prettierignore +1 -0
  158. package/templates/CLAUDE.md +146 -103
  159. package/templates/DESIGN.md +103 -6
  160. package/templates/README.md +63 -43
  161. package/templates/apps/api/.env.example +2 -1
  162. package/templates/apps/api/CLAUDE.md +3 -2
  163. package/templates/apps/api/src/__tests__/commerce-claim-registration.test.ts +2 -0
  164. package/templates/apps/api/src/__tests__/server.test.ts +116 -0
  165. package/templates/apps/api/src/config/__tests__/index.test.ts +115 -14
  166. package/templates/apps/api/src/config/index.ts +35 -16
  167. package/templates/apps/api/src/lib/__tests__/lead-capture-store.test.ts +30 -0
  168. package/templates/apps/api/src/lib/__tests__/lead-delivery.test.ts +96 -0
  169. package/templates/apps/api/src/lib/lead-capture-store.ts +12 -0
  170. package/templates/apps/api/src/lib/lead-delivery.ts +52 -0
  171. package/templates/apps/api/src/lib/stripe.ts +9 -0
  172. package/templates/apps/api/src/middleware/__tests__/auth.optional-cookie.test.ts +140 -0
  173. package/templates/apps/api/src/middleware/auth.ts +54 -0
  174. package/templates/apps/api/src/openapi/spec.ts +63 -12
  175. package/templates/apps/api/src/routes/checkout/__tests__/session.test.ts +5 -2
  176. package/templates/apps/api/src/routes/checkout/__tests__/sessions.test.ts +628 -0
  177. package/templates/apps/api/src/routes/checkout/sessions.ts +222 -24
  178. package/templates/apps/api/src/routes/leads/__tests__/capture.test.ts +88 -0
  179. package/templates/apps/api/src/routes/leads/__tests__/index.test.ts +100 -0
  180. package/templates/apps/api/src/routes/leads/index.ts +46 -1
  181. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-flow-checkout.test.ts +1 -1
  182. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-org-billing.test.ts +5 -1
  183. package/templates/apps/api/src/routes/webhooks/__tests__/stripe.test.ts +521 -20
  184. package/templates/apps/api/src/routes/webhooks/stripe.ts +124 -32
  185. package/templates/apps/api/src/server.ts +35 -0
  186. package/templates/apps/api/src/services/__tests__/lead-routing.test.ts +194 -0
  187. package/templates/apps/api/src/services/__tests__/leads-inbox.test.ts +124 -0
  188. package/templates/apps/api/src/services/__tests__/revalidation.test.ts +90 -15
  189. package/templates/apps/api/src/services/checkout-buyer.ts +72 -0
  190. package/templates/apps/api/src/services/lead-routing.ts +140 -30
  191. package/templates/apps/api/src/services/leads-inbox.ts +48 -11
  192. package/templates/apps/api/src/services/revalidation.ts +60 -15
  193. package/templates/apps/mcp/__tests__/parity.test.ts +5 -4
  194. package/templates/apps/mcp/__tests__/tools/create_project.test.ts +30 -24
  195. package/templates/apps/mcp/src/tools/create_project.ts +21 -6
  196. package/templates/apps/mcp/src/tools/purchase.ts +4 -2
  197. package/templates/apps/web/.env.example +13 -0
  198. package/templates/apps/web/CLAUDE.md +22 -28
  199. package/templates/apps/web/app/[locale]/(auth)/layout.tsx +1 -1
  200. package/templates/apps/web/app/[locale]/(authed)/leads/__tests__/page.test.tsx +24 -0
  201. package/templates/apps/web/app/[locale]/(authed)/leads/page.tsx +17 -6
  202. package/templates/apps/web/app/[locale]/[slug]/[detail]/__tests__/page.test.tsx +110 -0
  203. package/templates/apps/web/app/[locale]/[slug]/[detail]/page.tsx +60 -0
  204. package/templates/apps/web/app/[locale]/[slug]/page.tsx +1 -1
  205. package/templates/apps/web/app/[locale]/alternatives/__tests__/page.test.tsx +161 -0
  206. package/templates/apps/web/app/[locale]/alternatives/page.tsx +104 -0
  207. package/templates/apps/web/app/[locale]/contact/ConversationalIntakeWrapper.tsx +14 -6
  208. package/templates/apps/web/app/[locale]/contact/__tests__/ConversationalIntakeWrapper.test.tsx +10 -9
  209. package/templates/apps/web/app/[locale]/contact/__tests__/contact-form-text.test.ts +32 -0
  210. package/templates/apps/web/app/[locale]/contact/__tests__/contact.actions.test.ts +129 -0
  211. package/templates/apps/web/app/[locale]/contact/__tests__/page-renderer-migration.test.tsx +227 -84
  212. package/templates/apps/web/app/[locale]/contact/contact-form-text.ts +50 -0
  213. package/templates/apps/web/app/[locale]/contact/contact.actions.ts +73 -20
  214. package/templates/apps/web/app/[locale]/contact/page.tsx +105 -15
  215. package/templates/apps/web/app/[locale]/contact/site-contact-email.ts +54 -0
  216. package/templates/apps/web/app/[locale]/features/[slug]/page.tsx +64 -0
  217. package/templates/apps/web/app/[locale]/features/page.tsx +52 -0
  218. package/templates/apps/web/app/[locale]/{use-cases → for}/[slug]/page.tsx +21 -5
  219. package/templates/apps/web/app/[locale]/for/__tests__/page-renderer-migration.test.tsx +73 -0
  220. package/templates/apps/web/app/[locale]/{use-cases → for}/page.tsx +8 -7
  221. package/templates/apps/web/app/[locale]/glossary/page.tsx +1 -1
  222. package/templates/apps/web/app/[locale]/layout.tsx +65 -17
  223. package/templates/apps/web/app/[locale]/newsletter/__tests__/newsletter.actions.test.ts +75 -0
  224. package/templates/apps/web/app/[locale]/newsletter/__tests__/page.test.tsx +163 -0
  225. package/templates/apps/web/app/[locale]/newsletter/newsletter.actions.ts +66 -0
  226. package/templates/apps/web/app/[locale]/newsletter/page.tsx +106 -14
  227. package/templates/apps/web/app/[locale]/portfolio/[slug]/page.tsx +59 -0
  228. package/templates/apps/web/app/[locale]/{book-a-call → portfolio}/page.tsx +12 -13
  229. package/templates/apps/web/app/[locale]/vs/[slug]/__tests__/page.test.tsx +112 -0
  230. package/templates/apps/web/app/[locale]/vs/[slug]/page.tsx +70 -0
  231. package/templates/apps/web/app/api/revalidate/__tests__/route.test.ts +236 -44
  232. package/templates/apps/web/app/api/revalidate/route.ts +78 -36
  233. package/templates/apps/web/lib/__tests__/site-brand.test.ts +79 -0
  234. package/templates/apps/web/lib/__tests__/site-theme.test.ts +104 -11
  235. package/templates/apps/web/lib/__tests__/structured-data.test.tsx +21 -4
  236. package/templates/apps/web/lib/locale-guard.ts +18 -0
  237. package/templates/apps/web/lib/meet-placeholder.ts +5 -0
  238. package/templates/apps/web/lib/nav-config.ts +50 -37
  239. package/templates/apps/web/lib/site-brand.tsx +13 -9
  240. package/templates/apps/web/lib/site-identity.ts +14 -0
  241. package/templates/apps/web/lib/site-logo.tsx +36 -0
  242. package/templates/apps/web/lib/site-theme.ts +46 -26
  243. package/templates/apps/web/messages/en.json +45 -5
  244. package/templates/apps/web/middleware.ts +28 -4
  245. package/templates/content/_site.mdx +4 -2
  246. package/templates/content/en/BlogList/blog.mdx +37 -16
  247. package/templates/content/en/BookCall/book-a-call.mdx +80 -0
  248. package/templates/content/en/BookCall/onsite-estimate.mdx +56 -0
  249. package/templates/content/en/BookCall/onsite-service.mdx +56 -0
  250. package/templates/content/en/BookCall/start-project.mdx +56 -0
  251. package/templates/content/en/ContactPage/contact.mdx +43 -34
  252. package/templates/content/en/HomePage/home.mdx +10 -22
  253. package/templates/content/en/LandingPage/meet.mdx +59 -0
  254. package/templates/content/en/PurchasePolicyPage/purchase-policy.mdx +0 -1
  255. package/templates/content/en/UseCasesList/{use-cases.mdx → for.mdx} +19 -18
  256. package/templates/database/CHANGELOG.md +14 -0
  257. package/templates/database/package.json +1 -1
  258. package/templates/package.json +2 -1
  259. package/templates/tools/check-claude-md.ts +128 -0
  260. package/versions.json +33 -33
  261. package/site-templates/_base/content/en/BookCall/book-call.mdx +0 -53
  262. package/site-templates/_base/content/en/UseCase/first-use-case.mdx +0 -23
  263. package/site-templates/_base/content/en/UseCase/second-use-case.mdx +0 -23
  264. package/site-templates/_base/content/en/UseCase/third-use-case.mdx +0 -23
  265. package/site-templates/minimalism-site/DESIGN.md +0 -162
  266. package/site-templates/minimalism-site/TEMPLATE-MANIFEST.md +0 -470
  267. package/site-templates/minimalism-site/ailk-template.json +0 -23
  268. package/site-templates/minimalism-site/content/en/AboutPage/about.mdx +0 -110
  269. package/site-templates/minimalism-site/content/en/BookCall/book-call.mdx +0 -53
  270. package/site-templates/minimalism-site/content/en/ContactPage/contact.mdx +0 -34
  271. package/site-templates/minimalism-site/content/en/FAQPage/faq.mdx +0 -57
  272. package/site-templates/minimalism-site/content/en/LandingPage/referral.mdx +0 -77
  273. package/site-templates/minimalism-site/content/en/LandingPage/reports.mdx +0 -73
  274. package/site-templates/minimalism-site/content/en/ReportPage/annual-letter-2024.mdx +0 -52
  275. package/site-templates/minimalism-site/content/en/ReportPage/field-notes-2023.mdx +0 -52
  276. package/site-templates/minimalism-site/content/en/ReportPage/platform-shift-2025.mdx +0 -52
  277. package/site-templates/minimalism-site/content/en/ReportPage/state-of-the-market-2026.mdx +0 -52
  278. package/site-templates/minimalism-site/flows/referral.flow.json +0 -71
  279. package/site-templates/minimalism-site/provenance.json +0 -4
  280. package/site-templates/simple-service/DESIGN.md +0 -162
  281. package/site-templates/simple-service/TEMPLATE-MANIFEST.md +0 -333
  282. package/site-templates/simple-service/ailk-template.json +0 -11
  283. package/site-templates/simple-service/content/en/BookCall/book-call.mdx +0 -53
  284. package/site-templates/simple-service/content/en/ContactPage/contact.mdx +0 -32
  285. package/site-templates/simple-service/content/en/FAQPage/faq.mdx +0 -56
  286. package/site-templates/simple-service/content/en/HomePage/home.mdx +0 -85
  287. package/site-templates/simple-service/content/en/Service/landscape-design.mdx +0 -40
  288. package/site-templates/simple-service/content/en/Service/lawn-maintenance.mdx +0 -40
  289. package/site-templates/simple-service/content/en/Service/seasonal-cleanup.mdx +0 -40
  290. package/site-templates/simple-service/provenance.json +0 -4
  291. package/templates/.claude/skills/add-page/templates/route.tsx.tmpl +0 -28
  292. package/templates/apps/web/app/[locale]/contact/ContactForm.tsx +0 -211
  293. package/templates/apps/web/app/[locale]/contact/__tests__/ContactForm.test.tsx +0 -96
  294. package/templates/apps/web/app/[locale]/use-cases/__tests__/page-renderer-migration.test.tsx +0 -72
  295. package/templates/content/en/SoftwareProduct/product.mdx +0 -175
  296. /package/site-templates/{minimalism-site → designs/minimalism/sample}/content/en/HomePage/home.mdx +0 -0
  297. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-1.svg +0 -0
  298. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-2.svg +0 -0
  299. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-3.svg +0 -0
  300. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-4.svg +0 -0
  301. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-5.svg +0 -0
  302. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-6.svg +0 -0
  303. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/hero-backdrop.svg +0 -0
  304. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/logo-placeholder-1.svg +0 -0
  305. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/logo-placeholder-2.svg +0 -0
  306. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/logo-placeholder-3.svg +0 -0
  307. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/wordmark-placeholder.svg +0 -0
  308. /package/site-templates/{minimalism-site → shapes/organization-service}/content/en/Service/first-engagement.mdx +0 -0
  309. /package/site-templates/{minimalism-site → shapes/organization-service}/content/en/Service/second-engagement.mdx +0 -0
  310. /package/site-templates/{minimalism-site → shapes/organization-service}/content/en/Service/third-engagement.mdx +0 -0
@@ -4,7 +4,7 @@
4
4
  "categories": ["accounting", "legal", "technology"],
5
5
  "shape": "organization-product",
6
6
  "design": "standard",
7
- "generatedHash": "94f2cb77c5d2d72493fbf73e7599836557d44d77d48e0746896d370cdd371b4b",
7
+ "generatedHash": "54b11878a0ad8b1f1dccae73ba4580c08b7135bec274bd52182ffd431a6108ee",
8
8
  "layout": {
9
9
  "nav": "full",
10
10
  "footer": "columns",
@@ -120,27 +120,47 @@
120
120
  ]
121
121
  },
122
122
  {
123
- "route": "/software",
124
- "kind": "route",
125
- "pageType": null,
126
- "schema": null,
123
+ "route": "/features",
124
+ "kind": "page",
125
+ "pageType": "FeaturesList",
126
+ "schema": "FeaturesList",
127
127
  "shell": "MarketingShell",
128
128
  "chrome": "on",
129
- "sections": []
129
+ "sections": [
130
+ {
131
+ "type": "hero",
132
+ "component": "Hero"
133
+ },
134
+ {
135
+ "type": "items",
136
+ "component": "Items",
137
+ "options": {
138
+ "columns": 3
139
+ }
140
+ },
141
+ {
142
+ "type": "cta",
143
+ "component": "CTA"
144
+ }
145
+ ]
130
146
  },
131
147
  {
132
- "route": "/software/[slug]",
148
+ "route": "/features/[slug]",
133
149
  "kind": "page",
134
- "contentDir": "content/en/SoftwareProduct",
135
- "seeds": ["content/en/SoftwareProduct/product.mdx"],
136
- "pageType": "SoftwareProduct",
137
- "schema": "SoftwareProduct",
150
+ "contentDir": "content/en/Feature",
151
+ "seeds": [
152
+ "content/en/Feature/feature-1.mdx",
153
+ "content/en/Feature/feature-2.mdx",
154
+ "content/en/Feature/feature-3.mdx"
155
+ ],
156
+ "pageType": "Feature",
157
+ "schema": "Feature",
138
158
  "shell": "MarketingShell",
139
159
  "chrome": "on",
140
160
  "sections": []
141
161
  },
142
162
  {
143
- "route": "/use-cases",
163
+ "route": "/for",
144
164
  "kind": "page",
145
165
  "pageType": "UseCasesList",
146
166
  "schema": "UseCasesList",
@@ -180,13 +200,13 @@
180
200
  ]
181
201
  },
182
202
  {
183
- "route": "/use-cases/[slug]",
203
+ "route": "/for/[slug]",
184
204
  "kind": "page",
185
205
  "contentDir": "content/en/UseCase",
186
206
  "seeds": [
187
- "content/en/UseCase/first-use-case.mdx",
188
- "content/en/UseCase/second-use-case.mdx",
189
- "content/en/UseCase/third-use-case.mdx"
207
+ "content/en/UseCase/persona-1.mdx",
208
+ "content/en/UseCase/persona-2.mdx",
209
+ "content/en/UseCase/persona-3.mdx"
190
210
  ],
191
211
  "pageType": "UseCase",
192
212
  "schema": "UseCase",
@@ -202,6 +222,13 @@
202
222
  "shell": "MarketingShell",
203
223
  "chrome": "on",
204
224
  "sections": [
225
+ {
226
+ "type": "hero",
227
+ "component": "Hero",
228
+ "options": {
229
+ "gapBelow": "tight"
230
+ }
231
+ },
205
232
  {
206
233
  "type": "pricing",
207
234
  "component": "Pricing",
@@ -304,15 +331,11 @@
304
331
  "component": "Hero"
305
332
  },
306
333
  {
307
- "type": "logoCloud",
308
- "component": "LogoCloud",
334
+ "type": "items",
335
+ "component": "Items",
309
336
  "options": {
310
- "layout": "inline"
337
+ "columns": 2
311
338
  }
312
- },
313
- {
314
- "type": "testimonials",
315
- "component": "Testimonials"
316
339
  }
317
340
  ]
318
341
  },
@@ -346,37 +369,12 @@
346
369
  "type": "hero",
347
370
  "component": "Hero"
348
371
  },
349
- {
350
- "type": "newsletter",
351
- "component": "Newsletter"
352
- },
353
372
  {
354
373
  "type": "faq",
355
374
  "component": "FAQ"
356
375
  }
357
376
  ]
358
377
  },
359
- {
360
- "route": "/book-a-call",
361
- "kind": "page",
362
- "pageType": "BookCall",
363
- "schema": "BookCall",
364
- "shell": "MarketingShell",
365
- "chrome": "on",
366
- "sections": [
367
- {
368
- "type": "hero",
369
- "component": "Hero"
370
- },
371
- {
372
- "type": "items",
373
- "component": "Items",
374
- "options": {
375
- "columns": 3
376
- }
377
- }
378
- ]
379
- },
380
378
  {
381
379
  "route": "/sign-in",
382
380
  "kind": "route",
@@ -477,6 +475,110 @@
477
475
  "component": "Testimonials"
478
476
  }
479
477
  ]
478
+ },
479
+ {
480
+ "route": "/meet",
481
+ "kind": "page",
482
+ "pageType": "LandingPage",
483
+ "schema": "WebPage",
484
+ "shell": "MarketingShell",
485
+ "chrome": "on",
486
+ "sections": [
487
+ {
488
+ "type": "hero",
489
+ "component": "Hero"
490
+ },
491
+ {
492
+ "type": "items",
493
+ "component": "Items",
494
+ "options": {
495
+ "columns": 2
496
+ }
497
+ }
498
+ ]
499
+ },
500
+ {
501
+ "route": "/meet/[slug]",
502
+ "kind": "page",
503
+ "pageType": "BookCall",
504
+ "schema": "BookCall",
505
+ "shell": "MarketingShell",
506
+ "chrome": "on",
507
+ "sections": [
508
+ {
509
+ "type": "hero",
510
+ "component": "Hero"
511
+ },
512
+ {
513
+ "type": "cta",
514
+ "component": "CTA"
515
+ },
516
+ {
517
+ "type": "items",
518
+ "component": "Items",
519
+ "options": {
520
+ "columns": 3
521
+ }
522
+ },
523
+ {
524
+ "type": "content-block",
525
+ "component": "ContentBlock"
526
+ }
527
+ ]
528
+ },
529
+ {
530
+ "route": "/portfolio",
531
+ "kind": "page",
532
+ "pageType": "PortfolioList",
533
+ "schema": "PortfolioList",
534
+ "shell": "MarketingShell",
535
+ "chrome": "on",
536
+ "sections": [
537
+ {
538
+ "type": "hero",
539
+ "component": "Hero",
540
+ "options": {
541
+ "gapBelow": "tight",
542
+ "size": "display",
543
+ "surface": "wash-secondary"
544
+ }
545
+ },
546
+ {
547
+ "type": "items",
548
+ "component": "Items",
549
+ "options": {
550
+ "surface": "none",
551
+ "columns": 2
552
+ }
553
+ },
554
+ {
555
+ "type": "cta",
556
+ "component": "CTA"
557
+ },
558
+ {
559
+ "type": "faq",
560
+ "component": "FAQ",
561
+ "options": {
562
+ "surface": "gray-100"
563
+ }
564
+ }
565
+ ]
566
+ },
567
+ {
568
+ "route": "/portfolio/[slug]",
569
+ "kind": "page",
570
+ "contentDir": "content/en/PortfolioItem",
571
+ "seeds": [
572
+ "content/en/PortfolioItem/sample-four.mdx",
573
+ "content/en/PortfolioItem/sample-one.mdx",
574
+ "content/en/PortfolioItem/sample-three.mdx",
575
+ "content/en/PortfolioItem/sample-two.mdx"
576
+ ],
577
+ "pageType": "PortfolioItem",
578
+ "schema": "PortfolioItem",
579
+ "shell": "MarketingShell",
580
+ "chrome": "on",
581
+ "sections": []
480
582
  }
481
583
  ]
482
584
  }
@@ -99,48 +99,53 @@ Reference: `screenshots/home.png`, `copy/home.txt`. Ten page sections; the newsl
99
99
 
100
100
  <!-- generated:end -->
101
101
 
102
- ### `/use-cases` — UseCasesList · schema `CollectionPage` · chrome on
102
+ ### `/for` — UseCasesList · schema `CollectionPage` · chrome on
103
103
 
104
- Rendered by the `/use-cases` route over `content/en/UseCasesList/use-cases.mdx` — a UseCasesList page composing `sections[]` (operator ruling 2026-09-23), emitting the UseCasesList builder's `CollectionPage`. Since #6658 D4 it is a real list: one `items` section of three cards, each linking a `UseCase` page and titled with that page's title, so the `ItemList` names the three pages. The how-it-works steps moved to the product page.
104
+ Rendered by the `/for` route over `content/en/UseCasesList/for.mdx` — a UseCasesList page composing `sections[]` (operator ruling 2026-09-23), emitting the UseCasesList builder's `CollectionPage`. Since #6658 D4 it is a real list: one `items` section of three cards, each linking a `UseCase` page and titled with that page's title, so the `ItemList` names the three pages. The how-it-works steps moved to the product page.
105
105
 
106
- <!-- generated:begin page=/use-cases -->
106
+ <!-- generated:begin page=/for -->
107
107
 
108
108
  | # | Section | Component | Copy (first line) |
109
109
  | --- | -------------------------------------------------------- | -------------- | ----------------------------------------------------------------- |
110
- | 1 | `hero` (eyebrow "Use cases" · 2 CTAs) | `Hero` | {Use cases: who your product is for} |
111
- | 2 | `items` (columns=3 · items ×3) | `Items` | {The jobs customers hire your product to do} |
110
+ | 1 | `hero` (eyebrow "Customers" · 2 CTAs) | `Hero` | {Customers: who your product or service is for} |
111
+ | 2 | `items` (columns=3 · items ×3) | `Items` | {The jobs customers hire your product or service to do} |
112
112
  | 3 | `logoCloud` (layout=inline · logos ×6) | `LogoCloud` | Don’t just take our word for it |
113
113
  | 4 | `testimonials` (quote · items ×1) | `Testimonials` | {A customer quote, in their own words, about the result they got} |
114
- | 5 | `cta` (box · checklist ×3 · 2 CTAs · closingLine) | `CTA` | {Switch to your product in time amount or less} |
114
+ | 5 | `cta` (box · checklist ×3 · 2 CTAs · closingLine) | `CTA` | {Switch to your product or service in time amount or less} |
115
115
  | 6 | `faq` (accordion · items ×5 · 1 CTA · initialOpen first) | `FAQ` | FAQs |
116
116
 
117
117
  <!-- generated:end -->
118
118
 
119
- ### `/use-cases/<slug>` — UseCase · schema `WebPage` → `Article` · chrome on
119
+ ### `/for/<slug>` — UseCase · schema `WebPage` → `Article` · chrome on
120
120
 
121
- Three placeholder use cases from the base layer (#6658 D4): `first-use-case`, `second-use-case` and `third-use-case`, rendered as prose by the `/use-cases/[slug]` route.
121
+ Three placeholder use cases from the base layer (#6658 D4): `first-use-case`, `second-use-case` and `third-use-case`, rendered as prose by the `/for/[slug]` route.
122
122
 
123
- <!-- generated:begin page=/use-cases/[slug] -->
123
+ <!-- generated:begin page=/for/[slug] -->
124
124
 
125
- _Detail route over `content/en/UseCase/` — 3 seed pages: `first-use-case.mdx`, `second-use-case.mdx`, `third-use-case.mdx`._
125
+ _Detail route over `content/en/UseCase/` — 3 seed pages: `persona-1.mdx`, `persona-2.mdx`, `persona-3.mdx`._
126
126
  <!-- generated:end -->
127
127
 
128
128
  ### `/software` — code route (the product listing) · chrome on
129
129
 
130
130
  Lists every `SoftwareProduct` page by slug. The route is core since #6658: the product's own page replaced the `/features` stand-in, so every scaffold carries it.
131
131
 
132
- <!-- generated:begin page=/software -->
132
+ <!-- generated:begin page=/features -->
133
+
134
+ | # | Section | Component | Copy (first line) |
135
+ | --- | ------------------------------------------------- | --------- | ----------------------------------------------- |
136
+ | 1 | `hero` (eyebrow "Features" · 2 CTAs) | `Hero` | {Features: what your product does} |
137
+ | 2 | `items` (columns=3 · items ×3) | `Items` | {Everything your product does for the customer} |
138
+ | 3 | `cta` (box · checklist ×3 · 2 CTAs · closingLine) | `CTA` | {Switch to your product in time amount or less} |
133
139
 
134
- _Code route — no content, no sections._
135
140
  <!-- generated:end -->
136
141
 
137
- ### `/software/<slug>` (seed: `/software/product`) — SoftwareProduct · schema `WebPage` → `SoftwareApplication` · chrome on
142
+ ### `/features/<slug>` (seeds: `feature-1` · `feature-2` · `feature-3`) — Feature · schema `WebPage` → `SoftwareApplication` (named for the feature, `featureList: [it]`) · chrome on
138
143
 
139
- Reference: `screenshots/features.png`, `copy/features.txt`, plus the how-it-works steps. The product's own detail page (#6658 D3), rendered by the `/software/[slug]` route over `content/en/SoftwareProduct/product.mdx`. Its JSON-LD is a `WebPage` whose `mainEntity` is a `SoftwareApplication` named by the page title; its feature titles become the site's `featureList` when `_site.mdx` declares a `SoftwareApplication` secondary. It carries the former `/features` sections, with their links re-pointed to in-page anchors, and the how-it-works steps that moved off `/use-cases` (the brief's "how-it-works folds into the product page"). The nav's Features links and the home page's feature links point here.
144
+ Reference: `screenshots/features.png`, `copy/features.txt`, plus the how-it-works steps. One page per feature (#6721, reversing #6658 D5), rendered by the `/features/[slug]` route over `content/en/Feature/<slug>.mdx`; the `/features` hub (`FeaturesList`) lists them. Its JSON-LD is a `WebPage` whose `mainEntity` is a `SoftwareApplication` named by the page title; its feature titles become the site's `featureList` when `_site.mdx` declares a `SoftwareApplication` secondary. It carries the former `/features` sections, with their links re-pointed to in-page anchors, and the how-it-works steps that moved off `/for` (the brief's "how-it-works folds into the product page"). The nav's Features links and the home page's feature links point here.
140
145
 
141
- <!-- generated:begin page=/software/[slug] -->
146
+ <!-- generated:begin page=/features/[slug] -->
142
147
 
143
- _Detail route over `content/en/SoftwareProduct/` — 1 seed page: `product.mdx`._
148
+ _Detail route over `content/en/Feature/` — 3 seed pages: `feature-1.mdx`, `feature-2.mdx`, `feature-3.mdx`._
144
149
  <!-- generated:end -->
145
150
 
146
151
  ### `/pricing` — Pricing · schema `Pricing` · chrome on
@@ -149,13 +154,14 @@ Reference: `screenshots/pricing.png`, `copy/pricing.txt`. The reference opens on
149
154
 
150
155
  <!-- generated:begin page=/pricing -->
151
156
 
152
- | # | Section | Component | Copy (first line) |
153
- | --- | -------------------------------------------------------------------------------------------------------- | -------------- | ----------------------------------------------------------------- |
154
- | 1 | `pricing` (three-tiers-with-toggle · cardLayout=centered · eyebrow "Pricing" · plans ×3 · billingToggle) | `Pricing` | {Pays for itself in tangible value or outcome} |
155
- | 2 | `logoCloud` (layout=inline · logos ×3) | `LogoCloud` | Don’t just take our word for it |
156
- | 3 | `testimonials` (quote · items ×1) | `Testimonials` | {A customer quote, in their own words, about the result they got} |
157
- | 4 | `cta` (box · checklist ×3 · 2 CTAs · closingLine) | `CTA` | {Switch to your product in time amount or less} |
158
- | 5 | `faq` (accordion · items ×5 · 1 CTA · initialOpen none) | `FAQ` | FAQs |
157
+ | # | Section | Component | Copy (first line) |
158
+ | --- | ------------------------------------------------------------------------------------ | -------------- | ----------------------------------------------------------------- |
159
+ | 1 | `hero` (centered · gapBelow=tight · eyebrow "Pricing" · 2 CTAs) | `Hero` | {Upgrade to Pro with Commerce} |
160
+ | 2 | `pricing` (three-tiers-with-toggle · cardLayout=centered · plans ×3 · billingToggle) | `Pricing` | Basic plan |
161
+ | 3 | `logoCloud` (layout=inline · logos ×3) | `LogoCloud` | {Don’t just take our word for it} |
162
+ | 4 | `testimonials` (quote · items ×1) | `Testimonials` | {A customer quote, in their own words, about the result they got} |
163
+ | 5 | `cta` (box · checklist ×3 · 2 CTAs · closingLine) | `CTA` | {Switch to your product in time amount or less} |
164
+ | 6 | `faq` (accordion · items ×5 · 1 CTA · initialOpen none) | `FAQ` | {FAQs} |
159
165
 
160
166
  <!-- generated:end -->
161
167
 
@@ -195,11 +201,10 @@ Reference: `screenshots/contact.png`, `copy/contact.txt`. The reference is a spl
195
201
 
196
202
  <!-- generated:begin page=/contact -->
197
203
 
198
- | # | Section | Component | Copy (first line) |
199
- | --- | ----------------------------------------------------- | -------------- | ----------------------------------------------------------------- |
200
- | 1 | `hero` (split · eyebrow "Book a Demo" · checklist ×3) | `Hero` | {Ready to achieve a valuable outcome?} |
201
- | 2 | `logoCloud` (layout=inline · logos ×6) | `LogoCloud` | Don’t just take our word for it |
202
- | 3 | `testimonials` (quote · items ×1) | `Testimonials` | {A customer quote, in their own words, about the result they got} |
204
+ | # | Section | Component | Copy (first line) |
205
+ | --- | --------------------------------------------------------- | --------- | ----------------------------------------- |
206
+ | 1 | `hero` (split · eyebrow "Contact" · checklist ×3 · 1 CTA) | `Hero` | Get every message in your email, free |
207
+ | 2 | `items` (tiles · columns=2 · items ×4) | `Items` | {Add appointment scheduling to your site} |
203
208
 
204
209
  <!-- generated:end -->
205
210
 
@@ -222,24 +227,38 @@ A base-layer seed every starter carries (#6658 D5). The form posts to lead captu
222
227
 
223
228
  <!-- generated:begin page=/newsletter -->
224
229
 
225
- | # | Section | Component | Copy (first line) |
226
- | --- | ------------------------------------- | ------------ | ------------------------------------------------ |
227
- | 1 | `hero` (eyebrow "Newsletter" · 1 CTA) | `Hero` | {Newsletter: what subscribers get and how often} |
228
- | 2 | `newsletter` | `Newsletter` | Subscribe |
229
- | 3 | `faq` (expanded · items ×3) | `FAQ` | FAQs |
230
+ | # | Section | Component | Copy (first line) |
231
+ | --- | -------------------------------------- | --------- | --------------------------------------- |
232
+ | 1 | `hero` (eyebrow "Newsletter" · 2 CTAs) | `Hero` | {Start a free newsletter with Substack} |
233
+ | 2 | `faq` (expanded · items ×3) | `FAQ` | FAQs |
234
+
235
+ <!-- generated:end -->
236
+
237
+ ### `/meet` — LandingPage · schema `WebPage` · chrome on
238
+
239
+ An always-copied overlay seed (#6897 D3): a meeting-types hub, served by the generic `[slug]` route, listing the four `/meet/<slug>` tiles below through the same `items` `tiles` variant Contact uses. A template carrying the scheduling module serves its own `meet/` route directory instead, by Next.js static-segment precedence.
240
+
241
+ <!-- generated:begin page=/meet -->
242
+
243
+ | # | Section | Component | Copy (first line) |
244
+ | --- | -------------------------------------- | --------- | --------------------- |
245
+ | 1 | `hero` (eyebrow "Meet") | `Hero` | {Book a time with us} |
246
+ | 2 | `items` (tiles · columns=2 · items ×4) | `Items` | |
230
247
 
231
248
  <!-- generated:end -->
232
249
 
233
- ### `/book-a-call` — BookCall · schema `WebPage` → `Offer` · chrome on
250
+ ### `/meet/[slug]` — BookCall · schema `WebPage` -> `Offer` · chrome on
234
251
 
235
- A base-layer seed every starter carries (#6658 D5): a hero whose call to action is `/contact`, then what happens on the call. A template carrying the scheduling module overrides the seed so the call to action opens `/meet`. Linked from the footer's Site pages column.
252
+ Four always-copied overlay seeds (#6897 D4/D5), served by the new `[slug]/[detail]` route: each carries a visitor-facing "{Get in touch}" CTA to `/contact`, an owner-placeholder upgrade block linking the pricing page in place of the calendar, and a "<- All meeting types" link back to `/meet`. `book-a-call` also carries the retired `/book-a-call` page's "What happens on the call?" section, moved here verbatim (#6897 D10). Linked from the footer's Site pages column (`/meet/book-a-call`, always rendered - never gated on a surface, the same `/blog` precedent).
236
253
 
237
- <!-- generated:begin page=/book-a-call -->
254
+ <!-- generated:begin page=/meet/[slug] -->
238
255
 
239
- | # | Section | Component | Copy (first line) |
240
- | --- | -------------------------------------- | --------- | ------------------------------------------ |
241
- | 1 | `hero` (eyebrow "Book a call" · 1 CTA) | `Hero` | {Book a call: what a visitor gets from it} |
242
- | 2 | `items` (columns=3 · items ×3) | `Items` | What happens on the call? |
256
+ | # | Section | Component | Copy (first line) |
257
+ | --- | -------------------------------------- | -------------- | ------------------------------------------------ |
258
+ | 1 | `hero` (eyebrow "Book a Call" · 1 CTA) | `Hero` | Book a Call |
259
+ | 2 | `cta` (box · 1 CTA) | `CTA` | {What booking a call would do for your visitors} |
260
+ | 3 | `items` (columns=3 · items ×3) | `Items` | What happens on the call? |
261
+ | 4 | `content-block` (1 CTA) | `ContentBlock` | |
243
262
 
244
263
  <!-- generated:end -->
245
264
 
@@ -249,12 +268,12 @@ Reference: `screenshots/blog.png`, `copy/blog.txt` for the opener and the newsle
249
268
 
250
269
  <!-- generated:begin page=/blog -->
251
270
 
252
- | # | Section | Component | Copy (first line) |
253
- | --- | --------------------------------------------------- | -------------- | ----------------------------------------------------------------- |
254
- | 1 | `hero` (centered · gapBelow=tight · eyebrow "Blog") | `Hero` | {Resources for customer profile} |
255
- | 2 | `blog-list` (grid) | `BlogList` | |
256
- | 3 | `logoCloud` (layout=inline · logos ×6) | `LogoCloud` | Don’t just take our word for it |
257
- | 4 | `testimonials` (quote · items ×1) | `Testimonials` | {A customer quote, in their own words, about the result they got} |
271
+ | # | Section | Component | Copy (first line) |
272
+ | --- | ------------------------------------------------------------ | -------------- | ----------------------------------------------------------------- |
273
+ | 1 | `hero` (centered · gapBelow=tight · eyebrow "Blog" · 2 CTAs) | `Hero` | Get free blog/docs from Fumadocs |
274
+ | 2 | `blog-list` (grid) | `BlogList` | |
275
+ | 3 | `logoCloud` (layout=inline · logos ×6) | `LogoCloud` | Don’t just take our word for it |
276
+ | 4 | `testimonials` (quote · items ×1) | `Testimonials` | {A customer quote, in their own words, about the result they got} |
258
277
 
259
278
  <!-- generated:end -->
260
279
 
@@ -312,6 +331,30 @@ One document-chassis page with the shape's policy sections — returns, shipping
312
331
 
313
332
  <!-- generated:end -->
314
333
 
334
+ ### `/portfolio` — PortfolioList · chrome on
335
+
336
+ The before/after portfolio hub (#6687). A shape row since #6753: portfolio belongs to the `organization-product` shape, Free included (operator 2026-09-25).
337
+
338
+ <!-- generated:begin page=/portfolio -->
339
+
340
+ | # | Section | Component | Copy (first line) |
341
+ | --- | ---------------------------------------------------------------------------------------------------------- | --------- | --------------------------------------- |
342
+ | 1 | `hero` (default · gapBelow=tight · size=display · surface=wash-secondary · eyebrow "{Portfolio}" · 2 CTAs) | `Hero` | {The work, before and after.} |
343
+ | 2 | `items` (tile · surface=none · columns=2 · items ×4) | `Items` | |
344
+ | 3 | `cta` (beam · chips ×3 · 2 CTAs) | `CTA` | {Is your site the before or the after?} |
345
+ | 4 | `faq` (centered · surface=gray-100 · accordion · items ×3 · initialOpen first) | `FAQ` | Frequently Asked Questions |
346
+
347
+ <!-- generated:end -->
348
+
349
+ ### `/portfolio/<slug>` (seeds: `sample-one` … `sample-four`) — PortfolioItem · chrome on
350
+
351
+ One `before-after` comparison per page, seeded from `site-templates/_base/content/en/PortfolioItem/` (#6687, #6753).
352
+
353
+ <!-- generated:begin page=/portfolio/[slug] -->
354
+
355
+ _Detail route over `content/en/PortfolioItem/` — 4 seed pages: `sample-four.mdx`, `sample-one.mdx`, `sample-three.mdx`, `sample-two.mdx`._
356
+ <!-- generated:end -->
357
+
315
358
  ### `/thanks/<slug>` — per-form confirmation (InstrumentDeliveryPage) · chrome on
316
359
 
317
360
  Not a hub page by design (#3960). Free ships none because the contact form confirms inline. Listed so nobody re-files it.
@@ -360,28 +403,31 @@ marketing-site-free:
360
403
  design: standard
361
404
  roster:
362
405
  - { route: "/", kind: page, content: ["content/en/HomePage/home.mdx"] }
363
- - { route: "/software", kind: route }
364
- - { route: "/software/[slug]", kind: page, contentDir: "content/en/SoftwareProduct" }
365
- - { route: "/use-cases", kind: page, content: ["content/en/UseCasesList/use-cases.mdx"] }
366
- - { route: "/use-cases/[slug]", kind: page, contentDir: "content/en/UseCase" }
406
+ - { route: "/features", kind: page, content: ["content/en/FeaturesList/features.mdx"] }
407
+ - { route: "/features/[slug]", kind: page, contentDir: "content/en/Feature" }
408
+ - { route: "/for", kind: page, content: ["content/en/UseCasesList/for.mdx"] }
409
+ - { route: "/for/[slug]", kind: page, contentDir: "content/en/UseCase" }
367
410
  - { route: "/pricing", kind: page, content: ["content/en/Pricing/pricing.mdx"] }
368
411
  - { route: "/about", kind: page, content: ["content/en/AboutPage/about.mdx"] }
369
412
  - { route: "/faq", kind: page, content: ["content/en/FAQPage/faq.mdx"] }
370
413
  - { route: "/contact", kind: page, content: ["content/en/ContactPage/contact.mdx"] }
371
414
  - { route: "/glossary", kind: page, content: ["content/en/GlossaryList/glossary.mdx"] }
372
415
  - { route: "/newsletter", kind: page, content: ["content/en/NewsletterSignup/newsletter.mdx"] }
373
- - { route: "/book-a-call", kind: page, content: ["content/en/BookCall/book-call.mdx"] }
374
416
  - { route: "/sign-in", kind: route }
375
417
  - { route: "/sign-up", kind: route }
376
418
  - { route: "/privacy", kind: page, content: ["content/en/PrivacyPage/privacy.mdx"] }
377
419
  - { route: "/terms", kind: page, content: ["content/en/TermsPage/terms.mdx"] }
378
420
  - { route: "/purchase-policy", kind: page, content: ["content/en/PurchasePolicyPage/purchase-policy.mdx"] }
379
421
  - { route: "/blog", kind: page, content: ["content/en/BlogList/blog.mdx"] }
422
+ - { route: "/meet", kind: page, content: ["content/en/LandingPage/meet.mdx"] }
423
+ - { route: "/meet/[slug]", kind: page, content: ["content/en/BookCall/book-a-call.mdx", "content/en/BookCall/onsite-estimate.mdx", "content/en/BookCall/start-project.mdx", "content/en/BookCall/onsite-service.mdx"] }
424
+ - { route: "/portfolio", kind: page, content: ["content/en/PortfolioList/portfolio.mdx"] }
425
+ - { route: "/portfolio/[slug]", kind: page, contentDir: "content/en/PortfolioItem" }
380
426
  ```
381
427
 
382
428
  <!-- generated:end -->
383
429
 
384
- All eighteen rows are declared on the registry (`TEMPLATE_BASE_ROSTER` + the Free `/blog` teaser row, #5469 D3/D4, re-derived by #6658), so the template is one declared page set whichever mechanism scaffolds each: the always-copied overlay for the core pages, `site-templates/_base/content/**` for the module-less ones and the three use cases. The scaffold carries this roster as `.ailk-site-manifest.json` at its root (#6658 D7); this Markdown stays in the template.
430
+ All twenty rows are declared on the registry — the `organization-product` shape roster in `src/starter-grid.ts`: `TEMPLATE_BASE_ROSTER` + the `/blog` teaser row + the two portfolio rows (#5469 D3/D4, re-derived by #6658, portfolio added by #6753), so the template is one declared page set whichever mechanism scaffolds each: the always-copied overlay for the core pages, `site-templates/_base/content/**` for the module-less ones and the three use cases. The scaffold carries this roster as `.ailk-site-manifest.json` at its root (#6658 D7); this Markdown stays in the template.
385
431
 
386
432
  ### 3a. Deviations from the standard roster (recorded, #6658)
387
433
 
@@ -403,19 +449,20 @@ reversed (`docs/decisions/starter-roster-page-set.md` D4, D7).
403
449
  | `Integration` | a placeholder starter has no integrations to list |
404
450
  | `CoursesList` | there is no course offering |
405
451
  | `Course` | there is no course offering |
406
- | `CaseStudiesList` | proof pages need real customers; the use-cases page carries one placeholder testimonial and one logo strip instead |
407
- | `CaseStudy` | proof pages need real customers; the use-cases page carries one placeholder testimonial and one logo strip instead |
408
- | `TestimonialsList` | proof pages need real customers; the use-cases page carries one placeholder testimonial and one logo strip instead |
409
- | `ClientsList` | proof pages need real customers; the use-cases page carries one placeholder testimonial and one logo strip instead |
452
+ | `CaseStudiesList` | proof pages need real customers; the customers page carries one placeholder testimonial and one logo strip instead |
453
+ | `CaseStudy` | proof pages need real customers; the customers page carries one placeholder testimonial and one logo strip instead |
454
+ | `TestimonialsList` | proof pages need real customers; the customers page carries one placeholder testimonial and one logo strip instead |
455
+ | `ClientsList` | proof pages need real customers; the customers page carries one placeholder testimonial and one logo strip instead |
410
456
 
411
457
  **Rows added:**
412
458
 
413
- | Added row | Reason |
414
- | ----------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
415
- | `SoftwareProduct` | the single product's own detail page — the standard's multi-product opt-in, taken by the one product |
416
- | `PurchasePolicyPage` | the product-shape purchase policy every shape carries (#6646 D3) |
417
- | `BlogList` (the `/blog` teaser) | the standard's `convert` goal carries no blog (`blog_enabled: false`); the Free teaser stays by operator ruling 2026-09-24, and where the docs-blog module is present its own `BlogList` serves `/blog` instead |
418
- | `/software`, `/sign-in`, `/sign-up` | code routes (`kind: route`): the product listing and the two auth pages carry no page type of their own |
459
+ | Added row | Reason |
460
+ | -------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
461
+ | `SoftwareProduct` | the single product's own detail page — the standard's multi-product opt-in, taken by the one product |
462
+ | `PurchasePolicyPage` | the product-shape purchase policy every shape carries (#6646 D3) |
463
+ | `BlogList` (the `/blog` teaser) | the standard's `convert` goal carries no blog (`blog_enabled: false`); the Free teaser stays by operator ruling 2026-09-24, and where the docs-blog module is present its own `BlogList` serves `/blog` instead |
464
+ | `/software`, `/sign-in`, `/sign-up` | code routes (`kind: route`): the product listing and the two auth pages carry no page type of their own |
465
+ | `PortfolioList`, `PortfolioItem` (`/portfolio`, `/portfolio/[slug]`) | portfolio belongs to the shape, Free included (roadmap § 4, operator 2026-09-25, reversing #6687's "Pro and up"; #6753). `pnpm starter:check` R3.2 counts two more missing anchor captures for these routes — the pre-existing, non-CI anchor gap, now 14 |
419
466
 
420
467
  ### 3b. Site entity (operator-disposed 2026-09-24)
421
468
 
@@ -425,11 +472,11 @@ reversed (`docs/decisions/starter-roster-page-set.md` D4, D7).
425
472
 
426
473
  <!-- generated:begin inventory -->
427
474
 
428
- | Tier | Used by this template |
429
- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
430
- | Shell | `MarketingShell` |
431
- | Chrome | `Nav`, `Footer`, `Banner` (+ `BannerConsentIsland`, `BannerDismissIsland`) |
432
- | Sections | `BlogList`, `ContentBlock`, `CTA`, `DecisionSplit`, `DocumentChassis`, `FAQ`, `Feature`, `GlossaryIndex`, `Hero`, `Items`, `LogoCloud`, `MediaBand`, `Newsletter`, `Pricing`, `Team`, `Testimonials` |
475
+ | Tier | Used by this template |
476
+ | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
477
+ | Shell | `MarketingShell` |
478
+ | Chrome | `Nav`, `Footer`, `Banner` (+ `BannerConsentIsland`, `BannerDismissIsland`) |
479
+ | Sections | `BlogList`, `ContentBlock`, `CTA`, `DecisionSplit`, `DocumentChassis`, `FAQ`, `Feature`, `GlossaryIndex`, `Hero`, `Items`, `LogoCloud`, `MediaBand`, `Pricing`, `Team`, `Testimonials` |
433
480
 
434
481
  <!-- generated:end -->
435
482
 
@@ -6,5 +6,5 @@
6
6
  "provenance.json": ".ailk-template.json",
7
7
  "TEMPLATE-MANIFEST.json": ".ailk-site-manifest.json"
8
8
  },
9
- "postInstall": "Template marketing-site-free installed. Its /pricing, /privacy, /terms, /glossary, /newsletter, /book-a-call and three /use-cases/<slug> seed pages came with the base layer it extends (content/en/) - replace the placeholder copy before you launch."
9
+ "postInstall": "Template marketing-site-free installed. Its /pricing, /privacy, /terms, /glossary, /newsletter and three /for/<slug> seed pages came with the base layer it extends (content/en/); /meet and its four /meet/<slug> pages came with the always-copied overlay - replace the placeholder copy before you launch."
10
10
  }