create-ailk 0.22.0 → 0.24.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 (287) hide show
  1. package/README.md +27 -14
  2. package/component-catalog.json +149 -5
  3. package/component-catalog.md +7 -6
  4. package/dist/add-module.js +17 -10
  5. package/dist/add-route.d.ts +55 -1
  6. package/dist/add-route.js +301 -13
  7. package/dist/cli.js +27 -10
  8. package/dist/derive-architecture.d.ts +7 -5
  9. package/dist/derive-architecture.js +26 -32
  10. package/dist/lib/design-checks.js +4 -2
  11. package/dist/lib/env-catalog.js +0 -4
  12. package/dist/lib/npm-auth.d.ts +9 -0
  13. package/dist/lib/npm-auth.js +48 -0
  14. package/dist/lib/scaffold-render-sweep.d.ts +36 -2
  15. package/dist/lib/scaffold-render-sweep.js +50 -8
  16. package/dist/module-architecture.js +115 -10
  17. package/dist/paid-sections.d.ts +21 -2
  18. package/dist/paid-sections.js +69 -7
  19. package/dist/seed-flows.d.ts +4 -1
  20. package/dist/seed-flows.js +50 -4
  21. package/dist/spoke-checkout.d.ts +38 -35
  22. package/dist/spoke-checkout.js +66 -229
  23. package/dist/starter-grid.d.ts +0 -3
  24. package/dist/starter-grid.js +24 -14
  25. package/dist/surfaces.js +33 -12
  26. package/dist/sync-routes.d.ts +68 -5
  27. package/dist/sync-routes.js +455 -29
  28. package/dist/template-record.d.ts +1 -1
  29. package/dist/template-record.js +3 -2
  30. package/dist/update.js +10 -0
  31. package/package.json +3 -3
  32. package/site-templates/_base/content/en/NewsletterSignup/newsletter.mdx +4 -49
  33. package/site-templates/_base/content/en/Pricing/pricing.mdx +3 -21
  34. package/site-templates/marketing-site/TEMPLATE-MANIFEST.json +23 -20
  35. package/site-templates/marketing-site/TEMPLATE-MANIFEST.md +28 -14
  36. package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.json +15 -39
  37. package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.md +38 -34
  38. package/site-templates/marketing-site-free/content/en/NewsletterSignup/newsletter.mdx +6 -43
  39. package/site-templates/shapes/local-business-service/TEMPLATE-MANIFEST.json +14 -31
  40. package/site-templates/shapes/local-business-service/TEMPLATE-MANIFEST.md +26 -25
  41. package/site-templates/shapes/local-business-service/content/en/NewsletterSignup/newsletter.mdx +6 -43
  42. package/site-templates/shapes/organization-service/TEMPLATE-MANIFEST.json +14 -31
  43. package/site-templates/shapes/organization-service/TEMPLATE-MANIFEST.md +26 -25
  44. package/site-templates/shapes/organization-service/content/en/NewsletterSignup/newsletter.mdx +6 -43
  45. package/site-templates/shapes/person-service/TEMPLATE-MANIFEST.json +14 -31
  46. package/site-templates/shapes/person-service/TEMPLATE-MANIFEST.md +26 -25
  47. package/site-templates/shapes/person-service/content/en/NewsletterSignup/newsletter.mdx +6 -43
  48. package/templates/.env.example +13 -7
  49. package/templates/.github/workflows/ci.yml +13 -0
  50. package/templates/CLAUDE.md +4 -2
  51. package/templates/README.md +1 -0
  52. package/templates/_gitignore +4 -0
  53. package/templates/apps/api/.env.example +34 -0
  54. package/templates/apps/api/CLAUDE.md +94 -19
  55. package/templates/apps/api/package.json +1 -0
  56. package/templates/apps/api/src/__tests__/factories/in-memory-prisma.ts +2 -0
  57. package/templates/apps/api/src/bin/stripe-connections-rekey.ts +45 -0
  58. package/templates/apps/api/src/config/__tests__/stripe-connection-key.test.ts +185 -0
  59. package/templates/apps/api/src/config/index.ts +109 -0
  60. package/templates/apps/api/src/lib/__mocks__/prisma.ts +7 -1
  61. package/templates/apps/api/src/lib/__tests__/flow-rename-race.db.test.ts +116 -0
  62. package/templates/apps/api/src/lib/__tests__/site.test.ts +16 -0
  63. package/templates/apps/api/src/lib/error-serializer.ts +74 -7
  64. package/templates/apps/api/src/lib/site.ts +4 -1
  65. package/templates/apps/api/src/lib/stripe.ts +77 -4
  66. package/templates/apps/api/src/lib/webhook-idempotency.ts +66 -2
  67. package/templates/apps/api/src/middleware/__tests__/rate-limit.test.ts +218 -0
  68. package/templates/apps/api/src/middleware/__tests__/write-budget.test.ts +174 -0
  69. package/templates/apps/api/src/middleware/rate-limit.ts +226 -4
  70. package/templates/apps/api/src/openapi/__tests__/openapi.test.ts +127 -0
  71. package/templates/apps/api/src/openapi/spec.ts +343 -7
  72. package/templates/apps/api/src/routes/billing/plan-checkout.ts +332 -0
  73. package/templates/apps/api/src/routes/checkout/__tests__/live-key.test.ts +11 -0
  74. package/templates/apps/api/src/routes/checkout/__tests__/offerings-authorization.test.ts +1426 -0
  75. package/templates/apps/api/src/routes/checkout/__tests__/session.test.ts +11 -0
  76. package/templates/apps/api/src/routes/checkout/__tests__/sessions.test.ts +49 -0
  77. package/templates/apps/api/src/routes/checkout/session.ts +57 -25
  78. package/templates/apps/api/src/routes/checkout/sessions.ts +232 -82
  79. package/templates/apps/api/src/routes/consent/__tests__/account.test.ts +5 -5
  80. package/templates/apps/api/src/routes/consent/__tests__/sign-up-rate-limit.test.ts +160 -0
  81. package/templates/apps/api/src/routes/consent/account.ts +4 -2
  82. package/templates/apps/api/src/routes/content/__tests__/get-page.test.ts +2 -2
  83. package/templates/apps/api/src/routes/content/__tests__/offerings.test.ts +731 -0
  84. package/templates/apps/api/src/routes/content/__tests__/pricing.test.ts +753 -0
  85. package/templates/apps/api/src/routes/content/__tests__/shown-offerings.test.ts +762 -0
  86. package/templates/apps/api/src/routes/content/get-page.ts +34 -119
  87. package/templates/apps/api/src/routes/content/index.ts +16 -2
  88. package/templates/apps/api/src/routes/content/list-pages.ts +15 -36
  89. package/templates/apps/api/src/routes/content/offerings.ts +184 -0
  90. package/templates/apps/api/src/routes/content/pricing.ts +176 -0
  91. package/templates/apps/api/src/routes/content/search.ts +16 -45
  92. package/templates/apps/api/src/routes/content/shown-offerings.ts +229 -0
  93. package/templates/apps/api/src/routes/leads/index.ts +377 -308
  94. package/templates/apps/api/src/routes/project-listings/__tests__/me.test.ts +20 -9
  95. package/templates/apps/api/src/routes/project-listings/__tests__/public.test.ts +17 -6
  96. package/templates/apps/api/src/routes/project-listings/__tests__/site-answers.test.ts +1 -1
  97. package/templates/apps/api/src/routes/webhooks/README.md +66 -0
  98. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-flow-checkout.test.ts +1 -0
  99. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-offerings.test.ts +814 -0
  100. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-org-billing.test.ts +80 -68
  101. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-site-filter.test.ts +6 -5
  102. package/templates/apps/api/src/routes/webhooks/__tests__/stripe.test.ts +8 -2
  103. package/templates/apps/api/src/routes/webhooks/index.ts +23 -0
  104. package/templates/apps/api/src/routes/webhooks/stripe-offerings.ts +384 -0
  105. package/templates/apps/api/src/routes/webhooks/stripe.ts +93 -17
  106. package/templates/apps/api/src/server.ts +165 -51
  107. package/templates/apps/api/src/services/__tests__/abandon-email.test.ts +121 -4
  108. package/templates/apps/api/src/services/__tests__/checkout-plan.test.ts +313 -0
  109. package/templates/apps/api/src/services/__tests__/deliverable-fulfillment.test.ts +61 -2
  110. package/templates/apps/api/src/services/__tests__/keyless-workspace-predicate.test.ts +234 -0
  111. package/templates/apps/api/src/services/__tests__/lead-routing.test.ts +374 -44
  112. package/templates/apps/api/src/services/__tests__/person.test.ts +260 -1
  113. package/templates/apps/api/src/services/__tests__/plan-offerings.test.ts +450 -0
  114. package/templates/apps/api/src/services/__tests__/project-listings.counts.test.ts +202 -0
  115. package/templates/apps/api/src/services/__tests__/project-listings.fence.test.ts +15 -18
  116. package/templates/apps/api/src/services/abandon-email.ts +28 -5
  117. package/templates/apps/api/src/services/deliverable-fulfillment.ts +15 -12
  118. package/templates/apps/api/src/services/entitlements.ts +157 -1
  119. package/templates/apps/api/src/services/lead-routing.ts +113 -58
  120. package/templates/apps/api/src/services/offerings/__tests__/catalog.test.ts +348 -0
  121. package/templates/apps/api/src/services/offerings/__tests__/checkout-session-record.test.ts +268 -0
  122. package/templates/apps/api/src/services/offerings/__tests__/connection.test.ts +975 -0
  123. package/templates/apps/api/src/services/offerings/__tests__/fixtures.ts +416 -0
  124. package/templates/apps/api/src/services/offerings/__tests__/org-products.test.ts +400 -0
  125. package/templates/apps/api/src/services/offerings/__tests__/readers.test.ts +685 -0
  126. package/templates/apps/api/src/services/offerings/__tests__/source.test.ts +231 -0
  127. package/templates/apps/api/src/services/offerings/catalog.ts +318 -0
  128. package/templates/apps/api/src/services/offerings/checkout-authorization.ts +403 -0
  129. package/templates/apps/api/src/services/offerings/checkout-session-record.ts +192 -0
  130. package/templates/apps/api/src/services/offerings/connection.ts +1083 -0
  131. package/templates/apps/api/src/services/offerings/index.ts +614 -0
  132. package/templates/apps/api/src/services/offerings/source.ts +140 -0
  133. package/templates/apps/api/src/services/offerings/store.ts +150 -0
  134. package/templates/apps/api/src/services/person.ts +147 -9
  135. package/templates/apps/api/src/services/plan-offerings.ts +96 -30
  136. package/templates/apps/api/src/services/project-listings.ts +43 -31
  137. package/templates/apps/api/src/services/public-site-resolver.ts +19 -14
  138. package/templates/apps/mcp/CLAUDE.md +32 -18
  139. package/templates/apps/mcp/__tests__/app-entry.test.ts +2 -2
  140. package/templates/apps/mcp/__tests__/catalog-drift.test.ts +9 -4
  141. package/templates/apps/mcp/__tests__/get_offerings.test.ts +358 -0
  142. package/templates/apps/mcp/__tests__/get_pricing.test.ts +364 -0
  143. package/templates/apps/mcp/__tests__/http-transport.test.ts +95 -14
  144. package/templates/apps/mcp/__tests__/lib/content-adapter-parity.test.ts +8 -3
  145. package/templates/apps/mcp/__tests__/lib/content-adapter.test.ts +0 -25
  146. package/templates/apps/mcp/__tests__/lib/fail-closed-tools.test.ts +22 -7
  147. package/templates/apps/mcp/__tests__/list_pages.test.ts +84 -44
  148. package/templates/apps/mcp/__tests__/locale.test.ts +41 -56
  149. package/templates/apps/mcp/__tests__/module-exclusion.test.ts +2 -2
  150. package/templates/apps/mcp/__tests__/rate-limit-write.test.ts +189 -0
  151. package/templates/apps/mcp/__tests__/read_content.test.ts +115 -78
  152. package/templates/apps/mcp/__tests__/request_callback.test.ts +63 -128
  153. package/templates/apps/mcp/__tests__/search_content.test.ts +76 -61
  154. package/templates/apps/mcp/__tests__/server.test.ts +13 -11
  155. package/templates/apps/mcp/__tests__/start_purchase.test.ts +208 -12
  156. package/templates/apps/mcp/__tests__/submit_lead.test.ts +82 -167
  157. package/templates/apps/mcp/__tests__/subscribe_newsletter.test.ts +59 -130
  158. package/templates/apps/mcp/__tests__/tools/purchase.test.ts +11 -11
  159. package/templates/apps/mcp/package.json +1 -0
  160. package/templates/apps/mcp/src/abuse/index.ts +18 -11
  161. package/templates/apps/mcp/src/http-transport.ts +47 -9
  162. package/templates/apps/mcp/src/lib/content-adapter.ts +0 -26
  163. package/templates/apps/mcp/src/lib/empty-content-adapter.ts +5 -4
  164. package/templates/apps/mcp/src/lib/shown-offerings.ts +105 -0
  165. package/templates/apps/mcp/src/lib/site-config.ts +53 -0
  166. package/templates/apps/mcp/src/server.ts +5 -0
  167. package/templates/apps/mcp/src/tools/capture_lead.ts +30 -28
  168. package/templates/apps/mcp/src/tools/get_offerings.ts +47 -30
  169. package/templates/apps/mcp/src/tools/get_pricing.ts +40 -40
  170. package/templates/apps/mcp/src/tools/index.ts +22 -21
  171. package/templates/apps/mcp/src/tools/list_pages.ts +27 -33
  172. package/templates/apps/mcp/src/tools/purchase.ts +30 -2
  173. package/templates/apps/mcp/src/tools/read_content.ts +46 -40
  174. package/templates/apps/mcp/src/tools/request_callback.ts +21 -28
  175. package/templates/apps/mcp/src/tools/search_content.ts +20 -24
  176. package/templates/apps/mcp/src/tools/subscribe_newsletter.ts +23 -26
  177. package/templates/apps/mcp/src/workspace-server.ts +15 -0
  178. package/templates/apps/web/.env.example +10 -31
  179. package/templates/apps/web/CLAUDE.md +324 -42
  180. package/templates/apps/web/app/[locale]/(authed)/account/__tests__/agreements-prompt.test.tsx +3 -3
  181. package/templates/apps/web/app/[locale]/(authed)/account/__tests__/layout.test.tsx +3 -3
  182. package/templates/apps/web/app/[locale]/(authed)/account/__tests__/privacy.test.tsx +3 -3
  183. package/templates/apps/web/app/[locale]/careers/[slug]/[action]/page.tsx +189 -0
  184. package/templates/apps/web/app/[locale]/careers/[slug]/apply.actions.ts +4 -2
  185. package/templates/apps/web/app/[locale]/careers/[slug]/job-application-form.ts +8 -3
  186. package/templates/apps/web/app/[locale]/careers/[slug]/page.tsx +22 -144
  187. package/templates/apps/web/app/[locale]/careers/__tests__/apply.actions.test.ts +9 -0
  188. package/templates/apps/web/app/[locale]/careers/__tests__/careers-hub.test.tsx +172 -0
  189. package/templates/apps/web/app/[locale]/careers/__tests__/careers-set.test.tsx +149 -0
  190. package/templates/apps/web/app/[locale]/careers/__tests__/job-application-form.test.ts +22 -24
  191. package/templates/apps/web/app/[locale]/careers/__tests__/job-apply-page.test.tsx +140 -66
  192. package/templates/apps/web/app/[locale]/careers/__tests__/page-renderer-migration.test.tsx +57 -22
  193. package/templates/apps/web/app/[locale]/careers/page.tsx +129 -5
  194. package/templates/apps/web/app/[locale]/contact/__tests__/ConversationalIntakeWrapper.test.tsx +1 -1
  195. package/templates/apps/web/app/[locale]/contact/__tests__/contact-magnet-page.test.tsx +119 -11
  196. package/templates/apps/web/app/[locale]/contact/__tests__/contact.actions.test.ts +28 -5
  197. package/templates/apps/web/app/[locale]/contact/contact.actions.ts +20 -6
  198. package/templates/apps/web/app/[locale]/contact/intake-script.ts +1 -1
  199. package/templates/apps/web/app/[locale]/contact/page.tsx +99 -92
  200. package/templates/apps/web/app/[locale]/flows/[slug]/FlowStepperClient.tsx +237 -5
  201. package/templates/apps/web/app/[locale]/flows/[slug]/__tests__/FlowStepperClient.count.test.tsx +43 -0
  202. package/templates/apps/web/app/[locale]/flows/[slug]/__tests__/FlowStepperClient.deliverable.test.tsx +200 -0
  203. package/templates/apps/web/app/[locale]/flows/[slug]/__tests__/FlowStepperClient.ending.test.tsx +197 -0
  204. package/templates/apps/web/app/[locale]/flows/[slug]/__tests__/magnet-page.test.tsx +430 -0
  205. package/templates/apps/web/app/[locale]/flows/[slug]/__tests__/two-route-tool.test.tsx +21 -9
  206. package/templates/apps/web/app/[locale]/flows/[slug]/magnet-page.tsx +369 -0
  207. package/templates/apps/web/app/[locale]/flows/[slug]/page.tsx +12 -73
  208. package/templates/apps/web/app/[locale]/flows/[slug]/start/page.tsx +10 -31
  209. package/templates/apps/web/app/[locale]/layout.tsx +55 -4
  210. package/templates/apps/web/app/[locale]/newsletter/__tests__/page.test.tsx +174 -104
  211. package/templates/apps/web/app/[locale]/newsletter/page.tsx +95 -58
  212. package/templates/apps/web/app/[locale]/pricing/__tests__/__snapshots__/unconnected.test.tsx.snap +7 -0
  213. package/templates/apps/web/app/[locale]/pricing/__tests__/offerings.test.tsx +599 -0
  214. package/templates/apps/web/app/[locale]/pricing/__tests__/page.test.tsx +216 -0
  215. package/templates/apps/web/app/[locale]/pricing/__tests__/unconnected.test.tsx +236 -0
  216. package/templates/apps/web/app/[locale]/pricing/page.tsx +367 -6
  217. package/templates/apps/web/app/[locale]/team/__tests__/team-routes.test.tsx +4 -1
  218. package/templates/apps/web/app/[locale]/unsubscribe/__tests__/unsubscribe-rsc-boundary.test.tsx +17 -0
  219. package/templates/apps/web/app/[locale]/unsubscribe/__tests__/unsubscribe.test.tsx +62 -3
  220. package/templates/apps/web/app/[locale]/unsubscribe/page.tsx +70 -18
  221. package/templates/apps/web/app/[locale]/unsubscribe/unsubscribe-button.tsx +30 -9
  222. package/templates/apps/web/app/api/offerings/checkout/[lookupKey]/route.ts +316 -0
  223. package/templates/apps/web/app/api/offerings/checkout/__tests__/route.test.ts +810 -0
  224. package/templates/apps/web/lib/__tests__/auth-routes.test.ts +27 -1
  225. package/templates/apps/web/lib/__tests__/deck-page.test.ts +2 -1
  226. package/templates/apps/web/lib/__tests__/in-page-magnet.test.ts +265 -0
  227. package/templates/apps/web/lib/__tests__/magnet-routes.test.ts +64 -0
  228. package/templates/apps/web/lib/__tests__/newsletter.actions.test.ts +293 -0
  229. package/templates/apps/web/lib/__tests__/offerings-pricing.test.ts +601 -0
  230. package/templates/apps/web/lib/__tests__/structured-data.test.tsx +67 -8
  231. package/templates/apps/web/lib/auth-routes.ts +36 -2
  232. package/templates/apps/web/lib/checkout-config.ts +9 -20
  233. package/templates/apps/web/lib/deck-page.ts +1 -0
  234. package/templates/apps/web/lib/deliverable-grant.ts +18 -0
  235. package/templates/apps/web/lib/in-page-magnet.ts +416 -0
  236. package/templates/apps/web/lib/magnet-routes.ts +44 -0
  237. package/templates/apps/web/lib/modules.generated.ts +9 -0
  238. package/templates/apps/web/lib/newsletter.actions.ts +205 -0
  239. package/templates/apps/web/lib/offerings-pricing.ts +326 -0
  240. package/templates/apps/web/lib/posting-title.ts +17 -0
  241. package/templates/apps/web/lib/sign-up-agreements.ts +4 -2
  242. package/templates/apps/web/messages/en.json +49 -15
  243. package/templates/apps/web/middleware.ts +12 -2
  244. package/templates/apps/web/security-headers.config.ts +17 -0
  245. package/templates/content/en/BlogList/blog.mdx +4 -71
  246. package/templates/content/en/BookCall/book-a-call.mdx +1 -41
  247. package/templates/content/en/BookCall/onsite-estimate.mdx +1 -17
  248. package/templates/content/en/BookCall/onsite-service.mdx +1 -17
  249. package/templates/content/en/BookCall/start-project.mdx +1 -17
  250. package/templates/content/en/ContactPage/contact.mdx +6 -63
  251. package/templates/content/en/HomePage/home.mdx +3 -21
  252. package/templates/database/CHANGELOG.md +51 -0
  253. package/templates/database/__tests__/in-page-magnets-migration.test.ts +161 -0
  254. package/templates/database/__tests__/offerings-checkout-session.db.test.ts +270 -0
  255. package/templates/database/__tests__/offerings-migration.test.ts +197 -0
  256. package/templates/database/__tests__/offerings-shown-price-ids-migration.test.ts +86 -0
  257. package/templates/database/__tests__/offerings.db.test.ts +303 -0
  258. package/templates/database/__tests__/seed.test.ts +63 -1
  259. package/templates/database/__tests__/trial-magnet-migration.test.ts +186 -0
  260. package/templates/database/auth/schema.prisma +4 -0
  261. package/templates/database/config/schema.prisma +91 -0
  262. package/templates/database/migrations/20261020120000_offerings_data_model/migration.sql +146 -0
  263. package/templates/database/migrations/20261021120000_offerings_checkout_session/migration.sql +77 -0
  264. package/templates/database/migrations/20261022120000_in_page_magnets/migration.sql +45 -0
  265. package/templates/database/migrations/20261023120000_offerings_shown_price_ids/migration.sql +47 -0
  266. package/templates/database/migrations/20261024120000_organization_plan_checkout_session/migration.sql +16 -0
  267. package/templates/database/migrations/20261025120000_trial_magnet/migration.sql +28 -0
  268. package/templates/database/migrations/20261026120000_trial_magnet_proof_line/migration.sql +23 -0
  269. package/templates/database/package.json +1 -1
  270. package/templates/database/seed.ts +57 -2
  271. package/templates/tools/lint-architecture.ts +205 -1
  272. package/versions.json +35 -35
  273. package/site-templates/marketing-site-free/content/en/Pricing/pricing.mdx +0 -199
  274. package/templates/apps/api/src/routes/content/slug.ts +0 -9
  275. package/templates/apps/web/app/[locale]/downloads/__tests__/page-renderer-migration.test.tsx +0 -93
  276. package/templates/apps/web/app/[locale]/downloads/page.tsx +0 -37
  277. package/templates/apps/web/app/[locale]/newsletter/__tests__/newsletter.actions.test.ts +0 -139
  278. package/templates/apps/web/app/[locale]/newsletter/newsletter.actions.ts +0 -93
  279. package/templates/apps/web/app/api/checkout/[offering]/route.ts +0 -48
  280. package/templates/apps/web/app/api/checkout/__tests__/route.test.ts +0 -120
  281. package/templates/apps/web/app/api/checkout/__tests__/success-path.test.ts +0 -86
  282. package/templates/apps/web/app/api/webhooks/stripe/__tests__/route.test.ts +0 -92
  283. package/templates/apps/web/app/api/webhooks/stripe/route.ts +0 -31
  284. package/templates/apps/web/lib/__tests__/checkout.test.ts +0 -243
  285. package/templates/apps/web/lib/__tests__/meeting-slugs.test.ts +0 -120
  286. package/templates/apps/web/lib/checkout.ts +0 -93
  287. package/templates/apps/web/lib/meeting-slugs.ts +0 -63
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-ailk",
3
- "version": "0.22.0",
3
+ "version": "0.24.0",
4
4
  "description": "Scaffolder for AI Launch Kit — `pnpm create ailk@latest <dir>` produces a starter repo consuming @working-theory/* from npm (per ADR 0007).",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -28,8 +28,8 @@
