{"id":44577624,"url":"https://github.com/recoskyler/devcontainers","last_synced_at":"2026-03-07T17:07:33.069Z","repository":{"id":338659271,"uuid":"1157627897","full_name":"recoskyler/devcontainers","owner":"recoskyler","description":"Pre-configured Dev Containers with Claude Code, Bun/NVM, UV, anc X11VNC","archived":false,"fork":false,"pushed_at":"2026-03-03T00:38:41.000Z","size":295,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"latest","last_synced_at":"2026-03-03T03:46:23.719Z","etag":null,"topics":["bun","claude","claude-code","debian","devcontainer","docker","nodejs","playwright","python","trixie","ubuntu","uv"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/recoskyler.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"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-02-14T03:57:14.000Z","updated_at":"2026-02-25T02:04:29.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/recoskyler/devcontainers","commit_stats":null,"previous_names":["recoskyler/devcontainers"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/recoskyler/devcontainers","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/recoskyler%2Fdevcontainers","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/recoskyler%2Fdevcontainers/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/recoskyler%2Fdevcontainers/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/recoskyler%2Fdevcontainers/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/recoskyler","download_url":"https://codeload.github.com/recoskyler/devcontainers/tar.gz/refs/heads/latest","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/recoskyler%2Fdevcontainers/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30222552,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-07T17:00:40.062Z","status":"ssl_error","status_checked_at":"2026-03-07T17:00:39.026Z","response_time":53,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["bun","claude","claude-code","debian","devcontainer","docker","nodejs","playwright","python","trixie","ubuntu","uv"],"created_at":"2026-02-14T05:36:46.390Z","updated_at":"2026-03-07T17:07:33.047Z","avatar_url":"https://github.com/recoskyler.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Dev Containers\n\nDocker-based dev containers with Claude Code, MCP servers, and common tooling pre-installed. Each image targets a different stack/project type.\n\n## Usage\n\n1. Create a Dockerfile\n\n    `PROJECT_ROOT/.devcontainer/Dockerfile`\n\n    ```Dockerfile\n    FROM ghcr.io/recoskyler/trixie-bun-nvm-uv-claude:latest\n    ```\n\n2. Create a Docker Compose file\n\n    `PROJECT_ROOT/.devcontainer/compose.yml`\n\n    ```yaml\n    services:\n        app:\n            build:\n                context: .\n                dockerfile: Dockerfile\n                args:\n                    NODE_VERSION: '24.12.0'\n\n            ports:\n                - \"0.0.0.0:7681:7681\" # TTYD\n                - '6901:6901' # VNC\n\n            networks:\n                - default\n\n            environment:\n                - CONTEXT7_API_KEY=your-key\n                - AUTOMEM_ENDPOINT=your-endpoint\n                - AUTOMEM_API_KEY=your-key\n                - NTFY_URL=https://ntfy.sh/your-topic\n                - NTFY_TOKEN=your-token\n                - ENABLE_TOOL_SEARCH=true\n                - ENABLE_EXPERIMENTAL_MCP_CLI=false\n                - CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=\"1\"\n                - DISPLAY=\":0\"\n\n            logging:\n                options:\n                    max-size: 10m\n                    max-file: 3\n\n            volumes:\n                - ..:/workspace:cached\n                - home:/home\n                - /var/run/docker.sock:/var/run/docker.sock\n\n            # Overrides default command so things don't\n            # shut down after the process ends\n            command: sleep infinity\n\n            # Chrome/VNC might need the following options:\n\n            security_opt:\n                - seccomp:unconfined\n\n            cap_add:\n                - SYS_ADMIN\n                - CAP_SYS_ADMIN\n                - SYS_PTRACE\n                - CAP_SYS_PTRACE\n                - IPC_LOCK\n                - SYS_NICE\n                - CAP_SYS_NICE\n\n            ipc: host\n            init: true\n\n    volumes:\n        home:\n\n    networks:\n        default:\n            driver: bridge\n    ```\n\n3. Create a `devcontainer.json` file:\n\n    `PROJECT_ROOT/.devcontainer/devcontainer.json`\n\n    ```json\n    {\n        \"$schema\": \"https://raw.githubusercontent.com/devcontainers/spec/refs/heads/main/schemas/devContainer.base.schema.json\",\n        \"name\": \"DevContainer\",\n        \"dockerComposeFile\": \"compose.yml\",\n        \"service\": \"app\",\n        \"workspaceFolder\": \"/workspace\",\n\n        \"mounts\": [\n            \"source=/var/run/docker.sock,target=/var/run/docker.sock,type=bind\"\n        ],\n\n        \"forwardPorts\": [3000, 4983, 5173, 5174],\n\n        \"portsAttributes\": {\n            \"5174\": {\n                \"label\": \"Vite Preview Server\",\n                \"onAutoForward\": \"openBrowserOnce\"\n            },\n            \"5173\": {\n                \"label\": \"Vite Dev Server\",\n                \"onAutoForward\": \"openBrowserOnce\"\n            },\n            \"3000\": {\n                \"label\": \"Node.js Server\",\n                \"onAutoForward\": \"openBrowserOnce\"\n            },\n            \"4983\": {\n                \"label\": \"Drizzle Studio\",\n                \"onAutoForward\": \"silent\"\n            }\n        },\n\n        \"customizations\": {\n            \"vscode\": {\n                \"extensions\": [\n                    \"EditorConfig.EditorConfig\",\n                    \"ms-python.python\",\n                    \"dbaeumer.vscode-eslint\",\n                    \"esbenp.prettier-vscode\",\n                    \"ms-azuretools.vscode-docker\",\n                    \"Orta.vscode-jest\",\n                    \"42Crunch.vscode-openapi\",\n                    \"yzhang.markdown-all-in-one\",\n                    \"YoavBls.pretty-ts-errors\"\n                ]\n            }\n        }\n        // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.\n        // \"remoteUser\": \"root\"\n    }\n    ```\n\n## Images\n\nAll images extend a shared base (`base/Dockerfile` — `debian:trixie`) and run as user `dev` (UID 1000, home `/home/dev`).\n\n| Image | Extra stack |\n|-------|-------------|\n| `ghcr.io/recoskyler/devcontainer-base:latest` | — (base only) |\n| `ghcr.io/recoskyler/trixie-bun-nvm-uv-claude:latest` | Bun |\n| `ghcr.io/recoskyler/trixie-php-nvm-uv-claude:latest` | PHP 8.4, Composer |\n| `ghcr.io/recoskyler/trixie-rust-nvm-uv-claude:latest` | Rust toolchain |\n| `ghcr.io/recoskyler/trixie-vnc-nvm-uv-claude:latest` | x11vnc, Xvfb |\n| `ghcr.io/recoskyler/trixie-vnc-flutter-rust-nvm-uv-claude:latest` | Flutter, Rust, Android SDK, VNC |\n\n## What's Included\n\n### All images (base)\n\n- **Node.js** via NVM (default: 24.12.0)\n- **UV** (Python package manager)\n- **Claude Code** CLI + plugins (ECC, Superpowers, official plugin suite)\n- **MCP servers**: Serena, Context7, Automem\n- **GSD** (Get Shit Done for Claude Code)\n- **Agent Browser** + Chrome\n- **Docker** CLI + Compose plugin (`docker`, `docker compose`) — mount the host socket to use; works without `sudo` (the entrypoint automatically matches the socket's GID)\n- **CLI tools**: git, curl, wget, vim, nano, jq, tmux, xclip, openssh-client, gnupg, cmake, less, unzip, gh, pnpm, tsx\n- **Search \u0026 file tools**: ripgrep, fd-find, fzf, bat, tree\n- **PDF tools**: poppler-utils (pdftotext, pdfinfo, etc.)\n- **Networking \u0026 HTTP**: httpie, netcat\n- **Cloud \u0026 infra**: AWS CLI v2, Terraform, kubectl, Stripe CLI\n- **Utilities**: duf, git-delta, tldr\n- **ttyd** (web terminal)\n- **Database clients**: postgresql-client, default-mysql-client, redis-tools\n- **ntfy** notification hooks (Notification + Stop events)\n\n### Bun (`trixie-bun-nvm-uv-claude`)\n\n- **Bun** runtime (`bun`, `bunx`)\n\n### PHP (`trixie-php-nvm-uv-claude`)\n\n- **PHP 8.4** (cli, curl, mbstring, mysql, redis, xml, zip)\n- **Composer**\n\n### Rust (`trixie-rust-nvm-uv-claude`)\n\n- **Rust** toolchain (via rustup)\n- **rustfmt** + **clippy**\n- **cargo-watch** (file watcher / auto-rebuild)\n- **cargo-edit** (`cargo add`/`cargo rm`)\n- **cargo-nextest** (modern test runner)\n\n### VNC (`trixie-vnc-nvm-uv-claude`)\n\n- **x11vnc**, **Xvfb**, xdg-utils\n\n### Flutter (`trixie-vnc-flutter-rust-nvm-uv-claude`)\n\nExtends the VNC image with Flutter, Rust, and Android tooling.\n\n- **Flutter** via FVM (`flutter`, `dart`, `fvm`)\n- **Rust** toolchain (rustup, rustfmt, clippy, cargo-watch, cargo-edit, cargo-nextest)\n- **Android SDK**: cmdline-tools, platform-tools, build-tools (28.0.3 + 35.0.0), API 35 + 36\n- **Android Emulator** with SwiftShader (AVD: `flutter_pixel7`, Pixel 7, API 35)\n- **Android Studio** Panda 1 (at `/opt/android-studio`)\n- **Chromium** (`CHROME_EXECUTABLE` set for `flutter run -d chrome`)\n- **OpenJDK 21** (headless)\n\n## Build Arguments\n\n| Argument | Default | Description |\n|----------|---------|-------------|\n| `NODE_VERSION` | `24.12.0` | Node.js version installed via NVM |\n\n## Runtime Environment Variables\n\nSecret-dependent MCP servers and ntfy hooks are configured at **runtime** (first shell login) via environment variables. Pass these in your compose `environment` section or via `docker run -e`.\n\n| Variable | Description |\n|----------|-------------|\n| `CONTEXT7_API_KEY` | [Context7](https://context7.com) MCP server API key (skipped if empty) |\n| `AUTOMEM_ENDPOINT` | [Automem](https://github.com/verygoodplugins/mcp-automem) MCP server endpoint URL (skipped if empty) |\n| `AUTOMEM_API_KEY` | [Automem](https://github.com/verygoodplugins/mcp-automem) MCP server API key (skipped if empty) |\n| `NTFY_URL` | [ntfy](https://ntfy.sh) server/topic URL for notification hooks (skipped if empty) |\n| `NTFY_TOKEN` | [ntfy](https://ntfy.sh) authentication token for notification hooks (skipped if empty) |\n\n\u003e Optional MCP servers and ntfy hooks are only configured when their corresponding environment variables are set.\n\n## CI/CD\n\nTwo GitHub Actions workflows build and verify images:\n\n- **`build.yml`** — Runs on push to `latest` or version tags. Builds the base image with GHA cache, then builds and pushes all 5 variants to GHCR in parallel (matrix strategy).\n- **`check.yml`** — Runs on PRs to `latest`. Same structure but read-only cache (no `cache-to`) and no push to GHCR. Each variant runs tool verification and posts results as PR comments.\n\nBoth workflows use a local `registry:2` service container and `build-contexts` to remap `FROM` images at build time, requiring zero Dockerfile changes. The flutter variant has a three-tier chain (base → VNC → flutter) with a conditional VNC rebuild step.\n\nImages are published to GHCR at `ghcr.io/\u003cowner\u003e/\u003cimage-name\u003e`.\n\n### Tags\n\n| Trigger | Tag(s) |\n|---------|--------|\n| Push to `latest` | `latest` |\n| Git tag `v1.2.3` | `1.2.3`, `1.2` |\n\n\u003e `GITHUB_TOKEN` is provided automatically by GitHub Actions for GHCR authentication.\n\n## Local Build\n\nBuild locally:\n\n```bash\n# Build base first (NODE_VERSION is a base ARG)\ndocker build -t devcontainer-base:latest \\\n  --build-arg NODE_VERSION=24.12.0 \\\n  -f base/Dockerfile .\n\n# Then build a variant\ndocker build \\\n  -f trixie-bun-nvm-uv-claude/Dockerfile \\\n  -t trixie-bun-nvm-uv-claude .\n\n# Flutter requires VNC as an intermediate layer\ndocker build -t trixie-vnc-nvm-uv-claude:latest \\\n  -f trixie-vnc-nvm-uv-claude/Dockerfile .\ndocker build \\\n  -f trixie-vnc-flutter-rust-nvm-uv-claude/Dockerfile \\\n  -t trixie-vnc-flutter-rust-nvm-uv-claude .\n```\n\nThen run with your API keys as environment variables:\n\n```bash\ndocker run -it \\\n  -e CONTEXT7_API_KEY=your-key \\\n  -e AUTOMEM_ENDPOINT=your-endpoint \\\n  -e AUTOMEM_API_KEY=your-key \\\n  -e NTFY_URL=https://ntfy.sh/your-topic \\\n  -e NTFY_TOKEN=your-token \\\n  trixie-bun-nvm-uv-claude\n```\n\n## Agent Browser\n\nThe skill is already installed, and the following section is already included in all images `~/.claude/CLAUDE.md`.\n\n```md\n## Browser Automation\n\nUse `agent-browser` for web automation. Run `agent-browser --help` for all commands.\n\nCore workflow:\n1. `agent-browser open \u003curl\u003e` - Navigate to page\n2. `agent-browser snapshot -i` - Get interactive elements with refs (@e1, @e2)\n3. `agent-browser click @e1` / `fill @e2 \"text\"` - Interact using refs\n4. Re-snapshot after page changes\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frecoskyler%2Fdevcontainers","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frecoskyler%2Fdevcontainers","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frecoskyler%2Fdevcontainers/lists"}