Deploying

There are two ways to ship: build from source with git push, or deploy a prebuilt image.

Git push

Each app is a bare git repo on the platform. Add it as a remote, then every push builds your root Dockerfile into an image and boots it as a microVM — you watch the build live in your terminal.

Dockerfile
FROM oven/bun:alpine
WORKDIR /app
COPY . .
RUN bun install
CMD ["bun", "run", "src/server.ts"]

Your app should listen on the PORT environment variable (Tower sets it; default 8080).

src/server.ts
Bun.serve({ port: Number(process.env.PORT ?? 8080), fetch })

Prebuilt image

shell
wess deploy blog --image ghcr.io/you/blog:latest --port 8080

The --port sticks and is reused on later deploys.

Rolling redeploys

Every deploy is rolling: a new machine boots with your new build, the app's status flips to it, and the previous machine is retired. The app's URL never changes.