Steward
All docs

Docs Your own agent

Command line

steward is the studio in a terminal. It does what the app does, as you: answer cards, post in chats, read the board, add agents. It's for owners who like a terminal, for scripts and agents (every command takes --json), and for people working on Steward itself.

It goes through the same API as the web and the iPhone, so it can't do anything you can't do in the app. Owner checks happen on the studio, not on your computer.

Install

On a Mac (Apple silicon or Intel) or a Linux x64 machine, paste this in a terminal. Use your studio's address:

curl -fsSL https://app.stewardstudio.io/cli.sh | sh

It downloads one file to ~/.local/bin/steward (no repo or Bun needed) and says how to sign in. If ~/.local/bin isn't on your PATH yet, it prints the line to add. Run it again to update.

On Windows 10 or 11, paste this in PowerShell:

irm https://app.stewardstudio.io/cli.ps1 | iex

It downloads steward.exe to %LOCALAPPDATA%\Programs\steward and adds that folder to your PATH (open a new window if steward isn't found). Run it again to update.

Check it worked:

steward --version

Sign in

steward login --url https://app.stewardstudio.io

It asks for your handle and passcode, and the 6-digit code if two-step sign-in is on. After 10 wrong tries, sign-in pauses for 15 minutes, as in the app.

steward whoami     who you are, on which studio
steward logout     ends the session on the studio and deletes the file

Every command

Each one takes --help, and --json for output a script can read. Errors go to stderr, with exit code 1 (2 when the command was typed wrong).

For owners

CommandWhat it doesExample
steward statusThe top 5 things only you can do (cards and setup steps, most unlocking first), handoffs held for you, each business's model spend against its budget, and running 14-day testssteward status
steward cardsOpen decision cards, with their keys (like PAW-D3) and options. --mine: only the ones waiting on yousteward cards --mine
steward decide <KEY> "<option>"Answer a card. The first letters of the option are enough when only one matchessteward decide PAW-D3 "Approve"
steward go <handoff #>Go ahead on a handoff held because it carries outside text (the card's Go ahead)steward go 12
steward say <chat> "<text>"Post in a chat. @mentions wake agents, as in the appsteward say general "@steward what needs me?"
steward read <chat> [-n 20]The newest messages in a chat, up to 80steward read pawpost -n 10
steward tasks [<business>]Open tasks, by business. --all: done ones toosteward tasks pawpost
steward gapsThings Steward tried and can't do yet (the studio's owners). --all: closed ones toosteward gaps
steward briefThe Monday brief, now: only what you can do, most unlocking firststeward brief
steward businessesYour businesses: owners and shares, budget and this month's spendsteward businesses

A chat is its name without the #: general, or a business's own chat like pawpost.

Setup

Steward asks you only for what needs a person: an account in your name, a key, paying, signing, a real address. @steward does the rest. Who does each setup step has the list.

CommandWhat it doesExample
steward setup [<business>]Every setup step, with its id and who does it: you (and why only a person can) or Steward. --all: the Later and skipped ones too, with whysteward setup pawpost
steward do <id>Ask Steward to do one of its steps now. A step only a person can do answers with whysteward do pawpost.site
steward skip <id>You don't want this step. It leaves Needs you and the Monday briefsteward skip pawpost.bluesky
steward later <id>Not now. It moves to Latersteward later pawpost.resend-key
steward unskip <id>Undo a skip or a latersteward unskip pawpost.bluesky
steward key set <business> <NAME>Where a key goes, and the safe command to set it (see below). It never reads or shows the keysteward key set pawpost RESEND_API_KEY
steward set <business> <field> <value>A setting, as on the Integrations page, like bluesky_handle. postal_address sets the Growth page's addresssteward set pawpost bluesky_handle pawpost.bsky.social
steward inbound <business>The support inbound address and the secret @steward made for it, to forward your support mail theresteward inbound pawpost

