Skip to content

Command reference

Terminal window
nouride help # the same list, from the binary itself
nouride version

Two kinds of command, and the split matters:

  • nouride start boots 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:

Terminal window
export NOURIDE_URL=https://nouride.example.com
export NOURIDE_TOKEN=<contents of that box's data/.control-token>

Running the daemon

Terminal window
nouride start # run the engine in this process
nouride stop # stop this install's daemon — no token needed
nouride restart --then "<prompt>" # ask the daemon to exit so its supervisor restarts it

stop 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

Terminal window
nouride setup # interactive
nouride setup --yes --provider anthropic --api-key-from-env ANTHROPIC_API_KEY --agent nouva

Flags: --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

Terminal window
nouride status # one screen: agents, gateways, queue
nouride doctor # diagnose a setup that is not working
nouride logs [-n N] [-f] # the daemon's own log — works with no journal, and remotely
nouride audit [limit] # recent audited actions
nouride sessions # stored conversations
nouride jobs # background jobs
nouride jobs log <id>
nouride jobs kill <id>

Talking to it

Terminal window
nouride chat [agent] # interactive chat — no bot token needed

Agents

Terminal window
nouride agents # list, with state
nouride agent pause <id> # until the next restart
nouride agent resume <id>
nouride agent reload <id>
nouride agent enable <id> # written to config.toml, so it survives a restart
nouride agent disable <id>

Gateways

Terminal window
nouride gateway [list]
nouride gateway restart <id>
nouride gateway restart <id> --then "<follow-up>"
nouride gateway add --platform <p> --name <n> --agent <id> --token-stdin
nouride gateway rm <id>
nouride gateway rename <old> <new> [--apply] # daemon must be STOPPED

rename 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

Terminal window
nouride db backup # take one now, verified before it is kept
nouride db list # newest first
nouride db verify [file] # check a snapshot, or the live database
nouride db restore <file> # daemon must be STOPPED

The 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

Terminal window
nouride provider [list]
nouride provider add <name> --kind openai|anthropic --url <base> --key-stdin
nouride provider rm <name>
nouride secret [list] # NAMES only — values are never printed
nouride secret set <name> --value-stdin
nouride 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

Terminal window
nouride approvals # what is waiting
nouride approvals allow-once [id]
nouride approvals allow-always [id]
nouride approvals deny [id]
nouride grants # standing command permissions
nouride grants revoke <id|--all>
nouride policy # what always asks, and what never does
nouride policy check <command…> # would this be gated? Answers without running it

policy check works while the daemon is down, which is exactly when somebody is debugging a refusal.

Access and people

Terminal window
nouride access # who may talk to the agents
nouride access approve <code>
nouride access deny|revoke <gateway:sender>
nouride people
nouride people set <gateway:sender> --name <name> [--note <note>]
nouride people forget <gateway:sender>

Scheduling

Terminal window
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 webhook
nouride webhook add --name <n> --agent <id> --gateway <id> --chat <id> --message <prompt>
nouride webhook rotate <id> # new URL; the old one stops working

Webhooks are the same jobs — use nouride cron for rm, enable, disable, run and runs. Scheduled work →

Skills

Terminal window
nouride skills [agent] [-v] # what an agent is offered, and when each was last read
nouride skills --all # the whole pool: who has it on, and missing software
nouride skills on|off <skill> <agent>
nouride skills drafts # what the agents have proposed
nouride skills draft <id> # one draft in full, with the turn it came from
nouride skills approve|deny <id>

MCP

Terminal window
nouride mcp # servers and the tools they offer
nouride 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

Terminal window
nouride config check [file] # would this configuration start? Nothing is launched
nouride config schema [section] # every valid key, as JSON Schema
nouride config explain <path> # e.g. nouride config explain security.web.search_endpoint

The service unit

Terminal window
nouride service status # which supervisor, and whether exiting respawns you
nouride service install --user <u> --dir <path> [--kind systemd|launchd]
nouride service uninstall

install 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.