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
@@ -0,0 +1,354 @@
1
+ # Template manifest — `organization-service`
2
+
3
+ > The Free `organization-service` shape starter (#6757, roadmap § 6 Phase 2) — a company selling a service to clients anywhere, scaffolded keyless with no `--template` alias of its own. Generated file: the regions between `<!-- generated:begin <id> -->` and `<!-- generated:end -->` are produced by `scripts/build-template-manifest.mjs --template organization-service --check` from the composed layer stack (this tree → `_base` → the always-copied overlay), each roster row's MDX `sections[]`, and `component-catalog.json`. Everything outside the markers is written by hand.
4
+
5
+ | Field | Value |
6
+ | ---------------------- | ------------------------------------------------------------------------------- |
7
+ | Starter | `organization-service` (a `SHAPE_STARTERS` entry, not a `--template` alias) |
8
+ | Level | Free (derived from `requires` — `marketing` only; never declared) |
9
+ | `requires` | `[marketing]` |
10
+ | `extends` | `_base` — lineage only, never level |
11
+ | Delivery | keyless — ships in the tarball at `site-templates/shapes/organization-service/` |
12
+ | Sample content posture | every line of copy is a **placeholder**; no seed carries a price (D4) |
13
+
14
+ ## 1. Chrome
15
+
16
+ This starter declares **no `layout` block** — the default marketing chrome.
17
+
18
+ ### Layout knobs (#5612)
19
+
20
+ <!-- generated:begin layout -->
21
+
22
+ | Knob | Value |
23
+ | -------------------- | --------- |
24
+ | `nav` | `full` |
25
+ | `footer` | `columns` |
26
+ | `announcementBanner` | `false` |
27
+ | `home` | `default` |
28
+
29
+ <!-- generated:end -->
30
+
31
+ ### Theme (locked)
32
+
33
+ <!-- generated:begin theme -->
34
+
35
+ | Setting | Value |
36
+ | ------------------------ | ---------- |
37
+ | `corners` | `square` |
38
+ | `eyebrowCase` | `sentence` |
39
+ | `placeholders` | `fill` |
40
+ | `checkmarks` | `plain` |
41
+ | `colors.light.bg` | `#ffffff` |
42
+ | `colors.light.bgMuted` | `#ffffff` |
43
+ | `colors.light.surface` | `#ffffff` |
44
+ | `colors.light.border` | `#000000` |
45
+ | `colors.light.text` | `#000000` |
46
+ | `colors.light.textMuted` | `#333333` |
47
+ | `colors.light.primary` | `#000000` |
48
+ | `colors.light.primaryFg` | `#ffffff` |
49
+ | `colors.light.accent` | `#000000` |
50
+ | `colors.dark.bg` | `#000000` |
51
+ | `colors.dark.bgMuted` | `#000000` |
52
+ | `colors.dark.surface` | `#000000` |
53
+ | `colors.dark.border` | `#ffffff` |
54
+ | `colors.dark.text` | `#ffffff` |
55
+ | `colors.dark.textMuted` | `#cccccc` |
56
+ | `colors.dark.primary` | `#ffffff` |
57
+ | `colors.dark.primaryFg` | `#000000` |
58
+ | `colors.dark.accent` | `#ffffff` |
59
+
60
+ <!-- generated:end -->
61
+
62
+ ## 2. Pages
63
+
64
+ One `page=<route>` region per roster row, generated from the seed file the composed layer stack lands for that route.
65
+
66
+ `/`:
67
+
68
+ <!-- generated:begin page=/ -->
69
+
70
+ | # | Section | Component | Copy (first line) |
71
+ | --- | ----------------------------------------------------- | --------- | ------------------------------------------------- |
72
+ | 1 | `hero` (centered · eyebrow "{Your Company}" · 2 CTAs) | `Hero` | {One line on the outcome you deliver for clients} |
73
+ | 2 | `items` (columns=3 · items ×3) | `Items` | What we do |
74
+ | 3 | `cta` (minimal · 2 CTAs) | `CTA` | Ready to talk about your project? |
75
+
76
+ <!-- generated:end -->
77
+
78
+ `/about`:
79
+
80
+ <!-- generated:begin page=/about -->
81
+
82
+ | # | Section | Component | Copy (first line) |
83
+ | --- | ------------------------------------------ | -------------- | -------------------------------------------------------- |
84
+ | 1 | `content-block` (narrow · eyebrow "About") | `ContentBlock` | {A small team, a short client list, a long relationship} |
85
+ | 2 | `cta` (minimal · 2 CTAs) | `CTA` | Work with us |
86
+
87
+ <!-- generated:end -->
88
+
89
+ `/services`:
90
+
91
+ <!-- generated:begin page=/services -->
92
+
93
+ | # | Section | Component | Copy (first line) |
94
+ | --- | -------------------------------------- | --------- | --------------------------- |
95
+ | 1 | `hero` (centered · eyebrow "Services") | `Hero` | Three ways to work together |
96
+ | 2 | `items` (columns=3 · items ×3) | `Items` | Engagements |
97
+ | 3 | `cta` (minimal · 1 CTA) | `CTA` | Not sure which one? |
98
+
99
+ <!-- generated:end -->
100
+
101
+ `/services/[slug]`:
102
+
103
+ <!-- generated:begin page=/services/[slug] -->
104
+
105
+ _Detail route over `content/en/Service/` — 3 seed pages: `first-engagement.mdx`, `second-engagement.mdx`, `third-engagement.mdx`._
106
+ <!-- generated:end -->
107
+
108
+ `/for` (the persona hub — every shape carries the family now, #6878 D7):
109
+
110
+ <!-- generated:begin page=/for -->
111
+
112
+ | # | Section | Component | Copy (first line) |
113
+ | --- | -------------------------------------------------------- | -------------- | ----------------------------------------------------------------- |
114
+ | 1 | `hero` (eyebrow "Customers" · 2 CTAs) | `Hero` | {Customers: who your product or service is for} |
115
+ | 2 | `items` (columns=3 · items ×3) | `Items` | {The jobs customers hire your product or service to do} |
116
+ | 3 | `logoCloud` (layout=inline · logos ×6) | `LogoCloud` | Don’t just take our word for it |
117
+ | 4 | `testimonials` (quote · items ×1) | `Testimonials` | {A customer quote, in their own words, about the result they got} |
118
+ | 5 | `cta` (box · checklist ×3 · 2 CTAs · closingLine) | `CTA` | {Switch to your product or service in time amount or less} |
119
+ | 6 | `faq` (accordion · items ×5 · 1 CTA · initialOpen first) | `FAQ` | FAQs |
120
+
121
+ <!-- generated:end -->
122
+
123
+ `/for/[slug]`:
124
+
125
+ <!-- generated:begin page=/for/[slug] -->
126
+
127
+ _Detail route over `content/en/UseCase/` — 3 seed pages: `persona-1.mdx`, `persona-2.mdx`, `persona-3.mdx`._
128
+ <!-- generated:end -->
129
+
130
+ `/contact` (always-copied overlay seed):
131
+
132
+ <!-- generated:begin page=/contact -->
133
+
134
+ | # | Section | Component | Copy (first line) |
135
+ | --- | --------------------------------------------------------- | --------- | ----------------------------------------- |
136
+ | 1 | `hero` (split · eyebrow "Contact" · checklist ×3 · 1 CTA) | `Hero` | Get every message in your email, free |
137
+ | 2 | `items` (tiles · columns=2 · items ×4) | `Items` | {Add appointment scheduling to your site} |
138
+
139
+ <!-- generated:end -->
140
+
141
+ `/faq` (always-copied overlay seed):
142
+
143
+ <!-- generated:begin page=/faq -->
144
+
145
+ | # | Section | Component | Copy (first line) |
146
+ | --- | ------------------------------------------------------- | --------- | ---------------------------------------- |
147
+ | 1 | `hero` (gapBelow=tight · eyebrow "FAQ") | `Hero` | FAQs |
148
+ | 2 | `faq` (accordion · items ×5 · 1 CTA · initialOpen none) | `FAQ` | {A question your customers actually ask} |
149
+ | 3 | `faq` (accordion · items ×5 · 1 CTA · initialOpen none) | `FAQ` | {A second group of questions} |
150
+
151
+ <!-- generated:end -->
152
+
153
+ `/glossary`, `/newsletter` (base-layer seeds every starter carries, #6658 D5 — `/newsletter` is this tree's own byte copy of the Free newsletter, D4/D9), plus the always-copied overlay's `/meet` hub and `/meet/[slug]` BookCall detail seeds (#6897 D3-D5):
154
+
155
+ <!-- generated:begin page=/glossary -->
156
+
157
+ | # | Section | Component | Copy (first line) |
158
+ | --- | ----------------------------------- | --------------- | -------------------------------------------- |
159
+ | 1 | `hero` (eyebrow "Glossary" · 1 CTA) | `Hero` | {Glossary: the terms your customers look up} |
160
+ | 2 | `glossary-index` (columns) | `GlossaryIndex` | {Terms, A to Z} |
161
+
162
+ <!-- generated:end -->
163
+
164
+ <!-- generated:begin page=/newsletter -->
165
+
166
+ | # | Section | Component | Copy (first line) |
167
+ | --- | -------------------------------------- | --------- | --------------------------------------- |
168
+ | 1 | `hero` (eyebrow "Newsletter" · 2 CTAs) | `Hero` | {Start a free newsletter with Substack} |
169
+ | 2 | `faq` (expanded · items ×3) | `FAQ` | FAQs |
170
+
171
+ <!-- generated:end -->
172
+
173
+ <!-- generated:begin page=/meet -->
174
+
175
+ | # | Section | Component | Copy (first line) |
176
+ | --- | -------------------------------------- | --------- | --------------------- |
177
+ | 1 | `hero` (eyebrow "Meet") | `Hero` | {Book a time with us} |
178
+ | 2 | `items` (tiles · columns=2 · items ×4) | `Items` | |
179
+
180
+ <!-- generated:end -->
181
+
182
+ <!-- generated:begin page=/meet/[slug] -->
183
+
184
+ | # | Section | Component | Copy (first line) |
185
+ | --- | -------------------------------------- | -------------- | ------------------------------------------------ |
186
+ | 1 | `hero` (eyebrow "Book a Call" · 1 CTA) | `Hero` | Book a Call |
187
+ | 2 | `cta` (box · 1 CTA) | `CTA` | {What booking a call would do for your visitors} |
188
+ | 3 | `items` (columns=3 · items ×3) | `Items` | What happens on the call? |
189
+ | 4 | `content-block` (1 CTA) | `ContentBlock` | |
190
+
191
+ <!-- generated:end -->
192
+
193
+ `/sign-in`, `/sign-up` (code routes — the `SignInCard` island and the sign-up form inside the locale layout, whose header links both; listed so the manifest is a complete install record, #6797):
194
+
195
+ <!-- generated:begin page=/sign-in -->
196
+
197
+ _Code route — no content, no sections._
198
+ <!-- generated:end -->
199
+
200
+ <!-- generated:begin page=/sign-up -->
201
+
202
+ _Code route — no content, no sections._
203
+ <!-- generated:end -->
204
+
205
+ `/privacy`, `/terms` (base-layer seeds):
206
+
207
+ <!-- generated:begin page=/privacy -->
208
+
209
+ | # | Section | Component | Copy (first line) |
210
+ | --- | ----------------------------------- | ----------------- | ----------------- |
211
+ | 1 | `document-chassis` (layout=article) | `DocumentChassis` | Privacy Policy |
212
+
213
+ <!-- generated:end -->
214
+
215
+ <!-- generated:begin page=/terms -->
216
+
217
+ | # | Section | Component | Copy (first line) |
218
+ | --- | ----------------------------------- | ----------------- | ----------------- |
219
+ | 1 | `document-chassis` (layout=article) | `DocumentChassis` | Terms of Service |
220
+
221
+ <!-- generated:end -->
222
+
223
+ `/purchase-policy` (this tree's own service-shape override — cancellation and refunds, D4):
224
+
225
+ <!-- generated:begin page=/purchase-policy -->
226
+
227
+ | # | Section | Component | Copy (first line) |
228
+ | --- | ----------------------------------- | ----------------- | ----------------- |
229
+ | 1 | `document-chassis` (layout=article) | `DocumentChassis` | Purchase Policy |
230
+
231
+ <!-- generated:end -->
232
+
233
+ `/blog` (the Free teaser row, § 1.8 — served by the generic `[slug]` route over the always-copied overlay's `BlogList/blog.mdx`):
234
+
235
+ <!-- generated:begin page=/blog -->
236
+
237
+ | # | Section | Component | Copy (first line) |
238
+ | --- | ------------------------------------------------------------ | -------------- | ----------------------------------------------------------------- |
239
+ | 1 | `hero` (centered · gapBelow=tight · eyebrow "Blog" · 2 CTAs) | `Hero` | Get free blog/docs from Fumadocs |
240
+ | 2 | `blog-list` (grid) | `BlogList` | |
241
+ | 3 | `logoCloud` (layout=inline · logos ×6) | `LogoCloud` | Don’t just take our word for it |
242
+ | 4 | `testimonials` (quote · items ×1) | `Testimonials` | {A customer quote, in their own words, about the result they got} |
243
+
244
+ <!-- generated:end -->
245
+
246
+ `/portfolio` (this tree's own override of the `_base` seed — both primary CTAs point at `/contact`, D4):
247
+
248
+ <!-- generated:begin page=/portfolio -->
249
+
250
+ | # | Section | Component | Copy (first line) |
251
+ | --- | ---------------------------------------------------------------------------------------------------------- | --------- | ------------------------------------------ |
252
+ | 1 | `hero` (default · gapBelow=tight · size=display · surface=wash-secondary · eyebrow "{Portfolio}" · 2 CTAs) | `Hero` | {The work, before and after.} |
253
+ | 2 | `items` (tile · surface=none · columns=2 · items ×4) | `Items` | |
254
+ | 3 | `cta` (beam · chips ×3 · 2 CTAs) | `CTA` | {Is your project the before or the after?} |
255
+ | 4 | `faq` (centered · surface=gray-100 · accordion · items ×3 · initialOpen first) | `FAQ` | Frequently Asked Questions |
256
+
257
+ <!-- generated:end -->
258
+
259
+ `/portfolio/[slug]`:
260
+
261
+ <!-- generated:begin page=/portfolio/[slug] -->
262
+
263
+ _Detail route over `content/en/PortfolioItem/` — 4 seed pages: `sample-four.mdx`, `sample-one.mdx`, `sample-three.mdx`, `sample-two.mdx`._
264
+ <!-- generated:end -->
265
+
266
+ ### 3a. Differences from the standard `organization-service` derivation
267
+
268
+ The standard page set for this shape (`derive-roster.py --shape organization-service --primary-goal generate-leads --registry packages/schema/src/registry/entries.ts`, harness commit `7bdaf148e1b0e639cd90a80008955e55cc4aa2b5`) is 33 rows, `mainEntity: Organization`. This starter's roster is that set minus the standard rows the table below drops, plus the rows the table after it adds, each with a reason.
269
+
270
+ **Standard rows dropped:**
271
+
272
+ | Standard row | Reason |
273
+ | -------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
274
+ | `TeamList` · `TeamMember` | a placeholder starter has no team to list; `/about` carries the people |
275
+ | `CareersList` · `JobPosting` | a placeholder starter has no open roles |
276
+ | `PartnersList` · `Partner` | a placeholder starter has no partners to list |
277
+ | `ProjectsList` · `Project` | the portfolio pair (`/portfolio`) is the proof of past work; `/projects` is the signal-collectors sample listing |
278
+ | `Pricing` | a service is priced on its own `Service` page (or quoted), not on a pricing table |
279
+ | `CaseStudiesList` · `CaseStudy` · `TestimonialsList` · `ClientsList` | proof pages need real customers (the #6658 reason) |
280
+ | `EventsList` · `Event` · `DownloadsList` | a placeholder starter has no events or downloads |
281
+ | `ResourcesHub` · `ResourceDetail` · `HowTo` · `Whitepaper` | the Resources content system is the goal-driven default a site grows into, not a starter page |
282
+
283
+ **Rows added:**
284
+
285
+ | Row added | Reason |
286
+ | --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
287
+ | `PurchasePolicyPage` | every shape carries one purchase policy with its shape's sections — service: cancellation and refunds (#6646 D3) |
288
+ | `PortfolioList` · `PortfolioItem` | the portfolio pair belongs to every shape's standard roster (operator, 2026-09-25; roadmap § 4) |
289
+ | `BlogList` | every Free scaffold's nav links `/blog` unconditionally (`renderNavConfig`, operator ruling 2026-09-23); the Free teaser serves it, as on organization-product (§ 1.8) |
290
+ | `LandingPage` | the Free `/meet` meeting-types hub is a LandingPage seed, the same generic `[slug]` route serves it through (#6897 D3); the four `/meet/[slug]` BookCall detail seeds ride the `BookCall` type already in the standard roster |
291
+
292
+ `|S − D| = 13` and `|R| = 18`.
293
+
294
+ `/sign-in` and `/sign-up` are also rostered (#6797) — code routes (`kind: route`) with no page type, so they sit outside this set equation: the locale layout's header links both, and the roster of record lists every page the scaffold serves.
295
+
296
+ ## 4. Roster, as the registry declares it
297
+
298
+ `organization-service` is a `SHAPE_STARTERS` entry, not a declared `--template` alias: `TEMPLATE_MANIFESTS` and `RECOGNIZED_TEMPLATES` never carry its name (NFR-3). The merged roster, as the registry composes it:
299
+
300
+ <!-- generated:begin roster -->
301
+
302
+ ```
303
+ organization-service:
304
+ requires: [marketing]
305
+ categories: [accounting, legal, real-estate]
306
+ shape: organization-service
307
+ design: standard
308
+ roster:
309
+ - { route: "/", kind: page, content: ["content/en/HomePage/home.mdx"] }
310
+ - { route: "/about", kind: page, content: ["content/en/AboutPage/about.mdx"] }
311
+ - { route: "/services", kind: page, content: ["content/en/ServicesList/services.mdx"] }
312
+ - { route: "/services/[slug]", kind: page, contentDir: "content/en/Service" }
313
+ - { route: "/for", kind: page, content: ["content/en/UseCasesList/for.mdx"] }
314
+ - { route: "/for/[slug]", kind: page, contentDir: "content/en/UseCase" }
315
+ - { route: "/contact", kind: page, content: ["content/en/ContactPage/contact.mdx"] }
316
+ - { route: "/faq", kind: page, content: ["content/en/FAQPage/faq.mdx"] }
317
+ - { route: "/glossary", kind: page, content: ["content/en/GlossaryList/glossary.mdx"] }
318
+ - { route: "/newsletter", kind: page, content: ["content/en/NewsletterSignup/newsletter.mdx"] }
319
+ - { route: "/sign-in", kind: route }
320
+ - { route: "/sign-up", kind: route }
321
+ - { route: "/privacy", kind: page, content: ["content/en/PrivacyPage/privacy.mdx"] }
322
+ - { route: "/terms", kind: page, content: ["content/en/TermsPage/terms.mdx"] }
323
+ - { route: "/purchase-policy", kind: page, content: ["content/en/PurchasePolicyPage/purchase-policy.mdx"] }
324
+ - { route: "/blog", kind: page, content: ["content/en/BlogList/blog.mdx"] }
325
+ - { route: "/meet", kind: page, content: ["content/en/LandingPage/meet.mdx"] }
326
+ - { 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"] }
327
+ - { route: "/portfolio", kind: page, content: ["content/en/PortfolioList/portfolio.mdx"] }
328
+ - { route: "/portfolio/[slug]", kind: page, contentDir: "content/en/PortfolioItem" }
329
+ ```
330
+
331
+ <!-- generated:end -->
332
+
333
+ By source:
334
+
335
+ ```
336
+ starter: / · /about · /services · /services/<slug> · /contact · /faq
337
+ /glossary · /newsletter · /sign-in · /sign-up
338
+ /privacy · /terms · /purchase-policy · /blog · /meet · /meet/<slug>
339
+ /portfolio · /portfolio/<slug>
340
+ ```
341
+
342
+ Every row is module-less: `requires` is `[marketing]` alone, so `mergeRoster` contributes nothing beyond this tree's own seventeen rows.
343
+
344
+ ## 5. Component inventory
345
+
346
+ <!-- generated:begin inventory -->
347
+
348
+ | Tier | Used by this template |
349
+ | -------- | -------------------------------------------------------------------------------------------------------------------------- |
350
+ | Shell | `MarketingShell` |
351
+ | Chrome | `Nav`, `Footer`, `Banner` (+ `BannerConsentIsland`, `BannerDismissIsland`) |
352
+ | Sections | `BlogList`, `ContentBlock`, `CTA`, `DocumentChassis`, `FAQ`, `GlossaryIndex`, `Hero`, `Items`, `LogoCloud`, `Testimonials` |
353
+
354
+ <!-- generated:end -->
@@ -0,0 +1,10 @@
1
+ {
2
+ "name": "organization-service",
3
+ "requires": ["marketing"],
4
+ "extends": "_base",
5
+ "installMap": {
6
+ "provenance.json": ".ailk-template.json",
7
+ "TEMPLATE-MANIFEST.json": ".ailk-site-manifest.json"
8
+ },
9
+ "postInstall": "Starter organization-service installed. Its /faq, /contact, /blog, /meet and its four /meet/<slug> seed pages came with the always-copied overlay; /glossary, /newsletter, /privacy and /terms with the base layer it extends (content/en/). This tree's own /, /about, /services (+ three engagements), /purchase-policy and /portfolio pages are its own compositions. Every line of copy is a placeholder \u2014 replace it before you launch."
10
+ }
@@ -0,0 +1,38 @@
1
+ ---
2
+ type: "AboutPage"
3
+ slug: "about"
4
+ title: "About"
5
+ description: "The team behind {your company}. Placeholder copy — replace before you launch."
6
+ sections:
7
+ [
8
+ {
9
+ "id": "intro",
10
+ "type": "content-block",
11
+ "data":
12
+ {
13
+ "variant": "narrow",
14
+ "eyebrow": "About",
15
+ "headline": "{A small team, a short client list, a long relationship}",
16
+ "body": "{Two or three sentences on how the company started, who it works with, and what it will not take on. Keep it concrete rather than aspirational.}",
17
+ },
18
+ },
19
+ {
20
+ "id": "closing",
21
+ "type": "cta",
22
+ "data":
23
+ {
24
+ "variant": "minimal",
25
+ "headline": "Work with us",
26
+ "primaryCta": { "label": "Get in touch", "href": "/contact" },
27
+ "secondaryCta":
28
+ {
29
+ "label": "See services",
30
+ "href": "/services",
31
+ "variant": "outline",
32
+ },
33
+ },
34
+ },
35
+ ]
36
+ ---
37
+
38
+ Placeholder copy. This page overrides the always-copied overlay's `AboutPage/about.mdx`.
@@ -0,0 +1,85 @@
1
+ ---
2
+ type: "HomePage"
3
+ slug: "home"
4
+ title: "Your Company"
5
+ description: "Placeholder home for the organization-service starter — a company selling a service to clients anywhere. Replace every line before you launch."
6
+ sections:
7
+ [
8
+ {
9
+ "id": "hero",
10
+ "type": "hero",
11
+ "data":
12
+ {
13
+ "variant": "centered",
14
+ "eyebrow": "{Your Company}",
15
+ "headline": "{One line on the outcome you deliver for clients}",
16
+ "subheadline": "{One line on who you work with and what makes the engagement different.}",
17
+ "primaryCta": { "label": "Get in touch", "href": "/contact" },
18
+ "secondaryCta":
19
+ {
20
+ "label": "See services",
21
+ "href": "/services",
22
+ "variant": "outline",
23
+ },
24
+ },
25
+ },
26
+ {
27
+ "id": "services",
28
+ "type": "items",
29
+ "data":
30
+ {
31
+ "headline": "What we do",
32
+ "columns": 3,
33
+ "items":
34
+ [
35
+ {
36
+ "title": "{First engagement}",
37
+ "description": "{One line on what it is and who it suits.}",
38
+ "link":
39
+ {
40
+ "label": "Read more",
41
+ "href": "/services/first-engagement",
42
+ },
43
+ },
44
+ {
45
+ "title": "{Second engagement}",
46
+ "description": "{One line on what it is and who it suits.}",
47
+ "link":
48
+ {
49
+ "label": "Read more",
50
+ "href": "/services/second-engagement",
51
+ },
52
+ },
53
+ {
54
+ "title": "{Third engagement}",
55
+ "description": "{One line on what it is and who it suits.}",
56
+ "link":
57
+ {
58
+ "label": "Read more",
59
+ "href": "/services/third-engagement",
60
+ },
61
+ },
62
+ ],
63
+ },
64
+ },
65
+ {
66
+ "id": "closing",
67
+ "type": "cta",
68
+ "data":
69
+ {
70
+ "variant": "minimal",
71
+ "headline": "Ready to talk about your project?",
72
+ "description": "{One line inviting the reader to start the conversation.}",
73
+ "primaryCta": { "label": "Get in touch", "href": "/contact" },
74
+ "secondaryCta":
75
+ {
76
+ "label": "Read about us",
77
+ "href": "/about",
78
+ "variant": "outline",
79
+ },
80
+ },
81
+ },
82
+ ]
83
+ ---
84
+
85
+ Placeholder copy. Every headline, every line of body copy on this site is a placeholder — replace them before you launch.
@@ -0,0 +1,59 @@
1
+ ---
2
+ type: "NewsletterSignup"
3
+ slug: "newsletter"
4
+ title: "{Start a free newsletter with Substack}"
5
+ description: "{Or upgrade to Pro to capture every subscriber and build your own marketing database.}"
6
+ schema:
7
+ mainEntity:
8
+ "@type": "Offer"
9
+ name: "{Your newsletter name}"
10
+ price: 0
11
+ priceCurrency: "USD"
12
+ sections:
13
+ [
14
+ {
15
+ "id": "hero",
16
+ "type": "hero",
17
+ "data":
18
+ {
19
+ "eyebrow": "Newsletter",
20
+ "headline": "{Start a free newsletter with Substack}",
21
+ "subheadline": "{Or upgrade to Pro to capture every subscriber and build your own marketing database.}",
22
+ "primaryCta":
23
+ { "label": "{Connect Substack}", "href": "https://substack.com" },
24
+ "secondaryCta":
25
+ {
26
+ "label": "{Upgrade to Pro}",
27
+ "href": "https://ailaunchkit.ai/pricing",
28
+ "variant": "outline",
29
+ },
30
+ },
31
+ },
32
+ {
33
+ "id": "faq",
34
+ "type": "faq",
35
+ "data":
36
+ {
37
+ "headline": "FAQs",
38
+ "presentation": "expanded",
39
+ "items":
40
+ [
41
+ {
42
+ "question": "{How often will I hear from you?}",
43
+ "answer": "{Answer in one or two plain sentences}",
44
+ },
45
+ {
46
+ "question": "{What will I get?}",
47
+ "answer": "{Answer in one or two plain sentences}",
48
+ },
49
+ {
50
+ "question": "{Can I unsubscribe?}",
51
+ "answer": "{Answer in one or two plain sentences}",
52
+ },
53
+ ],
54
+ },
55
+ },
56
+ ]
57
+ ---
58
+
59
+ {/* Rendered from frontmatter `sections[]` by the /newsletter route. The Free template has no signup form: the hero points the owner to Substack, or to Pro for subscriber capture. The `schema:` Offer is the page's JSON-LD main entity — a free subscription. Placeholder copy — replace every {brace} with your own words before you launch. */}