Inspect Claude Code local transcripts, reminders, and hook-visible lifecycle data.
Project description
neo
Website · Dashboard surface · Security notes
Local workflow forensics for Claude Code. neo indexes reminder text found on disk, transcripts, retained telemetry rows, hook-visible lifecycle events, and memory artifacts into a SQLite database, then exposes them through a dashboard and an MCP server running on the same machine.
What It Does
- Reads local Claude Code artifacts directly from
~/.claude/and~/.neo/instead of relying on export surfaces that strip evidence - Separates measured, estimated, and inferred claims so row counts stay distinct from heuristics and anomaly labels
- Exposes a local operator surface through a browser dashboard, terminal commands, and an MCP server registered inside Claude Code
- Makes local overhead visible by surfacing reminder injections, sidechains, compaction churn, retained telemetry rows, and other traces the UI does not foreground
The point is not to speculate about what the system might be doing. The point is to inspect what it actually left on disk.
Install
Recommended — pipx:
pipx install neo-harnesster
neo
With pip:
pip install neo-harnesster
neo
Directly from the repo:
git clone https://github.com/asuramaya/neo.git
cd neo
python3 neo.py
Any of the above runs setup + ingest + dashboard in one step and opens
http://127.0.0.1:7777.
Restart Claude Code after the first run so the installed hooks begin capturing events.
CLI
neo # setup + ingest + dashboard
neo --setup # install hooks + register MCP server
neo --ingest # ingest data only
neo --dashboard # dashboard only
neo --dashboard --no-open # serve without opening a browser
neo --port 8888 # custom port
neo-tokens # data accounting in the terminal
neo-states diagram # state machine diagram
Live event stream:
tail -f ~/.neo/harness_log.jsonl
MCP Surface
neo --setup registers neo-mcp in Claude Code. On the next session start,
Claude Code connects to it automatically and the dashboard opens locally.
The server exposes tools for:
- status and hook health
- row-count summaries and data accounting
- reminder queries with file + line provenance
- session and subagent genealogy
- telemetry inspection
- memory-file inspection
- inferred state-model analysis
- cross-signal correlations
The MCP server filters its own traffic out of hook queries by default
(include_self=false) so observer overhead does not contaminate the picture.
Evidence Model
neo labels its claims on purpose:
- measured — reminder rows, sessions, agents, tasks, memory files, telemetry rows, hook events
- estimated — hidden-context share, data multiplier, approximate API transmission counts
- inferred — state-model labels and anomaly interpretation from local timing + lifecycle patterns
For exact billable token numbers, use /usage inside Claude Code. neo does not
fabricate token totals.
What It Captures
| Source | Location | What |
|---|---|---|
| session transcripts | ~/.claude/projects/*.jsonl |
full conversations including system reminders |
| subagents and sidechains | ~/.claude/projects/*/subagents/ |
spawned transcripts and context copies |
| compaction events | ~/.neo/harness_log.jsonl |
PostCompact hook events from the probe |
| telemetry | ~/.claude/telemetry/ |
telemetry rows currently retained on disk |
| memory files | ~/.claude/projects/*/memory/ |
persistent context seeded by instances |
| tasks | ~/.claude/tasks/ |
task state across sessions |
| hook events | ~/.neo/harness_log.jsonl |
tool use, notifications, session lifecycle |
What It Cannot Capture
- server-side reasoning or model internals that never land on disk
- the contents of any secondary channel that is not persisted locally
- whether absent telemetry rows were uploaded, deleted, or never written locally
- system prompt assembly inside the compiled binary
- HTTPS request and response bodies without a proxy
Export Boundary
The /export command in Claude Code strips system reminders. The raw JSONL
files in ~/.claude/projects/ retain them. neo reads the raw files.
That boundary is the whole reason the project exists.
Project Layout
src/neo/
app.py setup, ingest, threaded HTTP server
mcp_server.py stdio MCP server; auto-starts dashboard on initialize
db.py SQLite ingest + query layer
tokens.py visible vs hidden channel accounting
states.py inferred state model + anomaly labels
harness_probe.py hook script copied into ~/.neo/ by setup
dashboard.html single-file local dashboard
neo.py repo-clone launcher shim
test.py smoke tests
All data lives in ~/.neo/neo.db. The dashboard binds to 127.0.0.1 only.
Hooks
neo installs async hooks for 20 Claude Code event types:
PreToolUse PostToolUse PostToolUseFailure Notification SessionStart
SessionEnd Stop SubagentStart SubagentStop PreCompact
PostCompact UserPromptSubmit InstructionsLoaded PermissionRequest
PermissionDenied TaskCreated TaskCompleted FileChanged CwdChanged
ConfigChange
Security
- dashboard binds to
127.0.0.1only and validates localHostheaders POST /api/ingestrequires a same-origin browser request~/.neo/is created with private permissions where the OS allows it- neo does not transmit your data anywhere
- hooks run async and do not block Claude Code operation
- no dependencies beyond Python stdlib
Requirements
- Python 3.10+
- Claude Code installed (
~/.claude/settings.jsonmust exist)
Upgrade Note
If you used the project under its old harnesster name, the first run of neo
or python3 neo.py migrates ~/.harnesster/ to ~/.neo/ and renames
harnesster.db to neo.db. Hook commands in settings.json are rewritten
automatically.
The harnesster command remains as a forwarding shim.
Origin
Built during session 21 of the Like-Us project. A conversation that started with SSH key management and ended with the discovery of hidden instructions in every Claude Code session.
The tool was built by the thing it monitors.
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file neo_harnesster-0.2.0.tar.gz.
File metadata
- Download URL: neo_harnesster-0.2.0.tar.gz
- Upload date:
- Size: 52.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
46d1c5978688d1e516b246ac7bdb2d25a898881ac07f9115d895cc4f58b9402f
|
|
| MD5 |
473ed5c57f9616ffc515ec64e6a80636
|
|
| BLAKE2b-256 |
31466c3e3cdc610bf5ffe355211239c971328e4e01b44eaa3367312677ff6716
|
Provenance
The following attestation bundles were made for neo_harnesster-0.2.0.tar.gz:
Publisher:
publish.yml on asuramaya/neo
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
neo_harnesster-0.2.0.tar.gz -
Subject digest:
46d1c5978688d1e516b246ac7bdb2d25a898881ac07f9115d895cc4f58b9402f - Sigstore transparency entry: 1553850256
- Sigstore integration time:
-
Permalink:
asuramaya/neo@ac843f8258739bee1ff23f8d88d911fb9d575e29 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/asuramaya
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@ac843f8258739bee1ff23f8d88d911fb9d575e29 -
Trigger Event:
release
-
Statement type:
File details
Details for the file neo_harnesster-0.2.0-py3-none-any.whl.
File metadata
- Download URL: neo_harnesster-0.2.0-py3-none-any.whl
- Upload date:
- Size: 52.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3630ff7264054879cfa9386d410ec31177bce8a9b7cf16703be561fd52e7b473
|
|
| MD5 |
a28f5e38ca9a1053b44c3ff45e48d3d8
|
|
| BLAKE2b-256 |
8d395f72e88217e34438cd8221a90bd3cb92ea0062f5dcdefa5df2e22c2a17b3
|
Provenance
The following attestation bundles were made for neo_harnesster-0.2.0-py3-none-any.whl:
Publisher:
publish.yml on asuramaya/neo
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
neo_harnesster-0.2.0-py3-none-any.whl -
Subject digest:
3630ff7264054879cfa9386d410ec31177bce8a9b7cf16703be561fd52e7b473 - Sigstore transparency entry: 1553850296
- Sigstore integration time:
-
Permalink:
asuramaya/neo@ac843f8258739bee1ff23f8d88d911fb9d575e29 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/asuramaya
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@ac843f8258739bee1ff23f8d88d911fb9d575e29 -
Trigger Event:
release
-
Statement type: