CLI reference

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, or tail.

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.

The older namespaced commands (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 sync
  • nessie 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 session
  • nessie 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 roots
  • nessie ls - List the direct children of a directory node
  • nessie ls --type meeting - Filter children by group, such as transcript, context, or meeting
  • nessie ls --type claude_code_chat - Filter by a raw node kind, as shown in each node's kind field
  • nessie ls --since 2026-05-30 --until 2026-05-31 - Browse a time window
  • nessie ls --owner me - List only the roots you own (the default already includes your own plus incoming direct and team shares)
  • nessie ls --limit 100 --offset 0 - Page through children (default limit 100, max 500)
  • nessie ls --json - Output raw JSON instead of the aligned table
  • 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, admins, 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 cap
  • nessie head - Print the first 10 lines
  • nessie head -n 40 - Print the first 40 lines (--lines also works)
  • nessie tail - Print the last 10 lines
  • nessie tail -n 40 - Print the last 40 lines

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

Terminal — zsh — 80×24
$ nessie grep "API migration plan"
Found 4 results across contexts and transcripts:
1. API Migration Roadmap context · updated 2d ago
2. Backend refactor discussion Claude · May 3
3. v2 endpoint deprecation ChatGPT · Apr 28
4. Migration testing checklist context · Apr 25
  • nessie grep "database migration" - Search everything you can read
  • nessie grep "launch bug" - Scope the search to one subtree
  • nessie grep "pricing decisions" --type context - Filter by type or raw kind
  • nessie grep "exact wording" -F - Fixed-string (literal) match instead of hybrid
  • nessie grep "release blocker" --since 2026-05-30 --until 2026-05-31 - Restrict to a time window
  • nessie grep "hiring criteria" --owner me - Narrow to just your own sources
  • nessie 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.

Local CLI search does not support concurrent requests. Run 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 you
  • nessie integration list - List personal and team-shared integration roots
  • nessie integration list --platform claude_code - Filter roots by platform
  • nessie integration list --status team_remote - Show only team-shared roots
  • nessie 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" --owner . 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 mode
  • nessie sharing add --team --audience everyone — share the entire node with everyone in a team
  • nessie sharing add --team --audience admins — share with team admins
  • nessie sharing add --team --audience user --user — share with a named teammate; repeat --user for several teammates
  • nessie sharing add --audience user --email person@example.com — share directly with an existing Nessie user outside a team
  • nessie sharing add --team --scope repos --repo github.com/org/repo — share selected repositories from a coding-agent integration; repeat --repo for several
  • nessie sharing add --team --scope folders --folder /absolute/workspace/path — share selected repo-less workspace folders; repeat --folder for several
  • nessie sharing add --team --audience everyone — share one specific agent session instead of its whole integration
  • nessie sharing add --team --audience everyone --access viewer — grant Viewer access to a context or folder; use --access editor to 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 --team — remove every direct grant for the team, including grants to named team members
  • nessie sharing remove --team --team-acl-only — remove only the team's Everyone or Admins grant and preserve named-member grants
  • nessie sharing remove --team --user — remove selected team-member grants
  • nessie sharing remove --user — remove a personal grant; use sharing get to 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.

Terminal — zsh — 80×24
$ nessie tee "Weekly standup notes" --from-file standup.md --emoji "📝"
created context "Weekly standup notes" 8f3a2b1e
$ nessie mv 8f3a2b1e --to 4c0d91a7
moved context 8f3a2b1e → folder 4c0d91a7
  • nessie mkdir "" - Create a folder at the top level
  • nessie mkdir "" --emoji "📁" - Create a nested folder with an emoji
  • echo "" | nessie tee ""</code> - Create a context with its body from stdin</li><li><code>nessie tee "<title>" --from-file <path> --folder <folder-id> --sources <uuid1> <uuid2></code> - Create a context from a file, filed in a folder, with source attribution</li><li><code>nessie replace-lines <id> --old-line "<line>" --new-line "<replacement>"</code> - Safely replace a complete line</li><li><code>nessie replace-lines <id> --old-line "<line>" --delete</code> - Delete a complete line without leaving a blank separator</li><li><code>nessie sed <id> --old "<text>" --new "<replacement>"</code> - Edit a context body by exact replacement</li><li><code>nessie sed <id> --old-file <path> --new-file <path> --all</code> - Replace from files, all occurrences</li><li><code>nessie mv <id> --to <folder-id></code> - Move a context into a folder</li><li><code>nessie mv <id> --name "<new name>"</code> - Rename a context</li><li><code>nessie mv <id> --unfiled</code> - Remove a context from its folder</li><li><code>nessie rm <id></code> - Delete a context</li><li><code>nessie rmdir <folder-id></code> - Delete an empty folder</li><li><code>nessie delete <conversation-id></code> - Delete a synced conversation or transcript</li></ul><p class="docs-paragraph"><code>rm</code> removes a context you created. <code>delete</code> 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, <code>delete</code> 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.</p><p class="docs-paragraph">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 <code>sharing</code> commands above to manage private grants; public browser links remain in the app's <strong>Share</strong> control.</p><p class="docs-paragraph">When creating a context, pass <code>--sources</code> 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.</p><h3 class="docs-subheading"><strong>Profile</strong></h3><p class="docs-paragraph">Read and update your Nessie profile. Your profile is built automatically from your conversation history - expertise, projects, decisions, connections, and more.</p><div class="docs-illustration"><div class="cc-mock"><div class="cc-chrome"><div class="cc-traffic"><i class="r"></i><i class="y"></i><i class="g"></i></div><div class="cc-title">Terminal — zsh — 80×24</div></div><div class="cc-body"><div class="cc-line"><span class="cc-prompt">$</span> <span class="cc-user">nessie profile get --section expertise</span></div><div class="cc-spacer"></div><div class="cc-line"><span class="cc-tool-name">Expertise</span></div><div class="cc-spacer"></div><div class="cc-line cc-bullet"> <span class="cc-cite">Engineering</span> TypeScript, React, Node.js, PostgreSQL</div><div class="cc-line cc-bullet"> <span class="cc-cite">Infrastructure</span> AWS, Docker, CI/CD, Terraform</div><div class="cc-line cc-bullet"> <span class="cc-cite">AI/ML</span> LLM prompting, RAG, embeddings</div><div class="cc-line cc-bullet"> <span class="cc-cite">Product</span> Roadmap planning, user research, pricing</div><div class="cc-spacer"></div><div class="cc-line cc-source"><span class="cc-source-label">source:</span> 142 conversations across 5 platforms.</div></div></div></div><ul class="docs-list"><li><code>nessie profile</code> - Print your full profile as JSON</li><li><code>nessie profile get --section <name></code> - Print a specific section</li><li><code>nessie profile edit-field --field preferredName --value "<name>"</code> - Update a scalar profile field</li><li><code>nessie profile edit-text --section biography --content "<markdown>"</code> - Replace a text profile section</li><li><code>nessie profile add-card --section projects --fields '{"name":"New project"}'</code> - Add a structured profile card</li><li><code>nessie profile update-card --section projects --index 0 --updates '{"status":"Active"}'</code> - Update a card by index</li><li><code>nessie profile remove-card --section projects --index 0</code> - Remove a card by index</li></ul></div></div></div></div></main><footer class="site-footer"><div class="footer-inner"><div class="footer-brand"><a class="footer-logo-link" href="/" data-discover="true"><img src="/Nessie_256x256.png" alt="Nessie" class="footer-logo-img"/><span class="footer-wordmark">Nessie</span></a><p class="footer-tagline">Context for you, your team, and your agents.</p></div><div class="footer-columns"><div class="footer-column"><h4 class="footer-column-title">Product</h4><a class="footer-col-link" href="/" data-discover="true">Home</a><a class="footer-col-link" href="/pricing" data-discover="true">Pricing</a><a class="footer-col-link" href="/changelog" data-discover="true">Changelog</a><a class="footer-col-link" href="/docs" data-discover="true">Docs</a><a href="/" class="footer-col-link">Download</a></div><div class="footer-column"><h4 class="footer-column-title">Company</h4><a class="footer-col-link" href="/about" data-discover="true">About</a><a class="footer-col-link" href="/blog" data-discover="true">Blog</a><a href="https://www.ycombinator.com/companies/nessie/jobs" target="_blank" rel="noopener noreferrer" class="footer-col-link">Careers</a><a href="mailto:founders@nessielabs.com" class="footer-col-link">Contact</a></div><div class="footer-column"><h4 class="footer-column-title">Legal</h4><a class="footer-col-link" href="/privacy" data-discover="true">Privacy Policy</a><a class="footer-col-link" href="/terms" data-discover="true">Terms of Service</a><a href="https://trust.nessielabs.com" target="_blank" rel="noopener noreferrer" class="footer-col-link">Trust Center</a></div><div class="footer-column"><h4 class="footer-column-title">Connect</h4><a href="https://x.com/NessieLabs" target="_blank" rel="noopener noreferrer" class="footer-col-link">X</a><a href="https://discord.gg/6DkXCpVu6K" target="_blank" rel="noopener noreferrer" class="footer-col-link">Discord</a><a href="https://cal.com/team/nessie/nessie-demo" target="_blank" rel="noopener noreferrer" class="footer-col-link">Book a Demo</a></div></div></div><div class="footer-bottom"><span>© Nessie Labs, Inc 2026</span></div></footer></div></div> </body> </html>