JailBee
An agent needs the network to work, so the question is never whether it
gets out — it is how wide you leave the entrance. That is what
jailbee net strict|loose sets.
JailBee runs isolated, per-branch development environments in Incus system containers. Spin up multiple full stacks in parallel on one host — each with its own services, Docker daemon, IDE, and browser — without port conflicts, Docker name clashes, or shared-database collisions.
The CLI is jailbee, or jb for short.
JailBee is project-agnostic: every repo supplies its own .jailbee/config.yaml. The
golden image ships stack-neutral by default — language toolchains (JDK, Node,
Python venv/pip, Docker) are bundled but opt-in, enabled per repo via
golden.stacks / golden.enable_snippets. It was built at GISGRO, which is
its origin, not its scope.
Key features
- Per-branch isolation — one full-stack container per git branch, running in parallel without port or Docker-name collisions.
- Host↔container git bridge — the container acts as a git remote; move
commits with
jailbee git push/pull/checkoutinstead of round-tripping through GitHub. - Nested Docker —
security.nesting=trueout of the box on Ubuntu 26.04. - GUI passthrough — launch a JetBrains IDE (
jailbee ide) and Chrome (jailbee chrome) from inside a container onto your Wayland session. - Network modes — per-container egress allowlist with
strictandloosepolicies (jailbee net), safe for unattended agent runs. - Fast, cheap containers — copy-on-write clones of one golden image; a live
TUI dashboard (
jailbee dashboard) or Qt GUI dashboard (jailbee gui) spans every repo.
Getting started
JailBee needs a Linux host running Incus. Install the CLI with
uv:
uv tool install jailbee
For the optional Qt GUI dashboard (jailbee gui), add the gui extra:
uv tool install 'jailbee[gui]'
Host setup — Incus, firewall, UID mapping, kernel keyring limits — is a one-time job with a few moving parts. Follow Installation end-to-end first. Then, from the repo you want to manage:
jailbee config init # write .jailbee/config.yaml
jailbee doctor # sanity-check host + config
jailbee init # create Incus profiles, ACL, bridge
jailbee base build # build the golden image (one-time, ~10–15 min)
jailbee new feat/my-branch # spin up an isolated env for a branch
See Getting started for the full first-run walkthrough.
Shell completion
Install Typer's completion script once per shell:
jailbee --install-completion
Restart the shell, and TAB completes commands, options, and:
- container names on every command that takes one (
jailbee shell,jailbee destroy,jailbee git push,jailbee ide, …) — short names, from the containers that exist in the current repo - branch names on
jailbee newandjailbee retarget, from the host repo's local branches - snapshot tags on
jailbee snapshot restoreandjailbee snapshot delete, from the container already named on the command line - fixed values for
--format,--layer,--attachand--user
Completion looks for .jailbee/config.yaml in the current directory, the same
default the commands themselves use; elsewhere it offers nothing. Unlike the
commands, it does not honor --config/-c, so e.g. jailbee shell -c /other/repo/.jailbee/config.yaml <TAB> still completes against the current
directory's containers, not the repo the flag points at.
Documentation
Setup — get JailBee running:
| Doc | What's inside |
|---|---|
| Installation | One-time host setup: Incus, UID delegation, installing the CLI (plus conditional firewall / kernel-keyring steps) |
| Getting started | Concepts, configure a repo, build the image, and a "typical day" walkthrough |
| Running on macOS | Using JailBee from an Apple Silicon Mac via a Linux VM (Colima/Lima) with the repo shared from macOS (experimental) |
Daily use — working with containers:
| Doc | What's inside |
|---|---|
| Commands | Full command + flag reference table |
| Git bridge and branch workflows | Host↔container git bridge, stacked PRs, mount vs clone, PR review, gh inside containers |
| Setting up JailBee in your own project | Tutorial for adapting JailBee to your own repo and stack |
| Troubleshooting | Common failures by symptom, and how to remove JailBee |
Reference — the details:
| Doc | What's inside |
|---|---|
| Configuration reference | Every .jailbee/config.yaml and global.yaml key |
| Security and limitations | Isolation model, git-remote handling, known limits |
| Architecture | How the pieces fit together |
| Who JailBee is for | What JailBee is good at, what it costs, and how it differs from BranchBox and nono |
Meta — project internals:
| Doc | What's inside |
|---|---|
| Manual testing | End-to-end smoke-test recipes (require a real Incus daemon) |
| Releasing | Release process |
| Contributing | Development setup and repo conventions |
License
jailbee is free software, released under the GNU General Public License v3.0
or later (GPL-3.0-or-later). See LICENSE for the full text.
Copyright © 2026 GISGRO Oy.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file jailbee-1.0.0.tar.gz.
File metadata
- Download URL: jailbee-1.0.0.tar.gz
- Upload date:
- Size: 380.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d20ca1785860895d0b23947114672404fbabb91bdbfec9d45a90f2e8e359e152
|
|
| MD5 |
818fc65d6cdfefb591173fb332b5b153
|
|
| BLAKE2b-256 |
63483eaaf2fd581317b278c299c372215860d72a283a4405da3f196aa81d460d
|
File details
Details for the file jailbee-1.0.0-py3-none-any.whl.
File metadata
- Download URL: jailbee-1.0.0-py3-none-any.whl
- Upload date:
- Size: 422.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4d65918eb8b2660870b60a63f411a16729c53ae2a1981aeeb2ccaf43cd78d8f4
|
|
| MD5 |
66f5d54322ff558d8a6f5043620cf0ba
|
|
| BLAKE2b-256 |
fa1da1e5571b56e14ce084c5ae822ab2447c3043942dd1fd3dd06bd15281f2a4
|