{"id":51431382,"url":"https://github.com/iimmutable-ai/cc-docker","last_synced_at":"2026-07-05T04:02:36.931Z","repository":{"id":347970904,"uuid":"1195737637","full_name":"iimmutable-ai/cc-docker","owner":"iimmutable-ai","description":"Dockerized development environment for Claude Code CLI. Multi-runtime support (Node.js, .NET, Go, Rust) with optional Solana and Mobile profiles. Security-hardened with cross-platform support.","archived":false,"fork":false,"pushed_at":"2026-06-30T10:12:50.000Z","size":159,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-30T12:11:45.898Z","etag":null,"topics":["claude-code","devcontainer","development-environment","docker","docker-compose","dotnet","flutter","golang","nodejs","react-native","rust","solana"],"latest_commit_sha":null,"homepage":null,"language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/iimmutable-ai.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-30T02:33:10.000Z","updated_at":"2026-06-30T10:12:53.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/iimmutable-ai/cc-docker","commit_stats":null,"previous_names":["iimmutable/docker-claude","iimmutable-ai/cc-docker"],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/iimmutable-ai/cc-docker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iimmutable-ai%2Fcc-docker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iimmutable-ai%2Fcc-docker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iimmutable-ai%2Fcc-docker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iimmutable-ai%2Fcc-docker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/iimmutable-ai","download_url":"https://codeload.github.com/iimmutable-ai/cc-docker/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iimmutable-ai%2Fcc-docker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35142824,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-05T02:00:06.290Z","response_time":100,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["claude-code","devcontainer","development-environment","docker","docker-compose","dotnet","flutter","golang","nodejs","react-native","rust","solana"],"created_at":"2026-07-05T04:02:35.905Z","updated_at":"2026-07-05T04:02:36.903Z","avatar_url":"https://github.com/iimmutable-ai.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# cc-docker\n\n**Run Claude Code in a fully equipped, cross-platform Docker dev environment.**\n\nOne container. Every runtime. Zero host pollution.\n\n\u003c!-- Badges --\u003e\n\u003cp align=\"left\"\u003e\n  \u003ca href=\"LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-MIT-blue.svg\" alt=\"License: MIT\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/iimmutable/cc-docker/stargazers\"\u003e\u003cimg src=\"https://img.shields.io/github/stars/iimmutable/cc-docker?style=social\" alt=\"GitHub Stars\" /\u003e\u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/badge/platforms-Mac%20%7C%20Windows%20%7C%20Linux-lightgrey\" alt=\"Platforms\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/docker-compose-2DB567?logo=docker\u0026logoColor=white\" alt=\"Docker Compose\" /\u003e\n  \u003ca href=\"https://claude.ai/code\"\u003e\u003cimg src=\"https://img.shields.io/badge/Built%20for-Claude%20Code-d45d29\" alt=\"Built for Claude Code\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n## Quick Start\n\n```bash\ngit clone https://github.com/iimmutable/cc-docker.git \u0026\u0026 cd cc-docker\ncp .env.example .env \u0026\u0026 make build \u0026\u0026 make up \u0026\u0026 make claude\n```\n\n## Who Is This For?\n\n| You are… | cc-docker gives you… |\n|---|---|\n| AI-first developer | Ready-to-go Claude Code with every runtime pre-installed |\n| Polyglot engineer | Node, .NET, Go, Rust — switch stacks without installing anything |\n| Solana / Web3 dev | One-command Solana profile with Anchor + Rust BPF |\n| Mac ↔ Windows switcher | Identical environment on both platforms, zero reconfiguration |\n| Security-conscious | No host pollution, isolated volumes, encrypted backups |\n| Team collaborator | Reproducible dev setup — `git clone` and go |\n\n## Features\n\n| | | |\n|---|---|---|\n| AI-Ready | Claude Code (native installer) with OAuth + API key auth | Browser Built-In | Playwright + Chromium + noVNC visual browser |\n| Multi-Runtime | Node.js, .NET, Go, Rust in one image | Profiles | Solana, Mobile (Android/Flutter/RN) extensions |\n| Cross-Platform | Mac, Windows (WSL2), Linux — identical experience | Multi-Instance | Run multiple isolated instances simultaneously |\n| Security-First | Docker socket off by default, ports bound to localhost | Terminal Tools | Yazi, Lazygit, Starship prompt, GitHub CLI included |\n| Version Flexible | Switch Node/.NET/Go/Rust versions at runtime | VS Code Ready | Dev Container config included, extensions pre-configured |\n| GPU Support | NVIDIA CUDA runtime on Linux/WSL2 | iOS Workflow | Host bind mount for Flutter → Xcode on macOS |\n\n## Table of Contents\n\n- [Architecture](#architecture)\n- [Getting Started](#getting-started)\n  - [Step 0 — Get cc-docker](#step-0--get-cc-docker)\n  - [Step 1 — Install Docker Desktop](#step-1--install-docker-desktop)\n  - [Step 2 — Configure](#step-2--configure)\n  - [Step 3 — Build \u0026 Start](#step-3--build--start)\n  - [Step 4 — Verify](#step-4--verify)\n  - [Step 5 — Authenticate](#step-5--authenticate-if-using-oauth)\n  - [Step 6 — Register Marketplace](#step-6--register-marketplace-if-using-plugins)\n  - [Step 7 — Start Coding](#step-7--start-coding)\n  - [Quick Reference](#quick-reference)\n- [Multi-Instance Setup](#multi-instance-setup)\n- [Makefile Commands](#makefile-commands)\n- [Setup Options](#setup-options)\n- [Authentication](#authentication)\n- [Claude Code Configuration](#claude-code-configuration)\n- [Port Mappings](#port-mappings)\n- [Working with Projects](#working-with-projects)\n- [Optional Profiles](#optional-profiles)\n- [Custom Builds](#custom-builds)\n- [VS Code Dev Container](#vs-code-dev-container)\n- [GPU / CUDA Support](#gpu--cuda-support)\n- [Cross-Platform: Mac ↔ Windows](#cross-platform-mac--windows)\n- [Version Management](#version-management)\n- [Backup \u0026 Restore](#backup--restore)\n- [Security](#security)\n- [Troubleshooting](#troubleshooting)\n- [Project Structure](#project-structure)\n- [Co-Developed with](#co-developed-with)\n- [License](#license)\n\n## Architecture\n\n```\n┌──────────────────────────────────────────────────────────────┐\n│                     Docker Compose                           │\n│                    Project: ${COMPOSE_PROJECT_NAME}          │\n│                                                              │\n│  SERVICES                                                    │\n│  ├── cc-docker          (default)  Core dev environment  │\n│  ├── cc-docker-solana   (profile)  Solana + Anchor       │\n│  └── cc-docker-mobile   (profile)  Android SDK/Flutter/RN│\n│                                                              │\n│  VOLUMES (prefixed by project name)                          │\n│  ├── {project}_vol-projects  →  /workspace  (code+deps)     │\n│  └── {project}_vol-home      →  /home/dev   (user home)     │\n│                                                              │\n│  IMAGE (conditional install via build args)                   │\n│  Ubuntu 24.04 LTS base + Docker CLI + core utils             │\n│  + nvm + Node LTS + pnpm/yarn/tsx          (INCLUDE_NODE)    │\n│  + .NET 8 \u0026 9 SDK                          (INCLUDE_DOTNET)  │\n│  + Go 1.26 + gopls + delve                 (INCLUDE_GOLANG)  │\n│  + rustup + stable + rust-analyzer/clippy  (INCLUDE_RUST)    │\n│  + Playwright + Chromium + noVNC/Xvfb      (INCLUDE_BROWSER) │\n│  + NVIDIA CUDA runtime                     (INCLUDE_GPU)     │\n│  + Claude Code CLI + non-root user + SSH/Git                 │\n│  + Yazi + Lazygit + Starship + GitHub CLI (terminal tools)   │\n└──────────────────────────────────────────────────────────────┘\n```\n\n## Getting Started\n\n### Step 0 — Get cc-docker\n\n```bash\ngit clone https://github.com/iimmutable/cc-docker.git\ncd cc-docker\n```\n\n### Step 1 — Install Docker Desktop\n\n| Platform | Download | Notes |\n|---|---|---|\n| Mac | [Docker Desktop for Mac](https://docs.docker.com/desktop/install/mac-install/) | Choose Apple Silicon (M-series) or Intel. Check with `uname -m` |\n| Windows | [Docker Desktop for Windows](https://docs.docker.com/desktop/install/windows-install/) | Requires WSL2 backend enabled |\n\nAfter installing, launch Docker Desktop and wait for the whale icon to stop animating. Verify:\n\n```bash\ndocker --version          # Should show a version number\ndocker compose version    # Should show a version number\n```\n\n### Step 2 — Configure\n\n```bash\ncp .env.example .env\n```\n\nEdit `.env`:\n\n```bash\n# Multi-Instance Configuration (REQUIRED for parallel instances)\nCOMPOSE_PROJECT_NAME=cc-docker    # Change for each instance (e.g., trial-claude)\nPORT_BASE=41                          # Use 42 for second instance, 43 for third\n\n# Auth (pick one):\nANTHROPIC_API_KEY=sk-ant-api03-your-key-here   # Option A: API key\n# Or leave empty and run `make login` later     # Option B: OAuth\n\n# Optional — proxy or local LLM gateway (leave blank to use api.anthropic.com):\n# ANTHROPIC_BASE_URL=https://your-proxy.example.com\n\n# Optional — pin specific model versions (leave blank for Claude Code defaults):\n# ANTHROPIC_DEFAULT_HAIKU_MODEL=claude-haiku-4-5-20251001\n# ANTHROPIC_DEFAULT_SONNET_MODEL=claude-sonnet-4-6\n# ANTHROPIC_DEFAULT_OPUS_MODEL=claude-opus-4-6\n\n# Mac/Linux only (run these commands to get the values):\nSSH_AUTH_SOCK=       # paste output of: echo $SSH_AUTH_SOCK\nHOME=                # paste output of: echo $HOME\n\n# Optional — local Claude Code plugin marketplace:\nCLAUDE_MARKETPLACE_PATH=/path/to/your/marketplace\n```\n\n\u003c!-- AUTO-GENERATED: from .env.example — do not edit this section manually --\u003e\n#### Environment Variable Reference\n\n| Variable | Required | Description |\n|---|---|---|\n| `COMPOSE_PROJECT_NAME` | No* | Docker Compose project name (namespaces containers, volumes, networks). Change for each parallel instance. Default: `cc-docker`. |\n| `PORT_BASE` | No | Port prefix for host bindings. Default: `41` → 41xxx ports. Use `42` for second instance, `43` for third, etc. |\n| `VOLUME_CHECK_MODE` | No | Volume check mode: `interactive` (prompt), `auto-fresh` (create new), `auto-adopt` (copy from source), `skip` (no checks). Default: `interactive`. |\n| `VOLUME_ADOPT_FROM` | No | Source project for auto-adopt mode. Example: `cc-docker`. Only used when `VOLUME_CHECK_MODE=auto-adopt`. |\n| `ANTHROPIC_API_KEY` | No* | API key for headless auth. Leave empty and use `make login` for OAuth. |\n| `ANTHROPIC_BASE_URL` | No | Override the Anthropic API endpoint (e.g. for proxies or local LLM gateways). |\n| `ANTHROPIC_DEFAULT_HAIKU_MODEL` | No | Pin a specific Haiku model version. Leave empty for Claude Code defaults. |\n| `ANTHROPIC_DEFAULT_SONNET_MODEL` | No | Pin a specific Sonnet model version. Leave empty for Claude Code defaults. |\n| `ANTHROPIC_DEFAULT_OPUS_MODEL` | No | Pin a specific Opus model version. Leave empty for Claude Code defaults. |\n| `CLAUDE_CODE_VERSION` | No | Claude Code version target baked into the image (`2.1.116`, `stable`, `latest`, or other specific version). Requires rebuild to change. **Default: `2.1.116`** — pinned for compatibility with 3rd-party LLM providers; newer versions break custom Anthropic-compatible gateways. See [Updating Claude Code](#updating-claude-code). |\n| `DEV_USER` | No | Username inside the container (default: `dev`). Set to match your host username or any custom name. Requires rebuild. |\n| `SSH_AUTH_SOCK` | No | SSH agent socket path (Mac/Linux). Run `echo $SSH_AUTH_SOCK` to get value. |\n| `HOME` | No | Host home directory for mounting `.gitconfig` (Mac/Linux). Run `echo $HOME`. |\n| `CLAUDE_MARKETPLACE_PATH` | No | Absolute path to a local Claude Code plugin marketplace folder on your host. |\n| `HOST_WORKSPACE_PATH` | No | Host workspace folder for iOS development. Used with host-bind override. Default: `./workspace`. |\n| `USERPROFILE` | No | Windows only. Set to `%USERPROFILE%` path (e.g. `C:\\Users\\YourName`). |\n\n*One of `ANTHROPIC_API_KEY` or OAuth (`make login`) is required to use Claude Code. `COMPOSE_PROJECT_NAME` and `PORT_BASE` must be changed when running multiple instances simultaneously.\n\u003c!-- AUTO-GENERATED END --\u003e\n\n### Step 3 — Build \u0026 Start\n\n**Mac / Linux:**\n\n```bash\nchmod +x scripts/setup.sh scripts/entrypoint.sh\nmake build            # First build: ~10-20 min (cached after that)\nmake up\n```\n\n**Windows (PowerShell):**\n\n```powershell\n.\\scripts\\setup.ps1\n```\n\n### Step 4 — Verify\n\n```bash\nmake health\n```\n\nExpected output:\n\n```\n=== Runtime Health Check ===\n\nNode.js:  v24.x.x\nnpm:      11.x.x\n.NET:     9.x.x\nGo:       go version go1.26.x\nRust:     rustc 1.x.x\nDocker:   Docker version 2x.x.x\nGit:      git version 2.x.x\nGitHub:   gh version 2.67.0\nClaude:   2.1.116 (Claude Code)\n\n=== Auth Status ===\nAPI Key: configured            # or: Auth: NOT CONFIGURED\n\n=== Docker Socket ===\nSocket: not mounted (default for security)\n\nBrowser:  1.x.x\nClaude Code: Global settings loaded\nClaude Code: Local marketplace mounted (N plugin(s))\n```\n\n### Step 5 — Authenticate (if using OAuth)\n\nSkip this if you set `ANTHROPIC_API_KEY` in `.env`.\n\n```bash\nmake login\n```\n\nFollow the URL shown in the terminal and complete login in your browser.\n\n### Step 6 — Register Marketplace (if using plugins)\n\nSkip this if you don't have a local marketplace.\n\n```bash\nmake shell\nclaude plugin marketplace add /etc/claude-code/marketplace\n```\n\n### Step 7 — Start Coding\n\n```bash\n# Launch Claude Code directly\nmake claude\n\n# Or open a shell, clone a project, then start Claude Code\nmake shell\ncd /workspace\ngit clone git@github.com:your-org/your-project.git\ncd your-project\nclaude\n```\n\n### Quick Reference\n\n| What you want to do | Command |\n|---|---|\n| Initialize environment | `make init` |\n| Start the environment | `make up` |\n| Stop the environment | `make down` |\n| Open a shell | `make shell` |\n| Launch Claude Code | `make claude` |\n| OAuth login | `make login` |\n| Reset Claude Code to baked version | `make claude-reset` |\n| GitHub CLI login | `make gh-auth` |\n| GitHub CLI status | `make gh-status` |\n| Check runtime health | `make health` |\n| Backup your projects | `make backup` |\n| Encrypted backup | `make backup-enc` |\n| Enable Docker-in-Docker | `make DIND=true up` |\n| Enable debugger support | `make DEBUG=true up` |\n| Copy file into container | `docker cp ./file.txt $(docker ps -q -f name=cc-docker):/workspace/` |\n| Copy file out of container | `docker cp $(docker ps -q -f name=cc-docker):/workspace/file.txt ./` |\n| View all commands | `make help` |\n| Install plugins | `make install-plugins` |\n| Sync plugins | `make sync-plugins` |\n| Open visual browser | `make browser` |\n| Start visual browser in container | `make browser-start` |\n| Stop visual browser | `make browser-stop` |\n| Run Playwright tests | `make browser-test TEST=path/to/test` |\n| Take a screenshot | `make browser-screenshot URL=https://example.com` |\n| Check volume status | `make volume-status` |\n| Adopt orphan volumes | `make volume-adopt FROM=cc-docker` |\n| iOS development (macOS) | `make host-bind-mobile-up` |\n\n## Multi-Instance Setup\n\nYou can run multiple isolated instances of cc-docker simultaneously. Each instance has its own:\n- **Containers** — separate container names\n- **Volumes** — isolated code and auth storage\n- **Ports** — configurable port range to avoid conflicts\n\n### Volume Name Changes\n\nWhen you change `COMPOSE_PROJECT_NAME` (e.g., setting up a second instance), Docker Compose creates NEW volumes with the new project prefix. Old volumes from the previous configuration remain as \"orphans\" — they're not deleted but are no longer associated with your project.\n\nThe `make up` command now includes a pre-flight volume check that:\n- Detects if current project volumes exist\n- Finds orphan volumes from other project names\n- Prompts you to choose an action (fresh start, adopt data, or cancel)\n\n### Volume Check Modes\n\n| Mode | Behavior | Use Case |\n|------|----------|----------|\n| `interactive` (default) | Prompt user when orphans detected | Normal usage |\n| `auto-fresh` | Always create fresh volumes | CI/CD, automated environments |\n| `auto-adopt` | Auto-adopt from specified project | Migration with known source |\n| `skip` | Skip all checks | Trusted environments |\n\n```bash\n# Interactive mode (default)\nmake up\n\n# Auto-fresh — create new volumes without prompting\nVOLUME_CHECK_MODE=auto-fresh make up\n\n# Auto-adopt — copy data from specific project\nVOLUME_ADOPT_FROM=cc-docker make up\n\n# Skip checks — proceed without prompts\nVOLUME_CHECK_MODE=skip make up\n```\n\n### Volume Management Commands\n\n| Command | Description |\n|---|---|\n| `make volume-status` | Show current volumes, orphans, and state file |\n| `make volume-adopt FROM=x` | Adopt volumes from project 'x' |\n| `make volume-check` | Run pre-flight check manually |\n\n### Quick Setup\n\n1. **Copy the project to a new location:**\n   ```bash\n   cp -r /path/to/cc-docker /path/to/trial-claude\n   cd /path/to/trial-claude\n   ```\n\n2. **Create `.env` with unique project name and port base:**\n   ```bash\n   cp .env.example .env\n   # Edit .env:\n   #   COMPOSE_PROJECT_NAME=trial-claude\n   #   PORT_BASE=42\n   ```\n\n3. **Build and start:**\n   ```bash\n   make build\n   make up\n   ```\n\n### How It Works\n\n| Setting | First Instance | Second Instance |\n|---------|---------------|-----------------|\n| `COMPOSE_PROJECT_NAME` | `cc-docker` | `trial-claude` |\n| `PORT_BASE` | `41` | `42` |\n| Container name | `cc-docker-cc-docker-1` | `trial-claude-cc-docker-1` |\n| Project volume | `cc-docker_vol-projects` | `trial-claude_vol-projects` |\n| Home volume | `cc-docker_vol-home` | `trial-claude_vol-home` |\n| Ports | 41xxx (41300, 41517, etc.) | 42xxx (42300, 42517, etc.) |\n\n### Example: Running Two Instances\n\n```bash\n# Terminal 1 — Main instance\ncd ~/projects/cc-docker\n# .env: COMPOSE_PROJECT_NAME=cc-docker, PORT_BASE=41\nmake up\nmake claude\n\n# Terminal 2 — Trial instance\ncd ~/projects/trial-claude\n# .env: COMPOSE_PROJECT_NAME=trial-claude, PORT_BASE=42\nmake up\nmake claude\n```\n\nBoth instances run independently with separate codebases and authentication.\n\n### Accessing Each Instance\n\n| Service | Main Instance | Trial Instance |\n|---------|--------------|----------------|\n| React/Express | `localhost:41300` | `localhost:42300` |\n| Vite | `localhost:41517` | `localhost:42517` |\n| noVNC browser | `localhost:41608` | `localhost:42608` |\n| Shell | `make shell` | `make shell` |\n\n### Sharing Images Between Instances\n\nImages are built once and tagged with the project name. To share the base image:\n\n```bash\n# Build in first instance\ncd ~/projects/cc-docker\nmake build\n\n# Reuse image in second instance (tag it)\ndocker tag cc-docker:latest trial-claude:latest\n\n# Start second instance (skip build)\ncd ~/projects/trial-claude\nmake up\n```\n\n### Backup Isolation\n\nBackups are per-instance and include the project name:\n\n```bash\n# Main instance backup\ncc-docker-backup_20260410_120000.tar.gz\n\n# Trial instance backup\ntrial-claude-backup_20260410_120000.tar.gz\n```\n\n## Makefile Commands\n\nThe Makefile is the primary interface. Run `make help` to see all commands:\n\n```bash\n# Initialize\nmake init               # Create .env from .env.example if missing\n\n# Build\nmake build              # Build core image (all stacks)\nmake build-slim         # Build with Node + Go only (skip .NET, Rust)\nmake build-all          # Build everything including Solana + Mobile profiles\nmake build-no-cache     # Full rebuild without Docker layer cache\nmake GPU=true build     # Build with NVIDIA GPU support\n\n# Run\nmake up                 # Start core environment\nmake down               # Stop all services (volumes persist)\nmake restart            # Stop + start\nmake solana-up          # Start with Solana profile\nmake mobile-up          # Start with Mobile profile\nmake all-up             # Start everything\nmake host-bind-up       # Start with host bind mount (core)\nmake host-bind-mobile-up # Start with host bind + Mobile (iOS dev)\nmake host-bind-solana-up # Start with host bind + Solana\n\n# Interactive\nmake shell              # Open bash shell in cc-docker\nmake claude             # Launch Claude Code CLI\nmake login              # Run Claude OAuth login\nmake claude-reset       # Reset Claude Code to baked version (removes runtime override)\nmake gh-auth            # Run GitHub CLI auth login\nmake gh-status          # Show GitHub CLI auth status\nmake shell-solana       # Open shell in Solana container\nmake shell-mobile       # Open shell in Mobile container\n\n# Diagnostics\nmake health             # Check all runtimes, auth, Docker socket\nmake status             # Show containers, volumes, image sizes\nmake logs               # Follow cc-docker logs\nmake logs-all           # Follow all service logs\n\n# Plugin Management\nmake install-plugins   # Register marketplace and sync plugin content\nmake sync-plugins     # Manually trigger plugin content sync from marketplace\nmake reset-plugins    # Clear stale plugin state for re-sync on next start\n\n# Browser (noVNC + Playwright)\nmake browser           # Open noVNC visual browser in host browser\nmake browser-start     # Start noVNC visual browser inside container\nmake browser-stop      # Stop visual browser processes\nmake browser-test      # Run Playwright tests (usage: make browser-test TEST=path/to/test)\nmake browser-screenshot # Take a Playwright screenshot (usage: make browser-screenshot URL=https://example.com)\n\n# Cleanup\nmake clean              # Remove containers + images (volumes persist)\nmake nuke               # ⚠️ Remove EVERYTHING including volumes\n\n# Backup \u0026 Restore\nmake backup             # Backup project volume to timestamped tar.gz\nmake backup-enc         # Encrypted backup (AES-256, prompts for passphrase)\nmake backup-list        # List all backups (plain + encrypted)\nmake restore FILE=...   # Restore from a plain backup\nmake restore-enc FILE=... # Restore from an encrypted backup\nmake backup-clean       # Delete backups older than 30 days\n\n# Volume Management\nmake volume-status      # Show volume status and detected orphans\nmake volume-adopt FROM=x # Adopt volumes from project 'x'\nmake volume-check       # Run pre-flight volume check manually\n\n# Security Overrides\nmake DIND=true up       # Enable Docker-in-Docker (mounts Docker socket)\nmake DEBUG=true up      # Enable debugger support (SYS_PTRACE + unconfined seccomp)\nmake DIND=true DEBUG=true up  # Both\n```\n\n## Setup Options\n\nWhen using the setup scripts directly (instead of `make`):\n\n| Flag (bash) | Flag (PowerShell) | Effect |\n|---|---|---|\n| `--slim` | `-Slim` | Build Node + Go only (skip .NET, Rust) |\n| `--with-solana` | `-WithSolana` | Include Solana/Anchor profile |\n| `--with-mobile` | `-WithMobile` | Include Android SDK + Flutter + RN |\n| `--with-gpu` | `-WithGpu` | Include NVIDIA CUDA runtime |\n| `--all` | `-All` | Build everything |\n\n```bash\n./scripts/setup.sh --slim             # Lightweight build\n./scripts/setup.sh --with-solana      # Include Solana\n./scripts/setup.sh --all --with-gpu   # Everything + GPU\n```\n\n## Authentication\n\n### Option A: API Key\n\nAdd to your `.env` file:\n\n```\nANTHROPIC_API_KEY=sk-ant-api03-your-key-here\n```\n\nThen restart: `make down \u0026\u0026 make up`\n\n### Option B: OAuth (interactive)\n\n```bash\nmake login\n```\n\nOAuth tokens are persisted in the `vol-home` volume — you only need to login once.\n\n### GitHub CLI Authentication\n\nThe container includes GitHub CLI (`gh`) for git operations over HTTPS:\n\n```bash\nmake gh-auth          # Interactive login (prints URL to terminal)\nmake gh-status        # Check auth status\n```\n\nOnce authenticated, `gh` is automatically configured as a git credential helper, enabling `git push`/`pull` over HTTPS without additional setup.\n\n## Claude Code Configuration\n\nClaude Code uses a hierarchical settings system. Docker Claude mounts a global `settings.json` into the container and supports per-project overrides.\n\n### Settings Hierarchy (highest priority wins)\n\n```\nPer-project    /workspace/my-project/.claude/settings.json      (team, checked into git)\nPer-project    /workspace/my-project/.claude/settings.local.json (personal, git-ignored)\nGlobal         ~/.claude/settings.json                           (mounted from config/)\n```\n\n### Global Settings\n\nEdit `config/claude-settings.json` on your host to change global defaults. This file is mounted read-only into the container and symlinked to `~/.claude/settings.json` at startup. Changes take effect on next container restart.\n\nThe default config sets:\n\n- **Model** — defaults to Opus\n- **Environment** — model mappings for Haiku/Sonnet/Opus, API timeout, telemetry disabled\n- **Attribution** — header disabled\n\n### Per-Project Settings\n\nInside the container, create project-level settings that override globals:\n\n```bash\nmake shell\ncd /workspace/my-project\nmkdir -p .claude\ncat \u003e .claude/settings.json \u003c\u003c 'EOF'\n{\n  \"permissions\": {\n    \"allow\": [\n      \"Bash(npm test:*)\",\n      \"Bash(npm run:*)\"\n    ]\n  }\n}\nEOF\n```\n\nAn example project settings file is at `config/claude-project-settings.example.json`.\n\n### Personal Project Settings (git-ignored)\n\nFor personal tweaks within a project that shouldn't be shared with your team:\n\n```bash\ncat \u003e .claude/settings.local.json \u003c\u003c 'EOF'\n{\n  \"preferences\": {\n    \"thinking\": \"always\"\n  }\n}\nEOF\n```\n\n### Local Plugin Marketplace\n\nYou can mount a local Claude Code plugin marketplace from your host into the container.\n\n**1. Set the path in `.env`:**\n\n```\nCLAUDE_MARKETPLACE_PATH=/Users/\u003cYOUR_USERNAME\u003e/path/to/your/marketplace\n```\n\n**2. Restart:**\n\n```bash\nmake down \u0026\u0026 make up\n```\n\n**3. Register inside the container:**\n\n```bash\nmake shell\nclaude plugin marketplace add /etc/claude-code/marketplace\n```\n\nThe marketplace is mounted read-only at `/etc/claude-code/marketplace`. File changes on your host are reflected immediately inside the container — no restart needed for updated plugins, though you may need to re-register the marketplace in Claude Code when adding new ones.\n\nIf `CLAUDE_MARKETPLACE_PATH` is not set in `.env`, it falls back to the empty `./marketplace/` folder (no error).\n\n### Updating Claude Code\n\nClaude Code is pre-installed using Anthropic's **native installer** (not npm), per their supply-chain security guidance. The binary lives at `~/.local/bin/claude` inside the container (on the persistent home volume).\n\n**Option A — Runtime update (no rebuild; recommended for day-to-day):**\n\n```bash\nmake shell\nclaude update            # check for and install latest\n# — or pin a specific version —\nclaude install 2.1.116   # stable | latest | \u003cspecific version\u003e\n```\n\nUpdates land in `~/.local/share/claude/versions/` and persist across `make down/up`.\n\n**Option B — Build-time pin (persists through `make nuke`):**\n\nEdit `.env`:\n\n```bash\nCLAUDE_CODE_VERSION=2.1.116   # or: stable | latest\n```\n\nThen rebuild:\n\n```bash\nmake build \u0026\u0026 make up\n```\n\n**Rolling back to baked version:**\n\n```bash\nmake claude-reset          # removes ~/.local/bin/claude and ~/.local/share/claude\nmake build-slim \u0026\u0026 make down \u0026\u0026 make up   # rebuild to restore the baked version\n```\n\n**Health check:**\n\n```bash\nmake shell\nclaude doctor              # verify auto-updater health\n```\n\n## Port Mappings\n\nAll host ports use a **`${PORT_BASE}xxx`** pattern (default: `41xxx`) to avoid conflicts with common services (e.g., macOS AirPlay uses port 5000). Inside the container, apps still listen on their standard ports.\n\nChange `PORT_BASE` in `.env` when running multiple instances (e.g., `42` for second instance → 42xxx ports).\n\n| Service | Container Port | Host Port (PORT_BASE=41) | Access From Host |\n|---|---|---|---|\n| React / Express | 3000 | `${PORT_BASE}300` → 41300 | `localhost:41300` |\n| ASP.NET HTTP | 5000 | `${PORT_BASE}500` → 41500 | `localhost:41500` |\n| ASP.NET HTTPS | 5001 | `${PORT_BASE}501` → 41501 | `localhost:41501` |\n| Vite | 5173 | `${PORT_BASE}517` → 41517 | `localhost:41517` |\n| Go / Generic | 8080 | `${PORT_BASE}808` → 41808 | `localhost:41808` |\n| Vue / Metro | 8081 | `${PORT_BASE}881` → 41881 | `localhost:41881` |\n| Solana RPC | 8899 | `${PORT_BASE}889` → 41889 | `localhost:41889` |\n| Solana WS | 8900 | `${PORT_BASE}890` → 41890 | `localhost:41890` |\n| Expo | 19000 | `${PORT_BASE}900` → 41900 | `localhost:41900` |\n| Expo DevTools | 19001 | `${PORT_BASE}901` → 41901 | `localhost:41901` |\n| Android Emulator | 5554 | `${PORT_BASE}554` → 41554 | `localhost:41554` |\n| Android ADB | 5555 | `${PORT_BASE}555` → 41555 | `localhost:41555` |\n| noVNC (visual browser) | 6080 | `${PORT_BASE}608` → 41608 | `localhost:41608` |\n\n## Working with Projects\n\nSince volumes are fully virtualized (no host bind mount), you work with code inside the container:\n\n```bash\n# Enter the container\nmake shell\n\n# Clone a project\ncd /workspace\ngit clone git@github.com:your-org/your-project.git\ncd your-project\n\n# Install dependencies\nnpm install              # Node.js\ndotnet restore           # .NET\ngo mod download          # Go\ncargo build              # Rust\n\n# Start Claude Code in your project\nclaude\n```\n\n### Getting Files In / Out\n\n```bash\n# Copy files into the container (use container name from 'docker ps')\ndocker cp ./my-file.txt $(docker ps -q -f name=cc-docker):/workspace/\n\n# Or specify the full container name\ndocker cp ./my-file.txt cc-docker-cc-docker-1:/workspace/\n\n# Copy files out\ndocker cp cc-docker-cc-docker-1:/workspace/output.txt ./\n\n# Or use git (recommended)\nmake shell\ncd /workspace/project \u0026\u0026 git push\n```\n\n## Optional Profiles\n\n### Solana Development\n\n```bash\nmake solana-up\nmake shell-solana\n\n# Inside the container\nsolana-test-validator\ncd /workspace/my-solana-project\nanchor build \u0026\u0026 anchor deploy\n```\n\n### Mobile Development (Android + Flutter + React Native)\n\n```bash\nmake mobile-up\nmake shell-mobile\n\n# Flutter\nflutter create my_app \u0026\u0026 cd my_app \u0026\u0026 flutter build apk\n\n# React Native\nnpx react-native init MyApp \u0026\u0026 cd MyApp \u0026\u0026 npx react-native run-android\n```\n\n\u003e **Note:** iOS builds require macOS + Xcode and cannot run in Docker. Use your Mac host for iOS builds.\n\n### iOS Development (macOS only)\n\nFor iOS development with Flutter, you need Xcode on your Mac host. This project supports a hybrid workflow: **edit code in the container** while **building/debugging on the host**.\n\n**Why this works:**\n- iOS builds need Xcode → only possible on macOS host\n- iOS Simulator has no network protocol (like ADB) for remote debugging\n- Bind mounting `./workspace` lets host and container share the same files\n\n#### Quick Setup\n\n```bash\n# 1. Start with host bind mount (creates ./workspace if missing)\nmake host-bind-mobile-up\n\n# 2. Create Flutter app inside container\nmake shell-mobile\ncd /workspace\nflutter create my_app\n\n# 3. On your Mac host, run iOS debugging\ncd ./workspace/my_app\nflutter devices        # Should show iOS Simulator\nflutter run -d iPhone  # Uses host Xcode + Simulator\n```\n\n#### Day-to-Day Workflow\n\n```bash\n# Terminal 1: Container (development)\nmake shell-mobile\ncd /workspace/my_app\nflutter pub get\n# Edit code, run tests, etc.\n\n# Terminal 2: Mac Host (iOS debugging)\ncd ./workspace/my_app\nflutter run -d iPhone  # Hot reload works across both terminals\n```\n\n#### Commands Reference\n\n| Command | Description |\n|---|---|\n| `make host-bind-up` | Start with host bind mount (core only) |\n| `make host-bind-mobile-up` | Start with host bind + Mobile profile |\n| `make host-bind-solana-up` | Start with host bind + Solana profile |\n\n#### Custom Workspace Path\n\nBy default, workspace is `./workspace` inside the project folder. Set `HOST_WORKSPACE_PATH` in `.env` for a different location:\n\n```bash\n# In .env\nHOST_WORKSPACE_PATH=/Users/yourname/projects/flutter-apps\n\n# Start\nmake host-bind-mobile-up\n```\n\n#### Comparison: Named Volume vs Host Bind\n\n| Aspect | Named Volume (Default) | Host Bind Mount (iOS Dev) |\n|--------|------------------------|---------------------------|\n| Volume | Docker-managed (isolated) | Host folder `./workspace` |\n| Start command | `make mobile-up` | `make host-bind-mobile-up` |\n| Code location | Inside container only | Shared: host + container |\n| iOS debugging | Not possible | Host `flutter run -d iPhone` |\n| Android debugging | Container + ADB | Same (works in both modes) |\n| Backup | `make backup` | Use host git/backup tools |\n\n## Custom Builds\n\nBuild with only the stacks you need:\n\n```bash\n# Only Node.js and Go\nmake build-slim\n\n# Or with full control\ndocker compose build \\\n  --build-arg INCLUDE_NODE=true \\\n  --build-arg INCLUDE_DOTNET=false \\\n  --build-arg INCLUDE_GOLANG=true \\\n  --build-arg INCLUDE_RUST=false \\\n  cc-docker\n```\n\n## VS Code Dev Container\n\n1. Install the [Dev Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) extension\n2. Open this project folder in VS Code\n3. `Ctrl+Shift+P` → \"Dev Containers: Reopen in Container\"\n4. VS Code builds the image and connects with all extensions pre-configured (ESLint, Prettier, C# Dev Kit, Go, rust-analyzer, Flutter, Docker, GitLens, and more)\n\n## GPU / CUDA Support\n\nGPU support works on **Windows (WSL2)** and **Linux** only. macOS does not support NVIDIA GPUs in Docker.\n\n### Linux\n\n```bash\n# 1. Install NVIDIA drivers\nsudo apt-get install -y nvidia-driver-550\n\n# 2. Install NVIDIA Container Toolkit\ncurl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \\\n  | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg\ncurl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \\\n  | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \\\n  | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list\nsudo apt-get update \u0026\u0026 sudo apt-get install -y nvidia-container-toolkit\n\n# 3. Configure and verify\nsudo nvidia-ctk runtime configure --runtime=docker\nsudo systemctl restart docker\ndocker run --rm --gpus all nvidia/cuda:12.4.1-base-ubuntu24.04 nvidia-smi\n\n# 4. Build with GPU\nmake GPU=true build\n```\n\n### Windows (WSL2)\n\n1. Install latest NVIDIA GPU drivers for Windows\n2. Docker Desktop → Settings → General → enable \"Use the WSL 2 based engine\"\n3. Docker Desktop → Settings → Docker Engine → add:\n   ```json\n   { \"runtimes\": { \"nvidia\": { \"path\": \"nvidia-container-runtime\", \"runtimeArgs\": [] } } }\n   ```\n4. Build: `.\\scripts\\setup.ps1 -WithGpu`\n\n## Cross-Platform: Mac ↔ Windows\n\n| Concern | Mac | Windows |\n|---|---|---|\n| Setup | `make build \u0026\u0026 make up` | `.\\scripts\\setup.ps1` |\n| Compose files | `docker-compose.yml` | `docker-compose.yml` + `docker-compose.windows.yml` |\n| Docker socket | Automatic | Via WSL2 backend |\n| SSH | Agent forwarding (`SSH_AUTH_SOCK`) | Keys mounted from `%USERPROFILE%\\.ssh` |\n| GPU | Not supported | WSL2 + NVIDIA Container Toolkit |\n| Line endings | LF (automatic) | LF enforced via `.gitattributes` + setup script sanitization |\n\n## Version Management\n\nSwitch runtime versions inside the container:\n\n```bash\n# Node.js\nnvm install 22 \u0026\u0026 nvm use 22\n\n# .NET — add a channel\ncurl -fsSL https://dot.net/v1/dotnet-install.sh | bash -s -- --channel 7.0\n\n# Rust\nrustup install nightly \u0026\u0026 rustup default nightly\n\n# Go — install a different version\ncurl -fsSL \"https://go.dev/dl/go1.24.0.linux-$(dpkg --print-architecture).tar.gz\" \\\n  | sudo tar -C /usr/local -xzf -\n```\n\n## Backup \u0026 Restore\n\nThe project volume (`{project}_vol-projects`) lives inside Docker's virtual filesystem — not on your host. Backups export it to a timestamped `.tar.gz` file.\n\n### Manual Backup\n\n```bash\n# Create a backup (saved to ./backups/)\nmake backup\n# Output: ✓ Backup complete: backups/cc-docker-backup_20260330_143000.tar.gz (2.1G)\n\n# List all backups with sizes\nmake backup-list\n```\n\n### Restore\n\n```bash\n# Restore from a specific backup (stops containers, asks for confirmation)\nmake restore FILE=backups/cc-docker-backup_20260330_143000.tar.gz\n# Then restart\nmake up\n```\n\n### Cleanup Old Backups\n\n```bash\n# Delete backups older than 30 days\nmake backup-clean\n```\n\n### Automated Daily Backups (cron)\n\nTo run backups automatically on your Mac:\n\n```bash\n# Open crontab\ncrontab -e\n\n# Add this line for daily backups at 2am\n0 2 * * * cd /path/to/cc-docker \u0026\u0026 make backup 2\u003e\u00261 \u003e\u003e backups/cron.log\n```\n\n\u003e **Note:** Backups work even when containers are stopped — they spin up a temporary container to read the volume. The `backups/` directory is git-ignored by default.\n\n### Encrypted Backups\n\nFor sensitive projects, use AES-256-CBC encrypted backups via openssl:\n\n```bash\n# Create encrypted backup (prompts for passphrase)\nmake backup-enc\n\n# Restore from encrypted backup (prompts for passphrase)\nmake restore-enc FILE=backups/cc-docker-backup_20260330_143000.tar.gz.enc\n```\n\nNo GPG setup needed — just remember your passphrase. Losing it means the backup is unrecoverable.\n\n### Automated Daily Encrypted Backups (cron)\n\n```bash\ncrontab -e\n\n# Uses BACKUP_PASS env var to avoid interactive prompt\n0 2 * * * cd /path/to/cc-docker \u0026\u0026 BACKUP_PASS=\"your-passphrase\" make backup-enc 2\u003e\u00261 \u003e\u003e backups/cron.log\n```\n\n## Security\n\nThis environment is security-hardened by default. See [SECURITY.md](SECURITY.md) for full details.\n\n### Defaults\n\n- **Docker socket NOT mounted** — prevents host compromise\n- **Ports bound to 127.0.0.1** — not visible on your local network\n- **Default seccomp profile** — dangerous syscalls blocked\n- **No extra capabilities** — SYS_PTRACE disabled\n- **No piped script execution** — all install scripts downloaded to disk first\n- **All downloads over HTTPS** — from official sources only\n- **Encrypted backups available** — AES-256-CBC via openssl\n\n### Security Overrides\n\nWhen you need features that reduce security:\n\n```bash\nmake DIND=true up                 # Docker-in-Docker (mounts host Docker socket)\nmake DEBUG=true up                # Debugger support (SYS_PTRACE + unconfined seccomp)\nmake DIND=true DEBUG=true up      # Both\n```\n\n### Accepted Risks\n\nThese are known and accepted for development convenience:\n\n- **API keys in env vars** — visible in `docker inspect`; `.env` is git-ignored\n- **SSH agent forwarding** — container can use (but not extract) your SSH keys\n- **Git config mounted** — read-only; exposes name/email\n\n## Troubleshooting\n\n### Port conflict on startup (e.g., \"port 5000 already in use\")\n\nAll host ports use the 41xxx range to avoid conflicts. If you still hit a conflict, check what's using the port: `lsof -i :41300` (Mac) or `netstat -ano | findstr 41300` (Windows). Edit the port mapping in `docker-compose.yml` if needed.\n\n### \"Permission denied\" on entrypoint.sh\n\nThe setup scripts automatically sanitize file permissions and line endings. If you skipped the setup script, run manually:\n\n```bash\nchmod +x scripts/entrypoint.sh scripts/setup.sh\nsed -i '' 's/\\r$//' scripts/entrypoint.sh    # Mac\nsed -i 's/\\r$//' scripts/entrypoint.sh       # Linux\n```\n\n### \"Permission denied\" on Docker socket\n\n```bash\n# Inside the container\nsudo chmod 666 /var/run/docker.sock\n```\n\n### NVM not found in non-interactive shells\n\n```bash\nexport NVM_DIR=\"/usr/local/nvm\" \u0026\u0026 . \"$NVM_DIR/nvm.sh\"\n```\n\n### Slow file I/O on Mac\n\nNamed volumes (which we use) are the fastest option on Docker Desktop for Mac. Ensure VirtioFS is enabled: Docker Desktop → Settings → General → \"VirtioFS\".\n\n### Windows line ending issues\n\nThe setup script auto-converts CRLF → LF before building. If you still see issues:\n\n```bash\ngit config --global core.autocrlf input\n```\n\n## Project Structure\n\n```\ncc-docker/\n├── .devcontainer/\n│   └── devcontainer.json          # VS Code Dev Container config\n├── .dockerignore                  # Build context exclusions\n├── .env.example                   # Template for environment variables\n├── .gitignore                     # Git exclusions\n├── Dockerfile                     # Core image (conditional runtimes)\n├── Dockerfile.mobile              # Mobile profile (Android/Flutter/RN)\n├── Dockerfile.solana              # Solana profile (Solana CLI/Anchor)\n├── Makefile                       # All commands (run: make help)\n├── README.md                      # This file\n├── SECURITY.md                    # Security documentation\n├── claude-settings.json           # Claude Code global settings (source for config/)\n├── claude-project-settings.example.json  # Example per-project settings\n├── config/\n│   ├── .bashrc                    # Shell config (prompt, aliases, PATH)\n│   ├── .gitattributes             # LF enforcement for cross-platform\n│   ├── claude-settings.json       # Claude Code global settings (mounted into container)\n│   ├── novnc-startup.sh           # noVNC startup script for visual browser\n│   ├── starship.toml              # Starship prompt config (Catppuccin Powerline)\n│   └── sudoers-dev                # Passwordless sudo config for dev user\n├── docker-compose.debug.yml       # Debug override (SYS_PTRACE + seccomp)\n├── docker-compose.dind.yml        # DinD override (Docker socket mount)\n├── docker-compose.gpu.yml         # GPU override (NVIDIA device passthrough)\n├── docker-compose.host-bind.yml   # Host bind mount override (iOS dev)\n├── docker-compose.windows.yml     # Windows-specific overrides\n├── docker-compose.yml             # Main compose (services, volumes, ports)\n├── marketplace/                   # Default (empty) plugin marketplace fallback\n│   └── .gitkeep                   # Keeps empty directory in git\n├── plans/                         # Implementation plans and RFCs\n│   └── browser-integration-plan.md\n├── scripts/\n│   ├── entrypoint.sh              # Container startup (runtime init, auth check)\n│   ├── setup.ps1                  # One-command setup (Windows)\n│   ├── setup.sh                   # One-command setup (Mac/Linux)\n│   └── volume-check.sh            # Volume detection and migration script\n└── .volume-state                  # Per-folder volume tracking (git-ignored)\n```\n\n## Co-Developed with\n\nThis project was developed with assistance from multiple AI systems:\n\n**AI Contributors:**\n- GLM-5.1/5 (Z.ai)\n- MiniMax M2.5 (Alibaba Cloud)\n- Kimi K2.5 (Alibaba Cloud)\n- QWen 3.5 (Alibaba Cloud)\n- Anthropic Claude (Anthropic)\n\n**Development Tool:**\nBuilt using [Claude Code](https://claude.ai/code) — Anthropic's official CLI for Claude.\n\n## Support This Project\n\nIf you find cc-docker useful, consider buying me a coffee:\n\n| Network | Address |\n|---|---|\n| Solana (SOL) | `GjpzLx3aX1MvpMVprdZm2hSyzHTSFJAgjwChT1fM1uKv` |\n| Ethereum (USDC) | `0x0402e35252476230696dc639f502C14e4c92dfD6` |\n\n## License\n\nMIT License — see [LICENSE](LICENSE) for details.\n\n---\n\n## Discover cc-docker\n\n`#claudecode` `#cc` `#vibecoding` `#agenticcoding` `#docker` `#container` `#ai` `#devtools` `#developer-experience` `#solana` `#flutter` `#rust` `#go` `#dotnet` `#nodejs`\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fiimmutable-ai%2Fcc-docker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fiimmutable-ai%2Fcc-docker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fiimmutable-ai%2Fcc-docker/lists"}