<?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: Arthur031221</title>
    <description>The latest articles on DEV Community by Arthur031221 (@arthur031221).</description>
    <link>https://dev.to/arthur031221</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%2F4152010%2Fdc59e799-61f4-4c44-aa6a-204b14048265.jpeg</url>
      <title>DEV Community: Arthur031221</title>
      <link>https://dev.to/arthur031221</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/arthur031221"/>
    <language>en</language>
    <item>
      <title>I tested my Docling JSON checker against real documents and found my own bug</title>
      <dc:creator>Arthur031221</dc:creator>
      <pubDate>Thu, 01 Oct 2026 06:07:03 +0000</pubDate>
      <link>https://dev.to/arthur031221/i-tested-my-docling-json-checker-against-real-documents-and-found-my-own-bug-pif</link>
      <guid>https://dev.to/arthur031221/i-tested-my-docling-json-checker-against-real-documents-and-found-my-own-bug-pif</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqn83rrd2l0pqujek6fc8.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqn83rrd2l0pqujek6fc8.gif" alt="docling-guard command line demo" width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Docling turns a PDF, DOCX, or scanned page into a structured JSON document. Two open issues against the project caught my attention: one where a text item's source span runs past the end of its own text after dehyphenation, another where a table cell's content bleeds into the column next to it. In both cases the conversion still returns a valid JSON file, so nothing downstream raises an error. A search index or a RAG pipeline just gets a quietly wrong chunk.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;docling-guard is a small Python CLI with no dependencies. It reads a Docling JSON export and checks two things: that every provenance span fits inside the text it claims to describe, and that table cells do not collide or overlap on the page grid. A second command, compare, diffs two exports and reports any drop in text or table count after a Docling upgrade. It does not run OCR or load model weights, it only inspects the JSON Docling already produced.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing it for real
&lt;/h2&gt;

&lt;p&gt;The first release shipped with one synthetic fixture, a short document built by hand to demonstrate the checks. That proves the code runs, not that the checks are useful on real documents.&lt;/p&gt;

&lt;p&gt;This week I ran it against the 15 real Docling exports in Docling's own test suite: arXiv papers, a German newspaper interview, a technical handbook, right-to-left documents, and tables. It reported errors in 9 of 15 documents, which looked alarming until I read the findings closely.&lt;/p&gt;

&lt;p&gt;Almost all were the same false positive. Docling strips list markers like "b." from a text item's visible text field but keeps the full string, markers included, in a separate orig field. The provenance span is measured against orig, not text. My checker compared it against text, so nearly every enumerated list item in the corpus tripped the check.&lt;/p&gt;

&lt;p&gt;Fixing that dropped the count from 9 documents to 3. Those 3 show a different, real pattern: a multi-part text item whose combined span runs 2 characters past its own text, the exact dehyphenation overshoot described in the issue that got me started on this.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is in the repo now
&lt;/h2&gt;

&lt;p&gt;The three fixtures that caught the bug are committed under tests/data/real/, with source and license noted in SOURCES.md. A script, measure_real_documents.sh, reproduces the full 15-document count. The README now states the real numbers instead of only the synthetic one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is rough
&lt;/h2&gt;

&lt;p&gt;It only checks the shape Docling exports today: a texts array and a tables array with the fields this version of Docling uses. A large export, over 64 MiB, is rejected outright rather than streamed. And the table overlap check only compares horizontal coordinates, so it can warn on a legitimate unusual layout.&lt;/p&gt;

&lt;p&gt;docling-guard is MIT licensed and free to use.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Arthur031221/docling-guard" rel="noopener noreferrer"&gt;https://github.com/Arthur031221/docling-guard&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>rag</category>
      <category>docling</category>
    </item>
    <item>
      <title>cardsmith: offline flashcards from your own PDFs, checked against the source</title>
      <dc:creator>Arthur031221</dc:creator>
      <pubDate>Thu, 01 Oct 2026 00:07:02 +0000</pubDate>
      <link>https://dev.to/arthur031221/cardsmith-offline-flashcards-from-your-own-pdfs-checked-against-the-source-1709</link>
      <guid>https://dev.to/arthur031221/cardsmith-offline-flashcards-from-your-own-pdfs-checked-against-the-source-1709</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1jt7qm1qd7mp9fkghyjm.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1jt7qm1qd7mp9fkghyjm.gif" alt="cardsmith: generate a deck from a text file, then study it" width="760" height="486"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I study from long PDFs and slide decks often enough that flashcards would help, but making them by hand from a chapter of reading takes long enough that I usually skip the step and reread instead. Rereading is a weaker way to study than active recall, so I built cardsmith to close that gap.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;Point cardsmith at a PDF, a PPTX, or a plain text file. It splits the document into chunks of roughly 120 to 900 words, sends each chunk to a local model through Ollama, and asks the model to write flashcards using only facts in that chunk. Every card comes back with a verbatim &lt;code&gt;source_quote&lt;/code&gt;, the exact sentence the card is based on.&lt;/p&gt;

