<?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>Forem: Mr. 0x1</title>
    <description>The latest articles on Forem by Mr. 0x1 (@copyleftdev).</description>
    <link>https://forem.com/copyleftdev</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F965504%2F11378d5e-5ab1-4d72-9f9e-f4db74d77a54.png</url>
      <title>Forem: Mr. 0x1</title>
      <link>https://forem.com/copyleftdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/copyleftdev"/>
    <language>en</language>
    <item>
      <title>We Ran Four Security Tools Against Express.js. They Found Each Other's Proof.</title>
      <dc:creator>Mr. 0x1</dc:creator>
      <pubDate>Sun, 12 Apr 2026 21:44:53 +0000</pubDate>
      <link>https://forem.com/copyleftdev/we-ran-four-security-tools-against-expressjs-they-found-each-others-proof-34ah</link>
      <guid>https://forem.com/copyleftdev/we-ran-four-security-tools-against-expressjs-they-found-each-others-proof-34ah</guid>
      <description>&lt;p&gt;When you run a single security scanner against a codebase, you get a list. When you run four different tools — each operating at a different layer of the problem — you get something else entirely. You get corroboration. Findings from one tool explain findings from another. Patterns that look like noise in isolation become signal when you see them converge from different angles.&lt;/p&gt;

&lt;p&gt;We pointed a four-layer security analysis stack at Express.js — the most depended-upon web framework in Node.js, roughly 30 million weekly downloads — and ran the full audit in under fifteen minutes.&lt;/p&gt;

&lt;p&gt;The tools found what the community is actively reporting right now. Not retroactively, not after reading the issues. The tools surfaced the vulnerabilities first, and when we checked GitHub afterward, the issues were already there — some filed days ago, one still unpatched after two and a half years.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Stack
&lt;/h2&gt;

&lt;p&gt;Four layers. Each does one thing well. The value is in the correlation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/copyleftdev/vulngraph" rel="noopener noreferrer"&gt;VulnGraph MCP&lt;/a&gt;&lt;/strong&gt; — a graph database with 469,942 nodes aggregating 9 vulnerability intelligence sources (CVE List V5, EPSS, CISA KEV, ExploitDB, PoC-in-GitHub, Nuclei, MITRE ATT&amp;amp;CK, OSV, CWE). Exposed as an MCP server — 16 tools, sub-millisecond queries, zero network calls. This is the threat intelligence layer. It answers: &lt;em&gt;what is known about this vulnerability, how likely is it to be exploited, and who is exploiting it?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/semgrep/semgrep" rel="noopener noreferrer"&gt;Semgrep&lt;/a&gt;&lt;/strong&gt; — static application security testing. Pattern-matching against source code for known vulnerability classes. This is the code-level layer. It answers: &lt;em&gt;does this codebase contain code patterns that match known vulnerability categories?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/copyleftdev/zentinel" rel="noopener noreferrer"&gt;Zentinel&lt;/a&gt;&lt;/strong&gt; — static analysis with security-focused rule sets for language-specific and universal patterns. This is the pattern detection layer. It answers: &lt;em&gt;what code constructs in this codebase deviate from security best practices?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vajra&lt;/strong&gt; — deterministic structural analysis. Inspects project manifests, dependency trees, and data shapes for anomalies. This is the project health layer. It answers: &lt;em&gt;what does the structure of this project tell us about its risk profile?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We ran all four against Express.js v5.2.1. 141 JavaScript files, 28 direct dependencies, 386 transitive dependencies. The entire experiment — from cold data refresh to validated findings correlated against live GitHub issues — took under fifteen minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Each Tool Found
&lt;/h2&gt;

&lt;h3&gt;
  
  
  VulnGraph MCP: The Dependency Intelligence
&lt;/h3&gt;

&lt;p&gt;We queried VulnGraph for every known CVE affecting Express and its core dependency chain. Six CVEs came back with full enrichment:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CVE&lt;/th&gt;
&lt;th&gt;Package&lt;/th&gt;
&lt;th&gt;CVSS&lt;/th&gt;
&lt;th&gt;EPSS&lt;/th&gt;
&lt;th&gt;Maturity&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2022-24999&lt;/td&gt;
&lt;td&gt;qs&lt;/td&gt;
&lt;td&gt;7.5&lt;/td&gt;
&lt;td&gt;1.54%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;POC&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2024-47764&lt;/td&gt;
&lt;td&gt;cookie&lt;/td&gt;
&lt;td&gt;6.9&lt;/td&gt;
&lt;td&gt;0.21%&lt;/td&gt;
&lt;td&gt;NONE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2024-29041&lt;/td&gt;
&lt;td&gt;express&lt;/td&gt;
&lt;td&gt;6.1&lt;/td&gt;
&lt;td&gt;0.11%&lt;/td&gt;
&lt;td&gt;NONE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2024-43796&lt;/td&gt;
&lt;td&gt;express&lt;/td&gt;
&lt;td&gt;5.0&lt;/td&gt;
&lt;td&gt;0.12%&lt;/td&gt;
&lt;td&gt;NONE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2024-43799&lt;/td&gt;
&lt;td&gt;send&lt;/td&gt;
&lt;td&gt;5.0&lt;/td&gt;
&lt;td&gt;0.18%&lt;/td&gt;
&lt;td&gt;NONE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2024-38372&lt;/td&gt;
&lt;td&gt;undici&lt;/td&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;0.22%&lt;/td&gt;
&lt;td&gt;NONE&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;CVE-2022-24999 stands out: prototype pollution in &lt;code&gt;qs&lt;/code&gt; that causes a Node process hang. It has a public proof-of-concept and 1.54% EPSS — roughly a 1 in 65 chance of exploitation in the next 30 days. Express 5.2.1 requires a patched version, but any project pinned to an older qs is exposed.&lt;/p&gt;

&lt;p&gt;VulnGraph also flagged the devDependency chain. Express pulls Handlebars and Mocha (which pulls &lt;code&gt;serialize-javascript&lt;/code&gt;) for its test and example infrastructure. npm audit confirmed: 1 critical against Handlebars (8 advisories including prototype pollution and code injection) and 3 high against serialize-javascript (RCE).&lt;/p&gt;

&lt;p&gt;The EPSS enrichment told a story that CVSS alone would have missed. CVE-2019-19919 — Handlebars prototype pollution leading to RCE — has a CVSS that reads as unscored, but VulnGraph returned an EPSS of &lt;strong&gt;17.8%&lt;/strong&gt;. Nearly 1 in 5 probability of exploitation. That number comes from observed scanning activity, not theoretical severity. It's the difference between "this is bad in theory" and "this is being probed right now."&lt;/p&gt;

&lt;h3&gt;
  
  
  Semgrep: The Code Patterns
&lt;/h3&gt;

&lt;p&gt;53 findings across the codebase. 48 warnings, 5 informational. Every single finding was in the &lt;code&gt;examples/&lt;/code&gt; directory. The core &lt;code&gt;lib/&lt;/code&gt; was clean.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;30 cookie session misconfigurations&lt;/strong&gt; — sessions without &lt;code&gt;httpOnly&lt;/code&gt;, &lt;code&gt;secure&lt;/code&gt;, &lt;code&gt;domain&lt;/code&gt;, &lt;code&gt;path&lt;/code&gt;, or &lt;code&gt;expires&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;6 open redirect vulnerabilities&lt;/strong&gt; — &lt;code&gt;res.redirect(req.body.url)&lt;/code&gt; with no validation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;6 direct response writes&lt;/strong&gt; — &lt;code&gt;res.send(req.params.*)&lt;/code&gt; with no escaping (XSS)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;4 hardcoded secrets&lt;/strong&gt; — &lt;code&gt;secret: 'shhhh'&lt;/code&gt; in session config&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1 template unescape&lt;/strong&gt; — &lt;code&gt;&amp;lt;%- ... %&amp;gt;&lt;/code&gt; in an EJS template&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On its own, you might dismiss this. "It's just example code." But these examples are the most-copied code in the Node.js ecosystem. They show up in tutorials, starter templates, Stack Overflow answers, and AI-generated code suggestions. The patterns map to CWE-601 (open redirect), CWE-79 (XSS), CWE-798 (hardcoded credentials), and CWE-614 (missing secure cookie flags).&lt;/p&gt;

&lt;h3&gt;
  
  
  Zentinel: The Deep Patterns
&lt;/h3&gt;

&lt;p&gt;50 rules loaded across JavaScript security and community rule sets. Zentinel found patterns Semgrep didn't surface — and vice versa.&lt;/p&gt;

&lt;p&gt;The most notable: &lt;strong&gt;40+ instances of &lt;code&gt;undefined&lt;/code&gt; assignment patterns&lt;/strong&gt; across Express's core files (&lt;code&gt;application.js&lt;/code&gt;, &lt;code&gt;response.js&lt;/code&gt;, &lt;code&gt;request.js&lt;/code&gt;). Express uses &lt;code&gt;=== undefined&lt;/code&gt; checks extensively to determine whether settings have been configured — a known antipattern since &lt;code&gt;undefined&lt;/code&gt; isn't a reserved keyword in JavaScript.&lt;/p&gt;

&lt;p&gt;Zentinel also flagged missing CSRF middleware in the example apps and confirmed the hardcoded secret pattern Semgrep independently found. Two tools, different engines, same conclusion.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vajra: The Structural Profile
&lt;/h3&gt;

&lt;p&gt;28 direct dependencies (lean for a framework), Node &amp;gt;= 18 engine requirement (drops legacy attack surface), 7 listed contributors (concentrated maintainership), OpenCollective funding.&lt;/p&gt;

&lt;p&gt;All dependency versions use caret ranges (&lt;code&gt;^&lt;/code&gt;), meaning minor and patch updates are accepted automatically. Double-edged: you get patches quickly, but you inherit any regression from a transitive dependency update.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where It Gets Interesting: The Cross-Layer Correlation
&lt;/h2&gt;

&lt;p&gt;Each tool produced useful findings on its own. The real signal emerged when we cross-referenced the layers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Semgrep's open redirect findings + VulnGraph's CVE-2024-29041.&lt;/strong&gt; Semgrep flagged &lt;code&gt;res.redirect(req.body.url)&lt;/code&gt; in six example files. VulnGraph returned CVE-2024-29041 — an open redirect in Express patched in 4.19.0. The framework fixed the bug, but the examples still demonstrate the unsafe pattern. Developers who copy the examples are reintroducing the exact vulnerability the framework patched.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Semgrep's XSS findings + VulnGraph's CVE-2024-43796.&lt;/strong&gt; Same pattern. Semgrep found direct response writes with user input. VulnGraph returned CVE-2024-43796 — XSS in &lt;code&gt;response.redirect()&lt;/code&gt;, fixed in Express 4.20.0. The fix is in the framework. The vulnerable pattern is still in the examples.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;npm audit's Handlebars critical + VulnGraph's EPSS.&lt;/strong&gt; npm audit said "critical." VulnGraph said 17.8% EPSS. Those are different statements. "Critical" is a theoretical severity rating. 17.8% EPSS means the vulnerability is actively being scanned for in the wild — observed, not theoretical. Without VulnGraph's enrichment, you'd treat this as a devDependency problem and deprioritize it. With the EPSS data, you understand it's a supply chain attack vector against your CI/build pipeline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zentinel's undefined patterns + Express trust proxy behavior.&lt;/strong&gt; The &lt;code&gt;=== undefined&lt;/code&gt; pattern in &lt;code&gt;application.js&lt;/code&gt; is how Express determines whether &lt;code&gt;trust proxy&lt;/code&gt; has been explicitly configured. If it hasn't, Express defaults to not trusting proxies. This interacts directly with CVE-2024-29041's open redirect — the vulnerability depends on how Express resolves the redirect URL, which depends on proxy trust, which depends on a setting checked via the exact pattern Zentinel flagged.&lt;/p&gt;

&lt;p&gt;No single tool produced that chain. It took four.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Validation: Open GitHub Issues
&lt;/h2&gt;

&lt;p&gt;After completing the analysis, we checked whether the open-source community had independently identified the same problems. They had.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/expressjs/express/issues/7140" rel="noopener noreferrer"&gt;expressjs/express#7140&lt;/a&gt; (filed March 30 — 13 days before our audit). &lt;code&gt;View.prototype.lookup()&lt;/code&gt; lacks path containment check. A security-labeled issue reporting that &lt;code&gt;res.render()&lt;/code&gt; with user input allows path traversal — exactly the class of issue our stack identified through the combination of Zentinel's core code analysis and Semgrep's example code findings.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/handlebars-lang/handlebars.js/issues/2146" rel="noopener noreferrer"&gt;handlebars-lang/handlebars.js#2146&lt;/a&gt; (filed April 9 — 3 days before our audit). Proto-access control bypass via &lt;code&gt;Map&lt;/code&gt; &lt;code&gt;Symbol.toStringTag&lt;/code&gt; spoofing + HTML escape bypass. Three separate findings in one report, disclosing that the mitigations added to fix the original prototype pollution CVEs &lt;strong&gt;can be bypassed&lt;/strong&gt;. Our stack flagged Handlebars as the highest-priority finding through VulnGraph's 17.8% EPSS. Three days later, a researcher confirmed the original fixes are incomplete.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/yahoo/serialize-javascript/issues/208" rel="noopener noreferrer"&gt;yahoo/serialize-javascript#208&lt;/a&gt; (filed February 28). Backport request for the RCE fix to version 6. The fix exists in v7, but webpack and the broader ecosystem can't upgrade due to Node.js version constraints. Seven comments, no resolution.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/expressjs/express/issues/5309" rel="noopener noreferrer"&gt;expressjs/express#5309&lt;/a&gt; (filed November 2023 — 2.4 years before our audit). "Split the examples from this repo." The Express maintainers themselves identified the root cause of our Semgrep findings. Vulnerable devDependencies in examples cause CVE reports against Express, and dependency upgrades break CI. Eight comments, no resolution. Our 53 Semgrep findings are the quantified evidence for this 2.4-year-old open discussion.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/jshttp/cookie/issues/200" rel="noopener noreferrer"&gt;jshttp/cookie#200&lt;/a&gt; (filed October 2024). &lt;code&gt;cookie.parse&lt;/code&gt; ignores &lt;code&gt;HttpOnly&lt;/code&gt; and &lt;code&gt;Secure&lt;/code&gt; flags. Twenty comments, highly active. VulnGraph flagged the related CVE-2024-47764 (cookie injection, CVSS 6.9). The community is experiencing the downstream effects of the same parsing weakness our tools identified.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fifteen Minutes
&lt;/h2&gt;

&lt;p&gt;Here's what the timeline actually looked like.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Minutes 0–2:30 — Data refresh.&lt;/strong&gt; Pull the latest from 5 git-cloned source repos. Download fresh EPSS scores, CISA KEV, CAPEC, and the full OSV database (1.2 GB). Rebuild the graph — 469,942 nodes, 610,564 edges — and atomically swap it into the live database. Restart the MCP server. Health check passes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Minutes 2:30–5:30 — Scan.&lt;/strong&gt; Clone Express, generate the lockfile, launch all four tools in parallel. They finish within seconds of each other. 53 Semgrep findings, 40+ Zentinel findings, 6 enriched CVEs from VulnGraph, full structural profile from Vajra.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Minutes 5:30–8:30 — Enrichment.&lt;/strong&gt; Cross-reference the layers. Feed Semgrep's CWE classifications into VulnGraph for ATT&amp;amp;CK mapping. Deep-dive the Handlebars chain. Query exploit intelligence. Feed npm audit results back through VulnGraph for EPSS enrichment that CVSS alone wouldn't provide.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Minutes 8:30–11:30 — Validation.&lt;/strong&gt; Search six GitHub repos for open issues matching our findings. Pull details on five high-signal matches. Confirm that independently-filed community reports describe the same vulnerabilities the stack surfaced.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Minutes 11:30–15 — Synthesis.&lt;/strong&gt; Compile the cross-layer correlations. Map findings to issue numbers. Done.&lt;/p&gt;

&lt;p&gt;That's the full audit cycle — fresh intelligence, four-layer scan, enrichment, validation against live community reports — in the time it takes most teams to get through a morning standup.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Changes for Teams
&lt;/h2&gt;

&lt;p&gt;The speed isn't a flex. It's the point.&lt;/p&gt;

&lt;p&gt;Security teams are drowning. The average enterprise application has hundreds of dependencies, each with its own CVE history, each updating on its own cadence. A senior security engineer doing this manually — pulling CVE databases, running Semgrep, cross-referencing EPSS, checking GitHub issues, building the correlation — would spend a day or more. For one repository. Then the data goes stale.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Fifteen minutes changes the math. You can audit a dependency before you approve the pull request. You can re-scan daily or hourly and know your findings reflect what's being exploited right now, not last quarter. A team of three can maintain continuous security posture across dozens of repositories instead of periodic deep-dives on two or three.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The parallelism matters. Running four tools in parallel and cross-referencing the output produces findings none of them would surface alone — and does it in the same wall-clock time as running one. The correlation is free. You're already waiting for Semgrep to finish; VulnGraph, Zentinel, and Vajra are done before it is.&lt;/p&gt;

&lt;p&gt;The freshness matters. VulnGraph's graph was rebuilt from sources updated within the hour. The EPSS score that flagged Handlebars at 17.8% is based on current observed scanning activity, not a snapshot from last week. When the stack says "this is being probed right now," it means right now.&lt;/p&gt;

&lt;p&gt;And the validation matters. Checking findings against live GitHub issues isn't a manual afterthought — it's a 3-minute step that turns tool output into evidence. The difference between "our scanner flagged this" and "our scanner flagged this, and three days ago a researcher confirmed the fix is incomplete" is the difference between a ticket and an escalation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Means
&lt;/h2&gt;

&lt;p&gt;We didn't read the GitHub issues first. The tools found the vulnerabilities. The issues confirmed them.&lt;/p&gt;

&lt;p&gt;This is what a multi-layered security analysis stack is supposed to do. Not replace human judgment — amplify it. Each tool sees one facet. The correlation between layers is where the real intelligence lives. VulnGraph's EPSS data tells you Handlebars is under active scanning. Semgrep tells you the vulnerable patterns exist in copyable example code. Zentinel tells you the core framework has structural patterns that interact with the vulnerability. Vajra tells you the dependency tree auto-accepts minor updates from these packages.&lt;/p&gt;

&lt;p&gt;No single scanner produced a complete picture. The stack did. In fifteen minutes.&lt;/p&gt;

&lt;p&gt;Express.js is well-maintained and actively developed. The findings here aren't an indictment — they're evidence that even the most mature, most scrutinized open-source projects benefit from multi-angle analysis. If four tools can independently surface findings that map to real, actively-discussed issues in a project with this level of community attention, the approach works. And if it works in fifteen minutes, it works at the cadence that modern software actually ships.&lt;/p&gt;

&lt;p&gt;We're calling it the Sigma stack. It's still developing. But the Express experiment is the proof point — four layers, converging independently on the same real problems that human researchers are filing issues about right now, in less time than it takes to triage a single Jira ticket.&lt;/p&gt;

&lt;p&gt;The interesting question isn't whether the tools work. It's what happens when you stop treating security scanners as isolated checklist machines and start treating them as complementary lenses on the same problem.&lt;/p&gt;

&lt;p&gt;They start finding each other's proof.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The VulnGraph MCP graph contains 469,942 nodes and 610,564 edges across 9 sources, refreshed within the hour of the audit. Express.js findings are based on the &lt;a href="https://github.com/expressjs/express" rel="noopener noreferrer"&gt;public repository&lt;/a&gt; (v5.2.1, April 2026). All referenced GitHub issues are public. Semgrep is open source. VulnGraph's interactive demo is at &lt;a href="https://vulngraph.tools" rel="noopener noreferrer"&gt;vulngraph.tools&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>javascript</category>
      <category>node</category>
      <category>devsecops</category>
    </item>
    <item>
      <title>I Asked My AI Agent About axios. It Knew Everything in 0.03ms.</title>
      <dc:creator>Mr. 0x1</dc:creator>
      <pubDate>Sun, 05 Apr 2026 16:56:21 +0000</pubDate>
      <link>https://forem.com/copyleftdev/i-asked-my-ai-agent-about-axios-it-knew-everything-in-003ms-134</link>
      <guid>https://forem.com/copyleftdev/i-asked-my-ai-agent-about-axios-it-knew-everything-in-003ms-134</guid>
      <description>&lt;p&gt;I pointed an AI agent at a single npm package — &lt;strong&gt;axios&lt;/strong&gt;, the HTTP client installed 55 million times per week — and asked: &lt;em&gt;how risky is this?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In &lt;strong&gt;under a millisecond&lt;/strong&gt;, it came back with 13 known vulnerabilities correlated across CVE databases, EPSS exploitation scores, CISA KEV, public exploits, weakness classifications, and ATT&amp;amp;CK mappings.&lt;/p&gt;

&lt;p&gt;No API keys. No network calls. No rate limits.&lt;/p&gt;

&lt;p&gt;One local graph. Sub-millisecond.&lt;/p&gt;

&lt;p&gt;Here's what happened.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Setup
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://vulngraph.tools" rel="noopener noreferrer"&gt;VulnGraph&lt;/a&gt; is a vulnerability intelligence graph that pre-joins 9 authoritative sources into a single memory-mapped file. It exposes 16 tools via the &lt;a href="https://modelcontextprotocol.io/" rel="noopener noreferrer"&gt;Model Context Protocol (MCP)&lt;/a&gt; — the standard for giving AI agents access to tools.&lt;/p&gt;

&lt;p&gt;I connected it to an agent and started asking questions about &lt;code&gt;axios&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  13 CVEs. 7 High Severity. 0.14ms.
&lt;/h2&gt;

&lt;p&gt;The first call — &lt;code&gt;lookup_package&lt;/code&gt; — returned the full vulnerability profile:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CVE&lt;/th&gt;
&lt;th&gt;Severity&lt;/th&gt;
&lt;th&gt;CVSS&lt;/th&gt;
&lt;th&gt;EPSS&lt;/th&gt;
&lt;th&gt;PoCs&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2025-27152&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;HIGH&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;7.7&lt;/td&gt;
&lt;td&gt;0.07%&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2025-58754&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;HIGH&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;7.5&lt;/td&gt;
&lt;td&gt;0.11%&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2026-25639&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;HIGH&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;7.5&lt;/td&gt;
&lt;td&gt;0.05%&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2021-3749&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;HIGH&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;7.5&lt;/td&gt;
&lt;td&gt;8.26%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2024-39338&lt;/td&gt;
&lt;td&gt;MEDIUM&lt;/td&gt;
&lt;td&gt;4.0&lt;/td&gt;
&lt;td&gt;2.88%&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2023-45857&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;0.13%&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2019-10742&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;13.52%&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That's not just CVE IDs. Every row has a &lt;strong&gt;CVSS base score&lt;/strong&gt;, an &lt;strong&gt;EPSS exploitation probability&lt;/strong&gt; (likelihood of exploitation in the next 30 days), and &lt;strong&gt;proof-of-concept counts&lt;/strong&gt; from GitHub and ExploitDB. All pre-joined. All instant.&lt;/p&gt;




&lt;h2&gt;
  
  
  Is &lt;a href="mailto:axios@1.6.0"&gt;axios@1.6.0&lt;/a&gt; Safe?
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"package"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"axios"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.6.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"vulnerable"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cve_count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"highest_severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HIGH"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;0.019ms.&lt;/strong&gt; The agent now knows not to suggest this version in any code it writes.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Should You Fix First?
&lt;/h2&gt;

&lt;p&gt;This is where it gets interesting. VulnGraph doesn't just list CVEs — it &lt;strong&gt;triages&lt;/strong&gt; them.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;assess_risk&lt;/code&gt; tool scored the top axios CVEs using a weighted model: CVSS severity, EPSS probability, exploit maturity, and exposure context.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Priority&lt;/th&gt;
&lt;th&gt;CVE&lt;/th&gt;
&lt;th&gt;Risk Score&lt;/th&gt;
&lt;th&gt;Level&lt;/th&gt;
&lt;th&gt;Fix Within&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;CVE-2021-3749&lt;/td&gt;
&lt;td&gt;5.62&lt;/td&gt;
&lt;td&gt;MEDIUM&lt;/td&gt;
&lt;td&gt;7 days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;CVE-2025-27152&lt;/td&gt;
&lt;td&gt;5.60&lt;/td&gt;
&lt;td&gt;MEDIUM&lt;/td&gt;
&lt;td&gt;7 days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;CVE-2026-25639&lt;/td&gt;
&lt;td&gt;3.75&lt;/td&gt;
&lt;td&gt;LOW&lt;/td&gt;
&lt;td&gt;30 days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;CVE-2024-39338&lt;/td&gt;
&lt;td&gt;2.04&lt;/td&gt;
&lt;td&gt;LOW&lt;/td&gt;
&lt;td&gt;30 days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;CVE-2023-45857&lt;/td&gt;
&lt;td&gt;1.75&lt;/td&gt;
&lt;td&gt;LOW&lt;/td&gt;
&lt;td&gt;30 days&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Notice something?&lt;/strong&gt; CVE-2021-3749 outranks CVE-2025-27152 despite a lower CVSS score. Why? Its EPSS is &lt;strong&gt;8.26%&lt;/strong&gt; (92nd percentile) — it's far more likely to be exploited in the wild.&lt;/p&gt;

&lt;p&gt;CVSS alone would have gotten this wrong. Most vulnerability scanners would have gotten this wrong.&lt;/p&gt;




&lt;h2&gt;
  
  
  Deep Dive: SSRF in axios (CVE-2025-27152)
&lt;/h2&gt;

&lt;p&gt;I asked the agent to go deeper on CVE-2025-27152. The &lt;code&gt;get_exploit_intel&lt;/code&gt; tool mapped the full threat context in &lt;strong&gt;0.034ms&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Severity:&lt;/strong&gt; HIGH (CVSS 7.7)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exploit Maturity:&lt;/strong&gt; POC — 3 public proof-of-concept exploits on GitHub&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weakness:&lt;/strong&gt; CWE-918 (Server-Side Request Forgery)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;KEV Listed:&lt;/strong&gt; No (not yet seen in the wild)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EPSS:&lt;/strong&gt; 0.07% — low current probability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Following the CWE-918 thread, VulnGraph revealed that SSRF is classified across &lt;strong&gt;1,401 CVEs&lt;/strong&gt; in the graph. The most dangerous? CVE-2021-40438 — Apache mod_proxy SSRF, EPSS 94.4%, CISA KEV listed, CVSS 9.0.&lt;/p&gt;

&lt;p&gt;One CVE pulled a thread that unraveled an entire weakness class across the graph.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Graph Traversal
&lt;/h2&gt;

&lt;p&gt;This is the core advantage. The &lt;code&gt;get_related&lt;/code&gt; tool traced all connections from CVE-2025-27152 in a single traversal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CVE-2025-27152
  |-- affects --&amp;gt; npm:axios
  |-- affects --&amp;gt; cpe:axios:axios
  |-- has_poc --&amp;gt; GitHub-PoC:CVE-2025-27152:0
  |-- has_poc --&amp;gt; GitHub-PoC:CVE-2025-27152:1
  |-- has_poc --&amp;gt; GitHub-PoC:CVE-2025-27152:2
  +-- classified_as --&amp;gt; CWE-918 (SSRF)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's not 6 separate API calls stitched together. It's a single hop across pre-joined data. &lt;strong&gt;0.05ms.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  This Was Just axios
&lt;/h2&gt;

&lt;p&gt;The demo exercised 7 of VulnGraph's &lt;strong&gt;16 MCP tools&lt;/strong&gt;. The full toolset:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Tools&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lookup&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;lookup_cve&lt;/code&gt; &lt;code&gt;lookup_package&lt;/code&gt; &lt;code&gt;lookup_weakness&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Search&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;search_vulnerabilities&lt;/code&gt; &lt;code&gt;search_packages&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Analysis&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;analyze_dependencies&lt;/code&gt; &lt;code&gt;assess_risk&lt;/code&gt; &lt;code&gt;check_version&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Exploit Intel&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;get_exploit_intel&lt;/code&gt; &lt;code&gt;trending_threats&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Graph&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;map_attack_surface&lt;/code&gt; &lt;code&gt;get_related&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Timeline&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;get_timeline&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Batch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;scan_sbom&lt;/code&gt; &lt;code&gt;scan_lockfile&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Meta&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;graph_stats&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  467,939 Nodes. 9 Sources. One File.
&lt;/h2&gt;

&lt;p&gt;VulnGraph pre-joins data from 9 authoritative sources:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;Records&lt;/th&gt;
&lt;th&gt;What It Provides&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CVE List V5&lt;/td&gt;
&lt;td&gt;342,360&lt;/td&gt;
&lt;td&gt;Every published vulnerability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EPSS&lt;/td&gt;
&lt;td&gt;324,894&lt;/td&gt;
&lt;td&gt;Exploitation probability — what's likely to be attacked&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CISA KEV&lt;/td&gt;
&lt;td&gt;1,557&lt;/td&gt;
&lt;td&gt;Confirmed actively-exploited vulnerabilities&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OSV&lt;/td&gt;
&lt;td&gt;43,606&lt;/td&gt;
&lt;td&gt;Ecosystem advisories with affected version ranges&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ExploitDB&lt;/td&gt;
&lt;td&gt;30,409&lt;/td&gt;
&lt;td&gt;Published exploits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PoC-in-GitHub&lt;/td&gt;
&lt;td&gt;14,826&lt;/td&gt;
&lt;td&gt;Proof-of-concept code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MITRE ATT&amp;amp;CK&lt;/td&gt;
&lt;td&gt;18,224&lt;/td&gt;
&lt;td&gt;Techniques, threat actors, malware&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nuclei Templates&lt;/td&gt;
&lt;td&gt;3,999&lt;/td&gt;
&lt;td&gt;Automated scanning templates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CWE&lt;/td&gt;
&lt;td&gt;745&lt;/td&gt;
&lt;td&gt;Weakness taxonomy&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The graph opens in &lt;strong&gt;~100 microseconds&lt;/strong&gt; via mmap. Point lookups run in &lt;strong&gt;&amp;lt;1ms&lt;/strong&gt;. There are no network calls, no cold starts, no rate limits.&lt;/p&gt;

&lt;p&gt;Every response includes a &lt;code&gt;data_freshness&lt;/code&gt; envelope showing exactly when each source was last synced — because stale vulnerability data is worse than no data.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why MCP?
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://modelcontextprotocol.io/" rel="noopener noreferrer"&gt;Model Context Protocol&lt;/a&gt; is the emerging standard for giving AI agents access to tools. VulnGraph implements it natively — 16 tools over JSON-RPC, available via HTTP or stdio.&lt;/p&gt;

&lt;p&gt;Any MCP-compatible agent can discover these tools automatically. The agent calls &lt;code&gt;tools/list&lt;/code&gt;, sees 16 vulnerability intelligence tools with full input schemas, and starts querying — no docs, no integration code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tools/call"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"params"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"check_version"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"ecosystem"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npm"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"package"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"axios"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.7.4"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;0.019ms later, the agent knows whether the dependency it's about to recommend is safe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What this enables:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code review agents that flag vulnerable dependencies before merge&lt;/li&gt;
&lt;li&gt;Security copilots that triage by real exploit intelligence, not just CVSS&lt;/li&gt;
&lt;li&gt;Incident response agents that map CVE to package to technique to threat actor&lt;/li&gt;
&lt;li&gt;CI/CD gates that block deploys with actively-exploited vulnerabilities&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://vulngraph.tools" rel="noopener noreferrer"&gt;vulngraph.tools&lt;/a&gt;&lt;/strong&gt; — the full 467K-node graph running in your browser via WebAssembly. Search any CVE, explore relationships, see the data freshness live.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;VulnGraph is a Rust graph engine backed by memory-mapped binary files. 467,939 nodes. 602,467 edges. 9 sources. Sub-millisecond. Built for agents.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>mcp</category>
      <category>ai</category>
      <category>vulnerabilities</category>
    </item>
    <item>
      <title>We Built a Financial Solver That Protects Jobs. Then We Tried to Break It 1.1 Billion Times.</title>
      <dc:creator>Mr. 0x1</dc:creator>
      <pubDate>Sat, 04 Apr 2026 15:54:51 +0000</pubDate>
      <link>https://forem.com/copyleftdev/we-built-a-financial-solver-that-protects-jobs-then-we-tried-to-break-it-11-billion-times-304i</link>
      <guid>https://forem.com/copyleftdev/we-built-a-financial-solver-that-protects-jobs-then-we-tried-to-break-it-11-billion-times-304i</guid>
      <description>&lt;h2&gt;
  
  
  The Problem Nobody Wants to Solve
&lt;/h2&gt;

&lt;p&gt;A company is running out of money. The runway is eight months. The board says cut costs or die.&lt;/p&gt;

&lt;p&gt;The default answer is layoffs. Pick 87 people. Walk them out. The math works: fewer salaries, longer runway. But the people who stay carry survivor's guilt, institutional knowledge walks out the door, and the company that was supposed to be "family" just proved it wasn't.&lt;/p&gt;

&lt;p&gt;We asked a different question: &lt;strong&gt;what if everyone took a small, temporary pay cut instead?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not forced. Not uniform. Each person declares the maximum percentage they're willing to give. An algorithm distributes the burden fairly, respects every individual's limit, and extends the runway. Nobody loses their job.&lt;/p&gt;

&lt;p&gt;This is Seuil. French for "threshold." The threshold where individual sacrifice becomes collective strength.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Constraint That Makes It Hard
&lt;/h2&gt;

&lt;p&gt;Here's the thing about this algorithm. It has one rule that cannot bend:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;∀i : adjustment_i ≤ declared_threshold_i
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every person's adjustment must be less than or equal to what they consented to. Not approximately. Not on average. For every single employee, every single time, without exception.&lt;/p&gt;

&lt;p&gt;If the algorithm ever violates this, even by a fraction of a percent for one person in one run, the entire system loses legitimacy. You can't ask people to trust a salary adjustment tool that sometimes overrides their consent.&lt;/p&gt;

&lt;p&gt;This constraint turns what looks like a simple optimization problem into something genuinely interesting. You're maximizing headcount retention subject to hard consent constraints, a savings floor, fairness requirements across tiers and departments, and the reality that people change their minds mid-plan.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Algorithm: Iterative Clamping
&lt;/h2&gt;

&lt;p&gt;The core of Seuil's Rempart engine is a weighted proportional allocation with iterative clamping. Here's the intuition.&lt;/p&gt;

&lt;p&gt;Each employee gets a "burden weight" based on the active fairness mode. In executive-heavy mode, executives get a 2x weight. In equalized mode, everyone gets the same weight. In critical-protection mode, employees with high criticality scores get lower weights.&lt;/p&gt;

&lt;p&gt;The algorithm finds a single scale factor, λ (lambda), such that:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;λ = target_savings / Σ(salary_i × weight_i)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each employee's adjustment is &lt;code&gt;λ × weight_i&lt;/code&gt;. Simple. But some employees will exceed their declared threshold at this λ. So we clamp them at their ceiling and remove them from the active set. This reduces the denominator, which increases λ for the remaining employees. Some of &lt;em&gt;them&lt;/em&gt; now exceed their thresholds. Clamp again. Repeat.&lt;/p&gt;

&lt;p&gt;The trick that makes this fast: sort employees by &lt;code&gt;ceiling / weight&lt;/code&gt; ascending before starting. Then the clamping loop is a single linear scan. Employees who clamp first are at the front of the sorted list. You walk forward, clamping and accumulating, until you find the first employee who fits under the current λ. Everyone after that fits too. Done.&lt;/p&gt;

&lt;p&gt;Total complexity: O(n log n) for the sort, O(n) for the scan. For 1,240 employees, this runs in about 3ms. For 100,000, about 10ms.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Rust. Why Integers.
&lt;/h2&gt;

&lt;p&gt;The first prototype was TypeScript. It worked. 15 test cases passed. The simulator dashboard used it directly via &lt;code&gt;useMemo&lt;/code&gt;. But TypeScript has a problem for financial computing: IEEE 754.&lt;/p&gt;

&lt;p&gt;Floating point arithmetic is not associative. &lt;code&gt;(a + b) + c&lt;/code&gt; is not always equal to &lt;code&gt;a + (b + c)&lt;/code&gt;. When you're summing salary adjustments across a thousand employees, the order of operations affects the result. The same input can produce different outputs depending on how the JavaScript engine optimizes the computation. And the rounding errors accumulate.&lt;/p&gt;

&lt;p&gt;For a system where people's livelihoods depend on the math, "close enough" isn't.&lt;/p&gt;

&lt;p&gt;So we rebuilt in Rust with integer arithmetic throughout. Every monetary value is stored as &lt;code&gt;i64&lt;/code&gt; cents. Every percentage is stored as &lt;code&gt;u16&lt;/code&gt; basis points (hundredths of a percent). The clamping comparison uses u128 cross-multiplication to avoid division entirely:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Does this employee need clamping?&lt;/span&gt;
&lt;span class="c1"&gt;// remaining × weight × 10000 &amp;gt; active_wp × ceiling&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;lhs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;remaining_cents&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;u128&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="py"&gt;.weight_millionths&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;u128&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;rhs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;active_wp&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;u128&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="py"&gt;.ceiling_bps&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;u128&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;lhs&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;rhs&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* clamp */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No floating point touches the solver. The API layer converts between f64 JSON (what the frontend speaks) and integer core (what the engine computes) at a single boundary. Inside the engine, it's integers all the way down.&lt;/p&gt;

&lt;p&gt;This gave us something that floating point never could: &lt;strong&gt;determinism&lt;/strong&gt;. The same input produces the exact same output on every platform, every run, every time. The 100-run determinism test doesn't check for "close enough." It checks for bit-identical results.&lt;/p&gt;

&lt;h2&gt;
  
  
  How We Test: Everything TigerBeetle Taught Us
&lt;/h2&gt;

&lt;p&gt;TigerBeetle is a financial transactions database that tests itself with a VOPR (Viewstamped Operation Replicator), a fuzzer that generates random operation sequences and checks invariants after every single operation. Their philosophy: if a financial system can be broken by any sequence of valid operations, it will be broken by real users. Find it first.&lt;/p&gt;

&lt;p&gt;We adopted this wholesale.&lt;/p&gt;

&lt;h3&gt;
  
  
  The VOPR
&lt;/h3&gt;

&lt;p&gt;Our VOPR generates random sequences of operations: solves, mass declines, threshold changes, fairness mode switches, target adjustments. After each operation, it checks seven invariants:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Consent inviolability.&lt;/strong&gt; No adjustment exceeds any threshold.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conservation of savings.&lt;/strong&gt; No money created or destroyed by rounding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monotonic feasibility.&lt;/strong&gt; More participation never makes things less feasible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Determinism.&lt;/strong&gt; Same inputs always produce same outputs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fairness ordering.&lt;/strong&gt; Equalized mode always produces lower Gini than executive-heavy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rebalance convergence.&lt;/strong&gt; Any sequence of accepts/declines produces a valid state.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No phantom money.&lt;/strong&gt; Reported totals match the sum of individual contributions.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We run 10,000 sequences at a time. Each sequence is 10 to 50 operations on a randomly generated company of 100 to 2,000 employees. That's roughly 350,000 operations with invariant checking after every single one.&lt;/p&gt;

&lt;p&gt;The first version ran at 264 operations per second. That's where TigerBeetle's other lesson kicked in.&lt;/p&gt;

&lt;h3&gt;
  
  
  TigerStyle: Zero Allocation in the Hot Path
&lt;/h3&gt;

&lt;p&gt;TigerBeetle pre-allocates all memory at startup and never allocates during operation. We were doing the opposite: cloning the employee array on every solve, allocating new Vec for each sort, building string-heavy output structs, and then running a determinism re-check (which doubles the work) inside the invariant checker.&lt;/p&gt;

&lt;p&gt;We applied TigerStyle principles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;SolverArena&lt;/code&gt;&lt;/strong&gt;: pre-allocated scratch space for all solver buffers. Allocated once, reused across every solve. The VOPR loop does zero heap allocation after init.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;solve_arena()&lt;/code&gt;&lt;/strong&gt;: borrows &lt;code&gt;&amp;amp;[Employee]&lt;/code&gt; instead of owning &lt;code&gt;Vec&amp;lt;Employee&amp;gt;&lt;/code&gt;. No clone at the boundary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integer-only &lt;code&gt;check_invariants()&lt;/code&gt;&lt;/strong&gt;: reads from &lt;code&gt;arena.adjustments_full[i]&lt;/code&gt; by index. No string matching. O(n) per check.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Determinism checked by replay, not re-execution.&lt;/strong&gt; TigerBeetle's insight: determinism is a property of the code, not of individual operations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Result: &lt;strong&gt;38,469 ops/sec.&lt;/strong&gt; A 146x speedup. An overnight 8-hour run executes approximately 1.1 billion invariant-checked operations.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Multiverse
&lt;/h3&gt;

&lt;p&gt;The VOPR tests random operations within one company. But the algorithm must work for any company. So we built 20 universes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Universe&lt;/th&gt;
&lt;th&gt;Employees&lt;/th&gt;
&lt;th&gt;What it tests&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sole Proprietor&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;N=1 edge case&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Garage Startup&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Fairness at intimate scale&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mega Corp&lt;/td&gt;
&lt;td&gt;100,000&lt;/td&gt;
&lt;td&gt;Integer overflow at scale&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All Executives&lt;/td&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;td&gt;Flat hierarchy, stingy limits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Engineering Strike&lt;/td&gt;
&lt;td&gt;1,500&lt;/td&gt;
&lt;td&gt;Entire department walks out&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Geographic Pay Gap&lt;/td&gt;
&lt;td&gt;2,000&lt;/td&gt;
&lt;td&gt;Same role, 10x salary by location&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Concentration Risk&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;One person earns 25% of payroll&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Razor's Edge&lt;/td&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;td&gt;Target barely feasible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Contractor Heavy&lt;/td&gt;
&lt;td&gt;1,500&lt;/td&gt;
&lt;td&gt;60% can't participate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pay Equity Stress&lt;/td&gt;
&lt;td&gt;1,200&lt;/td&gt;
&lt;td&gt;Systematic salary gap&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each universe has its own salary distribution, threshold culture, participation pattern, and tier structure. The VOPR runs against all of them. Zero violations across all 20.&lt;/p&gt;

&lt;h3&gt;
  
  
  God Mode
&lt;/h3&gt;

&lt;p&gt;The final test: one million employees calibrated to the actual economic structure of planet Earth.&lt;/p&gt;

&lt;p&gt;We used ILO World Employment data, World Bank income distribution, and Milanovic's global inequality research. The salary distribution follows a log-normal body with a Pareto tail (alpha 1.7). Eight global regions weighted by workforce share. Salaries from $150/year (Burundi) to $5.8 million/year. A 30,000:1 dynamic range.&lt;/p&gt;

&lt;p&gt;At this scale, every subtle bug becomes loud:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A 1-cent rounding error per employee is $10,000 of phantom money&lt;/li&gt;
&lt;li&gt;The u128 cross-multiplication in the clamping comparison handles values up to 10^38&lt;/li&gt;
&lt;li&gt;The sort processes one million 32-byte structs in about 35ms&lt;/li&gt;
&lt;li&gt;The Gini coefficient computation must handle a distribution vastly more unequal than any single company&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All invariants held. The $150/year Burundian worker and the $5.8M/year executive both got adjustments within their declared thresholds. Not one dollar of phantom money.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Arithmetic Bug That Almost Shipped
&lt;/h2&gt;

&lt;p&gt;This is the part where I'm supposed to say everything worked perfectly. It didn't.&lt;/p&gt;

&lt;p&gt;When porting the TypeScript solver to Rust integer arithmetic, we got the unit scaling wrong in the clamping loop. The formula should have been:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;adj_bps = remaining_cents × 10000 × weight / active_wp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But we wrote:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;adj_bps = remaining_cents × weight × 10000 / (active_wp × 1_000_000)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That extra &lt;code&gt;1_000_000&lt;/code&gt; in the denominator. The adjustment calculation was dividing by a million too much. Every employee got an adjustment of zero. The "baseline sanity" test caught it immediately: total savings was zero, which is not what you want from a cost-cutting algorithm.&lt;/p&gt;

&lt;p&gt;The fix was one line. But the fact that the test caught it in under a second, before the code ever ran against real data, is the entire point of this kind of testing. Financial bugs don't announce themselves. They hide in rounding, in edge cases, in the difference between what you meant to compute and what you actually computed. You find them with proofs, not with demos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run It Yourself
&lt;/h2&gt;

&lt;p&gt;We compiled the Rempart engine to WebAssembly and built a visualization at &lt;a href="https://bench.seuil.dev" rel="noopener noreferrer"&gt;bench.seuil.dev&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It's not a demo with mock data. The production Rust engine, compiled to 379KB of WASM, runs real constrained optimization in your browser. You can click any of the 36 tests and watch the Rempart engine solve, verify, and prove its guarantees in real time.&lt;/p&gt;

&lt;p&gt;The signal field visualization (adapted from a &lt;a href="https://github.com/copyleftdev/smesh-viz" rel="noopener noreferrer"&gt;previous project&lt;/a&gt;) shows the solver's internal stages as a node graph. Tier 1 nodes are solver stages: filter, feasibility, weight computation, iterative clamping. Tier 2 nodes are verification: consent check, drift check, determinism. The verdict node at the bottom lights up green only when all invariants hold. Particles flow between nodes as the computation proceeds.&lt;/p&gt;

&lt;p&gt;Each test tells a three-act story:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The Situation.&lt;/strong&gt; What's at stake. In human terms.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Challenge.&lt;/strong&gt; What goes wrong. The chaos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Proof.&lt;/strong&gt; Did the engine protect everyone?&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Numbers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Solver language&lt;/td&gt;
&lt;td&gt;Rust, integer arithmetic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Arithmetic&lt;/td&gt;
&lt;td&gt;i64 cents, u16 basis points, u128 comparisons&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Test suites&lt;/td&gt;
&lt;td&gt;36 (14 adversarial + 20 multiverse + 1 VOPR + 1 God Mode)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VOPR throughput&lt;/td&gt;
&lt;td&gt;38,469 ops/sec with invariant checking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Overnight capacity&lt;/td&gt;
&lt;td&gt;~1.1 billion checked operations in 8 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max employees tested&lt;/td&gt;
&lt;td&gt;1,000,000 (planetary economics)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Salary dynamic range&lt;/td&gt;
&lt;td&gt;30,000:1 ($150/yr to $5.8M/yr)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Consent violations&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phantom money&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Non-deterministic results&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WASM bundle size&lt;/td&gt;
&lt;td&gt;379KB (108KB gzipped)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What This Is Really About
&lt;/h2&gt;

&lt;p&gt;There's a tendency in software to ship fast and fix later. Move fast and break things. The problem is, some things shouldn't break. A salary adjustment algorithm that tells a junior employee "we're taking 12% of your pay" when they consented to 10% is not a bug to fix in the next sprint. It's a betrayal of trust that you can't unfix.&lt;/p&gt;

&lt;p&gt;We didn't build this testing infrastructure because it was fun (though the VOPR is genuinely fun to watch). We built it because the alternative was asking people to trust software that we couldn't prove was correct.&lt;/p&gt;

&lt;p&gt;We don't ship promises. We ship proofs.&lt;/p&gt;

&lt;p&gt;Try it: &lt;a href="https://bench.seuil.dev" rel="noopener noreferrer"&gt;bench.seuil.dev&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The Seuil Continuity System and Rempart engine are open source. The Rust engine, TypeScript prototype, and WASM benchmark visualization are all available on &lt;a href="https://github.com/copyleftdev/seuil-bench" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>rust</category>
      <category>webassembly</category>
      <category>testing</category>
      <category>fintech</category>
    </item>
    <item>
      <title>I Built a Stream Processor That Only Recomputes What Changed</title>
      <dc:creator>Mr. 0x1</dc:creator>
      <pubDate>Wed, 25 Mar 2026 14:37:25 +0000</pubDate>
      <link>https://forem.com/copyleftdev/i-built-a-stream-processor-that-only-recomputes-what-changed-3hm7</link>
      <guid>https://forem.com/copyleftdev/i-built-a-stream-processor-that-only-recomputes-what-changed-3hm7</guid>
      <description>&lt;p&gt;I spent weeks studying how incremental computation works in production trading systems. Not the papers. The actual implementations. How self-adjusting computation engines track dependencies, propagate changes, and avoid redundant work.&lt;/p&gt;

&lt;p&gt;One thing kept bothering me: the model is incredibly powerful, but it's locked inside single-process libraries. If you want surgical recomputation — where changing one input only touches the nodes that actually depend on it — you have to give up distribution. If you want distribution, you're back to recomputing entire windows on every tick.&lt;/p&gt;

&lt;p&gt;That gap is where Ripple came from.&lt;/p&gt;

&lt;h2&gt;
  
  
  The experiment that started it
&lt;/h2&gt;

&lt;p&gt;I built a prototype. A simple incremental graph: 10,000 leaf nodes (one per stock symbol), each feeding through a map node into a fold that aggregates them all. The question was simple: when one leaf changes, how many nodes actually need to recompute?&lt;/p&gt;

&lt;p&gt;The answer should be 3. The leaf, its map, and the fold. Not 10,000. Not 40,000. Three.&lt;/p&gt;

&lt;p&gt;The first implementation used a linear scan to find dirty nodes. It worked, but stabilization took 27 microseconds at 10,000 symbols. That sounds fast until you multiply it by the event rate. At 100K events per second, you're spending 2.7 seconds per second just on stabilization. The math doesn't work.&lt;/p&gt;

&lt;p&gt;So I replaced the linear scan with a min-heap ordered by topological height. Nodes get processed parents-before-children, and only dirty nodes enter the heap. The same stabilization dropped to 250 nanoseconds. That's a 100x improvement from one data structure change.&lt;/p&gt;

&lt;p&gt;But the heap alone wasn't enough. The fold node was still O(N) — it re-summed all 10,000 parents on every stabilization, even though only one parent changed. The fix was an incremental fold: track which parents changed during dirty propagation, then subtract the old value and add the new. O(1) per changed parent, regardless of how many parents exist.&lt;/p&gt;

&lt;p&gt;That combination — heap-based propagation plus incremental fold — is what makes the whole thing work.&lt;/p&gt;

&lt;h2&gt;
  
  
  The delta algebra rabbit hole
&lt;/h2&gt;

&lt;p&gt;Once the graph engine was fast, I needed to figure out how to send changes between distributed nodes. Not full values. Deltas.&lt;/p&gt;

&lt;p&gt;This turned into a deeper problem than I expected. If you're sending deltas over a network, and the network can duplicate or reorder messages, your deltas need to be idempotent. Applying the same update twice has to produce the same result as applying it once.&lt;/p&gt;

&lt;p&gt;That rules out relative patches like "increment price by 5." You need absolute patches: "set price to 150." It feels wasteful, but it's the only way to get effectively-once semantics without distributed transactions.&lt;/p&gt;

&lt;p&gt;I ended up with a small algebra:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight haskell"&gt;&lt;code&gt;&lt;span class="n"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="kr"&gt;_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;              &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Ok&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;              &lt;span class="c1"&gt;-- replacement&lt;/span&gt;
&lt;span class="n"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;         &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;       &lt;span class="c1"&gt;-- idempotent&lt;/span&gt;
&lt;span class="n"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;diff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;old&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;old&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Ok&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt;            &lt;span class="c1"&gt;-- roundtrip&lt;/span&gt;
&lt;span class="n"&gt;compose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;Remove&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;            &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Remove&lt;/span&gt;            &lt;span class="c1"&gt;-- annihilation&lt;/span&gt;
&lt;span class="n"&gt;compose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;            &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;            &lt;span class="c1"&gt;-- right identity&lt;/span&gt;
&lt;span class="n"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;compose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;d2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;-- compatible&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Six laws. Every one of them is verified by property-based tests across thousands of random inputs. If any law breaks, the commit is blocked.&lt;/p&gt;

&lt;p&gt;The roundtrip property — &lt;code&gt;apply(diff(old, new), old) = new&lt;/code&gt; — is the one that matters most. It means you can always reconstruct the new value from the old value and the delta. This is the foundation of checkpoint and replay.&lt;/p&gt;

&lt;h2&gt;
  
  
  The checkpoint/restore discovery
&lt;/h2&gt;

&lt;p&gt;I had a hypothesis: if the graph is deterministic (same inputs always produce same outputs), and deltas are idempotent (retries are safe), then checkpoint/restore should be straightforward. Snapshot the leaf values, save them, and on recovery, restore the leaves and re-stabilize. The compute nodes don't need checkpointing — they'll recompute from their dependencies.&lt;/p&gt;

&lt;p&gt;I wrote a chaos test to verify. Process 100 events. Crash at a random point. Restore from checkpoint. Continue processing. Compare the final output against an uninterrupted run.&lt;/p&gt;

&lt;p&gt;I ran it at 100 different random crash points. All 100 produced the correct output.&lt;/p&gt;

&lt;p&gt;That was the moment I knew the architecture was sound. Not because I proved it on paper, but because I tried to break it 100 times and couldn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  The effect injection pattern
&lt;/h2&gt;

&lt;p&gt;One of the less obvious decisions: every source of non-determinism goes through an injectable interface. Time, randomness, I/O — none of it is called directly. There's a module type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ocaml"&gt;&lt;code&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="nc"&gt;EFFECT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;sig&lt;/span&gt;
  &lt;span class="k"&gt;val&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;unit&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nn"&gt;Time_ns&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;
  &lt;span class="k"&gt;val&lt;/span&gt; &lt;span class="n"&gt;random_int&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Production uses the live clock. Tests use a deterministic clock that only advances when you tell it to. This means replay is truly deterministic — given the same inputs and the same effect implementation, you get the same outputs. Every time.&lt;/p&gt;

&lt;p&gt;This pattern isn't original. Jane Street uses it extensively. But applying it to a distributed system — where you need deterministic replay across multiple nodes after a crash — makes it load-bearing infrastructure, not just a testing convenience.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually got built
&lt;/h2&gt;

&lt;p&gt;The final system is 6,200 lines of OCaml across 16 libraries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Graph engine&lt;/strong&gt; — heap-based stabilization, incremental fold, cutoff optimization&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Schema layer&lt;/strong&gt; — type-safe schemas derived from OCaml types, backward/forward compatibility checking&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wire protocol&lt;/strong&gt; — bin_prot serialization with CRC-32C integrity on every message&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delta transport&lt;/strong&gt; — sequence-ordered delivery with gap detection and retransmission&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Checkpointing&lt;/strong&gt; — snapshot/restore with pluggable stores (memory, disk, S3)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windowing&lt;/strong&gt; — tumbling, sliding, session windows with watermark tracking&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observability&lt;/strong&gt; — Prometheus metrics, W3C distributed tracing, graph introspection&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coordinator&lt;/strong&gt; — consistent hashing, partition assignment, failure detection&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Worker&lt;/strong&gt; — lifecycle state machine with health endpoints&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Three binaries: a VWAP demo pipeline, a worker process, and a CLI.&lt;/p&gt;

