webhouse.appwebhouse.appdocs

Download the webhouse.app CMS admin server as a tarball or Docker image. Weekly auto-builds + tagged stable releases.

Download channels

webhouse.app ships the admin server through two channels — pick whichever fits your setup.

Stable (tagged)

Cut manually when a milestone lands. Tracked under :latest.

Weekly (automated)

Every Monday at 16:00 UTC. Skipped if there are no commits since the previous weekly. Always points to the HEAD of main as of build time.

What's in the tarball

A pre-built Next.js standalone bundle — not source code you need to pnpm install, not something you run with next start. It's a self-contained server:

cms-admin-2026.04.20/
  run.sh                           # convenience wrapper
  packages/cms-admin/
    server.js                      # entry point — a Next.js standalone server
    .next/static/                  # compiled assets
    public/                        # public files
    node_modules/                  # minimal deps (already resolved)

Enabled via output: "standalone" in next.config.ts. You run it with node server.js — the next CLI is not installed and not needed. Total size ~50–100 MB vs. ~500 MB for a full pnpm install + next start setup.

Quality gate: every release is typechecked and tested in GitHub Actions before the tarball is built. If typecheck or tests fail, the release does not ship.

Quick start — tarball

Requires Node.js 22 or newer. Works on Linux, macOS, and Windows (WSL or Git Bash).

bash
curl -L https://github.com/webhousecode/cms/releases/latest/download/cms-admin.tar.gz | tar xz
cd cms-admin-*
./run.sh

Under the hood run.sh does:

bash
cd packages/cms-admin
export PORT="${PORT:-3010}"
export HOSTNAME="${HOSTNAME:-0.0.0.0}"
exec node server.js

Visit http://localhost:3010 and complete the setup wizard — you create the first admin account interactively (email + password). There is no default user or password.

Environment variables

Override the defaults with env vars before ./run.sh:

VarDefaultPurpose
PORT3010Listen port
HOSTNAME0.0.0.0Bind address
ADMIN_EMAILAuto-create admin on first boot
ADMIN_PASSWORDauto-generatedIf ADMIN_EMAIL is set without a password, one is generated and logged to stdout
CMS_CONFIG_PATHPath or github://owner/repo URI of a site's cms.config.ts

Quick start — Docker

bash
docker run -p 3010:3010 -v $(pwd):/site \
  -e ADMIN_EMAIL=you@example.com \
  ghcr.io/webhousecode/cms-admin:latest

Multi-platform (linux/amd64, linux/arm64) so it runs on Intel Macs, Apple Silicon, and typical server CPUs. The image bakes in the same standalone bundle as the tarball.

Choosing stable vs. weekly

StableWeekly
CadenceEvery 2–4 weeksEvery Monday (if there are changes)
Breaking changesDocumented in release notesOnly communicated if intentional
Recommended forProduction self-hostedHobby projects, early adopters, local dev
RollbackPin to any past vX.Y.Z tagPin to any past YYYY.MM.DD tag

Both channels are functionally the same build — weekly just ships more often.

Cutting a stable release (maintainer only)

bash
git tag -a v0.3.0 -m "Feature summary"
git push origin v0.3.0

That fires the release-stable GitHub Actions workflow, which builds the tarball, pushes the Docker image to GHCR, and creates a permanent GitHub Release marked as latest.

Troubleshooting

run.sh: command not found — you're on Windows CMD/PowerShell. Use cd cms-admin-* && cd packages/cms-admin && node server.js, or run from WSL / Git Bash.

Port already in use — override with PORT=4010 ./run.sh.

Can't reach the server from another machine on the LAN — set HOSTNAME=0.0.0.0 (default already).

Want to run from source with hot reload? That's a different path — clone the repo and pnpm dev instead. The tarball is a production-style build, no file watching.

  • Deploy settings — provider config for publishing SITES (different from the admin server itself)
  • Fly.io Live — volume-backed site deploys
  • ICD — content sync to running Next.js sites
Tags:Deploy: DockerMigrationArchitecture
Previous
Instant Content Deployment (ICD)
Next
Fly.io Live — instant content deploys
JSON API →Edit on GitHub →