&lt;p&gt;That is the part I care most about. Most AI flashcard generators hand you cards with no way to tell whether the model made something up. cardsmith checks whether the quote it returned is an actual substring of the source chunk, and if it is not, the card is flagged in the preview before you save anything. You can still edit or delete any card before it goes into your deck.&lt;/p&gt;

&lt;p&gt;Cards live in a local SQLite database with a plain SM-2 scheduler, the same algorithm Anki started from. Four grade buttons record how well you knew each card and schedule the next review. When you want to study in Anki itself, export to a real &lt;code&gt;.apkg&lt;/code&gt; file with a genanki-built deck.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I measured
&lt;/h2&gt;

&lt;p&gt;On a 3,248 word public domain biology chapter, cardsmith generated 152 cards in about 13 minutes on a MacBook Air. The mechanical quote check matched 142 of 152 cards to an exact substring of the source text. I then hand rated a 40 card sample against the source and found 37 factually accurate, 1 inaccurate, and 2 unusable, for 92.5 percent accuracy. The full method and raw cards are in the repository's &lt;code&gt;eval&lt;/code&gt; directory.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is rough
&lt;/h2&gt;

&lt;p&gt;Card quality depends on the 4B model I default to, which occasionally paraphrases a quote instead of copying it, which is why the grounding check exists rather than trusting the model's claim. There is no OCR, so a scanned PDF with no text layer will not work without running it through an OCR tool first. It is single user and single machine by design, with no sync and no account.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ollama pull qwen3:4b
uvx --from git+https://github.com/Arthur031221/cardsmith cardsmith
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The repository is at &lt;a href="https://github.com/Arthur031221/cardsmith" rel="noopener noreferrer"&gt;https://github.com/Arthur031221/cardsmith&lt;/a&gt;, MIT licensed. I would welcome feedback, especially on the grounding check and on what would make the accuracy number more trustworthy.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>showdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>Ollama silently truncated my context window. A scanner for local LLM setups</title>
      <dc:creator>Arthur031221</dc:creator>
      <pubDate>Wed, 30 Sep 2026 19:53:14 +0000</pubDate>
      <link>https://dev.to/arthur031221/ollama-silently-truncated-my-context-window-a-scanner-for-local-llm-setups-2085</link>
      <guid>https://dev.to/arthur031221/ollama-silently-truncated-my-context-window-a-scanner-for-local-llm-setups-2085</guid>
      <description>&lt;p&gt;On my MacBook Air, Ollama 0.34.4 served qwen3:1.7b with a 4,096-token window. The model supports 40,960. I sent a 7,000-token prompt and got HTTP 200 back, but the model had only seen the last 2,050 tokens. There was no error and no warning.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frdiv0cx9tkanflevclxy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frdiv0cx9tkanflevclxy.gif" alt="llm-doctor finding duplicate weights and orphan blobs, then fixing them" width="800" height="519"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That was the start of llm-doctor, a health check for local LLM setups.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problems it looks for
&lt;/h2&gt;

&lt;p&gt;Running models locally leaves a lot of quiet mess behind.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every runtime keeps its own copy of the same GGUF. Ollama hides it behind a sha256 blob name, so you cannot see that LM Studio holds the same 20 GB file.&lt;/li&gt;
&lt;li&gt;Quantizers fix chat templates after release, and your old download keeps the broken one. Tool calls then fail in ways that look like the model being bad.&lt;/li&gt;
&lt;li&gt;Ollama defaults to a small context window, and the OpenAI-compatible endpoint that coding agents use cannot raise it per request.&lt;/li&gt;
&lt;li&gt;Leaving Ollama means downloading everything again, because its blobs have no names.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Using it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv tool &lt;span class="nb"&gt;install &lt;/span&gt;git+https://github.com/Arthur031221/llm-doctor

