Remote development environment CLI
Project description
Remo
Spin up a fully-configured development environment in minutes. One command gives you a persistent, secure coding environment with Dev Containers support.
Prerequisites
- uv (install:
curl -LsSf https://astral.sh/uv/install.sh | sh) - SSH client
- Ansible 2.14+ (installed automatically by
remo init)
Installation
# Clone and install
git clone https://github.com/get2knowio/remo.git ~/.remo
cd ~/.remo
uv sync # Base install
uv sync --all-extras # With all provider SDKs (boto3, hcloud)
uv sync --extra aws # AWS only (boto3)
uv sync --extra hetzner # Hetzner only (hcloud)
# Initialize (installs Ansible collections)
uv run remo init
After installation, update with:
uv tool upgrade remo-cli
Choose Your Platform
| Hetzner Cloud | AWS | Incus | |
|---|---|---|---|
| Type | Cloud VM | Cloud VM | Local container |
| Location | EU/US datacenters | Global regions | Your hardware |
| Cost | ~€4/month | ~$30/month | Your electricity |
| Storage | Block volume | Root volume (SSM) / EBS (direct) | Host mounts |
| Access | Server IP | SSM (default) / Elastic IP | LAN hostname |
| Best for | EU, budget hosting | US, enterprise, spot instances | Local dev, homelab |
All platforms give you the same dev workflow and tooling described below.
The Dev Workflow
SSH in and you're greeted with an interactive project menu:
ssh remo@your-host
Remote Coding Server
--------------------
> my-project - active
another-project
[Clone new repo]
[Exit to shell]
Select a project and you're in a persistent Zellij session. Devcontainer projects auto-start their container. Disconnect anytime—your session survives.
Project Menu
The fzf-powered menu shows your projects from ~/projects:
- Arrow keys or 1-9: Select a project
- Enter: Launch/attach to the project's Zellij session
- c: Clone a new repository
- x: Exit to shell
Persistent Sessions
Zellij keeps your terminal sessions alive:
- Detach:
Ctrl+dreturns to the project menu - Reconnect: SSH back in, select the same project to resume
What's Installed
Every remo environment includes:
| Tool | Description |
|---|---|
| Docker + Compose | Official Docker CE with compose plugin |
| Dev Containers CLI | devcontainer up, devcontainer exec, etc. |
| Node.js 24 LTS | From NodeSource repository |
| GitHub CLI | gh for GitHub workflow integration |
| Zellij | Terminal multiplexer for persistent sessions |
| fzf | Fuzzy finder powering the project menu (server-side) |
CLI Quick Reference
# Connect to environment
remo shell # Auto-connect (or picker if multiple)
remo shell -L 8080 # Shell + forward remote :8080 to local :8080
remo shell -L 9000:8080 # Shell + forward remote :8080 to local :9000
remo shell -L 8080 -L 3000 # Shell + forward multiple ports
remo shell -L 8080 --no-open # Skip auto-opening browser
# Setup
remo init # Install dependencies
# Hetzner Cloud
remo hetzner create # Provision VM
remo hetzner list # List registered VMs
remo hetzner sync # Discover existing VMs
remo hetzner update # Update dev tools
remo hetzner destroy [--yes] # Tear down (keeps volume)
# AWS (SSM access — no inbound ports)
remo aws create # Provision EC2 via SSM
remo aws create --spot # Use spot instance (~70% savings)
remo aws list # List registered instances
remo aws sync # Discover existing instances
remo aws update # Update dev tools
remo aws stop [--yes] # Stop instance (pause billing)
remo aws start # Start a stopped instance
remo aws destroy [--yes] # Tear down (keeps storage)
remo aws info # Show instance info
# Incus Containers
remo incus create <name> [--host H] # Create container
remo incus list # List registered containers
remo incus sync [--host H] # Discover existing containers
remo incus update <name> # Update dev tools
remo incus destroy <name> [--yes] # Destroy container
remo incus bootstrap # Initialize Incus on host
# Updates
uv tool upgrade remo-cli # Update to latest version
# Help
remo --help
remo <command> --help
See platform-specific docs for full options:
Environment Variables
| Variable | Description |
|---|---|
REMO_HOME |
Config directory for remo state (default: ~/.config/remo) |
Troubleshooting
Installed remo on a new machine with existing instances?
remo aws sync # Discover AWS instances with 'remo' tag
remo hetzner sync # Discover Hetzner VMs with 'remo' label
remo incus sync # Discover Incus containers
SSH connection fails?
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa
Ansible collection not found?
remo init # Reinstalls dependencies
Platform-specific issues? See troubleshooting sections in:
Uninstalling
To fully remove remo from your machine:
# 1. Remove the remo installation (cloned repo + venv)
rm -rf ~/.remo
# 2. Remove the symlink
rm -f ~/.local/bin/remo
# 3. Remove remo config and state (known_hosts registry)
rm -rf ~/.config/remo
| Path | Contents |
|---|---|
~/.remo/ |
Cloned repo, virtual environment (.venv/), Ansible collections |
~/.local/bin/remo |
Symlink to ~/.remo/remo |
~/.config/remo/ |
Runtime state: known_hosts (environment registry) |
These paths can be customized during install via REMO_INSTALL_DIR, REMO_BIN_DIR, and REMO_HOME environment variables.
Note: Uninstalling remo does not destroy any cloud resources (EC2 instances, Hetzner VMs, Incus containers). Run remo <platform> destroy first if you want to tear those down.
License
MIT License - see LICENSE file for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file remo_cli-0.8.0rc1.tar.gz.
File metadata
- Download URL: remo_cli-0.8.0rc1.tar.gz
- Upload date:
- Size: 272.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
af49eb19ac8816b138ee2a1bf2ca11101dbc753ab73bb350053aba35258c8386
|
|
| MD5 |
47b47d4fbf411f6a5b66531c8647401a
|
|
| BLAKE2b-256 |
a42306383334bebef851314970d4746d9d7e343f0eef3ad48a7c93f6a7da61a5
|
Provenance
The following attestation bundles were made for remo_cli-0.8.0rc1.tar.gz:
Publisher:
release.yml on get2knowio/remo
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
remo_cli-0.8.0rc1.tar.gz -
Subject digest:
af49eb19ac8816b138ee2a1bf2ca11101dbc753ab73bb350053aba35258c8386 - Sigstore transparency entry: 1091329098
- Sigstore integration time:
-
Permalink:
get2knowio/remo@366b793965e2608c09e4ecc7ecebe4dd732f4324 -
Branch / Tag:
refs/tags/v0.8.0rc1 - Owner: https://github.com/get2knowio
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@366b793965e2608c09e4ecc7ecebe4dd732f4324 -
Trigger Event:
push
-
Statement type:
File details
Details for the file remo_cli-0.8.0rc1-py3-none-any.whl.
File metadata
- Download URL: remo_cli-0.8.0rc1-py3-none-any.whl
- Upload date:
- Size: 43.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fa82b4345113a9026bf57683db1e6424f80fc68c1166217bbdf02e2590a5478f
|
|
| MD5 |
48d33b9d448388b1f48de8d0e4d44ead
|
|
| BLAKE2b-256 |
f82126c7c54a2769b9439987f62b930e81133b119aa47d21cad8c1a51e5fb5cf
|
Provenance
The following attestation bundles were made for remo_cli-0.8.0rc1-py3-none-any.whl:
Publisher:
release.yml on get2knowio/remo
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
remo_cli-0.8.0rc1-py3-none-any.whl -
Subject digest:
fa82b4345113a9026bf57683db1e6424f80fc68c1166217bbdf02e2590a5478f - Sigstore transparency entry: 1091329150
- Sigstore integration time:
-
Permalink:
get2knowio/remo@366b793965e2608c09e4ecc7ecebe4dd732f4324 -
Branch / Tag:
refs/tags/v0.8.0rc1 - Owner: https://github.com/get2knowio
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@366b793965e2608c09e4ecc7ecebe4dd732f4324 -
Trigger Event:
push
-
Statement type: