Open source · MIT · v0.14.10

Your own little cloud.

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.

  • Bun, SQLite and Caddy
  • No Kubernetes
  • Agent-native over MCP

YouDeploy ./dist as launch-page, and give me a share link that expires on Friday.

  1. deploy_sitelaunch-page · 214 files · 1.8 MB
  2. create_share_linkexpires Fri 18:00

AgentDone. Preview is live at launch-page--k3f9a.example.com and here's your share link. The audit log records the deploy as mcp.deploy_site.

$ yoal deploy ./dist
  packing   214 files, 1.8 MB
  release   sha256:9c1e…4b07
  preview   https://launch-page--k3f9a.example.com
  promote   production → k3f9a  ✓ 41 ms

$ yoal rollback launch-page
  promote   production → p7d2c  ✓ 38 ms

Why Yoal

The deploy experience of a big platform, on hardware you own.

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.

Small

Bun, SQLite and Caddy, plus optional ClickHouse for telemetry. No Kubernetes, no Docker requirement, no external database. It fits on a small VPS.

Immutable

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.

Agent-native

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.

One brain, five surfaces

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.

Operable

Prometheus metrics, traffic and error telemetry, alerts, Litestream backups with a monthly restore drill, and self-update with rollback from the dashboard.

Deploys

Every deploy gets a URL. Production is just a pointer.

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 routes
  • Precompressed br and gzip, SPA mode, custom 404s
  • Public, password or platform-login access, plus share links you can revoke instantly
  • Wildcard TLS via DNS-01, so new subdomains need no DNS changes or new certs
launch-pageDeployments
  1. k3f9a sha256:9c1e…4b07 2 min ago production
  2. p7d2c sha256:51aa…e9c2 yesterday Promote
  3. b02mx sha256:e470…13fd 3 days ago Promote

● launch-page.example.com → k3f9a

For agents

Ask your agent to deploy a website, and it does.

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.

  • OAuth 2.1 with CIMD and DCR, PKCE and scope step-up
  • Deletes wait for a human to confirm, in the client or the dashboard
  • A token can do at most what its scopes and your current role allow
  • Every call lands in the audit log as mcp.<tool>, denied ones too

Connect Claude Code

claude mcp add --transport http yoal https://control.example.com/mcp

What it can reach

  • Projects
  • Deploy
  • Releases
  • Environments
  • Functions
  • Volumes
  • Databases
  • Backups
  • Queues
  • Event rules
  • Storage
  • Access
  • Logs
  • Dashboards
  • Alerts
  • Email
  • Platform

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

Start with a static site. Grow into a small cloud.

Managed services are attached to projects with scoped credentials, and Yoal suggests the environment variables from your .env and code.

Static sites

Preview URLs, promote and rollback, access control and share links.

Functions

Workers-compatible functions on pinned workerd, with cron triggers. No Wrangler needed.

Preview

Apps and containers

Sandboxed systemd process apps, Podman containers, git builds and custom domains.

Databases

Postgres 16 to 18, MySQL, MariaDB, MongoDB, Valkey, Redis and ClickHouse, with backups and a built-in studio.

Object storage

S3-compatible buckets with scoped credentials, usage charts and soft delete.

Queues

Managed NATS JetStream with peek, send, redrive and event rules.

Email

Outbound mail from your verified domains through Yoal’s own MTA, with DKIM.

Errors and telemetry

Sentry-compatible error tracking, traffic, logs and custom dashboards.

Day two

Built to be run by one person.

Alerts that reach you

Offline nodes, disk, certificates, backups and 5xx spikes after a promote, sent by email, webhook, Discord, Slack, Telegram, ntfy, SMS or Web Push.

Recovery you have rehearsed

Litestream backups to R2, a scripted restore, a monthly restore drill and an encrypted recovery kit.

Updates that roll back

Signed releases, stable and canary channels, and an atomic release switch that rolls itself back if a health check fails.

More than one machine

Node agents reconcile desired state over WireGuard. If a worker goes down, its sites answer with a branded 503 and Retry-After.

Get started

Three commands from a fresh VPS to a live site.

  1. 1

    Install the platform

    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
  2. 2

    Log in from your machine

    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
  3. 3

    Deploy

    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

Deployed content is untrusted. The platform acts like it.

One service layer

Every surface goes through the same core, so none can bypass a check another enforces.

Tokens narrow with roles

Demote someone and every token they issued narrows straight away.

Two domains

Deployed content lives on its own domain, so platform cookies never reach it.

Sealed secrets

Envelope encryption under a master key sealed to the machine with systemd-creds. Secrets can’t be read back through the API.

Set sail on your own server.

Yoal is newly open source and still early. Expect rough edges and breaking changes before 1.0. Issues and pull requests are welcome.