# What is supported
Next.js 16.3.6, 16.3.7, 16.3.8 and 16.4.0, App Router and Pages Router. Key:
- β works: verified in a browser or over HTTP;
- π‘ expected to work: not verified yet;
- π§ planned: not done yet; where it would otherwise fail silently, refused at install until it is;
- β not possible for a zone, and refused at install so it never fails silently.
## Routing
| | |
|---|---|
| `page`, `layout`, dynamic routes, catch-all, optional catch-all, route groups, parallel routes | β |
| `loading` (streaming), `error`, `not-found` | β |
| Intercepting routes (modals) | β |
| Route handlers (`route.ts`) | β |
| A zone's metadata routes (`/blog/sitemap.xml`, `/blog/opengraph-image`) | β (the root `/sitemap.xml` and `/robots.txt` are the shell's) |
| Mounts and [aliases](aliases.md) | β |
| The shell's `proxy.ts` in front of every zone | β |
| A zone's own `proxy.ts` | β (move its logic into the shell's proxy) |
| A zone's `headers`, `redirects`, `rewrites` (see [routing rules](routing-rules.md)) | β |
| `basePath`, `i18n`, `trailingSlash`, `assetPrefix`, `skipTrailingSlashRedirect`, `cacheComponents`, `partialPrefetching` different from the shell's | β |
## Navigation
| | |
|---|---|
| `` shell β zone and zone β zone, Back/Forward, prefetch (App Router pages) | β soft, state kept |
| `` to or from a zone's Pages Router page | β soft inside that zone; a new document to anywhere else (Next's rule between the routers; see [Zones on the Pages Router](pages-router.md)) |
| `useRouter`, `usePathname`, `useParams`, `useSearchParams`, `router.push` into another zone | β |
| `redirect()` into another zone, `notFound()` | β |
| `permanentRedirect`, `forbidden`, `unauthorized` | π‘ |
| New client code after a version swap, even for a page an open tab has cached | β (with [``](updates.md)) |
| A shared package at different versions in different zones, in one page | β each zone runs its own version ([concepts](concepts.md#the-contract-between-zones)) |
## Rendering and data
| | |
|---|---|
| Server and client components, one React | β |
| Server actions (with bound arguments) | β |
| Prerendered pages, ISR, `generateStaticParams` (with `dynamicParams` and fallback) | β |
| `revalidateTag` and `revalidatePath` across zones, `unstable_cache` | β |
| `cookies`, `headers`, `connection` | β |
| `'use cache'`, `cacheTag`, `cacheLife`, Cache Components / PPR | β (`cacheComponents` must be the same in the shell and every zone) |
| Edge runtime in a zone | π§ refused at install today (use the Node.js runtime) |
## Assets
| | |
|---|---|
| Client chunks, CSS modules | β |
| `next/font` | β |
| `next/image` with local images (imported, or from the zone's `public/`) | β |
| A zone's own `images` config (remote patternsβ¦) that differs from the shell's | π§ refused at install today (put it in the shell's config, which serves every zone). A zone with no `images` config, or the shell's, installs |
| A zone's `public/` files, under its mount | β (see [assets](assets.md)) |
## Process
| | |
|---|---|
| [Instrumentation](instrumentation.md), the shell's and each zone's | β |
| A zone's `instrumentation-client.ts` | β (put it in the shell) |
| A zone's dependencies (`serverExternalPackages` included), wherever its build is stored | β (they resolve from the shell's `node_modules`) |
| A package only in a zone's own `node_modules` (not hoisted by the workspace) | β bundled into the zone's build; π‘ as a `serverExternalPackages` entry, which must be in the shell's `node_modules` |
| Zones built with a different Next or React than the server's | β |
| Many requests at once across zones, several installs at once, and swaps under load | β |
| A shell with its own `cacheHandler` (a remote cache) | β (it keeps every key but the zones' pages, which stay per version) |
| A zone run alone (`next start`, `next dev`), with its aliases | β ([running alone](configuration.md#running-a-zone-alone)) |
| `next dev` across zones | β [`next-zones dev`](cli.md#next-zones-dev): HMR and soft navigation, every zone at once |
| Pages Router (`pages/`) in a zone: static pages, `getStaticProps` (prerendered, `fallback`, `revalidate`), `getServerSideProps`, its own `_app` and `_document`, live installs | β in every mode ([Zones on the Pages Router](pages-router.md)) |
| A zone's `pages/api/` (served at `/api/β¦`, outside its mount) | β (route handlers under the mount, `app//β¦/route.ts`, or the shell's) |
| `output: "export"` | β both modes: one static site, soft navigation between zones ([build and start](cli.md#build-and-start)) |
| `output: "standalone"` | β both modes: the folder alone is the deploy ([build and start](cli.md#build-and-start)) |
## Zone images
| | |
|---|---|
| Images entering the store by a pull from a source (HTTP, a folder, one's own), streamed and checked | β ([zone images](zones.md#zone-images)) |
| Uploading an image to Zones | β by design: endpoints only ask Zones to pull |
| Pulls on a ping, for a zone with `livePull` | β ([live pulls](zones.md#live-pulls)) |
| Images of hundreds of MB | β streamed: memory does not grow with the image |
| Images as `.zip`, and a repository's archive of a tag (one top-level folder) | β |
| Pulls over a shared link: stalls and dropped connections resumed with `Range` | β |
| service-connector as the source (`fromConnector`) | β against its documented API |
| A pull that would fill the disk | β refused before it starts, or stopped while it runs ([the disk](zones.md#the-disk)) |
| Pruning old images, automatically or on request | β ([pruning](zones.md#pruning)) |
## One app
| | |
|---|---|
| Every zone built into one Next app (`mode: "single"`), served by `next start` | β ([build and start](cli.md#build-and-start)) |
| Each zone's own `@/*` and its types, in that one app | β (types checked per zone, with its own `tsconfig`) |
| Instrumentation in that one app | β as on Zones: the shell's for every route, each zone's for its own |
| Installing a zone into it while it runs | β by design: that is what images and Zones are for |