createControlPlane() is a production server entry point. It always selects the Linux Firecracker provider, embeds the authenticated gateway, and refuses insecure development defaults.
TINY_MODE and TINY_ALLOW_DEV_LOGIN are not supported. There is no development mode and no macOS runtime fallback.

Required configuration

Choose one ingress and authentication mode

Apps route below /apps/…. One ordinary DNS record, one TLS certificate, no OIDC registration. This is the default produced by tools/setup-cloud.sh.

A complete hosted example

Server options

Host prerequisites are in Host requirements and the image procedure in Guest images.
The current runtime accepts TypeScript/JavaScript workers, SQLite databases, and object storage with no additional resource infrastructure. Postgres, build commands, and direct egress each need one setting below.

The 512 MiB floor

Guest memory is raised to a floor of 512 MiB however little a manifest asks for.
Below roughly 256 MiB the Node runtime’s text pages no longer fit in the guest page cache, and the guest kernel spends its whole CPU quota re-reading them from the virtio disk. On a nested-KVM host a 128 MiB guest read ~280 MB/s while idle and answered no request within two minutes.Firecracker faults guest memory in lazily, so a ceiling the app never touches is not charged to the host.

Databases

Every deployment with resources.database gets durable storage that outlives the microVM, and no credential inside it. SQL travels from the guest to the control plane’s data service over the VM’s private link, authenticated by the deployment’s own workload token. engine: sqlite needs no configuration: one file per environment under $TINY_DATA_DIR/databases, snapshot with VACUUM INTO. It is durable and correct, but it is one writer per database — the data service admits a single open write transaction per environment and says so rather than deadlocking. engine: postgres requires a cluster. See Postgres.

Object storage

resources.storage needs no configuration. Each namespace is a directory under $TINY_DATA_DIR/storage/<environment>/<name>. See Object storage operations for staging, quotas, and durability.

Builds

build.command runs in a throwaway microVM built from a separate image, with the same jailer, KVM, seccomp, and cgroup story as a serving deployment, plus a firewall hole to the package registry and nothing else.
The host also needs debugfs (from e2fsprogs) and tar: the result is read out of the guest’s disk image without mounting it, so an untrusted filesystem is never handed to the host kernel.
Without a build image the platform reports executesBuildCommands: false and tiny plan refuses a manifest with build.command. It never falls back to building on the control-plane host.

Direct egress

network.egress.mode: allowlist is off unless TINY_FIRECRACKER_ALLOW_EGRESS is true, because it is the one setting that lets application code reach the internet without passing through the broker. When it is on, the host resolves each declared hostname once, at deploy time, and pins the resulting addresses into that VM’s own nftables table. The guest cannot widen its allowlist later by answering DNS differently, and a hostname that resolves into a private range is refused outright rather than becoming lateral movement.
Prefer a capability. An app with direct egress holds whatever credential that endpoint needs; an app with a capability holds nothing.

CLI and MCP clients

The MCP server is started with pnpm mcp and reuses the current CLI profile when these variables are absent. Neither client starts a local runtime. The API listens on TINY_API_PORT and the embedded application gateway listens on TINY_GATEWAY_PORT; put TLS/reverse-proxy routing in front of both as needed.

Background work

Work and leases are durable, so a restarted process resumes queued jobs.