@minamocms/framework 0.0.0-stage → 0.10.2

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 (286) hide show
  1. package/CHANGELOG.md +240 -0
  2. package/LICENSE +105 -0
  3. package/README.md +133 -2
  4. package/dist/boot.d.ts +19 -0
  5. package/dist/boot.js +22 -0
  6. package/dist/config.d.ts +18 -0
  7. package/dist/config.js +44 -0
  8. package/dist/create-site/cli.d.ts +2 -0
  9. package/dist/create-site/cli.js +31 -0
  10. package/dist/create-site/generate-site.d.ts +12 -0
  11. package/dist/create-site/generate-site.js +168 -0
  12. package/dist/create-site/mint-token-cli.d.ts +2 -0
  13. package/dist/create-site/mint-token-cli.js +26 -0
  14. package/dist/create-site/mint-token.d.ts +7 -0
  15. package/dist/create-site/mint-token.js +49 -0
  16. package/dist/create-site/template/AGENTS.md +473 -0
  17. package/dist/create-site/template/content/menus/footerCompany.json +9 -0
  18. package/dist/create-site/template/content/menus/footerProduct.json +9 -0
  19. package/dist/create-site/template/content/menus/footerResources.json +9 -0
  20. package/dist/create-site/template/content/menus/main.json +9 -0
  21. package/dist/create-site/template/content/pages/404.json +23 -0
  22. package/dist/create-site/template/content/pages/about/careers.json +22 -0
  23. package/dist/create-site/template/content/pages/about/team.json +22 -0
  24. package/dist/create-site/template/content/pages/about.json +22 -0
  25. package/dist/create-site/template/content/pages/docs/deployment.json +22 -0
  26. package/dist/create-site/template/content/pages/docs/getting-started/quickstart.json +22 -0
  27. package/dist/create-site/template/content/pages/docs/getting-started.json +24 -0
  28. package/dist/create-site/template/content/pages/docs.json +22 -0
  29. package/dist/create-site/template/content/pages/index.json +182 -0
  30. package/dist/create-site/template/content/redirects.json +4 -0
  31. package/dist/create-site/template/dockerignore +6 -0
  32. package/dist/create-site/template/gitignore +11 -0
  33. package/dist/create-site/template/theme/assets/site.js +49 -0
  34. package/dist/create-site/template/theme/assets/style.css +1223 -0
  35. package/dist/create-site/template/theme/blocks/button.liquid +21 -0
  36. package/dist/create-site/template/theme/blocks/comparison-row.liquid +19 -0
  37. package/dist/create-site/template/theme/blocks/faq-item.liquid +22 -0
  38. package/dist/create-site/template/theme/blocks/feature-card.liquid +23 -0
  39. package/dist/create-site/template/theme/blocks/logo-mark.liquid +13 -0
  40. package/dist/create-site/template/theme/blocks/pricing-tier.liquid +42 -0
  41. package/dist/create-site/template/theme/blocks/step-card.liquid +19 -0
  42. package/dist/create-site/template/theme/blocks/testimonial-card.liquid +25 -0
  43. package/dist/create-site/template/theme/config/site_settings.json +11 -0
  44. package/dist/create-site/template/theme/layouts/theme.liquid +102 -0
  45. package/dist/create-site/template/theme/sections/comparison.liquid +41 -0
  46. package/dist/create-site/template/theme/sections/cta-banner.liquid +36 -0
  47. package/dist/create-site/template/theme/sections/faq.liquid +27 -0
  48. package/dist/create-site/template/theme/sections/feature-grid.liquid +27 -0
  49. package/dist/create-site/template/theme/sections/hero.liquid +48 -0
  50. package/dist/create-site/template/theme/sections/how-it-works.liquid +27 -0
  51. package/dist/create-site/template/theme/sections/pricing.liquid +27 -0
  52. package/dist/create-site/template/theme/sections/social-proof.liquid +21 -0
  53. package/dist/create-site/template/theme/sections/testimonials.liquid +27 -0
  54. package/dist/create-site/template/theme/snippets/icon.liquid +24 -0
  55. package/dist/create-site/template/theme/snippets/logo.liquid +7 -0
  56. package/dist/create-site/template/theme/snippets/responsive-media.liquid +107 -0
  57. package/dist/create-site/template/theme/snippets/site-name.liquid +1 -0
  58. package/dist/create-site/template/vhost/Dockerfile +33 -0
  59. package/dist/create-site/template/vhost/docker-entrypoint.sh +58 -0
  60. package/dist/index.d.ts +2 -0
  61. package/dist/index.js +4 -0
  62. package/dist/media/drivers/driver.d.ts +11 -0
  63. package/dist/media/drivers/driver.js +1 -0
  64. package/dist/media/drivers/local-fs-driver.d.ts +3 -0
  65. package/dist/media/drivers/local-fs-driver.js +94 -0
  66. package/dist/media/filename.d.ts +2 -0
  67. package/dist/media/filename.js +54 -0
  68. package/dist/media/manage-media.d.ts +19 -0
  69. package/dist/media/manage-media.js +45 -0
  70. package/dist/media/seed-media-cli.d.ts +2 -0
  71. package/dist/media/seed-media-cli.js +22 -0
  72. package/dist/media/seed-media.d.ts +11 -0
  73. package/dist/media/seed-media.js +76 -0
  74. package/dist/migrations/index.d.ts +3 -0
  75. package/dist/migrations/index.js +83 -0
  76. package/dist/pull-site/cli.d.ts +2 -0
  77. package/dist/pull-site/cli.js +78 -0
  78. package/dist/pull-site/prompt-token.d.ts +16 -0
  79. package/dist/pull-site/prompt-token.js +69 -0
  80. package/dist/pull-site/prompts.d.ts +22 -0
  81. package/dist/pull-site/prompts.js +127 -0
  82. package/dist/pull-site/pull-site.d.ts +23 -0
  83. package/dist/pull-site/pull-site.js +211 -0
  84. package/dist/renderer/engine.d.ts +2 -0
  85. package/dist/renderer/engine.js +48 -0
  86. package/dist/renderer/render-cache.d.ts +11 -0
  87. package/dist/renderer/render-cache.js +11 -0
  88. package/dist/renderer/render-page.d.ts +34 -0
  89. package/dist/renderer/render-page.js +209 -0
  90. package/dist/renderer/theme-templates.d.ts +7 -0
  91. package/dist/renderer/theme-templates.js +82 -0
  92. package/dist/routes/admin-redirect.d.ts +5 -0
  93. package/dist/routes/admin-redirect.js +26 -0
  94. package/dist/routes/assets.d.ts +6 -0
  95. package/dist/routes/assets.js +30 -0
  96. package/dist/routes/batch.d.ts +10 -0
  97. package/dist/routes/batch.js +148 -0
  98. package/dist/routes/capabilities.d.ts +6 -0
  99. package/dist/routes/capabilities.js +27 -0
  100. package/dist/routes/content.d.ts +8 -0
  101. package/dist/routes/content.js +169 -0
  102. package/dist/routes/deleted-pages.d.ts +8 -0
  103. package/dist/routes/deleted-pages.js +9 -0
  104. package/dist/routes/drafts.d.ts +10 -0
  105. package/dist/routes/drafts.js +73 -0
  106. package/dist/routes/git.d.ts +8 -0
  107. package/dist/routes/git.js +158 -0
  108. package/dist/routes/index.d.ts +12 -0
  109. package/dist/routes/index.js +86 -0
  110. package/dist/routes/links.d.ts +8 -0
  111. package/dist/routes/links.js +18 -0
  112. package/dist/routes/media-public.d.ts +11 -0
  113. package/dist/routes/media-public.js +125 -0
  114. package/dist/routes/media.d.ts +9 -0
  115. package/dist/routes/media.js +80 -0
  116. package/dist/routes/menus.d.ts +8 -0
  117. package/dist/routes/menus.js +148 -0
  118. package/dist/routes/preview-revision.d.ts +10 -0
  119. package/dist/routes/preview-revision.js +96 -0
  120. package/dist/routes/preview.d.ts +10 -0
  121. package/dist/routes/preview.js +56 -0
  122. package/dist/routes/public.d.ts +10 -0
  123. package/dist/routes/public.js +123 -0
  124. package/dist/routes/publish.d.ts +10 -0
  125. package/dist/routes/publish.js +139 -0
  126. package/dist/routes/redirects.d.ts +8 -0
  127. package/dist/routes/redirects.js +132 -0
  128. package/dist/routes/search-public.d.ts +6 -0
  129. package/dist/routes/search-public.js +104 -0
  130. package/dist/routes/search.d.ts +8 -0
  131. package/dist/routes/search.js +15 -0
  132. package/dist/routes/settings.d.ts +10 -0
  133. package/dist/routes/settings.js +68 -0
  134. package/dist/routes/sitemap.d.ts +7 -0
  135. package/dist/routes/sitemap.js +79 -0
  136. package/dist/routes/theme.d.ts +10 -0
  137. package/dist/routes/theme.js +116 -0
  138. package/dist/schemas/instance.schema.json +17 -0
  139. package/dist/schemas/menu.schema.json +24 -0
  140. package/dist/schemas/page.schema.json +26 -0
  141. package/dist/schemas/redirects.schema.json +24 -0
  142. package/dist/search/drivers/driver.d.ts +9 -0
  143. package/dist/search/drivers/driver.js +1 -0
  144. package/dist/search/drivers/node-sqlite-driver.d.ts +7 -0
  145. package/dist/search/drivers/node-sqlite-driver.js +19 -0
  146. package/dist/search/query-content.d.ts +32 -0
  147. package/dist/search/query-content.js +207 -0
  148. package/dist/search/query-index.d.ts +5 -0
  149. package/dist/search/query-index.js +21 -0
  150. package/dist/search/rebuild-index.d.ts +3 -0
  151. package/dist/search/rebuild-index.js +320 -0
  152. package/dist/server-config.d.ts +23 -0
  153. package/dist/server-config.js +237 -0
  154. package/dist/server.d.ts +13 -0
  155. package/dist/server.js +235 -0
  156. package/dist/services/batch.d.ts +35 -0
  157. package/dist/services/batch.js +145 -0
  158. package/dist/services/checkpoint.d.ts +4 -0
  159. package/dist/services/checkpoint.js +45 -0
  160. package/dist/services/content-read.d.ts +27 -0
  161. package/dist/services/content-read.js +151 -0
  162. package/dist/services/delete-content.d.ts +12 -0
  163. package/dist/services/delete-content.js +166 -0
  164. package/dist/services/deleted-pages.d.ts +11 -0
  165. package/dist/services/deleted-pages.js +83 -0
  166. package/dist/services/dev-tunnel.d.ts +5 -0
  167. package/dist/services/dev-tunnel.js +5 -0
  168. package/dist/services/drafts.d.ts +16 -0
  169. package/dist/services/drafts.js +164 -0
  170. package/dist/services/etag.d.ts +2 -0
  171. package/dist/services/etag.js +30 -0
  172. package/dist/services/fs-walk.d.ts +1 -0
  173. package/dist/services/fs-walk.js +26 -0
  174. package/dist/services/git-commit.d.ts +3 -0
  175. package/dist/services/git-commit.js +12 -0
  176. package/dist/services/git-history.d.ts +28 -0
  177. package/dist/services/git-history.js +131 -0
  178. package/dist/services/git-revert.d.ts +12 -0
  179. package/dist/services/git-revert.js +140 -0
  180. package/dist/services/git.d.ts +16 -0
  181. package/dist/services/git.js +127 -0
  182. package/dist/services/interval-job.d.ts +4 -0
  183. package/dist/services/interval-job.js +9 -0
  184. package/dist/services/ip-allowlist.d.ts +7 -0
  185. package/dist/services/ip-allowlist.js +31 -0
  186. package/dist/services/links.d.ts +22 -0
  187. package/dist/services/links.js +169 -0
  188. package/dist/services/manage-menus.d.ts +15 -0
  189. package/dist/services/manage-menus.js +138 -0
  190. package/dist/services/manage-redirects.d.ts +25 -0
  191. package/dist/services/manage-redirects.js +156 -0
  192. package/dist/services/menu-references.d.ts +3 -0
  193. package/dist/services/menu-references.js +38 -0
  194. package/dist/services/menus.d.ts +9 -0
  195. package/dist/services/menus.js +43 -0
  196. package/dist/services/migration-runner.d.ts +16 -0
  197. package/dist/services/migration-runner.js +169 -0
  198. package/dist/services/mime-types.d.ts +3 -0
  199. package/dist/services/mime-types.js +43 -0
  200. package/dist/services/move.d.ts +16 -0
  201. package/dist/services/move.js +236 -0
  202. package/dist/services/path-safety.d.ts +6 -0
  203. package/dist/services/path-safety.js +112 -0
  204. package/dist/services/pid-file.d.ts +13 -0
  205. package/dist/services/pid-file.js +54 -0
  206. package/dist/services/post-urls.d.ts +3 -0
  207. package/dist/services/post-urls.js +27 -0
  208. package/dist/services/prepared-operation.d.ts +4 -0
  209. package/dist/services/prepared-operation.js +1 -0
  210. package/dist/services/publish.d.ts +15 -0
  211. package/dist/services/publish.js +313 -0
  212. package/dist/services/rate-limit-config.d.ts +9 -0
  213. package/dist/services/rate-limit-config.js +22 -0
  214. package/dist/services/redirects.d.ts +27 -0
  215. package/dist/services/redirects.js +175 -0
  216. package/dist/services/reindex-on-write.d.ts +3 -0
  217. package/dist/services/reindex-on-write.js +30 -0
  218. package/dist/services/resolve-blog-url.d.ts +11 -0
  219. package/dist/services/resolve-blog-url.js +31 -0
  220. package/dist/services/resolve-url.d.ts +11 -0
  221. package/dist/services/resolve-url.js +20 -0
  222. package/dist/services/site-settings.d.ts +28 -0
  223. package/dist/services/site-settings.js +116 -0
  224. package/dist/services/startup-checks.d.ts +10 -0
  225. package/dist/services/startup-checks.js +81 -0
  226. package/dist/services/static-file.d.ts +7 -0
  227. package/dist/services/static-file.js +37 -0
  228. package/dist/services/theme-component-file.d.ts +6 -0
  229. package/dist/services/theme-component-file.js +39 -0
  230. package/dist/services/theme-files.d.ts +33 -0
  231. package/dist/services/theme-files.js +148 -0
  232. package/dist/services/theme-page-templates.d.ts +7 -0
  233. package/dist/services/theme-page-templates.js +53 -0
  234. package/dist/services/theme-schemas.d.ts +2 -0
  235. package/dist/services/theme-schemas.js +137 -0
  236. package/dist/services/token-auth.d.ts +10 -0
  237. package/dist/services/token-auth.js +64 -0
  238. package/dist/services/urls.d.ts +2 -0
  239. package/dist/services/urls.js +20 -0
  240. package/dist/services/validation.d.ts +26 -0
  241. package/dist/services/validation.js +195 -0
  242. package/dist/services/write-queue.d.ts +1 -0
  243. package/dist/services/write-queue.js +14 -0
  244. package/dist/site-check/cli.d.ts +2 -0
  245. package/dist/site-check/cli.js +48 -0
  246. package/dist/site-check/run-check.d.ts +12 -0
  247. package/dist/site-check/run-check.js +188 -0
  248. package/dist/site-sync/cli-helpers.d.ts +23 -0
  249. package/dist/site-sync/cli-helpers.js +75 -0
  250. package/dist/site-sync/deploy.d.ts +36 -0
  251. package/dist/site-sync/deploy.js +124 -0
  252. package/dist/site-sync/live-content.d.ts +30 -0
  253. package/dist/site-sync/live-content.js +68 -0
  254. package/dist/site-sync/prompts.d.ts +30 -0
  255. package/dist/site-sync/prompts.js +237 -0
  256. package/dist/site-sync/pull-cli.d.ts +2 -0
  257. package/dist/site-sync/pull-cli.js +75 -0
  258. package/dist/site-sync/pull-site.d.ts +28 -0
  259. package/dist/site-sync/pull-site.js +171 -0
  260. package/dist/site-sync/push-cli.d.ts +2 -0
  261. package/dist/site-sync/push-cli.js +268 -0
  262. package/dist/site-sync/push-site.d.ts +96 -0
  263. package/dist/site-sync/push-site.js +376 -0
  264. package/dist/site-sync/remote-site.d.ts +38 -0
  265. package/dist/site-sync/remote-site.js +122 -0
  266. package/dist/site-sync/sync-record.d.ts +26 -0
  267. package/dist/site-sync/sync-record.js +76 -0
  268. package/dist/site-sync/theme-sync.d.ts +34 -0
  269. package/dist/site-sync/theme-sync.js +128 -0
  270. package/dist/stop-site/cli.d.ts +2 -0
  271. package/dist/stop-site/cli.js +28 -0
  272. package/dist/stop-site/stop-site.d.ts +26 -0
  273. package/dist/stop-site/stop-site.js +56 -0
  274. package/dist/theme-state.d.ts +20 -0
  275. package/dist/theme-state.js +33 -0
  276. package/dist/upgrade/changelog.d.ts +8 -0
  277. package/dist/upgrade/changelog.js +46 -0
  278. package/dist/upgrade/finish.d.ts +9 -0
  279. package/dist/upgrade/finish.js +30 -0
  280. package/dist/upgrade/owned-files.d.ts +11 -0
  281. package/dist/upgrade/owned-files.js +42 -0
  282. package/dist/upgrade/package-names.d.ts +4 -0
  283. package/dist/upgrade/package-names.js +26 -0
  284. package/dist/upgrade/upgrade-cli.d.ts +2 -0
  285. package/dist/upgrade/upgrade-cli.js +170 -0
  286. package/package.json +64 -4