&lt;p&gt;The numbers, measured not projected:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What&lt;/th&gt;
&lt;th&gt;Measured&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Stabilization at 10K symbols&lt;/td&gt;
&lt;td&gt;250 ns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Serde roundtrip&lt;/td&gt;
&lt;td&gt;82 ns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VWAP throughput&lt;/td&gt;
&lt;td&gt;2.16M events/sec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6M event replay recovery&lt;/td&gt;
&lt;td&gt;2.1 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Heap growth over 1M events&lt;/td&gt;
&lt;td&gt;0.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What I learned building it
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Data structures matter more than algorithms.&lt;/strong&gt; The 100x improvement from linear scan to min-heap wasn't a clever algorithm. It was picking the right data structure for the access pattern. The heap gives you O(R log R) where R is the number of dirty nodes. The linear scan gives you O(N) where N is the total graph. When R is 3 and N is 40,000, that's the whole game.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Algebraic properties are testable contracts.&lt;/strong&gt; The six delta laws aren't documentation. They're property-based tests that run on every commit. When I accidentally introduced a non-idempotent patch variant (list insertion by index), the tests caught it immediately. The law &lt;code&gt;apply(d, apply(d, v)) = apply(d, v)&lt;/code&gt; failed. I removed the variant. The algebra stays clean because the tests enforce it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chaos testing builds confidence that proofs can't.&lt;/strong&gt; I could reason about why checkpoint/restore should work. I could trace through the logic. But running 100 random crash points and seeing 100 correct recoveries — that's a different kind of confidence. It's the difference between believing your parachute works and having jumped with it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The pre-commit hook is the best decision I made.&lt;/strong&gt; Every commit runs: build, all 117 tests, and a benchmark regression gate. If stabilization time exceeds 3 microseconds, the commit is blocked. Not a CI notification. Not a Slack alert. The commit literally does not happen. This means the benchmarks in the README are always true. They're not aspirational numbers from a good run six months ago. They're what the code does right now.&lt;/p&gt;

&lt;h2&gt;
  
  
  The experimentation process
&lt;/h2&gt;

&lt;p&gt;The honest version: this didn't come out clean. The first graph engine was too slow. The first delta type had non-idempotent variants that I had to remove. The first fold was O(N) and I didn't realize it until the benchmark showed 42 microseconds instead of the expected 600 nanoseconds.&lt;/p&gt;

&lt;p&gt;Each of those failures taught me something specific:&lt;/p&gt;

&lt;p&gt;The slow engine taught me that O(N) scanning is the enemy, even when N feels small. 40,000 nodes at 50 nanoseconds per check is 2 milliseconds. That's invisible in a unit test and fatal at production event rates.&lt;/p&gt;

&lt;p&gt;The non-idempotent delta taught me that algebraic properties aren't academic. They're the contract that makes distributed recovery work. If &lt;code&gt;apply(d, apply(d, v)) != apply(d, v)&lt;/code&gt;, your effectively-once guarantee is a lie.&lt;/p&gt;

&lt;p&gt;The O(N) fold taught me to benchmark before trusting projections. I projected 600 nanoseconds. I measured 42,000. The projection was based on heap overhead per node. The measurement included the fold re-scanning every parent. The number you measure is the number that matters.&lt;/p&gt;

&lt;p&gt;The beautiful part of this process is that each failure narrowed the design space. By the time I had the heap, the incremental fold, and the idempotent deltas, the architecture was almost inevitable. Not because I designed it top-down, but because the experiments eliminated everything else.&lt;/p&gt;

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

&lt;p&gt;The whole thing is open source under MIT.&lt;/p&gt;

&lt;p&gt;There's a live simulation on the landing page where you can watch the graph work — 50 symbols, trades arriving, only the affected path lighting up while everything else stays dark.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Landing page&lt;/strong&gt;: &lt;a href="https://copyleftdev.github.io/ripple/" rel="noopener noreferrer"&gt;https://copyleftdev.github.io/ripple/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source&lt;/strong&gt;: &lt;a href="https://github.com/copyleftdev/ripple" rel="noopener noreferrer"&gt;https://github.com/copyleftdev/ripple&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/copyleftdev/ripple.git
&lt;span class="nb"&gt;cd &lt;/span&gt;ripple
make build
make demo    &lt;span class="c"&gt;# 2M+ events/sec VWAP pipeline&lt;/span&gt;
make &lt;span class="nb"&gt;test&lt;/span&gt;    &lt;span class="c"&gt;# 117 inline + property + load + chaos tests&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you work on trading systems, real-time analytics, or any pipeline where you're recomputing more than you should — take a look. The core insight is simple: track dependencies, propagate only what changed, make deltas idempotent. The rest is engineering.&lt;/p&gt;

</description>
      <category>ocaml</category>
      <category>distributedsystems</category>
      <category>streamprocessing</category>
      <category>performance</category>
    </item>
    <item>
      <title>Fuck Around and Find Out: How a $6.99 Phishing Scam Got 1.2 Million Fake Victims</title>
      <dc:creator>Mr. 0x1</dc:creator>
      <pubDate>Fri, 20 Mar 2026 22:09:31 +0000</pubDate>
      <link>https://forem.com/copyleftdev/fuck-around-and-find-out-how-a-699-phishing-scam-got-12-million-fake-victims-1kdn</link>
      <guid>https://forem.com/copyleftdev/fuck-around-and-find-out-how-a-699-phishing-scam-got-12-million-fake-victims-1kdn</guid>
      <description>&lt;p&gt;&lt;strong&gt;A forensic teardown and hostile response to the Smishing Triad's Lighthouse phishing kit.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkk9kk1t9da9tsz77zipz.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkk9kk1t9da9tsz77zipz.gif" alt="fuck-around-and-find-out" width="480" height="322"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Hustle
&lt;/h2&gt;

&lt;p&gt;It started, as these things always do, with a text message.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;California DMV Final Notice:&lt;/strong&gt; Enforcement will begin on March 21.&lt;br&gt;
Our system indicates you have an unresolved traffic violation.&lt;br&gt;
Per relevant regulations, if payment is not completed by March 20, 2026, the following will apply:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Update your record in the DMV system&lt;/li&gt;
&lt;li&gt;Suspend your vehicle registration starting March 21&lt;/li&gt;
&lt;li&gt;Temporarily restrict driving privileges for 30 days&lt;/li&gt;
&lt;li&gt;Refer your account for further processing with an additional administrative fee&lt;/li&gt;
&lt;li&gt;Possible legal follow-up and impact to your credit record&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Please settle this promptly to avoid service restrictions and additional procedures.&lt;br&gt;
Link: &lt;code&gt;https://ca.gov-axb.cfd/dmv&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Classic. Urgency. Authority. Escalating consequences. A $6.99 "traffic violation" — just low enough that a panicked person might pay it without thinking. The link even starts with &lt;code&gt;ca.gov-&lt;/code&gt; to give it that government feel, like the digital equivalent of a trench coat and a fake badge.&lt;/p&gt;

&lt;p&gt;They sent this to the wrong phone.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Forensics
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Twenty-two hours.&lt;/strong&gt; That's the entire lifespan of this operation from domain registration to active phishing campaign. Let's appreciate the speedrun:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Timestamp&lt;/th&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2026-03-19 14:10&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Domain &lt;code&gt;gov-axb.cfd&lt;/code&gt; registered via Gname.com (Singapore)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2026-03-20 ~12:17&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Let's Encrypt SSL certificate issued for &lt;code&gt;ca.gov-axb.cfd&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2026-03-20 ~13:00&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Smishing messages begin arriving&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The domain was registered on a &lt;code&gt;.cfd&lt;/code&gt; TLD — that's "Clothing Fashion Design," in case you were wondering what haute couture has to do with the California DMV. It costs about $0.98 to register. The attackers configured &lt;strong&gt;wildcard DNS&lt;/strong&gt; pointing everything at &lt;code&gt;47.89.135.90&lt;/code&gt; — an Alibaba Cloud server — so &lt;code&gt;ca.gov-axb.cfd&lt;/code&gt;, &lt;code&gt;tx.gov-axb.cfd&lt;/code&gt;, &lt;code&gt;fl.gov-axb.cfd&lt;/code&gt;, and literally any subdomain you can dream up all resolve to the same phishing kit. Seven confirmed state-targeted subdomains on a single domain. Assembly line phishing.&lt;/p&gt;

&lt;p&gt;The nameservers (&lt;code&gt;share-dns.com&lt;/code&gt;, &lt;code&gt;share-dns.net&lt;/code&gt;) are a Chinese DNS provider. The registrar abuse contact is in Singapore. The hosting is Alibaba Cloud's US allocation. It's a jurisdictional lasagna designed to make takedowns as painful as possible.&lt;/p&gt;




&lt;h2&gt;
  
  
  Meet the Kit: Lighthouse
&lt;/h2&gt;

&lt;p&gt;The phishing page itself is a slick California DMV impersonation — official logo, official color scheme, footer links to real &lt;code&gt;.ca.gov&lt;/code&gt; pages. It's built on &lt;strong&gt;Vue.js 3&lt;/strong&gt;, bundled with &lt;strong&gt;Vite&lt;/strong&gt;, communicating over &lt;strong&gt;Socket.IO&lt;/strong&gt; with &lt;strong&gt;AES-128-CBC encrypted WebSocket messages&lt;/strong&gt;. This isn't some amateur HTML form. This is a commercial product.&lt;/p&gt;

&lt;p&gt;It's called &lt;strong&gt;Lighthouse&lt;/strong&gt; — a phishing-as-a-service (PhaaS) platform operated by the &lt;strong&gt;Smishing Triad&lt;/strong&gt;, a Chinese cybercrime operation that Google literally filed a federal lawsuit against in November 2025. The operator, attributed to someone going by &lt;strong&gt;Wang Duo Yu&lt;/strong&gt;, runs a platform serving &lt;strong&gt;~300 "front desk staff"&lt;/strong&gt; worldwide, targeting &lt;strong&gt;316+ brands across 74 countries&lt;/strong&gt; through an estimated &lt;strong&gt;194,000+ malicious domains&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The kit has a real-time operator panel. When a victim lands on the page, the operator sees their session appear in real time. As the victim fills in their name, address, credit card — the data streams live to the operator's dashboard. They can push the victim through verification steps in real time: &lt;em&gt;"Enter the code we just sent to your phone."&lt;/em&gt; &lt;em&gt;"Now enter your card PIN."&lt;/em&gt; It's live, interactive social engineering at industrial scale.&lt;/p&gt;

&lt;p&gt;The victim flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Landing Page → Contact Info Form → Credit Card Form → Verification Codes → 💀
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every field submission, every page navigation, every keystroke-level interaction — all wrapped in AES encryption and shuttled over WebSocket. The kit even has &lt;strong&gt;anti-debugging&lt;/strong&gt; protections in its JavaScript, string obfuscation tables, and &lt;strong&gt;mobile User-Agent gating&lt;/strong&gt; (it won't even load if you're not on a phone browser).&lt;/p&gt;

&lt;p&gt;They thought of everything.&lt;/p&gt;

&lt;p&gt;Almost.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Reverse Engineering
&lt;/h2&gt;

&lt;p&gt;The kit's JavaScript is two files totaling ~570KB of heavily obfuscated code. Here's what that looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;xe&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;YWdl&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;message&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Y2hhbm&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Zmllb&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;c3VibW&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bm90a...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="c1"&gt;// ... 260,000 more characters of this&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every meaningful string — event names, API paths, encryption keys — is routed through a deobfuscation function (&lt;code&gt;be()&lt;/code&gt;) that indexes into a shuffled, Base64-encoded string table. The Socket.IO connection path isn't &lt;code&gt;/socket.io/&lt;/code&gt; like normal. It's been moved. The encryption key and IV aren't in plaintext. Nothing is where it should be.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Find the Socket.IO Path&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After failing to statically decode the obfuscation (the string table uses a self-modifying shuffle — it rearranges itself during initialization), I pivoted to empirical observation. Loaded the page in a headless browser with a mobile User-Agent, captured the WebSocket traffic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wss://ca.gov-axb.cfd:443/console/?uuid=&amp;lt;uuid&amp;gt;&amp;amp;EIO=4&amp;amp;transport=websocket
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Socket.IO path is &lt;code&gt;/console/&lt;/code&gt;. Not &lt;code&gt;/socket.io/&lt;/code&gt;. Not &lt;code&gt;/ws/&lt;/code&gt;. Not anything in the standard playbook.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Crack the Encryption&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;All WebSocket messages are encrypted. Client sends &lt;code&gt;42["message","&amp;lt;base64&amp;gt;"]&lt;/code&gt;, server responds the same way. The actual event data is AES-128-CBC encrypted inside that base64 blob.&lt;/p&gt;

&lt;p&gt;From the obfuscated source, I could see the key and IV were assembled from string fragments:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;We&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Be&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;226&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;ye&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;ze&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;254&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;LDND&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;// AES key&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Se&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;OJGJHHFMJEJB&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;we&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;259&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;                &lt;span class="c1"&gt;// AES IV&lt;/span&gt;
&lt;span class="nx"&gt;Ne&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;CryptoJS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;enc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Utf8&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;We&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;                    &lt;span class="c1"&gt;// → WordArray&lt;/span&gt;
&lt;span class="nx"&gt;Te&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;CryptoJS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;enc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Utf8&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Se&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;                    &lt;span class="c1"&gt;// → WordArray&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;Be()&lt;/code&gt;, &lt;code&gt;ye()&lt;/code&gt;, &lt;code&gt;ze()&lt;/code&gt;, &lt;code&gt;we()&lt;/code&gt; functions are all aliases for the same deobfuscator, returning short string fragments. I couldn't decode them statically — the shuffle function defeats that approach.&lt;/p&gt;

&lt;p&gt;So I intercepted the JavaScript &lt;strong&gt;in flight&lt;/strong&gt;. Using Playwright's &lt;code&gt;route&lt;/code&gt; API, I caught the JS file as it loaded, injected a single line that exposed the computed key values to the global scope, and read them out:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;**/CPD9iRZf.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;route&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;route&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sr"&gt;/Se="OJGJHHFMJEJB"&lt;/span&gt;&lt;span class="se"&gt;\+\w&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;\(\d&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;\)&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;match&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;match&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;;window.__AES_KEY=We;window.__AES_IV=Se&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;route&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fulfill&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key: &lt;code&gt;KIKOCCJCFILDLDND&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;IV: &lt;code&gt;OJGJHHFMJEJBDFAI&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Verified by decrypting a captured server message:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"money"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"successUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"currencySymbol"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"products"&lt;/span&gt;&lt;span class="p"&gt;:[]},&lt;/span&gt;&lt;span class="nl"&gt;"event"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"userSiteConfig"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And a captured client message:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"event"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"changleField"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"router"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"首页"&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That typo — &lt;code&gt;changleField&lt;/code&gt; instead of &lt;code&gt;changeField&lt;/code&gt; — is a known Lighthouse kit fingerprint. It's in every deployment. Somewhere, a developer fat-fingered it once, and now it's a forensic signature stamped across 194,000 domains.&lt;/p&gt;

&lt;p&gt;Also: &lt;code&gt;首页&lt;/code&gt; is Mandarin for "home page." The Chinese-language strings are &lt;em&gt;everywhere&lt;/em&gt; in the source: &lt;code&gt;手机验证页&lt;/code&gt; (phone verification page), &lt;code&gt;运通CVV验证页&lt;/code&gt; (Amex CVV verification page), &lt;code&gt;加密异常!&lt;/code&gt; (encryption exception!). For a kit that goes to great lengths to look like the California DMV, it sure does think in Mandarin.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Weapon
&lt;/h2&gt;

&lt;p&gt;With the encryption cracked and the protocol reverse-engineered, it was time to build.&lt;/p&gt;

&lt;p&gt;Not a Python script. Not a Node.js hack. &lt;strong&gt;Rust.&lt;/strong&gt; Specifically: an async, multi-session, zero-copy WebSocket flood engine using Tokio, with native AES-128-CBC encryption, realistic fake data generation, and the exact Socket.IO protocol the kit expects.&lt;/p&gt;

