Features

Everything Cleat does today and where to find it. The JSON API under /api/v1 is what the cleat CLI talks to, and every key of the deploy manifest is documented in docs/deploy-json.md .

Apps

Register a repository, deploy it and configure everything about it.

  • Register App

    Pick a GitHub repository and the preset fills runtime, host, port, unit and the push webhook.

    Open
  • App list with filters

    Search, filter by runtime, auto sleep opt-in and status, sort any column, paginate.

    Open
  • Deploy now

    Clones the branch, builds on the VM, publishes the release and restarts the unit.

    Open
  • Deployments & build log

    History per app with status, duration and the full build log of each deploy.

    Open
  • Cancel deploy

    Drops the queued job and marks the deployment failed; a build already running is not interrupted.

    Open
  • Release phase

    release_command runs after the release is published and before the restart, with the app env loaded and a timeout. A failure aborts the deploy and the previous release keeps serving.

    Open
  • Multi-process apps

    processes in deploy.json gives every process its own systemd unit: web keeps the base unit and the port, the others become <unit>-<name> and never bind it.

    Open
  • Managed addons

    addons: ["postgres:pgvector", "redis"] installs the datastores on the server, creates credentials per app and injects DATABASE_URL / REDIS_URL — rotatable from the app page.

    Open
  • Deploy branch & webhook

    Auto-deploy only fires for the configured branch; URL and HMAC secret live in the Webhook tab.

    Open
  • Environment variables

    Encrypted at rest, synced to /etc/<app>/env on every deploy, secrets masked until revealed.

    Open
  • Runtime packages

    Extra apt packages installed on each deploy, per app.

    Open
  • Runtime logs

    The last journal lines of the app's systemd unit, refreshed on demand.

    Open
  • Tenant domains

    Custom domains with on-demand TLS, verified from the panel.

    Open
  • Delete app

    Danger zone: stops the unit and removes the release, the Caddy site, env vars and the webhook.

    Open

Auto sleep · hibernation

Apps stop using CPU and RAM while idle, and come back on the next request.

  • Platform switch & idle window

    Settings → Platform: enable idle shutdown and set the window in minutes (60 by default, minimum 5).

    Settings
  • Per-app opt-in

    Auto sleep chip in the app hero and the Idle column in the list. The flag only arms on the next deploy of that app.

    Open
  • Hibernate / Wake up

    Manual stop and start, with a confirmation dialog. The process dies; release, data dir and Caddy site stay on disk.

    Open
  • Wake on request

    The deploy installs the cleat-waker agent: Caddy's forward_auth starts the app on the next request and waits until it answers (cold start).

  • Idle sweeper

    An Oban cron runs every 5 minutes and stops the apps that opted in and had no access for the whole window. Only the HTTP process sleeps — workers keep running — and it never stops an app whose wake was not armed.

  • Status column

    On / Off per app, read from the systemd state of the unit the panel controls (a Go worker unit does not keep an app looking On).

    Open

Servers

The VMs that run the apps, driven over SSH and through the cloud provider API.

  • Register / provision a VM

    Lightsail or Hetzner with cloud-init: Caddy, git, build tools, firewall and the SSH key.

    Open
  • Inventory sync

    Lists instances from the provider, reconciles IPs and marks each one running / missing / private.

    Open
  • Power on / off

    Stops or starts the whole VM through the provider API, keeping everything on disk.

    Open
  • Resize

    Change the instance bundle/plan and sync the specs back into the panel.

    Open
  • Insights

    CPU, network, per-runtime and per-day deploy charts, plus host disk and memory.

    Open

Settings

One page, two tabs.

  • Platform tab

    Idle shutdown switch and the shared idle window for every app of the tenant.

    Open
  • Account tab

    Change the email (confirmation link) and the password without losing the session.

    Open

JSON API · /api/v1

What the cleat CLI uses. Everything is scoped to the token's tenant; writes need an owner/admin token.

  • Tokens & identity POST /auth/tokens · DELETE /auth/tokens · GET /me

    Create and revoke API tokens, and read the user, tenant and role behind the token.

  • Read apps GET /apps · GET /apps/:id · GET /apps/:app_id/env

    App payload with branch, host, port, unit, runtime, auto_deploy, idle_shutdown_enabled and indexable.

  • Deploys POST /apps/:app_id/deployments · POST /apps/:app_id/cancel · GET /deployments/:id

    Queue a deploy, cancel the queued one and follow status plus the build log.

  • Write apps POST /apps · PATCH /apps/:id · DELETE /apps/:id

    Create an app, edit branch/host/port/runtime/auto_deploy/idle_shutdown_enabled/indexable, or delete it.

  • Environment PUT /apps/:app_id/env · DELETE /apps/:app_id/env/:key

    Upsert or delete env vars; sensitive values are masked unless reveal is requested.

  • Static drops POST /apps/:app_id/drops

    Upload a gzipped tarball for a static app and publish it without a git repo.

  • Servers POST /servers · POST /servers/provision · POST /servers/:id/sync | start | stop | resize

    Create, provision, sync, power and resize the VMs, and read specs plus resize options.

  • GitHub push webhook POST /webhooks/github

    HMAC-SHA256 verified push that queues a deploy for the app's configured branch.

Ready to try it?

Register a server, connect a repository and push to deploy.