On this page

Quick start

How do you go from no Stado state to one completed job? This page is the one happy path: install an exact release, create the minimal local configuration, start the local control plane, submit one job, and read its result. Local mode needs no cloud account, provider CLI, GPU, or Wisent production credential. Everything else — the other enrollment methods, failure guidance, attaching more machines — lives in onboarding, add-your-machine, and jobs.

Install an exact release

install-stado.sh at the repository root installs stado from one exact signed release; it never resolves a mutable release. Set the release identity, run it, and expose its binary directory:

export STADO_API_URL=<your-control-origin>
export STADO_RELEASE_VERSION=<exact-version>
./install-stado.sh
export PATH="$HOME/.stado/bin:$PATH"

The script requires an HTTPS STADO_API_URL, reads the platform from the machine (darwin-arm64 or linux-amd64), fetches the signed release's release.json and release.tar.gz from /api/release/object, checks the manifest's product, version, platform and source revision and the archive's size and SHA-256 against it, and installs the archive's one stado member. The binary lands in $HOME/.stado/bin (override with STADO_BIN_DIR), and the last two lines it prints are the platform and the installed path. stado bootstrap runs this same file on a remote host.

Create the minimal configuration

STADO_CONFIG selects the operator-owned deployment profile; without it, Stado uses ~/.stado/config.json, which the next command creates:

stado config init
stado config validate

config init prints the path to the new file and creates only a schema-versioned local queue profile: local compute, local primary and backup stores, one deployment identity, and a loopback dashboard — no Wisent service routes, cloud locators, or credentials. It never overwrites an existing file. config validate prints config ok (<path>). The keys themselves are documented in configuration.

Start the local control plane

stado serve --standalone --worker --kind local --poll-seconds 15 \
  --control-plane local --control-plane-interval-seconds 15 \
  --api --bind 127.0.0.1 --port 8765

One process runs the scheduler, the worker and the API listener and stays in the foreground. --standalone says this machine belongs to no fleet registry; the poll, the scheduling period and the port are yours to state.

Submit one job

From another terminal using the same config:

stado submit --run-id hello-from-stado "printf 'hello from Stado\n'"

submit puts the job on the queue and prints a Job ID. Use that ID below. --run-id is required: it is your own name for this run, and submitting the same run id with the same request again answers the job already queued instead of adding a second one.

Watch it run

stado status <job-id>

status shows the job's state; it progresses from queued or running to completed. The argument filters by job id (8 hex chars) or batch id substring.

Read the result

stado results <job-id> ./stado-result

results downloads the job's output into the named directory. The command output contains hello from Stado, and the result manifest records the artifact size and SHA-256. A failed job remains inspectable and may still publish logs and partial artifacts.

That is the whole path. To onboard more machines or operate a real fleet, continue with onboarding; to attach your own computer to a fleet someone else runs, read add-your-machine; for the full job contract — constraints, artifacts, secrets, verification — read jobs.

Source: this website