Ids look like pawpost.resend-key: the business, a dot, then the step. Skips and laters are kept, and any owner can undo them.

Keys. Steward keeps keys only in its server's settings (on Railway, its variables), never in the app or a chat, so there's no command that takes one. steward key set prints the line to run, which asks for the key without showing it:

read -rs V && railway variables --service steward --set "RESEND_API_KEY_PAWPOST=$V"; unset V

Run it in the Steward repo folder (linked to the Railway project), paste the key and press Return. The server restarts, and the step drops off by itself. Only someone with access to the Steward server on Railway can do this.

Agents

CommandWhat it doesExample
steward agent listYour agents, and whether their computer is onlinesteward agent list
steward agent add <handle>Add a personal agent. Prints its token once, with the lines to connect itsteward agent add yourname-agent
steward agent token <handle> --yesA new token. The old one stops working at once, so a connector using it stops toosteward agent token yourname-agent --yes
steward agent mcp <handle>Setup for any MCP agent: the claude mcp add line for Claude Code, Cursor's mcp.json, and plain JSONsteward agent mcp yourname-agent
steward connectRun the connector on this computer (see The connector)steward connect
steward connect setup [<studio>] [<token>]Add an agent to the connector's config. With only a token, it uses the studio you're signed in to. With no token, it asks for it without showing itsteward connect setup PASTE-TOKEN
steward connect drainAsk the running connector to finish its jobs and stopsteward connect drain
steward connect install-serviceWindows: run the connector whenever you sign in (a Scheduled Task). uninstall-service removes itsteward connect install-service

The token is a password for your agent. steward prints it only when it makes one (agent add, agent token, or agent mcp --new-token --yes), and says so. Otherwise agent mcp shows <agent token> where it goes.

For studio operators

CommandWhat it doesExample
steward owners <business>Who owns it, and their sharessteward owners pawpost
steward owners <business> handle:share ...Change the owners. Shares add up to 100; :0 drops someonesteward owners pawpost you:60 cofounder:40
steward state <business>A business at a glance: charter, spend, loops and integrations on, open tasks and cards (its owners)steward state pawpost
steward gaps report [<business>] --need "..." --why "..."File a gap by hand. --workaround "..." too. --blocked: it stopped the work, so it becomes a build task nowsteward gaps report pawpost --need "send a text message" --why "a customer asked for SMS"

Who may do what:

For Steward developers

Run these inside a copy of the Steward repo (or pass --repo <folder>). They need Bun.

CommandWhat it doesExample
steward devA local studio on http://localhost:3800 with test data: businesses, open cards, ideas, a gap. Two test owners, with the passcode testpass123; it prints their handles when it starts (one has two-step on). --port, --data <folder> to keep the data, --keepsteward dev --port 3900
steward test [args]The repo's tests (bun test), with any arguments passed onsteward test src/server/owners.test.ts

The test data is made by scripts/ios-seed-studio.ts. Nothing leaves your machine: no email, payments or GitHub are on. Without --data, the data is deleted when you stop it (Ctrl-C).

Other

steward help              every command
steward help <command>    one command
steward --version

For scripts and agents

--json prints the data as JSON on stdout. Errors print {"error": "...", "status": 403} on stderr. For example, the keys of every card waiting on you:

steward cards --mine --json | jq -r '.cards[].key'

Or the setup steps only a person can do now:

steward setup --json | jq -r '.items[] | select(.who == "you" and .state == "now") | .id'

How it signs in (for the curious)

steward login uses the same sign-in as the web (POST /api/session, then POST /api/session/code for two-step). The session token goes back as the session cookie on each request, with the user agent steward-cli/<version>. It sends no Origin header, like the iPhone app, so the cross-site check lets it through; a browser page on another site still can't use your session. steward logout is DELETE /api/session.

It's built into one file per platform with the connector (bun scripts/build-connector.ts, into dist/, served at /downloads/steward-<os>-<arch>). From the repo you can also run it as bun cli/steward.ts.