28
28
  "tar": "^7.5.21"
29
29
  },
30
30
  "devDependencies": {
31
- "@working-theory/schema": "0.43.0",
32
- "@working-theory/templates": "0.43.0"
31
+ "@working-theory/schema": "0.45.0",
32
+ "@working-theory/templates": "0.45.0"
33
33
  },
34
34
  "repository": {
35
35
  "type": "git",
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  type: "NewsletterSignup"
3
3
  slug: "newsletter"
4
- title: "{Newsletter: what subscribers get and how often}"
4
+ title: "Get the newsletter"
5
5
  description: "{One sentence on what this newsletter covers and who it is for}"
6
6
  schema:
7
7
  mainEntity:
@@ -11,57 +11,12 @@ schema:
11
11
  priceCurrency: "USD"
12
12
  sections:
13
13
  [
14
- {
15
- "id": "hero",
16
- "type": "hero",
17
- "data":
18
- {
19
- "eyebrow": "Newsletter",
20
- "headline": "{Newsletter: what subscribers get and how often}",
21
- "subheadline": "{One sentence on what this newsletter covers and who it is for}",
22
- "primaryCta": { "label": "Subscribe", "href": "#signup" },
23
- },
24
- },
25
14
  {
26
15
  "id": "signup",
27
- "type": "newsletter",
28
- "data":
29
- {
30
- "headline": "Subscribe",
31
- "description": "{One sentence on what lands in the inbox}",
32
- "action": "/v1/leads/subscribe",
33
- "source": "newsletter",
34
- "placeholder": "you@example.com",
35
- "submitLabel": "Subscribe",
36
- "consentText": "{One line on how you use the address, and that readers can unsubscribe any time}",
37
- "pattern": "none",
38
- },
39
- },
40
- {
41
- "id": "faq",
42
- "type": "faq",
43
- "data":
44
- {
45
- "headline": "FAQs",
46
- "presentation": "expanded",
47
- "items":
48
- [
49
- {
50
- "question": "{How often will I hear from you?}",
51
- "answer": "{Answer in one or two plain sentences}",
52
- },
53
- {
54
- "question": "{What will I get?}",
55
- "answer": "{Answer in one or two plain sentences}",
56
- },
57
- {
58
- "question": "{Can I unsubscribe?}",
59
- "answer": "{Answer in one or two plain sentences}",
60
- },
61
- ],
62
- },
16
+ "type": "contact-form",
17
+ "data": { "variant": "column", "fields": [] },
63
18
  },
64
19
  ]
65
20
  ---
66
21
 
67
- {/* Rendered from frontmatter `sections[]` by the /newsletter route. The form posts the address to lead capture (`/v1/leads/subscribe`), which records a subscriber and sends no verification email. 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. */}
22
+ {/* Rendered from frontmatter `sections[]` by the /newsletter route. The page's one signup surface is the workspace's Newsletter magnet: its heading, sentence, field, consent, button and ending all come from the magnet, mounted by the route in this section's slot. To change the signup, change the magnet in Admin → Magnets. The `schema:` Offer is the page's JSON-LD main entity — a free subscription. Replace every {brace} with your own words before you launch. */}
@@ -67,27 +67,9 @@ sections:
67
67
  "headlineStyle": "label",
68
68
  "logos":
69
69
  [
70
- {
71
- "name": "SalesSmyth",
72
- "src": "/logos/salessmyth.svg",
73
- "darkSrc": "/logos/salessmyth-light.svg",
74
- "width": 1118,
75
- "height": 147,
76
- },
77
- {
78
- "name": "AI Launch Kit",
79
- "src": "/logos/ai-launch-kit.svg",
80
- "darkSrc": "/logos/ai-launch-kit-light.svg",
81
- "width": 1248,
82
- "height": 144,
83
- },
84
- {
85
- "name": "Atomic Agent",
86
- "src": "/logos/atomic-agent.svg",
87
- "darkSrc": "/logos/atomic-agent-light.svg",
88
- "width": 1320,
89
- "height": 148,
90
- },
70
+ { "name": "Placeholder logo", "src": "/logomark.svg" },
71
+ { "name": "Placeholder logo", "src": "/logomark.svg" },
72
+ { "name": "Placeholder logo", "src": "/logomark.svg" },
91
73
  ],
92
74
  "layout": "inline",
93
75
  "treatment": "monochrome",
@@ -17,7 +17,7 @@
17
17
  ],
