The server will not start
It refuses on macOS
It refuses on macOS
FirecrackerProvider, has no local runtime
fallback, and fails startup on non-Linux hosts. Run the control plane on a
Linux/KVM host and use the CLI from your Mac.Missing secrets or authentication
Missing secrets or authentication
createControlPlane() refuses insecure development defaults. All of
TINY_TOKEN_SECRET, TINY_SECRET_KEY, TINY_SESSION_SECRET, and
TINY_BROKER_URL are required, plus one complete
ingress mode.TINY_MODE and TINY_ALLOW_DEV_LOGIN do not exist.Firecracker image paths not configured
Firecracker image paths not configured
TINY_FIRECRACKER_KERNEL and TINY_FIRECRACKER_ROOTFS must point at files
that exist. See Guest images./dev/kvm missing
/dev/kvm missing
The plan refuses before uploading anything
This is the platform reporting honestly rather than failing halfway through a deploy. Check what the target actually has:The deployment failed
Health check never passed
Health check never passed
/_tiny/health did not answer. Traffic
never moved — the previous deployment is still serving.Usually the entrypoint. With build.output: dist, an entrypoint of
index.js means dist/index.js. Check tiny logs.Migration contents changed
Migration contents changed
TAP or nftables creation failed
TAP or nftables creation failed
nft and ip are present and the agent has
permission.APPROVAL_REQUIRED
APPROVAL_REQUIRED
The app is slow
Tens of seconds per request, high disk read while idle
Tens of seconds per request, high disk read while idle
~30 ms added to every request that logs
~30 ms added to every request that logs
TINY_FIRECRACKER_SERIAL_TELEMETRY=false removes it — but tiny logs and
usage metering read the serial log, so that deployment then reports neither.
See Observability.The first request after a while is slow
The first request after a while is slow
lifecycle.sleepAfter and the gateway wakes it
before proxying. Raise sleepAfter if the latency matters more than the
idle cost.Database problems
A second transaction is refused on SQLite
A second transaction is refused on SQLite
A transaction was rolled back on its own
A transaction was rolled back on its own
RESOURCE_LIMIT_EXCEEDED on a query
RESOURCE_LIMIT_EXCEEDED on a query
LIMIT and paginate.A date renders as the wrong day
A date renders as the wrong day
date arrives as a calendar-day string like '2026-08-22'.
new Date('2026-08-22') is UTC midnight and renders as the previous day
anywhere west of Greenwich. Compare and store it as text.Storage problems
get() returned null
get() returned null
Browser uploads fail above ~20 MB
Browser uploads fail above ~20 MB
client_max_body_size 20m
for browser uploads; the app’s own writes over the private link are bounded
at 32 MiB. Raise the nginx one if needed.Access and routing
Assets 404 on a single-host install
Assets 404 on a single-host install
/apps/<environment-route>/. An absolute /styles.css
resolves above the prefix. Use relative URLs. The gateway strips the
prefix, supplies X-Forwarded-Prefix, and rewrites root-relative Location
redirects — but it cannot rewrite your HTML.context.user is null on an app that requires login
context.user is null on an app that requires login
visibility: public with
requireLogin: false. Only that combination serves anonymous requests, and
it deliberately gives null rather than a synthetic user.A preview still asks for login
A preview still asks for login
404 on an ID you know exists
404 on an ID you know exists
404, not 403 — confirming existence would
be a disclosure. Check the token’s organization.Getting more detail
X-Request-Id, and the same value appears in
error.requestId. Use it to correlate across the gateway, the control plane, and
the deployment log.