Yours
One Debian or Ubuntu VPS, your domain, your object store. No per-seat pricing, no lock-in, and if the control plane goes down your sites keep serving.
Yoal is a lightweight, self-hosted deploy platform for one VPS and a few nodes. Ship sites, functions, apps and databases to your own domain from a CLI, a dashboard, or your AI agent.
Why Yoal
One Debian or Ubuntu VPS, your domain, your object store. No per-seat pricing, no lock-in, and if the control plane goes down your sites keep serving.
Bun, SQLite and Caddy, plus optional ClickHouse for telemetry. No Kubernetes, no Docker requirement, no external database. It fits on a small VPS.
Every deploy is a content-addressed release with its own preview URL. Promote and rollback move a pointer, so they finish almost instantly and can’t half-apply.
A full MCP server with OAuth 2.1, consent with permission subsets and human confirmation before destructive actions. Agents get exactly what their token allows.
Dashboard, assistant, REST API, MCP server and CLI all call the same service layer. No surface can do more than another, and every action is audited the same way.
Prometheus metrics, traffic and error telemetry, alerts, Litestream backups with a monthly restore drill, and self-update with rollback from the dashboard.
Deploys
Upload a folder and Yoal stores it as an immutable release, keyed by its hash, with a permanent preview at <slug>--<id>.yourdomain. Promoting moves the production pointer and swaps a symlink. Rolling back does the same in reverse.
_redirects, _headers and yoal.json compile to Caddy routesbr and gzip, SPA mode, custom 404s● launch-page.example.com → k3f9a
For agents
Point any MCP client at your control plane. It finds the authorization server by itself, you approve it on a consent screen, and you choose which permissions it gets. 171 tools cover the whole platform, each a thin wrapper over the same call the dashboard makes.
mcp.<tool>, denied ones tooConnect Claude Code
claude mcp add --transport http yoal https://control.example.com/mcp
What it can reach
Prefer to stay in the browser? The optional in-dashboard assistant uses the same tools with any OpenAI-compatible model, and holds destructive actions for your click.
What you can run
Managed services are attached to projects with scoped credentials, and Yoal suggests the environment variables from your .env and code.
Preview URLs, promote and rollback, access control and share links.
Workers-compatible functions on pinned workerd, with cron triggers. No Wrangler needed.
Sandboxed systemd process apps, Podman containers, git builds and custom domains.
Postgres 16 to 18, MySQL, MariaDB, MongoDB, Valkey, Redis and ClickHouse, with backups and a built-in studio.
S3-compatible buckets with scoped credentials, usage charts and soft delete.
Managed NATS JetStream with peek, send, redrive and event rules.
Outbound mail from your verified domains through Yoal’s own MTA, with DKIM.
Sentry-compatible error tracking, traffic, logs and custom dashboards.
Day two
Offline nodes, disk, certificates, backups and 5xx spikes after a promote, sent by email, webhook, Discord, Slack, Telegram, ntfy, SMS or Web Push.
Litestream backups to R2, a scripted restore, a monthly restore drill and an encrypted recovery kit.
Signed releases, stable and canary channels, and an atomic release switch that rolls itself back if a health check fails.
Node agents reconcile desired state over WireGuard. If a worker goes down, its sites answer with a branded 503 and Retry-After.
Get started
On Debian or Ubuntu with Caddy installed. The installer checks the host, lays out users and secrets, and rolls back if anything fails. Add --dry-run to see the plan first.
curl -fsSL https://raw.githubusercontent.com/KieranHolroyd/yoal/main/install.sh | sudo sh
Approve the CLI in your browser. For CI, use an API key instead.
npm install -g @yoal/cli && yoal login --url https://control.example.com
Yoal zips the folder, uploads it and promotes it. Your site is live at <project>.yourdomain.
yoal deploy ./dist
Want every build as it lands? Install from the canary channel with sh -s -- --canary. The full runbook is in the docs.
Security model
Every surface goes through the same core, so none can bypass a check another enforces.
Demote someone and every token they issued narrows straight away.
Deployed content lives on its own domain, so platform cookies never reach it.
Envelope encryption under a master key sealed to the machine with systemd-creds. Secrets can’t be read back through the API.
Yoal is newly open source and still early. Expect rough edges and breaking changes before 1.0. Issues and pull requests are welcome.