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