Self-hosted serverless deployment platform for JavaScript applications.
Scafo stores its registry as JSON objects in an S3-compatible bucket and mutates them with conditional writes. It has no database or consensus protocol. One binary provides both the node daemon (scafo sail) and the CLI. Celld runs the deployed code; Caddy or Traefik pulls the fleet's routing from the node next to it.
Documentation: scafo.dev
- Docs — concepts, installation, guides, operations
- Configuration — every setting, environment variable and flag
- Deploy — Docker Compose, bare metal, VPS mesh, K3s/RKE2, Coolify, Dokploy, container image
- Reference — CLI, node API, ingress protocol, Caddy modules, registry layout, errors
npm install --global scafoLinux node: scripts/install.sh downloads and verifies Scafo, Celld, Caddy and esbuild, and writes systemd units and /etc/scafo when run as root. Container image: ghcr.io/sandros94/scafo:<version> (:edge tracks main).
The self-contained playgrounds need no external DNS or cloud credentials:
playgrounds/single-node/— deployment, routing, replacement, observations.playgrounds/multi-node/— coordination, placement, cell ownership, draining.
Production recipes live in examples/. The Caddy ingress is scafo-ingress.
Read SECURITY.md before production use: trusted workload model, public and private API surfaces, Celld limitations, bucket and lease requirements.
local development
- Clone this repository.
- Install Node.js
>=24.17.0. - Enable Corepack with
corepack enable. - Run
pnpm install. - Run
pnpm build. - Run
pnpm test. - Run
pnpm lint. - Run
pnpm typecheck.
Celld provides application runtime; Caddy and Traefik provide ingress; and WireGuard provides private network transport. H3, citty, and confbox support the API and CLI; unjwt, uns3, and tar support authentication, storage, and archives; esbuild bundles Worker entries on the node; tavolato renders CLI tables.