NoiraDocs

Documentation

Run an AI agent on a machine you control

Noira is a self-hosted AI agent. One gateway runs on your computer or server, you drive it from the terminal, the desktop app, the control panel or your phone, and it asks before doing anything risky. These pages cover all of it, from the first install to the HTTP API.

What this website is#

This site is the product page and documentation for Noira. It also runs a demo launch feed, Ask Noira and a scripted replay of the site builder, which are labelled as such. The agent you install is a different thing: it runs on your own machine, never on this site.

01

This site

Shows what Noira does, gives you the installers and the install command, and publishes the launch feed at /api/launches that the agent can read.

02

Your control panel

A page served by your own gateway at 127.0.0.1:18790/panel.html with a private token. Chat, approvals, jobs, memory, files and settings live there.

03

The product

Noira itself is an npm package, @noirarh/noira: a gateway, a CLI, a scheduler, tools and the control panel. It lives on your machine.

i

The control panel page carries your gateway token. Treat a link that contains it like a password and never paste it anywhere public.

Overview and architecture#

Everything is one Node process called the gateway, plus a thin CLI that talks to it over HTTP. There is no database and no cloud account. State is JSON files in one folder.

The parts

Gateway
An HTTP server on 127.0.0.1:18790. Serves the control panel, exposes the API, streams events, and owns everything below.
Agent
The loop that sends your task to the model, runs the tools it asks for, and pauses for your approval when a tool needs it.
CLI
noira. Starts and stops the gateway, chats, and manages approvals, jobs and memory by calling the API.
Control panel
The web app the gateway serves. The same panel runs inside the desktop app and the Android app, and installs as a web app.
Scheduler
Cron jobs that start a run on their own while the gateway is up. Results land in Activity.
Tools
Files, shell, web fetch, memory, schedules, the launch feed and the site builder, each with its own permission.

How a task flows

  1. You hand it a taskFrom noira, the control panel, the desktop or phone app, or a scheduled job. It lands on POST /api/runs.
  2. The agent calls the modelClaude by default, or any OpenAI-compatible endpoint such as Ollama. Text streams out as events while it is written.
  3. The model asks for toolsEach call is checked against its schema, then against your policy: allow runs now, ask waits for you, block is refused.
  4. You approve or denyIn the terminal, in the panel, or in the app. An unanswered request is denied when it expires (12 hours by default).
  5. Results go back to the modelUp to 30 steps per run. When the model stops asking for tools, its last text is the answer, and the run is saved to disk.

The data folder

Everything lives in ~/.noira, or wherever NOIRA_HOME points. Keys are stored in plain text. Never commit or share this folder.

~/.noira/
├── config.json      provider, model, key, token, port, policy, feed URL
├── memory.json      saved memories, put in front of the model on every run
├── jobs.json        scheduled jobs with their last run
├── runs/            one JSON file per run (the newest 300 are kept)
├── gateway.pid      pid of the running gateway
├── gateway.log      its log, read with noira logs
└── workspace/       where the agent works; file tools stay inside it

Install#

Noira needs Node 22 or newer and a model: a Claude API key, any OpenAI-compatible endpoint, or a local model with Ollama. Install it once from npm, then run the guided setup.

Linux and macOS

npm install -g @noirarh/noira
noira onboard

Windows

PowerShell blocks the .ps1 shims that npm installs, so call the .cmd versions:

npm.cmd install -g @noirarh/noira
noira.cmd onboard

To use the short names instead, allow local scripts once for your account and open a new terminal:

Set-ExecutionPolicy -Scope CurrentUser RemoteSigned

What onboard does

  1. Picks a modelClaude (asks for your Anthropic key and the model, default claude-opus-5-5), an OpenAI-compatible endpoint (base URL, model, key), or Ollama (local URL and model, no key).
  2. Checks itSends one tiny request so a wrong key shows up now, not at 3 a.m. The key input is hidden.
  3. Saves the configTo ~/.noira/config.json. Then start the gateway with noira start and talk to it with noira.

Desktop and mobile apps

You do not have to live in the terminal. The Download section has installers for each platform, built from the same source as the npm package.

Windows · .exe

