Open-source · self-hosted PaaS

Git push to deploy.
On a box you own.

Outhaul is a single ~25 MB Go binary that turns any VPS into a git-push-to-deploy platform. It orchestrates Docker and Traefik, keeps state in SQLite, and then gets out of the way. No control-plane sprawl. No Node runtime. No external database.

$curl -fsSL https://outhaul.sh/install | sh
One command. Runs on any Linux VPS with Docker.
~/api-gateway — deploy Running
~25MB
Binary on disk
single file
3
Build strategies
Nixpacks · Docker · Compose
0
External services
SQLite embedded
1
Command to install
curl · sh
How it works

Point a git remote at your server. Push.

Outhaul watches for pushes, builds the image however your repo wants — Nixpacks, Dockerfile, or Compose — and hands the container to Traefik with TLS already wired. The whole loop lives in one process on your machine.

1

Add the remote

One SSH remote pointed at your VPS. No CLI to install on your laptop, no account to create.

git remote add outhaul ssh://…/api-gateway

2

Push your branch

Outhaul figures out how to build it — zero-config Nixpacks, your own Dockerfile, or a Compose stack — builds with layer caching, and streams the log straight back to your terminal.

git push outhaul main

3

It's live

The container starts, Traefik routes your domain with automatic HTTPS, and the old one drains. Zero-downtime by default.

✓ api.example.com

What's in the binary

Everything the platform needs. Nothing it doesn't.

No sidecar services, no message queue, no separate control plane. The features below all ship inside the same ~25 MB executable.

One static binary

Written in Go, statically linked. Copy it to a server and run it — no runtime, no package tree, no version drift.

Deploy anything

Three build strategies from one binary: zero-config Nixpacks, your own Dockerfile, or a multi-service Docker Compose stack.

Automatic HTTPS

Managed Traefik routes every app and provisions per-route Let's Encrypt TLS. No DNS yet? Get a working sslip.io hostname instantly.

Blue-green & rollback

Health-gated cutover means a broken build is never promoted. Roll back to any previous deploy in one click — it re-runs the stored image, no rebuild.

Managed databases

One-click PostgreSQL, MySQL, and Redis with generated credentials. Attach one to an app and the connection URL is injected as an env var — rotated every deploy.

Preview environments

Every GitHub PR gets its own preview app with an isolated database, a sticky comment with the live URL, and automatic teardown when the PR closes.

The dashboard

An operator's console, not a marketing site.

Dark, dense, monospace. Built for the person who lives in it every day — deploy history, resource stats, and a following log tail on one screen.

🔒 harbor-01.example.com/projects/api-gateway
projects / api-gateway Running api.example.com ↗
CPU
18%
Memory
42.6MB
Net I/O
1.2MB/s
Uptime
6d 04h
Deploy history
fix: retry traefik reload on config swap
3f9a2c1 · elena.k · 4 min ago
38s
chore: bump go 1.23, rebuild base
a1c07de · marcus · 1 hr ago
41s
feat: add /healthz probe endpoint
7b2e9f0 · elena.k · 3 hr ago
exit 1
initial commit — import from heroku
0d4411a · marcus · 2 days ago
52s
Live log tail
14:22:03dbgGET /healthz 200 · 0.4ms
14:22:07infGET /v1/orders 200 · 12ms
14:22:09wrnupstream latency 812ms > p95
14:22:11errPOST /v1/checkout 500 · db reset
14:22:11infretrying db (attempt 1/5)
14:22:12infdb restored · pool=16
14:22:14dbgGET /healthz 200 · 0.3ms
Deploy history as a manifest Following log tail Live resource stats

Cast off from your own harbor.

Outhaul is early and built in the open — expect rough edges, and expect us to fix them fast. Install it on a spare VPS, kick the tires, and follow along on GitHub.

$curl -fsSL https://outhaul.sh/install | sh