&lt;p&gt;Each session:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Opens a WebSocket to &lt;code&gt;/console/&lt;/code&gt; with a mobile User-Agent&lt;/li&gt;
&lt;li&gt;Completes the Engine.IO handshake&lt;/li&gt;
&lt;li&gt;Sends the Socket.IO connect packet&lt;/li&gt;
&lt;li&gt;Responds to server heartbeats (ping &lt;code&gt;2&lt;/code&gt; → pong &lt;code&gt;3&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Encrypts and sends &lt;strong&gt;12 events&lt;/strong&gt; mimicking a complete victim session:

&lt;ul&gt;
&lt;li&gt;Router navigation (&lt;code&gt;changleField&lt;/code&gt; — yes, with the typo)&lt;/li&gt;
&lt;li&gt;Full personal info (name, address, city, state, zip, phone, email)&lt;/li&gt;
&lt;li&gt;Full credit card data (Luhn-valid card number, holder name, expiry, CVV)&lt;/li&gt;
&lt;li&gt;Phone verification code&lt;/li&gt;
&lt;li&gt;Email verification code&lt;/li&gt;
&lt;li&gt;PIN code&lt;/li&gt;
&lt;li&gt;Express CVV re-verification&lt;/li&gt;
&lt;li&gt;Custom verification code&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Closes gracefully&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every piece of fake data is realistic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Names&lt;/strong&gt; drawn from US census frequency tables&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Addresses&lt;/strong&gt; with real California street patterns and cities&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ZIP codes&lt;/strong&gt; matching California postal zones&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phone numbers&lt;/strong&gt; with correct California area codes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Credit cards&lt;/strong&gt; that pass Luhn validation (Visa, Mastercard, Amex, Discover prefixes)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email addresses&lt;/strong&gt; with realistic username patterns at common providers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From the server's perspective, each session is indistinguishable from a real victim clicking through the phishing flow.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Flood
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;╔══════════════════════════════════════════════════════════╗
║       LIGHTHOUSE FLOOD — Pure Rust WebSocket Engine     ║
║       AES-128-CBC | Direct Socket.IO | Max Throughput   ║
╚══════════════════════════════════════════════════════════╝
Target:       https://ca.gov-axb.cfd
WS Path:      /console/
Concurrency:  100
Count:        ∞
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;First test: 5 sessions, 3 concurrent. &lt;strong&gt;60 events, 0 errors.&lt;/strong&gt; Proof of concept.&lt;/p&gt;

&lt;p&gt;Second test: 200 sessions, 30 concurrent. &lt;strong&gt;2,400 events, 0 errors, 28 seconds.&lt;/strong&gt; Warming up.&lt;/p&gt;

&lt;p&gt;Third test: 1,000 sessions, 100 concurrent. &lt;strong&gt;12,000 events, 0 errors, 42 seconds.&lt;/strong&gt; Now we're talking. ~24 complete fake victims per second.&lt;/p&gt;

&lt;p&gt;Then we let it rip.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;╔══════════════════════════════════════════════════════════╗
║                     FLOOD COMPLETE                      ║
╠══════════════════════════════════════════════════════════╣
║  Submitted: 100700  |  Events: 1208984  |  Errors:    0 ║
╚══════════════════════════════════════════════════════════╝
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;One hundred thousand fake victim sessions. 1.2 million encrypted events. Zero errors.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One hour. One machine. One Rust binary. Their operator's dashboard — the same one they use to monitor real victims in real time — is now a firehose of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Jennifer Wilson&lt;/strong&gt; from San Jose, CA 95132, card ending in 8388&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kevin Sanchez&lt;/strong&gt; from Chula Vista, CA 92101, card ending in 6501&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Laura Martin&lt;/strong&gt; from Santa Ana, CA 92701, card ending in 4787&lt;/li&gt;
&lt;li&gt;... times one hundred thousand.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every single entry looks real. Luhn-valid card numbers that'll fail at the processor. California addresses that go to actual streets. Phone numbers that ring actual area codes. The operators can't tell which data is real and which is garbage. Their entire database is poisoned.&lt;/p&gt;

&lt;p&gt;For every real victim they managed to phish today, there are now &lt;strong&gt;thousands&lt;/strong&gt; of fake records burying them. Good luck finding the needle in that haystack.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;This particular phishing operation is part of a &lt;strong&gt;massive, well-funded, commercially operated&lt;/strong&gt; cybercrime ecosystem. The Smishing Triad runs Lighthouse as a &lt;em&gt;business&lt;/em&gt; — subscription model, customer support, Telegram channels, the works. Google sued them. The FBI has received thousands of complaints. They're still operating.&lt;/p&gt;

&lt;p&gt;Individual takedowns are whack-a-mole. The domain &lt;code&gt;gov-axb.cfd&lt;/code&gt; will die, and tomorrow there'll be &lt;code&gt;gov-xyz.cfd&lt;/code&gt; and &lt;code&gt;gov-abc.win&lt;/code&gt; and a hundred more. The kit itself rotates, the infrastructure shifts, the TLDs change.&lt;/p&gt;

&lt;p&gt;But today? Today, one specific operator's database is garbage. One specific campaign's ROI just cratered. One specific Lighthouse instance's real-time dashboard is scrolling fake Californians faster than any human could possibly triage.&lt;/p&gt;

&lt;p&gt;They set up an encrypted, obfuscated, anti-debugging, mobile-gated phishing operation.&lt;/p&gt;

&lt;p&gt;We reverse-engineered the encryption in an afternoon and flooded them with a million fake victims before dinner.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fuck around. Find out.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Technical Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Target&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ca.gov-axb.cfd&lt;/code&gt; (California DMV phishing)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Threat Actor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Smishing Triad / Lighthouse PhaaS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kit Stack&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Vue.js 3 + Vite + Socket.IO + AES-128-CBC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Socket.IO Path&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/console/&lt;/code&gt; (non-standard)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Encryption Key&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;KIKOCCJCFILDLDND&lt;/code&gt; (UTF-8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Encryption IV&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;OJGJHHFMJEJBDFAI&lt;/code&gt; (UTF-8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kit Fingerprint&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;changleField&lt;/code&gt; typo in all event names&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Flood Tool&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Rust + Tokio + tungstenite (async WebSocket)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sessions Completed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;100,700+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Events Sent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1,208,984+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Error Rate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.000%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Throughput&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~24 complete victim sessions/second&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Duration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~63 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;&lt;em&gt;Filed under: threat intelligence, active defense, phishing disruption, and not taking shit from scammers.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>rust</category>
      <category>reverseengineering</category>
      <category>phishing</category>
    </item>
    <item>
      <title>I Got Sick of Getting Rugged, So I Built a Rug-Pull Detection Engine in Rust</title>
      <dc:creator>Mr. 0x1</dc:creator>
      <pubDate>Mon, 09 Mar 2026 15:37:16 +0000</pubDate>
      <link>https://forem.com/copyleftdev/i-got-sick-of-getting-rugged-so-i-built-a-rug-pull-detection-engine-in-rust-l7l</link>
      <guid>https://forem.com/copyleftdev/i-got-sick-of-getting-rugged-so-i-built-a-rug-pull-detection-engine-in-rust-l7l</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; I was tired of not knowing whether a token contract was about to drain my wallet. So I built &lt;a href="https://rugrat.network" rel="noopener noreferrer"&gt;Rugrat&lt;/a&gt; — a real-time EVM smart contract scanner that analyzes deployed bytecode for rug-pull patterns, runs on-chain state checks, and scores risk across 8 categories. It scans a contract in ~3 microseconds. No verified source code required. This is the story of why I built it and what I learned about adversarial smart contracts along the way.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem No One Talks About Honestly
&lt;/h2&gt;

&lt;p&gt;Here's the thing about crypto: everyone knows rug pulls happen. The stats are ugly — billions lost annually. But the tooling to detect them? It's either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Too slow&lt;/strong&gt; — waiting 30 seconds for a scan while the liquidity drains&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Too dependent on verified source&lt;/strong&gt; — most scam tokens never verify on Etherscan&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Too shallow&lt;/strong&gt; — checking if &lt;code&gt;owner()&lt;/code&gt; returns zero and calling it a day&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Too opaque&lt;/strong&gt; — "Risk Score: 78" with no explanation of &lt;em&gt;why&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'd been burned a few times. Not life-changing money, but enough to make me angry. And the anger wasn't at the scammers — it was at myself for not understanding what I was looking at. I could read Solidity, kind of. But when someone deploys a contract with a hidden fee function that can be cranked to 100% after launch? That's not in the README.&lt;/p&gt;

&lt;p&gt;So I decided: I'm going to understand this problem deeply enough to build something that catches it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Starting From Ground Truth
&lt;/h2&gt;

&lt;p&gt;Before writing a single line of code, I needed data. Not vibes, not Twitter threads — labeled, verified data.&lt;/p&gt;

&lt;p&gt;I collected datasets of confirmed malicious contracts and known benign ones from multiple research sources, covering rug-pull types like unauthorized minting, balance leaking, transfer limits, and several categories of honeypot traps.&lt;/p&gt;

&lt;p&gt;Then I built offline tooling to analyze these corpora — computing precision and recall for dozens of pattern detectors against the labels.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I Found
&lt;/h3&gt;

&lt;p&gt;Some patterns are almost perfectly discriminative. A &lt;code&gt;tradingEnabled&lt;/code&gt; boolean in the transfer path that the owner controls? &lt;strong&gt;Never appeared in a single benign contract in our dataset.&lt;/strong&gt; Same for mutable max transaction amounts and anti-whale logic that can be toggled by the deployer.&lt;/p&gt;

&lt;p&gt;The first "aha" moment: rug pulls aren't subtle. They're structurally distinct. The patterns are there — you just need to look at the right level.&lt;/p&gt;

&lt;p&gt;And that level isn't Solidity source code. It's the bytecode.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Bytecode? Why Not Source Code?
&lt;/h2&gt;

&lt;p&gt;Only ~30% of contracts on Ethereum are verified on Etherscan. Scam tokens almost never verify. If your scanner requires source code, you've already lost the battle.&lt;/p&gt;

&lt;p&gt;Bytecode analysis covers 100% of deployed contracts. Every public function, every storage operation, every control flow path is encoded in the bytecode whether the deployer wants you to see it or not. You can't add comments to make &lt;code&gt;SELFDESTRUCT&lt;/code&gt; look friendly.&lt;/p&gt;

&lt;p&gt;Rugrat works directly on raw deployed bytecode. No Etherscan API key. No source code. No waiting for verification that will never come.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Rugrat Actually Does
&lt;/h2&gt;

&lt;p&gt;When you paste a contract address into &lt;a href="https://rugrat.network" rel="noopener noreferrer"&gt;Rugrat&lt;/a&gt;, here's what happens:&lt;/p&gt;

&lt;h3&gt;
  
  
  Static Analysis (~3 microseconds)
&lt;/h3&gt;

&lt;p&gt;The engine examines the raw bytecode for structural patterns associated with rug pulls:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Function signatures&lt;/strong&gt; — identifying risky admin functions (blacklisting, fee manipulation, minting, pause controls) even without source&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Opcode patterns&lt;/strong&gt; — detecting proxy mechanisms, kill switches, and hidden state manipulation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compound rule evaluation&lt;/strong&gt; — combining multiple signals across 8 risk categories, because individual features can be benign but certain &lt;em&gt;combinations&lt;/em&gt; are not&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each contract gets a risk score with a full breakdown: which categories flagged, which specific patterns matched, and why they matter.&lt;/p&gt;

&lt;h3&gt;
  
  
  On-Chain State Checks
&lt;/h3&gt;

&lt;p&gt;Static analysis tells you what a contract &lt;em&gt;can&lt;/em&gt; do. On-chain checks tell you what it &lt;em&gt;has&lt;/em&gt; done:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ownership&lt;/strong&gt; — Has the owner renounced? Or is someone still holding the keys?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Liquidity&lt;/strong&gt; — Does a DEX pair exist? Is there real liquidity?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LP Lock Status&lt;/strong&gt; — Is the liquidity provider token locked? In which locker? For how long?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proxy Detection&lt;/strong&gt; — Is this an upgradeable contract that can be swapped out?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Honeypot Simulation&lt;/strong&gt; — Can you actually sell this token, or will the transaction fail?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where it gets decisive. A contract with a blacklist function and a non-renounced owner and unlocked liquidity and a failing sell simulation? That's not ambiguous.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Result
&lt;/h3&gt;

&lt;p&gt;You get a full risk report: overall score, risk level (Clean → Critical), category-by-category breakdown, specific findings with severity ratings, and the complete on-chain state. Everything explained, nothing hidden behind a magic number.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real-Time Surveillance: The Live Feed
&lt;/h2&gt;

&lt;p&gt;The scan-on-demand feature is useful, but the live feed is what changes how you think.&lt;/p&gt;

&lt;p&gt;Rugrat monitors new contract deployments across &lt;strong&gt;5 EVM chains&lt;/strong&gt; — Ethereum, BSC, Base, Polygon, and Arbitrum. Every new contract gets scanned automatically and streamed to the UI in real-time via Server-Sent Events, color-coded by risk level.&lt;/p&gt;

&lt;p&gt;Open the page. Watch. See what's deploying right now.&lt;/p&gt;

&lt;p&gt;Watching the feed for 10 minutes and seeing how many contracts deploy with blacklist functions and mutable fees… it's eye-opening. The volume of contracts with risky patterns is much higher than most people expect.&lt;/p&gt;




&lt;h2&gt;
  
  
  Five Chains, One Scanner
&lt;/h2&gt;

&lt;p&gt;The same detection pipeline works identically across all supported networks:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Chain&lt;/th&gt;
&lt;th&gt;DEX Coverage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ethereum&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Uniswap V2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BSC&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PancakeSwap V2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Base&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Uniswap V2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Polygon&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;QuickSwap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Arbitrum&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Camelot&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each chain has its own DEX routing, liquidity locker contracts, and native token configuration. The analysis is identical — same rules, same bytecode patterns, same risk categories. Select your chain and scan.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Telegram Bot
&lt;/h2&gt;

&lt;p&gt;The web UI is great for surveillance, but sometimes you just want to check a contract from your phone before aping in.&lt;/p&gt;

&lt;p&gt;So I built a Telegram bot that runs the entire detection engine — same analysis, same on-chain checks, same risk scoring. No separate codebase, no watered-down version.&lt;/p&gt;

&lt;p&gt;The flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Send &lt;code&gt;/start&lt;/code&gt; — get a welcome message with all 5 supported chains&lt;/li&gt;
&lt;li&gt;Paste any &lt;code&gt;0x...&lt;/code&gt; address — inline buttons ask which chain&lt;/li&gt;
&lt;li&gt;Tap a chain — full scan report delivered right in the chat&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Or use &lt;code&gt;/scan eth 0x1234...&lt;/code&gt; for a one-shot command. Risk score, category breakdown, on-chain state, explorer link — all formatted and delivered in seconds.&lt;/p&gt;

&lt;p&gt;It runs 24/7 as a lightweight background service. 12MB binary, ~10MB memory footprint.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Rust?
&lt;/h2&gt;

&lt;p&gt;Speed was non-negotiable. If you're monitoring new contract deployments in real-time across 5 chains, each scan needs to take essentially no time. The actual bytecode analysis runs in &lt;strong&gt;~3 microseconds&lt;/strong&gt; — that's 300× under a 1ms budget.&lt;/p&gt;

&lt;p&gt;The real bottleneck is network I/O to the RPCs (~200-500ms per &lt;code&gt;eth_getCode&lt;/code&gt; call). The analysis itself is noise compared to fetching the data. That headroom means we can add more rules, more chains, and more checks without ever worrying about the scan engine.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Learned About Adversarial Smart Contracts
&lt;/h2&gt;

&lt;p&gt;Building this changed how I think about the space:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Rug pulls are not sophisticated.&lt;/strong&gt; Most use the same dozen patterns. The scammers aren't brilliant — they're using templates and tutorials. The problem isn't that scams are hard to detect. It's that nobody's looking at the bytecode.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Compound patterns beat individual signals.&lt;/strong&gt; A &lt;code&gt;mint&lt;/code&gt; function alone isn't malicious — ERC-20 tokens need it. But &lt;code&gt;mint&lt;/code&gt; + &lt;code&gt;blacklist&lt;/code&gt; + &lt;code&gt;mutable fees&lt;/code&gt; + &lt;code&gt;owner not renounced&lt;/code&gt;? That's a combination that appeared in malicious contracts 100% of the time in our dataset — and never in benign ones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. On-chain state is the tiebreaker.&lt;/strong&gt; Static analysis tells you what a contract &lt;em&gt;could&lt;/em&gt; do. Ownership status, liquidity locks, and honeypot simulation tell you whether it &lt;em&gt;will&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. The real arms race hasn't started.&lt;/strong&gt; Current rug-pull techniques are detectable because nobody was systematically detecting them at the bytecode level. As scanners improve, attackers will evolve — metamorphic contracts, time-delayed activation, cross-contract splitting. But there's still enormous low-hanging fruit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Speed is a feature, not a luxury.&lt;/strong&gt; If your scanner takes 30 seconds and the rug pull executes in block N+1, your scan result arrives at block N+3. Too late. Microsecond analysis means you can scan before deciding to trade.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Behavioral analysis&lt;/strong&gt; — Post-deployment transaction pattern monitoring&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-contract analysis&lt;/strong&gt; — Factory patterns, deployer reputation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uniswap V3 support&lt;/strong&gt; — Concentrated liquidity honeypot simulation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API for integrators&lt;/strong&gt; — Let wallets and DEX frontends query risk scores before users swap&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://rugrat.network" rel="noopener noreferrer"&gt;https://rugrat.network&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Paste any contract address. Pick a chain. See the full risk breakdown in microseconds.&lt;/p&gt;

&lt;p&gt;Or watch the live feed and see what's deploying right now. You might be surprised.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Rugrat — fast little snitch for shady contracts.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>rust</category>
      <category>security</category>
      <category>blockchain</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How I Found $300,000 Worth of Secrets in a Download Button</title>
      <dc:creator>Mr. 0x1</dc:creator>
      <pubDate>Wed, 04 Feb 2026 08:05:33 +0000</pubDate>
      <link>https://forem.com/copyleftdev/how-i-found-300000-worth-of-secrets-in-a-download-button-1j13</link>
      <guid>https://forem.com/copyleftdev/how-i-found-300000-worth-of-secrets-in-a-download-button-1j13</guid>
      <description>&lt;p&gt;&lt;em&gt;A tale of curiosity, incompetence, and why you should never trust a software engineer who makes more than you.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  In Which I Click a Button Like a Normal Person
&lt;/h2&gt;

&lt;p&gt;It started, as most disasters do, with mild curiosity and a free afternoon.&lt;/p&gt;

&lt;p&gt;I downloaded an application. Not because I'm a hacker. Not because I'm conducting corporate espionage. Not because I have any idea what I'm doing. I downloaded it because I wanted to use it. &lt;/p&gt;

&lt;p&gt;Revolutionary concept, I know.&lt;/p&gt;

&lt;p&gt;The installer was a &lt;code&gt;.exe&lt;/code&gt; file. For the uninitiated, this is the software equivalent of a wrapped gift. And like any gift from a stranger on the internet, I decided to unwrap it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What's inside?" I wondered, the way a child wonders what's inside a clock before destroying it with a hammer.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The Electron Inside
&lt;/h2&gt;

&lt;p&gt;Every modern desktop application, it turns out, is just a website pretending to be software. &lt;/p&gt;

&lt;p&gt;It's like finding out your "homemade" meal came from a freezer bag—technically real, philosophically disappointing.&lt;/p&gt;

&lt;p&gt;This particular application was built with &lt;strong&gt;Electron&lt;/strong&gt;, which means somewhere inside was a file called &lt;code&gt;app.asar&lt;/code&gt;. Think of it as a zip file that &lt;em&gt;really, really&lt;/em&gt; wants you to think it's not a zip file.&lt;/p&gt;

&lt;p&gt;I extracted it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx asar extract app.asar ./unpacked
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside was JavaScript. Thousands of lines of minified, obfuscated JavaScript that looked like someone had sneezed on a keyboard and called it architecture.&lt;/p&gt;

&lt;p&gt;And there, sitting in the open like a wallet on a park bench, was a &lt;code&gt;.env&lt;/code&gt; file.&lt;/p&gt;




&lt;h2&gt;
  
  
  The .env File, or: How to Fail at Security 101
&lt;/h2&gt;

&lt;p&gt;For those blissfully unaware, a &lt;code&gt;.env&lt;/code&gt; file is where developers store secrets. API keys. Database credentials. The sort of things you absolutely, positively, under no circumstances should ship to production.&lt;/p&gt;

&lt;p&gt;It's Security 101. Literally. It's the first thing they teach you:&lt;/p&gt;

&lt;p&gt;🚨 &lt;strong&gt;Rule #1 of Software Development:&lt;/strong&gt; Don't commit your &lt;code&gt;.env&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;This is not advanced knowledge. This is not arcane wisdom passed down through generations of security researchers. &lt;/p&gt;

&lt;p&gt;This is the &lt;strong&gt;"wash your hands after using the bathroom"&lt;/strong&gt; of software development.&lt;/p&gt;

&lt;p&gt;And yet.&lt;/p&gt;

&lt;p&gt;There it was. Gleaming. Unencrypted. Full of credentials.&lt;/p&gt;




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

&lt;p&gt;I won't name names. I won't point fingers. I'll simply describe what I found, in the same way a nature documentary describes a lion eating a gazelle: with clinical detachment and mild horror.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Discovery&lt;/th&gt;
&lt;th&gt;Severity&lt;/th&gt;
&lt;th&gt;My Reaction&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;API Keys&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🔴 Critical&lt;/td&gt;
&lt;td&gt;Multiple. Active. Expensive.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Infrastructure URLs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🔴 Critical&lt;/td&gt;
&lt;td&gt;Internal endpoints. Very not public.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Service Credentials&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🟠 High&lt;/td&gt;
&lt;td&gt;Analytics logging &lt;em&gt;everything&lt;/em&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ML Inference Endpoints&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🟠 High&lt;/td&gt;
&lt;td&gt;Cloud GPUs go brrrr on their dime.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The total potential exposure? &lt;/p&gt;

&lt;p&gt;Let's just say it was significant enough that I briefly considered a career change.&lt;/p&gt;




&lt;h2&gt;
  
  
  The $300,000 Question 💸
&lt;/h2&gt;

&lt;p&gt;Now, here's where it gets personal.&lt;/p&gt;

&lt;p&gt;The engineer who shipped this? Based on industry averages, location, and the general state of the tech job market, they're probably making around &lt;strong&gt;$300,000 a year&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Three. Hundred. Thousand. Dollars.&lt;/p&gt;

&lt;p&gt;To do the software equivalent of leaving your house keys under the doormat, except the doormat is see-through and you've put up a sign that says &lt;strong&gt;"KEYS UNDER HERE."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'm not bitter. I'm not bitter at all. &lt;/p&gt;

&lt;p&gt;I am simply &lt;em&gt;noting&lt;/em&gt;, for the record, that I—a person of humble curiosity—managed to find this in approximately &lt;strong&gt;forty-five minutes&lt;/strong&gt; of casual investigation while eating leftover pizza.&lt;/p&gt;

&lt;p&gt;Meanwhile, somewhere, a senior software engineer is collecting stock options.&lt;/p&gt;

&lt;p&gt;📍 &lt;strong&gt;Plot twist:&lt;/strong&gt; The pizza was cold. The credentials were not.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Investigation Continues
&lt;/h2&gt;

&lt;p&gt;Having found the obvious vulnerabilities, I did what any responsible researcher would do: I kept looking.&lt;/p&gt;

&lt;p&gt;The JavaScript bundle was minified, but minification is obfuscation in the same way a trench coat is a disguise. It technically conceals things, but anyone who looks for more than five seconds can see what's underneath.&lt;/p&gt;

&lt;p&gt;I found:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🗂️ &lt;strong&gt;Source map hints&lt;/strong&gt; pointing to internal repositories&lt;/li&gt;
&lt;li&gt;🐛 &lt;strong&gt;Debug symbols&lt;/strong&gt; that should have been stripped
&lt;/li&gt;
&lt;li&gt;📋 &lt;strong&gt;Hardcoded configuration&lt;/strong&gt; copy-pasted from dev&lt;/li&gt;
&lt;li&gt;📡 &lt;strong&gt;gRPC definitions&lt;/strong&gt; outlining the entire API structure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each discovery was like opening a nesting doll, except instead of smaller dolls, it was smaller failures.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Moral of the Story
&lt;/h2&gt;

&lt;p&gt;If you've made it this far, you might be expecting a dramatic conclusion. A confrontation with the company. A bug bounty payout. A heartfelt apology from a CEO.&lt;/p&gt;

&lt;p&gt;Instead, I'll offer you something more valuable: &lt;strong&gt;a lesson&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  To the Developers 👩‍💻
&lt;/h3&gt;

&lt;p&gt;Your build pipeline is not a security feature. Electron apps are zip files with extra steps. Minification is not encryption. &lt;/p&gt;

&lt;p&gt;And for the love of all that is holy, &lt;em&gt;check what you're shipping before you ship it&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Before you ship, maybe run:&lt;/span&gt;
npx asar extract your-app.asar ./check-this
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"API_KEY&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;SECRET&lt;/span&gt;&lt;span class="se"&gt;\|&lt;/span&gt;&lt;span class="s2"&gt;PASSWORD"&lt;/span&gt; ./check-this
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  To the Companies 🏢
&lt;/h3&gt;

&lt;p&gt;That engineer you're paying $300,000? &lt;/p&gt;

&lt;p&gt;Maybe budget $50 for a security audit. I'll do it. I'm available. I have pizza.&lt;/p&gt;

&lt;h3&gt;
  
  
  To the Users 👤
&lt;/h3&gt;

&lt;p&gt;Every application you download is a mystery box. &lt;/p&gt;

&lt;p&gt;The mystery is usually "how badly is my data being handled?" &lt;/p&gt;

&lt;p&gt;The answer is usually "badly."&lt;/p&gt;




&lt;h2&gt;
  
  
  Responsible Disclosure
&lt;/h2&gt;

&lt;p&gt;I want to be clear: &lt;strong&gt;I didn't exploit anything.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;I didn't access systems I wasn't supposed to. I looked at what was shipped to me, as a user, in an application I downloaded from their official website.&lt;/p&gt;

&lt;p&gt;Everything I found was sitting in a package that anyone with fifteen minutes and a search engine could have extracted. The only sophisticated tool I used was &lt;code&gt;npm&lt;/code&gt; and a vague sense of disbelief.&lt;/p&gt;

&lt;p&gt;This article names no names. Points no fingers that haven't already been pointed by the act of shipping credentials in a desktop application.&lt;/p&gt;




&lt;h2&gt;
  
  
  Epilogue: The Download Button
&lt;/h2&gt;

&lt;p&gt;I still use the application. It's actually quite good.&lt;/p&gt;

&lt;p&gt;I just use it with the quiet knowledge that somewhere, in a data center, there's a server running endpoints I wasn't supposed to know about, processing requests through an API I could technically call, protected by credentials that are sitting in my Downloads folder.&lt;/p&gt;

&lt;p&gt;The download button that started all this sits innocently on their website, cheerfully inviting users to install their app.&lt;/p&gt;

&lt;p&gt;Beneath it, there should probably be a disclaimer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"By downloading this software, you agree to receive a free education in application security."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  TL;DR Checklist
&lt;/h2&gt;

&lt;p&gt;If you ship Electron apps, please check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] No &lt;code&gt;.env&lt;/code&gt; files in your build&lt;/li&gt;
&lt;li&gt;[ ] No hardcoded API keys&lt;/li&gt;
&lt;li&gt;[ ] No internal URLs exposed&lt;/li&gt;
&lt;li&gt;[ ] No debug symbols in production&lt;/li&gt;
&lt;li&gt;[ ] Source maps are NOT included&lt;/li&gt;
&lt;li&gt;[ ] You've actually looked inside your &lt;code&gt;.asar&lt;/code&gt; file&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you found credentials in your own app while reading this, you're welcome.&lt;/p&gt;

&lt;p&gt;If you're the $300k engineer who shipped this... we should talk.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The author is a security researcher in the same way that someone who finds a wallet on the ground is a "detective." DMs are open. Pizza recommendations welcome.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I Replaced My LLM Orchestrator with Plant Biology — Here's What Happened</title>
      <dc:creator>Mr. 0x1</dc:creator>
      <pubDate>Tue, 20 Jan 2026 16:49:41 +0000</pubDate>
      <link>https://forem.com/copyleftdev/i-replaced-my-llm-orchestrator-with-plant-biology-heres-what-happened-52im</link>
      <guid>https://forem.com/copyleftdev/i-replaced-my-llm-orchestrator-with-plant-biology-heres-what-happened-52im</guid>
      <description>&lt;p&gt;What if your AI agents coordinated like plants instead of following a script?&lt;/p&gt;

&lt;p&gt;That question led me down a rabbit hole that ended with &lt;strong&gt;Robin×SMESH&lt;/strong&gt; — a dark web OSINT framework where agents discover, scrape, and analyze threat intelligence through &lt;em&gt;signal diffusion&lt;/em&gt; rather than central orchestration.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: LLM Pipelines Are Fragile
&lt;/h2&gt;

&lt;p&gt;The original &lt;a href="https://github.com/apurvsinghgautam/robin" rel="noopener noreferrer"&gt;Robin&lt;/a&gt; is a solid Python tool for dark web reconnaissance. It queries .onion search engines, filters results with an LLM, scrapes content, and extracts IOCs. Classic pipeline architecture:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Query → Search → Filter → Scrape → Extract → Analyze
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But pipelines have problems:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Single point of failure&lt;/strong&gt; — One timeout kills everything&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sequential bottlenecks&lt;/strong&gt; — Each stage waits for the previous&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No emergent behavior&lt;/strong&gt; — Agents can't adapt or collaborate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rigid orchestration&lt;/strong&gt; — Adding new capabilities means rewriting the controller&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I wanted something more... &lt;em&gt;organic&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter SMESH: Plant-Inspired Coordination
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/copyleftdev/smesh-rust" rel="noopener noreferrer"&gt;SMESH&lt;/a&gt; (Signal-Mediated Emergent Swarm Heuristics) is a coordination protocol inspired by how plants communicate through chemical signals.&lt;/p&gt;

&lt;p&gt;Plants don't have brains, yet they:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Coordinate growth toward light across millions of cells&lt;/li&gt;
&lt;li&gt;Respond to threats by releasing warning chemicals&lt;/li&gt;
&lt;li&gt;Share resources through root networks&lt;/li&gt;
&lt;li&gt;Adapt to damage without central control&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key insight: &lt;strong&gt;coordination emerges from simple local rules + shared signals&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  How SMESH Works
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌────────────────────────────────────────────────────────────┐
│                    SHARED SIGNAL FIELD                      │
│   Signals decay over time · Reinforcement = consensus       │
│              No central controller                          │
└────────────────────────────────────────────────────────────┘
       ▲              ▲              ▲              ▲
  ┌────┴────┐    ┌────┴────┐    ┌────┴────┐    ┌────┴────┐
  │ Agent A │    │ Agent B │    │ Agent C │    │ Agent D │
  └─────────┘    └─────────┘    └─────────┘    └─────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each agent follows three rules:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Sense&lt;/strong&gt; — Detect signals above your threshold&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Process&lt;/strong&gt; — Do your specialized work&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Emit&lt;/strong&gt; — Broadcast results as new signals&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Signals have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Intensity&lt;/strong&gt; — How "loud" the signal is (decays over time)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confidence&lt;/strong&gt; — How reliable (multiple agents agreeing = reinforcement)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TTL&lt;/strong&gt; — Time-to-live before signal dies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No agent knows the full plan. Coordination &lt;em&gt;emerges&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Marrying Robin + SMESH
&lt;/h2&gt;

&lt;p&gt;Here's how I mapped OSINT operations to signal types:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Signal Type&lt;/th&gt;
&lt;th&gt;Emitter&lt;/th&gt;
&lt;th&gt;Consumer&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;UserQuery&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CLI&lt;/td&gt;
&lt;td&gt;Refiner&lt;/td&gt;
&lt;td&gt;Initial investigation request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;RefinedQuery&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Refiner&lt;/td&gt;
&lt;td&gt;Crawlers&lt;/td&gt;
&lt;td&gt;Optimized search terms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;RawResults&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Crawlers&lt;/td&gt;
&lt;td&gt;Filter&lt;/td&gt;
&lt;td&gt;.onion URLs from search engines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;FilteredResults&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Filter&lt;/td&gt;
&lt;td&gt;Scrapers&lt;/td&gt;
&lt;td&gt;Relevant URLs only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ScrapedContent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Scrapers&lt;/td&gt;
&lt;td&gt;Extractor, Analyst&lt;/td&gt;
&lt;td&gt;Page content&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ExtractedArtifacts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Extractor&lt;/td&gt;
&lt;td&gt;Enricher, Analyst&lt;/td&gt;
&lt;td&gt;IOCs (IPs, emails, hashes)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;EnrichedArtifacts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enricher&lt;/td&gt;
&lt;td&gt;Analyst&lt;/td&gt;
&lt;td&gt;Surface web context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Summary&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Analyst&lt;/td&gt;
&lt;td&gt;CLI&lt;/td&gt;
&lt;td&gt;Final intelligence report&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The magic: &lt;strong&gt;agents don't know about each other&lt;/strong&gt;. The Crawler doesn't call the Filter. It just emits &lt;code&gt;RawResults&lt;/code&gt; signals. The Filter happens to be listening for those.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Discovery #1: Fault Tolerance for Free
&lt;/h2&gt;

&lt;p&gt;With the pipeline approach, if one Tor request times out, you need retry logic, circuit breakers, and error handling spaghetti.&lt;/p&gt;

&lt;p&gt;With SMESH? Signals just decay. Other crawlers pick up the slack. If &lt;code&gt;crawler-1&lt;/code&gt; fails to emit results for a query, &lt;code&gt;crawler-2&lt;/code&gt; and &lt;code&gt;crawler-3&lt;/code&gt; might succeed. The Field doesn't care who produces the signal — it just propagates whatever arrives.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="c1"&gt;// No error handling needed at the orchestration level&lt;/span&gt;
&lt;span class="c1"&gt;// Agents fail silently, signals decay, life goes on&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.agents&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="nf"&gt;.process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.field&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.field&lt;/span&gt;&lt;span class="nf"&gt;.tick&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Advance time, decay signals&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Key Discovery #2: Multi-Agent Consensus
&lt;/h2&gt;

&lt;p&gt;When multiple crawlers find the same URL, the signal gets &lt;em&gt;reinforced&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;reinforce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;signal_hash&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;boost&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;f64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nf"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.signals&lt;/span&gt;&lt;span class="nf"&gt;.get_mut&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signal_hash&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="py"&gt;.confidence&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="py"&gt;.confidence&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;boost&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is huge for filtering noise. URLs that appear in multiple search engines naturally bubble up. Duplicate artifacts get higher confidence scores. &lt;strong&gt;Agreement = signal strength&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Discovery #3: Specialists Emerge from Personas
&lt;/h2&gt;

&lt;p&gt;I defined agent behaviors in TOML files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="c"&gt;# prompts/analyst_threat_intel.toml&lt;/span&gt;
&lt;span class="nn"&gt;[persona]&lt;/span&gt;
&lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Threat Intelligence Analyst"&lt;/span&gt;
&lt;span class="py"&gt;role&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"specialist"&lt;/span&gt;

&lt;span class="nn"&gt;[persona.expertise]&lt;/span&gt;
&lt;span class="py"&gt;primary&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Threat actor TTPs and campaign analysis"&lt;/span&gt;
&lt;span class="py"&gt;domains&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s"&gt;"APT group identification"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"Malware family classification"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"Attack pattern recognition"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now I can run 6 specialist analysts in parallel, each sensing the same signals but interpreting through different lenses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🎯 Threat Intel — Actor TTPs, campaigns&lt;/li&gt;
&lt;li&gt;💰 Financial Crime — Crypto flows, money laundering
&lt;/li&gt;
&lt;li&gt;🔐 Technical — Malware, exploits&lt;/li&gt;
&lt;li&gt;🌍 Geopolitical — Nation-state attribution&lt;/li&gt;
&lt;li&gt;⚖️ Legal — Evidence handling, jurisdiction&lt;/li&gt;
&lt;li&gt;🔮 Strategic — Trend forecasting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A lead analyst then synthesizes their reports. &lt;strong&gt;Emergent multi-perspective analysis&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Discovery #4: Bridging Dark ↔ Surface Web
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;EnrichmentAgent&lt;/code&gt; was a late addition that proved surprisingly powerful:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="c1"&gt;// When we extract an email from a dark web forum...&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;artifact&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Artifact&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
    &lt;span class="n"&gt;artifact_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nn"&gt;ArtifactType&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"h4ck3r@protonmail.com"&lt;/span&gt;&lt;span class="nf"&gt;.into&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// ...query GitHub for commits with that email&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;github_results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="nf"&gt;.search_github&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;artifact&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// ...and Brave Search for breach mentions&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;brave_results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="nf"&gt;.search_brave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;artifact&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dark web pseudonyms often leak into legitimate platforms. GitHub commits, forum posts, domain registrations. The enricher finds these connections automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;robin-smesh/
├── robin-core/      # Signals, artifacts, field mechanics
├── robin-tor/       # Tor proxy, crawlers, scrapers
├── robin-agents/    # Specialized OSINT agents
│   ├── refiner.rs   # Query optimization
│   ├── crawler.rs   # .onion search engines
│   ├── filter.rs    # LLM-based relevance filtering
│   ├── scraper.rs   # Content extraction
│   ├── extractor.rs # IOC/artifact identification
│   ├── enricher.rs  # Surface web correlation
│   └── analyst.rs   # Intelligence synthesis
├── robin-runtime/   # SMESH swarm coordinator
└── robin-cli/       # User interface
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Results: Before vs After
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Python Robin&lt;/th&gt;
&lt;th&gt;Robin×SMESH&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fault tolerance&lt;/td&gt;
&lt;td&gt;Manual retries&lt;/td&gt;
&lt;td&gt;Automatic via decay&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parallelism&lt;/td&gt;
&lt;td&gt;ThreadPool&lt;/td&gt;
&lt;td&gt;N independent agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Analysis depth&lt;/td&gt;
&lt;td&gt;Single LLM call&lt;/td&gt;
&lt;td&gt;6 specialists + synthesis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extensibility&lt;/td&gt;
&lt;td&gt;Modify pipeline&lt;/td&gt;
&lt;td&gt;Add new agent type&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dark↔Surface bridge&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;GitHub + Brave enrichment&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clone and build&lt;/span&gt;
git clone https://github.com/copyleftdev/robin-smesh
&lt;span class="nb"&gt;cd &lt;/span&gt;robin-smesh
cargo build &lt;span class="nt"&gt;--release&lt;/span&gt;

&lt;span class="c"&gt;# Run with multi-specialist analysis + enrichment&lt;/span&gt;
&lt;span class="nv"&gt;ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sk-ant-... ./target/release/robin-smesh query &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="s2"&gt;"ransomware bitcoin wallets"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--specialists&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--enrich&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--timeout&lt;/span&gt; 300
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Bio-inspired != bio-realistic&lt;/strong&gt; — I'm not actually simulating plant hormones. I'm borrowing the &lt;em&gt;abstraction&lt;/em&gt; of signal-mediated coordination.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Emergence requires constraints&lt;/strong&gt; — Agents need clear sensing thresholds and signal types. Too much freedom = chaos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Decay is a feature&lt;/strong&gt; — Letting signals die naturally is more elegant than explicit garbage collection.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;LLMs are better as specialists&lt;/strong&gt; — Instead of one god-model orchestrating everything, use focused experts that emit structured signals.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The dark web is surprisingly chatty&lt;/strong&gt; — Threat actors reuse emails, leak usernames, and leave breadcrumbs across platforms. Automated enrichment catches what manual analysis misses.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;More enrichment sources&lt;/strong&gt; — Shodan, VirusTotal, Have I Been Pwned&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Signal visualization&lt;/strong&gt; — Real-time field state dashboard&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent breeding&lt;/strong&gt; — Spawn more of whichever agent type is most productive&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-investigation memory&lt;/strong&gt; — Signals that persist across runs&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;The code is MIT/Apache-2.0 licensed at &lt;a href="https://github.com/copyleftdev/robin-smesh" rel="noopener noreferrer"&gt;github.com/copyleftdev/robin-smesh&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you've experimented with swarm intelligence or bio-inspired AI, I'd love to hear about it. Drop a comment or find me on GitHub.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Happy hunting.&lt;/em&gt; 🕸️&lt;/p&gt;

</description>
      <category>rust</category>
      <category>ai</category>
      <category>osint</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>Optimizing LLM Context Windows: Reducing Token Usage by 40% with TOON and Rust</title>
      <dc:creator>Mr. 0x1</dc:creator>
      <pubDate>Sat, 17 Jan 2026 07:37:02 +0000</pubDate>
      <link>https://forem.com/copyleftdev/optimizing-llm-context-windows-reducing-token-usage-by-40-with-toon-and-rust-1j10</link>
      <guid>https://forem.com/copyleftdev/optimizing-llm-context-windows-reducing-token-usage-by-40-with-toon-and-rust-1j10</guid>
      <description>&lt;h2&gt;
  
  
  Abstract
&lt;/h2&gt;

&lt;p&gt;As Large Language Models (LLMs) integration becomes ubiquitous in distributed systems, the cost of context window consumption has emerged as a critical infrastructure metric. While JSON remains the de facto standard for data interchange, its syntactic verbosity imposes a measurable "token tax" on every API call. This article introduces &lt;strong&gt;TOON (Token-Oriented Object Notation)&lt;/strong&gt;, a data serialization format designed explicitly for LLM token efficiency, and details the implementation of a &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt; server in Rust. We demonstrate how this architecture achieves an 18-40% reduction in token usage while maintaining type safety and interoperability.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The Economics of Context
&lt;/h2&gt;

&lt;p&gt;In the modern AI stack, tokens are a finite capability and a direct cost center. Whether you are running inference on OpenAI's GPT-4, Anthropic's Claude 3.5, or a self-hosted Llama 3, the billing model remains consistent: you pay for what you send.&lt;/p&gt;

&lt;p&gt;Standard JSON, while human-readable and universally supported, is suboptimal for token-based pricing models. Consider the structural redundancy in a typical array of objects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"u_001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Alice Corp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"access_level"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"admin"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"region"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"us-east-1"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"u_002"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bob Ltd"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"access_level"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"write"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"region"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eu-west-1"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"u_003"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Charlie Inc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"access_level"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"read"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"region"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ap-northeast-1"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Every repeated key (&lt;code&gt;"access_level"&lt;/code&gt;, &lt;code&gt;"region"&lt;/code&gt;) and every predictable delimiter consumes context window space. For large datasets—such as RAG (Retrieval-Augmented Generation) payloads, log analysis, or historical data ingestion—this overhead accumulates rapidly, increasing both latency and operational expendature.&lt;/p&gt;
&lt;h2&gt;
  
  
  2. The Solution: Token-Oriented Object Notation (TOON)
&lt;/h2&gt;

&lt;p&gt;TOON was architected to solve this specific inefficiency. It eliminates redundant keys and minimizes syntactic noise without sacrificing the schema-less flexibility that makes JSON attractive.&lt;/p&gt;

&lt;p&gt;The previous example, encoded in TOON:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;users[3]{id,name,access_level,region}:
  u_001,Alice Corp,admin,us-east-1
  u_002,Bob Ltd,write,eu-west-1
  u_003,Charlie Inc,read,ap-northeast-1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Key Technical Characteristics
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Header-Row Schematization&lt;/strong&gt;: Keys are defined once per object list, drastically reducing character count.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Minimal Delimiters&lt;/strong&gt;: Commas and newlines replace heavy bracketing.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Type Inference&lt;/strong&gt;: The format supports strict typing while allowing for concise representation.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In our benchmarks, this transformation yields a consistent &lt;strong&gt;30-40% reduction in token count&lt;/strong&gt; for array-heavy structures.&lt;/p&gt;
&lt;h2&gt;
  
  
  3. System Architecture: The Rust MCP Server
&lt;/h2&gt;

&lt;p&gt;To operationalize TOON, we leveraged the &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt;. MCP provides a standardized interface for AI models to interact with external tools and data contexts. By wrapping the TOON logic in an MCP server, we decouple the implementation from the client, allowing &lt;em&gt;any&lt;/em&gt; MCP-compliant agent (Claude Desktop, Cursor, IDE assistants) to utilize these optimization tools natively.&lt;/p&gt;
&lt;h3&gt;
  
  
  3.1 Why Rust?
&lt;/h3&gt;

&lt;p&gt;We selected Rust for the server implementation (&lt;code&gt;toon-mcp&lt;/code&gt;) to satisfy three non-functional requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Zero-Cost Abstractions&lt;/strong&gt;: The &lt;code&gt;serde&lt;/code&gt; ecosystem allows for high-performance serialization/deserialization with minimal memory overhead.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Safety&lt;/strong&gt;: Rust's ownership model ensures memory safety without a garbage collector, crucial for continuous-running sidecar processes.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Portability&lt;/strong&gt;: Compiling to a single, static binary simplifies the deployment of the MCP server across diverse engineering environments.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  3.2 Tool Implementation
&lt;/h3&gt;

&lt;p&gt;The server exposes a suite of distinct tools via the MCP protocol. The core logic is defined using the &lt;code&gt;rmcp&lt;/code&gt; SDK's procedural macros, ensuring type-safe interfaces between the LLM and the Rust runtime.&lt;/p&gt;
&lt;h4&gt;
  
  
  The &lt;code&gt;toon_encode&lt;/code&gt; Tool
&lt;/h4&gt;

&lt;p&gt;This functional primitive accepts a generic JSON value and returns the compressed TOON string.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Simplified signature for the MCP tool handler&lt;/span&gt;
&lt;span class="nd"&gt;#[tool(&lt;/span&gt;
    &lt;span class="nd"&gt;name&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"toon_encode"&lt;/span&gt;&lt;span class="nd"&gt;,&lt;/span&gt;
    &lt;span class="nd"&gt;description&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Optimizes JSON payloads into TOON format for token efficiency."&lt;/span&gt;
&lt;span class="nd"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;EncodeArgs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;EncodingResult&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="py"&gt;.options&lt;/span&gt;&lt;span class="nf"&gt;.unwrap_or_default&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;toon_string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;toon&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;to_string_with_options&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="py"&gt;.json&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;.map_err&lt;/span&gt;&lt;span class="p"&gt;(|&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nn"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;custom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;format!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Serialization failed: {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;EncodingResult&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;toon_string&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The server also enables &lt;code&gt;toon_decode&lt;/code&gt; for bi-directional interoperability (allowing the LLM to output TOON for the system to process) and &lt;code&gt;toon_stats&lt;/code&gt;, a utility for realtime cost-benefit analysis.&lt;/p&gt;
&lt;h2&gt;
  
  
  4. Integration &amp;amp; Real-World Usage
&lt;/h2&gt;

&lt;p&gt;Deploying the &lt;code&gt;toon-mcp&lt;/code&gt; server involves a simple configuration addition to your MCP client (e.g., &lt;code&gt;claude_desktop_config.json&lt;/code&gt;). Once active, the LLM treats &lt;code&gt;toon_encode&lt;/code&gt; as a native capability.&lt;/p&gt;
&lt;h3&gt;
  
  
  Agent Workflow Example
&lt;/h3&gt;

&lt;p&gt;When tasked with analyzing a large log file, an agent equipped with &lt;code&gt;toon-mcp&lt;/code&gt; can autonomously optimize its context:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Agent Logic&lt;/strong&gt;: Recognizes a large JSON dataset in the prompt.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Tool Invocation&lt;/strong&gt;: Calls &lt;code&gt;toon_encode(json=dataset)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Context Injection&lt;/strong&gt;: Receives the compact TOON string.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Analysis&lt;/strong&gt;: Processes the data using significantly fewer tokens.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This workflow is transparent to the end-user but results in faster inference and lower bills.&lt;/p&gt;
&lt;h2&gt;
  
  
  5. Benchmark Results
&lt;/h2&gt;

&lt;p&gt;We conducted a series of tests against standard datasets to quantify the efficiency gains.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dataset Type&lt;/th&gt;
&lt;th&gt;Size (JSON)&lt;/th&gt;
&lt;th&gt;Size (TOON)&lt;/th&gt;
&lt;th&gt;Reduction (Bytes)&lt;/th&gt;
&lt;th&gt;Est. Token Reduction&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;User Logs (1k rows)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;145 KB&lt;/td&gt;
&lt;td&gt;92 KB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;36%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~38%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;E-commerce Config&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;24 KB&lt;/td&gt;
&lt;td&gt;19 KB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;21%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~20%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Geo-spatial Points&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;512 KB&lt;/td&gt;
&lt;td&gt;290 KB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;43%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~45%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Note: Token counts are estimated using the &lt;code&gt;cl100k_base&lt;/code&gt; tokenizer (GPT-4).&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;toon-mcp&lt;/code&gt; server represents a pragmatic application of systems engineering to the problem of AI operational costs. By combining the efficiency of the TOON format with the performance of Rust and the standardization of MCP, we have created a robust tool for modern AI workflows.&lt;/p&gt;

&lt;p&gt;For engineers looking to optimize their LLM infrastructure, &lt;code&gt;toon-mcp&lt;/code&gt; captures the ethos of doing more with less—less latency, less cost, and less waste.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repository&lt;/strong&gt;: &lt;br&gt;


&lt;/p&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/copyleftdev" rel="noopener noreferrer"&gt;
        copyleftdev
      &lt;/a&gt; / &lt;a href="https://github.com/copyleftdev/toon-mcp" rel="noopener noreferrer"&gt;
        toon-mcp
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      MCP server for TOON format - token-efficient JSON alternative for LLM prompts
    &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;TOON MCP Server&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://www.rust-lang.org/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/ca1fb72f9979a9fdae8374b318ef81c515751ee3dde21f74644e5d46c3f1747e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f727573742d312e37302532422d626c75652e737667" alt="Rust"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;MCP server exposing TOON format for LLM cost optimization. &lt;strong&gt;18-40% token savings&lt;/strong&gt; over JSON.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href="https://github.com/copyleftdev/toon-mcp" rel="noopener noreferrer"&gt;github.com/copyleftdev/toon-mcp&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Demo&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/copyleftdev/toon-mcp/demo.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fcopyleftdev%2Ftoon-mcp%2Fdemo.gif" alt="TOON MCP Server Demo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Installation&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;cargo build --release&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Usage&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Claude Desktop&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Add to &lt;code&gt;~/Library/Application Support/Claude/claude_desktop_config.json&lt;/code&gt; (macOS) or &lt;code&gt;%APPDATA%\Claude\claude_desktop_config.json&lt;/code&gt; (Windows):&lt;/p&gt;
&lt;div class="highlight highlight-source-json notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;{
  &lt;span class="pl-ent"&gt;"mcpServers"&lt;/span&gt;: {
    &lt;span class="pl-ent"&gt;"toon"&lt;/span&gt;: {
      &lt;span class="pl-ent"&gt;"command"&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;/path/to/toon-mcp&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;
    }
  }
}&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Claude Code CLI&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Add to &lt;code&gt;~/.claude/settings.json&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight highlight-source-json notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;{
  &lt;span class="pl-ent"&gt;"mcpServers"&lt;/span&gt;: {
    &lt;span class="pl-ent"&gt;"toon"&lt;/span&gt;: {
      &lt;span class="pl-ent"&gt;"command"&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;/path/to/toon-mcp&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;
    }
  }
}&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Or for project-specific configuration, create &lt;code&gt;.mcp.json&lt;/code&gt; in your project root:&lt;/p&gt;
&lt;div class="highlight highlight-source-json notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;{
  &lt;span class="pl-ent"&gt;"mcpServers"&lt;/span&gt;: {
    &lt;span class="pl-ent"&gt;"toon"&lt;/span&gt;: {
      &lt;span class="pl-ent"&gt;"command"&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;/path/to/toon-mcp&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;
    }
  }
}&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Cursor IDE&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Add to &lt;code&gt;.cursor/mcp.json&lt;/code&gt; in your project:&lt;/p&gt;
&lt;div class="highlight highlight-source-json notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;{
  &lt;span class="pl-ent"&gt;"mcpServers"&lt;/span&gt;: {
    &lt;span class="pl-ent"&gt;"toon"&lt;/span&gt;: {
      &lt;span class="pl-ent"&gt;"command"&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;/path/to/toon-mcp&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;
    }
  }
}&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Generic MCP Client&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;The server uses stdio transport. Connect by spawning the process and communicating via stdin/stdout:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Start server and send initialize request&lt;/span&gt;
&lt;span class="pl-c1"&gt;echo&lt;/span&gt; &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;'&lt;/span&gt;{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"my-client","version":"1.0"}}}&lt;span class="pl-pds"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class="pl-k"&gt;|&lt;/span&gt; ./toon-mcp&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/copyleftdev/toon-mcp" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




