Skip to content

feat: remote tab support — launch agents on remote hosts via SSH #98

Description

@astetic-dev

Feature request: remote tab support

Each tab should be able to run either a local or remote agent session.

User flow

  1. New tab → choose Local or Remote
  2. Remote opens a host picker modal:
    • List of saved hosts with nickname + hostname
    • Live reachability indicator per host (green dot / grey / spinner)
    • + Add host… option at the bottom
  3. Selecting a host opens a new tab connected to that machine

Host picker UI

┌──────────────────────────────────────┐
│  Choose a remote machine             │
│                                      │
│  ● Home PC           192.168.1.42   │
│  ● Work Laptop       work.tail…net  │
│  ● Raspberry Pi      pi.local       │
│                                      │
│  ─────────────────────────────────  │
│  + Add host…                        │
└──────────────────────────────────────┘

Add host form fields

  • Nickname (display name)
  • Hostname / IP
  • Port (default 22)
  • Username
  • SSH key path (file picker)
  • Default project path (optional)

"Add & test" button does an immediate reachability check on save.

Data storage

Persist host list as hosts.json in the Tauri app data directory.

{
  "hosts": [
    {
      "id": "uuid",
      "nickname": "Home PC",
      "hostname": "192.168.1.42",
      "port": 22,
      "user": "arjen",
      "key_path": "~/.ssh/id_ed25519",
      "default_project": "/home/arjen/projects/myapp"
    }
  ]
}

Backend (Rust/Tauri)

Required Tauri commands:

  • list_hosts() → Vec<Host>
  • add_host(host) → Host
  • remove_host(id) → ()
  • check_reachability(hostname, port) → bool — TCP connect with 2s timeout (no root required)

Reachability checks run in parallel when the modal opens.

SSH execution via russh crate (async, no system SSH dependency):

russh = "0.44"
russh-keys = "0.44"

Network

  • Same LAN: direct IP
  • Cross-network: Tailscale recommended (stable hostnames, works behind NAT)

Auth

SSH key-based auth (primary). Password auth as optional future addition.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions