Configuration reference
bb-box’s configuration is one document (029): bb box config show --json prints it, and bb box config apply <file> saves one. BB Box’s settings page edits the same document. A secret field reads { "set": true } in an export, and takes a string to set it.
The document
| Key | Type | Default | What it is |
|---|---|---|---|
schema |
typeof SCHEMA |
The document’s format: 1. | |
revision |
number |
Counts each save. A file applied with a revision is refused when the configuration has changed since. | |
backends |
readonly BackendConfig[] |
In the order the registry tries them. | |
kinds |
Readonly<Record<string, KindConfig>> |
Each kind’s entry, by its ID: only what differs from its defaults. | |
general |
GeneralSettings |
Settings for every backend and kind. | |
images |
Readonly<Record<string, ImageConfig>> |
Projects’ images, by name (049). | |
monitor |
MonitorSettings |
The Monitor (066): machine status in BB’s sidebar footer, and background monitoring of BB’s server. |
Secrets
A secret’s value never leaves bb-box. Each secret field shows its state:
| Key | Type | Default | What it is |
|---|---|---|---|
set |
boolean |
Whether it has a value. In a draft, true keeps it and false clears it. | |
version |
number |
As the settings page reads the configuration, from config.get and config.apply: the revision that last set or cleared it, so the page can tell that it changed while a person edited. A secret never has the same version twice, and the version says nothing of its value. bb box config show leaves it out; a draft may send it back, and it is ignored. |
Saves from the settings page
The settings page saves with an operation ID it makes for each save, and the changes it froze for it. bb-box applies an ID at most once: the same ID again gets the first save’s receipt, and the same ID with other changes is refused. The receipt is stored in the same write as the configuration, and config.get lists the receipts:
| Key | Type | Default | What it is |
|---|---|---|---|
operation |
string |
The ID the page gave the save. config.apply applies an ID at most once and refuses it with another submission. | |
revision |
number |
The revision the save made. | |
at |
number |
When it was saved, in milliseconds since 1970. Receipts are kept for 24 hours, and at least the last 100. |
general
| Key | Type | Default | What it is |
|---|---|---|---|
boxesPerThread |
number |
0 |
The most boxes a thread may hold at once. 0 means no limit. |
enrol |
boolean |
true |
Whether boxes join BB as machines, so threads and terminals can use them with the thread’s credentials. |
defaultKind |
string |
"linux" |
The kind a thread gets when it asks for none. |
files |
readonly BoxFileSetting[] |
Files for every box (#455): paths under the box user’s home, whose contents are secrets. | |
video |
boolean |
true |
Whether viewers of a Linux X11 desktop on the CPU show it as video, through Selkies (056), unless one chose VNC in its menu. On unless set off: an install with no value takes the default. |
nightlyImages |
boolean |
false |
Whether bb-box rebuilds the standard images that are due each night (049), on a schedule of its own at 03:00 on BB’s server. Off unless set; first-run setup turns it on. |
identityResetBackends |
readonly string[] |
The backends whose new Linux boxes get an identity marker, so that a copy of one resets its identity (070). None by default. | |
testDevice |
boolean |
false |
Advanced: whether linux, linux-desktop-cpu, macos and macos-desktop boxes offer the test device (063), a test card served by bb-box’s device server in place of a phone, for checking the device path with no simulator or emulator. It stands in for an Android phone or tablet on Linux and an iPhone on macOS, under those models’ names, so a box acquired with device “Pixel 8” or “Test device” gets one. Off unless set; the conformance suite turns it on. |
wholeCards |
boolean |
Whether a Linux box or desktop on a backend that can give one may have a whole card: a GPU to itself, on which bb-box places no other box (071). Off, gpu whole is refused and not offered, and boxes that hold a card whole keep it until they are released. Off unless set. A backend’s own whole-cards field, in its GPUs section, wins where it is set: this is what a backend gets while that field is unset. | |
encoderLedger |
boolean |
true |
Advanced: whether bb-box keeps the iOS devices it streams on each Mac within that Mac’s video encoder (064), giving room first to the person in control of a device, then recordings, other viewers and the agent’s waits, and showing the others at a lower resolution. Off, every stream of a shared ios box is capped at two thirds and nothing else is. On unless set off. |
iosEncoder |
"auto" | "hardware" | "software" |
"auto" |
Advanced: how an ios box’s device server encodes the device’s video (065). auto uses the Mac’s hardware H.264 encoder where it has one, and bb-box-h264 in software where it has none or its encoder fails; hardware never uses software; software always does, as to test it on a Mac that has an encoder. A box takes it when its device server is delivered. auto unless set. |
tailnet |
TailnetSetting |
How bb-box joins machines it makes to the operator’s tailnet: off, where BB is reached without one, or through a Tailscale OAuth client, from which it makes a single-use key for each machine. The client’s ID and secret are general secrets. | |
snapshots |
SnapshotSettings |
Snapshots of boxes (070): how many a box holds, how full a host’s storage may get, and what paid ones may cost. |
general.snapshots
Snapshots of boxes (070). A ceiling for a backend that is not set is 5.
| Key | Type | Default | What it is |
|---|---|---|---|
perBox |
number |
5 |
The most snapshots a box holds, 1 to 50; kept ones count, and undos are counted apart, 2 a box. 5 unless set. |
roomPercent |
number |
85 |
How full a host’s storage may be, in percent, 50 to 90, for bb-box to take a snapshot on it: a take is refused past it, and past 5 points below it of a thin pool’s metadata. 7 points above it, bb-box deletes agents’ snapshots on that storage that nobody kept, oldest first. 85 unless set. |
keepDays |
number |
30 |
Days Keep keeps a snapshot from the day the person keeps it, or adds to a keep that has not ended, unless they choose a date: 1 to 365, 30 unless set. bb-box deletes a kept snapshot after its date. |
agentsRestore |
boolean |
true |
Whether an agent restores its thread’s own boxes without asking, always with an undo first. Off, it asks for a yes in its thread through a form. A box threads run on always needs that yes. On unless set off. |
agentsMemory |
boolean |
true |
Whether an agent may restore a snapshot that holds a box’s memory; off, only the person restores one. On unless set off. |
pictures |
boolean |
true |
Whether bb-box keeps a small picture of a box’s screen with each snapshot: a JPEG 320 px wide, taken as the snapshot is, kept with it in snapshots.db and shown to the person on the box’s page. On unless set off. |
ceilings |
Readonly<Record<string, number>> |
The ceiling on paid snapshots, by backend ID: the most a month, in the provider’s currency, that the paid snapshots held on it may cost at their prices, 0 to 1000. A take, an undo, a Keep, a renewal or a held copy that would pass it is refused. 5 for a backend not set. |
kinds
Each kind’s entry, by its ID. A kind with no entry has its defaults, in the kinds reference. A kind keeps at most 10 spares.
| Key | Type | Default | What it is |
|---|---|---|---|
enabled |
boolean |
Off, no backend offers new boxes of the kind. On when left out. | |
presets |
Partial<Readonly<Record<Preset, SizeChange>>> |
Changes to the small, medium and large sizes: cores, memoryGiB and diskGiB, each optional. | |
default |
Preset |
The preset a box gets when it asks for no size. | |
largest |
SizeChange |
The most a custom size may ask for, as a size change. | |
spares |
number |
Spare boxes to keep: ready, enrolled and owned by no thread (032). None by default, ios and android included: a device spare waits with its device booted and its memory saved to disk (063). | |
gpu |
GpuPart |
The GPU a box of the kind gets when a request leaves gpu out, and the New box form’s first choice until the person’s own is remembered (071): none, shared or whole. Only linux and linux-desktop take it. Left out, none for linux and shared for linux-desktop. A spare or a warm box of a kind whose GPU is whole is made shared. |
backends
Each backend’s entry, in the order acquire tries them. Its ID is its type, or <type>:<name> for another backend of the type. A backend keeps at most 20 warm boxes of a kind, and only of the kinds it keeps warm, as Each backend’s fields lists them; a count for another kind is kept but does nothing.
| Key | Type | Default | What it is |
|---|---|---|---|
id |
string |
The type, or “<type>:<name>” for another backend of the type. | |
type |
string |
The driver. | |
label |
string |
Display name. The driver’s label when left out. | |
enabled |
boolean |
Off, the backend takes no new boxes; its boxes keep working. | |
fields |
Readonly<Record<string, FieldValue | SecretState>> |
What the operator set. Stored without secrets; shown with each as its state. | |
warm |
Readonly<Record<string, number>> |
Ready guests to keep, by kind. | |
hosts |
readonly HostConfig[] |
For a driver with host fields. |
A host of a backend with hosts:
| Key | Type | Default | What it is |
|---|---|---|---|
name |
string |
Lower-case letters, digits and “-”, unique in its backend. | |
enabled |
boolean |
Off, the host takes no new boxes; its boxes keep working. | |
fields |
Readonly<Record<string, FieldValue>> |
The host’s own fields, as its driver lists them. |
images
Projects’ images, by name (049).
| Key | Type | Default | What it is |
|---|---|---|---|
kinds |
readonly string[] |
The kinds it builds on, such as linux and linux-desktop-cpu. | |
script |
string |
The script, run as root in a box of the kind’s standard image. | |
check |
string |
Run as the box user after the script: the image fails when it fails. | |
bake |
ImageBake |
When it is built ahead: auto, after two boxes in 14 days; always; or never, so it runs at each start. | |
projects |
readonly string[] |
The BB projects whose threads’ boxes get it. | |
source |
{ readonly script?: string; readonly check?: string } |
Where the files came from in the project’s repository, such as .bb/box-setup.sh. | |
updated |
string |
When it was set, as an ISO 8601 time. |
monitor
The Monitor (066): machine status in BB’s sidebar footer for BB’s server, your machines and every box, and background monitoring of BB’s server.
| Key | Type | Default | What it is |
|---|---|---|---|
enabled |
boolean |
true |
Whether the Monitor runs: the machine status in BB’s sidebar footer, its sampling, background monitoring and the Mac sensors helper. Off, none of them runs. On unless set off. |
refreshIntervalSeconds |
number |
5 |
Seconds between readings while the machine status is open, 2 to 60. Background monitoring keeps its own 30 seconds. |
backgroundMonitoring |
boolean |
false |
Whether bb-box checks BB’s server’s CPU and memory every 30 seconds while nobody looks, and keeps diagnostic logs for bb box monitor logs. Off unless set. |
pressureNotifications |
boolean |
true |
Whether background monitoring shows a toast in BB when CPU or memory stays high, and when it recovers. On unless set off. |
boxHistory |
boolean |
true |
Whether bb-box keeps each box’s history: a light reading of every running box once a minute, kept 24 hours by the minute and 7 days by the hour, for the 1 h, 24 h and 7 d of a box’s page (069). Off, nothing is read in the background, and what was kept stays until it ages out. On unless set off. |
Each backend’s fields
| Type | Backend | Kinds | Keeps warm |
|---|---|---|---|
proxmox-lxc |
Proxmox LXC | linux, linux-desktop, linux-desktop-cpu, linux-desktop-wayland-cpu | linux, linux-desktop, linux-desktop-cpu, linux-desktop-wayland-cpu |
proxmox-qemu |
Proxmox QEMU | windows-desktop, linux, linux-desktop-cpu, android | windows-desktop |
ssh-pool |
SSH host pool | linux, macos, macos-desktop, ios | none |
tart |
Tart | macos, macos-desktop, linux-arm64, linux-arm64-desktop-cpu, windows-arm64-desktop, ios | macos, macos-desktop, windows-arm64-desktop |
docker |
Docker | linux, linux-desktop-cpu, linux-desktop, linux-desktop-wayland-cpu | none |
microsandbox |
microsandbox | linux, linux-desktop-cpu, linux-arm64, linux-arm64-desktop-cpu | none |
hetzner |
Hetzner Cloud | linux, linux-desktop-cpu, linux-desktop-wayland-cpu, linux-arm64, linux-arm64-desktop-cpu | none |
namespace |
Namespace | macos, macos-desktop, linux, linux-desktop-cpu, linux-desktop-wayland-cpu, ios (on shared iOS hosts only) | none |
boat |
boat.dev | linux, linux-desktop-cpu, android | none |
proxmox-lxc
Proxmox LXC: Linux boxes, with or without a desktop, as containers on a Proxmox VE host.
Setup: setup/proxmox-lxc/README.md.
| Field | Label | Type | Group | Default | Description |
|---|---|---|---|---|---|
url |
API URL | string | connection | The Proxmox API’s address, from the setup guide’s token file. For example https://192.0.2.10:8006/api2/json. | |
node |
Node | string | connection | The node boxes run on. Leave empty on a single-node host. | |
tls-fingerprint |
TLS fingerprint | string | connection | Pins the Proxmox API’s certificate, so BB Box trusts that certificate alone. Paste its SHA-256 fingerprint from the setup guide’s token file. Leave it empty to check the certificate against its CA instead. | |
ca-certificate |
CA certificate | string | connection | The CA that signed the Proxmox API’s certificate, for when there is no TLS fingerprint. Paste it as a PEM certificate. Leave it empty when the API’s certificate is publicly trusted. | |
token-id |
API token ID | string | credentials | The Proxmox API token BB Box signs in with, such as bbbox@pve!plugin. The setup guide lists the privileges it needs. | |
token-secret |
API token secret | string, secret | credentials | The secret of the API token, from the setup guide’s token file. | |
ssh-private-key |
SSH private key | string, secret | credentials | The SSH key BB Box reaches boxes with. Paste the unencrypted OpenSSH private key the templates were built with, the setup guide’s BBBOX_SSH_KEY. Leave it empty and BB Box makes one and shows its public key, which the templates must then accept. | |
pool |
Resource pool | string | boxes | bbbox |
The Proxmox resource pool boxes are made in. The token needs rights on it. |
linux-templates |
Linux templates | string | boxes | 9100 |
The CT templates Linux boxes are linked clones of. List their VMIDs, separated by spaces or commas. Empty turns Linux boxes off. |
desktop-templates |
GPU desktop templates | string | boxes | The CT templates Linux desktops on a GPU are linked clones of. One line per template: its VMID. A template serves every card the host’s GPU helper gives, and desktops with no GPU. A line with a GPU ID after the VMID, such as the UUID nvidia-smi -L shows, still reads, for a template made with one card’s device lines; the ID is no longer needed once the helper is there. Empty turns these desktops off. | |
desktop-cpu-templates |
CPU desktop templates | string | boxes | The CT templates Linux desktops drawn by the CPU are linked clones of. List their VMIDs, separated by spaces or commas. Empty turns these desktops off. | |
desktop-wayland-cpu-templates |
CPU Wayland desktop templates | string | boxes | The CT templates Linux desktops on Wayland are linked clones of. List their VMIDs, separated by spaces or commas. Empty turns these desktops off. | |
boxes-per-card |
Boxes per card | number | gpus | 4 |
The most of this install’s boxes running on one card, desktops and servers together. 0 means no limit. A lower limit stops nothing that runs: no new box goes on a card over it until it has room. Empty, it reads desktops-per-gpu where that is set, else 4. |
whole-cards |
Whole cards | boolean | gpus | Lets a box have a card to itself. Off, no box is given a whole card or changes to one; boxes that have one keep it until they change or are released. Not set here, it follows the install-wide option general.wholeCards, off unless that is set. | |
gpu-memory-mib |
GPU memory a new box needs (MiB) | number | gpus | 1024 |
The memory, in MiB, a card must have free when last read for a new server box to be placed on it. A start-up check, not a limit on what the box uses. A desktop needs at least 384 MiB. |
desktops-per-gpu |
Desktops per GPU (replaced) | number | advanced | Replaced by boxes per card, and read only while that is unset: a value set here is kept, 0 for no limit included. Empty in both, a card runs at most 4 boxes. | |
bridge |
Network bridge | string | advanced | vmbr200 |
The Proxmox network bridge boxes attach to. |
subnet |
Subnet | string | advanced | 10.200.0.0/24 |
The bridge’s subnet, in CIDR form such as 10.200.0.0/24. Boxes get static addresses from it; there is no DHCP. |
gateway |
Gateway | string | advanced | 10.200.0.1 |
The host’s address on the bridge. |
addresses |
Box addresses | string | advanced | 10.200.0.10-10.200.0.254 |
The range of addresses boxes get, inside the subnet. The n-th VMID gets the n-th address. Empty uses the whole subnet except the gateway. |
vmid-first |
First box VMID | number | advanced | 9900 |
The first VMID boxes take. Keep other guests out of the range. |
vmid-last |
Last box VMID | number | advanced | 9999 |
The last VMID boxes take. |
ssh-user |
SSH user | string | advanced | box |
The user in the templates that BB Box and BB work as. |
reserve-memory-mib |
Memory kept free (MiB) | number | advanced | 4096 |
Memory the node keeps for itself. A new box is refused if the node would have less than this left. |
reserve-disk-gib |
Disk kept free (GiB) | number | advanced | 50 |
Disk the node keeps free. A new box is refused if the template’s storage has less free space than this. |
proxmox-qemu
Proxmox QEMU: Windows desktops, Linux boxes and Android emulators, as VMs on a Proxmox VE host.
Setup: setup/proxmox-qemu/README.md.
Fields left empty take proxmox-lxc’s, a set at a time: url, token-id, token-secret, tls-fingerprint, ca-certificate; ssh-private-key.
| Field | Label | Type | Group | Default | Description |
|---|---|---|---|---|---|
url |
API URL | string | connection | The Proxmox API’s address, from the Proxmox LXC setup guide’s token file. For example https://192.0.2.10:8006/api2/json. Leave it, the token, the fingerprint and the CA certificate empty to use Proxmox LXC’s. | |
node |
Node | string | connection | The node boxes run on. Leave empty on a single-node host. | |
tls-fingerprint |
TLS fingerprint | string | connection | Pins the Proxmox API’s certificate, so BB Box trusts that certificate alone. Paste its SHA-256 fingerprint from the setup guide’s token file. Leave it empty to check the certificate against its CA instead. | |
ca-certificate |
CA certificate | string | connection | The CA that signed the Proxmox API’s certificate, for when there is no TLS fingerprint. Paste it as a PEM certificate. Leave it empty when the API’s certificate is publicly trusted. | |
token-id |
API token ID | string | credentials | The Proxmox API token BB Box signs in with, such as bbbox@pve!plugin. The setup guide lists the privileges it needs. | |
token-secret |
API token secret | string, secret | credentials | The secret of the API token, from the setup guide’s token file. | |
ssh-private-key |
SSH private key | string, secret | credentials | The SSH key BB Box reaches boxes with. Paste BBBOX_SSH_KEY, the private key build.sh put in the template, or leave it empty to use Proxmox LXC’s. With neither, BB Box makes a key, which the template does not accept until you add its public key. | |
pool |
Resource pool | string | boxes | bbbox |
The Proxmox resource pool boxes are made in. The token needs rights on it. |
windows-templates |
Windows templates | string | boxes | 9104 |
The templates Windows desktops are linked clones of. List their VMIDs, separated by spaces or commas; a new box is cloned from the least used. setup/proxmox-qemu/build.sh builds one. Empty offers no Windows desktops. |
linux-templates |
Linux templates | string | boxes | The templates Linux boxes as VMs are linked clones of, for a box with its own kernel. List their VMIDs, separated by spaces or commas. setup/proxmox-qemu/build.sh linux builds one. Empty offers no Linux VMs. | |
linux-desktop-templates |
Linux desktop templates | string | boxes | The templates Linux desktops as VMs are linked clones of, for a desktop with its own kernel. They are drawn by the CPU. List their VMIDs, separated by spaces or commas. setup/proxmox-qemu/build.sh linux-desktop builds one. Empty offers no Linux desktop VMs. | |
android-templates |
Android templates | string | boxes | The templates Android emulator boxes are linked clones of. Each is the Linux template with the Android SDK, the emulator and a booted device for each model. List their VMIDs, separated by spaces or commas. setup/proxmox-qemu/build.sh android builds one, on a host with nested virtualization, and the nightly job refreshes it monthly. BB Box offers Android boxes while KVM in Linux VM boxes is on and the template’s record lists its devices. | |
windows-enrol |
Windows boxes as BB machines | boolean | boxes | true |
Windows boxes join BB as machines, so threads and terminals can use them. Linux and macOS boxes always do. Off, Windows boxes are boxes only. |
linux-kvm |
KVM in Linux VM boxes | boolean | boxes | false |
Lets Linux VM boxes run VMs of their own through /dev/kvm. A box asked for as linux-kvm gets one, and Android emulator boxes need it. Turn it on when the host allows nested virtualization: build.sh linux says whether /dev/kvm works in a clone. |
bridge |
Network bridge | string | advanced | vmbr200 |
The Proxmox network bridge boxes attach to. |
subnet |
Subnet | string | advanced | 10.200.0.0/24 |
The bridge’s subnet, in CIDR form such as 10.200.0.0/24. Boxes get static addresses from it; there is no DHCP. |
gateway |
Gateway | string | advanced | 10.200.0.1 |
The host’s address on the bridge. |
addresses |
Box addresses | string | advanced | 10.200.0.150-10.200.0.254 |
The range of addresses boxes get, inside the subnet. The n-th VMID gets the n-th address. Keep it apart from Proxmox LXC’s. Empty uses the whole subnet except the gateway. |
vmid-first |
First box VMID | number | advanced | 9700 |
The first VMID boxes take. Keep other guests out of the range, Proxmox LXC’s boxes too. |
vmid-last |
Last box VMID | number | advanced | 9799 |
The last VMID boxes take. |
ssh-user |
SSH user | string | advanced | box |
The user in the template that BB Box and BB work as. |
reserve-memory-mib |
Memory kept free (MiB) | number | advanced | 4096 |
Memory the node keeps for itself. A new box is refused if the node would have less than this left. |
reserve-disk-gib |
Disk kept free (GiB) | number | advanced | 50 |
Disk the node keeps free. A new box is refused if the template’s storage has less free space than this. |
ssh-pool
SSH host pool: Your own Linux machines and Macs, reached over SSH and reset between boxes.
Setup: setup/ssh-pool/README.md.
| Field | Label | Type | Group | Default | Description |
|---|---|---|---|---|---|
machines |
Machines | string | boxes | Your machines, one line each, with the kinds of box each serves. A line is a name, [user@]host[:port], its kinds, and optionally via=<jump host>, reset=machine and labels=<words>, such as “build-1 192.0.2.21 linux” or “mac-mini 192.0.2.30 macos,macos-desktop”. setup/ssh-pool/setup.sh, or setup-mac.sh on a Mac, prints the line for each machine. The kind ios on a Mac lends iOS slots there, each a macOS user with its own device, for iOS boxes asked for with shared: true; ios:<slots> sets how many, where BB Box would estimate them from the Mac. | |
known-hosts |
Host keys | string | connection | The SSH host keys of every machine and jump host. BB Box connects only to a machine whose key is here. Paste the known_hosts lines setup.sh and setup-mac.sh print. | |
ssh-private-key |
SSH private key | string, secret | credentials | The SSH key BB Box logs in to the machines with. Paste an unencrypted OpenSSH private key that their admin user accepts. Leave it empty and BB Box makes one and shows its public key, which you then give setup.sh. | |
ios-hosts-most |
Slots per shared iOS host | number | ios-hosts | The most slots each shared iOS host has at once, making, ready or held. Here a shared iOS host is a Mac whose line lists ios, and it is lent whole only while it lends no slot. Empty, BB Box estimates it for each Mac: the fewest of its cores over 1.3, its memory over 1.5 GiB after 8 GiB for the Mac, and what its video encoder allows. ios:<slots> on a Mac’s line wins. | |
ios-hosts-ahead |
Ready slots kept on a shared iOS host | number | ios-hosts | 1 |
Slots a shared iOS host keeps ready, so the next iOS box is ready in seconds. Here a shared iOS host is a Mac whose line lists ios, while it is not lent whole. |
ios-hosts-resetting-most |
Slots a shared iOS host resets at once | number | ios-hosts | 4 |
The most released slots a shared iOS host resets in one pass, sweeping their files. |
ios-hosts-disk-reserve-gib |
Disk a shared iOS host keeps free (GiB) | number | ios-hosts | 40 |
A shared iOS host makes no new slot while it has less free disk than this. |
tart
Tart: macOS boxes, iOS Simulator boxes, and Linux and Windows boxes on arm64, as VMs on your Macs with Apple silicon.
Setup: setup/tart/README.md.
| Field | Label | Type | Group | Default | Description |
|---|---|---|---|---|---|
ssh-private-key |
SSH private key | string, secret | credentials | The SSH key BB Box logs in to each Mac and each VM with. Paste an unencrypted OpenSSH private key that each Mac’s user and each image’s VM user accept. Leave it empty and BB Box makes one and shows its public key. | |
macos-image |
macOS image | string | boxes | bb-box-macos |
The Tart VM on each Mac that macOS boxes, with no desktop shown, are cloned from. Empty turns them off. |
macos-desktop-image |
macOS desktop image | string | boxes | bb-box-macos |
The Tart VM on each Mac that macOS desktops are cloned from. Empty turns them off. |
linux-image |
Linux image (arm64) | string | boxes | The Tart VM on each Mac that Linux boxes on arm64 are cloned from. setup/tart/prepare-linux-image.sh builds it, as bb-box-linux. Empty turns them off. | |
linux-desktop-image |
Linux desktop image (arm64) | string | boxes | The Tart VM on each Mac that Linux desktops on arm64 are cloned from. setup/tart/prepare-linux-image.sh –desktop builds it, as bb-box-linux-desktop. Empty turns them off. | |
windows-image |
Windows image (arm64) | string | boxes | The image on each Mac that Windows desktops on arm64 are made from, run by QEMU. It is in ~/.bb-box/qemu/images. Empty turns them off. | |
ios-image |
iOS image | string | boxes | The Tart VM on each Mac that iOS Simulator boxes are cloned from. setup/tart/prepare-ios-image.sh builds it on the macOS image, as bb-box-ios, with idb_companion and a booted-once, slimmed iPhone 18 Pro, iPhone 17 and iPad Pro 13-inch (M5). BB Box checks and refreshes it with the macOS image. Empty turns iOS boxes off. | |
ios-hosts-on |
Shared iOS hosts | boolean | ios-hosts | false |
Lends iOS boxes as slots on shared hosts, which are VMs of the iOS image. Each slot is a macOS user with its own device, for an iOS box asked for with shared: true. A host is made when a box needs one, and deleted when its last box is released. |
windows-enrol |
Windows boxes as BB machines | boolean | boxes | true |
Windows boxes join BB as machines, so threads and terminals can use them. Linux and macOS boxes always do. Off, Windows boxes are boxes only. |
video |
Video by default for macOS desktops | boolean | boxes | false |
Opens macOS desktops as video, from bb-box-stream in the image, instead of VNC. Off, they open as VNC, which is already smooth on a Tart Mac at 52 to 55 frames a second, and a person can choose video under Display. Video uses much less bandwidth, about 1.2 Mbit/s against 20 while scrolling, but a key shows a little later, about 57 ms against 31. |
vm-user |
VM user | string | advanced | admin |
The user in the macOS images that BB Box and BB work as. It is logged in to the desktop automatically. Linux boxes work as box. |
vms-per-host |
VMs per Mac | number | advanced | 2 |
The most macOS VMs each Mac runs at once, counting every Tart VM there, not only BB Box’s. At most 2, which Apple’s licence and the Virtualization framework allow. |
reserve-memory-mib |
Memory kept free (MiB) | number | advanced | 16384 |
Memory each Mac keeps for its own use. A new box is refused if the Mac would have less than this left, after its running VMs. |
reserve-disk-gib |
Disk kept free (GiB) | number | advanced | 50 |
Disk each Mac keeps free. A new box is refused if the Mac’s disk has less free space than this. |
warm-max-hours |
Hours a macOS warm VM or spare is kept | number | advanced | 6 |
How long a suspended macOS warm VM or spare is kept before a fresh one replaces it. An old saved state may not restore. |
ios-hosts-most |
Slots per shared iOS host | number | ios-hosts | The most slots each shared iOS host has at once, making, ready or held. Empty, BB Box estimates it for each Mac: the fewest of the host’s cores over 1.3, its memory over 1.5 GiB after 8 GiB for the host, and what the Mac’s video encoder allows. A Mac’s own value wins. | |
ios-hosts-ahead |
Ready slots kept on a shared iOS host | number | ios-hosts | 1 |
Slots a shared iOS host keeps ready while it holds a box, so the next box is ready in seconds. |
ios-hosts-resetting-most |
Slots a shared iOS host resets at once | number | ios-hosts | 4 |
The most released slots a shared iOS host resets in one pass, sweeping their files. |
ios-hosts-cores |
Cores of a shared iOS host | number | ios-hosts | The cores of each shared iOS host’s VM, shared by its slots. Empty uses the Mac’s performance cores. A Mac’s own value wins. | |
ios-hosts-memory-gib |
Memory of a shared iOS host (GiB) | number | ios-hosts | The memory of each shared iOS host’s VM, shared by its slots. Empty uses 8 GiB for the host and 1.5 GiB for each slot, within the Mac’s memory. A Mac’s own value wins. | |
ios-hosts-per-mac |
Shared iOS hosts per Mac | number | ios-hosts | 1 |
The most shared iOS hosts a Mac runs. Each is one of the Mac’s two macOS VMs, and both share the Mac’s video encoder. |
ios-hosts-disk-reserve-gib |
Disk a shared iOS host keeps free (GiB) | number | ios-hosts | 10 |
A shared iOS host makes no new slot while its VM has less free disk than this. |
Each host’s fields:
| Field | Label | Type | Group | Default | Description |
|---|---|---|---|---|---|
address |
Address | string | connection | The Mac’s address, with :port when SSH is not on 22. For example 192.0.2.20. | |
user |
User | string | connection | The user BB Box logs in to the Mac as, which runs tart. | |
host-keys |
Host keys | string | connection | The Mac’s SSH host keys as known_hosts lines. ssh-keyscan -t ed25519 <address> prints one. BB Box checks them on every connection. | |
ios-hosts-most |
Slots per shared iOS host | number | ios-hosts | The most slots a shared iOS host on this Mac has, in place of the backend’s setting. Empty uses the backend’s setting, or else BB Box’s estimate for the Mac. | |
ios-hosts-cores |
Cores of a shared iOS host | number | ios-hosts | The cores of a shared iOS host’s VM on this Mac, in place of the backend’s setting. Empty uses the backend’s setting, or else the Mac’s performance cores. | |
ios-hosts-memory-gib |
Memory of a shared iOS host (GiB) | number | ios-hosts | The memory of a shared iOS host’s VM on this Mac, in place of the backend’s setting. Empty uses the backend’s setting, or else BB Box’s estimate. |
docker
Docker: Linux boxes, with or without a desktop, as containers on a Docker host. It needs only Docker.
Setup: setup/docker/README.md.
| Field | Label | Type | Group | Default | Description |
|---|---|---|---|---|---|
host |
Host | string | connection | The Docker daemon boxes run on. Give unix:///path/to/docker.sock, ssh://user@host, tcp://host:port, wsl://distro or wsl://user@distro, or bb:<machine ID> for a BB machine, which BB Box reaches through BB. wsl:// reaches Docker in that WSL distribution through wsl.exe and docker system dial-stdio, not through WSL’s localhost forwarder. Over SSH, BB’s server user must log in without a prompt. Empty uses the docker CLI’s own default on BB’s server: DOCKER_HOST, its current context, or the local socket. | |
machine-docker-host |
Docker on the machine | string | connection | Where Docker is on a BB machine, when Host is bb:<machine ID>. Give wsl://distro or wsl://user@distro, unix:///path/to/docker.sock, or tcp://host:port. BB Box sends it when that machine’s relay opens, and the machine dials it instead of its own DOCKER_HOST or docker context. Empty leaves those. On a Windows machine whose Docker is at tcp://127.0.0.1, set wsl://<distro>: WSL’s localhost forwarder drops attached output, so docker exec prints nothing and exits 0. | |
linux-image |
Linux image | string | boxes | bbbox/linux:1 |
The image Linux boxes run. setup/docker/build.sh builds it. Empty turns them off. |
desktop-image |
Desktop image | string | boxes | bbbox/linux-desktop:1 |
The image Linux desktops run: those drawn by the CPU, and those on a GPU when GPU boxes are on. setup/docker/build.sh builds it. Empty turns them off. |
wayland-desktop-image |
Wayland desktop image | string | boxes | bbbox/linux-desktop-wayland:1 |
The image Linux desktops on Wayland run: Sway, drawn by the CPU. setup/docker/build.sh builds it. Empty turns them off. |
privileged |
Docker in boxes | boolean | boxes | true |
Gives each box its own Docker daemon, started by its first docker command. Each box then runs as a privileged container, which can take over the Docker host. Off, or on rootless Docker, boxes say No Docker. |
gpus |
GPU boxes | boolean | gpus | false |
Offers Linux servers and desktops on the host’s NVIDIA cards, shared or, where whole cards are on, a card to themselves. The NVIDIA Container Toolkit must list the cards as CDI devices (nvidia-ctk cdi generate). With Docker in boxes on, every box can open every card, with a GPU or without: BB Box places boxes on cards, but does not fence them. Not set here, it reads gpu-desktops, off unless that is set. |
boxes-per-card |
Boxes per card | number | gpus | 4 |
The most boxes on one card, servers and desktops together, running or stopped, of every install that uses the host. A lower limit stops nothing that runs: no new box goes on a card over it until it has room. Empty, it reads desktops-per-gpu where that is set, else 4. |
whole-cards |
Whole cards | boolean | gpus | Lets a box have a card to itself. Off, no box is given a whole card or changes to one; boxes that have one keep it until they change or are released. A whole card is where BB Box places boxes, not a fence. Not set here, it follows the install-wide option general.wholeCards, off unless that is set. | |
gpu-memory-mib |
GPU memory a new box needs (MiB) | number | gpus | 1024 |
The memory, in MiB, a card must have free when last read for a new server box to be placed on it. A start-up check, not a limit on what the box uses. A desktop needs at least 384 MiB. |
gpu-desktops |
GPU desktops (replaced) | boolean | advanced | Replaced by GPU boxes, and read only while that is unset. | |
desktops-per-gpu |
Desktops per GPU (replaced) | number | advanced | Replaced by Boxes per card, and read only while that is unset. | |
network |
Network | string | advanced | bbbox |
The Docker network BB Box makes for its boxes, apart from the host’s other containers. |
boxes |
Most boxes | number | advanced | 10 |
The most BB Box containers on the host at once, running or stopped. This counts those of every BB Box install that uses the host. |
reserve-memory-mib |
Memory kept free (MiB) | number | advanced | 4096 |
Memory the host keeps for itself. A new box is refused if the host would have less than this left, after the memory limits of the running boxes. |
microsandbox
microsandbox: Linux boxes, with or without a desktop, as microVMs that start in under a second, on a Linux host with KVM or a Mac. BB Box installs its own msb there.
Setup: setup/microsandbox/README.md.
| Field | Label | Type | Group | Default | Description |
|---|---|---|---|---|---|
host |
Host | string | connection | The host that runs the boxes: a Linux host with KVM, or a Mac. Give ssh://user@host, or bb:<machine ID> for a BB machine, which BB Box reaches through BB. Empty uses BB’s server. BB Box installs its own msb there. | |
linux-image |
Linux image | string | boxes | bbbox/linux:1 |
The image Linux boxes run. BB Box imports it from Docker on the host, where setup/docker/build.sh builds it. Empty turns them off. |
desktop-image |
Desktop image | string | boxes | bbbox/linux-desktop:1 |
The image Linux desktops run, drawn by the CPU. BB Box imports it from Docker on the host, where setup/docker/build.sh builds it. Empty turns them off. |
linux-arm64-image |
Linux image (arm64) | string | boxes | bbbox/linux:1-arm64 |
The image Linux boxes on arm64 run, on an arm64 host such as a Mac. BB Box imports it from Docker on the host, or builds it there with setup/docker/build.sh –arch arm64 in a microVM of its own. Empty turns them off. |
desktop-arm64-image |
Desktop image (arm64) | string | boxes | bbbox/linux-desktop:1-arm64 |
The image Linux desktops on arm64 run, on an arm64 host such as a Mac. BB Box imports it from Docker on the host, or builds it there in a microVM of its own. Empty turns them off. |
docker |
Docker in boxes | boolean | boxes | true |
Gives each box its own Docker daemon, started by its first docker command. Its data is on a disk of the box’s own. Each box has its own kernel, so this needs no privilege on the host. |
docker-disk-gib |
Docker disk (GiB) | number | advanced | 64 |
The most each box’s Docker disk may grow to. It takes only what Docker writes, and goes with the box. |
disk-gib |
Root disk (GiB) | number | advanced | 32 |
The most a box’s root disk may grow to when no disk size is asked for. It takes only what the box writes. |
network |
Network profiles | string | advanced | public,private |
What each box’s network reaches, as msb’s profiles separated by commas. The profile public reaches the internet, and private reaches the host’s local networks and tailnet, where BB’s server often is. |
boxes |
Most boxes | number | advanced | 20 |
The most BB Box microVMs on the host at once, running or stopped. This counts those of every BB Box install that uses the host. |
reserve-memory-mib |
Memory kept free (MiB) | number | advanced | 4096 |
Memory the host keeps for itself. A new box is refused if the host would have less than this left, after the memory of the running boxes. |
memory-overcommit |
Memory overcommit | number | advanced | 1 |
How many times the host’s memory the boxes may take in all, after the memory kept free: 1 to 4. At 1, each box counts at its full memory. Above 1, a new box also needs memory free on the host now. Raise it for mostly idle boxes. |
hetzner
Hetzner Cloud: Linux boxes on x86 or Arm, with or without a desktop, on Hetzner Cloud hosts BB Box makes as boxes need them. Each box is a container on a Docker host, and a host is deleted once it is idle.
Setup: docs/guide/hetzner.md.
| Field | Label | Type | Group | Default | Description |
|---|---|---|---|---|---|
token |
API token | string, secret | credentials | The API token of the Hetzner Cloud project BB Box makes its hosts in. Make a Read & Write token on the project’s Security page. The project should hold nothing else. | |
location |
Location | string | connection | nbg1 |
The Hetzner location hosts are made in, such as nbg1 (Nuremberg), fsn1 (Falkenstein) or hel1 (Helsinki). Choose one near BB’s server, as a desktop’s stream crosses between them. |
server-type |
Server type | string | boxes | cpx42 |
The type of every host, such as cpx42 (8 cores, 16 GB, 320 GB disk). A box at its largest must fit one, with the memory kept free. |
arm-server-type |
Arm server type | string | boxes | The type of the hosts for Linux boxes on arm64, an Ampere type such as cax31 (8 cores, 16 GB, 160 GB disk). Empty offers no arm64 boxes. Arm hosts have their own host image. | |
most-hosts |
Most hosts | number | boxes | 2 |
The most hosts at once. At this many, a box that fits on none of them is refused. |
idle-minutes |
Idle minutes | number | boxes | 30 |
How long a host with no box waits before it is deleted. Hetzner bills by the started hour, so a shorter time saves little and makes new boxes wait for a new host more often. |
monthly-limit-eur |
Monthly limit (EUR) | number | boxes | 20 |
The most BB Box may spend on Hetzner in a calendar month, in euros before VAT. It makes no host when this month’s spend so far, and an hour more of every host with the new one, would pass it. A busy host keeps running until it is idle. 0 sets no limit. Hetzner has no limit of its own: set a cost alert in its Console too. |
host-image |
Host image | string | advanced | ubuntu-26.04 |
What hosts start from: an image name or a snapshot’s ID. An image name, such as ubuntu-26.04, is the base of the host image BB Box builds as a snapshot, with Docker, Tailscale and the box images in it. BB Box rebuilds it weekly or when its scripts change, keeping two; until the first is built, hosts start from the image itself. A snapshot’s ID makes hosts start from that snapshot, and BB Box builds none. |
ssh-from |
SSH from | string | advanced | The addresses that may reach a host’s SSH over the internet, used only with the tailnet off. Give CIDRs separated by commas, such as BB’s server’s public address. With the tailnet on, a host’s SSH is reached on the tailnet alone. | |
linux-image |
Linux image | string | boxes | bbbox/linux:1 |
The image Linux boxes run. setup/docker/build.sh builds it. Empty turns them off. |
desktop-image |
Desktop image | string | boxes | bbbox/linux-desktop:1 |
The image Linux desktops run, drawn by the CPU. setup/docker/build.sh builds it. Empty turns them off. |
wayland-desktop-image |
Wayland desktop image | string | boxes | bbbox/linux-desktop-wayland:1 |
The image Linux desktops on Wayland run: Sway, drawn by the CPU. setup/docker/build.sh builds it. Empty turns them off. |
privileged |
Docker in boxes | boolean | boxes | true |
Gives each box its own Docker daemon, started by its first docker command. Each box then runs as a privileged container, which can take over the Docker host. Off, or on rootless Docker, boxes say No Docker. |
boxes |
Most boxes | number | advanced | 10 |
The most BB Box containers on the host at once, running or stopped. This counts those of every BB Box install that uses the host. |
reserve-memory-mib |
Memory kept free (MiB) | number | advanced | 4096 |
Memory the host keeps for itself. A new box is refused if the host would have less than this left, after the memory limits of the running boxes. |
network |
Network | string | advanced | bbbox |
The Docker network BB Box makes for its boxes, apart from the host’s other containers. |
namespace
Namespace: Macs and Linux machines rented by the minute from Namespace, one for each box. A machine ends when its box is released, or at the plan’s longest life.
Setup: docs/guide/namespace.md.
| Field | Label | Type | Group | Default | Description |
|---|---|---|---|---|---|
token |
API token | string, secret | connection | The token BB Box calls Namespace’s API with. Make a revocable token for the workspace with nsc token create, granted the instance actions the guide lists. | |
region |
API region | string | connection | us |
Where BB Box calls Namespace’s API and its SSH gateway: us or eu. Where the machines run is the workspace’s regional preference, which Namespace’s support sets. |
macos-version |
macOS version | string | boxes | 26.x |
The macOS a box runs, as Namespace’s base images name it, such as 26.x. |
machines |
Most machines | number | boxes | 2 |
The most Namespace machines BB Box has at once. Each box is one machine, billed by the minute while it exists. |
longest-life-hours |
Longest life (hours) | number | boxes | 3 |
How long the workspace’s plan lets a machine live. That is 3 hours on Developer, 5 on Team and up to 24 on Business. A box ends then, and its thread hears an hour ahead. |
largest-machine |
Largest machine | string | boxes | The largest Mac BB Box asks for, as cores x memory in GB, such as 6x14. A box that needs a larger one is refused before BB Box asks Namespace, so another backend can take it. Empty: the largest the workspace allows, which BB Box reads from Namespace when the token may, or learns the first time Namespace refuses a Mac for its size. | |
ios-hosts-on |
Shared iOS hosts | boolean | ios-hosts | true |
Lends iOS boxes as macOS users on a shared Namespace Mac. A host is made for an iOS box that finds no slot on a pool Mac or a Tart host, and deleted when its last box goes. It lends once BB Box has measured that Namespace’s Macs run the iOS Simulator. A host takes the workspace’s one Mac, so no macOS box starts on Namespace while it lives. |
ios-hosts-most |
Slots per shared iOS host | number | ios-hosts | The most slots each shared iOS host has at once, making, ready or held. Empty, BB Box estimates it from the Mac’s cores, memory and video encoder, as for a pool Mac. | |
ios-hosts-ahead |
Ready slots kept on a shared iOS host | number | ios-hosts | 1 |
Slots a shared iOS host keeps ready while it holds a box, so the next box is ready in seconds. |
ios-hosts-resetting-most |
Slots a shared iOS host resets at once | number | ios-hosts | 2 |
The most released slots a shared iOS host resets in one pass, sweeping their files. |
ios-hosts-disk-reserve-gib |
Disk a shared iOS host keeps free (GiB) | number | ios-hosts | 20 |
A shared iOS host makes no new slot while it has less free disk than this. |
boat
boat.dev: Linux VMs, with or without a desktop, rented by the second from boat.dev, one for each box. Each box is forked from BB Box’s template in seconds, and deleted when it is released.
Setup: docs/guide/boat.md.
| Field | Label | Type | Group | Default | Description |
|---|---|---|---|---|---|
api-key |
API key | string, secret | credentials | The boat.dev API key BB Box makes and deletes sandboxes with. Make one in boat’s dashboard, or with boat api-key create, starting boat_. A key that expires stops BB Box’s boxes there when it does. It is kept as a secret and never shown. | |
most-boxes |
Most boxes | number | boxes | 2 |
The most boat sandboxes BB Box runs at once, a template being built included. Each box is one sandbox, billed by the second while it runs: $0.018 an hour for 2 cores and 4 GB, $0.036 for 4 and 8, $0.072 for 8 and 16. A stopped box costs nothing. The free trial allows 2 at once. |
android-sdk-licence |
Android SDK licence | boolean | boxes | false |
Whether you accept the Android SDK’s licence, which Android boxes on boat.dev need. Google’s terms cover the SDK, the emulator and the system image that BB Box installs, as setup/android/pins.json pins them; read them with setup/android/accept-sdk-licence.sh, or at developer.android.com/studio/terms. Turning this on is your acceptance. While it is off, boat.dev offers no Android boxes. |
lease-minutes |
Auto-stop (minutes) | number | advanced | 30 |
How long a box runs on after BB Box last renewed it. BB Box renews each box it holds every few minutes, so a box stops this long after BB Box stops for good, and keeps its disk. From 10 to 120: the free trial allows at most 120. |