18
18
  "shape": "organization-product",
19
19
  "design": "standard",
20
- "generatedHash": "20f84bf7cdd2f51960084e6a91f2cbdc35d86fe87230619572124ca977609f5b",
20
+ "generatedHash": "f4a8f11aba42a071794585c4563015bd1c99cbe6917a36ee0629d37c6f5f476c",
21
21
  "layout": {
22
22
  "nav": "full",
23
23
  "footer": "columns",
@@ -333,15 +333,8 @@
333
333
  "chrome": "on",
334
334
  "sections": [
335
335
  {
336
- "type": "hero",
337
- "component": "Hero"
338
- },
339
- {
340
- "type": "items",
341
- "component": "Items",
342
- "options": {
343
- "columns": 2
344
- }
336
+ "type": "contact-form",
337
+ "component": "ContactForm"
345
338
  }
346
339
  ]
347
340
  },
@@ -372,19 +365,20 @@
372
365
  "chrome": "on",
373
366
  "sections": [
374
367
  {
375
- "type": "hero",
376
- "component": "Hero"
377
- },
378
- {
379
- "type": "newsletter",
380
- "component": "Newsletter"
381
- },
382
- {
383
- "type": "faq",
384
- "component": "FAQ"
368
+ "type": "contact-form",
369
+ "component": "ContactForm"
385
370
  }
386
371
  ]
