Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
132 commits
Select commit Hold shift + click to select a range
d616ef6
docs(site): add the Deco Blocks docs site (Home, Docs, Under the hood…
tlgimenes Sep 30, 2026
52028bd
docs(site): put text and code in one column
tlgimenes Sep 30, 2026
9cc91d1
docs(site): frame the home page around stability, publish in seconds
tlgimenes Oct 1, 2026
d9421b2
docs(site): remove the "next major" notices
tlgimenes Oct 1, 2026
86161e8
docs(site): default the loader to ./.deco and document how to configu…
tlgimenes Oct 1, 2026
e554571
docs(site): set up the CMS inline in the home page's "Resolve it" step
tlgimenes Oct 1, 2026
f7ccb66
docs(site): move the example function from config/experiments.ts to e…
tlgimenes Oct 1, 2026
290a268
docs(site): simplify the code examples across the docs
tlgimenes Oct 1, 2026
1fd591c
docs(site): rewrite Blocks around function composition, add Content a…
tlgimenes Oct 1, 2026
4adc8e6
docs(site): pair JSON content examples with the calls they mean
tlgimenes Oct 1, 2026
7df26e1
docs(site): rename the resolve option to run, align the docs with the…
tlgimenes Oct 1, 2026
76df5d7
docs(site): newcomer pass by technical writers
tlgimenes Oct 1, 2026
171ffcb
docs(site): drop "section" as a framework concept
tlgimenes Oct 1, 2026
db6acf7
docs(site): content option, deco content, built-in page/redirect, pol…
tlgimenes Oct 1, 2026
ab87a66
docs(site): schema compatibility in CI, deco schema --entry, Workers …
tlgimenes Oct 1, 2026
f4a7a42
docs(site): Studio uses the schema you point it at; drop a techy home…
tlgimenes Oct 1, 2026
f76231f
docs(site): rebuild the docs site with TanStack Start, Tailwind and MDX
tlgimenes Oct 1, 2026
1b583ac
docs(site): move styling to Tailwind, full-width docs layout
tlgimenes Oct 2, 2026
061db79
docs(site): add v7 (current) docs and home, apply next-major decision…
tlgimenes Oct 2, 2026
0833f95
docs(site): double quotes and semicolons in examples; telemetry switc…
tlgimenes Oct 2, 2026
f8642c7
docs(site): show the Roadmap tab only on the next major
tlgimenes Oct 2, 2026
1e40b0c
docs(site): label versions "v7 (current)" and "next"
tlgimenes Oct 2, 2026
c13677e
docs(site): next-major docs teach Git-based content; gradual Content …
tlgimenes Oct 2, 2026
5d3804d
docs(site): fold in the useful parts of a parallel v7 docs effort
tlgimenes Oct 2, 2026
e8d9e11
docs(site): v7 training videos; next home card about publishing by co…
tlgimenes Oct 2, 2026
da1e64d
docs(site): built-in page and redirect blocks; content module wording
tlgimenes Oct 2, 2026
1854bc2
docs(site): open-source-first next-major docs with Hosted Deco CMS no…
tlgimenes Oct 2, 2026
9443311
docs(site): local Studio editing, assets, hosted-only telemetry; `dec…
tlgimenes Oct 2, 2026
60ac017
chore: move design notes to notes/ and the docs site to docs/
tlgimenes Oct 2, 2026
c6b5a24
docs: Blocks page follows one theme, "Resolving a composition"
tlgimenes Oct 2, 2026
785a07c
docs: junior-level Blocks page with a Built-in blocks section
tlgimenes Oct 2, 2026
d745d69
docs: Blocks page on a new thread; Content page merged in; sidebar la…
tlgimenes Oct 2, 2026
fc4deae
docs: next-major URLs match page titles; Schema page title
tlgimenes Oct 2, 2026
333a572
docs: Schema page rewritten; CLI gets its own page
tlgimenes Oct 2, 2026
5eaef39
docs: the next-major CLI ships inside @decocms/blocks
tlgimenes Oct 2, 2026
72063b4
docs: fields are typed by what the function receives
tlgimenes Oct 2, 2026
96e2b69
docs: "How it works" follows the life of one change
tlgimenes Oct 2, 2026
a043fe2
docs: How it works step 5 names cms.forRelease()
tlgimenes Oct 2, 2026
d47b156
docs: How it works says "With Deco"
tlgimenes Oct 2, 2026
1cdb1df
docs: next-major pages say "Deco" instead of "Deco Blocks"
tlgimenes Oct 2, 2026
a9467f7
docs: How it works ends with Small on purpose, Coming from v7, Key terms
tlgimenes Oct 2, 2026
9d10568
docs: DRY openings; one owner page per idea; "saved block" everywhere
tlgimenes Oct 2, 2026
3bedc22
docs: introduce Studio and the hosted Deco CMS on How it works
tlgimenes Oct 2, 2026
b3c28b9
docs: merge Studio and hosted subsections on How it works
tlgimenes Oct 2, 2026
87292b2
docs: How it works pieces map one owner per step; shipping is your ho…
tlgimenes Oct 2, 2026
ef46423
docs: How it works pieces: SDK, CLI, Studio, Hosting
tlgimenes Oct 2, 2026
4cccc55
docs: How it works Hosting row names no platform
tlgimenes Oct 2, 2026
6a707ca
docs: How it works explains local Studio in plain words
tlgimenes Oct 2, 2026
4ed86ad
docs: plain wording for editing on GitHub
tlgimenes Oct 2, 2026
25a5a31
docs: "You can test it on your own machine via deco serve"
tlgimenes Oct 2, 2026
b452846
docs: How it works step 3 offers text or Studio
tlgimenes Oct 2, 2026
dcea55e
docs: step 3: edit the file in a text editor or in Studio
tlgimenes Oct 2, 2026
baabf98
docs: step 3: edit the file via a text or Studio editor
tlgimenes Oct 2, 2026
4c6915d
docs: step 4: your usual CI deploys the change
tlgimenes Oct 2, 2026
e53b3bf
docs: hosted publishes reach visitors within seconds
tlgimenes Oct 2, 2026
cb02961
docs: troubleshooting row says seconds too
tlgimenes Oct 2, 2026
65e2513
docs: drop the "Deco's content editor" appositive where Studio links …
tlgimenes Oct 2, 2026
19c839b
docs: Schema section "Choose widgets with JSDoc"
tlgimenes Oct 2, 2026
0d66f11
docs: Schema section "Widgets"
tlgimenes Oct 2, 2026
f359268
docs: Schema "Block pickers" becomes "Interchangeable blocks"
tlgimenes Oct 2, 2026
c0a2b32
docs: deco schema reads only the default export; data-only blocks
tlgimenes Oct 2, 2026
bd950de
docs: CLI input paths, one Studio definition, no git "checkout"
tlgimenes Oct 2, 2026
a74ffa3
docs: one .deco/ folder per app; --root on every command
tlgimenes Oct 2, 2026
5cad880
docs: the content module is .deco/content.gen.ts
tlgimenes Oct 2, 2026
5b76264
docs: .deco/index.ts is the block map; saved blocks stay in .deco/blo…
tlgimenes Oct 2, 2026
1db5fb2
docs: deco schema --check is documented as it will ship; the Roadmap …
tlgimenes Oct 2, 2026
df19f52
docs: Schema's compatibility section is a short "Backward compatibility"
tlgimenes Oct 2, 2026
0f2c05c
docs: deco check validates saved content against the code
tlgimenes Oct 2, 2026
097f2de
docs: describe the next major as it ships; deco check reads the files…
tlgimenes Oct 2, 2026
c96e5b6
docs: "Releases and drafts" concept page; content protocol moves unde…
tlgimenes Oct 2, 2026
4e09368
docs: Studio can be tested with or without an account; deco serve jus…
tlgimenes Oct 2, 2026
1fb3af8
docs: remove the Block maps page; Blocks gains "Reading the request"
tlgimenes Oct 2, 2026
c365ec3
docs: block functions stay pure
tlgimenes Oct 2, 2026
32c1f59
docs: Matchers and variants joins Core concepts, rewritten in its mold
tlgimenes Oct 2, 2026
5ddc3be
docs: introduce every concept before use, or link it at first mention
tlgimenes Oct 2, 2026
cc5933e
docs: block map links createCMS to the API reference
tlgimenes Oct 2, 2026
6d013e5
docs: fix the createCMS anchor
tlgimenes Oct 2, 2026
f411d3b
docs: Matchers and variants is about campaigns that go live on time; …
tlgimenes Oct 2, 2026
62a8f76
docs: Matchers and variants focuses on the built-ins; write your own …
tlgimenes Oct 2, 2026
6a47c34
docs: the built-in lazy block; only the chosen variant runs
tlgimenes Oct 3, 2026
125dbe1
docs: Matchers and variants goes code first: an if/else in code, then…
tlgimenes Oct 3, 2026
20a74c8
docs: tie the Matchers and variants opening to the code example
tlgimenes Oct 3, 2026
fd7089c
docs: Matchers and variants opening; a short "Why lazy?" note
tlgimenes Oct 3, 2026
b7144ae
docs: Matchers and variants opening names the feature
tlgimenes Oct 3, 2026
887a610
docs: one "Schedule a campaign" section, code then blocks
tlgimenes Oct 3, 2026
f68cae1
docs: drop the __resolveType reminder on Matchers and variants
tlgimenes Oct 3, 2026
641ae76
docs: the campaign JSON is analogous to the plain if/else
tlgimenes Oct 3, 2026
08b4eb0
docs: introduce multivariate as the built-in that evaluates the variants
tlgimenes Oct 3, 2026
ae16fc3
docs: the campaign example shows only the JSON, introduced as analogo…
tlgimenes Oct 3, 2026
1253e93
docs: teach lazy as the fix for eager variants
tlgimenes Oct 3, 2026
960d157
docs: explain matchers as the conditions Studio offers the marketing …
tlgimenes Oct 3, 2026
c70a979
docs: Matchers gets its own section; drop the Studio tabs walkthrough
tlgimenes Oct 3, 2026
7ac48dd
docs: "Lazy evaluation" heading
tlgimenes Oct 3, 2026
ccff913
docs: Matchers right after Schedule a campaign
tlgimenes Oct 3, 2026
66b856a
docs: Matchers section renamed; drop "Why it goes live on time"
tlgimenes Oct 3, 2026
94fba9e
docs: a variant is the alternate content; "Schedule with confidence"
tlgimenes Oct 3, 2026
02443cf
docs: weekday example shows only the JSON
tlgimenes Oct 3, 2026
2b2582b
docs: refactor the Websites, Production, Reference and Hosted sidebar…
tlgimenes Oct 3, 2026
6c1d4c8
docs: lighter, collaborative tone; drop "waiting on a developer" framing
tlgimenes Oct 3, 2026
8b28411
docs: rewrite the next-major docs around Blocks as a syntax; Deco CMS…
tlgimenes Oct 3, 2026
36e3c66
docs: How it works opening and "Git-based, batteries included"; analy…
tlgimenes Oct 3, 2026
3a1a80d
docs: lead into the .deco folder on Saved blocks
tlgimenes Oct 3, 2026
8bedbeb
docs: the analytics block returns settings with hosted defaults; exam…
tlgimenes Oct 3, 2026
ffbbeea
docs: How it works opens with three paragraphs; the batteries-include…
tlgimenes Oct 3, 2026
e1b01b9
docs: Deco CMS is a Git-based CMS; it has opinions on releases, draft…
tlgimenes Oct 3, 2026
4b4026d
docs: Deco CMS gives you sensible defaults
tlgimenes Oct 3, 2026
e520149
docs: Deco CMS has a built-in way to handle releases, drafts, schedul…
tlgimenes Oct 3, 2026
9540b63
docs: "the site editor" replaces "Studio"; Calling APIs moves to Cont…
tlgimenes Oct 3, 2026
0630f1c
docs(site): design isolated content delivery, rollback and draft sync
tlgimenes Oct 3, 2026
845cbbd
docs: apply the 24 roadmap decisions (secret built-in, hidden blocks,…
tlgimenes Oct 3, 2026
090719a
docs(site): complete Studio implementation handoff and roadmap links
tlgimenes Oct 3, 2026
c2dce67
roadmap: no Deferred<T> or BlockList; legacy Lazy wrappers are unwrapped
tlgimenes Oct 3, 2026
59decd5
docs: uploads live in public/assets, not .deco
tlgimenes Oct 3, 2026
850f41f
docs: apply the v8 conformance decisions (splat, no binding metrics, …
tlgimenes Oct 3, 2026
4a8f518
docs: the local site editor lives at /site-editor
tlgimenes Oct 3, 2026
24edf6f
docs: /site-editor opens in Studio's app layout; deco serve --preview…
tlgimenes Oct 3, 2026
16e25fc
docs: v8 has no framework bindings; caching and KV loading are templa…
tlgimenes Oct 3, 2026
8abc4ac
docs(next): migration is an agent skill; package tree is blocks + apps-*
tlgimenes Oct 3, 2026
0908380
docs(next): install @decocms/blocks@^8.1 and bun install the blocks c…
tlgimenes Oct 3, 2026
e5e2369
docs(next): preview draft overlays with file-level draft wins
tlgimenes Oct 4, 2026
d4f96c0
docs(next): preview a variant through the draft pointer; content-relo…
tlgimenes Oct 4, 2026
5c150ad
docs(next): draft grants expire on warm servers too; hosted pointer l…
tlgimenes Oct 4, 2026
b5ca7ff
docs(next): no preview-only servers; who may preview is the app's rule
tlgimenes Oct 5, 2026
0bb26e4
docs(next): @format on a type alias; migration unwraps async-renderin…
tlgimenes Oct 5, 2026
adf26da
docs(next): one CMS settings block replaces the telemetry and analyti…
tlgimenes Oct 5, 2026
d04c444
docs(next): deco serve has no token
tlgimenes Oct 5, 2026
4812948
docs(next): deco serve link on --host, refused origins are logged
tlgimenes Oct 5, 2026
5b37074
docs(next): rename the Telemetry & analytics sidebar group to Monitoring
tlgimenes Oct 5, 2026
ffec8f1
docs(next): per-call block maps, settings across updates, host edge c…
tlgimenes Oct 5, 2026
7d3b78a
docs: deco serve answers any origin; drop --allow-origin
tlgimenes Oct 5, 2026
695bf96
docs(cli): deco serve's address is localhost
tlgimenes Oct 5, 2026
befb394
docs(content-protocol): no schema yet is schema: null, not NotFound
tlgimenes Oct 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .cursor/skills/deco-site-memory-debugging/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ process slowly accumulating garbage.

1. **`exceededMemory` / `exceededCpu` outcomes**, captured 100% by the tail
worker (`deco-otel-tail`) and landing in ClickHouse `otel_logs` with
`Attributes['_source'] = 'tail-worker'`. See `docs/observability.md`,
`Attributes['_source'] = 'tail-worker'`. See `notes/observability.md`,
"Error capture — three-channel model".

```sql
Expand All @@ -91,7 +91,7 @@ process slowly accumulating garbage.
```

Requires the site to have adopted the tail worker per
`docs/tail-worker-recipe.md` (check `tail_consumers` in the site's
`notes/tail-worker-recipe.md` (check `tail_consumers` in the site's
`wrangler.jsonc` first). If it hasn't, this query returns nothing —
either onboard the recipe or fall back to the Cloudflare dashboard's
own per-Worker Metrics panel, which shows exceeded-limit invocation
Expand Down
6 changes: 3 additions & 3 deletions .cursor/skills/deco-site-scaling-tuning/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,15 @@ description: LEGACY. Discover optimal autoscaling parameters for a Deno/Fresh De
> stack that plays the role this skill's methodology (find the CPU/
> concurrency inflection point, pick a scaling target) was built for — the
> closest current concern, per-request CPU/memory limit exhaustion, is a
> capacity/correctness problem handled via `docs/observability.md`'s
> capacity/correctness problem handled via `notes/observability.md`'s
> tail-worker error-capture path (`exceededCpu`/`exceededMemory` outcomes),
> not a scaling-parameter tuning problem.
>
> If you're looking at a current `@decocms/tanstack` or `@decocms/nextjs`
> site and traffic/latency/cost seems off, this skill's `kubectl`/Prometheus
> commands will simply fail (no cluster, no namespace, no Knative CRDs) —
> that is expected. Use `docs/observability.md` and
> `docs/tail-worker-recipe.md` instead. Only use this skill if you are
> that is expected. Use `notes/observability.md` and
> `notes/tail-worker-recipe.md` instead. Only use this skill if you are
> specifically debugging one of the remaining Deno/Kubernetes-hosted Deco
> sites outside this package split.

Expand Down
105 changes: 105 additions & 0 deletions .github/workflows/pages.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
name: Docs site

# Builds the Deco Blocks docs site (docs/: TanStack Start + MDX, prerendered to static HTML,
# with a Pagefind search index). docs/ is a standalone Bun package with its own bun.lock, so
# every step runs in docs/.
#
# - Pull requests that touch docs/: check, build, then upload docs/dist/client as the workflow
# artifact "docs-site". It's built for the root path; to view it, unzip it and serve the
# folder with any static server that maps /x to x.html (or copy it into docs/dist/client and
# run `bun run preview`). Nothing is deployed.
# - Pushes to main that touch docs/, and manual runs on main: check, build for the /blocks/
# base path GitHub Pages serves this repository under, then deploy docs/dist/client to
# GitHub Pages. Only decocms/blocks's main branch deploys (a manual run on another branch,
# or a fork, only builds). Needs Pages enabled with "GitHub Actions" as its source
# (Settings > Pages); until then the deploy job fails, and nothing else depends on it.

on:
pull_request:
paths:
- "docs/**"
- ".github/workflows/pages.yml"
push:
branches: [main]
paths:
- "docs/**"
- ".github/workflows/pages.yml"
workflow_dispatch:

permissions:
contents: read

# One deploy at a time, never cancelled midway; a newer push to a PR
# cancels that PR's older preview build.
concurrency:
group: ${{ github.event_name == 'pull_request' && format('docs-site-preview-{0}', github.ref) || 'docs-site-pages' }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

jobs:
build:
runs-on: ubuntu-latest
defaults:
run:
working-directory: docs
env:
# Pages serves the repository at https://<owner>.github.io/blocks/; previews build for /.
BASE_PATH: ${{ github.event_name != 'pull_request' && github.ref == 'refs/heads/main' && github.repository == 'decocms/blocks' && '/blocks/' || '/' }}
steps:
- uses: actions/checkout@v7
with:
persist-credentials: false

# `vite build` (and its prerender) runs under Node: the vite bin is `#!/usr/bin/env node`, and
# TanStack Start needs Node >= 22.12 (docs/package.json "engines"). Bun installs and runs
# the scripts; pin Node so the build doesn't depend on whatever the runner has.
- uses: actions/setup-node@v4
with:
node-version: 22

# Same Bun as the rest of the repo (package.json "packageManager").
- uses: oven-sh/setup-bun@v2
with:
bun-version: 1.3.5

- name: Install
run: bun install --frozen-lockfile

- name: Check (types, content, Roadmap data)
run: bun run check

# vite build (prerenders every page), then 404.html, the link check and the Pagefind index.
- name: Build docs/dist/client
run: bun run build

- name: Upload the preview (pull requests)
if: github.event_name == 'pull_request'
uses: actions/upload-artifact@v7
with:
name: docs-site
path: docs/dist/client
if-no-files-found: error
retention-days: 14

- name: Upload the Pages artifact
if: github.event_name != 'pull_request' && github.ref == 'refs/heads/main' && github.repository == 'decocms/blocks'
uses: actions/upload-pages-artifact@v5
with:
path: docs/dist/client

deploy:
if: github.event_name != 'pull_request' && github.ref == 'refs/heads/main' && github.repository == 'decocms/blocks'

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BLOCKER: merging publishes the site right away. Your 'Before going public' checklist doesn't gate anything.

The description and the header comment (lines 14-15) say the deploy job fails until Pages is enabled. Pages is already enabled. GET repos/decocms/blocks/pages returns build_type: workflow, public: true, html_url: https://decocms.github.io/blocks/. The github-pages environment allows main. The URL returns 404 today, so nothing has been published yet.

What happens: the squash-merge is a push to main that touches docs/**. That runs build, then this job, then deploy-pages. The whole site goes public on merge, including the next-major API and the FastStore storefront migration plan. Three items on your checklist are still unticked: reviewing the anonymized FastStore content, deciding whether to announce the unreleased next major, and applying the docs corrections.

Suggested fix, either of:

  1. Finish and tick those items before merging. Then the workflow can stay as it is.
  2. Gate the deploy so merging and publishing are separate steps. For example, add && vars.DOCS_PAGES_DEPLOY == 'true' to this if: and to the 'Upload the Pages artifact' step, and set the variable once the decisions are made. Also update the comment on lines 14-15 so it no longer says the job fails.

needs: build
runs-on: ubuntu-latest
permissions:
pages: write
id-token: write
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
# The build hardcodes the /blocks/ base path, so nothing uses this step's outputs; it
# checks Pages is set up before deploying.
- uses: actions/configure-pages@v6

- id: deployment
uses: actions/deploy-pages@v5
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ Keys are **per deployment id** (commit sha), never a single mutable pointer —

`decoVitePlugin` additionally stubs `blocks.gen` out of the server bundle so the KV copy is the isolate's only one, which is the fix for the decofile being resident three times (bundled graph + KV graph + escaped JSON string ≈ 27MB for a 9.2MB decofile, against a 128MB cap with no GC knob). **In that mode the bundled snapshot is not a fallback** — `ensureBlocksHydrated` 5xxs rather than serve an empty site the edge would cache. So it is gated on the deploy pipeline declaring it seeds `decofile:<id>` before activation (`DECO_SEEDED_DEPLOY`, default `fastDeploy: "auto"`); CF Workers Builds and a manual `wrangler deploy` never declare it and keep the bundled snapshot.

This is deliberately **not** available in `@decocms/nextjs` — edge KV + Cloudflare Workers caching is a `tanstack`-specific concern, not something `next`'s Node/RSC target needs or should carry. Read path: `packages/blocks/src/cms/blockSource.ts`, `packages/blocks-admin/src/admin/decofile.ts` (`setFastDeployKVGetter` — dependency injection so `admin` doesn't need a hard KV dependency), `packages/tanstack/src/setupFastDeploy.ts`. Full guide + cross-repo contracts: [`docs/fast-deploy.md`](./docs/fast-deploy.md).
This is deliberately **not** available in `@decocms/nextjs` — edge KV + Cloudflare Workers caching is a `tanstack`-specific concern, not something `next`'s Node/RSC target needs or should carry. Read path: `packages/blocks/src/cms/blockSource.ts`, `packages/blocks-admin/src/admin/decofile.ts` (`setFastDeployKVGetter` — dependency injection so `admin` doesn't need a hard KV dependency), `packages/tanstack/src/setupFastDeploy.ts`. Full guide + cross-repo contracts: [`notes/fast-deploy.md`](./notes/fast-deploy.md).

## Admin Protocol

Expand Down
4 changes: 2 additions & 2 deletions FRAMEWORK_TODO.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ Issues and feature gaps discovered during real site migration work. Trimmed duri

### `useScript(fn)` hydration mismatch warning — still present
- `useScript` calls `fn.toString()`, which produces different output in SSR vs. client builds (minification, variable renaming). The `[useScript] Using fn.toString() for "..."` warning still fires in real dev sessions (confirmed live in production storefront dev logs during the Next.js/split-package migration work).
- **Ideal**: ship `inlineScript(str)` accepting a plain string constant, or make `useScript` stable across builds. See also `docs/next-steps-tanstack-native.md`'s proposal #2, which covers the same gap in more detail — don't build both independently.
- **Ideal**: ship `inlineScript(str)` accepting a plain string constant, or make `useScript` stable across builds. See also `notes/next-steps-tanstack-native.md`'s proposal #2, which covers the same gap in more detail — don't build both independently.

### Route files are still boilerplate
- `__root.tsx`, `index.tsx`, `$.tsx`, `deco/meta.ts`, `deco/invoke.$.ts`, `deco/render.ts` are scaffolded identically per site by the migration script.
Expand Down Expand Up @@ -74,7 +74,7 @@ Issues and feature gaps discovered during real site migration work. Trimmed duri

## Fast Deploy (KV-first content) — cross-repo follow-ups

Framework + CI scripts for fast-deploy landed in this repo (see [`docs/fast-deploy.md`](./docs/fast-deploy.md)). Remaining work lives in **other** repos:
Framework + CI scripts for fast-deploy landed in this repo (see [`notes/fast-deploy.md`](./notes/fast-deploy.md)). Remaining work lives in **other** repos:

- **admin.deco.cx (Studio)**: publish a delta envelope to `/.decofile` + call `/_cache/purge`; gate on a per-site `fast_deploy_enabled` capability; dispatch the deco-sync-bot commit off the critical path.
- **Site CI**: provision a KV namespace + `DECO_KV` binding; add a `sync-content-to-kv.yml` workflow; gate `deploy.yml` to code-only changes.
Expand Down
Loading