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.
-
Open
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.
Auto sleep · hibernation
Apps stop using CPU and RAM while idle, and come back on the next request.
-
Settings
Platform switch & idle window
Settings → Platform: enable idle shutdown and set the window in minutes (60 by default, minimum 5).
-
Open
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.
-
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.
-
Open
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).
Servers
The VMs that run the apps, driven over SSH and through the cloud provider API.
-
Open
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.
Settings
One page, two tabs.
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.