Windows 10 or newer. Starts the gateway when it launches and opens the panel in its own window. Closing the window keeps Noira working from the tray; Start when I log in is in the tray menu.

macOS · .dmg

Apple silicon and Intel. Lives in the menu bar and keeps working when the window is closed. If a gateway started from the terminal is already running, the app uses it.

Android · .apk

A remote client. You enter the address and token of a gateway you run on a computer or server, reached over a private network such as Tailscale. See phone pairing.

!

The gateway needs Node and runs on a computer or a server, never on the phone. The mobile app controls a gateway; it does not contain one.

Models#

ProviderSet upNotes
ClaudeAnthropic API keyThe default, model claude-opus-5-5. ANTHROPIC_API_KEY in the environment overrides the saved key.
OpenAI-compatibleBase URL, model, keyOpenAI (https://api.openai.com/v1), OpenRouter, Groq, LM Studio and others. OPENAI_API_KEY overrides the saved key. The model must support tool calls.
OllamaLocal URL and modelhttp://127.0.0.1:11434/v1, no key. Prompts never leave the machine. Pick a model with tool support, such as llama3.1 or qwen2.5.

Change the model any time with noira onboard or in Settings → Model of the panel.

Command line#

Every command calls the gateway's API with the token from ~/.noira/config.json. If the gateway is not running, commands that need it tell you so. On Windows PowerShell write noira.cmd instead of noira, unless you allowed local scripts.

Setup and gateway

CommandWhat it does
noira onboardGuided setup: model, key, a test request. noira setup is an alias.
noira start [--remote]Starts the gateway as a background process. --remote listens on every interface for the phone app (token still required).
noira stopStops the gateway.
noira statusGateway, model, active runs, waiting approvals, jobs, memories and the workspace path.
noira gateway [--remote] [--port n]Runs the gateway in this window. Ctrl+C stops it.
noira logsThe last 60 lines of gateway.log.
noira panelStarts the gateway if needed and opens the control panel in your browser.
noira pairPrints the addresses and token for the Android app. Needs noira start --remote.

Talking to the agent

CommandWhat it does
noiraRuns onboarding if nothing is set up, starts the gateway if it is stopped, then opens a chat.
noira chatInteractive chat that keeps the conversation. Tool calls show as they happen, approvals are asked inline: yes, no, or always. /exit leaves.
noira run "task"One task, streamed, then exit. Exit code 0 when it finished.
noira approvalsLists what is waiting for you.
noira approve <id> [--always]Allows one request. --always also sets that tool to allow.
noira deny <id>Refuses it.

Jobs, memory and Noira tools

CommandWhat it does
noira jobsJobs with their schedule, on/off and next run.
noira jobs add "0 8 * * 1-5" "task" [--name n]Adds a job. The cron expression is checked before saving.
noira jobs run|on|off|rm <id>Runs one now, switches it on or off, or deletes it.
noira memory · memory add "text" · memory rm <id>The facts the agent keeps between runs.
noira build "site idea" [--out dir]Writes a complete single-file website into ./<name>/index.html. Works without the gateway.
noira scan [--signal]The latest launches from the feed, or only the ones that passed all seven checks.
noira --version · noira helpThe version, and the full list in the terminal.
i

NOIRA_HOME moves the data folder. Set it for the CLI and the gateway alike, because the CLI finds the gateway's port and token through it.

Control panel and apps#

Open it with noira panel, or go to http://127.0.0.1:18790/panel.html on the machine that runs the gateway.

PageWhat it is for
ChatHand Noira a job. Tool steps and approval cards appear inside the answer; Stop ends a running task.
ApprovalsEverything waiting for your yes, with Allow, Always allow and Deny. Turn on browser notifications here.
ActivityEvery run, whoever started it, with each tool call and its output.
JobsSchedule tasks with presets or your own cron expression; switch them on and off, run them now.
MemoryRead, add and forget what Noira keeps.
FilesBrowse the workspace and preview what the agent wrote, HTML pages included.
SettingsModel and key, launch feed, approval timeout, and the permission of every tool.

Install it as an app

In Chrome or Edge, open the panel and choose Install app in the sidebar or the address bar. It opens in its own window like a native app, on any device that can reach your gateway.

Connect your phone

  1. Put both devices on a private networkTailscale is the simplest: install it on the computer and the phone and sign in to the same account.
  2. Start the gateway for remote usenoira stop, then noira start --remote.
  3. Get the detailsnoira pair prints the gateway address (Tailscale addresses start with 100.) and the token.
  4. ConnectOpen the Noira app on Android, enter the address and token, and tap Connect.
!

Never forward port 18790 on your router or expose it to the internet. Anyone with the token can run commands on your machine.

Tools and permissions#

The model gets thirteen tools. Each has a permission: allow runs without asking, ask waits for your answer, block refuses and tells the model the tool is off. Change them in Settings → Permissions, or answer Always allow to an approval.

ToolDefaultWhat it does
list_filesallowLists a folder in the workspace.
read_fileallowReads a text file. Output is clipped at 60,000 characters.
write_fileaskCreates or overwrites a file, making folders as needed.
run_shellaskRuns a command in the workspace (cmd.exe on Windows, sh elsewhere) for up to 2 minutes; output is clipped at 20,000 characters. Model API keys are removed from its environment.
fetch_urlaskFetches an http(s) page and returns its text, HTML stripped.
rememberallowSaves a durable fact to memory.
recallallowSearches memory by keywords.
forgetaskDeletes a memory.
schedule_jobaskCreates a recurring job.
list_jobsallowLists jobs and their next runs.
cancel_jobaskDeletes a job.
scan_launchesallowReads recent launches and their seven checks from the feed.
build_siteaskWrites a complete website into a workspace folder.

The workspace boundary

File tools resolve paths inside ~/.noira/workspace and refuse anything outside it, such as ../config.json. To give Noira another folder, add it to allowedRoots in the config. Shell commands start in the workspace but, once you approve them, run with your user's rights, so read what you approve.

Approvals#

When a tool set to ask is called, the run pauses and an approval appears everywhere at once: inline in noira chat and noira run, in noira approvals, on the panel's Approvals page and in the chat that started it. Answer it in any of those places; the first answer wins.

  • Allow runs this one call.
  • Always allow runs it and sets the tool to allow from now on.
  • Deny refuses it. The model is told and continues without it.

Requests made by scheduled jobs at night wait for you in the morning. If nobody answers before approvalTimeoutMin (720 minutes by default), the request counts as denied. Stopping a run denies whatever it was waiting for.

Scheduled jobs#

A job is a task plus a five-field cron expression in the machine's local time: minute hour day-of-month month day-of-week. Jobs run while the gateway is up; if the computer is off, that run is skipped.

ExpressionRuns
0 8 * * 1-5Every weekday at 08:00
0 7 * * *Every day at 07:00
*/30 * * * *Every 30 minutes
0 16 * * 5Fridays at 16:00
0 9 1 * *The first of every month at 09:00
noira jobs add "0 8 * * 1-5" "Scan the latest launches and write the signals to brief.md" --name "Morning brief"

You can also just ask: "Every Friday at 4 pm, summarize my notes into weekly.md." Noira will propose the job with schedule_job and wait for your approval.

Memory#

Memories are short facts that carry across conversations: your name, how you like answers, where a project lives. On every run Noira puts the memories most relevant to the task, then the newest, in front of the model (up to 14). It saves new ones with remember when you tell it something worth keeping, and you can add or forget them yourself in the panel or with noira memory.

Launch tools#

scan_launches reads the launch feed of a Noira site (GET /api/launches), where each launch is scored on seven checks: dev wallet share, liquidity lock, holder concentration, sniper and bundle activity, contract risk, early volume quality, and socials. A launch is signal only when all seven pass. Point the agent at a feed with feedUrl in Settings. The public feed is a demo until the chain indexer is connected.

build_site writes a complete single-file website (inline CSS and JavaScript, responsive, accessible) from one sentence into the workspace. noira build does the same from the terminal, into the current folder.

Configuration#

~/.noira/config.json is created on first run. Most fields can be changed in the panel; restart the gateway after editing the file by hand.

FieldDefaultMeaning
provideranthropicanthropic or openai (any OpenAI-compatible endpoint, Ollama included).
modelclaude-opus-5-5The model name for that provider.
apiKeyemptyThe saved key. The environment variables win when set.
baseUrlemptyThe endpoint for openai, e.g. http://127.0.0.1:11434/v1.
host · port127.0.0.1 · 18790Where the gateway listens. --remote overrides the host for one run.
tokenrandomThe secret every API call needs. Delete the line and restart to get a new one.
policy{}Per-tool permissions, e.g. {"run_shell": "block"}. Missing tools use their default.
allowedRoots[]Extra folders the file tools may use.
feedUrlhttp://localhost:5173The Noira site whose launch feed scan_launches reads.
approvalTimeoutMin720Minutes before an unanswered approval counts as denied.

Environment variables: NOIRA_HOME (data folder), ANTHROPIC_API_KEY, OPENAI_API_KEY.

HTTP API#

The CLI, the panel and the apps all use this API, and so can your own scripts. Send the token in an x-noira-token header (or ?token= for the event stream). Bodies are JSON.

curl -H "x-noira-token: $TOKEN" http://127.0.0.1:18790/api/status

curl -X POST -H "x-noira-token: $TOKEN" -H "content-type: application/json" \
  -d '{"task":"List the files in my workspace"}' http://127.0.0.1:18790/api/runs
EndpointWhat it does
GET /api/statusVersion, model, active runs, approvals, jobs, memories, workspace.
GET /api/eventsServer-sent events: run.started, run.text, run.step, run.finished, approval.requested, approval.resolved, jobs.changed, memory.changed, config.changed.
POST /api/runsStarts a run: { task, history? }. Returns the run with its id.
GET /api/runs · GET /api/runs/:idRecent runs, or one run with every step.
POST /api/runs/:id/stopStops a running task.
GET /api/approvals · POST /api/approvals/:idWaiting approvals; answer with { decision: "allow" | "deny" | "always" }.
GET · POST /api/jobsList jobs, or add one: { cron, task, name? }.
PATCH · DELETE /api/jobs/:id · POST /api/jobs/:id/runChange (e.g. { enabled: false }), delete, or run a job now.
GET · POST /api/memory · DELETE /api/memory/:idMemories: list, add { text }, forget.
GET /api/files?path=A workspace folder listing, or a file's content.
GET /api/toolsEvery tool with its current permission.
GET · PUT /api/configThe config without the key or token; update model, key, feed, timeout or policy.
POST /api/shutdownStops the gateway.

Security#

  • Local only by default. The gateway listens on 127.0.0.1, and requests that name any other host are refused, so a web page cannot reach it through a DNS trick.
  • A token on every call, even from this machine. The panel receives it inside its own page, which other sites cannot read.
  • Remote mode is for private networks. --remote listens on every interface for the phone; use Tailscale or your home network, never a port forward.
  • It asks before it acts. Files, shell, web requests, jobs and site builds wait for your yes unless you allow them.
  • Your data stays yours. Keys, memory, runs and files live in ~/.noira. Model calls go to the provider you chose; with Ollama they never leave the machine.

Troubleshooting#

noira is not recognized, or "running scripts is disabled" on Windows
Use noira.cmd and npm.cmd, or run Set-ExecutionPolicy -Scope CurrentUser RemoteSigned once and open a new terminal.
"Port 18790 is busy"
Another gateway is already running, maybe from the desktop app. noira status shows it; noira stop stops it.
"The model rejected the API key"
Run noira onboard again or fix it in Settings. Check that no old ANTHROPIC_API_KEY / OPENAI_API_KEY in your environment is overriding the saved key.
The panel says "Wrong token"
Open it from noira panel so the page carries the current token, or reconnect the phone app with the token from noira pair.
A job did not run
Jobs only run while the gateway is up and a model is set up. Check the job's next run in noira jobs and the gateway log with noira logs.
The phone cannot connect
Start the gateway with --remote, make sure both devices are on the same Tailscale network, and use the 100. address from noira pair.

$NOIRA#

$NOIRA is the Noira token. Holding it opens the full agent on this site; fees buy it back and burn it. The contract address is published only on the home page; until then it reads "Coming soon". Nothing in these docs is an offer or investment advice.