Intro
A short note on why I containerised my Claude Code workflow, and why Bubblewrap ended up doing the heavy lifting inside the container itself.
What I built
Two Docker instances on a custom bridge. Each instance owns its own writable workspace mounted as a volume, with Bubblewrap providing per-task isolation on top.
How it works
docker network create --driver bridge claude-bridge
docker run -d --name claude-a --network claude-bridge -v ./ws-a:/workspace claude-code:latest
docker run -d --name claude-b --network claude-bridge -v ./ws-b:/workspace claude-code:latest
Inside each container, Bubblewrap wraps the actual coding-agent invocation so that even an over-eager rm -rf can’t escape the assigned workspace [0x01].
Challenges
- Audio passthrough is an anti-pattern in containers (covered in my portfolio site WIP).
- Networking between the two instances had to stay on the custom bridge to keep them off the default
bridge0.
What’s next
A small FastAPI sidecar that exposes a /transcribe endpoint for the authoring tool — see WIP.