Detect & ship
Look at package.json, vite.config.*,
next.config.*, index.html.
- Plain HTML → upload those files (Drop, CLI, MCP).
-
Bundler app →
npm run build, then upload output only (dist/,out/,build/).
Never upload src/, node_modules, or
.next/. The hosted CLI auto-picks common output
folders — CLI guide.
Plain HTML
aft deploy
# or Drop a folder / zip with index.html
Live: hello.aft.page.
README-only (no index.html): / is 404;
the file is at /README.md.
Vite / React / Vue / Svelte / Astro
npm run build
aft deploy # uses dist/
# aft deploy dist
Example:
vite-hello.aft.page.
CRA / Rsbuild usually emit build/ or
dist/.
Next.js static export
In next.config set output: 'export', then:
npm run build
aft deploy out
This is static hosting only — no Next server in the Worker unless you use the upstream path below.
Next SSR / OpenNext
Deploy the Worker with OpenNext (or any HTTP upstream), then
register it with aft via aft.json:
{
"name": "next-hello",
"runtime": "next",
"upstream": "https://your-worker.example.workers.dev"
}
Live dogfood: next-hello.aft.page. aft.page does not build or deploy the Worker for you yet.
Not supported yet
Automatic build in our cloud, in-Worker Next SSR without your own
upstream, Django/Flask/Express containers, and most SSR frameworks
without a customer-supplied HTTP runtime. Compatibility target:
repo docs/FRAMEWORK-COMPATIBILITY.md.