@@ -0,0 +1,22 @@
1
+ {
2
+ "schemaVersion": 7,
3
+ "name": "Deployment",
4
+ "title": "Deployment - Minamo",
5
+ "type": "page",
6
+ "layout": "theme",
7
+ "published": true,
8
+ "sections": [
9
+ {
10
+ "id": "sec-hero",
11
+ "type": "hero",
12
+ "settings": {
13
+ "eyebrow": "Docs / Deployment",
14
+ "heading": "Ship it anywhere Node.js runs.",
15
+ "subheading": "A Minamo site is a process and a folder of files - a VPS, a container, or the client's own hosting all work the same way."
16
+ },
17
+ "blocks": [
18
+ { "id": "blk-deploy-cta", "type": "button", "settings": { "label": "Back to Docs", "url": "/docs", "style": "secondary" } }
19
+ ]
20
+ }
21
+ ]
22
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "schemaVersion": 7,
3
+ "name": "Quickstart",
4
+ "title": "Quickstart - Minamo",
5
+ "type": "page",
6
+ "layout": "theme",
7
+ "published": true,
8
+ "sections": [
9
+ {
10
+ "id": "sec-hero",
11
+ "type": "hero",
12
+ "settings": {
13
+ "eyebrow": "Docs / Getting Started / Quickstart",
14
+ "heading": "The five-minute version.",
15
+ "subheading": "Install, scaffold, model your first content type, and deploy. No detours."
16
+ },
17
+ "blocks": [
18
+ { "id": "blk-quickstart-cta", "type": "button", "settings": { "label": "Back to Getting Started", "url": "/docs/getting-started", "style": "secondary" } }
19
+ ]
20
+ }
21
+ ]
22
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "schemaVersion": 7,
3
+ "name": "Getting Started",
4
+ "title": "Getting Started - Minamo",
5
+ "type": "page",
6
+ "layout": "theme",
7
+ "published": true,
8
+ "sections": [
9
+ {
10
+ "id": "sec-hero",
11
+ "type": "hero",
12
+ "settings": {
13
+ "eyebrow": "Docs / Getting Started",
14
+ "heading": "Scaffold your first site in under five minutes.",
15
+ "subheading": "One command sets up a theme folder, structured content and a vhost ready to deploy.",
16
+ "codeTitle": "terminal",
17
+ "codeSnippet": "$ npx -p @minamocms/framework create-site acme-corp\n✔ Scaffolded theme, content and vhost\n✔ Structured content models ready"
18
+ },
19
+ "blocks": [
20
+ { "id": "blk-gs-cta", "type": "button", "settings": { "label": "Quickstart", "url": "/docs/getting-started/quickstart", "style": "primary" } }
21
+ ]
22
+ }
23
+ ]
24
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "schemaVersion": 7,
3
+ "name": "Docs",
4
+ "title": "Docs - Minamo",
5
+ "type": "page",
6
+ "layout": "theme",
7
+ "published": true,
8
+ "sections": [
9
+ {
10
+ "id": "sec-hero",
11
+ "type": "hero",
12
+ "settings": {
13
+ "eyebrow": "Docs",
14
+ "heading": "Everything you need to run Minamo.",
15
+ "subheading": "Setup, content modelling and deployment guides, kept short enough to actually read."
16
+ },
17
+ "blocks": [
18
+ { "id": "blk-docs-cta", "type": "button", "settings": { "label": "Getting started", "url": "/docs/getting-started", "style": "primary" } }
19
+ ]
20
+ }
21
+ ]
22
+ }
@@ -0,0 +1,182 @@
1
+ {
2
+ "schemaVersion": 7,
3
+ "name": "Home",
4
+ "title": "Minamo - Solid foundations for client sites",
5
+ "type": "page",
6
+ "layout": "theme",
7
+ "published": true,
8
+ "sections": [
9
+ {
10
+ "id": "sec-hero",
11
+ "type": "hero",
12
+ "settings": {
13
+ "eyebrow": "Open source · self-hosted · git-based",
14
+ "heading": "Solid foundations for client sites.",
15
+ "subheading": "Minamo is a lightweight, developer-first CMS built for agencies and freelancers who'd rather ship clean git-based sites than fight plugin bloat. Model your content, hand off a client-friendly admin, deploy anywhere.",
16
+ "codeTitle": "terminal",
17
+ "codeSnippet": "$ npx -p @minamocms/framework create-site acme-corp\n✔ Scaffolded theme, content and vhost\n✔ Structured content models ready\n\n$ npm run push\n✔ Built 42 pages in 380ms\n✔ Synced to production, done."
18
+ },
19
+ "blocks": [
20
+ { "id": "blk-hero-cta-primary", "type": "button", "settings": { "label": "Get started", "url": "/docs", "style": "primary" } },
21
+ { "id": "blk-hero-cta-secondary", "type": "button", "settings": { "label": "View the docs", "url": "/docs", "style": "secondary" } }
22
+ ]
23
+ },
24
+ {
25
+ "id": "sec-social-proof",
26
+ "type": "social-proof",
27
+ "settings": {
28
+ "label": "Trusted by agencies and developers shipping client sites every week"
29
+ },
30
+ "blocks": [
31
+ { "id": "blk-logo-1", "type": "logo-mark", "settings": { "name": "NORTHWARD" } },
32
+ { "id": "blk-logo-2", "type": "logo-mark", "settings": { "name": "STUDIO PALE" } },
33
+ { "id": "blk-logo-3", "type": "logo-mark", "settings": { "name": "FIELDNOTE" } },
34
+ { "id": "blk-logo-4", "type": "logo-mark", "settings": { "name": "GOODHOUSE" } },
35
+ { "id": "blk-logo-5", "type": "logo-mark", "settings": { "name": "GREYWORKS" } }
36
+ ]
37
+ },
38
+ {
39
+ "id": "sec-features",
40
+ "type": "feature-grid",
41
+ "settings": {
42
+ "eyebrow": "Why Minamo",
43
+ "heading": "Everything a client site needs. Nothing it doesn't.",
44
+ "subheading": "Minamo is built around a small set of clean primitives instead of a decade of accumulated core and plugin cruft."
45
+ },
46
+ "blocks": [
47
+ { "id": "blk-feature-1", "type": "feature-card", "settings": { "icon": "structure", "heading": "Structured content modelling", "description": "Define content types with plain JSON Schema - no proprietary field builder, no black-box data model. What you write is what gets validated." } },
48
+ { "id": "blk-feature-2", "type": "feature-card", "settings": { "icon": "git", "heading": "Git-based workflows", "description": "Content and theme live in git alongside your code. Branch a client's homepage redesign, review it in a PR, merge it like anything else you ship." } },
49
+ { "id": "blk-feature-3", "type": "feature-card", "settings": { "icon": "bolt", "heading": "Blazing performance", "description": "No ORM, no plugin queue, no admin-panel tax on the front end. Pages render in milliseconds because there's nothing extra in the way." } },
50
+ { "id": "blk-feature-4", "type": "feature-card", "settings": { "icon": "block", "heading": "No plugin bloat", "description": "There's no plugin marketplace to get lost in. Minamo ships with exactly what a client site needs, and nothing you'll spend a weekend patching." } },
51
+ { "id": "blk-feature-5", "type": "feature-card", "settings": { "icon": "admin", "heading": "Simple, client-friendly admin", "description": "Hand off access without a training session. Clients edit their own copy and images through a focused admin UI - no theme settings to break." } },
52
+ { "id": "blk-feature-6", "type": "feature-card", "settings": { "icon": "portable", "heading": "Fully self-hosted and portable", "description": "Run it on your own infrastructure or the client's. Every site is a folder of files - move it, back it up, or migrate it without asking permission." } }
53
+ ]
54
+ },
55
+ {
56
+ "id": "sec-how-it-works",
57
+ "type": "how-it-works",
58
+ "settings": {
59
+ "eyebrow": "How it works",
60
+ "heading": "From new client to live site in three steps",
61
+ "subheading": "No scaffolding to hand-roll and no framework decisions to relitigate for every new engagement."
62
+ },
63
+ "blocks": [
64
+ { "id": "blk-step-1", "type": "step-card", "settings": { "number": "01", "heading": "Scaffold a site", "description": "Run one command to generate a new site: theme folder, content structure and a vhost ready to deploy. No boilerplate to copy from your last project." } },
65
+ { "id": "blk-step-2", "type": "step-card", "settings": { "number": "02", "heading": "Model your content", "description": "Define sections and blocks as plain templates with a JSON Schema for their settings. Content authors get a clean admin; you get a system you actually understand." } },
66
+ { "id": "blk-step-3", "type": "step-card", "settings": { "number": "03", "heading": "Deploy anywhere", "description": "Minamo is just a process and a folder of files. Ship it to a VPS, a container, or the client's own hosting - there's no vendor lock-in." } }
67
+ ]
68
+ },
69
+ {
70
+ "id": "sec-comparison",
71
+ "type": "comparison",
72
+ "settings": {
73
+ "eyebrow": "Minamo vs. traditional CMS platforms",
74
+ "heading": "Built lean, on purpose",
75
+ "subheading": "A side-by-side look at what changes when you drop the plugin ecosystem and two decades of legacy core.",
76
+ "criteriaLabel": "Criteria",
77
+ "minamoLabel": "Minamo",
78
+ "traditionalLabel": "Traditional CMS"
79
+ },
80
+ "blocks": [
81
+ { "id": "blk-row-1", "type": "comparison-row", "settings": { "criteria": "Page load speed", "minamo": "Sub-100ms, no plugin overhead", "traditional": "Often 1-3s under plugin load" } },
82
+ { "id": "blk-row-2", "type": "comparison-row", "settings": { "criteria": "Security surface", "minamo": "No third-party plugin ecosystem to patch", "traditional": "Large attack surface from plugins & extensions" } },
83
+ { "id": "blk-row-3", "type": "comparison-row", "settings": { "criteria": "Maintenance overhead", "minamo": "One lightweight core, occasional bump", "traditional": "Core, theme and dozens of plugins to keep current" } },
84
+ { "id": "blk-row-4", "type": "comparison-row", "settings": { "criteria": "Portability", "minamo": "Just files - move or self-host freely", "traditional": "Database-coupled, often host-locked" } }
85
+ ]
86
+ },
87
+ {
88
+ "id": "sec-testimonials",
89
+ "type": "testimonials",
90
+ "settings": {
91
+ "eyebrow": "From the field",
92
+ "heading": "What agencies say after switching",
93
+ "subheading": "Fewer support emails, cleaner handoffs, and a stack their whole team can reason about."
94
+ },
95
+ "blocks": [
96
+ { "id": "blk-testimonial-1", "type": "testimonial-card", "settings": { "quote": "We used to budget half a day per client site just for plugin updates and conflicts. With Minamo that's gone entirely - content lives in git, and deploys are boring in the best way.", "name": "Maya Okonkwo", "role": "Founder, Fieldnote Studio", "initials": "MO" } },
97
+ { "id": "blk-testimonial-2", "type": "testimonial-card", "settings": { "quote": "Handing a finished site to a client used to mean signing them up for a support contract. Now we hand over an admin URL and a five-minute walkthrough. They edit their own copy, and we stop getting 'can you fix a typo' emails.", "name": "Tom Bregman", "role": "Lead Developer, Northward Digital", "initials": "TB" } }
98
+ ]
99
+ },
100
+ {
101
+ "id": "sec-pricing",
102
+ "type": "pricing",
103
+ "settings": {
104
+ "eyebrow": "Pricing",
105
+ "heading": "Plans that scale with your client roster",
106
+ "subheading": "Self-host for free, or let us handle updates and multi-site management for you."
107
+ },
108
+ "blocks": [
109
+ {
110
+ "id": "blk-tier-solo",
111
+ "type": "pricing-tier",
112
+ "settings": {
113
+ "name": "Solo",
114
+ "price": "$0",
115
+ "period": "forever, self-hosted",
116
+ "description": "For freelancers running a handful of client sites.",
117
+ "features": ["Unlimited self-hosted sites", "Structured content & git workflows", "Community support", "MIT-licensed core"],
118
+ "ctaLabel": "Get started",
119
+ "ctaUrl": "/docs",
120
+ "highlighted": false
121
+ }
122
+ },
123
+ {
124
+ "id": "blk-tier-agency",
125
+ "type": "pricing-tier",
126
+ "settings": {
127
+ "name": "Agency",
128
+ "price": "$39",
129
+ "period": "per month",
130
+ "description": "For agencies managing a growing roster of client sites.",
131
+ "features": ["Everything in Solo", "Managed updates & security patches", "Multi-site admin dashboard", "Priority email support", "Client access management"],
132
+ "ctaLabel": "Start free trial",
133
+ "ctaUrl": "/docs",
134
+ "highlighted": true
135
+ }
136
+ },
137
+ {
138
+ "id": "blk-tier-enterprise",
139
+ "type": "pricing-tier",
140
+ "settings": {
141
+ "name": "Enterprise",
142
+ "price": "Custom",
143
+ "period": "talk to us",
144
+ "description": "For teams with compliance, scale or white-label needs.",
145
+ "features": ["Everything in Agency", "SSO & audit logging", "White-label admin", "Dedicated support channel", "Custom SLAs"],
146
+ "ctaLabel": "Contact sales",
147
+ "ctaUrl": "/contact",
148
+ "highlighted": false
149
+ }
150
+ }
151
+ ]
152
+ },
153
+ {
154
+ "id": "sec-faq",
155
+ "type": "faq",
156
+ "settings": {
157
+ "eyebrow": "FAQ",
158
+ "heading": "Questions agencies ask before switching",
159
+ "subheading": "If you don't see yours here, the docs cover the rest."
160
+ },
161
+ "blocks": [
162
+ { "id": "blk-faq-1", "type": "faq-item", "settings": { "question": "Do I need to host it myself?", "answer": "No - Minamo runs anywhere Node.js does, including most managed platforms, but self-hosting is fully supported and often the whole point. Bring your own VPS, container platform, or hand it to your client's existing host." } },
163
+ { "id": "blk-faq-2", "type": "faq-item", "settings": { "question": "Can I migrate an existing WordPress site?", "answer": "Yes. Minamo includes a WordPress import script that pulls posts, pages and media into structured content JSON. Most agencies remap templates by hand afterward, since a Minamo theme has a much smaller surface than a WordPress theme." } },
164
+ { "id": "blk-faq-3", "type": "faq-item", "settings": { "question": "How do clients access their site?", "answer": "Each site ships with a lightweight, focused admin UI scoped to content - no theme settings, no plugin screens. You control what's editable per content type, so clients can't break the layout." } },
165
+ { "id": "blk-faq-4", "type": "faq-item", "settings": { "question": "How do updates work?", "answer": "Minamo has one small core and no plugin ecosystem to keep in sync, so updates are a single version bump with a changelog you can actually read in a minute." } },
166
+ { "id": "blk-faq-5", "type": "faq-item", "settings": { "question": "What if I need help?", "answer": "Solo and Agency plans include community and priority support respectively; Enterprise gets a dedicated support channel. The docs also cover the vast majority of setup and theming questions directly." } }
167
+ ]
168
+ },
169
+ {
170
+ "id": "sec-cta",
171
+ "type": "cta-banner",
172
+ "settings": {
173
+ "heading": "Ready to build on solid ground?",
174
+ "subheading": "Scaffold your first Minamo site in under five minutes. No credit card, no plugin marketplace, no legacy baggage."
175
+ },
176
+ "blocks": [
177
+ { "id": "blk-cta-primary", "type": "button", "settings": { "label": "Get started", "url": "/docs", "style": "primary" } },
178
+ { "id": "blk-cta-secondary", "type": "button", "settings": { "label": "Talk to us", "url": "/contact", "style": "on-dark" } }
179
+ ]
180
+ }
181
+ ]
182
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "entries": []
4
+ }
@@ -0,0 +1,6 @@
1
+ # Renamed to .dockerignore by scaffoldSite() (same trick as this
2
+ # template's own "gitignore" -> ".gitignore"). Deliberately does NOT
3
+ # exclude .git - the site root must be a real git repository at
4
+ # runtime (services/startup-checks.ts), so .git has to reach the image.
5
+ vhost/node_modules
6
+ vhost/data
@@ -0,0 +1,11 @@
1
+ node_modules/
2
+
3
+ # Search index (rebuilt on demand via POST /v1/search/rebuild, never committed)
4
+ data/
5
+ *.sqlite
6
+ *.sqlite3
7
+
8
+ # Uploaded media (constraint 2: binary uploads committed forever is
9
+ # unbounded repo bloat with no diffing or expiry benefit - copied
10
+ # separately when moving a site to a new server, never git-tracked)
11
+ /media/
@@ -0,0 +1,49 @@
1
+ (function () {
2
+ var toggle = document.querySelector('[data-nav-toggle]');
3
+ var mobileNav = document.querySelector('[data-mobile-nav]');
4
+
5
+ if (toggle && mobileNav) {
6
+ toggle.addEventListener('click', function () {
7
+ var isOpen = mobileNav.classList.toggle('is-open');
8
+ toggle.setAttribute('aria-expanded', isOpen ? 'true' : 'false');
9
+ });
10
+
11
+ mobileNav.querySelectorAll('a').forEach(function (link) {
12
+ link.addEventListener('click', function () {
13
+ mobileNav.classList.remove('is-open');
14
+ toggle.setAttribute('aria-expanded', 'false');
15
+ });
16
+ });
17
+ }
18
+
19
+ var header = document.querySelector('[data-site-header]');
20
+ if (header) {
21
+ var onScroll = function () {
22
+ header.classList.toggle('is-scrolled', window.scrollY > 8);
23
+ };
24
+ onScroll();
25
+ window.addEventListener('scroll', onScroll, { passive: true });
26
+ }
27
+
28
+ var revealTargets = document.querySelectorAll('.reveal');
29
+ if ('IntersectionObserver' in window && revealTargets.length) {
30
+ var observer = new IntersectionObserver(
31
+ function (entries) {
32
+ entries.forEach(function (entry) {
33
+ if (entry.isIntersecting) {
34
+ entry.target.classList.add('is-visible');
35
+ observer.unobserve(entry.target);
36
+ }
37
+ });
38
+ },
39
+ { threshold: 0.12, rootMargin: '0px 0px -40px 0px' }
40
+ );
41
+ revealTargets.forEach(function (el) {
42
+ observer.observe(el);
43
+ });
44
+ } else {
45
+ revealTargets.forEach(function (el) {
46
+ el.classList.add('is-visible');
47
+ });
48
+ }
49
+ })();