llm-doctor                                   &lt;span class="c"&gt;# scan every model store&lt;/span&gt;
llm-doctor fix                               &lt;span class="c"&gt;# preview dedupe and cleanup&lt;/span&gt;
llm-doctor fix &lt;span class="nt"&gt;--yes&lt;/span&gt;                         &lt;span class="c"&gt;# apply it&lt;/span&gt;
llm-doctor unbundle &lt;span class="nt"&gt;--to&lt;/span&gt; llama-server        &lt;span class="c"&gt;# expose Ollama models to llama.cpp&lt;/span&gt;
llm-doctor endpoint http://localhost:11434   &lt;span class="c"&gt;# agent-readiness probe&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The GIF above runs against a throwaway home directory where Ollama and LM Studio hold the same GGUF, plus one orphan blob. The scan reports both, and &lt;code&gt;fix --yes&lt;/code&gt; replaces the LM Studio copy with a symlink to the Ollama blob and deletes the orphan. The demo fixture reclaims 140 MB, and every change is logged to &lt;code&gt;~/.llm-doctor/fix-log.jsonl&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The endpoint probe is the part I use most. It checks context length, tool calls, parallel tool calls, streaming tool calls, JSON schema output and think tags, then prints what to change for each failure. For the Ollama case above it reported 4,096 effective tokens of 40,960 advertised and marked the context check as failed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits
&lt;/h2&gt;

&lt;p&gt;It needs Python 3.10 or newer. It is not on PyPI yet, so install from GitHub as shown. I tested mostly on macOS with Ollama, so Linux and Windows reports are the most useful feedback I can get. If you run a store or runtime it does not detect, open an issue with the folder layout.&lt;/p&gt;

&lt;p&gt;The code is at &lt;a href="https://github.com/Arthur031221/llm-doctor" rel="noopener noreferrer"&gt;https://github.com/Arthur031221/llm-doctor&lt;/a&gt; under the MIT license.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>showdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>Eleven model snapshots retire on October 23. Find them in your repo before your users do</title>
      <dc:creator>Arthur031221</dc:creator>
      <pubDate>Wed, 30 Sep 2026 15:07:02 +0000</pubDate>
      <link>https://dev.to/arthur031221/eleven-model-snapshots-retire-on-october-23-find-them-in-your-repo-before-your-users-do-3cnf</link>
      <guid>https://dev.to/arthur031221/eleven-model-snapshots-retire-on-october-23-find-them-in-your-repo-before-your-users-do-3cnf</guid>
      <description>&lt;p&gt;OpenAI shuts down eleven model snapshots on 2026-10-23, among them &lt;code&gt;gpt-4-turbo&lt;/code&gt;, &lt;code&gt;gpt-4o-2024-05-13&lt;/code&gt;, &lt;code&gt;o3-mini&lt;/code&gt; and &lt;code&gt;o4-mini&lt;/code&gt;. The GPT-5 and o3 snapshots follow on 2026-12-11. Anthropic and Google retire models on their own schedules too. Most codebases find out when requests start returning 404.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwta0uhozyc85hnvl9tls.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwta0uhozyc85hnvl9tls.gif" alt="modelshift scanning and fixing the bundled sample app" width="800" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding what retires
&lt;/h2&gt;

&lt;p&gt;I wrote modelshift to answer two questions from the terminal. Which model IDs in my repo are going away, and does the replacement still behave the same?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx github:Arthur031221/modelshift scan examples/sample-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The scan walks the repository and lists each model ID with its file and line, its provider, its lifecycle status and the recommended replacement. The status comes from a bundled registry built from the providers' deprecation pages. The exit code is 1 when something retires within the window, so it also works as a CI check.&lt;/p&gt;

&lt;p&gt;I ran it over four popular, unrelated open-source repositories. It found 131 distinct model IDs that are retiring or already retired, referenced 1,649 times across 296 files.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rewriting the IDs
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;modelshift fix examples/sample-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;fix&lt;/code&gt; prints a diff that swaps each ID for its replacement and drops parameters the new model rejects. Claude Opus 4.7 and later, for example, return a 400 when a request sets &lt;code&gt;temperature&lt;/code&gt;, &lt;code&gt;top_p&lt;/code&gt; or &lt;code&gt;top_k&lt;/code&gt;. Add &lt;code&gt;--write&lt;/code&gt; to apply the change, or &lt;code&gt;--pr&lt;/code&gt; to open a pull request.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checking the replacement
&lt;/h2&gt;

&lt;p&gt;Swapping the string is the easy part. The hard part is knowing whether the new model still returns valid JSON, still calls your tools with the same arguments, refuses more often, or takes twice as long.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;modelshift replay &lt;span class="nt"&gt;--from&lt;/span&gt; qwen3:1.7b &lt;span class="nt"&gt;--to&lt;/span&gt; qwen3:4b &lt;span class="nt"&gt;--prompts&lt;/span&gt; demo/prompts.jsonl &lt;span class="nt"&gt;--no-think&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;replay&lt;/code&gt; runs your prompts on both models and compares JSON validity, refusals, tool calls, length, latency and text similarity, then writes an HTML report. It works against any OpenAI-compatible endpoint, including a local Ollama server, so you can try it without API keys. In the bundled example, a weather tool call that the small model made was missing from the larger model's answer, which is the kind of change a string swap would never show.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits
&lt;/h2&gt;

