create-agntcms-app 0.2.1

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 (197) hide show
  1. package/README.md +39 -0
  2. package/dist/index.mjs +297 -0
  3. package/dist/template/.claude/settings.json +6 -0
  4. package/dist/template/.claude/skills/.gitkeep +0 -0
  5. package/dist/template/.claude-plugin/channel/server.mjs +254 -0
  6. package/dist/template/.claude-plugin/channel/server.ts +369 -0
  7. package/dist/template/.claude-plugin/plugin.json +17 -0
  8. package/dist/template/.mcp.json +8 -0
  9. package/dist/template/BRAND.md +49 -0
  10. package/dist/template/CLAUDE.md +157 -0
  11. package/dist/template/agntcms/config.ts +49 -0
  12. package/dist/template/agntcms/sections/ArticleBody/component.tsx +32 -0
  13. package/dist/template/agntcms/sections/ArticleBody/index.ts +10 -0
  14. package/dist/template/agntcms/sections/ArticleBody/schema.ts +5 -0
  15. package/dist/template/agntcms/sections/ArticleHero/component.tsx +87 -0
  16. package/dist/template/agntcms/sections/ArticleHero/index.ts +10 -0
  17. package/dist/template/agntcms/sections/ArticleHero/schema.ts +12 -0
  18. package/dist/template/agntcms/sections/Banner/component.tsx +83 -0
  19. package/dist/template/agntcms/sections/Banner/index.ts +10 -0
  20. package/dist/template/agntcms/sections/Banner/schema.ts +9 -0
  21. package/dist/template/agntcms/sections/BlogIndex/component.tsx +173 -0
  22. package/dist/template/agntcms/sections/BlogIndex/index.ts +10 -0
  23. package/dist/template/agntcms/sections/BlogIndex/schema.ts +33 -0
  24. package/dist/template/agntcms/sections/BlogIndexHeader/component.tsx +44 -0
  25. package/dist/template/agntcms/sections/BlogIndexHeader/index.ts +10 -0
  26. package/dist/template/agntcms/sections/BlogIndexHeader/schema.ts +8 -0
  27. package/dist/template/agntcms/sections/BlogPostBody/component.tsx +50 -0
  28. package/dist/template/agntcms/sections/BlogPostBody/index.ts +10 -0
  29. package/dist/template/agntcms/sections/BlogPostBody/schema.ts +10 -0
  30. package/dist/template/agntcms/sections/BlogPostHero/component.tsx +88 -0
  31. package/dist/template/agntcms/sections/BlogPostHero/index.ts +10 -0
  32. package/dist/template/agntcms/sections/BlogPostHero/schema.ts +35 -0
  33. package/dist/template/agntcms/sections/CaseStudies/component.tsx +92 -0
  34. package/dist/template/agntcms/sections/CaseStudies/index.ts +10 -0
  35. package/dist/template/agntcms/sections/CaseStudies/schema.ts +17 -0
  36. package/dist/template/agntcms/sections/ContactForm/component.tsx +119 -0
  37. package/dist/template/agntcms/sections/ContactForm/index.ts +10 -0
  38. package/dist/template/agntcms/sections/ContactForm/schema.ts +15 -0
  39. package/dist/template/agntcms/sections/DocsArticle/component.tsx +266 -0
  40. package/dist/template/agntcms/sections/DocsArticle/index.ts +10 -0
  41. package/dist/template/agntcms/sections/DocsArticle/schema.ts +33 -0
  42. package/dist/template/agntcms/sections/FAQ/component.tsx +57 -0
  43. package/dist/template/agntcms/sections/FAQ/index.ts +10 -0
  44. package/dist/template/agntcms/sections/FAQ/schema.ts +11 -0
  45. package/dist/template/agntcms/sections/FeatureGrid/component.tsx +117 -0
  46. package/dist/template/agntcms/sections/FeatureGrid/index.ts +10 -0
  47. package/dist/template/agntcms/sections/FeatureGrid/schema.ts +21 -0
  48. package/dist/template/agntcms/sections/FeaturedArticles/component.tsx +99 -0
  49. package/dist/template/agntcms/sections/FeaturedArticles/index.ts +10 -0
  50. package/dist/template/agntcms/sections/FeaturedArticles/schema.ts +17 -0
  51. package/dist/template/agntcms/sections/GettingStarted/component.tsx +116 -0
  52. package/dist/template/agntcms/sections/GettingStarted/index.ts +10 -0
  53. package/dist/template/agntcms/sections/GettingStarted/schema.ts +11 -0
  54. package/dist/template/agntcms/sections/Hero/component.tsx +148 -0
  55. package/dist/template/agntcms/sections/Hero/index.ts +10 -0
  56. package/dist/template/agntcms/sections/Hero/schema.ts +16 -0
  57. package/dist/template/agntcms/sections/HowItWorks/component.tsx +57 -0
  58. package/dist/template/agntcms/sections/HowItWorks/index.ts +10 -0
  59. package/dist/template/agntcms/sections/HowItWorks/schema.ts +11 -0
  60. package/dist/template/agntcms/sections/ImageText/component.tsx +110 -0
  61. package/dist/template/agntcms/sections/ImageText/index.ts +10 -0
  62. package/dist/template/agntcms/sections/ImageText/schema.ts +14 -0
  63. package/dist/template/agntcms/sections/LogoStrip/component.tsx +37 -0
  64. package/dist/template/agntcms/sections/LogoStrip/index.ts +10 -0
  65. package/dist/template/agntcms/sections/LogoStrip/schema.ts +6 -0
  66. package/dist/template/agntcms/sections/Newsletter/component.tsx +48 -0
  67. package/dist/template/agntcms/sections/Newsletter/index.ts +10 -0
  68. package/dist/template/agntcms/sections/Newsletter/schema.ts +8 -0
  69. package/dist/template/agntcms/sections/OpenSource/component.tsx +99 -0
  70. package/dist/template/agntcms/sections/OpenSource/index.ts +10 -0
  71. package/dist/template/agntcms/sections/OpenSource/schema.ts +13 -0
  72. package/dist/template/agntcms/sections/PainAnswer/component.tsx +81 -0
  73. package/dist/template/agntcms/sections/PainAnswer/index.ts +10 -0
  74. package/dist/template/agntcms/sections/PainAnswer/schema.ts +15 -0
  75. package/dist/template/agntcms/sections/PricingPlans/component.tsx +100 -0
  76. package/dist/template/agntcms/sections/PricingPlans/index.ts +10 -0
  77. package/dist/template/agntcms/sections/PricingPlans/schema.ts +13 -0
  78. package/dist/template/agntcms/sections/Problem/component.tsx +49 -0
  79. package/dist/template/agntcms/sections/Problem/index.ts +10 -0
  80. package/dist/template/agntcms/sections/Problem/schema.ts +12 -0
  81. package/dist/template/agntcms/sections/SiteFooter/component.tsx +88 -0
  82. package/dist/template/agntcms/sections/SiteFooter/index.ts +10 -0
  83. package/dist/template/agntcms/sections/SiteFooter/schema.ts +13 -0
  84. package/dist/template/agntcms/sections/SiteHeader/component.tsx +99 -0
  85. package/dist/template/agntcms/sections/SiteHeader/index.ts +10 -0
  86. package/dist/template/agntcms/sections/SiteHeader/schema.ts +14 -0
  87. package/dist/template/agntcms/sections/SiteMeta/component.tsx +26 -0
  88. package/dist/template/agntcms/sections/SiteMeta/index.ts +13 -0
  89. package/dist/template/agntcms/sections/SiteMeta/schema.ts +18 -0
  90. package/dist/template/agntcms/sections/TabbedFeatures/component.tsx +120 -0
  91. package/dist/template/agntcms/sections/TabbedFeatures/index.ts +10 -0
  92. package/dist/template/agntcms/sections/TabbedFeatures/schema.ts +13 -0
  93. package/dist/template/agntcms/sections/TeamGrid/component.tsx +77 -0
  94. package/dist/template/agntcms/sections/TeamGrid/index.ts +10 -0
  95. package/dist/template/agntcms/sections/TeamGrid/schema.ts +14 -0
  96. package/dist/template/agntcms/sections/Testimonials/component.tsx +76 -0
  97. package/dist/template/agntcms/sections/Testimonials/index.ts +10 -0
  98. package/dist/template/agntcms/sections/Testimonials/schema.ts +12 -0
  99. package/dist/template/agntcms/sections/WhatIsBuilt/component.tsx +86 -0
  100. package/dist/template/agntcms/sections/WhatIsBuilt/index.ts +10 -0
  101. package/dist/template/agntcms/sections/WhatIsBuilt/schema.ts +20 -0
  102. package/dist/template/agntcms/site-meta.ts +81 -0
  103. package/dist/template/app/[[...slug]]/page.tsx +123 -0
  104. package/dist/template/app/admin/AdminPageClient.tsx +77 -0
  105. package/dist/template/app/admin/AdminPageDynamic.tsx +24 -0
  106. package/dist/template/app/admin/page.tsx +14 -0
  107. package/dist/template/app/api/agntcms/_shared.ts +80 -0
  108. package/dist/template/app/api/agntcms/assets/route.ts +11 -0
  109. package/dist/template/app/api/agntcms/assets/upload/route.ts +11 -0
  110. package/dist/template/app/api/agntcms/draft/discard/route.ts +12 -0
  111. package/dist/template/app/api/agntcms/draft/list/route.ts +11 -0
  112. package/dist/template/app/api/agntcms/draft/publish/route.ts +11 -0
  113. package/dist/template/app/api/agntcms/draft/reorder/route.ts +10 -0
  114. package/dist/template/app/api/agntcms/draft/save/route.ts +11 -0
  115. package/dist/template/app/api/agntcms/events/route.ts +12 -0
  116. package/dist/template/app/api/agntcms/forms/delete/route.ts +17 -0
  117. package/dist/template/app/api/agntcms/forms/list/route.ts +24 -0
  118. package/dist/template/app/api/agntcms/forms/read/route.ts +23 -0
  119. package/dist/template/app/api/agntcms/forms/submit/route.ts +17 -0
  120. package/dist/template/app/api/agntcms/global/delete/route.ts +13 -0
  121. package/dist/template/app/api/agntcms/global/history/route.ts +10 -0
  122. package/dist/template/app/api/agntcms/global/list/route.ts +14 -0
  123. package/dist/template/app/api/agntcms/global/read/route.ts +11 -0
  124. package/dist/template/app/api/agntcms/global/rollback/route.ts +10 -0
  125. package/dist/template/app/api/agntcms/global/save/route.ts +14 -0
  126. package/dist/template/app/api/agntcms/mcp/route.ts +12 -0
  127. package/dist/template/app/api/agntcms/page/delete/route.ts +10 -0
  128. package/dist/template/app/api/agntcms/page/duplicate/route.ts +11 -0
  129. package/dist/template/app/api/agntcms/page/history/route.ts +10 -0
  130. package/dist/template/app/api/agntcms/page/list/route.ts +10 -0
  131. package/dist/template/app/api/agntcms/page/read/route.ts +11 -0
  132. package/dist/template/app/api/agntcms/page/rename/route.ts +10 -0
  133. package/dist/template/app/api/agntcms/page/rollback/route.ts +10 -0
  134. package/dist/template/app/api/agntcms/page/unpublish/route.ts +11 -0
  135. package/dist/template/app/api/agntcms/preview/enter/route.ts +13 -0
  136. package/dist/template/app/api/agntcms/preview/exit/route.ts +10 -0
  137. package/dist/template/app/api/agntcms/preview/issue/route.ts +12 -0
  138. package/dist/template/app/api/agntcms/template/list/route.ts +15 -0
  139. package/dist/template/app/apple-icon.svg +9 -0
  140. package/dist/template/app/icon.svg +9 -0
  141. package/dist/template/app/layout.tsx +107 -0
  142. package/dist/template/app/not-found.tsx +75 -0
  143. package/dist/template/app/robots.ts +33 -0
  144. package/dist/template/app/sitemap.ts +49 -0
  145. package/dist/template/content/globals/site-footer.json +53 -0
  146. package/dist/template/content/globals/site-header.json +18 -0
  147. package/dist/template/content/globals/site-meta.json +13 -0
  148. package/dist/template/content/pages/404.json +34 -0
  149. package/dist/template/content/pages/about.json +307 -0
  150. package/dist/template/content/pages/article-editor.json +61 -0
  151. package/dist/template/content/pages/article-schemas.json +61 -0
  152. package/dist/template/content/pages/blog.json +162 -0
  153. package/dist/template/content/pages/contact.json +29 -0
  154. package/dist/template/content/pages/home.json +243 -0
  155. package/dist/template/content/pages/pricing.json +219 -0
  156. package/dist/template/content/pages/services.json +177 -0
  157. package/dist/template/fonts/Satoshi-Medium.woff2 +0 -0
  158. package/dist/template/fonts/Satoshi-Regular.woff2 +0 -0
  159. package/dist/template/next.config.ts +6 -0
  160. package/dist/template/package.json +36 -0
  161. package/dist/template/postcss.config.mjs +5 -0
  162. package/dist/template/public/assets/.gitkeep +0 -0
  163. package/dist/template/public/assets/0418d7ed21f57e7b9e0546725c92b8419daeaa355675d9070fab0c2013cf1524.jpg +0 -0
  164. package/dist/template/public/assets/0d0475f21aa96435a8ed3cdb2fddcc6278492e76ae842f569432454f4d33631a.jpg +0 -0
  165. package/dist/template/public/assets/27457a1adee2372030d9876b0d52c44d46be98843999935eaef2526b9b961f12.jpg +0 -0
  166. package/dist/template/public/assets/3855d91192f0c6120b01427b78ef84e52baa9f4b5a17d4271e41c1bfd95a5b0c.jpg +0 -0
  167. package/dist/template/public/assets/3b3b90c5084635b746be673ede92a328f002f5621a42c9a5cb89c5e2435652cb.jpg +0 -0
  168. package/dist/template/public/assets/3e76165a78fd3e7b8ed1e93dee50803ae11110c756c8c1c89229a2dec2bc0abf.jpg +0 -0
  169. package/dist/template/public/assets/4a3e28f85dc850c347ea0fd931696aa936a6bd45f193e7f1c9328b5896fb272c.jpg +0 -0
  170. package/dist/template/public/assets/579f67d5fd4c9106c6cdf2ef29f50df934ad0fc2b7849bac1e1cfb1e3f92303b.jpg +0 -0
  171. package/dist/template/public/assets/5b95209269661bb60fb250f1da682e05b9efa64dd42f350608b299e6bf1f2f35.jpg +0 -0
  172. package/dist/template/public/assets/5e04b46f8317ef95a7ddf85aedfe5c098a755f05056325d0251eccf95ce51172.jpg +0 -0
  173. package/dist/template/public/assets/6167a9164be2cf1183bdfdd4946bf9b908570e79e92a2380c25f0bb702422bbd.jpg +0 -0
  174. package/dist/template/public/assets/75e723ec316de28247924e5dfb73a4b266e10de605e749f150883d280ed8ed16.jpg +0 -0
  175. package/dist/template/public/assets/816a11e6a7245feaf51bbebf09d1bda3f125b334bc24fc3b8f47b5380a7b4294.jpg +0 -0
  176. package/dist/template/public/assets/81eba6f5654b8746a9b0cba1a9521a67f2b4afaaefc7c88d66dfab1461270d8f.jpg +0 -0
  177. package/dist/template/public/assets/82a2ce9e49361098f77a28755779dc5a7c026831cbd135175749c1304e21dacc.jpg +0 -0
  178. package/dist/template/public/assets/8d7b02ba277ba56bdafdbd47b01f7df6d993c714b4dc2305eb65a1307c09647d.jpg +0 -0
  179. package/dist/template/public/assets/b303185b471678e4d62f678a1549ee26022f4745407d08cae44ecb1c25352293.jpg +0 -0
  180. package/dist/template/public/assets/b69b49169c11546100d6dd5280073bc0d84cbbcc6d33fa01ecf6a5866fa42237.jpg +0 -0
  181. package/dist/template/public/assets/c4d2f0d1a310e457ac722a399693652e3c86c55b294243d5ffc679394e12f9d1.jpg +0 -0
  182. package/dist/template/public/assets/cae09f4729f8a348b67267c2f2a550be0f3bfa420689afe1a5cf8b7e2b146238.png +0 -0
  183. package/dist/template/public/assets/cb3acf58b57417a4b26474ba04c096af7103c4320ed2f4f3683f79d7670a055c.jpg +0 -0
  184. package/dist/template/public/assets/d5a0701b2d156284e0ce851cd2534ec632db34f91fbcbee3b8a7784d45ce78d2.jpg +0 -0
  185. package/dist/template/public/assets/d6ef1c3f48b0e488521794fb60701da1fd2c3a1621d6ac5f17ccfd4909d3be60.jpg +0 -0
  186. package/dist/template/public/assets/de249ff9be2539cf0d1ce092de3c57001839b6c3e14fcee3fc31a7b7673ae007.jpg +0 -0
  187. package/dist/template/public/assets/eac45438956be187b010e24b3289757aa00f227c190d49ee99fea510552dd2ba.jpg +0 -0
  188. package/dist/template/public/assets/f8b9200065b5436c6a88361839edc2b89be88d3037c84a80d3ee95c32891510b.jpg +0 -0
  189. package/dist/template/public/assets/placeholder.png +0 -0
  190. package/dist/template/public/brand/mark.svg +6 -0
  191. package/dist/template/public/brand/wordmark-light.svg +6 -0
  192. package/dist/template/public/brand/wordmark.svg +6 -0
  193. package/dist/template/styles/globals.css +69 -0
  194. package/dist/template/styles/theme.css +492 -0
  195. package/dist/template/styles/typography.css +469 -0
  196. package/dist/template/tsconfig.json +30 -0
  197. package/package.json +30 -0
