Deploy to a VPS

Hetzner, DigitalOcean, or any Linux box. The same one-command install, on a machine that never sleeps.

Why this path

A laptop sleeps; a sleeping hub can't answer your phone or your AI's connector. A small always-on Linux box fixes that without handing your data to anyone — you rent the box, you own everything on it.

This is the bun-native happy path. The exact same install flow you'd run locally — bun add -g @openparachute/hub && parachute init — on a server that never sleeps. No Dockerfile to maintain, no container build to keep in sync with releases. The hub installs itself as a systemd unit (survives reboots and crashes), supervises every module as a child, and parachute upgrade keeps the stack current.

Hetzner and DigitalOcean are worked through below, but any Ubuntu VPS — EC2, Linode, Vultr, a box in your closet — walks the identical steps.

The flow

Six steps from a fresh box to a hub your AI can reach. The provider-specific bit is just step 1 (provision); everything from step 2 on is identical regardless of where the box lives.

1. Provision a small Ubuntu box

Smallest shared-CPU instance with ~2GB RAM (1GB works for hub + vault alone; 2GB is comfortable for vault + surface + scribe). Image Ubuntu 24.04 LTS. Add your SSH public key at creation. Note the public IPv4. The Hetzner and DigitalOcean worked examples below cover the click-path on each.

2. SSH in

ssh root@<your-box-ip>

Or your non-root user, if you created one.

3. Install Bun 1.3+

curl -fsSL https://bun.sh/install | bash

Then open a fresh shell and confirm bun --version is 1.3 or newer (a fresh shell puts ~/.bun/bin on your PATH).

4. Install + init

bun add -g @openparachute/hub && parachute init

This installs the parachute binary, installs and starts the hub as a systemd unit on :1939 (survives reboots), installs the vault, and — because you're on an SSH session — pre-selects public exposure so the wizard URL is reachable from your laptop.

5. Finish the wizard

Two ways, your choice:

6. Clean public HTTPS URL

parachute expose public --cloudflare --domain vault.example.com

A Cloudflare Tunnel on a domain you own — this is what claude.ai's connector needs. The done screen hands you a copy-paste claude mcp add command with a fresh token; point any other client at <hub-origin>/vault/<name>/mcp.

Hetzner — worked example

Hetzner Cloud (console.hetzner.cloud) is the cheapest of the two and a great default if you're in Europe or don't mind a EU/US-East region.

Create → wait ~30 seconds → ssh root@<ip> → continue from step 3 above.

DigitalOcean — worked example

DigitalOcean (cloud.digitalocean.com) is the most GUI-friendly option, US-centric, and slightly pricier.

Create → ssh root@<ip> → continue from step 3 above.

Expose to the internet

On an SSH'd server, parachute init pre-selects public exposure for you. For a clean public HTTPS URL — the kind the claude.ai connector wants:

parachute expose public --cloudflare --domain vault.example.com

The apex (example.com) must already be a Cloudflare zone (the free tier is fine). Expose creates the tunnel — don't pre-create it. Each machine gets its own per-hostname tunnel name (no account-wide collision); override with --tunnel-name only to deliberately reuse one. Run the command interactively to be prompted for the hostname.

The cloudflared connector installs as its own managed unit, so the tunnel returns automatically after a reboot.

Pitfalls

Most of these you'll never hit. A few are common enough — the Cloudflare bot-protection one especially — to be worth reading before you wire up the Claude connector.

What you get

One systemd unit running the hub on :1939 — with reboot survival and admin-UI module management. The hub supervises vault, surface (with Notes auto-bootstrapped as its first hosted surface), and Scribe as child processes. Everything lives under ~/.parachute/ on the box's own disk — you fully own it. See the v0.6 deploy architecture note for the full shape.

Cost

All figures approximate — check current provider pricing.

Expected total: roughly $5–12/month for hub + vault + surface (with notes-ui auto-bootstrapped) + scribe running together, depending on provider and instance size.

Compare locally: the same stack on your own Mac or Linux box is free, but you give up the always-on URL and the "works from my phone, anywhere" property. The VPS path is the trade.

Why a VPS over a container PaaS

The bun-native path is our tested, exercised happy path — the same commands we run on laptops, in CI, and in every install doc.

A container PaaS (Render's render.yaml, Fly's Dockerfile) is a genuinely supported peer, and great for one-click GUI ops or portable volume snapshots. But its build diverges from that happy path — image CMD boot, modules onto a mounted disk, disk-vs-image upgrade semantics — code the laptop and VPS paths don't exercise.

On a VPS you get the exact architecture that runs on a laptop (hub-as-supervisor under systemd, modules as children sharing ~/.parachute/) with reboot survival and admin-UI module management, on a box that never sleeps and that you fully own. If you'd rather click than SSH, Deploy to Render and Deploy to Fly.io are the container alternative.

What comes next

A box that never sleeps

bun add -g @openparachute/hub && parachute init

Or install locally first.