🚀 Static sites in seconds
Served straight from disk, live the moment the upload finishes. Even a single .html file works; it becomes the index automatically.
Self-hosted mini-PaaS
Zip a project — or run one command — and it’s live on your own server. Static sites and Dockerfile apps, with rollback, encrypted env vars and team accounts built in.
Served straight from disk, live the moment the upload finishes. Even a single .html file works; it becomes the index automatically.
If there’s a Dockerfile in the zip, the image is built and run as a container, routed automatically, with a dedicated port included.
Every app keeps its last 5 releases. Jump back to one from the dashboard or with arcturus rollback.
Per-app environment variables, stored AES-256-GCM encrypted in SQLite. Saving them recreates the container right away — no rebuild.
Apps run on a separate origin, so one can’t ride your dashboard session. Containers are locked down, logins are rate-limited, and logout kills the session on the server.
The dashboard and API swap blue-green behind an ingress, so :7777 and :7778 keep answering while you ship.
The admin hands out invite links; everyone manages their own apps. Share an app as view or manage — and a manage teammate can deploy to it too.
The dashboard, API messages, and the CLI all speak both, following the browser or the ARCTURUS_LANG setting.
Path-prefix proxying (/alice/blog) breaks apps that reference assets by absolute path. Arcturus layers three remedies, so things just work:
X-Forwarded-PrefixApps with a configurable base path work as-is — the gateway strips the prefix and tells the app where it lives.
Unmatched requests like /static/app.js are re-routed to the app the browser is currently viewing.
Every container app keeps a fixed port (30000+) with zero base-path issues. New container apps default to “redirect” — visitors are bounced straight to it. The port is auto-assigned, or pick your own from Port settings.
The gateway serves the installer and platform binaries itself — your server is the distribution channel:
$ curl -fsSL http://<host>:7777/install.sh | sh
| Command | What it does |
|---|---|
| arcturus login --server … --token … | Authenticate (token from Dashboard → API Tokens) |
| arcturus deploy | Zip the current directory and deploy (Dockerfile → container) |
| arcturus apps | List your apps |
| arcturus deployments <app> | History, with live / rollbackable markers |
| arcturus rollback <app> <id> | Restore a previous release |
| arcturus env <app> --set K=V | Env vars — recreates the container, no rebuild |
| arcturus logs <app> | Follow container logs |
| arcturus destroy <app> | Delete the app |
Pin an app name per project with arcturus.json: { "name": "my-app" }
Clone, run one script — it installs dependencies, builds the dashboard and starts everything under pm2. Open http://<host>:7777 and you’re in.
On the first run you’re asked to set the admin password right in the terminal.
$ git clone https://github.com/chussum/arcturus.git && cd arcturus $ bun run server:up ✦ install → build → start (pm2) ✦ first run asks for the admin password
# optional hardening (macOS) — plaintext keys → encrypted .env.secrets + Keychain $ bun run secrets:init ✦ change a secret later → bun run secrets:update ✦ details → guide
SQLite via Drizzle — repositories sit behind ports, so PostgreSQL is a module swap. Docker via dockerode behind a ContainerRuntime port. Static releases live in versioned directories; container releases are per-deployment image tags.