____ _ _ _
/ ___|___ __| | ___ _ __| |__ ___ | |_ ___
| | / _ \ / _` |/ _ \ '__| '_ \ / _ \| __/ __|
| |__| (_) | (_| | __/ | | |_) | (_) | |_\__ \
\____\___/ \__,_|\___|_| |_.__/ \___/ \__|___/
__ __ _
\ \ / /__ _ __| | _____ _ __ __ _ ___ ___
\ \ /\ / / _ \| '__| |/ / __| '_ \ / _` |/ __/ _ \
\ V V / (_) | | | <\__ \ |_) | (_| | (_| __/
\_/\_/ \___/|_| |_|\_\___/ .__/ \__,_|\___\___|
|_|
A reusable GitHub Codespaces environment for an autonomous coding agent. This repo is not a project — it's the machine definition. You create a codespace from it, then the agent clones and runs any GitHub repo inside it.
./setup.sh installs/authenticates the agent, wires up Claude-in-Chrome, and
connects the event bridge. (It also auto-launches the first time you open the
codespace in VS Code.)
- XFCE desktop in the browser via KasmVNC (port
6080, auto-connects, no password — the forwarded port is private/GitHub-auth gated). KasmVNC's web client does seamless clipboard (real Ctrl+C/Ctrl+V between your machine and the desktop) — use a Chromium-based browser (Chrome/Edge) for it to work. - Google Chrome, pre-flagged for containers (
--no-sandbox --disable-gpu --disable-dev-shm-usage) and set as the default browser. - Node (LTS) and Python 3.12, plus
build-essential,git,gh,jq, etc. for building most repos. - Claude Code installed globally;
claudeauth opens in the desktop Chrome so the OAuth localhost callback completes (no copy-paste).
A codespace is bootstrapped from this repo, but you can clone and run as many other repos as you like inside it. Suggested workflow for the agent:
gh repo clone <owner>/<repo> ~/projects/<repo> # uses the codespace's built-in auth
cd ~/projects/<repo>
# detect the stack and run it:
# Node: npm ci (or pnpm/yarn) → npm run dev
# Python: python -m venv .venv && . .venv/bin/activate && pip install -r requirements.txtEach cloned repo's own .devcontainer/ is not applied automatically — this
environment is the kitchen-sink that runs them. (If you later need a repo's
exact environment, add the docker-in-docker feature + devcontainer CLI and
run devcontainer up against the clone.)
Open the forwarded 6080 port in the browser. It auto-connects to XFCE.
Launch apps from Applications (Chrome is under Internet).
KasmVNC syncs the clipboard with your local machine (use a Chromium browser). Paste is Ctrl+V in both Chrome and the terminal (xfce4-terminal is rebound so Ctrl+V pastes). Copy is Ctrl+C in apps, Ctrl+Shift+C in the terminal (Ctrl+C there is still SIGINT). Bidirectional sync can occasionally lag — for a short value, typing it is faster than fighting the clipboard.
Interactive claude login means copy-pasting a code into the desktop, which is
fiddly. For a clean first run, inject credentials via a Codespaces secret so
Claude Code is authenticated automatically (Repo/Account → Settings → Codespaces
→ Secrets):
CLAUDE_CODE_OAUTH_TOKEN— uses your Claude subscription. Generate once on a machine where you're logged in:claude setup-token, then paste the token as the secret value.- or
ANTHROPIC_API_KEY— uses API billing.
Codespaces injects secrets as env vars, and Claude Code picks them up with no login flow or clipboard needed.
.devcontainer/
devcontainer.json # features (node, python), ports, lifecycle, env
Dockerfile # XFCE + KasmVNC + Chrome + fonts + build tools
start-desktop.sh # idempotent KasmVNC launcher (postStartCommand)
git pullbefore "Rebuild Container" — a rebuild uses the.devcontainer/files checked out in the codespace, not GitHub.- The desktop launch is idempotent and detached, so it survives restarts.
- Heavy image — enable Codespaces prebuilds on this repo for fast startup.