<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Basit Tijani</title>
    <description>The latest articles on DEV Community by Basit Tijani (@tijaniweb).</description>
    <link>https://dev.to/tijaniweb</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4101298%2F1fca3abf-aae4-48e7-a1dd-9d8911958eb2.jpg</url>
      <title>DEV Community: Basit Tijani</title>
      <link>https://dev.to/tijaniweb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tijaniweb"/>
    <language>en</language>
    <item>
      <title>Show HN: Tooltrace – Record and replay LLM tool calls locally (zero dependencies, written in Go)</title>
      <dc:creator>Basit Tijani</dc:creator>
      <pubDate>Sun, 30 Aug 2026 11:21:31 +0000</pubDate>
      <link>https://dev.to/tijaniweb/show-hn-tooltrace-record-and-replay-llm-tool-calls-locally-zero-dependencies-written-in-go-4131</link>
      <guid>https://dev.to/tijaniweb/show-hn-tooltrace-record-and-replay-llm-tool-calls-locally-zero-dependencies-written-in-go-4131</guid>
      <description>&lt;h2&gt;
  
  
  The Problem &amp;amp; The Solution
&lt;/h2&gt;

&lt;p&gt;AI agent frameworks log tool calls inconsistently and rarely validate arguments beforehand, forcing developers to re-run expensive, non-deterministic LLM sessions to debug failures. &lt;code&gt;tooltrace&lt;/code&gt; addresses this by isolating tool execution as a primitive &lt;code&gt;(name, arguments) -&amp;gt; result&lt;/code&gt;, recording the lifecycle to a standard append-only &lt;code&gt;.jsonl&lt;/code&gt; trace file to decouple debugging and testing from specific LLM providers.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repository:&lt;/strong&gt; &lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/tijani-web" rel="noopener noreferrer"&gt;
        tijani-web
      &lt;/a&gt; / &lt;a href="https://github.com/tijani-web/tooltrace" rel="noopener noreferrer"&gt;
        tooltrace
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      tooltrace sits between your LLM agent and the tools it calls. It records every tool invocation to a portable trace file, and lets you replay, validate, diff, and inspect that trace later — without depending on any specific LLM provider, framework, or SDK.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;tooltrace&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://opensource.org/licenses/MIT" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/fdf2982b9f5d7489dcf44570e714e3a15fce6253e0cc6b5aa61a075aac2ff71b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d79656c6c6f772e737667" alt="License: MIT"&gt;&lt;/a&gt;
&lt;a href="https://pkg.go.dev/github.com/ToolTraceHQ/tooltrace/pkg/trace" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/e69bdae54040ba18571d7e80545aee8556636fea3eaa47059851d655a1f60fdd/68747470733a2f2f706b672e676f2e6465762f62616467652f6769746875622e636f6d2f546f6f6c547261636548512f746f6f6c74726163652e737667" alt="Go Reference"&gt;&lt;/a&gt;
&lt;a href="https://goreportcard.com/report/github.com/ToolTraceHQ/tooltrace" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/ffc0ce55ff585e4e7104cae93cd2d726838b79eb9c72e993171f719f9ccc2e07/68747470733a2f2f676f7265706f7274636172642e636f6d2f62616467652f6769746875622e636f6d2f546f6f6c547261636548512f746f6f6c7472616365" alt="Go Report Card"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Record and replay LLM tool calls.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;tooltrace&lt;/code&gt; sits between your LLM agent and the tools it calls. It records every tool invocation to a portable trace file, and lets you replay, validate, diff, and inspect that trace later — without depending on any specific LLM provider, framework, or SDK.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;
⚠️ Security / Privacy Notice&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Trace files record raw tool arguments and results verbatim.&lt;/strong&gt; This means they may capture API keys, auth tokens, passwords, or PII that were passed to or returned by your tools.&lt;/p&gt;
&lt;p&gt;In v1 and v2, there is &lt;strong&gt;no automatic redaction&lt;/strong&gt;. You are fully responsible for securing your trace files:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add &lt;code&gt;*.jsonl&lt;/code&gt; to your &lt;code&gt;.gitignore&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Restrict file permissions in production.&lt;/li&gt;
&lt;li&gt;Do not attach raw trace files to public GitHub issues or share them on Slack without manual scrubbing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Note: Automatic, field-level redaction is on the roadmap for v3.&lt;/em&gt;&lt;/p&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why this exists&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Every agent framework logs…&lt;/p&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/tijani-web/tooltrace" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;

&lt;/li&gt;

&lt;li&gt;
&lt;strong&gt;Tech Stack:&lt;/strong&gt; 100% Go standard library (zero external dependencies).&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Record the Trace (Go Library)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Wrap your agent's tool execution in &lt;code&gt;trace.Record&lt;/code&gt; to manage timing, capture statuses, and append execution data to your session file. For full code implementation details, please refer to the repository.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Replay and Verify (CLI)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Replay recorded traces locally using a &lt;code&gt;mocks.json&lt;/code&gt; file to verify downstream tools without re-invoking the LLM via the CLI replay engine.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Core Philosophy &amp;amp; Design Choices
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Concurrency-Safe:&lt;/strong&gt; Handles concurrent, multi-threaded tool streams natively.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grep-able Contracts:&lt;/strong&gt; Flat, portable &lt;code&gt;.jsonl&lt;/code&gt; schema suited for CLI text processors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Framework Agnostic:&lt;/strong&gt; Works independently of tools like LangChain or LlamaIndex.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;Currently at v1 (Record + Replay), the roadmap includes automatic PII/auth token redaction for v3, JSON Schema validation, and automated diffing states.&lt;/p&gt;




&lt;p&gt;What edge cases or challenges did you run into while implementing the concurrency-safe design in the Go standard library? I'd love to hear your thoughts in the comments below!&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
