recoder-code
Version:
🚀 Recoder Code - AI-powered CLI for developers. Chat with 40+ models (Claude, GPT-4, DeepSeek, Gemini, Qwen3) with tool calling support. Build projects, automate workflows. Free agentic models included! Features interactive mode, file operations, and opt
332 lines (245 loc) • 8.84 kB
Markdown
# Recoder Code Sandbox Setup Guide
## What is the Sandbox?
The sandbox feature provides **isolated execution** of commands and code, protecting your system from potentially harmful operations. When enabled, Recoder Code runs all shell commands and file operations inside a containerized environment.
## Benefits of Using Sandbox
1. **Security**: Isolates AI-generated code from your main system
2. **Reproducibility**: Consistent environment across different machines
3. **Safety**: Prevents accidental system-wide changes
4. **Clean testing**: Test code without affecting your development environment
## Current Status
You're seeing "no sandbox" in the footer because sandbox mode is **disabled by default**. Recoder Code supports three sandbox options:
1. **Docker** (Linux/macOS/Windows)
2. **Podman** (Linux/macOS alternative to Docker)
3. **macOS Seatbelt** (macOS only, lightweight sandboxing)
## Quick Setup
### Option 1: Docker Sandbox (Recommended for most users)
#### Prerequisites
```bash
# Install Docker Desktop (macOS/Windows)
# Or install Docker Engine (Linux)
# Visit: https://docs.docker.com/get-docker/
```
#### Enable Sandbox
```bash
# Method 1: Environment variable (temporary)
export RECODER_SANDBOX=docker
# Method 2: In .env file (permanent)
echo "RECODER_SANDBOX=docker" >> ~/.recoder/.env
# Method 3: Command line flag
recoder-code --sandbox docker
```
#### Specify Custom Image (Optional)
```bash
# Use a specific Docker image
export RECODER_SANDBOX_IMAGE=node:20-alpine
# Or in package.json config
{
"config": {
"sandboxImageUri": "node:20-alpine"
}
}
```
### Option 2: macOS Seatbelt (macOS only, lightweight)
macOS Seatbelt provides lightweight sandboxing without Docker:
```bash
# Enable seatbelt sandbox
export RECODER_SANDBOX=sandbox-exec
# Choose a profile (optional, default: permissive-open)
export SEATBELT_PROFILE=restrictive-open
# Run Recoder Code
recoder-code
```
**Available Profiles:**
- `permissive-open` - Network access allowed (default)
- `permissive-closed` - No network access
- `permissive-proxied` - Network through proxy only
- `restrictive-open` - Limited file access + network
- `restrictive-closed` - Limited file access, no network
- `restrictive-proxied` - Limited file access + proxy
### Option 3: Podman (Docker alternative)
```bash
# Install Podman first
# macOS: brew install podman
# Linux: sudo apt install podman (or use your distro's package manager)
# Enable Podman sandbox
export RECODER_SANDBOX=podman
# Run Recoder Code
recoder-code
```
## Configuration Options
### Environment Variables
```bash
# Core sandbox settings
RECODER_SANDBOX=docker|podman|sandbox-exec|false # Sandbox type
RECODER_SANDBOX_IMAGE=image:tag # Container image
SANDBOX=container-name # Inside sandbox (auto-set)
# Advanced settings
SANDBOX_PORTS=8080,3000 # Expose ports
SANDBOX_FLAGS="--memory=2g --cpus=2" # Custom Docker flags
SANDBOX_MOUNTS=/path/to/mount:/container/path:ro # Additional mounts
SANDBOX_ENV="KEY1=value1,KEY2=value2" # Extra env vars
SANDBOX_SET_UID_GID=1 # Use host UID/GID (Linux)
# Seatbelt-specific (macOS)
SEATBELT_PROFILE=permissive-open # Seatbelt profile
# Proxy settings (for restricted networks)
RECODER_SANDBOX_PROXY_COMMAND="mitmproxy -p 8877" # Proxy command
HTTPS_PROXY=http://localhost:8877 # Proxy URL
```
### Settings File Configuration
Add to `~/.recoder/settings.json`:
```json
{
"tools": {
"sandbox": "docker"
}
}
```
Or use `recoder-code --sandbox docker` when starting.
## Verifying Sandbox is Active
When sandbox is enabled, you'll see in the footer:
```
🔒 docker-node-20 # Docker/Podman sandbox active
🔒 macOS Seatbelt (...) # macOS Seatbelt active
💻 Interactive Mode # No sandbox (current state)
```
You can also check with:
```bash
# Inside Recoder Code, run:
!echo $SANDBOX
# If output is empty, no sandbox
# If output shows container name, sandbox is active
```
## Troubleshooting
### Docker Daemon Not Running
```
Error: Cannot connect to Docker daemon
Solution: Start Docker Desktop or Docker service
```
### Image Not Found
```
Error: Sandbox image 'image:tag' is missing
Solution: Pull the image manually or let Recoder Code pull it
docker pull node:20-alpine
```
### Permission Issues (Linux)
```
Error: Permission denied
Solution: Add your user to docker group
sudo usermod -aG docker $USER
newgrp docker
```
### macOS Seatbelt Not Working
```
Error: Missing sandbox command 'sandbox-exec'
Solution: Seatbelt is built into macOS, check your macOS version
```
## Custom Sandbox Images
### Create a Custom Dockerfile
Create `.recoder/sandbox.Dockerfile`:
```dockerfile
FROM node:20-alpine
# Install additional tools
RUN apk add --no-cache \
python3 \
py3-pip \
git \
curl \
vim
# Install Python packages
RUN pip3 install requests numpy pandas
# Set working directory
WORKDIR /workspace
# Custom entrypoint (optional)
CMD ["bash"]
```
### Build and Use Custom Image
```bash
# Set BUILD_SANDBOX to build on first run
export BUILD_SANDBOX=1
export RECODER_SANDBOX=docker
export RECODER_SANDBOX_IMAGE=recoder-code-custom
recoder-code
```
## Performance Considerations
### Sandbox Overhead
- **Docker/Podman**: ~100-500ms startup overhead, minimal runtime impact
- **macOS Seatbelt**: Negligible overhead, native performance
### When to Use Sandbox
- **Always**: When running untrusted or AI-generated code
- **Development**: Testing in clean environments
- **CI/CD**: Reproducible builds
- **Demos**: Safe demonstrations
### When Sandbox Might Not Be Needed
- **Trusted codebases**: Your own well-tested projects
- **Read-only operations**: Analyzing code without execution
- **Performance-critical**: High-frequency operations
## Integration with Recoder Code Features
### File Operations
All file read/write operations happen in the sandbox when enabled.
### Shell Commands
Every `!command` or shell execution runs inside the sandbox.
### Network Access
- Docker/Podman: Network access by default
- Seatbelt: Depends on profile (-open/-closed/-proxied)
### MCP Servers
MCP servers can run in or outside the sandbox depending on configuration.
## Next Steps
1. **Choose a sandbox method** based on your OS and requirements
2. **Set environment variables** or use command-line flags
3. **Test with a simple command** to verify sandbox is active
4. **Customize sandbox image** if you need additional tools
## Example Workflows
### Workflow 1: Basic Docker Sandbox
```bash
# Terminal 1: Start Docker Desktop (or ensure daemon is running)
# Terminal 2: Enable sandbox and run Recoder Code
export RECODER_SANDBOX=docker
recoder-code
# Inside Recoder Code:
> !whoami # Should show 'node' or 'gemini' (container user)
> !hostname # Should show container name
```
### Workflow 2: Custom Python Environment
```bash
# Create custom Dockerfile
mkdir -p ~/.recoder
cat > ~/.recoder/sandbox.Dockerfile << 'EOF'
FROM python:3.11-slim
RUN pip install numpy pandas scikit-learn jupyter
WORKDIR /workspace
EOF
# Build and use
export BUILD_SANDBOX=1
export RECODER_SANDBOX=docker
export RECODER_SANDBOX_IMAGE=recoder-python
recoder-code
```
### Workflow 3: macOS Lightweight Sandbox
```bash
# No Docker needed, uses native macOS Seatbelt
export RECODER_SANDBOX=sandbox-exec
export SEATBELT_PROFILE=restrictive-open
recoder-code
# Inside Recoder Code:
> !echo "Running in Seatbelt sandbox"
> !curl https://example.com # Network access (if -open profile)
```
## FAQ
**Q: Will sandbox slow down Recoder Code?**
A: Docker/Podman adds ~100-500ms startup time. macOS Seatbelt has negligible impact.
**Q: Can I use multiple sandbox types?**
A: No, choose one sandbox method per session.
**Q: Do I need to rebuild the sandbox image when I update Recoder Code?**
A: Usually no, unless there are sandbox-specific changes. Set `BUILD_SANDBOX=1` to force rebuild.
**Q: Can I access files outside my project directory in sandbox?**
A: By default, only your project directory and `~/.recoder` are mounted. Use `SANDBOX_MOUNTS` for additional paths.
**Q: Is sandbox required for Recoder Code to work?**
A: No, sandbox is optional. Recoder Code works fine without it, but sandbox provides additional safety.
**Q: Can I expose ports from the sandbox?**
A: Yes, use `SANDBOX_PORTS=8080,3000` to expose specific ports.
## Support
- **Documentation**: See `/docs` in Recoder Code repository
- **Issues**: Create an issue on GitHub
- **Community**: Join discussions in the community forum
**Note**: Sandbox functionality is inherited from the Qwen Code base that Recoder Code was built upon. The code fully supports sandbox modes but requires explicit enablement.