Skip to content

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.

  1. 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'

    You will get something like:

    Nouride is ready. Open the dashboard to finish setting it up:
    http://127.0.0.1:18254/dashboard/
    username admin
    password <generated>

    The first-run password printed in the log

  2. 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-server

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

  3. Point it at a model

    The wizard asks for a wire format, a base URL and an API key.

    The wizard asking for a model endpoint

    Anthropicanthropic wire format, https://api.anthropic.com/v1
    OpenAIopenai wire format, https://api.openai.com/v1
    OpenRouteropenai wire format, https://openrouter.ai/api/v1
    Ollama on your LANopenai wire format, http://127.0.0.1:11434/v1
    Nougateeither 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.toml is the name of the credential, never its value. The value goes into data/secrets.json at mode 0600. That is why a config file is safe to commit, print, and show in the UI.

  4. Create your first agent

    An id, a display name, and a one-line persona.

    The wizard asking for a first agent

    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.

  5. Say something to it

    The dashboard has a chat. So does your terminal, and it needs no bot token:

    Terminal window
    nouride chat

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

    A terminal chat session


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.

Terminal window
# 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:

Terminal window
./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.

FlagWhat it sets
--yesAnswer nothing interactively; fail instead of prompting
--provideranthropic or openai — the wire format
--base-urlThe endpoint. Defaults to the well-known one for that wire format
--api-key-from-envName of the environment variable holding the key
--agentThe agent id
--nameDisplay name. Defaults to the id
--modelModel to use
--promptThe one-line persona
--userWhat the agent should call you
--configPath to write the config to

Is it actually up?

Terminal window
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.


Next