Command reference
nouride help # the same list, from the binary itselfnouride versionTwo kinds of command, and the split matters:
nouride startboots the daemon in this process.- Everything else talks to a running daemon over the control API.
A CLI that booted its own daemon to answer nouride status would report on a process nobody is
using, and nouride chat would talk to a second copy with its own gateway connections — two Telegram
bots polling one token.
A handful of commands need no daemon at all: help, version, setup, doctor, service,
policy, config, stop.
Where it looks
The CLI resolves the install relative to the working directory and reads
data/.control-token for auth. Run it from the install directory. Two environment variables point it
somewhere else entirely:
export NOURIDE_URL=https://nouride.example.comexport NOURIDE_TOKEN=<contents of that box's data/.control-token>Running the daemon
nouride start # run the engine in this processnouride stop # stop this install's daemon — no token needednouride restart --then "<prompt>" # ask the daemon to exit so its supervisor restarts itstop is the one command that reaches the daemon without the control API: it reads the lock file and
sends a signal, which is the path that still works when the HTTP server is what has wedged.
restart requires either --then "<follow-up>" or --no-then. The command ends the conversation it
was run from, so the follow-up turn is created before the service goes down — a restart that goes
wrong is then still met by whoever asked for it. --no-then is the escape hatch for a person at a
terminal watching it themselves.
With nothing supervising the daemon, restart refuses rather than silently stopping you.
Setting up
nouride setup # interactivenouride setup --yes --provider anthropic --api-key-from-env ANTHROPIC_API_KEY --agent nouvaFlags: --provider, --base-url, --api-key-from-env, --agent, --name, --model, --prompt,
--user, --config, --yes. There is deliberately no --api-key.
First run →
Looking at it
nouride status # one screen: agents, gateways, queuenouride doctor # diagnose a setup that is not workingnouride logs [-n N] [-f] # the daemon's own log — works with no journal, and remotelynouride audit [limit] # recent audited actionsnouride sessions # stored conversationsnouride jobs # background jobsnouride jobs log <id>nouride jobs kill <id>Talking to it
nouride chat [agent] # interactive chat — no bot token neededAgents
nouride agents # list, with statenouride agent pause <id> # until the next restartnouride agent resume <id>nouride agent reload <id>nouride agent enable <id> # written to config.toml, so it survives a restartnouride agent disable <id>Gateways
nouride gateway [list]nouride gateway restart <id>nouride gateway restart <id> --then "<follow-up>"nouride gateway add --platform <p> --name <n> --agent <id> --token-stdinnouride gateway rm <id>nouride gateway rename <old> <new> [--apply] # daemon must be STOPPEDrename rewrites both the config and the database the daemon has open, which is why it refuses to
run while the daemon is up — and why it is the one gateway command that does not go through the
control API.
Database snapshots
nouride db backup # take one now, verified before it is keptnouride db list # newest firstnouride db verify [file] # check a snapshot, or the live databasenouride db restore <file> # daemon must be STOPPEDThe daemon takes one at boot and daily, keeping backup_keep of them under data/backups/db/.
These four are local rather than API calls, and grouped on purpose: restore replaces the file a
running daemon holds open, so it cannot go through the control API — and splitting the group would
mean the one command that matters at three in the morning behaved unlike the three beside it.
A snapshot is a single ordinary SQLite file, so recovery does not need this command at all. What
restore adds is refusing to run while the daemon is up, and moving the database it replaces to
nouride.db.replaced-<timestamp> so the wrong choice is undoable.
Providers and secrets
nouride provider [list]nouride provider add <name> --kind openai|anthropic --url <base> --key-stdinnouride provider rm <name>
nouride secret [list] # NAMES only — values are never printednouride secret set <name> --value-stdinnouride secret rm <name>--value <v> exists, and the CLI says what it costs: the value ends up in your shell history.
Approvals, grants and policy
nouride approvals # what is waitingnouride approvals allow-once [id]nouride approvals allow-always [id]nouride approvals deny [id]
nouride grants # standing command permissionsnouride grants revoke <id|--all>
nouride policy # what always asks, and what never doesnouride policy check <command…> # would this be gated? Answers without running itpolicy check works while the daemon is down, which is exactly when somebody is debugging a
refusal.
Access and people
nouride access # who may talk to the agentsnouride access approve <code>nouride access deny|revoke <gateway:sender>
nouride peoplenouride people set <gateway:sender> --name <name> [--note <note>]nouride people forget <gateway:sender>Scheduling
nouride cron [--all]nouride cron add --name <n> (--at 2h | --every 15m | --cron "0 9 * * *") \ --gateway <id> --chat <id> [--agent <id>] [--message <prompt> | --text <msg> | --command <sh>] \ [--then agent] [--session fresh|isolated|chat] [--tz <zone>] [--quiet] [--keep]nouride cron update <id> [--name …] [--at|--every|--cron …] [--tz <zone>] [--message <prompt>]nouride cron run|runs|enable|disable|rm <id>
nouride webhooknouride webhook add --name <n> --agent <id> --gateway <id> --chat <id> --message <prompt>nouride webhook rotate <id> # new URL; the old one stops workingWebhooks are the same jobs — use nouride cron for rm, enable, disable, run and runs.
Scheduled work →
Skills
nouride skills [agent] [-v] # what an agent is offered, and when each was last readnouride skills --all # the whole pool: who has it on, and missing softwarenouride skills on|off <skill> <agent>nouride skills drafts # what the agents have proposednouride skills draft <id> # one draft in full, with the turn it came fromnouride skills approve|deny <id>MCP
nouride mcp # servers and the tools they offernouride mcp add --agent <id> --name <name> (--command <exe> | --url <url>) [--token-stdin]nouride mcp rm --agent <id> --name <name>Takes effect on the next restart — clients are built at boot.
Configuration
nouride config check [file] # would this configuration start? Nothing is launchednouride config schema [section] # every valid key, as JSON Schemanouride config explain <path> # e.g. nouride config explain security.web.search_endpointThe service unit
nouride service status # which supervisor, and whether exiting respawns younouride service install --user <u> --dir <path> [--kind systemd|launchd]nouride service uninstallinstall writes the unit file next to your install and prints the commands to activate it. It
does not install or enable anything itself: enabling a system service is a privileged, host-changing
action, and a CLI you cannot safely run to see what it would do is a CLI you end up not running.
It refuses to generate a unit that runs as root.