@@ -0,0 +1,307 @@
1
+ {
2
+ "slug": "about",
3
+ "seo": {
4
+ "title": "About · Servicely™ (demo)",
5
+ "description": "A made-up team behind a made-up platform. The numbers on this page are decorative, the dashboard is decorative, and Servicely™ doesn't actually exist — it's the demo content for an agntcms template."
6
+ },
7
+ "sections": [
8
+ {
9
+ "id": "hero-1",
10
+ "type": "Hero",
11
+ "data": {
12
+ "eyebrow": "About",
13
+ "headline": "# A small team. *A big chart on the pitch deck.*",
14
+ "lead": "There are fourteen of us (one is the founder's dog). We're across four time zones. None of us has ever worked at a FAANG, but one of us did a two-month internship at a fintech that subsequently exploded. Reminder: this is a demo, and the team doesn't really exist.",
15
+ "primaryCta": {
16
+ "type": "internal",
17
+ "slug": "/",
18
+ "label": "Open roles"
19
+ },
20
+ "secondaryCta": {
21
+ "type": "internal",
22
+ "slug": "/",
23
+ "label": "Read the manifesto"
24
+ },
25
+ "layout": "split",
26
+ "background": "paper",
27
+ "image": {
28
+ "filename": "4a3e28f85dc850c347ea0fd931696aa936a6bd45f193e7f1c9328b5896fb272c.jpg",
29
+ "alt": "Warm office team at work"
30
+ }
31
+ }
32
+ },
33
+ {
34
+ "id": "logos-1",
35
+ "type": "LogoStrip",
36
+ "data": {
37
+ "lead": "Backed by people who once worked somewhere",
38
+ "logos": [
39
+ {
40
+ "_id": "l-1",
41
+ "name": "EX-STRIPE"
42
+ },
43
+ {
44
+ "_id": "l-2",
45
+ "name": "EX-NOTION"
46
+ },
47
+ {
48
+ "_id": "l-3",
49
+ "name": "EX-LINEAR"
50
+ },
51
+ {
52
+ "_id": "l-4",
53
+ "name": "EX-A-STARTUP"
54
+ }
55
+ ]
56
+ }
57
+ },
58
+ {
59
+ "id": "features-1",
60
+ "type": "FeatureGrid",
61
+ "data": {
62
+ "eyebrow": "",
63
+ "headline": "",
64
+ "lead": "",
65
+ "columns": "4",
66
+ "variant": "stat",
67
+ "cards": [
68
+ {
69
+ "_id": "c-1",
70
+ "iconSvg": "",
71
+ "stat": "2.4k",
72
+ "label": "active profiles",
73
+ "body": "In forty-one countries (one dropped off — as usual)."
74
+ },
75
+ {
76
+ "_id": "c-2",
77
+ "iconSvg": "",
78
+ "stat": "14",
79
+ "label": "team members",
80
+ "body": "Remote. Chat in Slack, video once a week, no exceptions."
81
+ },
82
+ {
83
+ "_id": "c-3",
84
+ "iconSvg": "",
85
+ "stat": "99.99%",
86
+ "label": "uptime, last quarter",
87
+ "body": "No 'except Saturdays,' no 'we had a release.'"
88
+ },
89
+ {
90
+ "_id": "c-4",
91
+ "iconSvg": "",
92
+ "stat": "38ms",
93
+ "label": "p50 TTFB",
94
+ "body": "Faster than any 'org-wide efficiency review.'"
95
+ }
96
+ ],
97
+ "footerCta": {
98
+ "type": "external",
99
+ "url": "",
100
+ "label": ""
101
+ }
102
+ }
103
+ },
104
+ {
105
+ "id": "imagetext-1",
106
+ "type": "ImageText",
107
+ "data": {
108
+ "eyebrow": "What we stand for",
109
+ "headline": "## Software should *help* you, not *remind you it exists.*",
110
+ "body": "Most platforms are optimized for the people selling the platform. Pricing on request. Features behind tiers. Support via a ticket that gets read six hours later by a contractor on the other side of the world.\n\nWe're the opposite. The platform is built by developers who use it. Pricing is on the website. Support is Artyom — thirty-four, on Telegram, usually replies before you've finished sending.",
111
+ "imagePosition": "right",
112
+ "background": "paper",
113
+ "primaryCta": {
114
+ "type": "internal",
115
+ "slug": "/",
116
+ "label": "Read our principles"
117
+ },
118
+ "secondaryCta": {
119
+ "type": "external",
120
+ "url": "",
121
+ "label": ""
122
+ },
123
+ "image": {
124
+ "filename": "0418d7ed21f57e7b9e0546725c92b8419daeaa355675d9070fab0c2013cf1524.jpg",
125
+ "alt": "Warm office with team members at work"
126
+ }
127
+ }
128
+ },
129
+ {
130
+ "id": "team-1",
131
+ "type": "TeamGrid",
132
+ "data": {
133
+ "eyebrow": "Team",
134
+ "headline": "## The people *shipping it.*",
135
+ "lead": "Fourteen humans across nine time zones. Hiring two more this quarter — without a 'cultural fit' loop.",
136
+ "columns": "4",
137
+ "people": [
138
+ {
139
+ "_id": "p-1",
140
+ "name": "Mira Saito",
141
+ "role": "CEO · Berlin",
142
+ "bio": "Previously product at a marketplace nobody admits to using anymore. Wrote the first version of Servicely in a rented kitchen between two relocations.",
143
+ "photo": {
144
+ "filename": "c4d2f0d1a310e457ac722a399693652e3c86c55b294243d5ffc679394e12f9d1.jpg",
145
+ "alt": "Portrait of Mira Saito"
146
+ }
147
+ },
148
+ {
149
+ "_id": "p-2",
150
+ "name": "Tom Larsen",
151
+ "role": "CTO · Copenhagen",
152
+ "bio": "Built three platforms nobody used. Decided this would be the fourth — except this time with a product manager.",
153
+ "photo": {
154
+ "filename": "cb3acf58b57417a4b26474ba04c096af7103c4320ed2f4f3683f79d7670a055c.jpg",
155
+ "alt": "Portrait of Tom Larsen"
156
+ }
157
+ },
158
+ {
159
+ "_id": "p-3",
160
+ "name": "Priya Anand",
161
+ "role": "Design · Bangalore",
162
+ "bio": "Owns the interface. Believes type and contrast are 80% of UX. The other 20% is padding.",
163
+ "photo": {
164
+ "filename": "75e723ec316de28247924e5dfb73a4b266e10de605e749f150883d280ed8ed16.jpg",
165
+ "alt": "Portrait of Priya Anand"
166
+ }
167
+ },
168
+ {
169
+ "_id": "p-4",
170
+ "name": "Felix Vargas",
171
+ "role": "Engineering · Mexico City",
172
+ "bio": "Owns the frontend. Knows how to keep the bundle under 38kb. Won't tell anyone how.",
173
+ "photo": {
174
+ "filename": "6167a9164be2cf1183bdfdd4946bf9b908570e79e92a2380c25f0bb702422bbd.jpg",
175
+ "alt": "Portrait of Felix Vargas"
176
+ }
177
+ }
178
+ ]
179
+ }
180
+ },
181
+ {
182
+ "id": "testimonials-1",
183
+ "type": "Testimonials",
184
+ "data": {
185
+ "eyebrow": "What teams say",
186
+ "headline": "## Real teams, *real ship dates.*",
187
+ "items": [
188
+ {
189
+ "_id": "t-1",
190
+ "quote": "We replaced our CRM in three weeks. Reps chat with customers right inside the app, and the AI handles the easy questions overnight. No tickets, no 'let's bring it up at retro.'",
191
+ "name": "Lena Park",
192
+ "role": "Head of Sales · Northwind",
193
+ "photo": {
194
+ "filename": "81eba6f5654b8746a9b0cba1a9521a67f2b4afaaefc7c88d66dfab1461270d8f.jpg",
195
+ "alt": "Portrait of Lena Park"
196
+ }
197
+ },
198
+ {
199
+ "_id": "t-2",
200
+ "quote": "A platform our engineers can actually log into and understand. They stopped resenting the tool and started extending it.",
201
+ "name": "Marcus Weil",
202
+ "role": "Eng Lead · Avalon",
203
+ "photo": {
204
+ "filename": "3e76165a78fd3e7b8ed1e93dee50803ae11110c756c8c1c89229a2dec2bc0abf.jpg",
205
+ "alt": "Portrait of Marcus Weil"
206
+ }
207
+ },
208
+ {
209
+ "_id": "t-3",
210
+ "quote": "It's the first platform where I, the marketer, don't feel like a second-class citizen.",
211
+ "name": "Sara Okonkwo",
212
+ "role": "Brand · Plant.io",
213
+ "photo": {
214
+ "filename": "27457a1adee2372030d9876b0d52c44d46be98843999935eaef2526b9b961f12.jpg",
215
+ "alt": "Portrait of Sara Okonkwo"
216
+ }
217
+ },
218
+ {
219
+ "_id": "t-4",
220
+ "quote": "Stood up the whole site over a weekend. The agent SDK is genuinely fun to write against.",
221
+ "name": "Daniel Chen",
222
+ "role": "Founder · Kettle&Co",
223
+ "photo": {
224
+ "filename": "6167a9164be2cf1183bdfdd4946bf9b908570e79e92a2380c25f0bb702422bbd.jpg",
225
+ "alt": "Portrait of Daniel Chen"
226
+ }
227
+ }
228
+ ]
229
+ }
230
+ },
231
+ {
232
+ "id": "cases-1",
233
+ "type": "CaseStudies",
234
+ "data": {
235
+ "eyebrow": "Case studies",
236
+ "headline": "## Built with *Servicely.*",
237
+ "lead": "Three teams that swapped a heavy CRM for a workflow you don't dread opening on Monday.",
238
+ "items": [
239
+ {
240
+ "_id": "case-1",
241
+ "kind": "D2C · Bakery",
242
+ "name": "Northwind Bread Co.",
243
+ "body": "Migrated from a homegrown backend in eighteen days. Marketing now ships seasonal promos without a dedicated engineering sprint.",
244
+ "metric1Value": "+62%",
245
+ "metric1Label": "promo velocity",
246
+ "metric2Value": "-40%",
247
+ "metric2Label": "eng tickets",
248
+ "image": {
249
+ "filename": "82a2ce9e49361098f77a28755779dc5a7c026831cbd135175749c1304e21dacc.jpg",
250
+ "alt": "Bakery / artisan workshop"
251
+ }
252
+ },
253
+ {
254
+ "_id": "case-2",
255
+ "kind": "B2B · Furniture",
256
+ "name": "Avalon Studio",
257
+ "body": "Replaced a 'static site + Notion' setup with the visual editor. The catalog now updates itself from the product schema.",
258
+ "metric1Value": "4.2k",
259
+ "metric1Label": "pages live",
260
+ "metric2Value": "38ms",
261
+ "metric2Label": "p50 TTFB",
262
+ "image": {
263
+ "filename": "3b3b90c5084635b746be673ede92a328f002f5621a42c9a5cb89c5e2435652cb.jpg",
264
+ "alt": "Furniture studio"
265
+ }
266
+ },
267
+ {
268
+ "_id": "case-3",
269
+ "kind": "Marketplace",
270
+ "name": "Plant.io",
271
+ "body": "Their AI agent writes landing pages in 11 languages. Each one is a real PR a human reviews in ten minutes.",
272
+ "metric1Value": "11",
273
+ "metric1Label": "locales",
274
+ "metric2Value": "96%",
275
+ "metric2Label": "editor approval",
276
+ "image": {
277
+ "filename": "579f67d5fd4c9106c6cdf2ef29f50df934ad0fc2b7849bac1e1cfb1e3f92303b.jpg",
278
+ "alt": "Farm-to-table marketplace"
279
+ }
280
+ }
281
+ ]
282
+ }
283
+ },
284
+ {
285
+ "id": "banner-1",
286
+ "type": "Banner",
287
+ "data": {
288
+ "headline": "## Want to see it *in your stack?*",
289
+ "lead": "A thirty-minute call. We'll stand the template up against your repo while you watch.",
290
+ "primaryCta": {
291
+ "type": "internal",
292
+ "slug": "/contact",
293
+ "label": "Book a walkthrough"
294
+ },
295
+ "secondaryCta": {
296
+ "type": "internal",
297
+ "slug": "/",
298
+ "label": "Or just start building"
299
+ },
300
+ "image": {
301
+ "filename": "",
302
+ "alt": ""
303
+ }
304
+ }
305
+ }
306
+ ]
307
+ }
@@ -0,0 +1,61 @@
1
+ {
2
+ "slug": "article-editor",
3
+ "seo": {
4
+ "title": "The twelve booking forms we refused to ship · Servicely™",
5
+ "description": "Sticky toolbars, modal overlays, and the publish button that pretends it's a save button. A demo article shipped with the template."
6
+ },
7
+ "sections": [
8
+ {
9
+ "id": "articlehero-1",
10
+ "type": "ArticleHero",
11
+ "data": {
12
+ "category": "Editor",
13
+ "title": "The twelve booking forms we refused to ship",
14
+ "authorName": "Mira Saito",
15
+ "meta": "6 min read · Apr 21, 2026",
16
+ "authorPhoto": {
17
+ "filename": "c4d2f0d1a310e457ac722a399693652e3c86c55b294243d5ffc679394e12f9d1.jpg",
18
+ "alt": ""
19
+ },
20
+ "coverImage": {
21
+ "filename": "de249ff9be2539cf0d1ce092de3c57001839b6c3e14fcee3fc31a7b7673ae007.jpg",
22
+ "alt": "Open notebook in warm light"
23
+ },
24
+ "backLink": {
25
+ "type": "internal",
26
+ "slug": "blog",
27
+ "label": "back to blog"
28
+ }
29
+ }
30
+ },
31
+ {
32
+ "id": "articlebody-1",
33
+ "type": "ArticleBody",
34
+ "data": {
35
+ "body": "Building a booking form is a long exercise in restraint. There is a default version of every feature that nobody actually likes — and yet every platform ships it.\n\n## The list\n\n- A required 'comment' field with a 500-character minimum.\n- A 'submit' button that looks like a 'save draft' button.\n- A modal asking the user to subscribe to the newsletter, two seconds after page load.\n- A preview mode that renders the layout differently than the live page.\n- An autosave indicator that lies — it says 'saved' before the network round-trip finishes.\n- A 'last edited by' timestamp with no diff link.\n- Drag-handles that appear on hover and vanish on click.\n- A right-click menu that overrides the browser's.\n- A help icon that opens a chatbot wired to an overseas contractor.\n- A keyboard shortcut for everything except the one thing you wanted.\n- A breadcrumb that doesn't reflect URL structure.\n- A 'schedule publish' feature with no timezone control.\n\nWe built the inverse of each one. The editor is quiet. It does not cover the canvas. It does not lie about saves. The publish button publishes, the save button saves, and the keyboard shortcuts are in a single panel you can read end-to-end in a minute.\n\n> The best compliment we got: 'I forgot I was using a CMS.'"
36
+ }
37
+ },
38
+ {
39
+ "id": "banner-1",
40
+ "type": "Banner",
41
+ "data": {
42
+ "headline": "## Built for teams who *ship.*",
43
+ "lead": "Two minutes to a working site. One command to deploy.",
44
+ "primaryCta": {
45
+ "type": "internal",
46
+ "slug": "/",
47
+ "label": "Start free"
48
+ },
49
+ "secondaryCta": {
50
+ "type": "internal",
51
+ "slug": "/",
52
+ "label": "Read the docs"
53
+ },
54
+ "image": {
55
+ "filename": "",
56
+ "alt": ""
57
+ }
58
+ }
59
+ }
60
+ ]
61
+ }
@@ -0,0 +1,61 @@
1
+ {
2
+ "slug": "article-schemas",
3
+ "seo": {
4
+ "title": "Why we moved schemas next to components · Servicely™",
5
+ "description": "A short essay on how the JSON-sidecar pattern fell apart in three real codebases. A demo article shipped with the template."
6
+ },
7
+ "sections": [
8
+ {
9
+ "id": "articlehero-1",
10
+ "type": "ArticleHero",
11
+ "data": {
12
+ "category": "Engineering",
13
+ "title": "Why we moved schemas next to components",
14
+ "authorName": "Tom Larsen",
15
+ "meta": "8 min read · Apr 28, 2026",
16
+ "authorPhoto": {
17
+ "filename": "cb3acf58b57417a4b26474ba04c096af7103c4320ed2f4f3683f79d7670a055c.jpg",
18
+ "alt": ""
19
+ },
20
+ "coverImage": {
21
+ "filename": "cae09f4729f8a348b67267c2f2a550be0f3bfa420689afe1a5cf8b7e2b146238.png",
22
+ "alt": "Warm photograph evoking shipping"
23
+ },
24
+ "backLink": {
25
+ "type": "internal",
26
+ "slug": "blog",
27
+ "label": "back to blog"
28
+ }
29
+ }
30
+ },
31
+ {
32
+ "id": "articlebody-1",
33
+ "type": "ArticleBody",
34
+ "data": {
35
+ "body": "Every platform we've worked with treated content schemas as a separate concern from the components that render them. The schema lived in a JSON file, a Sanity studio config, or a Contentful UI. The component lived in the codebase. They drifted.\n\nIn every project, eventually, somebody adds a field to the schema and forgets the component. Or refactors the component and leaves a dead field in the schema. By month six, no one trusts either.\n\n## The fix is boring\n\nThe schema lives next to the component. They're the same file. The component declares what content it needs, in TypeScript, with whatever validation it wants.\n\nWhen you change the component, the schema changes with it. The editor reads the same module the renderer does. There is no second source of truth, because there is no second source.\n\n## What this unlocks\n\n- AI agents can read the schema directly — no MCP server, no separate API.\n- Refactors are atomic. Rename a prop, the editor field renames itself.\n- Type-checks catch dead fields at build time.\n\n> The first time we deleted a field and watched the editor UI update on the next deploy, the marketing team applauded. They'd been begging for that for two years.\n\nIt is not a clever idea. It is what should have been the default ten years ago."
36
+ }
37
+ },
38
+ {
39
+ "id": "banner-1",
40
+ "type": "Banner",
41
+ "data": {
42
+ "headline": "## Built for teams who *ship.*",
43
+ "lead": "Two minutes to a working site. One command to deploy.",
44
+ "primaryCta": {
45
+ "type": "internal",
46
+ "slug": "/",
47
+ "label": "Start free"
48
+ },
49
+ "secondaryCta": {
50
+ "type": "internal",
51
+ "slug": "/",
52
+ "label": "Read the docs"
53
+ },
54
+ "image": {
55
+ "filename": "",
56
+ "alt": ""
57
+ }
58
+ }
59
+ }
60
+ ]
61
+ }
@@ -0,0 +1,162 @@
1
+ {
2
+ "slug": "blog",
3
+ "seo": {
4
+ "title": "Blog · Servicely™ (demo)",
5
+ "description": "Demo blog for a made-up platform. Posts cover tools, AI, ops, and why the four-day workweek is still mostly marketing. This is a template, not an actual publication."
6
+ },
7
+ "sections": [
8
+ {
9
+ "id": "bloghead-1",
10
+ "type": "BlogIndexHeader",
11
+ "data": {
12
+ "eyebrow": "Blog · 47 posts",
13
+ "headline": "# Notes from the *operations room.*",
14
+ "lead": "Honest writing about tools, AI, layoffs disguised as 'efficiency reviews,' and why remote work is fine. No SEO bait, no 'ten reasons N1 is the trend of the year.'",
15
+ "categories": [
16
+ {
17
+ "_id": "cat-1",
18
+ "label": "All"
19
+ },
20
+ {
21
+ "_id": "cat-2",
22
+ "label": "Engineering"
23
+ },
24
+ {
25
+ "_id": "cat-3",
26
+ "label": "Editor"
27
+ },
28
+ {
29
+ "_id": "cat-4",
30
+ "label": "AI"
31
+ },
32
+ {
33
+ "_id": "cat-5",
34
+ "label": "Customers"
35
+ },
36
+ {
37
+ "_id": "cat-6",
38
+ "label": "Changelog"
39
+ }
40
+ ]
41
+ }
42
+ },
43
+ {
44
+ "id": "articles-1",
45
+ "type": "FeaturedArticles",
46
+ "data": {
47
+ "eyebrow": "",
48
+ "headline": "",
49
+ "lead": "",
50
+ "columns": "3",
51
+ "articles": [
52
+ {
53
+ "_id": "art-1",
54
+ "category": "Engineering",
55
+ "title": "Why we moved schemas next to components",
56
+ "excerpt": "A short essay on how the JSON-sidecar pattern fell apart in three real codebases.",
57
+ "meta": "8 min · Tom L. · Apr 28",
58
+ "link": {
59
+ "type": "internal",
60
+ "slug": "article-schemas",
61
+ "label": "Read article"
62
+ },
63
+ "image": {
64
+ "filename": "cae09f4729f8a348b67267c2f2a550be0f3bfa420689afe1a5cf8b7e2b146238.png",
65
+ "alt": "Warm photograph evoking shipping"
66
+ }
67
+ },
68
+ {
69
+ "_id": "art-2",
70
+ "category": "Editor",
71
+ "title": "The twelve booking forms we refused to ship",
72
+ "excerpt": "Sticky toolbars, modal overlays, and the publish button that pretends it's a save button.",
73
+ "meta": "6 min · Mira S. · Apr 21",
74
+ "link": {
75
+ "type": "internal",
76
+ "slug": "article-editor",
77
+ "label": "Read article"
78
+ },
79
+ "image": {
80
+ "filename": "de249ff9be2539cf0d1ce092de3c57001839b6c3e14fcee3fc31a7b7673ae007.jpg",
81
+ "alt": "Open notebook in warm light"
82
+ }
83
+ },
84
+ {
85
+ "_id": "art-3",
86
+ "category": "AI",
87
+ "title": "Stop generating tickets — generate replies",
88
+ "excerpt": "When the AI has the schema and a copy of the price list, it stops asking permission. Here's how that works, and why PMs don't get replaced by it.",
89
+ "meta": "11 min · Tom L. · Apr 14",
90
+ "link": {
91
+ "type": "internal",
92
+ "slug": "/",
93
+ "label": "Read article"
94
+ },
95
+ "image": {
96
+ "filename": "b303185b471678e4d62f678a1549ee26022f4745407d08cae44ecb1c25352293.jpg",
97
+ "alt": "Person editing on a laptop in warm light"
98
+ }
99
+ },
100
+ {
101
+ "_id": "art-4",
102
+ "category": "Engineering",
103
+ "title": "Edge rendering without the religion",
104
+ "excerpt": "Cloudflare, Vercel, your own box — all fine. The choice that actually matters is somewhere else.",
105
+ "meta": "7 min · Felix V. · Apr 7",
106
+ "link": {
107
+ "type": "internal",
108
+ "slug": "/",
109
+ "label": "Read article"
110
+ },
111
+ "image": {
112
+ "filename": "f8b9200065b5436c6a88361839edc2b89be88d3037c84a80d3ee95c32891510b.jpg",
113
+ "alt": "Laptop on a warm bedspread"
114
+ }
115
+ },
116
+ {
117
+ "_id": "art-5",
118
+ "category": "Editor",
119
+ "title": "Designing for the marketer who hates CMSes",
120
+ "excerpt": "Most editors are built for editors. Ours is built for the person who logs in once a fortnight and wants out in ten minutes.",
121
+ "meta": "5 min · Priya A. · Mar 31",
122
+ "link": {
123
+ "type": "internal",
124
+ "slug": "/",
125
+ "label": "Read article"
126
+ },
127
+ "image": {
128
+ "filename": "816a11e6a7245feaf51bbebf09d1bda3f125b334bc24fc3b8f47b5380a7b4294.jpg",
129
+ "alt": "Warm brainstorm scene"
130
+ }
131
+ },
132
+ {
133
+ "_id": "art-6",
134
+ "category": "Customers",
135
+ "title": "How Plant.io serves 11 locales with one editor",
136
+ "excerpt": "A workflow case study. Includes the agent prompt template they use — and a list of what they ended up removing from it.",
137
+ "meta": "9 min · Sara O. · Mar 24",
138
+ "link": {
139
+ "type": "internal",
140
+ "slug": "/",
141
+ "label": "Read article"
142
+ },
143
+ "image": {
144
+ "filename": "579f67d5fd4c9106c6cdf2ef29f50df934ad0fc2b7849bac1e1cfb1e3f92303b.jpg",
145
+ "alt": "Farm-to-table marketplace photo"
146
+ }
147
+ }
148
+ ]
149
+ }
150
+ },
151
+ {
152
+ "id": "newsletter-1",
153
+ "type": "Newsletter",
154
+ "data": {
155
+ "headline": "## A new post every *Wednesday.*",
156
+ "emailPlaceholder": "you@company.com",
157
+ "buttonLabel": "Subscribe",
158
+ "helperText": "one email a week · unsubscribe in one click"
159
+ }
160
+ }
161
+ ]
162
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "slug": "contact",
3
+ "seo": {
4
+ "title": "Contact · Servicely™ (demo)",
5
+ "description": "Demo contact page for the fictional Servicely™ platform. The form is rendered, but nobody is at the other end — this is a template, not a real company."
6
+ },
7
+ "sections": [
8
+ {
9
+ "id": "form-1",
10
+ "type": "ContactForm",
11
+ "data": {
12
+ "headline": "## Get in touch with the *team.*",
13
+ "body": "A founder reads every message. Expect a real reply within one working day — usually the same day if it's before 6pm CET. (Being honest: this is a demo site, so the messages won't actually go anywhere — but that's exactly how the real form would behave.)",
14
+ "nameLabel": "Your name",
15
+ "emailLabel": "Email",
16
+ "companyLabel": "Company (optional)",
17
+ "messageLabel": "What are you working on?",
18
+ "submitLabel": "Send message",
19
+ "quote": "The team replied in two hours, on a Sunday. Their CEO debugged my schema bug live on a call. Try getting that from the big platforms.",
20
+ "quoteName": "Marcus Weil",
21
+ "quoteRole": "Eng Lead · Avalon",
22
+ "quotePhoto": {
23
+ "filename": "3e76165a78fd3e7b8ed1e93dee50803ae11110c756c8c1c89229a2dec2bc0abf.jpg",
24
+ "alt": ""
25
+ }
26
+ }
27
+ }
28
+ ]
29
+ }