This walkthrough runs entirely from your own machine against a server you already installed. Nothing executes locally.

1. Bootstrap an organization

org create saves the returned human session in the default profile. The one-time API token it prints is for automation — store it somewhere a script can read, or discard it and keep using the profile.
Organization bootstrap is one of the few unauthenticated routes. It returns the organization, the runtime target, a once-visible apiToken, and a human sessionToken.
Confirm the profile and see what the target supports:

2. Look at the manifest

examples/hello-private is the smallest app that proves identity, routing, and lifecycle work. It needs nothing beyond a minimally configured target.
examples/hello-private/tiny.yaml
examples/hello-private/src/index.ts
A worker entrypoint must default-export tiny.app(handler). The handler receives standard Web Request and Response objects plus a verified Tinycloud context.
Starting from scratch instead? pnpm tiny init my-app writes this shape.

3. Validate, check, plan, deploy

Each step is separately useful, and the first three are all non-mutating.
1

validate — parse and check tiny.yaml locally

Parses the strict YAML subset, validates against the JSON Schema, normalizes defaults, and applies semantic rules. No network call.
2

doctor — check credentials, files, and reachability

Verifies your profile, the manifest, the entrypoint, migrations, and that the target is reachable and compatible.
3

plan — upload an artifact and compute the diff

Uploads an immutable content-addressed artifact, then returns a resource diff, migration plan, capability status, required approvals, and a cost estimate. Planning never mutates provider or application state.
4

deploy — enqueue the rollout and watch it finish

The API answers 202 and a worker rolls out afterwards. The command waits for a terminal state and exits non-zero if the deployment failed, repeating the deployer’s own reason and remediation.

4. Open it

visibility: private means only subjects named in access.subjects plus organization admins can reach it — and your owner email was added as an app admin during normalization. Everyone else gets a login redirect and then a denial. Grant someone else access without redeploying:

5. Watch it work

Logs come from context.log, plus context.audit events and the runtime host’s own structured output.

When something goes wrong

tiny deploy exits non-zero and repeats the deployer’s reason and remediation. GET /v1/deployments/:deploymentId carries the same detail. Traffic never moved — the previous deployment is still serving.
The change widened blast radius in production. Pass --yes to send approval intent with the request, or approve the pending deployment afterwards. --yes does not bypass role or policy checks. See Approvals.
The manifest asked for something this target does not have — Postgres without a configured cluster, build.command without a build image, or egress without the operator setting. That is the platform reporting honestly rather than failing halfway through a deploy.
Traffic repoints to the exact bytes that deployment served, and the URL never changes. See Lifecycle.

Next

Add a database

SQLite needs no infrastructure, and the app never holds a credential.

Choose who can open it

Private, organization-wide, or genuinely public.

Call a vendor API safely

Named broker operations instead of secrets inside the app.

Browse the examples

Seven manifests, from trivial to a full build-and-Postgres app.