Help us improve
Share bugs, ideas, or general feedback.
From claude-skills
Set up Claude Code on a headless LXD/Linux server (Proxmox or bare). Handles: SSH fingerprint reset, password auth, passwordless key copy, Node.js install, Claude Code install, OAuth login via port forwarding, org/Max subscription auth, and the TUI onboarding loop fix. Use when provisioning a new LXD container for Claude Code agent use.
npx claudepluginhub 14f3v/claude-skillsHow this skill is triggered — by the user, by Claude, or both
Slash command
/claude-skills:lxd-claude-setupThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Runbook for provisioning Claude Code on a headless Proxmox LXD container — including all known failure modes encountered in production.
Guides using Bun as JavaScript runtime, package manager, bundler, and test runner. Covers choosing Bun vs Node, Node migration, and Vercel deployment support.
Share bugs, ideas, or general feedback.
Runbook for provisioning Claude Code on a headless Proxmox LXD container — including all known failure modes encountered in production.
Use this skill when:
Unknown scope: org:create_apiClear old fingerprint (reprovisioned host):
ssh-keygen -R <HOST_IP>
If password auth is disabled (Permission denied (publickey) with -v):
On the server console, edit /etc/ssh/sshd_config:
PasswordAuthentication yes
sudo systemctl restart sshd
Copy SSH key for passwordless access:
sshpass -p 'PASSWORD' ssh-copy-id -o StrictHostKeyChecking=no USER@HOST
Install sshpass if needed:
brew install sshpass
# Node.js 22
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo bash -
sudo apt-get install -y nodejs
# Claude Code (requires sudo for global npm)
sudo npm install -g @anthropic-ai/claude-code@2.1.128
Pin to 2.1.128. Versions >= 2.1.129 request
org:create_apiOAuth scope which fails on Max subscriptions.
Alternatively via official script (then downgrade if needed):
curl -fsSL https://claude.ai/install.sh | bash
sudo npm install -g @anthropic-ai/claude-code@2.1.128
The server has no browser. Forward the OAuth callback port through SSH:
ssh -L 54545:localhost:54545 USER@HOST
Inside that session:
claude auth login --claudeai
A URL will appear — open it in your local Mac browser. Complete login. Token saved to ~/.claude/.credentials.json on the server.
Verify:
claude auth status # should show loggedIn: true, subscriptionType: max
claude -p "say hi" # should respond
Symptom: claude TUI always shows login method selection on every launch, even though claude auth status and claude -p work fine.
Root cause: ~/.claude.json is missing hasCompletedOnboarding: true. The TUI checks this flag before skipping the onboarding flow.
Fix:
python3 -c "
import json
with open('/home/USER/.claude.json', 'r') as f:
d = json.load(f)
d['hasCompletedOnboarding'] = True
d['lastOnboardingVersion'] = '2.1.128'
with open('/home/USER/.claude.json', 'w') as f:
json.dump(d, f)
print('Fixed.')
"
After this, claude launches straight into the TUI. No re-auth needed.
| File | Purpose |
|---|---|
~/.claude.json | TUI state — onboarding flags, account cache, feature flags |
~/.claude/.credentials.json | OAuth tokens (access + refresh) |
~/.claude/settings.json | UI settings (theme, etc.) |
| Error | Cause | Fix |
|---|---|---|
Permission denied (publickey) | PasswordAuthentication no in sshd | Enable it, restart sshd |
Unknown scope: org:create_api | Claude Code >= 2.1.129 | Downgrade to 2.1.128 |
| TUI loops on login screen | Missing hasCompletedOnboarding in ~/.claude.json | Add flag via python3 snippet above |
claude -p works but TUI doesn't | Credentials saved but onboarding not marked complete | Same fix as above |
| OAuth callback fails on headless | No browser on server | Use ssh -L 54545:localhost:54545 tunnel |