Cleat
Self-hosted PaaS over SSH

Deploy to your own servers. Not to someone else’s.

Cleat is a control panel, a CLI and an MCP server for deploying Phoenix, Go, Node, Rails and static apps over SSH — with GitHub push-to-deploy.

deploy lumina success
==> [ 1s] Node v22.23.2, npm 10.9.8
==> [13s] Building
==> [20s] Self-contained Nitro output; dropping node_modules
==> [21s] Publishing to /opt/lumina/releases/build
==> [25s] Done in 25s
==> Deployment successful — live at lumina.apps.example.com

Runtimes

Phoenix / Elixir

OTP release, migrations and systemd unit.

Go

Cais binaries, built on the VM.

Node

Next.js and TanStack Start, self-contained Nitro output.

Ruby on Rails

Puma behind Caddy, assets and DB prep.

Static

Pure HTML/CSS/JS served by Caddy. No git needed.

How it works

  1. 01

    git push

    Push to the linked branch.

  2. 02

    Webhook

    HMAC-verified, queued with Oban.

  3. 03

    Build on the VM

    Cloned and built over SSH.

  4. 04

    Publish

    Release, systemd and Caddy.

Three ways to use it

Register a VM, link a repo, click Deploy. Cleat provisions Caddy and a systemd unit for you.

# register the server once
cleat servers create --name web-1 --ip 203.0.113.10 --ssh-key-file ~/.ssh/id_ed25519  # prints its id

# link the repo and deploy
cleat deploy --repo owner/app --server 5 --host app.example.com --watch

Features

GitHub webhooks

HMAC-verified push-to-deploy.

Oban queue

Background deploys, one per host.

Live build logs

Watch the terminal as it builds.

Encrypted env vars

Written to the server on deploy.

Disk & memory

Per-server usage on the dashboard.

MCP built in

Agents deploy without a shell.