One-command setup for mobile coding with Claude Code & OpenCode via Tailscale.
iPhone (Termius) ──▶ Tailscale VPN ──▶ VPS (Claude Code + OpenCode)
▲ │
└─────────── ntfy.sh push ◀───────────────┘
- Tailscale-only access - No public SSH, maximum security
- mosh + tmux - Resilient connections, session persistence
- Push notifications - Get notified when Claude needs input
- Claude Code + OpenCode - Both AI tools, your choice
- mise-managed runtimes - node, python, bun, uv (extensible)
- Git SSH ready - Key generation + GitHub registration
Recommended: Hetzner CCX33 (8 vCPU, 32GB RAM) - ~€0.10/hr
- Ubuntu 22.04 or 24.04
- Any region (US: Ashburn or Hillsboro)
- Tailscale auth key: https://login.tailscale.com/admin/settings/keys
- Create a reusable, ephemeral key
- ntfy topic: Pick a secret name (e.g.,
pocket-dev-abc123xyz)
SSH into your VPS and run the one-liner:
curl -fsSL https://raw.githubusercontent.com/jpjednorski/pocket-dev/master/install.sh | \
TAILSCALE_AUTH_KEY=tskey-auth-xxxxx NTFY_TOPIC=pocket-dev-your-secret-topic bashOr clone first if you prefer:
git clone https://github.com/jpjednorski/pocket-dev ~/.pocket-dev
cd ~/.pocket-dev
cp .env.example .env
# edit .env with your keys
./install.shAfter install completes:
just authThis will:
- Authenticate with GitHub (browser OAuth)
- Register your SSH key with GitHub
- Set git user.name/email from your GitHub profile
- Authenticate Claude Code
- Authenticate OpenCode
Create repos.txt:
cp repos.txt.example repos.txt
# Edit repos.txt with your reposClone them:
just clone-reposInstall on your iPhone:
- Termius (or Shellfish) - SSH/mosh client
- ntfy - Push notifications (subscribe to your topic)
Connect via mosh:
mosh your-user@YOUR_TAILSCALE_IPjust install # Full installation
just auth # Interactive authentication
just clone-repos # Clone repos from repos.txt
just status # Check system status
just connect-info # Show connection info
just test-notify # Test push notification
just add-tool go 1.22.0 # Add a new tool
just update-tools # Update all tools
just update # Update pocket-dev itselfClaude Code will notify you via ntfy.sh when it calls AskUserQuestion.
Test it:
just test-notifyCustom notifications from shell:
ping-phone "Build complete!"
notify-done npm run build # Notifies when command finishes- No public SSH - Only accessible via Tailscale
- nftables firewall - Drops all non-Tailscale traffic
- fail2ban - Bans repeated auth failures
- SSH hardened - No passwords, no root, key-only
~/.pocket-dev/ # Installation directory
├── .env # Your secrets (git-ignored)
├── repos.txt # Repos to clone (git-ignored)
├── justfile # Commands
├── scripts/ # Setup and command scripts
├── config/ # System configs (tmux, nftables, etc)
└── dotfiles/ # Shell configs, Claude hooks
~/.claude/ # Claude Code config
├── settings.json # Hooks configuration
└── hooks/notify.sh # Push notification script
~/.pocket-dev.env # Runtime env (NTFY_TOPIC)
just add-tool go 1.22.0
just add-tool rust latestOr edit tools.toml and run mise install.
Edit ~/.tmux.conf and change C-a to your preference.
Edit ~/.claude/hooks/notify.sh to customize notification format.
sudo tailscale status
sudo tailscale up --sshEnsure UDP ports 60000-61000 are allowed (should be by default).
just test-notifyCheck that:
- NTFY_TOPIC is set in
~/.pocket-dev.env - You're subscribed to the topic in the ntfy app
Verify ~/.claude/settings.json has the hook configured.
MIT