SpinneryDocs
Browse documentation

Docs / Getting started

Get from signup to spin up with one first-run checklist.

The first-time flow is concrete: sign in through Auth0, select GitHub App repositories, prepare each repo with a reviewable spinnery.yml, create the project services and bindings, install the CLI, run spin login, run spin up, share a signed dev link on dev.spinnery.dev, then let idle sleep stop runtime billing.

  1. Auth0 login
  2. GitHub App selected repos
  3. Per-repo spinnery.yml
  4. Project services/bindings
  5. Install CLI
  6. spin login
  7. spin up
  8. Signed dev link
  9. Runtime sleep
first workspacehappy path

GitHub App connected for acme/scheduler

PR opened: add spinnery.yml

Project: Scheduler; services: Web, Backend

Bindings: web -> Web, /api -> Backend

$npm install -g spinnery

$spin login

$spin up

dev link: signed web--signed-links--acme.dev.spinnery.dev

billing: idle sleep stops runtime meter

Before the commands

Know the product surfaces before the first command.

The first run is easier to reason about when every step maps to a product surface: hosted workspace, shared shell, awake runtime, signed dev link, and awake-only billing.

Hosted branch workspaceworkspace = repo + branch + services

A prepared cloud workspace tied to a Git branch.

Spinnery turns a reviewed repo contract into a hosted branch workspace so the workspace, not the laptop, is the shared unit for checkout, tools, services, and readiness state.

Shared shellspin up

The CLI opens the shell first.

Developers, Claude, and Codex share one terminal context with Git, tmux, editors, tests, logs, and workspace metadata before service boot blocks the handoff.

Awake runtimewake on service work

Service capacity starts separately.

Web, /api, workers, checks, and resources wake only when service work needs them, so the runtime can be asleep while the shell remains useful.

Signed dev linkdev.spinnery.dev

Reviewers open the app surface.

Reviewers open the app surface through a signed dev.spinnery.dev browser session for web, same-origin /api, assets, and realtime traffic. Browser review uses the signed app session, not SSH or raw hosts.

Runtime billingawake runtime only

Cost follows awake service work.

The runtime meter starts for awake service capacity and stops after idle sleep; shell access, repo state, and product policy remain available.

CLI happy path

The production path is spin login, then spin up.

The first-release docs should show the same path users run: sign the CLI into the Organization, open the Project Workspace, attach to the Shell, watch Services and Resources wake the Runtime, then create a signed dev link when the handoff is ready.

CLIfirst workspace

$spin login

Organization: Acme / role: Developer

Access Policy: workspace open allowed; signed dev link allowed

$spin up

Project: Scheduler / Workspace: signed-links

Shell: ready with Git, tmux, Claude, Codex

Runtime: waking Services Web and Backend

Resources: postgres ready; cache waking; storage blocked by policy

Next: spin share when readiness is green

  • Authenticatespin login

    The CLI opens Auth0, then Spinnery resolves the Organization, product role, GitHub App scope, and Access Policy for workspace actions.

  • Choose product scopeOrganization / Project / Workspace

    spin up selects the Organization, Project, and branch Workspace before attaching to any Shell or waking any Runtime capacity.

  • Attach to ShellShell ready

    The Shell opens first with Git, tmux, Claude, Codex, logs, and the repo checkout. This baseline does not start Runtime billing.

  • Watch Runtime readinessServices / Resources

    Services and declared Resources report ready, waking, or blocked as web, /api, workers, checks, database, cache, mail, or storage work wakes the Runtime.

  • Share review accesssigned dev link

    Use spin share only after readiness is clear. The signed dev link covers web, same-origin /api, assets, and realtime traffic without granting SSH, logs, secrets, root, or runtime admin.

First-release path

One path from onboarding to a sleeping runtime.