</description>
      <category>rust</category>
      <category>ai</category>
      <category>performance</category>
    </item>
    <item>
      <title>The Infinite Buffer: Why AI Agents Are Rebuilding the Lisp Machine</title>
      <dc:creator>Mr. 0x1</dc:creator>
      <pubDate>Tue, 13 Jan 2026 17:57:53 +0000</pubDate>
      <link>https://forem.com/copyleftdev/the-infinite-buffer-why-ai-agents-are-rebuilding-the-lisp-machine-k4g</link>
      <guid>https://forem.com/copyleftdev/the-infinite-buffer-why-ai-agents-are-rebuilding-the-lisp-machine-k4g</guid>
      <description>&lt;h2&gt;
  
  
  1. The GUI Trap
&lt;/h2&gt;

&lt;p&gt;For the last decade, the evolution of software development tools has been driven by a single imperative: &lt;strong&gt;Visual Ergonomics&lt;/strong&gt;. We built tools like VS Code, IntelliJ, and Zed to be visually intuitive for human eyes. We optimized for pixel-perfect rendering, mouse interactions, and discoverability via menus.&lt;/p&gt;

&lt;p&gt;But with the rise of Large Language Models (LLMs), this "Visual Imperative" has become a liability.&lt;/p&gt;

&lt;p&gt;When an AI Agent tries to use a modern IDE, it encounters a wall of opaque pixels. To perform a simple action—like opening a file or running a test—it often has to navigate complex accessibility trees or hallucinate coordinate clicks. The very features that make IDEs friendly to humans make them hostile to machines.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Text as the Universal Solvent
&lt;/h2&gt;

