Deploy a Next.js site
From npx create-next-app to a live URL in twenty lines of shell.
This guide takes a fresh Next.js App Router project and puts it on the public LILY fleet. No Dockerfile. No CI config. No platform settings to click through. The whole loop is one CLI plus your editor.
You need lly installed and authenticated. If you have not run install and lly login yet, do that first.
1. Scaffold
Use the official Next.js scaffolder. Pick the App Router, TypeScript, Tailwind — whatever you want. LILY treats the project as-is.
2. Install the plugin
The Next.js frontend ships as a plugin, not as part of the core CLI. Install it once per machine. It registers under lly nextjs.
Confirm the install with lly plugin list or inspect the full surface at lly nextjs.
3. Build the void
A void packs your whole Next.js project — server, routes, static assets — into one brick. The brick is a self-contained WASM bundle that runs anywhere the LILY runtime runs. There is no separate Node process, no next start, no sidecar.
The output is a single file, ./void.brick. You can inspect it with lly bundle inspect ./void.brick to see routes, asset map, and module list.
4. Deploy
lly void manages placements on the public fleet. One command uploads the brick, registers ownership against your signed-in account, and asks Raptor to schedule it onto a CAP. You get a live URL back.
The slug — here lazy-fox — is the public handle for this placement. Use it for logs, kills, and inspection. The HTTPS certificate is provisioned automatically.
5. Iterate
The deploy loop is the same three commands every time. Edit a page, rebuild the void, re-deploy. Existing placements with the same slug are replaced atomically with under a second of drain.
The second build is faster because the route graph and the hydration bundle are content-addressed in ~/.cache/lly/. Unchanged chunks are reused.
6. Logs
Tail stdout and stderr from the running placement. Logs stream through Raptor over a persistent connection.
Add --follow to stream continuously. Add --since 1hfor a window. See lly void for the full set of log flags.
7. Tear down
When you are done, kill the placement. The brick is unloaded from the CAP, the slug is released back to the pool, and the DNS entry is retired within a few seconds.
That is the whole loop. Scaffold, install the plugin, build the void, deploy, iterate, log, kill. For the per-command reference see lly nextjs and lly void.