Use this as the short first-run checklist: Auth0/GitHub onboarding, GitHub App selected repositories, per-repo spinnery.yml, spin login, spin up, instant shell access, signed dev links on dev.spinnery.dev, runtime sleep and billing, and the isolation rules that keep reviewer access narrow.

  1. Auth0/GitHub onboardingAuth0 org + GitHub App

    Sign in through Auth0, choose the Spinnery organization, and install the GitHub App only on the repositories Spinnery should prepare.

  2. Repo prep PRsspinnery prepare-pr

    Open focused setup PRs so repo owners review the workspace contract before branch workspaces depend on it.

  3. Per-repo spinnery.ymlservice contract

    Commit Compose previews, inputs, outputs, environment mappings, setup commands, tests, and CLI helpers beside each repo.

  4. CLI loginspin login

    Start the CLI session through Auth0 and confirm the same organization, role, and GitHub installation scope used in onboarding.

  5. Open workspacespin up

    Select the prepared project and branch, then attach to the hosted workspace without raw VM hostnames or cloud credentials.

  6. Instant shell/background runtimeshell ready / runtime waking

    Git, tmux, Claude, Codex, logs, and the branch checkout are ready first while web, /api, workers, resources, and checks wake behind them.

  7. Signed dev linksspin share

    Share a signed service--workspace--org.dev.spinnery.dev browser session for web, same-origin /api, assets, and realtime traffic.

  8. Runtime sleep/billingspinnery sleep

    Signed traffic, tests, workers, and jobs can wake the selected runtime size; idle sleep stops the runtime meter while the shell remains available.

  9. Security/isolationone-org-per-VM

    Shell and runtime VMs stay inside one customer organization, and signed dev links never grant SSH, logs, secrets, root, runtime admin, or private consoles.

first releaseready path

Auth0: acme developer authorized

GitHub App: acme/web and acme/api selected

PRs: spinnery.yml opened per repo

$spin login

$spin up signed-links

shell: ready immediately

runtime: waking web, /api, workers, resources, checks

dev link: signed web--signed-links--acme.dev.spinnery.dev

sleep: spinnery sleep stops runtime billing

security: one-org-per-VM; SSH/logs/secrets blocked

Hosted workspace model

spin login proves identity; spin up opens the hosted workspace.

A first user should understand exactly what gets created and what stays separate: Auth0 login, the repo-owned contract in spinnery.yml, an organization-exclusive shell VM, awake-only runtime services, and the signed dev link used for browser review.

first runhosted workspace

$spin login

Auth0: acme authorized as developer

$spin up acme/scheduler --branch signed-links

config: spinnery.yml loaded from repository

shell: ready on org-exclusive VM

runtime: asleep until web, /api, workers, or checks wake Small

dev link: signed web--signed-links--acme.dev.spinnery.dev

billing: shell included; runtime awake-only

  1. Identityspin login -> Auth0

    The CLI session starts with the product login.

    spin login opens Auth0, then Spinnery checks organization membership, product role, GitHub App scope, and whether that user can open or share the selected workspace.

  2. Repo contractspinnery.yml

    The repo owns the workspace recipe.

    The branch workspace uses the committed spinnery.yml for Compose previews, cross-service contracts, environment mappings, setup commands, and tests instead of hidden setup notes.

  3. Shell VMorg-exclusive shell

    spin up attaches to the hosted shell first.

    The shell VM belongs to one customer organization and opens with Git, tmux, Claude, Codex, logs, and the branch checkout before service runtime work has to finish.

  4. Runtime VMawake-only services

    Service capacity wakes separately from shell access.

    Web, /api, workers, checks, and declared resources wake the selected runtime size only when service work needs CPU, memory, or ports; idle sleep stops the runtime meter.

  5. Review linksigned dev.spinnery.dev

    Public review goes through a signed app session.

    The signed dev link gates web, same-origin /api, assets, and realtime traffic for one service, workspace, organization, and expiration while SSH, logs, secrets, root, and runtime admin stay closed.

First workspace preflight

Assign owners before the first workspace wakes.

A successful first run depends on more than the CLI command. Before spin up, make sure repo setup, access policy, resource modes, and runtime cost posture have named owners.

Repo ownerspinnery.yml approval

A repo owner reviews the Compose preview, inputs, outputs, environment mappings, setup commands, and tests before the setup PR merges.

The workspace contract should be owned by the team that owns the code.
Access ownerAuth0 + roles

An organization admin confirms Auth0 login, Spinnery roles, GitHub App installation scope, and who can issue signed dev links.

Identity is not enough; product roles decide workspace actions.
Resource ownerresource modes

Each database, cache, bucket, mail sink, queue, or disabled integration has an owner, mode, readiness expectation, and cleanup policy.

Resource decisions should not be discovered during reviewer handoff.
Cost ownersize + sleep + cap

The first workspace names its runtime size, idle sleep behavior, cap posture, and separate customer-cloud costs before the runtime wakes.

Awake-only billing is useful only when the boundary is visible.

Owner map

The first workspace is ready when each owner has a visible output.

Getting started should not hide ownership inside platform setup. Before the first workspace is shared, name who owns repository scope, repo contract review, product access, CLI handoff, reviewer access, and runtime cost posture.

GitHub adminselected repository install

Installs the Spinnery GitHub App only on the repositories that should receive setup PRs and branch workspaces.

