$ ┌─────────────┐ SSH Tunnel ┌──────────────────────┐
│ Laptop │ ──────────────────> │ Cloud VM │
│ localhost │ port forwarding │ ├── Your App │
└─────────────┘ │ ├── API Server │ │ ├── PostgreSQL │
┌─────────────┐ Happy (E2E) │ ├── Redis │
│ Phone │ ──────────────────> │ └── Claude Code │
│ Happy App │ encrypted sync │ (in tmux) │
└─────────────┘ └──────────────────────┘
┌─────────────┐ SSH Tunnel ┌──────────────────────┐
│ Laptop │ ──────────────────> │ Cloud VM │
│ localhost │ port forwarding │ ├── Your App │
└─────────────┘ │ ├── API Server │ │ ├── PostgreSQL │
┌─────────────┐ Happy (E2E) │ ├── Redis │
│ Phone │ ──────────────────> │ └── Claude Code │
│ Happy App │ encrypted sync │ (in tmux) │
└─────────────┘ └──────────────────────┘
┌─────────────┐ SSH Tunnel ┌──────────────────────┐
│ Laptop │ ──────────────────> │ Cloud VM │
│ localhost │ port forwarding │ ├── Your App │
└─────────────┘ │ ├── API Server │ │ ├── PostgreSQL │
┌─────────────┐ Happy (E2E) │ ├── Redis │
│ Phone │ ──────────────────> │ └── Claude Code │
│ Happy App │ encrypted sync │ (in tmux) │
└─────────────┘ └──────────────────────┘
# macOS
-weight: 500;">brew -weight: 500;">install google-cloud-sdk # Or download from https://cloud.google.com/sdk/docs/-weight: 500;">install
# macOS
-weight: 500;">brew -weight: 500;">install google-cloud-sdk # Or download from https://cloud.google.com/sdk/docs/-weight: 500;">install
# macOS
-weight: 500;">brew -weight: 500;">install google-cloud-sdk # Or download from https://cloud.google.com/sdk/docs/-weight: 500;">install
gcloud auth login
gcloud config set project YOUR_PROJECT_ID
gcloud auth login
gcloud config set project YOUR_PROJECT_ID
gcloud auth login
gcloud config set project YOUR_PROJECT_ID
gcloud compute instances create my-dev-vm \ --zone=us-central1-a \ --machine-type=e2-standard-4 \ --boot-disk-size=50GB \ --boot-disk-type=pd-ssd \ --image-family=ubuntu-2404-lts-amd64 \ --image-project=ubuntu-os-cloud
gcloud compute instances create my-dev-vm \ --zone=us-central1-a \ --machine-type=e2-standard-4 \ --boot-disk-size=50GB \ --boot-disk-type=pd-ssd \ --image-family=ubuntu-2404-lts-amd64 \ --image-project=ubuntu-os-cloud
gcloud compute instances create my-dev-vm \ --zone=us-central1-a \ --machine-type=e2-standard-4 \ --boot-disk-size=50GB \ --boot-disk-type=pd-ssd \ --image-family=ubuntu-2404-lts-amd64 \ --image-project=ubuntu-os-cloud
gcloud compute ssh my-dev-vm --zone=us-central1-a
gcloud compute ssh my-dev-vm --zone=us-central1-a
gcloud compute ssh my-dev-vm --zone=us-central1-a
# Docker
-weight: 500;">curl -fsSL https://get.-weight: 500;">docker.com | sh
-weight: 600;">sudo usermod -aG -weight: 500;">docker $USER
newgrp -weight: 500;">docker # Node.js 22 + pnpm
-weight: 500;">curl -fsSL https://deb.nodesource.com/setup_22.x | -weight: 600;">sudo bash -
-weight: 600;">sudo -weight: 500;">apt-get -weight: 500;">install -y nodejs
-weight: 600;">sudo -weight: 500;">npm -weight: 500;">install -g pnpm@9 # Claude Code
-weight: 600;">sudo -weight: 500;">npm -weight: 500;">install -g @anthropic-ai/claude-code # Happy (mobile access to Claude Code)
-weight: 600;">sudo -weight: 500;">npm -weight: 500;">install -g happy # tmux (persistent sessions)
-weight: 600;">sudo -weight: 500;">apt-get -weight: 500;">install -y tmux
# Docker
-weight: 500;">curl -fsSL https://get.-weight: 500;">docker.com | sh
-weight: 600;">sudo usermod -aG -weight: 500;">docker $USER
newgrp -weight: 500;">docker # Node.js 22 + pnpm
-weight: 500;">curl -fsSL https://deb.nodesource.com/setup_22.x | -weight: 600;">sudo bash -
-weight: 600;">sudo -weight: 500;">apt-get -weight: 500;">install -y nodejs
-weight: 600;">sudo -weight: 500;">npm -weight: 500;">install -g pnpm@9 # Claude Code
-weight: 600;">sudo -weight: 500;">npm -weight: 500;">install -g @anthropic-ai/claude-code # Happy (mobile access to Claude Code)
-weight: 600;">sudo -weight: 500;">npm -weight: 500;">install -g happy # tmux (persistent sessions)
-weight: 600;">sudo -weight: 500;">apt-get -weight: 500;">install -y tmux
# Docker
-weight: 500;">curl -fsSL https://get.-weight: 500;">docker.com | sh
-weight: 600;">sudo usermod -aG -weight: 500;">docker $USER
newgrp -weight: 500;">docker # Node.js 22 + pnpm
-weight: 500;">curl -fsSL https://deb.nodesource.com/setup_22.x | -weight: 600;">sudo bash -
-weight: 600;">sudo -weight: 500;">apt-get -weight: 500;">install -y nodejs
-weight: 600;">sudo -weight: 500;">npm -weight: 500;">install -g pnpm@9 # Claude Code
-weight: 600;">sudo -weight: 500;">npm -weight: 500;">install -g @anthropic-ai/claude-code # Happy (mobile access to Claude Code)
-weight: 600;">sudo -weight: 500;">npm -weight: 500;">install -g happy # tmux (persistent sessions)
-weight: 600;">sudo -weight: 500;">apt-get -weight: 500;">install -y tmux
-weight: 500;">docker --version # Docker 29+
node --version # v22+
claude --version # Claude Code 2.x
tmux -V # tmux 3.x
-weight: 500;">docker --version # Docker 29+
node --version # v22+
claude --version # Claude Code 2.x
tmux -V # tmux 3.x
-weight: 500;">docker --version # Docker 29+
node --version # v22+
claude --version # Claude Code 2.x
tmux -V # tmux 3.x
-weight: 500;">git clone https://github.com/your-org/your-project.-weight: 500;">git
cd your-project
-weight: 500;">docker compose up -d
-weight: 500;">git clone https://github.com/your-org/your-project.-weight: 500;">git
cd your-project
-weight: 500;">docker compose up -d
-weight: 500;">git clone https://github.com/your-org/your-project.-weight: 500;">git
cd your-project
-weight: 500;">docker compose up -d
-weight: 500;">docker compose ps
-weight: 500;">docker compose ps
-weight: 500;">docker compose ps
NAME STATUS PORTS
my-app-api Up 3 min (healthy) 0.0.0.0:3000->3000/tcp
my-app-web Up 3 min (healthy) 0.0.0.0:3100->3100/tcp
my-app-postgres Up 5 min (healthy) 0.0.0.0:5432->5432/tcp
my-app-redis Up 5 min (healthy) 0.0.0.0:6379->6379/tcp
NAME STATUS PORTS
my-app-api Up 3 min (healthy) 0.0.0.0:3000->3000/tcp
my-app-web Up 3 min (healthy) 0.0.0.0:3100->3100/tcp
my-app-postgres Up 5 min (healthy) 0.0.0.0:5432->5432/tcp
my-app-redis Up 5 min (healthy) 0.0.0.0:6379->6379/tcp
NAME STATUS PORTS
my-app-api Up 3 min (healthy) 0.0.0.0:3000->3000/tcp
my-app-web Up 3 min (healthy) 0.0.0.0:3100->3100/tcp
my-app-postgres Up 5 min (healthy) 0.0.0.0:5432->5432/tcp
my-app-redis Up 5 min (healthy) 0.0.0.0:6379->6379/tcp
gcloud compute ssh my-dev-vm --zone=us-central1-a -- \ -L 3100:localhost:3100 \ -L 3000:localhost:3000 \ -N
gcloud compute ssh my-dev-vm --zone=us-central1-a -- \ -L 3100:localhost:3100 \ -L 3000:localhost:3000 \ -N
gcloud compute ssh my-dev-vm --zone=us-central1-a -- \ -L 3100:localhost:3100 \ -L 3000:localhost:3000 \ -N
alias dev-tunnel='gcloud compute ssh my-dev-vm --zone=us-central1-a -- \ -L 3100:localhost:3100 -L 3000:localhost:3000 -N'
alias dev-tunnel='gcloud compute ssh my-dev-vm --zone=us-central1-a -- \ -L 3100:localhost:3100 -L 3000:localhost:3000 -N'
alias dev-tunnel='gcloud compute ssh my-dev-vm --zone=us-central1-a -- \ -L 3100:localhost:3100 -L 3000:localhost:3000 -N'
gcloud compute ssh my-dev-vm --zone=us-central1-a
gcloud compute ssh my-dev-vm --zone=us-central1-a
gcloud compute ssh my-dev-vm --zone=us-central1-a
tmux new -s claude
cd ~/your-project
claude
tmux new -s claude
cd ~/your-project
claude
tmux new -s claude
cd ~/your-project
claude
export CLAUDE_CODE_USE_VERTEX=1
export ANTHROPIC_VERTEX_PROJECT_ID=YOUR_PROJECT_ID
export CLOUD_ML_REGION=global
export ANTHROPIC_MODEL=claude-opus-4-6
export CLAUDE_CODE_USE_VERTEX=1
export ANTHROPIC_VERTEX_PROJECT_ID=YOUR_PROJECT_ID
export CLOUD_ML_REGION=global
export ANTHROPIC_MODEL=claude-opus-4-6
export CLAUDE_CODE_USE_VERTEX=1
export ANTHROPIC_VERTEX_PROJECT_ID=YOUR_PROJECT_ID
export CLOUD_ML_REGION=global
export ANTHROPIC_MODEL=claude-opus-4-6
tmux new -s happy
happy claude -- --dangerously-skip-permissions
tmux new -s happy
happy claude -- --dangerously-skip-permissions
tmux new -s happy
happy claude -- --dangerously-skip-permissions
dev-tunnel # alias from Step 4
dev-tunnel # alias from Step 4
dev-tunnel # alias from Step 4
gcloud compute resource-policies create vm-maintenance workday-schedule \ ---weight: 500;">start-schedule="0 8 * * 1-5" \ ---weight: 500;">stop-schedule="0 20 * * 1-5" \ --timezone=UTC
gcloud compute resource-policies create vm-maintenance workday-schedule \ ---weight: 500;">start-schedule="0 8 * * 1-5" \ ---weight: 500;">stop-schedule="0 20 * * 1-5" \ --timezone=UTC
gcloud compute resource-policies create vm-maintenance workday-schedule \ ---weight: 500;">start-schedule="0 8 * * 1-5" \ ---weight: 500;">stop-schedule="0 20 * * 1-5" \ --timezone=UTC
# Install: -weight: 500;">brew -weight: 500;">install autossh (macOS) or -weight: 500;">apt -weight: 500;">install autossh (Linux)
autossh -M 0 -f -N \ -o "ServerAliveInterval 30" \ -o "ServerAliveCountMax 3" \ -L 3100:localhost:3100 \ -L 3000:localhost:3000 \ my-dev-vm
# Install: -weight: 500;">brew -weight: 500;">install autossh (macOS) or -weight: 500;">apt -weight: 500;">install autossh (Linux)
autossh -M 0 -f -N \ -o "ServerAliveInterval 30" \ -o "ServerAliveCountMax 3" \ -L 3100:localhost:3100 \ -L 3000:localhost:3000 \ my-dev-vm
# Install: -weight: 500;">brew -weight: 500;">install autossh (macOS) or -weight: 500;">apt -weight: 500;">install autossh (Linux)
autossh -M 0 -f -N \ -o "ServerAliveInterval 30" \ -o "ServerAliveCountMax 3" \ -L 3100:localhost:3100 \ -L 3000:localhost:3000 \ my-dev-vm
Cmd+Shift+P → "Remote-SSH: Connect to Host" → my-dev-vm
Cmd+Shift+P → "Remote-SSH: Connect to Host" → my-dev-vm
Cmd+Shift+P → "Remote-SSH: Connect to Host" → my-dev-vm
cd ~/project-a && -weight: 500;">docker compose -p project-a up -d # ports 3000-3100
cd ~/project-b && -weight: 500;">docker compose -p project-b up -d # ports 4000-4100
cd ~/project-a && -weight: 500;">docker compose -p project-a up -d # ports 3000-3100
cd ~/project-b && -weight: 500;">docker compose -p project-b up -d # ports 4000-4100
cd ~/project-a && -weight: 500;">docker compose -p project-a up -d # ports 3000-3100
cd ~/project-b && -weight: 500;">docker compose -p project-b up -d # ports 4000-4100 - Go to cloud.google.com/free
- Click Get started for free
- Sign in with your Google account, add a payment method (you won't be charged)
- You now have $300 in credits - Battery and thermals — AI coding agents hammer your CPU. A cloud VM doesn't care.
- Session persistence — Close your laptop, hop on your phone, come back to your desk. The session is still running.
- Dev environment consistency — Docker, databases, everything runs 24/7 on the VM. No more "let me spin up Postgres first." - -L 3100:localhost:3100 — requests to localhost:3100 on your laptop go to port 3100 on the VM
- -N — don't open a shell, just forward ports - http://localhost:3100 — your web app
- http://localhost:3000 — your API - Ctrl+b d — detach (session keeps running in the background)
- tmux attach -t claude — reattach from any SSH session
- Close your laptop, come back tomorrow — session is exactly where you left it - iOS App Store
- Google Play Store