The Nessie CLI gives any terminal-based agent or script access to your Nessie library. It is installed as part of CLI access setup and available at nessie in your shell. Works with Claude Code, Codex, and any agent that can run shell commands.
The CLI talks to a local Nessie runtime. On macOS that can be the Nessie app over localhost; the cross-platform Rust CLI talks to Nera over authenticated loopback gRPC. The corresponding runtime must be running. Use nessie status to check the connection. Cloud-backed CLI paths for direct cloud search and faster shared-source access are planned.
Nessie as a filesystem
The CLI exposes your Nessie library as a filesystem and uses Unix coreutil verbs. Everything Nessie holds - an integration root, an Obsidian vault or folder, a synced transcript, a saved context, a profile section, a single chat message - is a node addressed by its UUID. There are no path strings; you navigate by UUID.
Nodes play two roles:
- Directories are container nodes (integration roots, vaults, folders). List them with
ls. - Files are readable nodes (contexts, notes, transcripts, messages). Read them with
cat,head, ortail.
A node can be both at once - a meeting note is a readable summary that also contains its full transcript - so ls shows each node's raw kind rather than a single file-or-directory bit.
nessie search, nessie node ..., nessie source ..., nessie context ..., nessie folder ..., nessie transcript ...) still work and map onto the same data, so existing scripts keep running. New work should prefer the coreutil verbs below.Connection and identity
nessie status- Show app health: version, CLI access, signed-in user, last ingestion, and last cloud syncnessie whoami- Show the authenticated Nessie user: name, email, user ID, and teams
Check-in
nessie check-in- Load generated profile sections plus recent Nessie activity for an agent sessionnessie check-in --recent-limit 10- Control recent activity count (1 to 25, default 10)nessie check-in --hook- Emit host hook JSON for Claude Code or Codex session startup
Navigating: ls and stat
ls is the first-class browser. With no argument it lists the source roots: connected integrations, the Contexts and Chats roots, and readable shared source roots. A directly shared session may itself be a root, so use its returned kind instead of assuming every shared root is an integration. Shared context folders live inside the Contexts root and can contain mixed-owner children. Pass a node UUID to list its direct children, then drill in by listing a child's UUID. stat shows a node's metadata and its place in the tree without dumping its content.
nessie ls- List the source rootsnessie ls- List the direct children of a directory nodenessie ls- Filter children by group, such as--type meeting transcript,context, ormeetingnessie ls- Filter by a raw node kind, as shown in each node's--type claude_code_chat kindfieldnessie ls- Browse a time window--since 2026-05-30 --until 2026-05-31 nessie ls --owner me- List only the roots you own (the default already includes your own plus incoming direct and team shares)nessie ls- Page through children (default limit 100, max 500)--limit 100 --offset 0 nessie ls- Output raw JSON instead of the aligned table--json nessie stat- Print metadata only, for a file or a directory
The ls table prints kind owner updated id name, where owner is me or another person's email. A shared column is inserted after owner when the CLI can resolve an outgoing grant through the team directory; it shows a short headline of personal and team audiences (a team name, , a person, or +N when there are more). Whole-team and admin-only grants appear reliably. A personal grant outside a team, and sometimes a grant to one named teammate, may not appear, so a missing column does not prove every item is private; confirm the exact audience in the app's Share control. Incoming shares show their actual owner in the owner column instead.
There is no recursive ls yet. To search a whole subtree by content, scope a grep to the parent UUID.
Reading: cat, head, tail
These print a node's readable content as raw text, with no JSON wrapper. They work on contexts, Obsidian notes, meeting summaries, whole transcripts, and single chat messages, and they reject a pure directory with a message pointing you back to ls.
nessie cat- Print the full content, with no length capnessie head- Print the first 10 linesnessie head- Print the first 40 lines (-n 40 --linesalso works)nessie tail- Print the last 10 linesnessie tail- Print the last 40 lines-n 40
head and tail read only enough from that edge, so they are cheap on a long transcript where cat would be expensive.
Searching: grep
grep searches node content. It runs hybrid (semantic plus keyword) search by default. The optional second argument is a parent UUID that scopes the search to that node and all of its descendants, which is the right tool for "find this anywhere under this vault, root, or folder."
nessie grep "database migration"- Search everything you can readnessie grep "launch bug"- Scope the search to one subtreenessie grep "pricing decisions" --type context- Filter by type or raw kindnessie grep "exact wording" -F- Fixed-string (literal) match instead of hybridnessie grep "release blocker" --since 2026-05-30 --until 2026-05-31- Restrict to a time windownessie grep "hiring criteria" --owner me- Narrow to just your own sourcesnessie grep "migration" --repo .- Restrict to the current git repo (coding-session content only)nessie grep "competitive analysis" --limit 20- Return more results (default 10, max 500)
Results are grouped by document with the matching content and carry owner attribution. A single search is rarely enough: vary the wording, then cat the full node for each relevant hit before drawing a conclusion.
nessie grep commands serially, never in parallel - overlapping local searches can time out and be misreported as "Nessie is not running."Teams and integrations
Use these to resolve teammate-shared work and named teammates before scoping an ls or grep.
nessie team list- List teams, members, and resources shared with younessie integration list- List personal and team-shared integration rootsnessie integration list --platform claude_code- Filter roots by platformnessie integration list --status team_remote- Show only team-shared rootsnessie integration list --team-id- Show roots for a specific team
Typical team flow: list team-shared roots with nessie integration list --status team_remote, find the teammate's root and owner ID, then search inside it with nessie grep "release blocker" . Results include provenance so an agent can distinguish your local history from a teammate's shared source.
For collaborative contexts, open the virtual Contexts root with nessie ls, then list the teammate-owned folder inside it. A directly shared transcript may be read from its own root ID. The CLI applies repository/session exclusions and folder overrides before returning results, so the listed or readable target is authoritative.
Managing sharing
Use sharing get, sharing add, and sharing remove to manage direct grants for an integration account, an individual agent session, a Nessie context, or a Nessie folder. These commands have the same behavior through the Mac app and the cross-platform Rust CLI with Nera. The corresponding local runtime must be running and Cloud Sync must be enabled.
nessie sharing get— return the node's direct grants, including audience, scope, exclusions, and context or folder access modenessie sharing add— share the entire node with everyone in a team--team --audience everyone nessie sharing add— share with team admins--team --audience admins nessie sharing add— share with a named teammate; repeat--team --audience user --user --userfor several teammatesnessie sharing add— share directly with an existing Nessie user outside a team--audience user --email person@example.com nessie sharing add— share selected repositories from a coding-agent integration; repeat--team --scope repos --repo github.com/org/repo --repofor severalnessie sharing add— share selected repo-less workspace folders; repeat--team --scope folders --folder /absolute/workspace/path --folderfor severalnessie sharing add— share one specific agent session instead of its whole integration--team --audience everyone nessie sharing add— grant Viewer access to a context or folder; use--team --audience everyone --access viewer --access editorto allow edits
The default scope is all. Repository scope requires at least one exact normalized --repo key and may also include --folder values for repo-less sessions. Folder scope accepts only --folder. Use --access viewer|editor only with Nessie contexts and folders. Re-running sharing add for the same audience changes that grant.
To remove grants:
nessie sharing remove— remove every direct grant for the team, including grants to named team members--team nessie sharing remove— remove only the team's Everyone or Admins grant and preserve named-member grants--team --team-acl-only nessie sharing remove— remove selected team-member grants--team --user nessie sharing remove— remove a personal grant; use--user sharing getto resolve its user ID
These commands manage private Nessie access grants. They do not create or disable public browser links.
Owner scope
Discovery and search default to everything you can read - your own sources plus incoming direct and team shares. Narrow to just your own with --owner me (or --owner current_user). Use --owner direct_shared for incoming peer-to-peer grants, --owner team_shared for incoming team-derived grants, or --owner shared for both incoming paths; team remains a compatibility alias for team_shared. Pass a user ID or email (--owner tiger@nessielabs.com) only when you specifically want that person's readable sources. --owner is available on ls, grep, search, node list, node search, source list, and transcript list.
Writing: mkdir, tee, replace-lines, sed, mv, rm, rmdir, delete
These write to your context library. Folders organize contexts; contexts are your saved context documents. Transcripts and other synced sources are read-only, except that a whole synced conversation can be deleted with delete.
nessie mkdir "- Create a folder at the top level" nessie mkdir "- Create a nested folder with an emoji" --emoji "📁" echo "- Create a context with its body from stdin" | nessie tee " " nessie tee "- Create a context from a file, filed in a folder, with source attribution" --from-file --folder --sources nessie replace-lines- Safely replace a complete line--old-line " " --new-line " " nessie replace-lines- Delete a complete line without leaving a blank separator--old-line " " --delete nessie sed- Edit a context body by exact replacement--old " " --new " " nessie sed- Replace from files, all occurrences--old-file --new-file --all nessie mv- Move a context into a folder--to nessie mv- Rename a context--name " " nessie mv- Remove a context from its folder--unfiled nessie rm- Delete a contextnessie rmdir- Delete an empty foldernessie delete- Delete a synced conversation or transcript
rm removes a context you created. delete is different: it removes a whole synced conversation or transcript from your library and excludes it from future syncs so it is not re-imported on the next sync. Because it removes synced source material, delete shows what will be removed and prompts for confirmation in your terminal before it runs. Use it only when you mean to remove a specific chat for good - including from anyone you've shared it with - never to tidy up.
Context Markdown, title, and emoji use the synchronized collaborative document when a context is shared or already enrolled in collaboration. A private never-enrolled context can still use the legacy local write path when Cloud Sync is off and no collaborative checkpoint exists. Owners and Editors can write; Viewers can only read. An Editor shared folder is also a valid destination for contexts and folders you own, but moving an item changes only its containment - ownership stays with its creator. Use the sharing commands above to manage private grants; public browser links remain in the app's Share control.
When creating a context, pass --sources with the UUID of every transcript and context you read while researching. Those source IDs create the provenance badges that let you follow claims back to the original conversations.
Profile
Read and update your Nessie profile. Your profile is built automatically from your conversation history - expertise, projects, decisions, connections, and more.
nessie profile- Print your full profile as JSONnessie profile get --section- Print a specific sectionnessie profile edit-field --field preferredName --value "- Update a scalar profile field" nessie profile edit-text --section biography --content "- Replace a text profile section" nessie profile add-card --section projects --fields '{"name":"New project"}'- Add a structured profile cardnessie profile update-card --section projects --index 0 --updates '{"status":"Active"}'- Update a card by indexnessie profile remove-card --section projects --index 0- Remove a card by index