387
372
  },
373
+ {
374
+ "route": "/unsubscribe",
375
+ "kind": "route",
376
+ "pageType": null,
377
+ "schema": null,
378
+ "shell": "MarketingShell",
379
+ "chrome": "on",
380
+ "sections": []
381
+ },
388
382
  {
389
383
  "route": "/sign-in",
390
384
  "kind": "route",
@@ -697,6 +691,15 @@
697
691
  "chrome": "on",
698
692
  "sections": []
699
693
  },
694
+ {
695
+ "route": "/private",
696
+ "kind": "route",
697
+ "pageType": null,
698
+ "schema": null,
699
+ "shell": "MarketingShell",
700
+ "chrome": "on",
701
+ "sections": []
702
+ },
700
703
  {
701
704
  "route": "/appointments",
702
705
  "kind": "route",
@@ -177,10 +177,9 @@ _Detail route over `content/en/Feature/` — 3 seed pages: `feature-1.mdx`, `fea
177
177
 
178
178
  <!-- generated:begin page=/contact -->
179
179
 
180
- | # | Section | Component | Copy (first line) |
181
- | --- | --------------------------------------------------------- | --------- | ----------------------------------------- |
182
- | 1 | `hero` (split · eyebrow "Contact" · checklist ×3 · 1 CTA) | `Hero` | Get every message in your email, free |
183
- | 2 | `items` (tiles · columns=2 · items ×4) | `Items` | {Add appointment scheduling to your site} |
180
+ | # | Section | Component | Copy (first line) |
181
+ | --- | ----------------------------------- | ------------- | ----------------- |
182
+ | 1 | `contact-form` (column · fields ×0) | `ContactForm` | |
184
183
 
185
184
  <!-- generated:end -->
186
185
 
@@ -197,14 +196,17 @@ _Detail route over `content/en/Feature/` — 3 seed pages: `feature-1.mdx`, `fea
197
196
 
198
197
  <!-- generated:begin page=/newsletter -->
199
198
 
200
- | # | Section | Component | Copy (first line) |
201
- | --- | ------------------------------------- | ------------ | ------------------------------------------------ |
202
- | 1 | `hero` (eyebrow "Newsletter" · 1 CTA) | `Hero` | {Newsletter: what subscribers get and how often} |
203
- | 2 | `newsletter` | `Newsletter` | Subscribe |
204
- | 3 | `faq` (expanded · items ×3) | `FAQ` | FAQs |
199
+ | # | Section | Component | Copy (first line) |
200
+ | --- | ----------------------------------- | ------------- | ----------------- |
201
+ | 1 | `contact-form` (column · fields ×0) | `ContactForm` | |
205
202
 
206
203
  <!-- generated:end -->
207
204
 
205
+ <!-- generated:begin page=/unsubscribe -->
206
+
207
+ _Code route — no content, no sections._
208
+ <!-- generated:end -->
209
+
208
210
  `/sign-in`:
209
211
 
210
212
  <!-- generated:begin page=/sign-in -->
@@ -342,6 +344,16 @@ Target composition (deferred to **#5670**, same as `/meet` above):
342
344
  _Code route — no content, no sections._
343
345
  <!-- generated:end -->
344
346
 
347
+ ### `/private` — the private meeting index · scheduling
348
+
349
+ The same booking frame as `/meet`, listing the workspace's private meetings
350
+ (#8843 D8); `noindex`, unlinked, no seed.
351
+
352
+ <!-- generated:begin page=/private -->
353
+
354
+ _Code route — no content, no sections._
355
+ <!-- generated:end -->
356
+
345
357
  `/appointments`:
346
358
 
347
359
  <!-- generated:begin page=/appointments -->
@@ -517,6 +529,7 @@ marketing-site:
517
529
  - { route: "/contact", kind: page, content: ["content/en/ContactPage/contact.mdx"] }
518
530
  - { route: "/glossary", kind: page, content: ["content/en/GlossaryList/glossary.mdx"] }
519
531
  - { route: "/newsletter", kind: page, content: ["content/en/NewsletterSignup/newsletter.mdx"] }
532
+ - { route: "/unsubscribe", kind: route }
520
533
  - { route: "/sign-in", kind: route }
521
534
  - { route: "/sign-up", kind: route }
522
535
  - { route: "/privacy", kind: page, content: ["content/en/PrivacyPage/privacy.mdx"] }
@@ -537,6 +550,7 @@ marketing-site:
537
550
  - { route: "/meet", kind: route }
538
551
  - { route: "/meet/[slug]", kind: route }
539
552
  - { route: "/meet/confirmed", kind: route }
553
+ - { route: "/private", kind: route }
540
554
  - { route: "/appointments", kind: route }
541
555
  - { route: "/flows/[slug]", kind: route }
542
556
  - { route: "/flows/[slug]/start", kind: route }
@@ -563,11 +577,11 @@ Every component the roster rows' seed content composes today (generated):
563
577
 
564
578
  <!-- generated:begin inventory -->
565
579
 
566
- | Tier | Used by this template |
567
- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
568
- | Shell | `MarketingShell` |
569
- | Chrome | `Nav`, `Footer`, `Banner` (+ `BannerConsentIsland`, `BannerDismissIsland`) |
570
- | Sections | `ContentBlock`, `CTA`, `DecisionSplit`, `DocumentChassis`, `FAQ`, `Feature`, `GlossaryIndex`, `Hero`, `Items`, `LogoCloud`, `MediaBand`, `Newsletter`, `Pricing`, `StairSteps`, `Team`, `Testimonials` |
580
+ | Tier | Used by this template |
581
+ | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
582
+ | Shell | `MarketingShell` |
583
+ | Chrome | `Nav`, `Footer`, `Banner` (+ `BannerConsentIsland`, `BannerDismissIsland`) |
584
+ | Sections | `ContactForm`, `ContentBlock`, `CTA`, `DecisionSplit`, `DocumentChassis`, `FAQ`, `Feature`, `GlossaryIndex`, `Hero`, `Items`, `LogoCloud`, `MediaBand`, `Pricing`, `StairSteps`, `Team`, `Testimonials` |
571
585
 
572
586
  <!-- generated:end -->
573
587
 
@@ -4,11 +4,11 @@
4
4
  "categories": ["accounting", "legal", "technology"],
5
5
  "shape": "organization-product",
6
6
  "design": "standard",
7
- "generatedHash": "08391280820bcc6edd5c7062b75c2f33852b02c37ab518d1302bb7cb43c44714",
7
+ "generatedHash": "69b9e9d31dba7bc9d556deb74bf88969c0be778e81cc96fa6966387d728317fa",
8
8
  "layout": {
9
9
  "nav": "full",
10
10
  "footer": "columns",
11
- "announcementBanner": true,
11
+ "announcementBanner": false,
12
12
  "home": "default"
13
13
  },
14
14
  "theme": {
@@ -222,13 +222,6 @@
222
222
  "shell": "MarketingShell",
223
223
  "chrome": "on",
224
224
  "sections": [
225
- {
226
- "type": "hero",
227
- "component": "Hero",
228
- "options": {
229
- "gapBelow": "tight"
230
- }
231
- },
232
225
  {
233
226
  "type": "pricing",
234
227
  "component": "Pricing",
@@ -327,15 +320,8 @@
327
320
  "chrome": "on",
328
321
  "sections": [
329
322
  {
330
- "type": "hero",
331
- "component": "Hero"
332
- },
333
- {
334
- "type": "items",
335
- "component": "Items",
336
- "options": {
337
- "columns": 2
338
- }
323
+ "type": "contact-form",
324
+ "component": "ContactForm"
339
325
  }
340
326
  ]
341
327
  },
@@ -366,15 +352,20 @@
366
352
  "chrome": "on",
367
353
  "sections": [
368
354
  {
369
- "type": "hero",
370
- "component": "Hero"
371
- },
372
- {
373
- "type": "faq",
374
- "component": "FAQ"
355
+ "type": "contact-form",
356
+ "component": "ContactForm"
375
357
  }
376
358
  ]
377
359
  },
360
+ {
361
+ "route": "/unsubscribe",
362
+ "kind": "route",
363
+ "pageType": null,
364
+ "schema": null,
365
+ "shell": "MarketingShell",
366
+ "chrome": "on",
367
+ "sections": []
368
+ },
378
369
  {
379
370
  "route": "/sign-in",
380
371
  "kind": "route",
@@ -476,10 +467,6 @@
476
467
  "gapBelow": "tight"
477
468
  }
478
469
  },
479
- {
480
- "type": "blog-list",
481
- "component": "BlogList"
482
- },
483
470
  {
484
471
  "type": "logoCloud",
485
472
  "component": "LogoCloud",
@@ -526,17 +513,6 @@
526
513
  "type": "hero",
527
514
  "component": "Hero"
528
515
  },
529
- {
530
- "type": "cta",
531
- "component": "CTA"
532
- },
533
- {
534
- "type": "items",
535
- "component": "Items",
536
- "options": {
537
- "columns": 3
538
- }
539
- },
540
516
  {
541
517
  "type": "content-block",
542
518
  "component": "ContentBlock"
@@ -34,7 +34,7 @@ The template's `layout` block — resolved with `resolveSiteChrome`, defaults fi
34
34
  | -------------------- | --------- |
35
35
  | `nav` | `full` |
36
36
  | `footer` | `columns` |
37
- | `announcementBanner` | `true` |
37
+ | `announcementBanner` | `false` |
38
38
  | `home` | `default` |
39
39
 
40
40
  <!-- generated:end -->
@@ -154,14 +154,13 @@ Reference: `screenshots/pricing.png`, `copy/pricing.txt`. The reference opens on
154
154
 
155
155
  <!-- generated:begin page=/pricing -->
156
156
 
157
- | # | Section | Component | Copy (first line) |
158
- | --- | ------------------------------------------------------------------------------------ | -------------- | ----------------------------------------------------------------- |
159
- | 1 | `hero` (centered · gapBelow=tight · eyebrow "Pricing" · 2 CTAs) | `Hero` | {Upgrade to Pro with Commerce} |
160
- | 2 | `pricing` (three-tiers-with-toggle · cardLayout=centered · plans ×3 · billingToggle) | `Pricing` | Basic plan |
161
- | 3 | `logoCloud` (layout=inline · logos ×3) | `LogoCloud` | {Don’t just take our word for it} |
162
- | 4 | `testimonials` (quote · items ×1) | `Testimonials` | {A customer quote, in their own words, about the result they got} |
163
- | 5 | `cta` (box · checklist ×3 · 2 CTAs · closingLine) | `CTA` | {Switch to your product in time amount or less} |
164
- | 6 | `faq` (accordion · items ×5 · 1 CTA · initialOpen none) | `FAQ` | {FAQs} |
157
+ | # | Section | Component | Copy (first line) |
158
+ | --- | -------------------------------------------------------------------------------------------------------- | -------------- | ----------------------------------------------------------------- |
159
+ | 1 | `pricing` (three-tiers-with-toggle · cardLayout=centered · eyebrow "Pricing" · plans ×3 · billingToggle) | `Pricing` | {Pays for itself in tangible value or outcome} |
160
+ | 2 | `logoCloud` (layout=inline · logos ×3) | `LogoCloud` | Don’t just take our word for it |
161
+ | 3 | `testimonials` (quote · items ×1) | `Testimonials` | {A customer quote, in their own words, about the result they got} |
162
+ | 4 | `cta` (box · checklist ×3 · 2 CTAs · closingLine) | `CTA` | {Switch to your product in time amount or less} |
163
+ | 5 | `faq` (accordion · items ×5 · 1 CTA · initialOpen none) | `FAQ` | FAQs |
165
164
 
166
165
  <!-- generated:end -->
167
166
 
@@ -201,10 +200,9 @@ Reference: `screenshots/contact.png`, `copy/contact.txt`. The reference is a spl
201
200
 
202
201
  <!-- generated:begin page=/contact -->
203
202
 
204
- | # | Section | Component | Copy (first line) |
205
- | --- | --------------------------------------------------------- | --------- | ----------------------------------------- |
206
- | 1 | `hero` (split · eyebrow "Contact" · checklist ×3 · 1 CTA) | `Hero` | Get every message in your email, free |
207
- | 2 | `items` (tiles · columns=2 · items ×4) | `Items` | {Add appointment scheduling to your site} |
203
+ | # | Section | Component | Copy (first line) |
204
+ | --- | ----------------------------------- | ------------- | ----------------- |
205
+ | 1 | `contact-form` (column · fields ×0) | `ContactForm` | |
208
206
 
209
207
  <!-- generated:end -->
210
208
 
@@ -227,13 +225,21 @@ A base-layer seed every starter carries (#6658 D5). The form posts to lead captu
227
225
 
228
226
  <!-- generated:begin page=/newsletter -->
229
227
 
230
- | # | Section | Component | Copy (first line) |
231
- | --- | -------------------------------------- | --------- | --------------------------------------- |
232
- | 1 | `hero` (eyebrow "Newsletter" · 2 CTAs) | `Hero` | {Start a free newsletter with Substack} |
233
- | 2 | `faq` (expanded · items ×3) | `FAQ` | FAQs |
228
+ | # | Section | Component | Copy (first line) |
229
+ | --- | ----------------------------------- | ------------- | ----------------- |
230
+ | 1 | `contact-form` (column · fields ×0) | `ContactForm` | |
234
231
 
235
232
  <!-- generated:end -->
236
233
 
234
+ ### `/unsubscribe` — code route (the unsubscribe landing) · chrome on
235
+
236
+ The landing every signed unsubscribe link calls (#8438 D17) — a code route like `/sign-in`, copied into every scaffold and never gated, listed so the manifest is a complete install record (#8850 D1). No reference page.
237
+
238
+ <!-- generated:begin page=/unsubscribe -->
239
+
240
+ _Code route — no content, no sections._
241
+ <!-- generated:end -->
242
+
237
243
  ### `/meet` — LandingPage · schema `WebPage` · chrome on
238
244
 
239
245
  An always-copied overlay seed (#6897 D3): a meeting-types hub, served by the generic `[slug]` route, listing the four `/meet/<slug>` tiles below through the same `items` `tiles` variant Contact uses. A template carrying the scheduling module serves its own `meet/` route directory instead, by Next.js static-segment precedence.
@@ -253,12 +259,10 @@ Four always-copied overlay seeds (#6897 D4/D5), served by the new `[slug]/[detai
253
259
 
254
260
  <!-- generated:begin page=/meet/[slug] -->
255
261
 
256
- | # | Section | Component | Copy (first line) |
257
- | --- | -------------------------------------- | -------------- | ------------------------------------------------ |
258
- | 1 | `hero` (eyebrow "Book a Call" · 1 CTA) | `Hero` | Book a Call |
259
- | 2 | `cta` (box · 1 CTA) | `CTA` | {What booking a call would do for your visitors} |
260
- | 3 | `items` (columns=3 · items ×3) | `Items` | What happens on the call? |
261
- | 4 | `content-block` (1 CTA) | `ContentBlock` | |
262
+ | # | Section | Component | Copy (first line) |
263
+ | --- | -------------------------------------- | -------------- | ----------------- |
264
+ | 1 | `hero` (eyebrow "Book a Call" · 1 CTA) | `Hero` | Book a Call |
265
+ | 2 | `content-block` (1 CTA) | `ContentBlock` | |
262
266
 
263
267
  <!-- generated:end -->
264
268
 
@@ -268,12 +272,11 @@ Reference: `screenshots/blog.png`, `copy/blog.txt` for the opener and the newsle
268
272
 
269
273
  <!-- generated:begin page=/blog -->
270
274
 
271
- | # | Section | Component | Copy (first line) |
272
- | --- | ------------------------------------------------------------ | -------------- | ----------------------------------------------------------------- |
273
- | 1 | `hero` (centered · gapBelow=tight · eyebrow "Blog" · 2 CTAs) | `Hero` | Get free blog/docs from Fumadocs |
274
- | 2 | `blog-list` (grid) | `BlogList` | |
275
- | 3 | `logoCloud` (layout=inline · logos ×6) | `LogoCloud` | Don’t just take our word for it |
276
- | 4 | `testimonials` (quote · items ×1) | `Testimonials` | {A customer quote, in their own words, about the result they got} |
275
+ | # | Section | Component | Copy (first line) |
276
+ | --- | --------------------------------------------------- | -------------- | ----------------------------------------------------------------- |
277
+ | 1 | `hero` (centered · gapBelow=tight · eyebrow "Blog") | `Hero` | {Blog} |
278
+ | 2 | `logoCloud` (layout=inline · logos ×6) | `LogoCloud` | Don’t just take our word for it |
279
+ | 3 | `testimonials` (quote · items ×1) | `Testimonials` | {A customer quote, in their own words, about the result they got} |
277
280
 
278
281
  <!-- generated:end -->
279
282
 
@@ -442,6 +445,7 @@ marketing-site-free:
442
445
  - { route: "/contact", kind: page, content: ["content/en/ContactPage/contact.mdx"] }
443
446
  - { route: "/glossary", kind: page, content: ["content/en/GlossaryList/glossary.mdx"] }
444
447
  - { route: "/newsletter", kind: page, content: ["content/en/NewsletterSignup/newsletter.mdx"] }
448
+ - { route: "/unsubscribe", kind: route }
445
449
  - { route: "/sign-in", kind: route }
446
450
  - { route: "/sign-up", kind: route }
447
451
  - { route: "/privacy", kind: page, content: ["content/en/PrivacyPage/privacy.mdx"] }
@@ -505,11 +509,11 @@ reversed (`docs/decisions/starter-roster-page-set.md` D4, D7).
505
509
 
506
510
  <!-- generated:begin inventory -->
507
511
 
508
- | Tier | Used by this template |
509
- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
510
- | Shell | `MarketingShell` |
511
- | Chrome | `Nav`, `Footer`, `Banner` (+ `BannerConsentIsland`, `BannerDismissIsland`) |
512
- | Sections | `BlogList`, `ContentBlock`, `CTA`, `DecisionSplit`, `DocumentChassis`, `FAQ`, `Feature`, `GlossaryIndex`, `Hero`, `Items`, `LogoCloud`, `MediaBand`, `Pricing`, `Team`, `Testimonials` |
512
+ | Tier | Used by this template |
513
+ | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
514
+ | Shell | `MarketingShell` |
515
+ | Chrome | `Nav`, `Footer`, `Banner` (+ `BannerConsentIsland`, `BannerDismissIsland`) |
516
+ | Sections | `ContactForm`, `ContentBlock`, `CTA`, `DecisionSplit`, `DocumentChassis`, `FAQ`, `Feature`, `GlossaryIndex`, `Hero`, `Items`, `LogoCloud`, `MediaBand`, `Pricing`, `Team`, `Testimonials` |
513
517
 
514
518
  <!-- generated:end -->
515
519
 
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  type: "NewsletterSignup"
3
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.}"
4
+ title: "Get the newsletter"
5
+ description: "{One sentence on what this newsletter covers and who it is for}"
6
6
  schema:
7
7
  mainEntity:
8
8
  "@type": "Offer"
@@ -12,48 +12,11 @@ schema:
12
12
  sections:
13
13
  [
14
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
- },
15
+ "id": "signup",
16
+ "type": "contact-form",
17
+ "data": { "variant": "column", "fields": [] },
55
18
  },
56
19
  ]
57
20
  ---
58
21
 
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. */}
22
+ {/* Rendered from frontmatter `sections[]` by the /newsletter route. The page's one signup surface is the workspace's Newsletter magnet: its heading, sentence, field, consent, button and ending all come from the magnet, mounted by the route in this section's slot. To change the signup, change the magnet in Admin → Magnets. The `schema:` Offer is the page's JSON-LD main entity — a free subscription. Replace every {brace} with your own words before you launch. */}