zomg CLI, which talks to a server called zomg-api. The server manages the underlying Kubernetes and filesystem state so you work with boxes, not infrastructure.
The user-facing noun for a sandbox is box. The
--fork flag is reserved for one action: clone an existing box’s filesystem into a new box.The mental model
You create a box, run commands in it, and reach it over the web. It behaves like a fresh Linux machine: install packages, edit files, start services. The default base isbox-base (built on Ubuntu 24.04 with a standard toolbox preinstalled), and anything you write survives across stops and resumes. Publish a port and the box gets a real URL at https://<name>.zomg.ai.
Persistent filesystems
Zomg keeps box state as copy-on-write btrfs snapshots. The layers build on each other:| Layer | Role |
|---|---|
bases | Read-only template subvolumes. A new box starts from a base. |
roots | Writable btrfs snapshots created from a base — your box’s live root. |
checkpoints | Root snapshots you capture and restore. |
volumes, volume-checkpoints, volume-backups | Data-volume state for disks you mount into boxes. |
The zomg-api server
zomg-api is an HTTP server that owns the Kubernetes and btrfs state and serves interactive transports:
- REST routes under
/v1/projects/{project}/boxes/{name}for box lifecycle. - WebSocket exec at
…/exec/wsand console at…/consolefor running commands and attaching an interactive terminal. A non-WebSocketPOST …/execis also available.
Reaching boxes
Publishing a box port gives it a stable HTTPS hostname:zomg.ai is your instance’s domain — the same one you used when connecting the CLI.
The publish name comes from
--as <NAME> (or is generated when omitted) and is independent of the box’s project.Box-to-box networking
Boxes in the same project reach each other over DNS without publishing anything. Box Services are headless, so a box name resolves directly to the pod and any port is reachable:- Same project: reach another box by its bare
name. - Different project: reach it by
name.project.
Common commands
Once the CLI is connected to your instance, the everyday workflow is:zomg create:
--base/-b— start from a specific base (default base isbox-base).--fork/-f— clone an existing box’s filesystem instead of a base (cannot combine with--base).--data/-d— mount a data volume asNAME=/path[:ro|:rw].--env/-e,--cpu,--memory,--project/-p.
docs pack at https://docs.zomg.ai.
Projects
Boxes live in a project. The CLI resolves the project in this order:--project/-pflagZOMG_PROJECTenvironment variable (set automatically inside every box)- The current git repository’s top-level directory name
no project: pass --project <name>, set ZOMG_PROJECT, or run inside a git repository.
You can address a box in another project with project:box (canonical) or project.box (shorthand).
Where to next
Quickstart
Create your first box, run commands in it, and publish a page.
Boxes
The box lifecycle: create, exec, stop, resume, delete.
Environment
The runtime inside a box: filesystem layout, PID 1, DNS, and injected env vars.
Snapshots and bases
Capture box state as checkpoints and turn it into reusable bases.
Data volumes
Persistent disks you mount into one or more boxes.
Services
Run long-lived services and expose them at a public URL.