Repository scope is narrow before Spinnery reads code.
Repo ownerspinnery.yml PR review

Reviews Compose previews, inputs and outputs, environment and secret mappings, setup and test groups, and cloud CLI entrypoints before the workspace recipe merges.

The hosted workspace runs a reviewed repo contract.
Org adminAuth0 roles + optional Tailscale

Confirms Auth0 organization membership, Spinnery product roles, signed-link issuance rights, root policy, and whether private routes need Tailscale.

Access is product-scoped before shell or reviewer handoff.
Developer or agentspin login && spin up

Signs into the organization, opens the branch workspace shell, watches runtime/resource readiness, and keeps work inside the shared terminal context.

The shell opens first while runtime readiness catches up.
Reviewerspin share

Receives the signed browser session created by spin share for web, same-origin /api, assets, and realtime traffic instead of raw hosts, SSH, logs, secrets, or runtime admin.

Review access stays app-scoped and revocable.
Billing ownerruntime size + idle sleep + cap

Confirms the first runtime size, cap posture, idle-sleep rule, and separate customer-cloud resource costs before long tests or agent jobs wake services.

Cost follows awake service work, not shell existence.

Hosted MVP milestone

The first hosted MVP is a workspace handoff, not production hosting.

The milestone is the hosted path a first customer or reviewer can follow: run spin up, land in a shell immediately, let runtime services wake in the background, share a signed dev.spinnery.dev URL, and explain that runtime billing applies only while the runtime is awake.

hosted MVPcurrent slice
  1. spin upCLI entry point

    Open the prepared hosted workspace.

    After GitHub, repo setup, project services, and CLI login are ready, spin up selects the hosted project and branch workspace instead of asking users to rebuild local setup.

  2. instant hosted shellshell first

    Attach before service boot blocks work.

    The shell attaches first with Git, tmux, Claude, Codex, repo checkout, and logs ready while service processes report readiness separately.

  3. background runtimewake as needed

    Service capacity starts behind the shell.

    Web, /api, workers, resources, or checks wake in the background when runtime work needs CPU, memory, ports, or declared service dependencies.

  4. signed dev.spinnery.dev URLspin share

    Share the app surface through the gateway.

    The reviewer opens the signed dev.spinnery.dev URL created by spin share for the service/workspace/org host, and the signed session gates web, /api, assets, and realtime traffic.

  5. runtime billing while awakemeter boundary

    Bill runtime use, not shell existence.

    Opening a signed dev URL can wake the runtime; idle sleep stops the runtime meter while the hosted shell, repo state, and workspace metadata remain available.

Current hosted MVPfirst milestone

The hosted path is the first milestone: spin up, instant shell attach, background runtime wake, signed dev.spinnery.dev handoff, and awake-only runtime billing.

Local scaffoldingcontract examples

Local spinnery.yml examples and setup PRs describe the contract that the hosted workspace will run; they are not the hosted shell, gateway, runtime meter, or billing system by themselves.

Deferred platform controlsdo not overclaim

Keep expanded fleet controls, automated caps, invoices, compliance programs, and production operations language clearly planned until those controls are live; this page describes the current hosted workspace path.

Workspace access contract

Start from the CLI, share the signed dev URL, and keep runtime billing separate.

Getting started should leave one clear handoff: spin upopens the workspace shell, the dev URL follows the service/workspace/org shape, spin share creates the reviewer link, and a signed session gates app traffic before the runtime wakes.

spin upworkspace handoff

$spin up signed-links

shell: ready with Git, tmux, Claude, Codex

runtime: asleep until web, /api, workers, or checks need it

$spin share signed-links --service web --service api --expires-in 2h

handoff: signed dev.spinnery.dev URL -> browser session

dev: https://web--signed-links--acme.dev.spinnery.dev

session: signed service/workspace/org, expires 2h

billing: shell baseline included; runtime meter awake-only

  • CLI front doorspin up

    The terminal chooses the workspace.

    Developers and agents enter through the CLI, select the organization, project, repo workspace, and branch, then attach to the shared shell without passing around raw VM hostnames.

    One command is the handoff handle for Git, tmux, Claude, Codex, logs, and readiness.
  • Dev URL shape<service>--<workspace>--<org>.dev.spinnery.dev

    Dev hosts name the product surface.

    Spinnery calls this a signed dev.spinnery.dev URL in product handoffs; the dev.spinnery.dev host keeps the service, workspace, and organization visible for review while DNS stays behind one Spinnery wildcard.

    Use a signed dev link for the actual browser handoff, not a raw runtime address.
  • Signed dev linkspin share

    The link creates a scoped browser session.

    Run spin share with the allowed services and expiration. Signed links cover the app surface for web, same-origin /api, assets, and realtime routes while SSH, logs, secrets, private consoles, and runtime admin remain closed.

    The host shape is not the permission; the signed session is.
  • Billing splitshell included / runtime awake-only

    Shell access and runtime usage are separate.

    The shell baseline stays ready for repo work. Web, API, workers, tests, and resources wake the runtime meter only when service work needs them.

    Auto-sleep stops runtime billing without deleting the workspace.

