Skip to content

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 push before 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
  • 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 include Host dev alias