Containerized development environment with Claude Code and Gemini CLI running on Podman.
./build.sh # Build image
./start.sh # Start container
claude # Claude Code with auto-approve
gemini # Gemini CLI with auto-approvePass your API keys and tokens to pre-authenticate both AI assistants:
export GEMINI_API_KEY="your-gemini-api-key"
export CLAUDE_CODE_OAUTH_TOKEN="your-claude-oauth-token"
export GEMINI_MODEL="gemini-2.0-flash-exp" # Optional
export ANTHROPIC_MODEL="claude-sonnet-4-5" # Optional
./start.sh --env-keys GEMINI_API_KEY,CLAUDE_CODE_OAUTH_TOKEN,GEMINI_MODEL,ANTHROPIC_MODELOr do it in one line:
./start.sh --env-keys GEMINI_API_KEY,CLAUDE_CODE_OAUTH_TOKEN,GEMINI_MODEL,ANTHROPIC_MODELThe --env-keys flag passes environment variables from your host into the container.
- Claude Code - Auto-approve mode, chrome-devtools MCP server
- Gemini CLI - Auto-approve mode (yolo)
- Development Stack - Node.js 20, Python 3.11, Poetry
- Tools - Git, Podman CLI, Chromium, standard dev tools
./build.sh [OPTIONS]
--name IMAGE_NAME # Custom image name (default: swarmbox)
--no-cache # Build without cache
--reset # Remove existing container/image first./start.sh [OPTIONS]
--name CONTAINER_NAME # Custom container name (default: swarmbox)
--image IMAGE_NAME # Custom image name (default: swarmbox)
--hostname HOSTNAME # Custom hostname (default: swarmbox)
--ports PORT_LIST # e.g., --ports 3000,8080:80
--iports PORT_LIST # Inverse port mappings to host
--env-keys KEY1,KEY2,... # Pass environment variables from host
--reset # Recreate container, keep .work data
--no-shell # Don't attach to shell (automation)
--with-unsafe-podman # Mount host Podman socket (USE WITH CAUTION)Your work directory ./.work/ is mounted at /home/agent inside the container. All files persist between sessions.
- Podman (Docker support removed)
- Linux:
sudo apt install podmanorsudo dnf install podman - macOS:
brew install podman
- Linux: