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