npm install -g @substrio/cli
Run it once without installing with npx @substrio/cli <command>.
Sign in and profiles
Save a key once and every later command reuses it:
substrio login --url https://acme.example.com --key - --tenant acme < app.key
--key - reads the key from stdin, never from argv or shell history. Without --url, login saves a profile for the hosted platform, https://mcp.substrio.com. The profile is saved to ~/.substrio/config.toml (owner-only, mode 0600); set SUBSTRIO_CONFIG_DIR to move it. --profile NAME saves under a name other than the default; the default changes only with --default, or when there is none yet. login --list shows saved profiles, login --remove NAME deletes one. login --offline ... --tenant SLUG saves a profile with no round trip to the server, marked unchecked until a later login without --offline confirms it.
An agent given a one-time connect code (substrio_ae_..., made by POST /v1/_accounts/{id}/agent/enrollments; the console connects agents over MCP with OAuth and makes no codes) redeems it with:
substrio connect - < code.txt # or: substrio connect substrio_ae_...
The command sends one POST /v1/_agent/exchange request to https://mcp.substrio.com unless --url specifies another server. The session acts as the code's owner and is saved as profile agent in the owner-only file. Use --profile NAME for another name or --default to make it the default. The command prints the MCP setup. It does not print the code or secret unless --show is used; then stdout contains only the secret for $(...) in an MCP client setup command. See agent-sessions.md. A spent or expired code exits with AGENT_CODE_INVALID.
Check what is in effect, and where each value came from, with:
substrio whoami
Each run resolves the server URL, key, and app in this order, highest priority first:
- Environment variables:
SUBSTRIO_URL,SUBSTRIO_TENANT(also set by the--tenantflag), andSUBSTRIO_MASTER_KEY. substrio.tomlin the current directory (the project filesubstrio initwrites).- The saved profile named by
SUBSTRIO_PROFILE,--profile, orprofileinsubstrio.toml. - The profiles file's
default_profile.
Use a saved profile to keep credentials out of project files and shell history.
Global flags
Global flags are parsed wherever they appear on the command line and removed before the command receives its arguments:
| Flag | Effect |
|---|---|
--help, -h |
Print the command's usage and exit 0. Nothing runs. |
--json |
Print results as JSON on stdout, and errors as JSON on stderr. |
--yes, -y |
Confirm a destructive command without asking. |
--profile NAME |
Use the saved profile NAME for this run. |
--tenant SLUG |
Talk to the app SLUG for this run. |
--version, -v |
Print the CLI version. |
-- |
Everything after it belongs to the command, not to global flag parsing. |
A destructive command returns exit code 9 when it has no --yes and cannot prompt on a terminal. This includes runs under --json.
Calling any operation
Call any operation the server exposes, including one without a dedicated subcommand, with:
substrio op NAME key=value key2=value2
For example:
substrio op collection.create name=orders
substrio op data.insert collection=orders data='{"total": 42}'
key=valuesets one field; dotted keys nest (data.total=42setsdata: {total: 42}). A value that parses as JSON (a number,true,false,null, a quoted string, an array or object) is sent as that type; anything else is sent as a string.--data '{...}'sends a whole JSON body instead of (or in addition to)key=valuefields.--file PATHreads the body from a file (-for stdin).- Route path parameters (
{id}in the operation's route) come from positional arguments, in order, before anykey=value.
substrio op prints the operation's JSON result. substrio call is the same command under another name.
JSON output
Pass --json on any command to get machine-readable output instead of the human-readable default:
substrio op collection.list --json
Results are JSON on stdout. Errors are JSON objects on stderr with error, code, and detail when supplied by the server. A command that streams records, such as substrio data import or substrio logs --follow, writes one JSON object per line (NDJSON) under --json.
Exit codes
| Code | Meaning |
|---|---|
0 |
Success. |
1 |
Failure (anything not listed below). |
2 |
Usage: bad arguments or input. |
3 |
Auth: no credentials, or refused. |
4 |
Not found. |
5 |
Conflict: it exists already, or changed meanwhile. |
6 |
Server error (5xx). |
7 |
Network: the server could not be reached. |
8 |
Partial: a bulk operation stored some documents and refused others. |
9 |
Confirm: a destructive command needs --yes (no terminal to ask on, or --json). |
Script against these codes instead of parsing error text: substrio op data.get collection=orders id=1 --json || exit $? exits 4 when the order does not exist, 3 when the key is refused.
Command reference
Commands listed by substrio --help are grouped by section. Run substrio COMMAND --help for help with a command.
Start
| Command | What it does | Needs |
|---|---|---|
substrio init [--url URL] [--tenant SLUG] [--yes] | Create a project (the key is stored in a profile, not substrio.toml) | Nothing |
substrio signup --email E [--name AGENT] [--url URL] [--wait SECONDS] | Sign in as with "substrio login --email". A new address gets an account and a free plan; the agent gets a refreshable session, not a permanent key | Nothing |
substrio login --email E [--name AGENT] [--url URL] [--wait SECONDS] | Sign your owner in. The page opens in their browser, and they check that it shows the match code printed here. They finish there, or give you the code from their email. The browser has 100 s by default, then the CLI exits 75 | Nothing |
substrio login --wait [--wait SECONDS] | Give the browser more time to finish the pending sign-in, on the same port | |
substrio login --code CODE|- | Finish the pending sign-in with the code from your owner's email. It works for you even after their browser used it | |
substrio login [--url URL] --key - [--tenant SLUG] [--profile NAME] [--default] | Save a profile; the key from stdin, the tenant found from it, the server https://mcp.substrio.com unless --url names another. Without --profile it is the default; with --profile the default changes only with --default (or when there is none) | |
substrio login --offline --url URL --tenant SLUG --key - [--profile NAME] [--default] | Saves the profile with no round trip (the server need not be up yet); --tenant is required, the profile is marked unchecked until a login without --offline saves it again | |
substrio login --list | --remove NAME | List or remove saved profiles | |
substrio connect CODE|- [--url URL] [--profile NAME] [--default] [--show] | Redeem the one-time connect code (substrio_ae_...) from the console Agents page. The session acting for the owner is saved in profile NAME (default agent) with owner-only access, and the MCP setup is printed. With --show, stdout contains only the secret for $(...) in an MCP client setup; otherwise the secret is not printed | Nothing |
substrio whoami | Tenant, server and profile in use, and where each came from | A project or profile |
substrio status | Server health and config | A server URL |
substrio open | Open the server in a browser | Depends on the arguments |
substrio open --dashboard | Open your dashboard in this machine's browser, signed in once (a one-time console link) | |
substrio skills list | The server's agent skills: name, title, description | A server URL |
substrio skills show NAME | One skill's markdown | |
substrio skills install [NAME...] [--for claude|cursor|codex|agents-md|all] [--dir DIR] | Install skills where each client reads them (default: all skills, --for all, --dir the project root) | |
substrio key rotate [--overlap 1h] [--expires-in 90d] [--print] | Replace the tenant key; saved to the profile | Depends on the arguments |
substrio key list | The tenant keys: ids, created, expires, state | |
substrio key revoke ID | End the previous key overlap now | |
substrio key export --env FILE [--var NAME] [--force] | Write NAME=KEY (default SUBSTRIO_KEY) of the key in use to FILE, owner-only, never printed; for an MCP client config |
Apps
| Command | What it does | Needs |
|---|---|---|
substrio tenants list | show SLUG | Every tenant; one tenant (platform-admin key) | A server URL and a key |
substrio tenants create SLUG [--save-profile N] [--print] | Create a tenant; its key is saved to profile N | |
substrio tenants delete SLUG --yes | Delete a tenant and all its data | |
substrio tenants WORD ... [ARG ...] [key=value ...] | Run a app.*, apps.*, tenant.* operation by name (app.a.b: tenants a b) | |
substrio pull (--for PROFILE | --seal-to PUBKEY) [--out FILE] | Stream the app's bundle, sealed to one server's key | A server URL and a key |
substrio push-bundle FILE --to PROFILE [--slug S] [--replace] | Stream a bundle into PROFILE's server as an app | Nothing |
substrio move --to PROFILE [--slug S] [--replace] [--save-profile NAME] | Pipe the app, sealed, into PROFILE's server | A server URL and a key |
substrio move --live --to PROFILE | Move the app to PROFILE's server while it takes writes: copy, follow, fence, drain, flip (both profiles hold their server's master key; a failed drain rolls back) | |
substrio move --failover --to PROFILE | Move writes to PROFILE's server, a replica of the app, when this profile's server no longer responds (a responsive server is moved live instead) |
Ship
| Command | What it does | Needs |
|---|---|---|
substrio push [-m MSG] [--branch NAME] [--no-build] [--dry-run] [--sandbox NAME] | Build, upload a new version (functions, rules, collections, site), run it in dev; --branch commits it on that branch of the history instead of main | Depends on the arguments |
substrio dev [--no-build] [--no-logs] | The app on your dev sandbox with hot reload, through the API with your profile. Each save runs there as a new version, and your live app does not change. The sandbox's logs stream. substrio promote makes it live | Depends on the arguments |
substrio dev --attach URL | The same on a running server, with the profile's key or SUBSTRIO_MASTER_KEY | |
substrio promote [N] [--no-backup] | Make N live (default: what dev runs); back up the data first unless --no-backup is set | A server URL and a key |
substrio rollback [--no-backup] | Restore the previous live version | A server URL and a key |
substrio restore [BACKUP_ID] [--yes] [--wait S] | Put the data back from a promote's backup | A server URL and a key |
substrio versions | List versions: which is live, what each sandbox runs, each backup | A server URL and a key |
substrio versions WORD ... [ARG ...] [key=value ...] | Run a version.* operation by name (version.a.b: versions a b) | |
substrio diff [A] [B] | What changed (default: live to dev) | A server URL and a key |
substrio deploy [NAME...] [--dry-run] [--prune] | Make the declared collections (collections/NAME.json: schema, rules, indexes, expire, aggregates), deploy functions (routes, vars from substrio.toml) and set the rules. Reports a server declaration the files no longer name (drift); --prune drops it. With one or more NAME, only those functions are built and replaced: nothing else is read or sent (--prune, --functions and --assets are refused with names) | A server URL and a key |
substrio site deploy DIR | Publish a website as a release (uploads only changes) | A server URL and a key |
substrio site releases | activate RELEASE_ID | List releases; serve an earlier one | |
substrio site WORD ... [ARG ...] [key=value ...] | Run a site.* operation by name (site.a.b: site a b) | |
substrio env pull | push | Sync secrets with a .env file | A server URL and a key |
substrio env WORD ... [ARG ...] [key=value ...] | Run a env.* operation by name (env.a.b: env a b) | |
substrio files ls [PATH] | upload LOCAL [REMOTE] | rm PATH | Static files | A server URL and a key |
substrio files sync LOCAL_DIR PREFIX [--concurrency N] | Upload files missing from the store or stored at a different size, N at a time | |
substrio files WORD ... [ARG ...] [key=value ...] | Run a file.* operation by name (file.a.b: files a b) | |
substrio logs [--limit N] [--since D|T] [--until D|T] [--function NAME] [--request-id ID] [--level LEVEL] | Cloud function logs; D is a duration ago (30s, 5m, 1h) or T a Unix-second/ISO timestamp | A server URL and a key |
substrio logs --follow (--for D | --lines N | --until-match TEXT) | Tails them live over a WebSocket until the given stop is met (ends exit 0); required with no terminal or under --json; on a terminal with none given, Ctrl+C stops it |
History
| Command | What it does | Needs |
|---|---|---|
substrio branch | The app's branches: the version each points at, when it last moved, whether it is protected (branch.list) | A server URL and a key |
substrio branch create NAME [--from REF] | Make a branch at REF (a branch name or a version id; default: the main branch's head) | |
substrio branch delete NAME [--yes] | Free a branch's name; its versions and its log are kept (substrio ref restore branch NAME puts it back) | |
substrio branch protect NAME [--off] [--checks A,B] | A commit or merge onto NAME needs those checks green; --off unprotects it | |
substrio branch WORD ... [ARG ...] [key=value ...] | Run a branch.* operation by name (branch.a.b: branch a b) | |
substrio log [PATH] [--branch NAME] [--limit N] | The commits of a branch, newest first; with PATH, only the commits that changed that one unit (version.log). Function logs are substrio logs | A server URL and a key |
substrio tag | The app's tags: the version each marks (tag.list) | A server URL and a key |
substrio tag NAME [VERSION] [--branch NAME] | Mark a version with a name that never moves again (default: the head of main, or of --branch) | |
substrio tag WORD ... [ARG ...] [key=value ...] | Run a tag.* operation by name (tag.a.b: tag a b) | |
substrio merge FROM [--into NAME] | Work out the merge of FROM into a branch (default: main) and keep it as that branch's draft; publishes nothing (merge.plan) | A server URL and a key |
substrio merge status [--into NAME] | The merge in hand: both sides, every unit it touched and what is still conflicted (merge.get) | |
substrio merge resolve PATH (--file F | --text T | -) [--into NAME] | Settle one conflicted unit with these bytes (merge.resolve) | |
substrio merge commit [-m MSG] [--into NAME] [--checks-green] | Publish the merge as one commit on the branch (merge.commit) | |
substrio merge abort [--into NAME] [--yes] | Discard the merge draft without moving the branch (merge.abort) | |
substrio merge WORD ... [ARG ...] [key=value ...] | Run a merge.* operation by name (merge.a.b: merge a b) | |
substrio gc [--yes] | Erase history objects no longer reachable from a branch, tag, environment, ref log, or merge (version.gc) | A server URL and a key |
substrio gc --dry-run | --status | What a collection would take, erasing nothing; or where the last one got to (version.gc.status) |
Any operation
| Command | What it does | Needs |
|---|---|---|
substrio op list [FILTER] | Every operation of the server: name, route, summary | A server URL and a key |
substrio op NAME --help | Its routes and input schema (read from the server) | |
substrio op NAME [key=value ...] [--data '{...}' | --file F] | Call it; prints JSON | |
substrio invoke NAME [key=value ...] [--data '{...}'] | Call a cloud function; --data or key=value is its JSON event (none: {}) (function.invoke; substrio op function.invoke --help for its input) | A server URL and a key |
substrio undo TOKEN | Undo a change by its undo_token (null means nothing to undo); prints the token that redoes it (undo; substrio op undo --help for its input) | A server URL and a key |
Registry groups
| Command | What it does | Needs |
|---|---|---|
substrio data list [ARG ...] [key=value ...] | data.list | Depends on the arguments |
substrio data get [ARG ...] [key=value ...] | data.get | |
substrio data insert [ARG ...] [key=value ...] | data.insert: --data '{...}' (or --file F, or key=value) is the document itself, no wrapper | |
substrio data update [ARG ...] [key=value ...] | data.update | |
substrio data delete [ARG ...] [key=value ...] | data.delete | |
substrio data rm [ARG ...] [key=value ...] | data.delete | |
substrio data query [ARG ...] [key=value ...] | data.query | |
substrio data count [ARG ...] [key=value ...] | query.count: where.FIELD=VALUE (or --data '{"where":{...}}') filters it as in data query | |
substrio data aggregate [ARG ...] [key=value ...] | query.aggregate | |
substrio data import [ARG ...] [key=value ...] | data.import: --file F (NDJSON .ndjson/.jsonl, a JSON array, {"documents":[...]} or --format csv; - is stdin), streamed and sent in batches (--batch-bytes, --batch-docs, --concurrency); --checkpoint and --resume continue an import that stopped; each rejected document is reported | |
substrio data export [ARG ...] [key=value ...] | data.export | |
substrio data WORD ... [ARG ...] [key=value ...] | Run a data.*, query.* operation by name (data.a.b: data a b) | |
substrio collections list [ARG ...] [key=value ...] | collection.list | Depends on the arguments |
substrio collections create NAME [ARG ...] [key=value ...] | collection.create | |
substrio collections delete [ARG ...] [key=value ...] | collection.delete | |
substrio collections rm [ARG ...] [key=value ...] | collection.delete | |
substrio collections stats [ARG ...] [key=value ...] | collection.stats | |
substrio collections schema [ARG ...] [key=value ...] | schema.get | |
substrio collections WORD ... [ARG ...] [key=value ...] | Run a collection.*, schema.* operation by name (collection.a.b: collections a b) | |
substrio functions list [ARG ...] [key=value ...] | function.list | Depends on the arguments |
substrio functions get [ARG ...] [key=value ...] | function.get | |
substrio functions invoke [ARG ...] [key=value ...] | function.invoke | |
substrio functions delete [ARG ...] [key=value ...] | function.delete | |
substrio functions rm [ARG ...] [key=value ...] | function.delete | |
substrio functions toggle [ARG ...] [key=value ...] | function.toggle | |
substrio functions source [ARG ...] [key=value ...] | function.source.read | |
substrio functions logs [ARG ...] [key=value ...] | function.logs | |
substrio functions WORD ... [ARG ...] [key=value ...] | Run a function.* operation by name (function.a.b: functions a b) | |
substrio secrets list [ARG ...] [key=value ...] | secret.list | Depends on the arguments |
substrio secrets set [ARG ...] [key=value ...] | secrets set KEY: the value from stdin (or -), --from-file PATH, or --from-env NAME; never a plain argument | |
substrio secrets delete KEY [ARG ...] [key=value ...] | secret.delete | |
substrio secrets rm KEY [ARG ...] [key=value ...] | secret.delete | |
substrio secrets WORD ... [ARG ...] [key=value ...] | Run a secret.* operation by name (secret.a.b: secrets a b) | |
substrio cron list [ARG ...] [key=value ...] | schedule.list | Depends on the arguments |
substrio cron create [ARG ...] [key=value ...] | schedule.create | |
substrio cron update [ARG ...] [key=value ...] | schedule.update | |
substrio cron enable [ARG ...] [key=value ...] | schedule.update | |
substrio cron disable [ARG ...] [key=value ...] | schedule.update | |
substrio cron delete [ARG ...] [key=value ...] | schedule.delete | |
substrio cron rm [ARG ...] [key=value ...] | schedule.delete | |
substrio cron WORD ... [ARG ...] [key=value ...] | Run a schedule.* operation by name (schedule.a.b: cron a b) | |
substrio triggers list [ARG ...] [key=value ...] | trigger.list | Depends on the arguments |
substrio triggers create [ARG ...] [key=value ...] | trigger.create | |
substrio triggers update [ARG ...] [key=value ...] | trigger.update | |
substrio triggers enable [ARG ...] [key=value ...] | trigger.update | |
substrio triggers disable [ARG ...] [key=value ...] | trigger.update | |
substrio triggers delete [ARG ...] [key=value ...] | trigger.delete | |
substrio triggers rm [ARG ...] [key=value ...] | trigger.delete | |
substrio triggers WORD ... [ARG ...] [key=value ...] | Run a trigger.* operation by name (trigger.a.b: triggers a b) | |
substrio domains list [ARG ...] [key=value ...] | tenant.domain.list | Depends on the arguments |
substrio domains add DOMAIN [ARG ...] [key=value ...] | tenant.domain.attach | |
substrio domains remove [ARG ...] [key=value ...] | tenant.domain.detach | |
substrio domains rm [ARG ...] [key=value ...] | tenant.domain.detach | |
substrio rules get [ARG ...] [key=value ...] | security.rules.get | Depends on the arguments |
substrio rules set [ARG ...] [key=value ...] | security.rules.set | |
substrio rules delete [ARG ...] [key=value ...] | security.rules.delete | |
substrio rules WORD ... [ARG ...] [key=value ...] | Run a security.* operation by name (security.a.b: rules a b) | |
substrio permissions get [ARG ...] [key=value ...] | permissions.get | Depends on the arguments |
substrio permissions set [ARG ...] [key=value ...] | permissions.set | |
substrio permissions grant [ARG ...] [key=value ...] | permissions grant USER_ID NAME ...: grants that user those declared permissions (user.permissions.set); effective at their next sign in | |
substrio permissions revoke [ARG ...] [key=value ...] | permissions revoke USER_ID NAME ...: revokes those declared permissions (user.permissions.set); ends the user's sessions now if any was actually held | |
substrio permissions show [ARG ...] [key=value ...] | permissions show USER_ID: that user's granted and effective declared permission names | |
substrio permissions WORD ... [ARG ...] [key=value ...] | Run a permissions.* operation by name (permissions.a.b: permissions a b) | |
substrio memberships grant [ARG ...] [key=value ...] | memberships grant USER_ID NAME ... --in COLLECTION:ID: grants that user those declared permissions in the named organization (user.memberships.set); the gate reads it from the next request | Depends on the arguments |
substrio memberships revoke [ARG ...] [key=value ...] | memberships revoke USER_ID NAME ... --in COLLECTION:ID: revokes those declared permissions in the named organization (user.memberships.set); holds from the next request, no session is ended | |
substrio memberships show [ARG ...] [key=value ...] | memberships show USER_ID [--in COLLECTION:ID]: that organization's held names, or every organization held when --in is omitted | |
substrio sandbox list [ARG ...] [key=value ...] | sandbox.list | Depends on the arguments |
substrio sandbox create NAME [ARG ...] [key=value ...] | sandbox.create | |
substrio sandbox reset [ARG ...] [key=value ...] | sandbox.reset | |
substrio sandbox delete [ARG ...] [key=value ...] | sandbox.delete | |
substrio sandbox rm [ARG ...] [key=value ...] | sandbox.delete | |
substrio sandbox outbox [ARG ...] [key=value ...] | sandbox.outbox | |
substrio sandbox allow [ARG ...] [key=value ...] | sandbox.allow.list | |
substrio sandbox allow add [ARG ...] [key=value ...] | sandbox.allow.add | |
substrio sandbox allow remove [ARG ...] [key=value ...] | sandbox.allow.remove | |
substrio sandbox WORD ... [ARG ...] [key=value ...] | Run a sandbox.* operation by name (sandbox.a.b: sandbox a b) | |
substrio webhooks list [ARG ...] [key=value ...] | webhook.list | Depends on the arguments |
substrio webhooks get [ARG ...] [key=value ...] | webhook.get | |
substrio webhooks show [ARG ...] [key=value ...] | webhook.get | |
substrio webhooks create [ARG ...] [key=value ...] | webhook.create | |
substrio webhooks update [ARG ...] [key=value ...] | webhook.update | |
substrio webhooks delete [ARG ...] [key=value ...] | webhook.delete | |
substrio webhooks rm [ARG ...] [key=value ...] | webhook.delete | |
substrio webhooks logs [ARG ...] [key=value ...] | webhook.logs | |
substrio webhooks WORD ... [ARG ...] [key=value ...] | Run a webhook.* operation by name (webhook.a.b: webhooks a b) | |
substrio views list [ARG ...] [key=value ...] | view.list | Depends on the arguments |
substrio views data [ARG ...] [key=value ...] | view.get | |
substrio views get [ARG ...] [key=value ...] | view.get | |
substrio views create [ARG ...] [key=value ...] | view.create | |
substrio views update [ARG ...] [key=value ...] | view.update | |
substrio views delete [ARG ...] [key=value ...] | view.delete | |
substrio views rm [ARG ...] [key=value ...] | view.delete | |
substrio views refresh [ARG ...] [key=value ...] | view.refresh | |
substrio views WORD ... [ARG ...] [key=value ...] | Run a view.* operation by name (view.a.b: views a b) | |
substrio backups list [ARG ...] [key=value ...] | backup.list | Depends on the arguments |
substrio backups get [ARG ...] [key=value ...] | backup.get | |
substrio backups show [ARG ...] [key=value ...] | backup.get | |
substrio backups create [ARG ...] [key=value ...] | backup.create | |
substrio backups restore [ARG ...] [key=value ...] | backup.restore | |
substrio backups delete [ARG ...] [key=value ...] | backup.delete | |
substrio backups rm [ARG ...] [key=value ...] | backup.delete | |
substrio backups WORD ... [ARG ...] [key=value ...] | Run a backup.* operation by name (backup.a.b: backups a b) | |
substrio accounts list [ARG ...] [key=value ...] | account.list | Depends on the arguments |
substrio accounts show [ARG ...] [key=value ...] | account.get | |
substrio accounts get [ARG ...] [key=value ...] | account.get | |
substrio accounts members [ARG ...] [key=value ...] | account.member.list | |
substrio accounts keys [ARG ...] [key=value ...] | account.key.list | |
substrio accounts apps [ARG ...] [key=value ...] | account.app.list | |
substrio accounts keys list [ARG ...] [key=value ...] | account.key.list | |
substrio accounts keys create [ARG ...] [key=value ...] | account.key.create | |
substrio accounts keys revoke [ARG ...] [key=value ...] | account.key.revoke | |
substrio accounts invite [ARG ...] [key=value ...] | account.invite.create | |
substrio accounts invites [ARG ...] [key=value ...] | account.invite.list | |
substrio accounts revoke [ARG ...] [key=value ...] | account.invite.revoke | |
substrio accounts role [ARG ...] [key=value ...] | account.member.set | |
substrio accounts remove [ARG ...] [key=value ...] | account.member.remove | |
substrio accounts attach-app ACCOUNT_ID [ARG ...] [key=value ...] | account.app.attach | |
substrio accounts WORD ... [ARG ...] [key=value ...] | Run a account.* operation by name (account.a.b: accounts a b) | |
substrio platform settings [ARG ...] [key=value ...] | platform.settings.get | Depends on the arguments |
substrio platform settings get [ARG ...] [key=value ...] | platform.settings.get | |
substrio platform settings set VALUE [ARG ...] [key=value ...] | platform.setting.set | |
substrio platform WORD ... [ARG ...] [key=value ...] | Run a platform.* operation by name (platform.a.b: platform a b) | |
substrio tools list [ARG ...] [key=value ...] | tool.list | Depends on the arguments |
substrio tools remove NAME VERSION [ARG ...] [key=value ...] | tool.remove | |
substrio tools install [ARG ...] [key=value ...] | tools install NAME FILE|-: streams the file once to hash it (sha256) and once as the PUT body (- is stdin, buffered to an owner-only temp file first, removed after) | |
substrio tools WORD ... [ARG ...] [key=value ...] | Run a tool.* operation by name (tool.a.b: tools a b) | |
substrio ledger catalog [ARG ...] [key=value ...] | ledger.catalog.get | Depends on the arguments |
substrio ledger declare [ARG ...] [key=value ...] | ledger.catalog.set | |
substrio ledger post [ARG ...] [key=value ...] | ledger.post | |
substrio ledger balance [ARG ...] [key=value ...] | ledger.balance | |
substrio ledger entries [ARG ...] [key=value ...] | ledger.entries | |
substrio ledger entry ID [ARG ...] [key=value ...] | ledger.entry.get | |
substrio ledger clear ID [ARG ...] [key=value ...] | ledger.entry.clear | |
substrio ledger void ID [ARG ...] [key=value ...] | ledger.entry.void | |
substrio ledger reverse ID [ARG ...] [key=value ...] | ledger.entry.reverse | |
substrio ledger clear-due [ARG ...] [key=value ...] | ledger.clear_due | |
substrio ledger import [ARG ...] [key=value ...] | ledger.import | |
substrio ledger WORD ... [ARG ...] [key=value ...] | Run a ledger.* operation by name (ledger.a.b: ledger a b) | |
substrio agent WORD ... [ARG ...] [key=value ...] | Run a agent.* operation by name (agent.a.b: agent a b) | Depends on the arguments |
substrio ai WORD ... [ARG ...] [key=value ...] | Run a ai.* operation by name (ai.a.b: ai a b) | Depends on the arguments |
substrio audit WORD ... [ARG ...] [key=value ...] | Run a audit.* operation by name (audit.a.b: audit a b) | Depends on the arguments |
substrio auth WORD ... [ARG ...] [key=value ...] | Run a auth.* operation by name (auth.a.b: auth a b) | Depends on the arguments |
substrio batch WORD ... [ARG ...] [key=value ...] | Run a batch.* operation by name (batch.a.b: batch a b) | Depends on the arguments |
substrio cluster WORD ... [ARG ...] [key=value ...] | Run a cluster.* operation by name (cluster.a.b: cluster a b) | Depends on the arguments |
substrio documentation WORD ... [ARG ...] [key=value ...] | Run a documentation.* operation by name (documentation.a.b: documentation a b) | Depends on the arguments |
substrio edge WORD ... [ARG ...] [key=value ...] | Run a edge.* operation by name (edge.a.b: edge a b) | Depends on the arguments |
substrio graph WORD ... [ARG ...] [key=value ...] | Run a graph.* operation by name (graph.a.b: graph a b) | Depends on the arguments |
substrio job WORD ... [ARG ...] [key=value ...] | Run a job.* operation by name (job.a.b: job a b) | Depends on the arguments |
substrio kv WORD ... [ARG ...] [key=value ...] | Run a kv.* operation by name (kv.a.b: kv a b) | Depends on the arguments |
substrio ref WORD ... [ARG ...] [key=value ...] | Run a ref.* operation by name (ref.a.b: ref a b) | Depends on the arguments |
substrio source WORD ... [ARG ...] [key=value ...] | Run a source.* operation by name (source.a.b: source a b) | Depends on the arguments |
substrio live_view WORD ... [ARG ...] [key=value ...] | Run a live_view.* operation by name (live_view.a.b: live_view a b) | Depends on the arguments |
substrio log_alert WORD ... [ARG ...] [key=value ...] | Run a log_alert.* operation by name (log_alert.a.b: log_alert a b) | Depends on the arguments |
substrio log_drain WORD ... [ARG ...] [key=value ...] | Run a log_drain.* operation by name (log_drain.a.b: log_drain a b) | Depends on the arguments |
substrio mcp config [ARG ...] [key=value ...] | a ready MCP client config for this profile's app (--client claude|cursor|generic); the key as an environment variable reference | Depends on the arguments |
substrio mcp WORD ... [ARG ...] [key=value ...] | Run a mcp.* operation by name (mcp.a.b: mcp a b) | |
substrio host WORD ... [ARG ...] [key=value ...] | Run a host.* operation by name (host.a.b: host a b) | Depends on the arguments |
substrio node_label WORD ... [ARG ...] [key=value ...] | Run a node_label.* operation by name (node_label.a.b: node_label a b) | Depends on the arguments |
substrio region WORD ... [ARG ...] [key=value ...] | Run a region.* operation by name (region.a.b: region a b) | Depends on the arguments |
substrio root_domain WORD ... [ARG ...] [key=value ...] | Run a root_domain.* operation by name (root_domain.a.b: root_domain a b) | Depends on the arguments |
substrio billing WORD ... [ARG ...] [key=value ...] | Run a billing.* operation by name (billing.a.b: billing a b) | Depends on the arguments |
substrio credits WORD ... [ARG ...] [key=value ...] | Run a credits.* operation by name (credits.a.b: credits a b) | Depends on the arguments |
substrio featured WORD ... [ARG ...] [key=value ...] | Run a featured.* operation by name (featured.a.b: featured a b) | Depends on the arguments |
substrio package WORD ... [ARG ...] [key=value ...] | Run a package.* operation by name (package.a.b: package a b) | Depends on the arguments |
substrio release WORD ... [ARG ...] [key=value ...] | Run a release.* operation by name (release.a.b: release a b) | Depends on the arguments |
substrio subscriptions WORD ... [ARG ...] [key=value ...] | Run a subscriptions.* operation by name (subscriptions.a.b: subscriptions a b) | Depends on the arguments |
substrio dashboard WORD ... [ARG ...] [key=value ...] | Run a dashboard.* operation by name (dashboard.a.b: dashboard a b) | Depends on the arguments |
substrio jet use [ARG ...] [key=value ...] | jet use JET: the app picked or made, the key written to an owner-only file | Depends on the arguments |
substrio jet WORD ... [ARG ...] [key=value ...] | Run a jet.* operation by name (jet.a.b: jet a b) | |
substrio mesh WORD ... [ARG ...] [key=value ...] | Run a mesh.* operation by name (mesh.a.b: mesh a b) | Depends on the arguments |
substrio meta WORD ... [ARG ...] [key=value ...] | Run a meta.* operation by name (meta.a.b: meta a b) | Depends on the arguments |
substrio namespace WORD ... [ARG ...] [key=value ...] | Run a namespace.* operation by name (namespace.a.b: namespace a b) | Depends on the arguments |
substrio oauth WORD ... [ARG ...] [key=value ...] | Run a oauth.* operation by name (oauth.a.b: oauth a b) | Depends on the arguments |
substrio object WORD ... [ARG ...] [key=value ...] | Run a object.* operation by name (object.a.b: object a b) | Depends on the arguments |
substrio observability WORD ... [ARG ...] [key=value ...] | Run a observability.* operation by name (observability.a.b: observability a b) | Depends on the arguments |
substrio oidc WORD ... [ARG ...] [key=value ...] | Run a oidc.* operation by name (oidc.a.b: oidc a b) | Depends on the arguments |
substrio plans WORD ... [ARG ...] [key=value ...] | Run a plans.* operation by name (plans.a.b: plans a b) | Depends on the arguments |
substrio queue WORD ... [ARG ...] [key=value ...] | Run a queue.* operation by name (queue.a.b: queue a b) | Depends on the arguments |
substrio rag WORD ... [ARG ...] [key=value ...] | Run a rag.* operation by name (rag.a.b: rag a b) | Depends on the arguments |
substrio rate_limit WORD ... [ARG ...] [key=value ...] | Run a rate_limit.* operation by name (rate_limit.a.b: rate_limit a b) | Depends on the arguments |
substrio sql WORD ... [ARG ...] [key=value ...] | Run a sql.* operation by name (sql.a.b: sql a b) | Depends on the arguments |
substrio index WORD ... [ARG ...] [key=value ...] | Run a index.* operation by name (index.a.b: index a b) | Depends on the arguments |
substrio realtime WORD ... [ARG ...] [key=value ...] | Run a realtime.* operation by name (realtime.a.b: realtime a b) | Depends on the arguments |
substrio role WORD ... [ARG ...] [key=value ...] | Run a role.* operation by name (role.a.b: role a b) | Depends on the arguments |
substrio route WORD ... [ARG ...] [key=value ...] | Run a route.* operation by name (route.a.b: route a b) | Depends on the arguments |
substrio search WORD ... [ARG ...] [key=value ...] | Run a search.* operation by name (search.a.b: search a b) | Depends on the arguments |
substrio settings WORD ... [ARG ...] [key=value ...] | Run a settings.* operation by name (settings.a.b: settings a b) | Depends on the arguments |
substrio sync WORD ... [ARG ...] [key=value ...] | Run a sync.* operation by name (sync.a.b: sync a b) | Depends on the arguments |
substrio system WORD ... [ARG ...] [key=value ...] | Run a system.* operation by name (system.a.b: system a b) | Depends on the arguments |
substrio thread WORD ... [ARG ...] [key=value ...] | Run a thread.* operation by name (thread.a.b: thread a b) | Depends on the arguments |
substrio user WORD ... [ARG ...] [key=value ...] | Run a user.* operation by name (user.a.b: user a b) | Depends on the arguments |