CodeMote

Setting up a remote IDE on a cheap VPS

By Salvatore Castellitti, developer of CodeMote · 18 July 2026

I keep a few projects on a small Hetzner VPS, the 4 GB one, around 6 euros a month. For years my workflow there was SSH plus vim plus a lot of git diff in a terminal. It worked. It was also the part of my week I enjoyed least, mostly because of dropped connections. Every time the wifi hiccuped I lost the session, the shell history, and whatever vim state I had.

At some point I switched to running an IDE against the VPS instead: file tree, editor, terminals and git in a browser tab, with the actual files and processes staying on the server. This post is the setup, step by step. It uses CodeMote, which is the product this blog is about, so you know where I stand; the beta is free for founder seats, which at least means I'm not selling you a subscription.

Requirements

A VPS. Anything works; mine is Ubuntu 24.04 on Hetzner, but DigitalOcean, Vultr, whatever.
Node.js 18 or newer on the VPS.
A browser on your side.

You don't need to open any ports or configure nginx or set up a domain. The connection is an outbound tunnel from the VPS, which I'll get to.

Server setup

SSH in and set up a normal user if you haven't already:

ssh root@your-server-ip
adduser dev
usermod -aG sudo dev
su - dev

Install Node and git:

curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt-get install -y nodejs git

Clone a project and start the host from inside it:

git clone https://github.com/you/your-project.git
cd your-project
npx codemote-cli start

First run takes a minute because it downloads the host. Then it prints a QR code (for the iOS app, not relevant here) and a one-line pairing code for the browser.

One practical note: if you start the host from a plain SSH session, it dies when the session dies. For the first test that's fine. If you want it to stay up, run it inside tmux, or set up a systemd user service. I use systemd; it's about ten lines of unit file.

Connecting

Open the connect page, paste the pairing code, connect. That's the whole procedure. No account on the server side, no SSH key on the browser side.

How the connection works, briefly

The reason there's no port forwarding: the VPS opens an outbound connection to a relay and keeps it alive, the same direction of traffic as any HTTPS request. Your browser meets it at the relay. Nothing on the server is listening for inbound connections, so there's nothing for port scanners to find, and it works from networks that block everything except web traffic. The tunnel is encrypted, and the pairing code is only ever printed on the machine itself. There's a longer post on why the tunnel is outbound-only if you want the reasoning.

The default tunnel is a Cloudflare quick tunnel. You can switch to ngrok, Tailscale or Microsoft Dev Tunnels in the settings; I compared them in a separate post.

What it's like day to day

The editor is the biggest change from vim-over-SSH, for me. Not because vim is bad, but because editing remote files stops being sensitive to latency and dropped packets. The file lives on the VPS; the browser is just a view of it. If the connection drops, nothing is lost, and the tab reconnects on its own.

Terminals run on the server and persist there. This is the feature I'd miss most if I went back. I can start a build, close the laptop, and check the same terminal later, from the same machine or a different one, and the scrollback is intact. It's roughly what tmux gives you, without needing tmux, although you can still run tmux inside if you want. More on that in the terminals post.

Git has its own panel: status, staging, diffs, commits. Reading a diff in an actual diff view instead of scrolling git diff -U3 in a small terminal is worth a lot when you're reviewing your own changes before a commit. Credentials stay on the server; the browser never holds them.

What I still use SSH for

I didn't uninstall anything. I still SSH in for one-off admin on boxes I don't develop on, for anything scripted, and for the rare case where the host process itself needs poking. But the routine work, meaning edit files, run commands, check git, happens in the browser now. For me that covers most of what I was doing over SSH anyway.

The server side is the two commands above; budget about ten minutes including the Node install. Beta signup is on the homepage.