ADR-011 — Dedicated Dev LXC for Remote Development
Date: 2026-04-22 Status: Accepted
Context
Working on the homelab currently requires the MacBook — either physically at home or VPN'd from work. This creates friction: carrying the laptop, relying on VPN stability, and having all tooling (Claude Code, MCP servers, repos) tied to a single machine.
The existing code-server on LXC 118 is shared with thelounge and qbitwebui. It has no Claude Code, no MCP servers, and no repos — it's a lightweight editor, not a development environment.
Decision
Create a dedicated dev LXC (131) on apps-pool that serves as the primary remote development environment. It runs:
- code-server in Docker for browser-based access from anywhere
- Claude Code CLI installed directly on the LXC (not in Docker)
- All 5 MCP servers (forgejo, grafana, karakeep, mediabot, proxmox-plus) with Linux binaries
- All repos cloned from Forgejo into the code-server workspace
Two access methods, one filesystem: - At home: VS Code Desktop via Remote-SSH to [email protected] - Away: code-server at dev.eva-00.network via browser (protected by oauth2-proxy + PocketID)
Claude Code runs in the terminal panel of either client.
Alternatives Considered
VS Code Remote Tunnels
Uses Microsoft's tunnel infrastructure. Full VS Code with native Settings Sync and marketplace. Rejected because: - Not self-hosted — routes through Microsoft servers - Claude Code extension has known bugs over remote connections (path confusion, keychain failures) - Dependency on external service availability
Reuse existing LXC 118 (tools)
Add Claude Code + MCP servers to the existing code-server on LXC 118. Rejected because: - LXC 118 is shared with thelounge + qbitwebui — resource contention - 8G disk is too small for repos + MCP servers + Claude Code - Mixing a dev environment with utility services is messy
VM instead of LXC
A VM provides kernel isolation but the dev environment only needs userspace tools (Node.js, Python, Go binaries, Docker). LXC is lighter on resources and matches the existing homelab pattern. No kernel-level requirements.
Claude Code VS Code extension instead of CLI
The official Anthropic extension is not on Open VSX (code-server's marketplace). Over Remote-SSH it has known path bugs and keychain failures. The CLI is the primary product and provides the full feature set — tool use, MCP servers, file editing, multi-turn conversations.
Architecture
Browser (anywhere) -> dev.eva-00.network -> Caddy (105) -> oauth2-proxy (131:4180) -> code-server (131:8443)
VS Code Desktop -> SSH [email protected] -> same filesystem
code-server runs in Docker. Everything else (Claude Code, MCP servers, repos) lives on the LXC filesystem. The terminal in code-server executes directly on the LXC host, giving full access to claude CLI and all tools.
Parameters
| Parameter | Value |
|---|---|
| LXC ID | 131 |
| IP | 192.168.1.131 |
| Pool | apps-pool (sde) |
| Disk | 20G |
| Memory | 4096MB |
| Cores | 2 |
| Subdomain | dev.eva-00.network |
Backup Strategy
- LXC rootfs backed up via PBS (added to non-critical weekly job)
- Repos stored in Forgejo — git push is the sync mechanism
- VS Code config and Claude memory backed up as part of rootfs
- MCP server binaries are reproducible via playbook re-run
Consequences
- Mac becomes a thin client when at home (VS Code Desktop + Remote-SSH)
- Away from home: full dev environment in a browser tab
- Single source of truth for repos, settings, Claude Code memory
- Must remember to
git pushbefore switching machines (repos are local to the LXC) - Claude Code memory paths will differ from Mac (
/root/.claude/projects/...vs/Users/gabriel/.claude/projects/...) — project memories will be separate per environment - MCP server Go binaries (gitea-mcp, mcp-grafana) need manual updates when new versions release
Related
- Terminal maturity ADR (
adr-terminal-maturity.md) — terminal improvements (starship, fzf, atuin) should be applied to this LXC too, ideally via a dotfiles repo - Mac audit (
adr-mac-audit.md) — SSH config should includeHost devalias