&lt;p&gt;It needs Node 20 or newer and is not on npm yet, so run it with npx from GitHub. The registry is maintained by hand from provider pages, so a wrong date is the most likely bug. If you find one, please open an issue.&lt;/p&gt;

&lt;p&gt;The code is at &lt;a href="https://github.com/Arthur031221/modelshift" rel="noopener noreferrer"&gt;https://github.com/Arthur031221/modelshift&lt;/a&gt; under the MIT license.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>showdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>Your coding agent may have saved your API keys in plain text. Here is how to find and remove them</title>
      <dc:creator>Arthur031221</dc:creator>
      <pubDate>Wed, 30 Sep 2026 10:25:17 +0000</pubDate>
      <link>https://dev.to/arthur031221/your-coding-agent-may-have-saved-your-api-keys-in-plain-text-here-is-how-to-find-and-remove-them-6a9</link>
      <guid>https://dev.to/arthur031221/your-coding-agent-may-have-saved-your-api-keys-in-plain-text-here-is-how-to-find-and-remove-them-6a9</guid>
      <description>&lt;p&gt;Coding agents read &lt;code&gt;.env&lt;/code&gt; files as a matter of course, and the tools write what the agent saw to disk: prompt histories, session transcripts, local databases. An API key that passed through a session can stay there in plain text for months.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fovm0inwhsk2w1inkn0rr.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fovm0inwhsk2w1inkn0rr.gif" alt="agentleaks scanning and redacting a throwaway fixture" width="800" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the keys go
&lt;/h2&gt;

&lt;p&gt;Coding agents read &lt;code&gt;.env&lt;/code&gt; files as a matter of course. Every tool then stores what it saw in its own format. Claude Code writes JSONL files under &lt;code&gt;~/.claude/projects&lt;/code&gt;. Codex uses &lt;code&gt;~/.codex/sessions&lt;/code&gt;. Cursor keeps a SQLite database. Cline, Gemini CLI, OpenCode and Aider each keep their own copy. These files sit there for months, and folder sync and backups copy them around.&lt;/p&gt;

&lt;p&gt;Nothing I found cleaned up what had already leaked, and nothing stopped the next agent from doing the same, so I wrote a tool for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What agentleaks does
&lt;/h2&gt;

&lt;p&gt;It is a single Go binary with three commands.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;scan&lt;/code&gt; walks the history of 13 tools and checks it against 64 rules. The output is a table with the provider, the tool, the file, the line or database record, and a masked preview of the key, so the report itself never prints a full secret.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;agentleaks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;fix&lt;/code&gt; redacts the keys in place. The replacement text contains no quote or backslash, so a JSON string stays a JSON string, and every JSONL record is re-validated after rewriting. SQLite rows are updated in a transaction. The original file is copied to &lt;code&gt;~/.agentleaks/backups&lt;/code&gt; first, and the modification time is preserved so tools that sort sessions by time do not reshuffle.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;agentleaks fix          &lt;span class="c"&gt;# dry run&lt;/span&gt;
agentleaks fix &lt;span class="nt"&gt;--yes&lt;/span&gt;    &lt;span class="c"&gt;# apply&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;guard&lt;/code&gt; installs hooks into the agents' own config so the next read of &lt;code&gt;.env&lt;/code&gt; or &lt;code&gt;~/.aws/credentials&lt;/code&gt; is refused.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;agentleaks guard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The demo above runs against a throwaway home directory with randomly generated fake keys, not real history.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go &lt;span class="nb"&gt;install &lt;/span&gt;github.com/Arthur031221/agentleaks/cmd/agentleaks@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Static binaries for macOS, Linux and Windows are attached to each release on GitHub. There are no runtime dependencies, and nothing leaves your machine unless you run the opt-in &lt;code&gt;verify&lt;/code&gt; command.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is rough
&lt;/h2&gt;

&lt;p&gt;Guard coverage is uneven, because each tool's hook system exposes different events. It also does not scan git history, for which gitleaks and trufflehog are the right tools.&lt;/p&gt;

&lt;p&gt;The code and the rule list are at &lt;a href="https://github.com/Arthur031221/agentleaks" rel="noopener noreferrer"&gt;https://github.com/Arthur031221/agentleaks&lt;/a&gt;. If you use a tool or a key format I do not cover yet, tell me and I will add a rule for it.&lt;/p&gt;

</description>
      <category>security</category>
      <category>ai</category>
      <category>opensource</category>
      <category>go</category>
    </item>
  </channel>
</rss>
