How to Connect to a Remote Dev Server Without SSH

Four alternatives to SSH for accessing a remote dev server — from web-based terminals to VS Code tunnels to Daytona workspaces — and how Grass replaces SSH entirely for agent workflows.

SSH works for remote server access, but it has real friction for agentic workflows: terminal apps on mobile are keyboard-heavy, sessions time out silently, and there's no native mobile UI for agent output or approval gates. Four alternatives exist depending on what you're trying to do — and for Claude Code or OpenCode sessions specifically, Grass replaces SSH entirely.

TL;DR

  • Tailscale + web terminal (ttyd/wetty): reduces setup friction, still a terminal
  • VS Code Remote Tunnels: full IDE access from a browser — good for coding, not monitoring agents
  • Daytona: managed cloud workspaces — eliminates the server SSH problem at the source
  • Grass: replaces SSH for Claude Code/OpenCode sessions — native mobile UI, no terminal required
  • Grass setup: npm install -g @grass-ai/ide, grass start --network tailscale, scan QR code

Why look beyond SSH?

SSH is the right tool for general server administration. For sustained AI coding agent monitoring, it's a poor fit:

  • Mobile SSH apps require a terminal keyboard on a small screen
  • Sessions time out silently — you come back to a disconnected session
  • No native UI for agent approval gates — you're typing "yes" or "no" into a terminal prompt
  • Managing multiple concurrent Claude Code sessions means multiple SSH connections

The question isn't whether SSH works — it does — but whether there's a better interface for the specific job of monitoring and controlling a running coding agent.

Option 1: Tailscale + a web-based terminal

Tools like ttyd or wetty expose a terminal in the browser over HTTP. Combine with Tailscale for private access:

# Install ttyd on the server
curl -L https://github.com/tsl0922/ttyd/releases/latest/download/ttyd.x86_64 -o /usr/local/bin/ttyd
chmod +x /usr/local/bin/ttyd

# Start ttyd on a port (behind Tailscale IP only)
ttyd -p 7681 bash

Access from any browser: http://100.x.x.x:7681 (Tailscale IP).

What you get: A terminal in a browser tab — no SSH client, no app install on the access device.

The limitation: Still a terminal interface. It reduces the toolchain friction but doesn't change the fundamental experience — you're still reading raw terminal output, typing approval responses, and dealing with scrollback.

Best for: Developers who want SSH-equivalent access without installing an SSH client. Not purpose-built for agent workflows.

Option 2: VS Code Remote SSH or Remote Tunnels

VS Code Remote SSH connects VS Code directly to a remote server — full IDE on the remote machine, UI on your laptop. VS Code Remote Tunnels (code tunnel) extends this to a browser via vscode.dev — no local VS Code required.

# On the server:
npm install -g @vscode/cli
code tunnel
# Authenticate with GitHub account
# Access from browser at vscode.dev

What you get: A full IDE experience on the remote machine from any browser — file editing, integrated terminal, extensions.

The limitation: Designed for interactive development, not for monitoring an autonomous agent session. You can attach to a tmux session in the integrated terminal, but you still have a terminal-in-an-IDE rather than a purpose-built agent monitoring interface.

Best for: Remote development work where you want a full IDE. Less useful as a passive monitoring layer for a running Claude Code session.

Option 3: Daytona workspaces

Daytona workspaces are managed cloud VMs — you provision them from the Daytona UI or CLI, they clone your repo and provision an environment, and you access them via the web IDE or daytona ssh. The key difference from a raw VPS: Daytona manages the server lifecycle.

For transient dev servers, Daytona eliminates the SSH problem at the source — you're not managing raw SSH config because Daytona handles the connection layer.

What you get: Cloud workspaces with a managed access layer — no raw SSH key management, no IP addresses to remember.

Best for: Developers who want cloud execution without server management. If you want to run Claude Code on the cloud without provisioning a VPS yourself, Daytona is the path.

Option 4: Grass — purpose-built for agent workflows

Grass replaces SSH as the access layer for remote coding sessions running Claude Code or OpenCode. The Grass CLI runs on the server; the Grass mobile app connects over HTTP/SSE. No SSH client, no terminal on the access device.

How Grass works

Step 1: Install the Grass CLI on the server:

npm install -g @grass-ai/ide

Step 2: In the project directory:

grass start --network tailscale
# or: grass start --network remote-ip

A QR code appears encoding the server address.

Step 3: Open the Grass iOS app or Android PWA, scan the QR code. The server is saved as a connection.

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

What you get:

  • Live agent output streaming with markdown rendering
  • Native permission modals for each Claude Code approval request — one tap to approve or deny
  • File browser for the project directory
  • Diff viewer (git diff HEAD, color-coded)
  • Prompt input for mid-session instructions
  • Mobile coding agent access without SSH or a terminal

Network options:

  • --network tailscale: connection over private Tailscale network — requires Tailscale on server and phone, no public ports
  • --network remote-ip: connection over public IP — simpler setup, requires appropriate firewall rules

Best for: Claude Code and OpenCode users who want a mobile-native interface. Once set up, checking on a running agent is 3 taps from your home screen — no SSH client, no terminal keyboard, no tmux commands.

Frequently asked questions

What are the alternatives to SSH for accessing a remote server?

For browser-based terminal access: ttyd or wetty behind Tailscale. For a full IDE: VS Code Remote Tunnels. For managed cloud workspaces: Daytona. For Claude Code/OpenCode session monitoring: Grass (native mobile interface, no terminal required).

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

Grass is the direct answer for Claude Code and OpenCode sessions. Install the CLI on the server (npm install -g @grass-ai/ide), run grass start --network tailscale, and scan the QR code from the Grass app. No terminal, no SSH client needed on the phone.

How do I use VS Code Remote Tunnels instead of SSH?

Install the VS Code CLI on the server (npm install -g @vscode/cli), run code tunnel, authenticate with GitHub, and access the IDE from vscode.dev in any browser. Full IDE access without SSH client or local VS Code install.

How does Grass replace SSH for Claude Code access?

Grass runs an HTTP server on the server alongside Claude Code. The Grass mobile app connects to it via HTTP REST + SSE — no SSH protocol involved. The Grass server auto-selects a port in the 32100–32199 range. For remote access outside the local network, Tailscale provides the private networking layer.

Can I access a remote dev server from a browser without SSH?

Yes. ttyd exposes a terminal in the browser. VS Code Remote Tunnels exposes a full IDE via vscode.dev. Daytona workspaces have a built-in web IDE. For agent-specific workflows, Grass provides a mobile-native app rather than a browser interface.

Is SSH necessary for remote Claude Code access?

No. For Claude Code session monitoring and control, Grass eliminates the SSH requirement. You still need SSH (or Daytona's access layer) for initial server setup and administration, but for day-to-day agent interaction, the Grass app is the interface.

What is the easiest way to connect to a remote server from mobile?

For general server access: Termius (SSH app, iOS/Android). For Claude Code or OpenCode sessions: Grass — install once, scan the QR code once, then tap to connect. No SSH config, no terminal keyboard, no session management.