Sign in

Create the Spinnery account and choose the organization.

Auth0 login

Start in the Spinnery web app. Auth0 handles signup and login, then Spinnery applies organization membership and product roles before any workspace can open.

Use the same organization later in the CLI with spin login.

Connect GitHub

Install the GitHub App on selected repositories.

GitHub App selected repos

Install the Spinnery GitHub App for the GitHub organization and choose only the repositories Spinnery should inspect, prepare, and open branch workspaces for.

Repository selection is the setup boundary; broad personal access tokens are not required.

Prepare repos

Prepare each repo with a focused spinnery.yml PR.

per-repo spinnery.yml

Each selected repo gets its own spinnery.yml contract for Compose previews, inputs, outputs, environment mappings, setup commands, and tests.

Repo owners review and merge the contract before branch workspaces depend on it.

Create project

Create the project, services, and bindings.

Project -> services -> bindings

Add prepared repos as project services, then bind product routes and resources: Web owns the browser surface, Backend owns /api, and declared resources attach to consuming services.

Project bindings turn reviewed repo contracts into a product-shaped workspace.

Install CLI

Install the CLI where you run Git.

npm install -g spinnery

The CLI is the normal workspace handoff for developers and agents. Install it in the terminal environment that should attach to Spinnery workspaces.

Verify the install with spinnery --version before first login.

spin login

Sign the CLI into the Spinnery organization.

spin login

spin login opens the Auth0 product sign-in flow and returns a local CLI session tied to the same Spinnery organization, role, and GitHub App installation scope.

The CLI should show the expected organization before opening a workspace.

spin up

Open the first branch workspace.

spin up

Run spin up, choose the prepared project and branch, then land in the hosted shell with Git, tmux, Claude, Codex, logs, and the branch checkout ready.

Shell first; runtime readiness is reported separately.

Runtime wakes

Let service runtime work wake in the background.

background runtime

Web, /api, workers, resources, and checks wake only when service work needs CPU, memory, ports, or declared dependencies.

Readiness should say ready, waking, or blocked before a reviewer gets the link.

Sleep and billing

Confirm the runtime sleep and billing boundary.

spinnery sleep / idle sleep

Signed dev traffic, tests, workers, and service commands can wake the selected runtime size; idle sleep or spinnery sleep stops runtime billing while shell and workspace metadata remain available.

Cost follows awake runtime work, not workspace existence.

First workspace trust receipt

Before the first reviewer opens the link, verify the trust receipt.

The first workspace handoff should make access, isolation, and cost plain in product language before anyone opens the app dev URL.

Dev URL model*.dev.spinnery.dev

The dev URL follows the product host shape <service>--<workspace>--<org>.dev.spinnery.dev through one Spinnery wildcard, not raw VM hosts or per-branch DNS.

Use the signed dev link for the browser handoff.
Signed dev sessionservice + workspace + org + expiration

Reviewer access starts as one signed browser session for one service, workspace, organization, and expiration before app traffic reaches the runtime.

Web, /api, assets, and realtime paths share the session.
Isolationone-org-per-VM

Shell and runtime VMs stay inside one customer organization, so cross-customer code, dev traffic, and logs never co-tenant.

Branch workspaces can share only their owning org boundary.
Runtime billingruntime-awake only

Opening the signed link may wake web, /api, workers, or checks on the runtime meter; idle sleep stops billing while the shell baseline remains ready.

Cost follows awake service work, not the existence of a workspace.

Resource readiness

Confirm resource readiness from the CLI before sharing handoffs.

After spin up, run spinnery workspace resourcesto check declared resources by reference, readiness, and consumer service. The handoff should explain what is ready, waking, or blocked without exposing credentials or provider internals.

workspace resourcessafe readiness

$spinnery workspace resources signed-links

resource.postgres.url ready for api

resource.cache.url waking for api

resource.storage.bucket blocked for web: disabled by workspace policy

