CLI Reference
Installing nebo also installs the nebo command. It has two groups of
subcommands:
Server & admin — start/stop the daemon, manage its cache, install agent skills, deploy to a Hugging Face Space.
Agent-callable Q&A and writes — read runs, logs, metrics, and the DAG from a running daemon, manage alert rules, and push new entries into a run. These are the same commands the shipped agent skills use.
nebo serve # start the daemon (port 7861)
nebo runs list # list runs
nebo metrics get train --name train/loss --values-only
nebo alerts set --title "loss spiked" --condition "train/loss > 5"
Connection options
Every command that talks to a daemon accepts the same connection flags. Values resolve in this order: explicit flag → environment variable → default.
- --api-token <token>
X-Nebo-Tokento send with requests — required when the daemon enforces auth (seenebo serve --api-tokenandnebo deploy). Default:NEBO_API_TOKENenv.
Server & admin
nebo serve
Start the persistent daemon: it watches a log directory for .nebo
files written by SDK file-mode runs, accepts network-mode events over
HTTP, and serves the web UI, the REST API, and the /stream
WebSocket.
nebo serve # foreground, ./.nebo watched
nebo serve -d --logdir ~/experiments/.nebo # background daemon
- --logdir <dir>
The daemon’s workspace root (default:
./.nebo) in every mode: it anchors the SQLite cache, the run-treemeta/directory, and the default--remotedirectory. It is also the directory the watcher tails for.nebofiles written by SDK file-mode runs (ingested as they grow, resuming across restarts).
Daemon modes. By default (plain nebo serve) the daemon is
local: it only ingests .nebo files from --logdir and rejects
runs pushed over the network (the SDK fails fast with a clear error). To
accept network runs, pick one:
Invocation |
Network runs |
Persistence |
|---|---|---|
|
rejected |
— (local file watcher only) |
|
accepted |
daemon writes |
|
accepted |
none (RAM + cache only; CI, demos, tests) |
- --remote [<dir>]
Accept runs over the network and persist them as
.nebofiles in<dir>(default<logdir>/remote/). Mutually exclusive with--remote-ephemeral; the directory may not equal--logdirbut may nest under it.
- --remote-ephemeral
Accept network runs but do not persist them (RAM + disposable cache only). For CI, demos, and tests.
- --no-local
Disable the directory watcher (the logdir still anchors the cache and
meta/). Requires--remoteor--remote-ephemeral— with the watcher off and no network intake the daemon would ingest nothing.
- --api-token <token>
Require this token on API requests via the
X-Nebo-Tokenheader or?token=query parameter. SetsNEBO_API_TOKEN.
- --read <public|private>
Read access mode (default:
public). Only matters when--api-tokenis set:privaterequires the token on GET requests too.
- --write <public|private>
Write access mode (default:
private). Only matters when--api-tokenis set:privaterequires the token on any request that mutates state.
- --cache-path <file>
SQLite cache database path (default:
~/.nebo/cache/<logdir-hash>.db). The cache bounds the daemon’s memory and makes restarts fast;.nebofiles remain the source of truth and the cache can always be rebuilt from them.
- --no-cache
Disable the SQLite cache: pure-RAM daemon, no eviction, no restart persistence. Memory grows with everything ever ingested.
- --ram-budget <mb>
RAM budget for resident run data — metric points and log lines across all runs (default:
384). Beyond it, the idlest runs are evicted from RAM (rehydrated from the cache if they resume) and a lone oversized still-active run is served from the cache instead.
- --media-lru <mb>
In-RAM media byte-cache budget (default:
256). This is a hot window, not a capacity limit — media beyond it is read back from disk on demand.
- --cache-retention-days <days>
At startup, delete cache databases untouched for this many days (default:
30).
Environment mirrors: NEBO_REMOTE (a path, or 1 for the default
dir), NEBO_REMOTE_EPHEMERAL, plus the cache flags NEBO_CACHE_PATH,
NEBO_NO_CACHE, NEBO_RAM_BUDGET_MB, NEBO_MEDIA_LRU_MB,
NEBO_CACHE_RETENTION_DAYS.
nebo cache
Inspect or delete the daemon’s SQLite cache databases. Pure file
operations — no daemon required. Deleting a cache is safe for runs
backed by .nebo files (it rebuilds on the next serve); runs from
a --remote-ephemeral daemon live only in the cache and are deleted
with it. The run tree (meta/tree.json) lives under --logdir, not
the cache, so cache clear never touches your run organization.
nebo cache ls # list cache dbs with logdir + size
nebo cache clear ~/exp/.nebo # delete the cache for one logdir
nebo cache clear --all # delete every cache db
nebo status
Show daemon health and recent runs. Accepts the shared connection options.
nebo stop
Stop a running daemon.
nebo load
Load a .nebo file into the daemon for viewing and Q&A — useful for
historical files that live outside the watched logdir.
nebo load ./archive/2026-05-01_120000_abc123.nebo
nebo mcp / nebo mcp-stdio
nebo mcp prints an MCP server config block for Claude Code (or any
MCP client); nebo mcp-stdio is the stdio transport that config
invokes.
nebo mcp >> .mcp.json # or paste into your client config
nebo skill
List or install the agent skills that ship with nebo (e.g. runs-qa
for run Q&A and derived metrics, and the instrumentation skill for
writing nebo-integrated code).
nebo skill list
nebo skill install --skill all --platform claude-code
nebo deploy
Deploy the nebo daemon to a Hugging Face Space, so you can stream runs to a URL and watch them from anywhere (the UI is mobile-friendly).
nebo deploy --space-id username/my-dashboard
- --hf-token <token>
Hugging Face write token (defaults to
HF_TOKENenv or the cachedhuggingface-clilogin).
Reading runs
All commands below accept the shared connection options
(--url / --port / --api-token / --json).
nebo runs
nebo runs list
nebo runs show run_1748_0
nebo runs wait run_1748_0 --timeout 600 --min-level 30
- wait <run_id> [--timeout <s>] [--min-level <n>]
Block until an alert at or above
--min-levelfires on the run (default level20= INFO), or--timeoutseconds pass (default300). Prints{"status": "alert", ...}or{"status": "timeout"}— the building block for “tell me when the loss spikes” agent loops, paired withnebo alerts set. To wait for the run to finish, pair with a heartbeat rule (nebo alerts set --condition "last_event > 60" --run <id>).
- mv <run_id> [<group> | --root]
Move a run into a group (auto-created if needed), or
--rootto place it at the top level. See nebo tree below.
nebo tree / nebo groups
Runs organize into a filesystem-like tree of groups (e.g.
vision/detr/lr-sweep). A run is born into a group via
nb.init(group=...) / nb.start_run(group=...) / the NEBO_GROUP
env var; reorganize afterward from here. Each group can hold markdown docs
(README.md is rendered first in the UI).
nebo tree # render the whole tree
nebo groups add vision/detr/lr-sweep # create (with ancestors)
nebo groups ls vision/detr # subgroups, runs, docs
nebo groups mv vision/detr vision/detr-v2 # rename/move a subtree
nebo groups rm vision/old # delete an EMPTY group
nebo runs mv run_1748_0 vision/detr/lr-sweep
nebo groups doc set vision/detr README.md --file findings.md
nebo groups doc get vision/detr README.md
nebo tree [--json] prints {groups: {path: {docs: [...]}}, runs:
{run_id: group}} (runs absent from runs are at the root).
groups rm refuses if the group still has member runs or subgroups —
move them out first (nebo has no run deletion). Group docs support
nebo://run/<id>, nebo://run/<id>?step=<n>, and
nebo://group/<path> deep links that the web UI turns into clickable
navigation.
nebo graph
nebo loggables
nebo describe
Print the workflow description (set via nb.md) and per-node
docstrings.
nebo logs
nebo metrics (read)
nebo metrics list
nebo metrics get train --name train/loss --values-only
nebo metrics get train --name train/loss --runs run_a,run_b --json
- get <loggable_id> [--name <n>] [--tag <t>] [--step <n>] [--run <r>] [--runs <r1,r2>] [--values-only]
Fetch metric entries for a loggable.
--name— only the named series.--tag— keep only line/scatter entries carrying the tag.--step— keep only entries at the exact step.--run— run id (latest if omitted).--runs— comma-separated run ids for a cross-run query; emits{run_id: series}keyed by run.--values-only— with--name: emit just the entries array[{step, value, tags, timestamp}, ...].
nebo alerts
Alert rules are evaluated by the daemon on every incoming numeric
metric value and fire at most once per run; a fired alert wakes
nebo runs wait. Code-fired alerts (nb.alert(...)) appear in the
same listing.
nebo alerts set --title "loss spiked" --condition "train/loss > 5" --level WARN
nebo alerts set --title "run done" --condition "last_event > 60" --run 1f2e3d4c5b6a
nebo alerts ls
nebo alerts rm 1a2b3c4d
- set --title <t> --condition <expr> [--text <body>] [--level <l>] [--loggable <id>] [--run <run_id>]
Create an alert rule on a metric condition.
--condition—'<metric> <op> <number>', e.g.'train/loss > 5'. Ops:>,>=,<,<=,==,!=. The metric namelast_eventis reserved for heartbeat rules: the value is seconds since the run’s last event, checked about once a second by the daemon (ops>/>=only,--loggabledoesn’t apply).'last_event > 60'fires once a run has been quiet for 60 seconds — nebo’s run-completion signal, since runs have no status or end time.--level—DEBUG/INFO/WARN/ERRORor an integer (defaultINFO).--loggable— only match the metric on this loggable id.--run— only apply to this run id (default: all runs).
Writing data
These commands push entries into a run — they exist so agents can
compute and deliver derived data (a smoothed metric, an annotated
image) straight to the UI. Entries default to the __agent__
loggable so agent-authored data never mixes with your pipeline’s own
streams.
nebo metrics log
nebo metrics log --entries-json '[
{"name": "loss_ema", "value": 0.42, "step": 100},
{"name": "loss_ema", "value": 0.41, "step": 101}
]'
nebo text / images / audio log
nebo text log --entries-json '[{"message": "analysis complete"}]'
nebo images log --entries-json '[{"name": "annotated", "path": "./out.png"}]'
nebo audio log --entries-json '[{"name": "sample", "path": "./clip.wav", "sr": 22050}]'
- --entries-json <json>
JSON list of entries.
text:
{loggable_id?, message, name?, level?, step?}images:
{loggable_id?, name, path? | url? | data?, step?, labels?}— exactly one ofpath(local file, read and encoded by the CLI),url(fetched server-side), ordata(already base64).audio: same as images plus
sr(sample rate, default16000).