Give it a Try!

Remo

Fire up a coding agent, close your laptop, and walk away. Remo gives you persistent remote dev environments — on four cloud and homelab platforms or any box you can SSH into — reachable from your terminal or any browser.

Remo robot mascot - a bronze industrial robot holding a holographic display, surrounded by cloud infrastructure icons

Your Agents Don't Need You Watching

AI coding agents are powerful, but they're tethered to your laptop. Close the lid, lose your Wi-Fi, or just walk away from your desk, and your agent dies mid-task.

Remo fixes this. It gives you a persistent remote environment where your agents keep running no matter what happens to your local machine. SSH in, kick off an agent, disconnect. Come back hours later and pick up exactly where things left off. Your Zellij session holds the full context: terminal output, running processes, everything.

This is what "set it and forget it" looks like for development.

Where Will You Remo?

But "set it and forget it" is only half the story. The other half is checking back in — from anywhere.

Kick off a Claude Code session at your desk before lunch. Check the progress from your phone over SSH while you're waiting in line for coffee. Pick it back up on your iPad from the couch that evening. Or don't check in at all — your agent doesn't care. It's still going.

Remo decouples your development from any single device. Your agent runs on persistent infrastructure, and you connect to it on your terms — when it's convenient, from wherever you happen to be. The work doesn't stop when you step away, and it's always there when you come back.

From a standing desk. From a hammock. From a hotel lobby the night before a conference. #WhereWillYouRemo

How It Works

Install from PyPI, provision an environment, and connect:

uv tool install remo-cli
remo init
remo hetzner create        # or: remo aws create / remo incus create / remo proxmox create
remo shell

You land in an interactive project menu. Pick a project, and you're in a persistent Zellij session with your DevContainer already running. Disconnect anytime — your session survives.

   ____ ___ _ __ ___   ___
  | __// _ \  _ ` _ \ / _ \
  | | |  __/ | | | | | (_) |
  |_|  \___|_| |_| |_|\___/

  [ Remote Coding Server ]

Select a project (1-9, ↑↓, Enter | c=clone, d=delete, x=exit):

  my-project ● ⇡
  another-project ●
  cool-side-project
  [Clone new repo]
  [Exit to shell]

> Legend:  ● changes  ⇡ push  ⇣ pull  ⚡ active

What You Get

Every Remo environment comes fully loaded:

Persistent sessions — Zellij keeps your terminal state alive across disconnects. Detach with Ctrl+d, reconnect with remo shell, and resume exactly where you left off.
DevContainer integration — Projects with a .devcontainer config auto-launch their Docker container when you select them. No manual setup.
Interactive project menu — An fzf-powered launcher shows your projects from ~/projects. Arrow keys, number shortcuts, or just type to filter.
Port forwardingremo shell -L 8080 tunnels remote ports to your local machine, with auto-open in your browser. Forward multiple ports at once.
File transferremo cp moves files between your machine and any environment using simple colon notation. No separate SCP setup needed.
Snapshotsremo <provider> snapshot create, plus list, restore and delete — the same command surface on all four providers. Take one before a risky change, roll back if it breaks. Near-instant and free on Incus and Proxmox; a few minutes and a storage bill on AWS and Hetzner.
Pre-installed tooling — Docker + Compose, Dev Containers CLI, Node.js 24 LTS, GitHub CLI, Zellij, and fzf. Ready to go from the first SSH connection.
Shell completion — Tab-completion for subcommands, flags, and registered instance/container names. Activate with remo completion install, which writes the drop-in file and the one rc line for bash, zsh or fish.
One-command updatesuv tool upgrade remo-cli updates the CLI. remo <platform> upgrade refreshes the dev tools on your environment, and remo <platform> resize changes its shape without rebuilding.

No CLI? No Problem.

remo web runs a small home-lab Docker service that discovers every project across every registered instance and streams a real interactive terminal to any browser. No local CLI, no SSH keys on the client. It attaches to the exact same persistent Zellij and DevContainer session remo shell would — so you can start a session at your desk and pick it up in a browser tab on a Chromebook.

uv sync --extra web    # FastAPI/Uvicorn extra, not part of the normal CLI
remo web check         # validates registry, SSH identity, runtime dir, reachability
remo web serve --host 127.0.0.1 --port 8080

