A VSCode container based on linuxserver.io vscode-server with Claude Code pre-installed
2.4K
A Docker image providing a complete web-based development environment for Claude Code, built on top of the excellent linuxserver/code-server image.
This Docker image bundles a web-based IDE (VS Code Server), Claude Code, a LiteLLM-powered model router, and Claude Threads into a comprehensive development environment accessible from any web browser and Mattermost client. Perfect for developers who want a self-contained, and highly flexible Claude Code workspace.
VS Code Server - Full-featured VS Code running in your browser
Claude Code - Anthropic's agentic coding tool
LiteLLM Router - Advanced model routing and provider proxy
Claude Threads - Real-time chat integration for Mattermost
cconx - ClaudeConX Docker Management Tool
build-env - Persistent Build Environment Manager
# Run the container
docker run -d \
--name=claude-dev \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Etc/UTC \
-e SUDO_PASSWORD=password \
-e DEFAULT_WORKSPACE=/workspace \
-e PWA_APPNAME=code-server \
-e NIM_API_KEY=your-nvidia-nim-api-key \
-e GOOGLE_API_KEY=your-google-ai-studio-api-key \
-e MISTRAL_API_KEY=your-mistral-api-key \
-e CEREBRAS_API_KEY=your-cerebras-api-key \
-e OPENCODE_ZEN_API_KEY=your-opencode-zen-api-key \
-e EXA_API_KEY=your-exa-api-key \
-p 8443:8443 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /path/to/your/code:/workspace \
--restart unless-stopped \
tylercollison2089/claude-conx
# Access at http://localhost:8443
This container supports extensive configuration through environment variables.
| Variable | Description |
|---|---|
PUID | User ID for container processes |
PGID | Group ID for container processes |
TZ | Timezone configuration |
PROXY_DOMAIN | Reverse proxy domain for external access |
DEFAULT_WORKSPACE | Default workspace directory |
PWA_APPNAME | Progressive Web App name |
| Variable | Description |
|---|---|
PASSWORD | Plaintext password for VS Code web interface |
HASHED_PASSWORD | Argon2id-hashed password |
SUDO_PASSWORD | Plaintext sudo password |
SUDO_PASSWORD_HASH | Hashed sudo password |
| Variable | Description |
|---|---|
CLAUDE_CODE_PERMISSION_MODE | Permission mode (acceptEdits, bypassPermissions, default, plan, dontAsk) |
CLAUDE_MARKETPLACES | Comma-separated list of plugin marketplaces |
CLAUDE_PLUGINS | Comma-separated list of plugins to install |
| Variable | Description |
|---|---|
NIM_API_KEY | Nvidia NIM API key (enables Nvidia NIM models, if set) |
GOOGLE_API_KEY | Google AI Studio API key (enables Google AI Studio models, if set) |
MISTRAL_API_KEY | Mistral AI API key (enables Mistral models, if set) |
CEREBRAS_API_KEY | Cerebras API key (enables Cerebras models, if set) |
OPENCODE_ZEN_API_KEY | OpenCode Zen API key (enables OpenCode Zen models, if set) |
EXA_API_KEY | EXA AI web search API key (enables EXA AI web search, if set) |
Claude Code is pre-configured to route all requests through the LiteLLM proxy at http://127.0.0.1:5090. The router automatically selects models based on request content:
| Model Group | Purpose | Default Provider |
|---|---|---|
lite-llm/router | Main entry point — multi-stage routing pipeline | Auto-routed |
lite-llm/default | Standard chat and coding tasks | OpenCode Zen (DeepSeek v4 Flash) |
lite-llm/think | Complex reasoning and deep analysis | NVIDIA NIM (DeepSeek v4 Pro) |
lite-llm/webSearch | Queries requiring web search | Google AI Studio (Gemini 3.5 Flash) |
lite-llm/image | Image analysis and vision tasks | Google AI Studio (Gemini 3.5 Flash) |
lite-llm/longContext | Long-context tasks | NVIDIA NIM (DeepSeek v4 Pro) |
| Variable | Description |
|---|---|
ENABLE_THREADS | Enable Claude Threads server |
MM_ADDRESS | Mattermost server URL |
MM_TOKEN | Mattermost bot authentication token |
MM_CHANNEL | Target channel for this container to use |
MM_TEAM | Mattermost team name (must exist in Mattermost) |
MM_BOT_NAME | Bot display name (must match Mattermost configuration) |
THREADS_CHROME | Chrome executable path |
THREADS_WORKTREE_MODE | Git worktree mode |
THREADS_SKIP_PERMISSIONS | Skip permission prompts |
| Variable | Description |
|---|---|
BUILD_CONTAINER | Docker image to use for build environment |
DEFAULT_WORKSPACE | Path to the workspace directory |
| Variable | Description |
|---|---|
GIT_REPO_URL | Repository URL to clone on startup |
GIT_BRANCH_NAME | Branch name |
| Variable | Description |
|---|---|
KNOWLEDGE_REPOS | Git repos with markdown files to load into CLAUDE.md (format: URL[:branch]:file1,file2;...) |
services:
claude-dev:
image: tylercollison2089/claude-conx:latest
container_name: claude-dev
environment:
- PUID=1000
- PGID=1000
- TZ=Etc/UTC
- PASSWORD=password # Optional
- HASHED_PASSWORD= # Optional
- SUDO_PASSWORD=password # Optional
- SUDO_PASSWORD_HASH= # Optional
- PROXY_DOMAIN=code-server.my.domain # Optional
- DEFAULT_WORKSPACE=/workspace
- PWA_APPNAME=code-server # Optional
- CLAUDE_CODE_PERMISSION_MODE=acceptEdits
- NIM_API_KEY=your-nvidia-nim-api-key # Required to use NIM models
- GOOGLE_API_KEY=your-google-ai-studio-api-key # Required to use Google models
- MISTRAL_API_KEY=your-mistral-api-key # Required to use Mistral models
- CEREBRAS_API_KEY=your-cerebras-api-key # Required to use Cerebras models
- OPENCODE_ZEN_API_KEY=your-opencode-zen-api-key # Required to use OpenCode Zen models
- EXA_API_KEY=your-exa-api-key # Required for EXA AI websearch
# Claude Code Plugins (optional)
- CLAUDE_MARKETPLACES=anthropics/claude-plugins-official
- CLAUDE_PLUGINS=ralph-loop,superpowers
# Git repository setup (optional)
- GIT_REPO_URL=https://github.com/user/repo.git
- GIT_BRANCH_NAME=feature-branch
# Knowledge repositories (optional)
- KNOWLEDGE_REPOS=https://github.com/user/docs.git:main:README.md,docs/guide.md
# Claude Threads (optional)
- ENABLE_THREADS=true
- IDE_ADDRESS=http://localhost:8443
- MM_ADDRESS=http://mattermost.example.com:8065
- MM_CHANNEL=claude-code
- MM_TOKEN=your-bot-token
- MM_TEAM=engineering
- MM_BOT_NAME=claude-code
- THREADS_CHROME=true
- THREADS_WORKTREE_MODE=off
- THREADS_SKIP_PERMISSIONS=true
ports:
- "8443:8443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock # Optional for docker support
- /path/to/code-server/config:/config # Only specify if using existing configuration
- /path/to/your/code:/workspace # Only specify if GIT_REPO_URL is unset
restart: unless-stopped
Claude Code is pre-configured to route all requests through the LiteLLM proxy at http://127.0.0.1:5090. No additional setup is needed — just open the terminal in VS Code and run claude.
To override the default routing and use a specific model directly, set the model environment variable to the desired LiteLLM model or model group:
environment:
- ANTHROPIC_DEFAULT_SONNET_MODEL=lite-llm/think # Use complex-reasoning tier
- ANTHROPIC_DEFAULT_HAIKU_MODEL=deepseek-ai/deepseek-v4-flash # Use a fast model
The LiteLLM proxy provides a three-stage routing pipeline:
lite-llm/image (Google Gemini 3.5 Flash)lite-llm/webSearch (Google Gemini 3.5 Flash)lite-llm/default (OpenCode Zen DeepSeek v4 Flash) for simple tasks or lite-llm/think (NVIDIA NIM DeepSeek v4 Pro) for complex reasoningThe routing configuration lives in /lite-llm/lite-llm-default.yaml. Key model groups:
| Group | Model | Provider |
|---|---|---|
lite-llm/default | DeepSeek V4 Flash | OpenCode Zen |
lite-llm/think | DeepSeek V4 Pro | NVIDIA NIM |
lite-llm/webSearch | Gemini 3.5 Flash | Google AI Studio |
lite-llm/image | Gemini 3.5 Flash | Google AI Studio |
lite-llm/longContext | DeepSeek V4 Pro | NVIDIA NIM |
lite-llm/background | DeepSeek V4 Flash | OpenCode Zen |
Each model group has a fallback chain defined in the YAML config, so if the primary model is unavailable, traffic routes to alternative providers automatically.
Enable real-time Mattermost integration:
environment:
- ENABLE_THREADS=true
- MM_ADDRESS=http://mattermost.example.com:8065
- MM_TOKEN=your-bot-token
- MM_CHANNEL=claude-code
- MM_TEAM=engineering
- MM_BOT_NAME=claude-code
Features:
cconx provides command-line management of ClaudeConX instances:
# Start a new instance
cconx start my-instance
# Start with port and environment variable overrides
cconx start dev-instance --port 8080 --env CLAUDE_CODE_PERMISSION_MODE=bypassPermissions
# Show instance status
cconx status
# Stop an instance
cconx stop my-instance
# Delete an instance (container and config)
cconx delete my-instance
build-env creates persistent Docker containers for build commands:
# Set required environment variables
export BUILD_CONTAINER="python:3.12-slim"
export DEFAULT_WORKSPACE="/path/to/workspace"
# Run commands in the build environment
build-env python --version
build-env npm install
build-env npm run build
# Shutdown the build environment container
build-env --exit
Automatically clone and configure a repository on startup:
environment:
- GIT_REPO_URL=https://github.com/user/repo.git
- GIT_BRANCH_NAME=feature/my-branch # Optional: auto-generated if not set
The container will:
/workspaceCombine markdown documentation from multiple repositories:
environment:
- KNOWLEDGE_REPOS=https://github.com/user/repo1.git:main:README.md,docs/guide.md;https://github.com/user/repo2.git:develop:docs/api.md
The combined documentation is saved as /workspace/CLAUDE.md.
Format:
; separates repositories: separates URL, optional branch, and file list, separates files within a repositoryConfigure Claude Code security settings:
| Mode | Description |
|---|---|
acceptEdits | Default — balanced security with user confirmation |
bypassPermissions | Full access for trusted environments |
default | Claude's default permission behavior |
plan | Planning mode without execution |
dontAsk | Suppress confirmation prompts |
Run Docker commands inside the container:
# List containers on the host
docker ps
# Build containers
docker build -t my-app .
Security Note: Mounting /var/run/docker.sock gives the container full control over the host's Docker daemon.
git clone https://github.com/TylerCollison/vscode-claude.git
cd claude-conx
docker build -t tylercollison2089/vscode-claude:latest .
# Check container logs
docker logs claude-dev
# Inspect container environment
docker exec claude-dev env
# Test internal services
docker exec claude-dev curl -I http://localhost:8443
# VS Code Server status
docker exec claude-dev ps aux | grep code-server
# Claude Code functionality
docker exec claude-dev claude --version
# Check LiteLLM proxy status
docker exec claude-dev curl -s http://127.0.0.1:5090/health
Claude Code Authentication:
which claudecurl -I https://api.claude.comVS Code Connection:
docker port claude-devnetstat -tulpn | grep 8443Mattermost Integration:
curl -H "Authorization: Bearer $MM_TOKEN" "$MM_ADDRESS/api/v4/channels"LiteLLM Configuration:
curl -s http://127.0.0.1:5090/healthcconx Issues:
which cconxls ~/.cconx/instances/docker network lsbuild-env Issues:
docker psls -la $DEFAULT_WORKSPACEdocker pull $BUILD_CONTAINERThis Docker image is provided as-is. Please refer to the individual component licenses for linuxserver/code-server, Claude Code, LiteLLM, and Claude Threads.
Content type
Image
Digest
sha256:48cbbb846…
Size
4.1 GB
Last updated
about 2 months ago
docker pull tylercollison2089/vscode-claude