Argus

Search & privacy

What transcript indexing stores, how to turn it on, and what never leaves your machine.

Cost and token analytics never need the text of a conversation. Argus therefore keeps transcript text out of its database unless you turn indexing on. This page covers what indexing stores, the two ways to enable it, and the guarantees that hold either way.

What indexing stores

When indexing is on, every content block of a transcript becomes one row in a transcript_segments table with an FTS5 full-text index:

RoleSource
userYour messages inside a session
assistantClaude's replies
thinkingExtended-thinking blocks
tool_resultTool output, for example what a file read or a shell command returned

Each segment is capped at 16 KB, so a huge build log does not bloat the index. Prompts from ~/.claude/history.jsonl are stored separately, capped at 8 KB, regardless of the indexing flag.

Indexing also feeds two dashboard features that otherwise stay empty: the Task given panel on the Sub-agents tab, which is the first user message sent to a sub-agent, and the inline error text under failing tool calls in the session Timeline.

Search returns nothing while indexing is off

The Transcripts page says only your prompts remain searchable when indexing is off. In practice the search endpoint returns zero results of every kind, prompts included, until you enable indexing.

Turning it on

Two paths, with one important difference.

From the dashboard. Settings → Enable indexing. This flips the flag and immediately starts a background backfill over sessions that have no segments yet, up to 1,000 at a time. Settings shows backfilling 120/682 while it runs.

From the terminal. argus indexing enable flips the flag only, then prints:

Enabled. Run `argus start` to backfill — historical sessions will
index in the background. New sessions are indexed automatically.

The backfill then happens on the next argus start or argus daemon restart, 200 sessions per run. Sub-agent transcripts are re-read together with their parent so that "Task given" fills in.

After enabling, sub-agent task text and inline tool errors for older sessions may appear only after a restart or two, because of the 200-session cap per run.

Turning it off, or clearing it

ActionEffect
Settings → Disable indexing, or argus indexing disableThe flag goes off. Segments stay on disk but every search and transcript endpoint returns empty
Settings → Clear indexed data, or argus indexing clearDeletes every segment, then compacts the database and reports the space freed. Leaves indexing off

Clearing does not touch prompts, sessions, turns or tool calls. The Settings confirmation says so: "Delete all indexed transcript segments? Your prompts and sessions are unaffected."

The flag itself is a single row in the database. On a database where it was never set, the first read defaults to on if segments already exist and off otherwise.

How search works

  • Ranking is BM25 over an inverted index. There are no embeddings and no vector database.
  • Queries need at least 2 characters and run 250 ms after you stop typing.
  • Role chips choose what to search. Your prompts, Your replies and Claude are on by default; Thinking and Tool output are off.
  • Slash commands like /commit are excluded from prompt results unless you toggle Include slash commands.
  • At most 200 results are returned per query.
  • Matches are highlighted from FTS5 snippets. The highlight markup is split into text runs, never injected as HTML.
Transcripts search for 'pytest' filtered to one project, with role chips and a hits-per-day sparkline
Transcripts search for 'pytest' filtered to one project, with role chips and a hits-per-day sparkline

What never leaves your machine

  • Loopback only. The server binds 127.0.0.1. Nothing on your LAN, Wi-Fi or VPN can reach it. --host 0.0.0.0 exists and prints a loud warning.
  • One network call, and only when you ask. argus pricing refresh fetches a single JSON file from LiteLLM's GitHub repository. Nothing else in Argus makes an outbound request. There is no telemetry, no analytics, and no call to any language model.
  • Three guards on top of loopback binding. Every non-GET request must carry an Origin header that exactly matches the dashboard's own origin, otherwise it gets a 403. Every request must carry a loopback Host header, otherwise it gets a 421, which defeats DNS rebinding. No CORS headers are ever emitted, so a page on another origin cannot read responses.
  • No authentication. Loopback binding is the security model. If you bind a LAN address, anyone on that network can read your prompt history, transcripts and project paths.
  • Transcript text never becomes HTML. Every string derived from a transcript renders as plain text, and a test in the repository enforces that.

Verified against argus-code 0.5.2.

On this page