Getting started

This page walks the shortest path from a repository to a first Loop: create a Workspace and a Property, run torno init, define a Metric and a Loop through config, and watch the first Signal arrive.

Create a Workspace and Property

Sign up at https://app.torno.app and create a Workspace. Inside it, create a Property for the thing you are growing — an app, a marketing site, or a pre-launch idea. A Workspace can hold several Properties.

Every Property comes with three fixed environments: dev, staging, and prod. Each has its own client and server write keys, so development traffic never lands in production data. Use the matching key for each environment from the start; separating them later is harder.

Run torno init

From your repository root:

torno init
torno init --dry-run       # plan everything, write nothing
torno init --resume        # continue an interrupted run
torno init --skip-stripe   # defer revenue wiring; collection still verifies
torno init status          # current step and the exact next command

The command inspects the repository and records what it found: framework (Next.js, Astro, Vue, Svelte, or a static site), server runtime (Node, Python, or none), package manager, monorepo layout, and host. When detection is ambiguous it asks rather than guessing, and every guess it does make is shown with its evidence. From there it plans the concrete work: the SDK dependency and code changes, first-party collection proxy wiring, and a merge into your Torno config.

Three properties of the flow are worth knowing up front:

  • Consent is explicit. You choose a consent posture — opt_in, opt_out, or region_split. If you omit it, init applies the protective default and says so plainly.
  • Stripe can wait. --skip-stripe defers revenue wiring without blocking event collection. You can connect Stripe whenever you are ready.
  • It resumes idempotently. An interrupted run picks up where it stopped. Re-running after success is a truthful no-op — no duplicate Loops, no duplicate keys. A dry run writes nothing, and existing config is merged, never replaced.

The flow also runs non-interactively, so a coding agent can complete it without prompts; torno docs --agent describes the whole journey in machine-readable form.

Define your first Metric and Loop

torno init offers curated Loop templates (torno init --list-templates) and writes the result into torno.config.yaml — TypeScript config is also supported. This is the same loops-as-code file you keep using afterward. It declares your target Metric, guardrails, the Loop itself, and the event dictionary entries the Metric depends on.

torno config validate      # check the local file
torno config push          # apply through the normal contracts and policy path

The push goes through the same contracts and policy path every later change uses; setup has no privileged backdoor. Your first Loop is created as LP-1 and starts in listening.

Verify events arrive

The final phase of init verifies the path end to end: service health, the proxy, the write key, an event round-trip, and first-signal status. Failed steps retry independently — a proxy problem does not send you back to the consent step. torno init --verify-only re-runs just the checks. The first-run screen in the web app mirrors the same state and flips the moment your first Signal arrives.

Event collection covers what happens to events after that; Signals covers how they feed a Loop.

About the 15 minutes

Torno is designed so that a first closed Loop is reachable in about 15 minutes from torno init. That is a design target the flow is built and instrumented against — not a measured customer benchmark. Your repository, your review habits, and your choice of first Metric all move the number.

Honest notes

Hosted provider connections — Stripe, ad accounts, listening providers — can all be connected later. Each connection shows its own verification state in the product, so you can always see what is wired, what is pending, and what has never been tried.

Next steps

  • The Loop — what the states mean and how a Loop closes.
  • Loops in practice — worked examples of real cycles.
  • Loops as code — the config file in full: pull, diff, push, and drift.
  • SDKs — the adapters and middleware torno init wires for you.