Compatibility matrix
Honest, evidence-gated status of what the knext adapter supports.
Honest, evidence-gated status of what the knext adapter supports. Every row is grounded in real, on-disk evidence and a mechanical guard test fails CI if a ✅ ("supported") row cannot be backed up. When in doubt it is marked ⚠️, not ✅.
This is NOT a claim that knext passes the official Next.js compatibility suite. That suite (the
vercel/next.js deploy-test harness) is not wired green yet. Until it runs green nightly, no row
here may say "official suite ✅".
Legend
| Marker | Meaning |
|---|---|
| ✅ | Supported — backed by a red-on-fail check (the per-PR compat-smoke gate) or test-covered source on disk. |
| ⚠️ | Partial — implemented but not guarded by a hard correctness check, or with a known caveat. Do not rely on it as "verified." |
| ❌ | Unsupported / unverified — no working implementation or no evidence; treat as a gap. |
| ⛔ | Upstream-gated — architecturally out of reach today (global edge, not yet adapter-standardizable upstream). |
The compat-smoke job runs per-PR on a Node + Bun matrix. It is a knext smoke gate, not the
official suite.
Matrix
| Feature | Status | Notes |
|---|---|---|
App Router (RSC server render, GET / → 200 HTML) | ✅ | Hard-asserts 200 + text/html + non-trivial body against the standalone server.js. |
RSC flight payload (RSC: 1 → text/x-component) | ✅ | Hard-asserts the React flight content-type. |
Route handlers (app/api/*/route.ts) | ✅ | Hard-asserts GET /api/health → 200 + valid JSON. |
Dynamic routes (force-dynamic) | ✅ | Hard-asserts 200 on a force-dynamic route. |
Static / prerendered routes (force-static) | ✅ | Hard-asserts 200 on a force-static route. |
| Middleware (Node runtime, header injection) | ✅ | Hard-asserts a middleware-injected header. Node-runtime middleware only. |
| Graceful shutdown (SIGTERM drain) | ✅ | Unit-tested drain-on-SIGTERM in the standalone runtime. Not yet exercised end-to-end by compat-smoke. |
| ISR / Data Cache (Redis-backed cache handler) | ⚠️ | Redis cache handler, not GCS. compat-smoke runs with REDIS_URL="" (in-memory fallback) and has no revalidate/ISR-freshness assertion, so ISR correctness is unverified by the gate. |
next/image optimization (sharp, avif/webp) | ⚠️ | Implementation landed, but the compat-smoke image check is skip-on-fail, not a hard gate — so the matrix does not mark this ✅. |
Server Actions ('use server' mutations) | ⚠️ | Server Actions exist in the app, but no compat-smoke or unit assertion exercises a round-trip. Configured, not verified. |
| Streaming / Suspense (incremental flush) | ❌ | No streaming/Suspense flush assertion and no other evidence. Planned, not built. |
| Edge Middleware (edge runtime) | ⛔ | Upstream-gated: edge-runtime middleware is not yet adapter-standardizable on Knative; knext middleware runs on the Node runtime only. |
| PPR / Cache Components | ⛔ | Upstream-gated: Partial Prerendering / Cache Components are not yet adapter-standardizable. |
| Official Next.js compatibility suite | ❌ | Scaffolded, running nightly, NOT yet green. The nightly job runs a REAL partial subset of the vercel/next.js deploy-test harness — it does not pass the full suite. Status stays ❌ until a green nightly. No row may claim official ✅ until then. |
Maintenance & honesty
- Every ✅ is mechanically gated. A guard test parses the table and fails CI if a ✅ row's
evidence does not resolve to a real on-disk file, a hard
compat-smokecheck, or thecompat-smokeCI job. It forbids marking the official suite ✅ while it is not yet green, and forbids citing the skip-on-failnext/imagecheck as proof of a ✅. - The official-suite claim stays unverified for now. Only after the full
vercel/next.jsdeploy-test harness is green nightly may any doc say knext "passes the official Next.js adapter compatibility suite." knext does not yet claim official verified-adapter status; this matrix is a smoke-gated honesty ledger in the meantime.
This page mirrors the CI-guarded compatibility matrix in the knext source repository, which is the canonical source. If the two ever diverge, the source-repo file wins.