Repository navigation
Releases: neatlogs/neatroots
Release list
neatroots v0.2.9-rc.1
What's Changed
- fix(cli): validate init flags before writing any files by @taranum-neatlogs in #18
- fix(api): explain when no LLM is reachable instead of a raw 'fetch fa… by @taranum-neatlogs in #19
- fix(ingest): reject non-finite duration_ms on /v1/trace with a 400 by @taranum-neatlogs in #20
- Coding-agent chats: Codex follow-ups work; Claude sign-in errors explained once by @akshay-neatlogs in #17
- fix(ingest): cap trace nesting depth instead of overflowing the stack by @taranum-neatlogs in #21
- fix(ingest): reject non-finite score and token counts on /v1/trace by @taranum-neatlogs in #22
- check: flag a run that answers after an unrecovered tool failure by @harshk-neatlogs in #25
- check: repeated-tool-call also compares the result by @harshk-neatlogs in #27
- reject match rules whose pattern does not compile by @harshk-neatlogs in #33
- make secret-in-output case sensitive by @harshk-neatlogs in #35
- import: explicit project wins, empty files fail by @harshk-neatlogs in #37
- add neatroots check: rule checks over saved traces by @harshk-neatlogs in #39
- docs: show the instrumentation line in the getting started snippets by @harshk-neatlogs in #48
- fix(relay): redact span names, event names, links and scope before a … by @taranum-neatlogs in #51
- fix(api): clamp the findings list limit instead of failing on a bad v… by @taranum-neatlogs in #52
- fix(checks): keep parentheses that come from a value in filled templates by @taranum-neatlogs in #53
- fix(mcp): refuse an ambiguous run or span id prefix instead of guessing by @taranum-neatlogs in #54
- fix(ingest): read a fractional epoch string like the same number by @taranum-neatlogs in #55
- check: flag secrets in tool output by @harshk-neatlogs in #29
- add requires_before rule: flag a tool call with no earlier prerequisite call by @harshk-neatlogs in #31
- fix(steering): record a missed steering note when the run ended first by @taranum-neatlogs in #50
- fix(retention): trim to the size cap instead of deleting every run by @taranum-neatlogs in #56
- fix(search): list every run that matches a search, not the best-ranke… by @taranum-neatlogs in #61
- fix(api): refuse retention settings it can't use instead of answering ok by @taranum-neatlogs in #60
- fix(relay): count a run as sent once its spans are accepted by @taranum-neatlogs in #68
- fix(runs): show how many runs match the filters, not how many were lo… by @taranum-neatlogs in #67
- fix(ui): carry rounding into the next unit in durations by @taranum-neatlogs in #66
- fix(import): keep importing the other cloud traces when one fails by @taranum-neatlogs in #62
- fix(relay): redact bearer tokens whatever the case of the scheme by @cipoklean in #91
- fix(relay): refuse to forward a run id that isn't stored by @cipoklean in #95
- fix(ingest): infer /v1/trace span kinds in the documented order by @cipoklean in #97
- fix(ingest): mark a /v1/trace guardrail that didn't pass as an error by @cipoklean in #99
- fix(steer): don't skip guidance for 5 s after one slow reply by @taranum-neatlogs in #76
- fix(mcp): stop query_sql at its row cap instead of running the whole query by @AyushVUpadhye in #90
- fix(steering): keep a user's halt when the streak that raised it ends by @Meraj-08 in #88
- fix(relay): redact textual OTLP byte attributes by @Webghost01-NG in #85
- fix(checks): don't read "no errors" as the answer admitting a failure by @cipoklean in #83
- fix(check): refuse an empty --only list instead of checking nothing by @cipoklean in #79
- add soft-tool-failure rule for success spans with failure output by @harshk-neatlogs in #44
- feat(checks): flag runs where the model calls keep growing by @harshk-neatlogs in #45
- fix(steer): bind cached mode to its trace by @Manav2209 in #103
- fix(steer): preserve SDK response helpers after guidance by @Manav2209 in #102
- fix(checks): return validation errors for broken YAML aliases by @harshk-neatlogs in #75
- fix(checks): reset match regex state between spans by @harshk-neatlogs in #72
- fix(check): return an error when rule configuration is invalid by @harshk-neatlogs in #70
- fix(import): parse multiline JSON before guessing JSONL by @harshk-neatlogs in #64
- feat(checks): add a slow rule for one span that took too long by @harshk-neatlogs in #58
- feat(checks): flag tools going around in a circle by @harshk-neatlogs in #46
- fix(checks): ignore JSON object key order when detecting repeated calls by @Manav2209 in #106
- fix(checks): reject score thresholds outside their declared scale by @Manav2209 in #108
- fix(semantics): keep EVALUATOR spans instead of reading them as UNKNOWN by @cipoklean in #113
- fix(steering): enforce maxNotesPerRun budget on pending queue and claims by @Meraj-08 in #115
- fix(steering): make gate mode wait for debounced trace questions by @Meraj-08 in #114
- docs: list check exit codes in getting started by @harshk-neatlogs in #111
- fix(check): report a loop or error streak anywhere in a saved trace by @Meraj-08 in #117
- fix(store): reconcile metrics for updated spans by @Webghost01-NG in #122
- fix(engine): let span selector status ok match unset OTLP spans by @Meraj-08 in #126
- fix(checks): ignore JSON key order when tool-cycle compares results by @cipoklean in #129
- docs: correct workspace validation commands by @CompleteDotTech in #162
- fix(ingest): start an untimed /v1/trace parent at its first child by @cipoklean in #143
- fix(search): treat URLs and host:port in a search as text by @cipoklean in #145
- fix(mcp): count error and interrupted runs in list_projects' failed tally by @isHeSatoshi in #155
- fix(server): clamp bad search and chat query params instead of returning nothing by @isHeSatoshi in #160
- fix(steering): emit finding on roots.bus when note claim activates it by @Meraj-08 in #133
- test(steering): make the gate debounce test independent of machine speed by @Meraj-08 in #134
- fix(connect): keep a config file's permissions and symlink when adding the MCP entry by @AyushVUpadhye in #148
- fix(checks): save an edited check back to the file it came from by @AyushVUpadhye in #151
- fix(checks): let match rules read strings nested in a field, like MCP… by @cipoklean in #121
- docs: clarify example runner coverage by @CompleteDotTech in #169
- fix(search): match tool: and model: in any case when there's no text by @cipoklean in #200
- fix(semantics): treat developer-role messages as the system prompt by @isHeSatoshi in #166
- fix(settings): refuse a bad request before changing anything by @PugarHuda in #191
- fix(steer): reach stream, parse and with_options in wrap by @isHeSatoshi in #168
- fix(steer): preserve OpenAI structured-output parse helpers by @Nitish-1303 in #257
- fix(engine): don't judge a question over span ids the run doesn't have by @cipoklean in #178
- fix(engine): preview a check only on runs its a...
neatroots v0.2.8
0.2.8 hardens neatroots against bad input, from the team's review (#3, #4, #8, #11–#14):
- Retention can't empty the store.
retention.days: 0(or an invalid value) in config.yaml used to delete every unpinned run at startup and every hour. Bad values now fall back to the default. - One odd trace can't break a run. Spans whose parents point at each other used to crash the conversation view; every span now shows once, including the ones in the loop.
- Spans that haven't ended say so. An OTLP end time of 0 used to show as an instant success, and an end before the start gave a negative duration. Such spans now read "not ended", and a run whose root hasn't ended stays running.
- Exporters get an error instead of silent loss. OTLP JSON whose
scopeSpansorspansisn't a list used to answer 200 and drop the data; it's now a 400. - Clear errors for bad requests. API bodies that aren't a JSON object, and bad
limit/offseton the runs list, answer 400 with a message instead of a 500 or every run. A choice check whoseflag_onisn't one of its options is rejected when you save it.
0.2.7 makes findings fewer and more honest, from the team's first round of testing:
- Rules about order are judged against what already happened. A question about one LLM call now sees the tool calls made earlier in the run and that call's latest messages, so a healthy "plan, then search, then inspect" run no longer reads as "skipped the plan". A new sample (
long-request) covers this: 0.2.5 flagged it; 0.2.7 doesn't. - No more "100% sure". An LLM's confidence in its own answer isn't calibrated, so LLM answers top out at 90% and the run page says "Very likely (LLM judgment)" instead of a number. Laya and Jev keep their percentages.
- A second look before raising. Before a question raises a finding, the LLM must quote the words in the run that show the problem; the quote has to be there, and the problem has to hold given what the run did earlier. The run page shows the quote.
- One problem per incident. One retry loop used to show as three problems (repeated call, errors in a row, repeating without progress). Checks now share a group and show as one problem with "Also matched", and counts on Runs, Home and the run page count it once. A question about single calls raises at most one finding per run.
- Checks you keep dismissing go quiet. After 3 dismissals in a project, a check's findings are still recorded but no longer count, send notes or show on Home. Reopen one to count it again.
neatroots doctorreports what the running server uses, and says when a hosted-LLM key is only in the server's environment (it used to report the key and decision model as missing).
0.2.6 asks before downloading Laya:
- Laya is opt-in. Laya, the local model that answers neatroots' yes/no checks, is a one-time download of about 1.4 GB. The installer,
neatroots startand the app now say what it's for and ask first. Say no and set up Jev cloud instead (neatroots jev login && neatroots jev on, with a TypeSafe API key); until one of them is set up, your LLM answers, more slowly. Unattended installs:--laya/--no-laya(orNEATROOTS_LAYA=yes|no). Change your mind withneatroots laya installor Settings → Decision model. Updates don't ask again, and an installed Laya keeps working. - Home has a "Choose how checks get answered" setup step; Settings → Decision model has Skip Laya and Download Laya.
- Coding-agent chats no longer stay on "working…" when the reply arrives just before the agent exits.
- Settings fits a narrow window with no sideways scrolling.
- The browser tab icon is the app's sapling.
0.2.5 fixes everything the launch readiness test found:
- Coding-agent chat no longer blanks the app. In some browsers, sending a message or leaving a chat crashed the whole page. Any page error now stays on that page, and the sidebar keeps working.
- Restarts don't lose check work. Checks that were queued when neatroots stopped or crashed finish when it starts again, without re-asking questions that already have answers.
- No false "all clear". A run shows how many of its questions were answered. It says "Only rules checked this run" when no model was available, instead of a green "Nothing found".
- Checks written from a sentence can see what they ask about. A check about what the agent said looks at the agent's final answer. The editor warns when a check can't see what it asks about, and offers Cancel draft and Cancel preview.
- Search finds text deep in long outputs. It now covers the first 150,000 and last 50,000 characters of every input and output.
- Better diagnosis. Answers that contradict the tools and personal data in the answer are checked on every agent that uses tools. On the samples with a local gemma4 model, 7 of 7 now raise what they should, with nothing unrelated.
examples/samples/score.pymeasures this on your own machine. - Chat sessions read correctly. Each turn is titled by its own request, and earlier turns show up as history.
- Agent handoffs show their tool calls. When the SDK didn't record a tool call (OpenAI Agents handoffs), the Overview reads it from the tool that ran.
- Faster where you're waiting. Anything you ask for goes ahead of background checks.
- Examples work on any port. The full example suite was verified on non-default ports.
- The installed guide's links all work. Packaging now fails on a broken link.
- Updating tells you when an older neatroots is still running in a terminal.
The first public release of neatroots: see, check and replay your AI agent's runs on your own machine while you build it.
curl -fsSL https://raw.githubusercontent.com/neatlogs/neatroots/main/install.sh | sh
neatroots start # http://localhost:4100Trying it out? The tester guide is a 45-minute session, and the tester report is how to tell us how it went.
What's in it
- Every way to send runs. The Neatlogs SDKs (Python, TypeScript, Go, Browser), the Neatlogs HTTP trace API (
POST /v1/trace), and OpenTelemetry over OTLP HTTP or gRPC (port 4317), reading Neatlogs, OpenInference, OpenLLMetry, GenAI and Vercel AI SDK attributes. - Imports. Trace files (OTLP JSON, Neatlogs exports, Neatlogs HTTP traces), and production traces from your Neatlogs Cloud project with a service-account token, from the app (Add data) or
neatroots import. - Four views of a run. An Overview that reads like a chat, with sub-agents you can open; the Trace tree; a Timeline; and the Conversation across a session.
- Replay and fork. Re-run one LLM call with an edited message, model or system prompt (no agent needed), or re-run the whole agent from the app (
neatroots rerun add). Edit a user message in the Overview to fork the run. - Search. Full-text across every span, with
project:status:kind:tool:model:check:session:has:problemssince:filters. ⌘K from anywhere. - Coding agents. 23 MCP tools (new:
show_in_ui,get_span_context,search_in_run,get_conversation,compare_runs,list_projects,query_sql,replay,list_cloud_traces,import_cloud_trace), set up byneatroots connectfor Claude Code, Codex, Cursor, OpenCode, Windsurf, Amp, Gemini CLI, VS Code and Claude Desktop. Or chat with Claude Code and Codex inside the app. - Runs without API keys.
neatroots mock-llmis a predictable OpenAI- and Anthropic-compatible LLM. 15 examples ship in the bundle (~/.neatroots/app/examples): OpenAI, Anthropic, LangGraph, OpenAI Agents SDK, sub-agents, sessions, replay, plain OpenTelemetry, TypeScript, Vercel AI SDK, the HTTP API, a browser page, trace files, steering, and seven failure scenarios. - Settings rebuilt on the Neatlogs app's settings frame.
- The personal-data question runs on every agent that uses tools, alongside ignored tool errors and followed injected instructions.
- Tested. 103 server tests, 50 Playwright end-to-end tests against a real server, and every example, in CI.
Upgrading from v0.1.0-rc.1 (Neatlogs Bolt)
Run the installer again. It stops the old neatbolt background service (and runs neatroots at login instead), removes the neatbolt command, and keeps using your runs, settings and Laya in ~/.neatbolt or ~/.bolts. Stored keys are found under their old names, and neatroots connect replaces the old neatbolt entries in your coding agents. (Fixed in 0.2.3: earlier 0.2 releases started with an empty home instead.)
Known limits
- Laya, the local decision model, is still learning; the LLM answers each question until Laya earns it. Probabilities are not yet calibrated against human labels.
- The steering and replay hooks install from
~/.neatroots/app/steeruntil they are published to PyPI and npm. - Windows only through WSL.
neatroots v0.2.7
0.2.7 makes findings fewer and more honest, from the team's first round of testing:
- Rules about order are judged against what already happened. A question about one LLM call now sees the tool calls made earlier in the run and that call's latest messages, so a healthy "plan, then search, then inspect" run no longer reads as "skipped the plan". A new sample (
long-request) covers this: 0.2.5 flagged it; 0.2.7 doesn't. - No more "100% sure". An LLM's confidence in its own answer isn't calibrated, so LLM answers top out at 90% and the run page says "Very likely (LLM judgment)" instead of a number. Laya and Jev keep their percentages.
- A second look before raising. Before a question raises a finding, the LLM must quote the words in the run that show the problem; the quote has to be there, and the problem has to hold given what the run did earlier. The run page shows the quote.
- One problem per incident. One retry loop used to show as three problems (repeated call, errors in a row, repeating without progress). Checks now share a group and show as one problem with "Also matched", and counts on Runs, Home and the run page count it once. A question about single calls raises at most one finding per run.
- Checks you keep dismissing go quiet. After 3 dismissals in a project, a check's findings are still recorded but no longer count, send notes or show on Home. Reopen one to count it again.
neatroots doctorreports what the running server uses, and says when a hosted-LLM key is only in the server's environment (it used to report the key and decision model as missing).
0.2.6 asks before downloading Laya:
- Laya is opt-in. Laya, the local model that answers neatroots' yes/no checks, is a one-time download of about 1.4 GB. The installer,
neatroots startand the app now say what it's for and ask first. Say no and set up Jev cloud instead (neatroots jev login && neatroots jev on, with a TypeSafe API key); until one of them is set up, your LLM answers, more slowly. Unattended installs:--laya/--no-laya(orNEATROOTS_LAYA=yes|no). Change your mind withneatroots laya installor Settings → Decision model. Updates don't ask again, and an installed Laya keeps working. - Home has a "Choose how checks get answered" setup step; Settings → Decision model has Skip Laya and Download Laya.
- Coding-agent chats no longer stay on "working…" when the reply arrives just before the agent exits.
- Settings fits a narrow window with no sideways scrolling.
- The browser tab icon is the app's sapling.
0.2.5 fixes everything the launch readiness test found:
- Coding-agent chat no longer blanks the app. In some browsers, sending a message or leaving a chat crashed the whole page. Any page error now stays on that page, and the sidebar keeps working.
- Restarts don't lose check work. Checks that were queued when neatroots stopped or crashed finish when it starts again, without re-asking questions that already have answers.
- No false "all clear". A run shows how many of its questions were answered. It says "Only rules checked this run" when no model was available, instead of a green "Nothing found".
- Checks written from a sentence can see what they ask about. A check about what the agent said looks at the agent's final answer. The editor warns when a check can't see what it asks about, and offers Cancel draft and Cancel preview.
- Search finds text deep in long outputs. It now covers the first 150,000 and last 50,000 characters of every input and output.
- Better diagnosis. Answers that contradict the tools and personal data in the answer are checked on every agent that uses tools. On the samples with a local gemma4 model, 7 of 7 now raise what they should, with nothing unrelated.
examples/samples/score.pymeasures this on your own machine. - Chat sessions read correctly. Each turn is titled by its own request, and earlier turns show up as history.
- Agent handoffs show their tool calls. When the SDK didn't record a tool call (OpenAI Agents handoffs), the Overview reads it from the tool that ran.
- Faster where you're waiting. Anything you ask for goes ahead of background checks.
- Examples work on any port. The full example suite was verified on non-default ports.
- The installed guide's links all work. Packaging now fails on a broken link.
- Updating tells you when an older neatroots is still running in a terminal.
The first public release of neatroots: see, check and replay your AI agent's runs on your own machine while you build it.
curl -fsSL https://raw.githubusercontent.com/neatlogs/neatroots/main/install.sh | sh
neatroots start # http://localhost:4100Trying it out? The tester guide is a 45-minute session, and the tester report is how to tell us how it went.
What's in it
- Every way to send runs. The Neatlogs SDKs (Python, TypeScript, Go, Browser), the Neatlogs HTTP trace API (
POST /v1/trace), and OpenTelemetry over OTLP HTTP or gRPC (port 4317), reading Neatlogs, OpenInference, OpenLLMetry, GenAI and Vercel AI SDK attributes. - Imports. Trace files (OTLP JSON, Neatlogs exports, Neatlogs HTTP traces), and production traces from your Neatlogs Cloud project with a service-account token, from the app (Add data) or
neatroots import. - Four views of a run. An Overview that reads like a chat, with sub-agents you can open; the Trace tree; a Timeline; and the Conversation across a session.
- Replay and fork. Re-run one LLM call with an edited message, model or system prompt (no agent needed), or re-run the whole agent from the app (
neatroots rerun add). Edit a user message in the Overview to fork the run. - Search. Full-text across every span, with
project:status:kind:tool:model:check:session:has:problemssince:filters. ⌘K from anywhere. - Coding agents. 23 MCP tools (new:
show_in_ui,get_span_context,search_in_run,get_conversation,compare_runs,list_projects,query_sql,replay,list_cloud_traces,import_cloud_trace), set up byneatroots connectfor Claude Code, Codex, Cursor, OpenCode, Windsurf, Amp, Gemini CLI, VS Code and Claude Desktop. Or chat with Claude Code and Codex inside the app. - Runs without API keys.
neatroots mock-llmis a predictable OpenAI- and Anthropic-compatible LLM. 15 examples ship in the bundle (~/.neatroots/app/examples): OpenAI, Anthropic, LangGraph, OpenAI Agents SDK, sub-agents, sessions, replay, plain OpenTelemetry, TypeScript, Vercel AI SDK, the HTTP API, a browser page, trace files, steering, and seven failure scenarios. - Settings rebuilt on the Neatlogs app's settings frame.
- The personal-data question runs on every agent that uses tools, alongside ignored tool errors and followed injected instructions.
- Tested. 103 server tests, 50 Playwright end-to-end tests against a real server, and every example, in CI.
Upgrading from v0.1.0-rc.1 (Neatlogs Bolt)
Run the installer again. It stops the old neatbolt background service (and runs neatroots at login instead), removes the neatbolt command, and keeps using your runs, settings and Laya in ~/.neatbolt or ~/.bolts. Stored keys are found under their old names, and neatroots connect replaces the old neatbolt entries in your coding agents. (Fixed in 0.2.3: earlier 0.2 releases started with an empty home instead.)
Known limits
- Laya, the local decision model, is still learning; the LLM answers each question until Laya earns it. Probabilities are not yet calibrated against human labels.
- The steering and replay hooks install from
~/.neatroots/app/steeruntil they are published to PyPI and npm. - Windows only through WSL.
neatroots v0.2.6
0.2.6 asks before downloading Laya:
- Laya is opt-in. Laya, the local model that answers neatroots' yes/no checks, is a one-time download of about 1.4 GB. The installer,
neatroots startand the app now say what it's for and ask first. Say no and set up Jev cloud instead (neatroots jev login && neatroots jev on, with a TypeSafe API key); until one of them is set up, your LLM answers, more slowly. Unattended installs:--laya/--no-laya(orNEATROOTS_LAYA=yes|no). Change your mind withneatroots laya installor Settings → Decision model. Updates don't ask again, and an installed Laya keeps working. - Home has a "Choose how checks get answered" setup step; Settings → Decision model has Skip Laya and Download Laya.
- Coding-agent chats no longer stay on "working…" when the reply arrives just before the agent exits.
- Settings fits a narrow window with no sideways scrolling.
- The browser tab icon is the app's sapling.
0.2.5 fixes everything the launch readiness test found:
- Coding-agent chat no longer blanks the app. In some browsers, sending a message or leaving a chat crashed the whole page. Any page error now stays on that page, and the sidebar keeps working.
- Restarts don't lose check work. Checks that were queued when neatroots stopped or crashed finish when it starts again, without re-asking questions that already have answers.
- No false "all clear". A run shows how many of its questions were answered. It says "Only rules checked this run" when no model was available, instead of a green "Nothing found".
- Checks written from a sentence can see what they ask about. A check about what the agent said looks at the agent's final answer. The editor warns when a check can't see what it asks about, and offers Cancel draft and Cancel preview.
- Search finds text deep in long outputs. It now covers the first 150,000 and last 50,000 characters of every input and output.
- Better diagnosis. Answers that contradict the tools and personal data in the answer are checked on every agent that uses tools. On the samples with a local gemma4 model, 7 of 7 now raise what they should, with nothing unrelated.
examples/samples/score.pymeasures this on your own machine. - Chat sessions read correctly. Each turn is titled by its own request, and earlier turns show up as history.
- Agent handoffs show their tool calls. When the SDK didn't record a tool call (OpenAI Agents handoffs), the Overview reads it from the tool that ran.
- Faster where you're waiting. Anything you ask for goes ahead of background checks.
- Examples work on any port. The full example suite was verified on non-default ports.
- The installed guide's links all work. Packaging now fails on a broken link.
- Updating tells you when an older neatroots is still running in a terminal.
The first public release of neatroots: see, check and replay your AI agent's runs on your own machine while you build it.
curl -fsSL https://raw.githubusercontent.com/neatlogs/neatroots/main/install.sh | sh
neatroots start # http://localhost:4100Trying it out? The tester guide is a 45-minute session, and the tester report is how to tell us how it went.
What's in it
- Every way to send runs. The Neatlogs SDKs (Python, TypeScript, Go, Browser), the Neatlogs HTTP trace API (
POST /v1/trace), and OpenTelemetry over OTLP HTTP or gRPC (port 4317), reading Neatlogs, OpenInference, OpenLLMetry, GenAI and Vercel AI SDK attributes. - Imports. Trace files (OTLP JSON, Neatlogs exports, Neatlogs HTTP traces), and production traces from your Neatlogs Cloud project with a service-account token, from the app (Add data) or
neatroots import. - Four views of a run. An Overview that reads like a chat, with sub-agents you can open; the Trace tree; a Timeline; and the Conversation across a session.
- Replay and fork. Re-run one LLM call with an edited message, model or system prompt (no agent needed), or re-run the whole agent from the app (
neatroots rerun add). Edit a user message in the Overview to fork the run. - Search. Full-text across every span, with
project:status:kind:tool:model:check:session:has:problemssince:filters. ⌘K from anywhere. - Coding agents. 23 MCP tools (new:
show_in_ui,get_span_context,search_in_run,get_conversation,compare_runs,list_projects,query_sql,replay,list_cloud_traces,import_cloud_trace), set up byneatroots connectfor Claude Code, Codex, Cursor, OpenCode, Windsurf, Amp, Gemini CLI, VS Code and Claude Desktop. Or chat with Claude Code and Codex inside the app. - Runs without API keys.
neatroots mock-llmis a predictable OpenAI- and Anthropic-compatible LLM. 15 examples ship in the bundle (~/.neatroots/app/examples): OpenAI, Anthropic, LangGraph, OpenAI Agents SDK, sub-agents, sessions, replay, plain OpenTelemetry, TypeScript, Vercel AI SDK, the HTTP API, a browser page, trace files, steering, and seven failure scenarios. - Settings rebuilt on the Neatlogs app's settings frame.
- The personal-data question runs on every agent that uses tools, alongside ignored tool errors and followed injected instructions.
- Tested. 89 server tests, 49 Playwright end-to-end tests against a real server, and every example, in CI.
Upgrading from v0.1.0-rc.1 (Neatlogs Bolt)
Run the installer again. It stops the old neatbolt background service (and runs neatroots at login instead), removes the neatbolt command, and keeps using your runs, settings and Laya in ~/.neatbolt or ~/.bolts. Stored keys are found under their old names, and neatroots connect replaces the old neatbolt entries in your coding agents. (Fixed in 0.2.3: earlier 0.2 releases started with an empty home instead.)
Known limits
- Laya, the local decision model, is still learning; the LLM answers each question until Laya earns it. Probabilities are not yet calibrated against human labels.
- The steering and replay hooks install from
~/.neatroots/app/steeruntil they are published to PyPI and npm. - Windows only through WSL.
neatroots v0.2.5
0.2.5 fixes everything the launch readiness test found:
- Coding-agent chat no longer blanks the app. In some browsers, sending a message or leaving a chat crashed the whole page. Any page error now stays on that page, and the sidebar keeps working.
- Restarts don't lose check work. Checks that were queued when neatroots stopped or crashed finish when it starts again, without re-asking questions that already have answers.
- No false "all clear". A run shows how many of its questions were answered. It says "Only rules checked this run" when no model was available, instead of a green "Nothing found".
- Checks written from a sentence can see what they ask about. A check about what the agent said looks at the agent's final answer. The editor warns when a check can't see what it asks about, and offers Cancel draft and Cancel preview.
- Search finds text deep in long outputs. It now covers the first 150,000 and last 50,000 characters of every input and output.
- Better diagnosis. Answers that contradict the tools and personal data in the answer are checked on every agent that uses tools. On the samples with a local gemma4 model, 7 of 7 now raise what they should, with nothing unrelated.
examples/samples/score.pymeasures this on your own machine. - Chat sessions read correctly. Each turn is titled by its own request, and earlier turns show up as history.
- Agent handoffs show their tool calls. When the SDK didn't record a tool call (OpenAI Agents handoffs), the Overview reads it from the tool that ran.
- Faster where you're waiting. Anything you ask for goes ahead of background checks.
- Examples work on any port. The full example suite was verified on non-default ports.
- The installed guide's links all work. Packaging now fails on a broken link.
- Updating tells you when an older neatroots is still running in a terminal.
The first public release of neatroots: see, check and replay your AI agent's runs on your own machine while you build it.
curl -fsSL https://raw.githubusercontent.com/neatlogs/neatroots/main/install.sh | sh
neatroots start # http://localhost:4100Trying it out? The tester guide is a 45-minute session, and the tester report is how to tell us how it went.
What's in it
- Every way to send runs. The Neatlogs SDKs (Python, TypeScript, Go, Browser), the Neatlogs HTTP trace API (
POST /v1/trace), and OpenTelemetry over OTLP HTTP or gRPC (port 4317), reading Neatlogs, OpenInference, OpenLLMetry, GenAI and Vercel AI SDK attributes. - Imports. Trace files (OTLP JSON, Neatlogs exports, Neatlogs HTTP traces), and production traces from your Neatlogs Cloud project with a service-account token, from the app (Add data) or
neatroots import. - Four views of a run. An Overview that reads like a chat, with sub-agents you can open; the Trace tree; a Timeline; and the Conversation across a session.
- Replay and fork. Re-run one LLM call with an edited message, model or system prompt (no agent needed), or re-run the whole agent from the app (
neatroots rerun add). Edit a user message in the Overview to fork the run. - Search. Full-text across every span, with
project:status:kind:tool:model:check:session:has:problemssince:filters. ⌘K from anywhere. - Coding agents. 23 MCP tools (new:
show_in_ui,get_span_context,search_in_run,get_conversation,compare_runs,list_projects,query_sql,replay,list_cloud_traces,import_cloud_trace), set up byneatroots connectfor Claude Code, Codex, Cursor, OpenCode, Windsurf, Amp, Gemini CLI, VS Code and Claude Desktop. Or chat with Claude Code and Codex inside the app. - Runs without API keys.
neatroots mock-llmis a predictable OpenAI- and Anthropic-compatible LLM. 15 examples ship in the bundle (~/.neatroots/app/examples): OpenAI, Anthropic, LangGraph, OpenAI Agents SDK, sub-agents, sessions, replay, plain OpenTelemetry, TypeScript, Vercel AI SDK, the HTTP API, a browser page, trace files, steering, and seven failure scenarios. - Settings rebuilt on the Neatlogs app's settings frame.
- The personal-data question runs on every agent that uses tools, alongside ignored tool errors and followed injected instructions.
- Tested. 73 server tests, 44 Playwright end-to-end tests against a real server, and every example, in CI.
Upgrading from v0.1.0-rc.1 (Neatlogs Bolt)
Run the installer again. It stops the old neatbolt background service (and runs neatroots at login instead), removes the neatbolt command, and keeps using your runs, settings and Laya in ~/.neatbolt or ~/.bolts. Stored keys are found under their old names, and neatroots connect replaces the old neatbolt entries in your coding agents. (Fixed in 0.2.3: earlier 0.2 releases started with an empty home instead.)
Known limits
- Laya, the local decision model, is still learning; the LLM answers each question until Laya earns it. Probabilities are not yet calibrated against human labels.
- The steering and replay hooks install from
~/.neatroots/app/steeruntil they are published to PyPI and npm. - Windows only through WSL.
neatroots v0.2.4
0.2.4 fixes what testers hit first:
- Codex in the app. neatroots finds Codex and Claude Code beyond your PATH, including the Codex inside the ChatGPT app. The Coding agents page also lists your other connected agents (Cursor, VS Code, Claude Desktop, Gemini CLI, OpenCode) with a way to open each.
- Clear sign-in errors. When Claude Code or Codex can't sign in (an expired login, or an expired AWS session on Bedrock), the chat says what to do.
- Neatlogs Cloud import now uses a service-account token (
neatroots cloud token, or Settings → Neatlogs Cloud) and a project you choose, as the public API requires. The project API key still sends runs. neatroots updatetells you when an older neatroots is still running in a terminal.
The first public release of neatroots: see, check and replay your AI agent's runs on your own machine while you build it.
curl -fsSL https://raw.githubusercontent.com/neatlogs/neatroots/main/install.sh | sh
neatroots start # http://localhost:4100Trying it out? The tester guide is a 45-minute session, and the tester report is how to tell us how it went.
What's in it
- Every way to send runs. The Neatlogs SDKs (Python, TypeScript, Go, Browser), the Neatlogs HTTP trace API (
POST /v1/trace), and OpenTelemetry over OTLP HTTP or gRPC (port 4317), reading Neatlogs, OpenInference, OpenLLMetry, GenAI and Vercel AI SDK attributes. - Imports. Trace files (OTLP JSON, Neatlogs exports, Neatlogs HTTP traces), and production traces from your Neatlogs Cloud project with a service-account token, from the app (Add data) or
neatroots import. - Four views of a run. An Overview that reads like a chat, with sub-agents you can open; the Trace tree; a Timeline; and the Conversation across a session.
- Replay and fork. Re-run one LLM call with an edited message, model or system prompt (no agent needed), or re-run the whole agent from the app (
neatroots rerun add). Edit a user message in the Overview to fork the run. - Search. Full-text across every span, with
project:status:kind:tool:model:check:session:has:problemssince:filters. ⌘K from anywhere. - Coding agents. 23 MCP tools (new:
show_in_ui,get_span_context,search_in_run,get_conversation,compare_runs,list_projects,query_sql,replay,list_cloud_traces,import_cloud_trace), set up byneatroots connectfor Claude Code, Codex, Cursor, OpenCode, Windsurf, Amp, Gemini CLI, VS Code and Claude Desktop. Or chat with Claude Code and Codex inside the app. - Runs without API keys.
neatroots mock-llmis a predictable OpenAI- and Anthropic-compatible LLM. 15 examples ship in the bundle (~/.neatroots/app/examples): OpenAI, Anthropic, LangGraph, OpenAI Agents SDK, sub-agents, sessions, replay, plain OpenTelemetry, TypeScript, Vercel AI SDK, the HTTP API, a browser page, trace files, steering, and seven failure scenarios. - Settings rebuilt on the Neatlogs app's settings frame.
- The personal-data question runs on every agent that uses tools, alongside ignored tool errors and followed injected instructions.
- Tested. 73 server tests, 44 Playwright end-to-end tests against a real server, and every example, in CI.
Upgrading from v0.1.0-rc.1 (Neatlogs Bolt)
Run the installer again. It stops the old neatbolt background service (and runs neatroots at login instead), removes the neatbolt command, and keeps using your runs, settings and Laya in ~/.neatbolt or ~/.bolts. Stored keys are found under their old names, and neatroots connect replaces the old neatbolt entries in your coding agents. (Fixed in 0.2.3: earlier 0.2 releases started with an empty home instead.)
Known limits
- Laya, the local decision model, is still learning; the LLM answers each question until Laya earns it. Probabilities are not yet calibrated against human labels.
- The steering and replay hooks install from
~/.neatroots/app/steeruntil they are published to PyPI and npm. - Windows only through WSL.
neatroots v0.2.3
The first public release of neatroots: see, check and replay your AI agent's runs on your own machine while you build it.
curl -fsSL https://raw.githubusercontent.com/neatlogs/neatroots/main/install.sh | sh
neatroots start # http://localhost:4100Trying it out? The tester guide is a 45-minute session, and the tester report is how to tell us how it went.
What's in it
- Every way to send runs. The Neatlogs SDKs (Python, TypeScript, Go, Browser), the Neatlogs HTTP trace API (
POST /v1/trace), and OpenTelemetry over OTLP HTTP or gRPC (port 4317), reading Neatlogs, OpenInference, OpenLLMetry, GenAI and Vercel AI SDK attributes. - Imports. Trace files (OTLP JSON, Neatlogs exports, Neatlogs HTTP traces), and production traces from your Neatlogs Cloud project with its key, from the app (Add data) or
neatroots import. - Four views of a run. An Overview that reads like a chat, with sub-agents you can open; the Trace tree; a Timeline; and the Conversation across a session.
- Replay and fork. Re-run one LLM call with an edited message, model or system prompt (no agent needed), or re-run the whole agent from the app (
neatroots rerun add). Edit a user message in the Overview to fork the run. - Search. Full-text across every span, with
project:status:kind:tool:model:check:session:has:problemssince:filters. ⌘K from anywhere. - Coding agents. 23 MCP tools (new:
show_in_ui,get_span_context,search_in_run,get_conversation,compare_runs,list_projects,query_sql,replay,list_cloud_traces,import_cloud_trace), set up byneatroots connectfor Claude Code, Codex, Cursor, OpenCode, Windsurf, Amp, Gemini CLI, VS Code and Claude Desktop. Or chat with Claude Code and Codex inside the app. - Runs without API keys.
neatroots mock-llmis a predictable OpenAI- and Anthropic-compatible LLM. 15 examples ship in the bundle (~/.neatroots/app/examples): OpenAI, Anthropic, LangGraph, OpenAI Agents SDK, sub-agents, sessions, replay, plain OpenTelemetry, TypeScript, Vercel AI SDK, the HTTP API, a browser page, trace files, steering, and seven failure scenarios. - Settings rebuilt on the Neatlogs app's settings frame.
- The personal-data question runs on every agent that uses tools, alongside ignored tool errors and followed injected instructions.
- Tested. 65 server tests, 43 Playwright end-to-end tests against a real server, and every example, in CI.
Upgrading from v0.1.0-rc.1 (Neatlogs Bolt)
Run the installer again. It stops the old neatbolt background service (and runs neatroots at login instead), removes the neatbolt command, and keeps using your runs, settings and Laya in ~/.neatbolt or ~/.bolts. Stored keys are found under their old names, and neatroots connect replaces the old neatbolt entries in your coding agents. (Fixed in 0.2.3: earlier 0.2 releases started with an empty home instead.)
Known limits
- Laya, the local decision model, is still learning; the LLM answers each question until Laya earns it. Probabilities are not yet calibrated against human labels.
- The steering and replay hooks install from
~/.neatroots/app/steeruntil they are published to PyPI and npm. - Windows only through WSL.
neatroots v0.2.2
The first public release of neatroots: see, check and replay your AI agent's runs on your own machine while you build it.
curl -fsSL https://raw.githubusercontent.com/neatlogs/neatroots/main/install.sh | sh
neatroots start # http://localhost:4100Trying it out? The tester guide is a 45-minute session, and the tester report is how to tell us how it went.
What's in it
- Every way to send runs. The Neatlogs SDKs (Python, TypeScript, Go, Browser), the Neatlogs HTTP trace API (
POST /v1/trace), and OpenTelemetry over OTLP HTTP or gRPC (port 4317), reading Neatlogs, OpenInference, OpenLLMetry, GenAI and Vercel AI SDK attributes. - Imports. Trace files (OTLP JSON, Neatlogs exports, Neatlogs HTTP traces), and production traces from your Neatlogs Cloud project with its key, from the app (Add data) or
neatroots import. - Four views of a run. An Overview that reads like a chat, with sub-agents you can open; the Trace tree; a Timeline; and the Conversation across a session.
- Replay and fork. Re-run one LLM call with an edited message, model or system prompt (no agent needed), or re-run the whole agent from the app (
neatroots rerun add). Edit a user message in the Overview to fork the run. - Search. Full-text across every span, with
project:status:kind:tool:model:check:session:has:problemssince:filters. ⌘K from anywhere. - Coding agents. 23 MCP tools (new:
show_in_ui,get_span_context,search_in_run,get_conversation,compare_runs,list_projects,query_sql,replay,list_cloud_traces,import_cloud_trace), set up byneatroots connectfor Claude Code, Codex, Cursor, OpenCode, Windsurf, Amp, Gemini CLI, VS Code and Claude Desktop. Or chat with Claude Code and Codex inside the app. - Runs without API keys.
neatroots mock-llmis a predictable OpenAI- and Anthropic-compatible LLM. 15 examples ship in the bundle (~/.neatroots/app/examples): OpenAI, Anthropic, LangGraph, OpenAI Agents SDK, sub-agents, sessions, replay, plain OpenTelemetry, TypeScript, Vercel AI SDK, the HTTP API, a browser page, trace files, steering, and seven failure scenarios. - Settings rebuilt on the Neatlogs app's settings frame.
- The personal-data question runs on every agent that uses tools, alongside ignored tool errors and followed injected instructions.
- Tested. 65 server tests, 43 Playwright end-to-end tests against a real server, and every example, in CI.
Upgrading from v0.1.0-rc.1 (Neatlogs Bolt)
Run the installer again. Your runs and settings in ~/.neatbolt or ~/.bolts are picked up, stored keys are found under their old names, and neatroots connect replaces the old neatbolt entries in your coding agents.
Known limits
- Laya, the local decision model, is still learning; the LLM answers each question until Laya earns it. Probabilities are not yet calibrated against human labels.
- The steering and replay hooks install from
~/.neatroots/app/steeruntil they are published to PyPI and npm. - Windows only through WSL.