Framework compatibility matrix
Which framework, Node, and build-runner combinations the platform supports — and how each row is proven. This matrix is the source of truth: the build runner, CLI templates, and grid plug use its values. Any drift is a bug.
How to read this
Each row is a framework × Node × build-runner combination the platform claims to support. The Tested column says how:
| Label | Meaning |
|---|---|
| Automated | An automated test exercises this row through a real grid plug lifecycle nightly, and it is green. |
| Production-proven | A real production entity runs this combination today. |
| Claimed | Claimed-supported but no proof yet — risk of breakage. Tell us if you exercise this row. |
| Not supported | Known-broken or not in the build matrix — do not ship. The escape-hatch column says what to override; if blank, no workaround. |
What you can expect: every Automated and Production-proven row is a row the platform commits to keep working. If your project matches, grid plug should succeed without yaml ceremony, or with only the listed escape hatches.
The matrix
| Framework | Node minimum | Node tested | Build runner | yaml escape hatches | Tested |
|---|---|---|---|---|---|
| Next.js 15 | 18.18 | 22.x | node (server) | none | Production-proven |
| Next.js 16 | 22.0 | 22.x | node (server) | none | Production-proven |
| Astro 5 | 18.20 | 22.x | static-build | none | Production-proven |
| Astro 6 | 22.0 | 22.x | static-build | node_version: '22' | Claimed |
| Remix 2 | 18.0 | 22.x | node (server) | none | Claimed |
| Static HTML | n/a | n/a | static-build | none | Production-proven |
| Vue 3 / Vite | 20.19 | 22.x | static-build | none | Claimed |
| Express custom | 18.0 | 22.x | node (server) | port: if non-8080; build.env: if non-default | Production-proven |
| SvelteKit 2 | 18.13 | 22.x | node (server) | none | Claimed |
| Hono (Bun) | n/a (Bun) | n/a | not supported | n/a | Not supported — Bun runtime is not in the build matrix; use Node for now |
| Bun apps | n/a | n/a | not supported | n/a | Not supported — Bun runtime support is a future cycle |
| Python (Flask) | n/a (Python) | n/a | not supported | n/a | Not supported — future cycle |
| Python (FastAPI) | n/a | n/a | not supported | n/a | Not supported — future cycle |
| Go | n/a (Go) | n/a | not supported | n/a | Not supported — future cycle |
| Java / Kotlin | n/a | n/a | not supported | n/a | Not supported — future cycle |
What "supported" means
A row is claimed-supported if all three hold:
grid plugsucceeds end-to-end (build → push → deploy → serving) using justcloudgrid.yamlplus the listed escape hatches — no manual Kubernetes edits.- The deploy-error translator maps the framework's common failure modes (e.g.
EBADENGINE) to a plain-language message with suggested fixes. - The row is exercised — by a production entity, an automated nightly test, or a recent manual rehearsal. Claimed rows decay to Not supported after 90 days without exercise.
A row is not supported if any of the above is false. If you attempt an unsupported row, you get a plain error plus a pointer to this matrix.
Escape-hatch reference
Set these in cloudgrid.yaml per service:
| Field | Type | Purpose | Default |
|---|---|---|---|
services.<name>.node_version | '18' | '20' | '22' | '24' | Override the build runner's Node version (static type only; quote the value) | '22' (current LTS) |
services.<name>.port | number (1024–65535) | Container port if non-8080 | 8080 |
services.<name>.build.env | string-to-string map | Build-time env vars (Astro public keys, Next.js inline configs) | {} |
See the deploy contract for what the platform decides on every row, and for smart defaults the platform reads from your package.json.
Keeping it current
The matrix is reviewed every release cycle: rows that haven't been exercised are downgraded, and Not-supported rows close when runtime support arrives. Automated rows are re-verified nightly; a row that regresses is demoted.