&lt;p&gt;Intelligence, in its current artificial form, is fundamentally &lt;strong&gt;text-processing at scale&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If we want to build a true "AI Control Plane," we must abandon the notion of the screen. An efficient AI environment should not be a collection of buttons; it should be a collection of &lt;strong&gt;Buffers&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Filesystem&lt;/strong&gt;: Instead of a file tree widget, the AI needs a text buffer listing files (like &lt;code&gt;dired&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Process Management&lt;/strong&gt;: Instead of a "Terminal Tab," the AI needs a read-eval-print loop (REPL) where input and output are just strings.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;State&lt;/strong&gt;: Instead of hidden memory structures, the AI needs a text representation of the editor's own state.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this paradigm, reading the state of the world is just &lt;code&gt;read()&lt;/code&gt;, and changing the world is just &lt;code&gt;write()&lt;/code&gt;. The friction of "UI navigation" disappears.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The Return of the Lisp Machine
&lt;/h2&gt;

&lt;p&gt;This isn't a new idea. It is the philosophy of the &lt;strong&gt;Lisp Machine&lt;/strong&gt;, seemingly lost to history but preserved in one enduring artifact: &lt;strong&gt;Emacs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Emacs is often mocked for being "an operating system lacking a decent editor," but that architectural quirk is exactly what AI Agents require. In Emacs (and Lisp environments generally), there is no distinction between the "Editor" and the "User Code." Everything is data. Everything is malleable.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Introspection&lt;/strong&gt;: An agent can query the documentation of a function it is about to call.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Extensibility&lt;/strong&gt;: An agent can redefine a buggy function at runtime without restarting the environment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This &lt;strong&gt;Code/Data Duality&lt;/strong&gt; (Homoiconicity) allows the agent to be a participant in the system, not just an external operator.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. ZEMACS: A Reference Implementation
&lt;/h2&gt;

&lt;p&gt;To demonstrate this architecture, we built &lt;strong&gt;ZEMACS&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;ZEMACS is a "Headless Control Plane" that exposes the semantics of a Lisp Machine over the &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt;. It strips away the GUI entirely, leaving only the pure textual essence of the editor.&lt;/p&gt;

&lt;p&gt;It provides the AI with:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Universal Search&lt;/strong&gt;: &lt;code&gt;grep&lt;/code&gt; and &lt;code&gt;find&lt;/code&gt; as first-class primitives.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Persistent REPLs&lt;/strong&gt;: Stateful Python/Bash sessions that persist across "thoughts."&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;LSP Integration&lt;/strong&gt;: Type definitions and diagnostics as text streams.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By treating the "Editor" as a textual API rather than a visual application, we found that agents became significantly more capable, autonomous, and reliable.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Conclusion
&lt;/h2&gt;

&lt;p&gt;The future of AI-assisted coding isn't a better chatbot in your sidebar. It is a fundamental architectural shift back to &lt;strong&gt;text-centric computing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;As we build the next generation of developer tools, we should stop trying to build "Better GUIs for AIs." We should be building &lt;strong&gt;Infinite Buffers&lt;/strong&gt;. We should be rebuilding the Lisp Machine. &lt;/p&gt;

&lt;p&gt;Because in the end, for an AI, text isn't just an interface. It's the whole world.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>emacs</category>
      <category>zig</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I Asked My Dog How Trees Talk. Now I'm Rethinking LLM Orchestration.</title>
      <dc:creator>Mr. 0x1</dc:creator>
      <pubDate>Tue, 06 Jan 2026 04:47:49 +0000</pubDate>
      <link>https://forem.com/copyleftdev/i-asked-my-dog-how-trees-talk-now-im-rethinking-llm-orchestration-1akk</link>
      <guid>https://forem.com/copyleftdev/i-asked-my-dog-how-trees-talk-now-im-rethinking-llm-orchestration-1akk</guid>
      <description>&lt;p&gt;&lt;em&gt;A hippie's journey from forest walks to sub-microsecond signal processing.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Walk That Started Everything
&lt;/h2&gt;

&lt;p&gt;I was walking my dog last month. Nothing special—just the usual loop through the neighborhood, past the old oaks and overgrown hedges.&lt;/p&gt;

&lt;p&gt;But I kept looking at the trees.&lt;/p&gt;

&lt;p&gt;Not in a "oh, pretty leaves" way. More like... &lt;em&gt;really&lt;/em&gt; looking. The way they grew toward each other. How the roots of different species seemed to know where the others were. How a whole grove of aspens will change color at almost the same time.&lt;/p&gt;

&lt;p&gt;I turned to my dog and said out loud: &lt;strong&gt;"How do you think these things talk to each other?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;She didn't answer. (She's not that kind of dog.)&lt;/p&gt;

&lt;p&gt;But the question wouldn't leave me alone.&lt;/p&gt;




&lt;h2&gt;
  
  
  Down the Rabbit Hole
&lt;/h2&gt;

&lt;p&gt;So I did what any reasonable person does at 11pm on a Tuesday: I fell down a research rabbit hole.&lt;/p&gt;

&lt;p&gt;Turns out, plants &lt;em&gt;do&lt;/em&gt; communicate. And it's wild.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Wood Wide Web
&lt;/h3&gt;

&lt;p&gt;Forests have an underground network of fungal threads called &lt;strong&gt;mycorrhizal networks&lt;/strong&gt;—scientists literally call it the "Wood Wide Web." Trees use it to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Send chemical signals&lt;/strong&gt; when they're under attack&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Share nutrients&lt;/strong&gt; with struggling neighbors (even different species!)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Warn each other&lt;/strong&gt; about incoming pests&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coordinate responses&lt;/strong&gt; without any central controller&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There's no "master tree" running the show. No message queue. No orchestrator. Just... signals diffusing through a shared medium, decaying over time, getting reinforced when multiple trees "agree."&lt;/p&gt;

&lt;p&gt;And I thought: &lt;em&gt;wait, that sounds like the opposite of how we build AI systems.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The LangChain Problem
&lt;/h2&gt;

&lt;p&gt;At work, I'd been wrestling with multi-agent LLM systems. You know the drill:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;chain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;agent_1&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;router&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;agent_2&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;aggregator&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;agent_3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Central orchestration. Explicit routing. If &lt;code&gt;agent_2&lt;/code&gt; times out, the whole thing dies. Every new agent means updating the router logic. Debugging is a nightmare because you're tracing through a rigid DAG.&lt;/p&gt;

&lt;p&gt;It works. But it felt... &lt;em&gt;brittle&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Meanwhile, a forest coordinates millions of trees across decades without a single config file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if we built LLM coordination the way forests work?&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  From Hypothesis to Validation
&lt;/h2&gt;

&lt;p&gt;I'm not one to just vibe on an idea. I needed to know if this would actually work.&lt;/p&gt;

&lt;p&gt;So I built a simulation framework. Python first (because fast iteration), then Rust (because I'm not a monster who deploys Python to production).&lt;/p&gt;

&lt;h3&gt;
  
  
  The Hypothesis
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;If agents communicate via decaying signals in a shared field, and consensus emerges through reinforcement rather than explicit voting, we can achieve:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Better fault tolerance&lt;/li&gt;
&lt;li&gt;Lower coordination overhead&lt;/li&gt;
&lt;li&gt;Emergent behavior without explicit choreography&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  The Method
&lt;/h3&gt;

&lt;p&gt;I used &lt;strong&gt;simulated annealing&lt;/strong&gt; to explore the parameter space:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Decay rates (exponential, linear, sigmoid)&lt;/li&gt;
&lt;li&gt;Reinforcement thresholds&lt;/li&gt;
&lt;li&gt;Trust propagation models&lt;/li&gt;
&lt;li&gt;Network topologies (ring, mesh, small-world, scale-free)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thousands of simulations. Different failure modes. Byzantine agents. Network partitions.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Results
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Traditional Orchestration&lt;/th&gt;
&lt;th&gt;Signal Diffusion&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Coordination latency&lt;/td&gt;
&lt;td&gt;10-50ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~1μs&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failure recovery&lt;/td&gt;
&lt;td&gt;Manual intervention&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Automatic decay&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scaling behavior&lt;/td&gt;
&lt;td&gt;O(n) routing complexity&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;O(1) emit to field&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Consensus mechanism&lt;/td&gt;
&lt;td&gt;Explicit voting/aggregation&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Emergent via reinforcement&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The numbers were almost too good. I re-ran everything three times.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It actually works.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Building SMESH
&lt;/h2&gt;

&lt;p&gt;So I built the real thing. &lt;strong&gt;SMESH&lt;/strong&gt; (Signal-MESHing)—a plant-inspired coordination protocol for multi-agent LLM systems.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Core Ideas
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Signals, Not Messages&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of sending messages to specific agents, you emit signals into a shared field. Any agent can sense signals that match their interests.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;signal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Signal&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;SignalType&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;.payload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;b"review this code"&lt;/span&gt;&lt;span class="nf"&gt;.to_vec&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="nf"&gt;.intensity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;// Will decay over time&lt;/span&gt;
    &lt;span class="nf"&gt;.confidence&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.9&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;.build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="nf"&gt;.emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Decay Is a Feature&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Signals lose intensity over time. Stale tasks fade away naturally. No garbage collection. No manual cleanup. The system &lt;em&gt;forgets&lt;/em&gt; things that don't matter anymore.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Reinforcement = Consensus&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When multiple agents observe the same signal and reinforce it, confidence goes up. Consensus emerges from agreement, not from a voting protocol.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. No Central Controller&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every node is equal. There's no orchestrator to become a bottleneck. No single point of failure. Agents self-organize based on skill affinity and signal sensing.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Numbers Don't Lie
&lt;/h2&gt;

&lt;p&gt;After porting to Rust and optimizing:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Signal creation&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;216 nanoseconds&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Signal reinforcement&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;48 nanoseconds&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Field tick (10k signals)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.2 milliseconds&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That's not a typo. &lt;strong&gt;Nanoseconds.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For comparison, a single HTTP request to an LLM takes ~500ms. The coordination overhead is now &lt;em&gt;completely negligible&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Trippy Part
&lt;/h2&gt;

&lt;p&gt;Here's what I didn't expect: &lt;strong&gt;emergent behavior&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In simulations with 20+ agents, patterns started appearing that I never programmed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agents naturally specialized based on which signals they reinforced most&lt;/li&gt;
&lt;li&gt;"Reputation" emerged—agents that consistently provided good signals got reinforced more&lt;/li&gt;
&lt;li&gt;The system developed something like &lt;em&gt;memory&lt;/em&gt; through signal history patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I was just trying to copy how trees talk. I accidentally built something that &lt;em&gt;learns&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;SMESH is open source. MIT/Apache-2.0. Steal it, fork it, tell me I'm wrong.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/copyleftdev/smesh-rust
&lt;span class="nb"&gt;cd &lt;/span&gt;smesh-rust
cargo build &lt;span class="nt"&gt;--release&lt;/span&gt;

&lt;span class="c"&gt;# Watch signals flow&lt;/span&gt;
cargo run &lt;span class="nt"&gt;--bin&lt;/span&gt; smesh &lt;span class="nt"&gt;--&lt;/span&gt; sim &lt;span class="nt"&gt;--nodes&lt;/span&gt; 50 &lt;span class="nt"&gt;--ticks&lt;/span&gt; 100

&lt;span class="c"&gt;# Compare with your LLM&lt;/span&gt;
cargo run &lt;span class="nt"&gt;--bin&lt;/span&gt; smesh &lt;span class="nt"&gt;--&lt;/span&gt; compare
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It supports both &lt;strong&gt;Ollama&lt;/strong&gt; (local, free) and &lt;strong&gt;Claude&lt;/strong&gt; (API) out of the box.&lt;/p&gt;




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

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Nature solved this already.&lt;/strong&gt; Forests have been coordinating distributed systems for 400 million years. Maybe we should pay attention.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Decentralization isn't just political.&lt;/strong&gt; It's an engineering pattern that eliminates bottlenecks and single points of failure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Let things decay.&lt;/strong&gt; Not every piece of state needs to be persisted forever. Sometimes the best garbage collection is just... time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Emergence &amp;gt; Choreography.&lt;/strong&gt; The most interesting behaviors come from simple rules interacting, not from complex orchestration logic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Walk your dog.&lt;/strong&gt; The best ideas come when you're not trying to have them.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




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

&lt;ul&gt;
&lt;li&gt;Python bindings (for the Pythonistas)&lt;/li&gt;
&lt;li&gt;WebAssembly build (for browser-based agents)&lt;/li&gt;
&lt;li&gt;Formal verification of convergence properties&lt;/li&gt;
&lt;li&gt;A paper, maybe? (If anyone wants to collaborate, DM me)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But mostly, I'm going to keep walking my dog and looking at trees.&lt;/p&gt;

&lt;p&gt;Who knows what I'll accidentally discover next.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;If you build something cool with SMESH, I want to hear about it. Find me on GitHub &lt;a href="https://github.com/copyleftdev" rel="noopener noreferrer"&gt;@copyleftdev&lt;/a&gt; or drop a comment below.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Star the repo if this resonated:&lt;/strong&gt; &lt;a href="https://github.com/copyleftdev/smesh-rust" rel="noopener noreferrer"&gt;github.com/copyleftdev/smesh-rust&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🌿 The Takeaway
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"The forest doesn't have a Kubernetes cluster. But it's been running a distributed consensus protocol for longer than animals have existed."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Maybe the next breakthrough in AI infrastructure isn't in a whitepaper.&lt;/p&gt;

&lt;p&gt;Maybe it's in your backyard.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;P.S. — My dog still doesn't know how trees talk. But I think I'm getting closer.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>rust</category>
      <category>llm</category>
      <category>distributedsystems</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I wrote a Vibe Check for your code (Runs on a Potato 🥔)</title>
      <dc:creator>Mr. 0x1</dc:creator>
      <pubDate>Mon, 29 Dec 2025 07:44:07 +0000</pubDate>
      <link>https://forem.com/copyleftdev/i-wrote-a-vibe-check-for-your-code-runs-on-a-potato--11ci</link>
      <guid>https://forem.com/copyleftdev/i-wrote-a-vibe-check-for-your-code-runs-on-a-potato--11ci</guid>
      <description>&lt;p&gt;You know that feeling when you push code at 3 AM and you're pretty sure you left a &lt;code&gt;// FIXME: this is garbage&lt;/code&gt; somewhere? &lt;/p&gt;

&lt;p&gt;Yeah. We all do.&lt;/p&gt;

&lt;p&gt;So I wrote a tool to find it. But not just "find it"—I wanted a tool that would look me in the eye and tell me my vibes were off.&lt;/p&gt;

&lt;h2&gt;
  
  
  Meet VibeCheck 🤙
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;VibeCheck&lt;/strong&gt; is a high-performance &lt;strong&gt;Zig&lt;/strong&gt; CLI tool that scans your codebase for "unfinished vibes"—To-Dos, hardcoded secrets, debug prints, and other signs of developer desperation.&lt;/p&gt;

&lt;p&gt;It builds to a single &lt;strong&gt;~149KB static binary&lt;/strong&gt;. No runtime. No &lt;code&gt;node_modules&lt;/code&gt; black hole. It runs on my laptop, my server, and probably my smart fridge.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftn7x2eo5a67fawg3281t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftn7x2eo5a67fawg3281t.png" alt="VibeCheck Logo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Why? (The Vibe)
&lt;/h3&gt;

&lt;p&gt;Linters check syntax. Static analysis checks logic. &lt;strong&gt;VibeCheck checks your soul.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It comes with a built-in pack called &lt;strong&gt;Crucial Vibes&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Desperation&lt;/strong&gt;: &lt;code&gt;FIX ME&lt;/code&gt;, &lt;code&gt;XXX&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Mock Data&lt;/strong&gt;: &lt;code&gt;lorem ipsum&lt;/code&gt;, &lt;code&gt;John Doe&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Fragile Paths&lt;/strong&gt;: &lt;code&gt;localhost:3000&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Security Laziness&lt;/strong&gt;: &lt;code&gt;verify=False&lt;/code&gt;, &lt;code&gt;chmod 777&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If it finds them, it lets you know. Loudly.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Specs (The Flex)
&lt;/h3&gt;

&lt;p&gt;I built this in &lt;strong&gt;Zig&lt;/strong&gt; because I wanted it to be fast and small.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Size&lt;/strong&gt;: 149KB (Statically linked, stripped)&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Speed&lt;/strong&gt;: Scanned a 50,000 file monorepo in &amp;lt; 1 second.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Deps&lt;/strong&gt;: Zero. None. Nada.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;AI Mode&lt;/strong&gt;: It has a built-in &lt;strong&gt;MCP Server&lt;/strong&gt; so you can plug it into Claude Desktop and let the AI vibe check your code. 🤖&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Usage
&lt;/h3&gt;

&lt;p&gt;It's simple.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Human readable scan&lt;/span&gt;
vibecheck &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[WARN]  Desperation Marker (FIXME)
  src/main.js:42:10
    | // FIXME: terrible hack, remove before launch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Or plug it into CI/CD to fail the build if the vibes are off:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vibecheck &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Get It
&lt;/h3&gt;

&lt;p&gt;It's open source (MIT).&lt;/p&gt;

&lt;p&gt;

&lt;/p&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/copyleftdev" rel="noopener noreferrer"&gt;
        copyleftdev
      &lt;/a&gt; / &lt;a href="https://github.com/copyleftdev/vibecheck" rel="noopener noreferrer"&gt;
        vibecheck
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      High-performance static analysis tool for developer vibes. Finds TODOs, secrets, and code smells in milliseconds. Written in Zig (~149KB). Native MCP Server for AI Agents.
    &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;VibeCheck 🤙&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/copyleftdev/vibecheck/./media/logo.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fcopyleftdev%2Fvibecheck%2F.%2Fmedia%2Flogo.png" alt="VibeCheck Logo" title="VibeCheck Logo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/1b088d927cc8f39c15708d51894fb2cff4121dc7cc094d35fa465d6b8f169e06/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f566962652d496d6d6163756c6174652d6666303064343f7374796c653d666f722d7468652d6261646765"&gt;&lt;img src="https://camo.githubusercontent.com/1b088d927cc8f39c15708d51894fb2cff4121dc7cc094d35fa465d6b8f169e06/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f566962652d496d6d6163756c6174652d6666303064343f7374796c653d666f722d7468652d6261646765" alt="Vibe"&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/71ff869818db506151768146f0fa19d0fe25257581e84fc5c7975771065eecc3/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4d616465253230576974682d5a69672d6f72616e67653f7374796c653d666f722d7468652d6261646765266c6f676f3d7a6967"&gt;&lt;img src="https://camo.githubusercontent.com/71ff869818db506151768146f0fa19d0fe25257581e84fc5c7975771065eecc3/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4d616465253230576974682d5a69672d6f72616e67653f7374796c653d666f722d7468652d6261646765266c6f676f3d7a6967" alt="Zig"&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/26622eb5f89ff47d17cd8fe54b483dd3baacb8f31d9ee798d65f7e67f7dab9aa/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f56696265732d436865636b65642d626c75653f7374796c653d666f722d7468652d6261646765"&gt;&lt;img src="https://camo.githubusercontent.com/26622eb5f89ff47d17cd8fe54b483dd3baacb8f31d9ee798d65f7e67f7dab9aa/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f56696265732d436865636b65642d626c75653f7374796c653d666f722d7468652d6261646765" alt="VibeCheck"&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/4ba391e975515c07d6a4b7aacabdae4fe4da06de43d5a3e304280a1105f29917/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f53697a652d3134394b422d627269676874677265656e3f7374796c653d666f722d7468652d6261646765"&gt;&lt;img src="https://camo.githubusercontent.com/4ba391e975515c07d6a4b7aacabdae4fe4da06de43d5a3e304280a1105f29917/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f53697a652d3134394b422d627269676874677265656e3f7374796c653d666f722d7468652d6261646765" alt="Size"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Yes, I even vibe checked vibe check 🤯"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;VibeCheck&lt;/strong&gt; is a high-performance &lt;strong&gt;Zig&lt;/strong&gt; CLI tool that scans your codebase for "unfinished vibes"—To-Dos, hardcoded secrets, debug prints, and other signs of developer desperation.&lt;/p&gt;

&lt;p&gt;It's fast, configurable, and CI/CD ready.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;⚡ Blazing Fast&lt;/strong&gt;: Recursively scans thousands of files in milliseconds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🪶 Featherweight&lt;/strong&gt;: ~149KB static binary. Zero dependencies. Runs on a potato 🥔 🎤&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📦 Portable&lt;/strong&gt;: Single executable. Linux, Mac, Windows. No &lt;code&gt;node_modules&lt;/code&gt; in sight.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🛡️ Battle Tested&lt;/strong&gt;: Validated against a 50,000-file "Google-scale" monorepo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🧩 Modular&lt;/strong&gt;: Load custom pattern packs via JSON plugin system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🤖 CI/CD Native&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Non-zero exit codes for build failures.&lt;/li&gt;
&lt;li&gt;JSON output for machine parsing.&lt;/li&gt;
&lt;li&gt;GitHub Actions Annotations support (&lt;code&gt;--github&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;🧠 AI Ready&lt;/strong&gt;: Built-in Model Context Protocol (MCP) Server.&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Installation&lt;/h2&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Build from Source&lt;/h3&gt;

&lt;/div&gt;

&lt;p&gt;Requirements: &lt;a href="https://ziglang.org/download/" rel="nofollow noopener noreferrer"&gt;Zig 0.13+&lt;/a&gt;&lt;/p&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;git clone https://github.com/copyleftdev/vibecheck.git
&lt;span class="pl-c1"&gt;cd&lt;/span&gt; vibecheck
zig build -Doptimize=ReleaseSmall&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;The binary will be…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/copyleftdev/vibecheck" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;





&lt;p&gt;Go give it a star, or better yet, run it on your focused project and see just how "unfinished" those vibes really are.&lt;/p&gt;

&lt;p&gt;Happy coding. 🤙&lt;/p&gt;

</description>
      <category>zig</category>
      <category>cli</category>
      <category>devops</category>
      <category>humor</category>
    </item>
  </channel>
</rss>
