First run
The daemon boots with no configuration at all. There is no config file to write before it starts. The model endpoint, its credential and your first agent are all set in the browser.
-
Find the first-time password
It is generated on the very first start, printed once, and never stored in plain text. Where to look depends on how you installed.
Terminal window sudo journalctl -u nouride | grep -A6 'Nouride is ready'Terminal window grep -A6 'Nouride is ready' ~/nouride/.nouride/data/nouride.logTerminal window docker compose logs nouride | grep -A6 'Nouride is ready'You will get something like:
Nouride is ready. Open the dashboard to finish setting it up:http://127.0.0.1:18254/dashboard/username adminpassword <generated> -
Open the dashboard
http://127.0.0.1:18254/dashboard/On a server bound to loopback — the default — tunnel to it from your own machine:
Terminal window ssh -L 18254:127.0.0.1:18254 you@your-serverThen open the same URL locally. Nothing is exposed to the network by doing this.
You will be asked to set a real password immediately. That screen does not ask for the current one: you typed it a screen ago to get in, and the old value was handed to you rather than chosen. Every change after that requires the current password, because from then on it guards a secret you actually picked.
-
Point it at a model
The wizard asks for a wire format, a base URL and an API key.
Anthropic anthropicwire format,https://api.anthropic.com/v1OpenAI openaiwire format,https://api.openai.com/v1OpenRouter openaiwire format,https://openrouter.ai/api/v1Ollama on your LAN openaiwire format,http://127.0.0.1:11434/v1Nougate either format — see the Nougate page The endpoint is tested before anything is saved, so a typo fails here rather than at your first message. A credential that does not work is the most common way a fresh install fails, and it otherwise surfaces long after setup reported success.
What gets written to
config.tomlis the name of the credential, never its value. The value goes intodata/secrets.jsonat mode0600. That is why a config file is safe to commit, print, and show in the UI. -
Create your first agent
An id, a display name, and a one-line persona.
The id is the directory name and how the agent is addressed — lowercase, no spaces. The persona is the first line of its
SOUL.md, and you can rewrite the whole file later from the dashboard’s Files tab. -
Say something to it
The dashboard has a chat. So does your terminal, and it needs no bot token:
Terminal window nouride chatMessages there travel through a real in-process gateway, so routing, the queue, the tool loop and session persistence all behave exactly as they will for Telegram.
Doing it over SSH instead
If you can only reach the machine through a terminal, nouride setup does the same work through the
same code — it is not a second implementation.
# As the service account, in the install directory. `su -s /bin/sh` because that account has# `nologin` as its shell, which `sudo -u` trips over on some distributions.sudo su -s /bin/sh nouride -c 'cd /srv/nouride && ./nouride setup'On macOS it is ./nouride setup; in Docker, docker compose exec nouride ./nouride setup.
It is interactive by default. For a provisioning script, pass everything and skip the prompts:
./nouride setup --yes \ --provider anthropic \ --api-key-from-env ANTHROPIC_API_KEY \ --agent nouva --name Nouva \ --model claude-sonnet-4-20250514 \ --prompt "You are a helpful assistant."setup refuses to run against an install that already has a config.toml. Run twice it would
otherwise look like a no-op while having replaced your default agent and repointed the provider.
| Flag | What it sets |
|---|---|
--yes | Answer nothing interactively; fail instead of prompting |
--provider | anthropic or openai — the wire format |
--base-url | The endpoint. Defaults to the well-known one for that wire format |
--api-key-from-env | Name of the environment variable holding the key |
--agent | The agent id |
--name | Display name. Defaults to the id |
--model | Model to use |
--prompt | The one-line persona |
--user | What the agent should call you |
--config | Path to write the config to |
Is it actually up?
curl -fsS http://127.0.0.1:18254/health{"status":"ok","uptime":147,"version":"0.1.0","agents":6,"install":"a1b2c3d4e5f6","gateways":{"telegram:bot":"connected"}}status is degraded — and the endpoint answers 503 — when a gateway is dead, disconnected or
reconnecting, or when the SQLite WAL has grown past its threshold. issues then lists what is wrong.
install is a hash of the data directory, so a CLI can tell it is talking to the right daemon when two
installs on one machine compete for the port.
Check this, not just the service state. systemctl start returning 0 means the process was
spawned, not that it is serving — a daemon that refuses its config exits after systemd reports
success.