Deploy it two ways. Bind-mount mode shares your existing registry and SSH key read-only. Adopted mode mounts nothing: the container generates its own SSH identity, and a single remo web push from your workstation authorizes it on every instance — your personal private key never leaves your laptop. From there remo web sync keeps both sides converged with a bi-directional three-way merge: local changes go up, console-made changes come down, deletions propagate with consent, and divergent edits surface as per-entry conflicts instead of a silent overwrite.

Click a host and you get its detail page: live load, CPU, memory, disks and temperatures. Opt in with REMO_WEB_HOST_ADMIN=enabled and you can clone a repo as a new project, rebuild a devcontainer, or open a shell on the host itself. Opt in with REMO_WEB_REGISTRY_ADMIN=enabled and the console can register and configure new hosts end-to-end — which makes Remo usable with no workstation CLI at all. Both admin surfaces are dormant unless you turn them on.

Security boundary: the console is a single-trusted-user service with no login. Anyone who can reach it can open a shell on every instance in your registry. Bind it to a trusted LAN interface, a Tailscale address, or a loopback reverse proxy — never expose it to the public internet.

Pick Your Platform

Remo deploys to four platforms. Same dev workflow, same tooling, your choice of infrastructure.

Hetzner Cloud — the simplest path: cheap EU/US VMs with a persistent volume that survives server teardown.
Cloud VM · ~€4/month · persistent block volume · reached by server IP · best for budget EU/US hosting
AWS — the enterprise option: SSM Session Manager for zero-inbound-port access, spot instances for roughly 70% savings, stop/start to pause billing, multi-user namespacing, and Route53 DNS.
Cloud VM · ~$30/month, ~$10 on spot · EBS or root volume · SSM with no open ports, or SSH · best for enterprise and spot savings
Incus — lightweight system containers on your own hardware. Containers get LAN IPs via DHCP and are reachable by hostname from any machine on your network.
Local container · your electricity · host mounts · reached by LAN hostname · best for local dev and homelab
Proxmox VE LXC — plugs Remo into an existing Proxmox homelab: the same local-container model as Incus, but on your cluster, using its storage pools and node networking.
Local container · your electricity · LVM / ZFS / dir · reached by LAN IP · best for an existing Proxmox cluster

…Or Anything With SSH

Already have a box you can SSH into — a VM, a bare-metal server, someone else's container — but no API token or hypervisor access? remo add NAME user@host:port registers it directly, and remo configure NAME installs the same toolchain every provisioned environment gets: Zellij, the DevContainer runtime, and the project menu. Provider sync is bulk discovery that needs provider access; add is a single registration that needs only SSH reachability.

Why Not Just Use a Cloud IDE?

Cloud IDEs lock you into a browser tab and a specific editor. Remo gives you a raw SSH environment. Use whatever editor, terminal, or workflow you want — VS Code Remote SSH, Neovim, Emacs, or a plain terminal. Your agent framework doesn't care where it runs as long as the session persists.

And because it's just a Linux box with Docker, anything that works locally works on Remo. No vendor lock-in, no proprietary APIs, no monthly seat fees.

The devcontainer runtime is swappable, too. Pass --devcontainer-runtime deacon (or set REMO_DEVCONTAINER_RUNTIME=deacon) and Remo installs Deacon — a single-binary Rust DevContainer CLI — in place of the Node.js one, and the launcher scripts call it instead. Experimental, but it takes the Node runtime out of the box entirely.

Install

uv tool install remo-cli
remo init

That's it. Requires Python 3.11+ and uv (or pip). remo init pulls in the Ansible collections that handle provisioning.

Getting Started

Set your platform credentials as environment variables, then create and connect:

# Hetzner (cheapest cloud option)
export HETZNER_API_TOKEN=your-token
remo hetzner create
remo shell

# AWS (enterprise features, spot pricing)
export AWS_ACCESS_KEY_ID=your-key
export AWS_SECRET_ACCESS_KEY=your-secret
remo aws create --spot
remo shell

# Incus (your own hardware)
remo incus bootstrap --host myserver
remo incus create --name dev1 --host myserver
remo shell

# Proxmox VE LXC (existing Proxmox cluster)
remo proxmox bootstrap --host pve-node1
remo proxmox create --name dev1 --host pve-node1
remo shell

# Any SSH-reachable box (no credentials needed)
remo add mybox me@192.168.1.50
remo configure mybox
remo shell

All you need is an SSH key pair — plus credentials for your chosen platform, if you're provisioning one.

Technologies

clidevcontainerscloud-developmentawshetznerincusproxmoxremote-devhomelabinfrastructure-as-codeai-agents