masked: postgres://***@resource.postgres/app

  1. Readyresource.postgres.url

    The value can be injected when the service wakes.

    Ready means the workspace mode resolved and the consuming service can receive the masked reference during runtime wake.

  2. Wakingresource.cache.url

    The runtime or backing service is still catching up.

    Waking is a reason to wait before handing a reviewer the link, then run the command again after provisioning or service wake completes.

  3. Blockedresource.storage.bucket

    A policy or setup decision needs an owner.

    Blocked output should name the resource and consumer service without printing credentials, provider IDs, internal hosts, or private console URLs.

Ready-to-share packet

Paste the signed link with scope, readiness, and billing state.

Once the first workspace is green, the useful artifact is a short packet a reviewer can trust. It should name the signed dev URL, what the browser session covers, what is ready, and whether opening the link may wake the metered runtime.

share packetPR comment

Workspace: signed-links / acme

Command: spin share signed-links --service web --service api --expires-in 2h

Dev link: https://web--signed-links--acme.dev.spinnery.dev

Session: signed web, /api, assets, realtime; expires 2h

Readiness: web ready; api ready; postgres ready; cache waking

Billing: dev URL may wake runtime; shell baseline included

Private: SSH, logs, secrets, root, resource consoles

  1. Linkspin share

    Share the signed URL, not infrastructure.

    Use spin share to generate the dev.spinnery.dev signed link so reviewers open the app surface without raw hosts, ports, VM names, or cloud resource IDs.

  2. Scopeweb + /api + assets + realtime

    Name what the browser session covers.

    Call out the selected service and route families so reviewers know API calls, assets, and realtime traffic use the same signed workspace session.

  3. Readinessready / waking / blocked

    Attach current runtime and resource state.

    A green handoff should say which services, checks, and resources are ready, which are still waking, and what is blocked before the link is opened.

  4. Metershell included / runtime awake-only

    Explain what may start billing.

    Opening the signed link can wake web, API, workers, or checks on the runtime meter; the shell baseline stays included and idle sleep stops service billing.

First workspace handoff

Hand back a shell, a signed dev URL, and readiness state.

A launch-ready first workspace should be easy to paste into a pull request or support thread: the workspace shell, the signed dev URL, what is ready, and which operational surfaces remain private.

handoff receiptdev URL contract
Host shape<service>--<workspace>--<org>.dev.spinnery.dev
  • Shellspin up signed-links

    Humans and agents land in the same branch shell.

    The handoff names the workspace, Git branch, tmux session, logs, and shell status before service runtime work starts blocking review.

  • Dev URLweb--signed-links--acme.dev.spinnery.dev

    Reviewers get the signed app surface.

    The public host follows <service>--<workspace>--<org>.dev.spinnery.dev, with one browser session for web, /api, assets, and realtime routes.

  • Readinessweb ready; api waking

    Runtime state travels with the link.

    The first workspace handoff should say which services, resources, and checks are ready, still waking, or blocked before a reviewer opens the app.

  • Boundaryssh / logs / secrets blocked

    Dev access does not become admin access.

    Signed dev URLs stay app-scoped. SSH, raw logs, secrets, root policy, private consoles, and runtime admin remain behind authenticated workspace access.

Setup contract

Keep repo setup and project binding separate.

The per-repo PR points to the service's Compose model and declares how Spinnery publishes and connects it. The project binding says where that service belongs in the product workspace, such as routing web to Web and /api to Backend.

spinnery.ymlper repo PR
version: 1

compose:
  previews:
    - service: api
      port: 8080

default_preview: api

outputs:
  api_url:
    from: service.url

Project bindings

Routesweb + /api
ServicesWeb + Backend

First-run checks

The setup is ready when these are true.

A first workspace should be runnable from product concepts and reviewed repo contracts, without passing around raw VM hostnames, cloud credentials, or shared secrets.

  • Auth0 signup/login succeeds and the user sees the expected Spinnery organization and role.
  • GitHub App access is limited to the selected repositories Spinnery should prepare.
  • Each selected repo has one reviewable per-repo spinnery.yml setup PR.
  • Project services are created from those prepared repos.
  • Bindings connect web, /api, and workspace resources to named services.
  • npm install -g spinnery succeeds and spinnery --version returns a CLI version.
  • spin login shows the expected Auth0-backed organization context.
  • spin up opens the shell and reports service, resource, and background runtime readiness.
  • spin share creates a signed dev link on dev.spinnery.dev for web, /api, assets, and realtime traffic.
  • Idle sleep or spinnery sleep stops runtime billing while the shell and workspace metadata remain available.