features
a small contract
An app runs on boxx if it's a Docker image, listens for HTTP on port 80 and answers GET /up with a 2xx. Public or private registry.
https for every hostname
Caddy sits in front and gets a Let's Encrypt certificate per hostname. Give an app several hostnames, redirect www to the primary, or add a wildcard and read the Host header to tell tenants apart.
$ boxx install <image> --host example.com --redirect-host www.example.com
zero-downtime deploys
The new container starts beside the old one. Once GET /up returns 2xx, the proxy switches over and the old container drains before it's removed.
databases on request
Pick none, MySQL or Postgres at install. boxx runs it on a private Docker network, generates the credentials and hands your app DATABASE_URL. boxx db forward opens a local port for your tools.
storage that survives
Each app gets a Docker volume at /storage. It survives redeploys and image changes. boxx remove deletes it unless you pass --keep-data.
groups
Put several apps behind one hostname, routed by path, with one shared database for the group.
updates on your terms
Each app has an update policy: off, notify or auto. A systemd timer checks the registry, and boxx upgrade updates boxx itself.
one operation at a time
Operations take a lock and write to an ops log you can open from the TUI with L, so two deploys never collide. boxx doctor checks the host.