How to Access Your Dev Server from Your Phone

Three options for accessing a running dev server from your phone — mobile SSH apps, Tailscale, and Grass for agent-specific workflows that don't need a terminal at all.

Three approaches exist for accessing a remote dev server from your phone. SSH via a mobile terminal app works for general server access. Tailscale adds a private network layer so you're not exposing SSH to the public internet. Grass is purpose-built for mobile coding agent access — it replaces the terminal entirely with a native mobile interface for Claude Code and OpenCode sessions.

TL;DR

  • SSH via mobile terminal (Termius, Blink Shell, JuiceSSH): works, but terminal on a phone is painful
  • Tailscale + SSH: same as above but with a private network — no public SSH port exposure
  • Grass: native mobile interface for Claude Code/OpenCode — no terminal, live output, approval modals, file browser
  • Grass setup: npm install -g @grass-ai/ide, grass start --network tailscale, scan QR code

Option 1: SSH via a mobile terminal app

The incumbent answer. Apps like Termius (iOS/Android), Blink Shell (iOS), and JuiceSSH (Android) let you SSH into a remote server from your phone and interact with a terminal.

What you get: Full SSH access to the server. Attach to a tmux session, interact with Claude Code, run commands — everything you can do from a desktop terminal.

The friction: A terminal on a phone is genuinely painful. The keyboard occupies half the screen. Sessions time out silently when the app backgrounds. Selecting and copying text from terminal output is awkward. Managing multiple SSH sessions across agents means managing multiple app windows.

Best for: General server access, debugging, one-off checks. If you need to run an arbitrary command on the server, a mobile SSH app is the fastest path.

Not ideal for: Sustained AI coding agent monitoring. Reading live Claude Code output in a tiny terminal, approving permission gates by typing, and reviewing diffs character by character — all technically possible, all unpleasant.

Option 2: Tailscale + SSH

Tailscale creates a private WireGuard-based mesh network between your devices. Install it on both the server and your phone; they get private IP addresses on the tailnet (100.x.x.x range). SSH to the server's Tailscale IP instead of the public IP.

What you get: The same SSH access as above, but:

  • No public SSH port — the connection goes over the private tailnet
  • No firewall rules needed — Tailscale handles NAT traversal
  • The server's SSH port (22) can be blocked via ufw; Tailscale traffic doesn't need it

Setup:

# On the server (Ubuntu):
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up

# Install Tailscale on your phone from the App Store or Google Play
# Same account as the server

# SSH using Tailscale IP:
ssh user@100.x.x.x

Best for: SSH access you want to keep private. If you're accessing a personal dev machine or a VPS that doesn't need public SSH, Tailscale is the right security posture.

Not ideal for: Replacing the terminal friction — you still have a terminal on a phone.

Option 3: Grass — purpose-built for agent workflows

Grass is a native iOS app (Android PWA) that replaces SSH as the access layer for remote coding sessions running Claude Code or OpenCode. The Grass CLI runs on the server alongside Claude Code; the Grass app connects over HTTP/SSE.

No SSH client. No terminal on the phone. Live agent output, approval modals, file browser, and prompt input as native mobile UI.

What you get:

  • Live agent output streamed over SSE — full markdown rendering and syntax highlighting
  • Native permission modal the moment Claude Code hits an agent approval gate — one tap to approve or deny
  • File browser for the project directory
  • Diff viewer (git diff HEAD output, color-coded)
  • Prompt input to send new instructions mid-session
  • Session persistence — close the app, reconnect, history is restored

How to set up Grass for remote server access

Step 1: Install the Grass CLI on the server:

npm install -g @grass-ai/ide

Requires Node.js 18+.

Step 2: In the project directory where Claude Code is running:

grass start --network tailscale
# or: grass start --network remote-ip (exposes Grass on the machine's public IP)

For --network tailscale: Tailscale must be installed on both the server and your phone, connected to the same tailnet. Grass reads the server's Tailscale IP automatically and encodes it in the QR code.

Step 3: A QR code appears. Open the Grass app, tap the scan button, scan it. The server is saved as a connection.

Step 4: Tap the server connection to browse repos, select an agent (Claude Code or OpenCode), and start or resume a session. Live output begins streaming immediately.

Subsequent connections: The server is saved. No re-scanning needed — just open the app and tap the connection.

Best for: Claude Code and OpenCode users who want a mobile interface rather than a terminal. Once set up, checking on a running agent takes 3 seconds — open the app, tap the server, see the output. No SSH client, no terminal keyboard, no tmux commands.

Comparison

SSH (mobile terminal) Tailscale + SSH Grass
Requires terminal on phone Yes Yes No
Native approval modals No No Yes
File browser No No Yes
Diff viewer No No Yes
Works with Claude Code Yes Yes Yes
Public SSH port needed Yes No No (with Tailscale)
Free Depends on app Free Free

Frequently asked questions

How do I SSH into my dev server from my iPhone?

Use Termius (available on the App Store, free tier includes basic SSH) or Blink Shell (paid, designed for power users). Add your server's hostname/IP and SSH key in the app settings, then connect and interact with a terminal.

What is the best app to access a remote server from mobile?

Depends on your use case. For general SSH access: Termius is well-designed and cross-platform. For Claude Code and OpenCode agent workflows: Grass provides a purpose-built native interface without the friction of a mobile terminal.

How do I access a remote server from my phone without a terminal?

Grass. Install the CLI on the server (npm install -g @grass-ai/ide), run grass start --network tailscale or --network remote-ip, and scan the QR code. No terminal or SSH client needed on the phone.

How do I use Tailscale to access my dev server from my phone?

Install Tailscale on the server (curl -fsSL https://tailscale.com/install.sh | sh && sudo tailscale up) and on your phone (iOS App Store or Google Play). Both use the same Tailscale account. SSH using the server's Tailscale IP (100.x.x.x), visible in tailscale status.

What is the difference between SSH and Grass for mobile dev server access?

SSH gives you a terminal — full server access, any command, any tool, but a keyboard-heavy interface on mobile. Grass gives you a native mobile interface specifically for Claude Code and OpenCode sessions — live output, approval modals, file browser — without a terminal. They serve different use cases: SSH for general access, Grass for sustained agent monitoring.

Can I browse files on a remote server from my phone?

With SSH, yes — but via a terminal file browser like ls, cat, and less. With Grass, the app includes a native file browser for the project directory, letting you navigate and read files with a tap.

How do I connect to a VPS from an Android phone?

For SSH: JuiceSSH (free, Android) or Termius (cross-platform). For Grass: the Android PWA at codeongrass.com — install it to your home screen via Chrome's "Add to Home Screen" option.