How it works · the box
The box
A box is a machine. One person's, always on, 16 GB, at an address named for them. Everything you do with Bettik happens on it: your environments run there, the workbench is there, Claude's sessions run there. It is not shared with anyone.
Its names
home.<handle>- The box's name: a short name, then your handle. Its page on the dashboard is
/dashboard/boxes/<box>. <environment>.home.<handle>.bettik.dev- Each environment's address. The environment's name in front, then the box's name.
public.home.<handle>.bettik.dev- The box's public folder,
~/public, open to anyone with a file's link (how). home.<handle>.bettik.dev- The machine itself, for ssh.
<box>@is the workbench;root@is the host. box: "<box>"- How Claude names it when a tool call needs to say which box. With one box, it never has to.
Your first box is called home. Another gets a short name of its own — dev becomes dev.<handle> — and its environments answer under it: catan.dev.<handle>.bettik.dev. A box that belongs to an organisation has the organisation's name where your handle would be.
What is on it
Three kinds of thing, kept apart on purpose.
The workbench, once. A container holding the tooling — shell, editor connection, git, node, psql, tmux, Claude Code — with every environment's directory mounted under ~/environments. This is where you and your sessions work.
Its services, built in: nothing to install, and they update with the box.
- A browser, Google Chrome, that sessions drive and you watch, with your own logins kept in a context of their own.
- A public folder,
~/public: a file in it opens for anyone with its link. - A messaging gateway: something outside the box posts a message to a topic, and the sessions subscribed to it get it.
- A scheduler: timers that post to a gateway topic on time, so a session can do something at 7:30 every weekday.
Running environments, as many as fit. Each is a small set of containers — a runtime and the services beside it — running a directory the workbench can see. No editor in an environment, no agent, no terminal: those are in the workbench. That is what keeps an environment light enough to clone in seconds.
Nothing else. Your templates belong to your account, not the box.
Your home directory in the workbench is on the box's data disk and survives restarts, updates and rebuilds. Nothing outside it does — the workbench container is rebuilt from time to time and your home comes back as it was.
Memory is the limit
Sixteen gigabytes, and a development machine spends it differently from a server: a running environment holds a runtime and a database resident, a build spikes, and an agent is the hungriest process of all. The box's page shows a dial; environment_status opens with the number; every environment's row says its share.
Starting an environment asks about room, not a count. Under 75% used, it just starts. Above that, the box answers with a question — how full it is, and which running environment has been idle longest — and the session puts it to you: stop that one, or confirm and go ahead. Under a gigabyte free is a refusal. Stopped environments hold nothing; there is a guardrail of twenty active environments that nobody reaches in a day's work.
Disk fills from the inside
Environments, images, build caches and every container's scratch share the data disk, and a session can fill it -- a repository whose image is large, a browser downloading into its own container. When it does, the tool that hit the wall says which disk and how full, environment_status shows the same line under memory, and prune_box gets space back from inside the session -- or Prune cache, at the bottom of the box's Environments tab: the build cache, the images nothing refers to, and cached template versions older than the newest of their name, and nothing else. No environment, running or stopped, loses anything to it; the next build is slower, and an install of an older version fetches it again. What it leaves is freed by removing environments: save one first with save_environment if you want it back, then destroy_environment.
Updates are yours
Bettik ships releases, and the box's page on the dashboard shows update available with a button; Claude has update_box. One that changes nothing you would notice lands on its own. One that restarts the workbench — ending its Claude sessions and terminals; environments keep running — lands on its own once nobody is working on the box, usually overnight. To have those wait for you instead, tick Only restart for an update when I press Update on the box's Settings. One that needs a new machine is never an update: the page says reimage needed.
You
Is there an update for my box?
Bettik
Running 2026.09.15-a6786b; 2026.09.17-c0ffee is available (as of 09:14). Call again with confirm: true to take it.
A release that fails to install rolls itself back. There is no button on our side that forces one onto you.
Keys, tokens, and what reaches the box
Two things set on the box's own settings page are put on it, and kept there:
- SSH keys, so
sshand VS Code Remote SSH open the machine. A new box can copy the SSH keys, env vars and Claude settings of another box of yours, in any account, or of box settings you keep, when it is made. - Its env vars, within a minute of setting them, in every workbench shell. Define
GH_TOKENandgitandghare already signed in.
Inbound, the box accepts no HTTP at all. An environment's traffic comes through a tunnel the box opens to Cloudflare, and a gate on the box checks who you are before anything reaches an environment; Cloudflare carries the requests and decides nothing. That is why an environment's address opens for you and for nobody else, and why you never have to expose a port. ssh goes straight to the machine.
Creating and destroying
Your account has a limit on boxes, one to start with. Within it, a box is a form on the Boxes page or create_box from Claude — the one tool that needs no box, because it makes one. About six minutes.
Destroying a box deletes the machine and everything on it: every running environment and its data. Your templates are not on the box, so they stay, ready to install on the next one — which is what makes destroy-and-recreate a reset rather than a loss. It is done from the dashboard with the name typed back, or with destroy_box from a session that is not on that box.
Its page on the dashboard
Everything about a box is on its page, /dashboard/boxes/<box>, reached from the Boxes page. The memory and disk dials stay beside every tab.
- Overview: the workbench's ssh target, the release with a button to take a newer one, and restarts; then the Services, one card each: the browser with its live view and a page of its contexts and who used them lately, the public folder with how many files are shared and its two lists, the gateway with its topics and who gets them, and the timers, which you can pause, resume or remove there. And, until it is done, the one thing that stops the box being useful: signing Claude Code in, on the Claude Code card.
- Environments: each environment with its address, who holds it, and a button to make it public or private again.
- Env vars and Settings: the tokens your environments need, and the box's keys, Claude settings and the machine itself.