- Notifications
You must be signed in to change notification settings - Fork28
textcortex/claude-code-sandbox
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Warning
- This work is alpha and might have security issues, use at your own risk.
- CheckTODO.md for the roadmap.
- Emaildev@textcortex.com for inquiries.
Run Claude Code as an autonomous agent inside Docker containers with automatic GitHub integration. Bypass all permissions safely.

The primary goal of Claude Code Sandbox is to enablefull async agentic workflows by allowing Claude Code to execute without permission prompts. By running Claude in an isolated Docker container with the--dangerously-skip-permissions
flag, Claude can:
- Execute any command instantly without asking for permission
- Make code changes autonomously
- Run build tools, tests, and development servers
- Create commits and manage git operations
- Work continuously without interrupting the user
Access Claude through abrowser-based terminal that lets you monitor and interact with the AI assistant while you work on other tasks. This creates a truly autonomous development assistant, similar toOpenAI Codex orGoogle Jules, but running locally on your machine with full control.
Claude Code Sandbox allows you to run Claude Code in isolated Docker containers, providing a safe environment for AI-assisted development. It automatically:
- Creates a new git branch for each session
- Monitors for commits made by Claude
- Provides interactive review of changes
- Handles credential forwarding securely
- Enables push/PR creation workflows
- Runs custom setup commands for environment initialization
Install Claude Code Sandbox globally from npm:
npm install -g @textcortex/claude-code-sandbox
- Node.js >= 18.0.0
- Docker or Podman
- Git
- Claude Code (
npm install -g @anthropic-ai/claude-code@latest
)
Simply run in any git repository:
claude-sandbox
This will:
- Create a new branch (
claude/[timestamp]
) - Start a Docker container with Claude Code
- Launch a web UI at
http://localhost:3456
- Open your browser automatically
Start a new container with web UI (recommended):
claude-sandbox
Explicitly start a new container with options:
claude-sandbox start [options]Options: -c, --config<path> Configuration file (default: ./claude-sandbox.config.json) -n, --name<name> Container name prefix --no-web Disable web UI (use terminal attach) --no-push Disable automatic branch pushing --no-pr Disable automatic PR creation
Attach to an existing container:
# Interactive selectionclaude-sandbox attach# Specific containerclaude-sandbox attach abc123def456Options: --no-web Use terminal attach instead of web UI
List all Claude Sandbox containers:
claude-sandbox listclaude-sandbox ls# aliasOptions: -a, --all Show all containers (including stopped)
Stop containers:
# Interactive selectionclaude-sandbox stop# Specific containerclaude-sandbox stop abc123def456# Stop allclaude-sandbox stop --all
View container logs:
claude-sandbox logsclaude-sandbox logs abc123def456Options: -f, --follow Follow log output -n, --tail<lines> Number of lines to show (default: 50)
Remove stopped containers:
claude-sandbox cleanclaude-sandbox clean --force# Remove all containers
Show current configuration:
claude-sandbox config
Create aclaude-sandbox.config.json
file (seeclaude-sandbox.config.example.json
for reference):
{"dockerImage":"claude-code-sandbox:latest","dockerfile":"./custom.Dockerfile","detached":false,"autoPush":true,"autoCreatePR":true,"autoStartClaude":true,"envFile":".env","environment": {"NODE_ENV":"development" },"setupCommands": ["npm install","npm run build"],"volumes": ["/host/path:/container/path:ro"],"mounts": [ {"source":"./data","target":"/workspace/data","readonly":false }, {"source":"/home/user/configs","target":"/configs","readonly":true } ],"allowedTools": ["*"],"maxThinkingTokens":100000,"bashTimeout":600000,"containerPrefix":"my-project","claudeConfigPath":"~/.claude.json"}
dockerImage
: Base Docker image to use (default:claude-code-sandbox:latest
)dockerfile
: Path to custom Dockerfile (optional)detached
: Run container in detached modeautoPush
: Automatically push branches after commitsautoCreatePR
: Automatically create pull requestsautoStartClaude
: Start Claude Code automatically (default: true)envFile
: Load environment variables from file (e.g.,.env
)environment
: Additional environment variablessetupCommands
: Commands to run after container starts (e.g., install dependencies)volumes
: Legacy volume mounts (string format)mounts
: Modern mount configuration (object format)allowedTools
: Claude tool permissions (default: all)maxThinkingTokens
: Maximum thinking tokens for ClaudebashTimeout
: Timeout for bash commands in millisecondscontainerPrefix
: Custom prefix for container namesclaudeConfigPath
: Path to Claude configuration filedockerSocketPath
: Custom Docker/Podman socket path (auto-detected by default)
Themounts
array allows you to mount files or directories into the container:
source
: Path on the host (relative paths are resolved from current directory)target
: Path in the container (relative paths are resolved from /workspace)readonly
: Optional boolean to make the mount read-only (default: false)
Example use cases:
- Mount data directories that shouldn't be in git
- Share configuration files between host and container
- Mount build artifacts or dependencies
- Access host system resources (use with caution)
Claude Code Sandbox now supports Podman as an alternative to Docker. The tool automatically detects whether you're using Docker or Podman by checking for available socket paths:
- Automatic detection: The tool checks for Docker and Podman sockets in standard locations
- Custom socket paths: Use the
dockerSocketPath
configuration option to specify a custom socket - Environment variable: Set
DOCKER_HOST
to override socket detection
Example configuration for Podman:
{"dockerSocketPath":"/run/user/1000/podman/podman.sock"}
The tool will automatically detect and use Podman if:
- Docker socket is not available
- Podman socket is found at standard locations (
/run/podman/podman.sock
or$XDG_RUNTIME_DIR/podman/podman.sock
)
Launch a browser-based terminal interface to interact with Claude Code:
claude-sandbox --web
This will:
- Start the container in detached mode
- Launch a web server on
http://localhost:3456
- Open your browser automatically
- Provide a full terminal interface with:
- Real-time terminal streaming
- Copy/paste support
- Terminal resizing
- Reconnection capabilities
Perfect for when you want to monitor Claude's work while doing other tasks.
Claude Code Sandbox automatically discovers and forwards:
Claude Credentials:
- Anthropic API keys (
ANTHROPIC_API_KEY
) - macOS Keychain credentials (Claude Code)
- AWS Bedrock credentials
- Google Vertex credentials
- Claude configuration files (
.claude.json
,.claude/
)
GitHub Credentials:
- GitHub CLI authentication (
gh auth
) - GitHub tokens (
GITHUB_TOKEN
,GH_TOKEN
) - Git configuration (
.gitconfig
)
- Claude runs with
--dangerously-skip-permissions
flag (safe in container) - Creates isolated branch for each session
- Full access to run any command within the container
- Files are copied into container (not mounted) for true isolation
- Git history preserved for proper version control
When Claude makes a commit:
- Real-time notification appears
- Full diff is displayed with syntax highlighting
- Interactive menu offers options:
- Continue working
- Push branch to remote
- Push branch and create PR
- Exit
Run multiple Claude instances simultaneously:
# Terminal 1: Start main developmentclaude-sandbox start --name main-dev# Terminal 2: Start feature branch workclaude-sandbox start --name feature-auth# Terminal 3: List all running containersclaude-sandbox list# Terminal 4: Attach to any containerclaude-sandbox attach
The default Docker image includes:
- Ubuntu 22.04
- Git, GitHub CLI
- Node.js, npm
- Python 3
- Claude Code (latest)
- Build essentials
Create a custom environment:
FROM claude-code-sandbox:latest# Add your toolsRUN apt-get update && apt-get install -y \ rust \ cargo \ postgresql-client# Install project dependenciesCOPY package.json /tmp/RUN cd /tmp && npm install# Custom configurationENV CUSTOM_VAR=value
Reference in config:
{"dockerfile":"./my-custom.Dockerfile"}
Start Claude Sandbox:
cd my-projectclaude-sandbox
Interact with Claude:
> Help me refactor the authentication module to use JWT tokens
Claude works autonomously:
- Explores codebase
- Makes changes
- Runs tests
- Commits changes
Review and push:
- See commit notification
- Review syntax-highlighted diff
- Choose to push and create PR
- Credentials are mounted read-only
- Containers are isolated from host
- Branch restrictions prevent accidental main branch modifications
- All changes require explicit user approval before pushing
Ensure Claude Code is installed globally:
npm install -g @anthropic-ai/claude-code@latest
Add your user to the docker group:
sudo usermod -aG docker$USER# Log out and back in for changes to take effect
Remove all Claude Sandbox containers and images:
npm run purge-containers
Set credentials explicitly:
export ANTHROPIC_API_KEY=your-keyexport GITHUB_TOKEN=your-token
Or use an.env
file withenvFile
config option.
Ensure you're using Node.js >= 18.0.0:
node --version
To build and develop Claude Code Sandbox from source:
git clone https://github.com/textcortex/claude-code-sandbox.gitcd claude-code-sandboxnpm installnpm run buildnpm link# Creates global 'claude-sandbox' command
npm run build
- Build TypeScript to JavaScriptnpm run dev
- Watch mode for developmentnpm start
- Run the CLInpm run lint
- Run ESLintnpm test
- Run testsnpm run purge-containers
- Clean up all containers
- Fork the repository
- Create a feature branch
- Make your changes
- Run tests:
npm test
- Run linter:
npm run lint
- Submit a pull request
MIT
About
Run Claude Code safely in local Docker containers without having to approve every permission
Resources
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Packages0
Uh oh!
There was an error while loading.Please reload this page.
Contributors4
Uh oh!
There was an error while loading.Please reload this page.