<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: kennedy</title>
    <description>The latest articles on DEV Community by kennedy (@n3on).</description>
    <link>https://dev.to/n3on</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3559516%2F4fa1d3f3-83f6-4928-9d0d-ece6eef5825e.jpg</url>
      <title>DEV Community: kennedy</title>
      <link>https://dev.to/n3on</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/n3on"/>
    <language>en</language>
    <item>
      <title>Your SBOM diff is lying to you - how we made SBOM generation byte-for-byte reproducible</title>
      <dc:creator>kennedy</dc:creator>
      <pubDate>Wed, 21 Oct 2026 08:05:01 +0000</pubDate>
      <link>https://dev.to/n3on/your-sbom-diff-is-lying-to-you-how-we-made-sbom-generation-byte-for-byte-reproducible-cco</link>
      <guid>https://dev.to/n3on/your-sbom-diff-is-lying-to-you-how-we-made-sbom-generation-byte-for-byte-reproducible-cco</guid>
      <description>&lt;p&gt;If you've ever diffed two SBOMs of the &lt;em&gt;same&lt;/em&gt; codebase - before and after a dependency bump, two CI runs, two laptops - you've seen the lie: a wall of changes that aren't changes. Timestamps move. Serial numbers rotate. Keys shuffle. The components didn't move; the document did.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with noisy SBOM diffs
&lt;/h2&gt;

&lt;p&gt;The CycloneDX and SPDX standards let generators stamp &lt;code&gt;created&lt;/code&gt; with the wall-clock and &lt;code&gt;serialNumber&lt;/code&gt; with a fresh UUID on every run. So two runs over identical inputs produce different bytes - and your "SBOM diff" flags changes that don't exist. Reviewers learn to rubber-stamp the diff, and the one time it hides a real change, nobody looks.&lt;/p&gt;

&lt;p&gt;Deterministic generation makes the diff mean something:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;same input → same bytes → every difference is a real difference.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How SnapSBOM makes output byte-for-byte reproducible
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pinned timestamp&lt;/strong&gt; - &lt;code&gt;created&lt;/code&gt; / &lt;code&gt;creationInfo.created&lt;/code&gt; is fixed to &lt;code&gt;2026-01-01T00:00:00Z&lt;/code&gt;, never the wall clock.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No serial numbers or UUIDs&lt;/strong&gt;, anywhere.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Canonical ordering + normalized serialization&lt;/strong&gt; - components sorted stably, keys emitted in a fixed order.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lockfile-only input&lt;/strong&gt; - it reads &lt;code&gt;package-lock.json&lt;/code&gt; and nothing else. No network. No &lt;code&gt;node_modules&lt;/code&gt;. No calls to &lt;code&gt;npm&lt;/code&gt;. The bytes you get in Berlin equal the bytes you get in Denver.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmtwr7swhlqa47g7am82r.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmtwr7swhlqa47g7am82r.gif" alt="Terminal demo" width="799" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  But deterministic ≠ correct - the proof
&lt;/h2&gt;

&lt;p&gt;We don't ask you to trust us; we ask you to run the checks:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Official CycloneDX 1.6 JSON Schema (via &lt;code&gt;ajv&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;✅ valid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Official SPDX 2.3 JSON Schema (via &lt;code&gt;ajv&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;✅ valid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Syft 1.55.0 - converts our CycloneDX → SPDX and SPDX → CycloneDX&lt;/td&gt;
&lt;td&gt;✅ all 66 components round-trip&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trivy 0.76.0 - vulnerability scan of both our documents&lt;/td&gt;
&lt;td&gt;✅ both formats detected, &lt;strong&gt;66/66 packages&lt;/strong&gt; ingested&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;@cyclonedx/cyclonedx-npm&lt;/code&gt; 6.0.1 cross-check&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;identical package set, 0 purl differences&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Re-run SnapSBOM on the same lockfile&lt;/td&gt;
&lt;td&gt;✅ byte-identical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Re-run Syft / cyclonedx-npm on the same input&lt;/td&gt;
&lt;td&gt;❌ timestamps and serials churn&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three independent implementations - Syft, Trivy, and cyclonedx-npm - converge on the same 66 packages. Our output is valid because the specification says so, not because we say so.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reproduce it in 60 seconds
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx snapsbom &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--format&lt;/span&gt; cyclonedx &lt;span class="nt"&gt;--output&lt;/span&gt; a.json
npx snapsbom &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--format&lt;/span&gt; cyclonedx &lt;span class="nt"&gt;--output&lt;/span&gt; b.json
diff a.json b.json &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"byte-identical"&lt;/span&gt;

trivy sbom a.json          &lt;span class="c"&gt;# ingests our CycloneDX&lt;/span&gt;
syft convert a.json &lt;span class="nt"&gt;-o&lt;/span&gt; spdx-json&lt;span class="o"&gt;=&lt;/span&gt;converted.spdx.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Honest scope&lt;br&gt;
SnapSBOM guarantees correctness for npm package-lock.json v1-v3 and says so plainly - pnpm, Yarn, and Python are on the roadmap, one parser at a time.&lt;br&gt;
MIT-licensed, written in Rust, single binary.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/kawacukennedy/snapsbom" rel="noopener noreferrer"&gt;https://github.com/kawacukennedy/snapsbom&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;npm: &lt;a href="https://www.npmjs.com/package/snapsbom" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/snapsbom&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub Action: &lt;a href="https://github.com/kawacukennedy/snapsbom-action" rel="noopener noreferrer"&gt;https://github.com/kawacukennedy/snapsbom-action&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docs: &lt;a href="https://kawacukennedy.github.io/snapsbom/" rel="noopener noreferrer"&gt;https://kawacukennedy.github.io/snapsbom/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>security</category>
      <category>devops</category>
      <category>opensource</category>
    </item>
    <item>
      <title>SnapSBOM: Deterministic SBOMs in a Snap</title>
      <dc:creator>kennedy</dc:creator>
      <pubDate>Mon, 12 Oct 2026 07:50:26 +0000</pubDate>
      <link>https://dev.to/n3on/snapsbom-deterministic-sboms-in-a-snap-3pb3</link>
      <guid>https://dev.to/n3on/snapsbom-deterministic-sboms-in-a-snap-3pb3</guid>
      <description>&lt;h2&gt;
  
  
  The Problem: SBOM Tools Are Too Heavy
&lt;/h2&gt;

&lt;p&gt;If you've ever tried to generate a Software Bill of Materials (SBOM) for a project, you've probably run into one of these issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bloated tooling&lt;/strong&gt; - Tools require Docker, complex configurations, or cloud accounts just to generate a simple SBOM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inconsistent outputs&lt;/strong&gt; - Run the same tool twice on the same codebase and you get slightly different JSON. That's terrible for verification.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slow feedback loops&lt;/strong&gt; - You shouldn't need to wait seconds (or minutes) for something this fundamental.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overkill for most projects&lt;/strong&gt; - If all you need is an SBOM from your lockfiles, why download a 100MB binary?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With regulations like the &lt;a href="https://digital-strategy.ec.europa.eu/en/library/cyber-resilience-act" rel="noopener noreferrer"&gt;EU Cyber Resilience Act (CRA)&lt;/a&gt; pushing SBOM adoption, developers need something that just works without the enterprise bloat.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution: SnapSBOM
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/kawacukennedy/snapsbom" rel="noopener noreferrer"&gt;SnapSBOM&lt;/a&gt; is a deterministic SBOM generator that runs instantly, locally, and produces identical output every single time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx snapsbom &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. In milliseconds, you get a clean, standards-compliant SBOM.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmtwr7swhlqa47g7am82r.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmtwr7swhlqa47g7am82r.gif" alt="SnapSBOM Demo" width="799" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why It Stands Out
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deterministic by design&lt;/strong&gt; – Same input → byte-for-byte identical output. This is critical for reproducible builds, audits, and supply chain verification.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Truly local-first&lt;/strong&gt; – Zero network calls. Zero telemetry. Works offline and in air-gapped environments. Your dependency data never leaves your machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runs anywhere&lt;/strong&gt; – CLI, &lt;code&gt;npx&lt;/code&gt;, and browser (WASM) all share the same Rust core, so results are identical everywhere.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Standards compliant&lt;/strong&gt; – Outputs both &lt;a href="https://spdx.github.io/spdx-spec/v2.3/" rel="noopener noreferrer"&gt;SPDX 2.3&lt;/a&gt; and &lt;a href="https://cyclonedx.org/specification/overview/" rel="noopener noreferrer"&gt;CycloneDX 1.6&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lightning fast&lt;/strong&gt; – Parses lockfiles directly with no heavy filesystem scanning or container runtime.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minimal by choice&lt;/strong&gt; – Focused on doing one thing exceptionally well: generating correct, deterministic SBOMs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Determinism Matters
&lt;/h2&gt;

&lt;p&gt;Most SBOM tools serialize in arbitrary order. SnapSBOM canonicalizes everything (keys, arrays, components) so the hash of your SBOM is stable. This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Easier CI integration&lt;/strong&gt; – You can diff, cache, and verify SBOM artifacts with confidence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better supply chain trust&lt;/strong&gt; – Reproducible SBOMs make attestation and verification actually meaningful.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compliance-ready&lt;/strong&gt; – Auditors can rely on consistent, diffable artifacts.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Get Started Today
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;With npx (fastest):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx snapsbom &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Install globally:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; snapsbom
snapsbom &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Or download a binary from &lt;a href="https://github.com/kawacukennedy/snapsbom/releases" rel="noopener noreferrer"&gt;GitHub Releases&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Open Source &amp;amp; Built for Developers
&lt;/h2&gt;

&lt;p&gt;SnapSBOM is &lt;a href="https://github.com/kawacukennedy/snapsbom/blob/main/LICENSE" rel="noopener noreferrer"&gt;MIT licensed&lt;/a&gt; and built in Rust with a shared core for CLI and WASM. It's designed to be simple, fast, and reliable — the kind of tool you'd actually keep in your workflow.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/kawacukennedy/snapsbom" rel="noopener noreferrer"&gt;github.com/kawacukennedy/snapsbom&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;npm:&lt;/strong&gt; &lt;a href="https://www.npmjs.com/package/snapsbom" rel="noopener noreferrer"&gt;npmjs.com/package/snapsbom&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://kawacukennedy.github.io/snapsbom/" rel="noopener noreferrer"&gt;kawacukennedy.github.io/snapsbom&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Issues/Feedback:&lt;/strong&gt; &lt;a href="https://github.com/kawacukennedy/snapsbom/issues" rel="noopener noreferrer"&gt;Open an issue&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If SnapSBOM saves you time or solves this exact pain point, I'd love your feedback. Star the repo if it's useful, or file an issue if you'd like to see support for more ecosystems!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;SBOMs shouldn't be heavy. They should just work.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>opensource</category>
      <category>devtools</category>
    </item>
    <item>
      <title>The Customer Discovery Filter That Replaced My Pitch Deck</title>
      <dc:creator>kennedy</dc:creator>
      <pubDate>Mon, 24 Aug 2026 22:40:51 +0000</pubDate>
      <link>https://dev.to/n3on/the-customer-discovery-filter-that-replaced-my-pitch-deck-20jo</link>
      <guid>https://dev.to/n3on/the-customer-discovery-filter-that-replaced-my-pitch-deck-20jo</guid>
      <description>&lt;p&gt;Last year I built a SaaS in six months. Polished UI, solid architecture, clean code. Launched to 12 signups. Zero paying users. Shut it down.&lt;/p&gt;

&lt;p&gt;The postmortem was brutal but clear: I built something nobody needed. I fell in love with the solution before verifying the problem existed.&lt;/p&gt;

&lt;p&gt;Since then I've been rebuilding my customer discovery process from scratch. Not with frameworks from books, with conversations that went sideways, signal that turned out to be noise, and a few lines that stuck.&lt;/p&gt;

&lt;p&gt;Here's the filter I'm using now. It's not finished, but it's already better than anything I had before.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem With "Would You Use This?"
&lt;/h2&gt;

&lt;p&gt;Most founder advice says: talk to users, validate your idea, get feedback.&lt;/p&gt;

&lt;p&gt;The problem is that feedback is cheap. People will tell you your idea is great, that they'd totally use it, that they'd pay for it. Then they won't.&lt;/p&gt;

&lt;p&gt;The gap between what people say and what people do is where startups die.&lt;/p&gt;

&lt;p&gt;I needed a filter that separated enthusiasm from commitment.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Three Questions
&lt;/h2&gt;

&lt;p&gt;When someone names a painful task, I stopped asking "would you want this automated?" Instead I ask three things:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The Receipt Question&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Walk me through the last time this actually hurt you."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not "would this be useful?" but "when did it last cost you something?" A specific moment, a specific cost, a specific workaround they used instead.&lt;/p&gt;

&lt;p&gt;If they can't anchor it to a specific incident, the signal is weak no matter how enthusiastic the answer sounds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The Cost Question&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What stays broken if this never gets fixed?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This separates complaints from costs. A recurring annoyance is a complaint. A recurring annoyance with a broken process and a willingness to change is a wedge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The Switch Question&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Would you switch tomorrow?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But with one caveat, the answer only counts if it attaches to a dated incident.&lt;/p&gt;

&lt;p&gt;"When this broke last month, I spent two hours on it" counts.&lt;/p&gt;

&lt;p&gt;"Yes, I would probably switch" doesn't.&lt;/p&gt;

&lt;p&gt;If the switch answer cannot attach to a specific memory, it is still a wish describing itself as a decision.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Ratio Test
&lt;/h2&gt;

&lt;p&gt;Pass/fail isn't enough.&lt;/p&gt;

&lt;p&gt;Twenty conversations where five produce dated incidents and fifteen produce adjectives is a different market than the reverse.&lt;/p&gt;

&lt;p&gt;The filter gets sharper when you track two things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Did one vivid story appear?&lt;/strong&gt; (pass/fail)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How often does the same kind of costly incident repeat?&lt;/strong&gt; (the ratio)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A founder with one dramatic anecdote and a shrug on frequency is a different signal from a boring incident that happens every week.&lt;/p&gt;

&lt;p&gt;Both count as receipts. Only one of them is a market.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Calendar Test
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"How many times this month?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is the whole filter.&lt;/p&gt;

&lt;p&gt;One dramatic story is a blog post. The same boring incident every week is a business.&lt;/p&gt;

&lt;p&gt;You don't just need the story. You need the calendar.&lt;/p&gt;

&lt;p&gt;"When did it last hurt?" gets the receipt. "How many times this month?" tells you if it's a market or an anecdote.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Stall Index
&lt;/h2&gt;

&lt;p&gt;There's an outside check that helps too: looking at public postmortems of stalled products.&lt;/p&gt;

&lt;p&gt;The same split keeps showing up. The ones that moved had a current cost someone was already paying — a workaround, a bad alternative, an annoying manual step, a risk they were already living with.&lt;/p&gt;

&lt;p&gt;The ones that stalled had interest, but not much cost.&lt;/p&gt;

&lt;p&gt;Interest without cost is a compliment. Cost without a workaround is a market.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Full Filter In One Sentence
&lt;/h2&gt;

&lt;p&gt;Enthusiasm is cheap. A dated incident with a real cost is the receipt.&lt;/p&gt;

&lt;p&gt;A vivid incident is not always a recurring one. The receipt proves the pain is real. The frequency tells you whether it is a market.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I'm Doing With This
&lt;/h2&gt;

&lt;p&gt;I'm running this filter against 20 more conversations before I publish the full version with interview questions baked in.&lt;/p&gt;

&lt;p&gt;If you're building something and want to pressure-test your own discovery, steal these questions. Run them against your next five conversations. Track the ratio. See what holds.&lt;/p&gt;

&lt;p&gt;I'll update this post with the refined version when it's ready.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This filter was built in a public thread on DEV where someone pressure-tested my frameworks in real time. The best ideas here aren't mine, they came from the conversation.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you've run your own customer discovery that went sideways, I'd genuinely like to hear what you learned.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>career</category>
      <category>startup</category>
      <category>discuss</category>
    </item>
    <item>
      <title>I built an open dataset tracking Africa's nuclear energy programs, here's what I learned</title>
      <dc:creator>kennedy</dc:creator>
      <pubDate>Mon, 17 Aug 2026 22:00:46 +0000</pubDate>
      <link>https://dev.to/n3on/i-built-an-open-dataset-tracking-africas-nuclear-energy-programs-heres-what-i-learned-3h4i</link>
      <guid>https://dev.to/n3on/i-built-an-open-dataset-tracking-africas-nuclear-energy-programs-heres-what-i-learned-3h4i</guid>
      <description>&lt;p&gt;Only one African country operates a commercial nuclear reactor. Egypt is building one. A growing group of countries are in various stages of IAEA milestones preparation.&lt;/p&gt;

&lt;p&gt;The problem: announcements about these programs are scattered across government websites, IAEA press releases, and industry media. There's no neutral, cited, machine-readable source that ties it all together.&lt;/p&gt;

&lt;p&gt;So I built one.&lt;/p&gt;

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

&lt;p&gt;AfrPowerOS is a free, open dataset tracking every African country's civilian nuclear-energy programme. It covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Programme phase&lt;/strong&gt;: Exploring, Preparing, Under Construction, Operating&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IAEA milestone status&lt;/strong&gt;: which infrastructure issues are addressed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Regulators and implementing agencies&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Planned capacity&lt;/strong&gt; in GW&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vendors and agreements&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Research reactors&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Key events&lt;/strong&gt; with dates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Currently covering 20 countries across the continent.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honesty system
&lt;/h2&gt;

&lt;p&gt;Every record carries a confidence label:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Label&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Verified&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Confirmed from a primary source&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Inference&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reasonable reading of verified evidence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Speculation&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hypothesis; treat as unproven&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Unverified&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Reported but not yet confirmed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every fact has a source URL. No exceptions. If I can't source it, I mark it or leave it out.&lt;/p&gt;

&lt;p&gt;Corrections go in as pull requests — public and reviewable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Africa's nuclear programs matter
&lt;/h2&gt;

&lt;p&gt;The numbers tell the story:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;~600 million people in sub-Saharan Africa lack electricity&lt;/li&gt;
&lt;li&gt;Africa hosts under 2% of global data-center capacity&lt;/li&gt;
&lt;li&gt;Power is the binding constraint on AI infrastructure on the continent&lt;/li&gt;
&lt;li&gt;The countries making decisions right now are choosing infrastructure that will last 40-60 years&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The tech stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dataset&lt;/strong&gt;: structured JSON with a JSON Schema validator&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validation&lt;/strong&gt;: Python script, zero dependencies, runs in CI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live site&lt;/strong&gt;: static GitHub Pages with an interactive SVG map&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Newsletter&lt;/strong&gt;: automated weekly digest via Buttondown API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License&lt;/strong&gt;: MIT (code), CC BY 4.0 (data)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/kawacukennedy/afrpoweros.git
&lt;span class="nb"&gt;cd &lt;/span&gt;afrpoweros
python3 scripts/validate.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What's next&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Expand to all 54 African countries&lt;/li&gt;
&lt;li&gt;Add IAEA "19 infrastructure issues" readiness tracker per country&lt;/li&gt;
&lt;li&gt;Monthly data updates with changelogs
Links&lt;/li&gt;
&lt;li&gt;Live site (&lt;a href="https://kawacukennedy.github.io/afrpoweros/" rel="noopener noreferrer"&gt;https://kawacukennedy.github.io/afrpoweros/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;GitHub (&lt;a href="https://github.com/kawacukennedy/afrpoweros" rel="noopener noreferrer"&gt;https://github.com/kawacukennedy/afrpoweros&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Dataset (JSON) (&lt;a href="https://github.com/kawacukennedy/afrpoweros/blob/main/data/afrpoweros.json" rel="noopener noreferrer"&gt;https://github.com/kawacukennedy/afrpoweros/blob/main/data/afrpoweros.json&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Newsletter (&lt;a href="https://kawacukennedy.github.io/afrpoweros/newsletter.html" rel="noopener noreferrer"&gt;https://kawacukennedy.github.io/afrpoweros/newsletter.html&lt;/a&gt;)
If something in the dataset is wrong, open an issue or send a pull request. I'd rather be corrected in public than quietly wrong.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>opensource</category>
      <category>data</category>
      <category>webdev</category>
      <category>api</category>
    </item>
    <item>
      <title>We Built an Open-Source SDK for Cross-Chain AI Agents — Here's What Broke</title>
      <dc:creator>kennedy</dc:creator>
      <pubDate>Mon, 06 Jul 2026 20:09:10 +0000</pubDate>
      <link>https://dev.to/n3on/we-built-an-open-source-sdk-for-cross-chain-ai-agents-heres-what-broke-mih</link>
      <guid>https://dev.to/n3on/we-built-an-open-source-sdk-for-cross-chain-ai-agents-heres-what-broke-mih</guid>
      <description>&lt;p&gt;It's 3 AM and your AI agent just bridged $500 to a chain you've never heard of.&lt;/p&gt;

&lt;p&gt;The logs say "optimal route found." The balance says $0. The agent can't explain why.&lt;/p&gt;

&lt;p&gt;This is the problem we spent 6 months solving.&lt;/p&gt;

&lt;p&gt;We built Kuberna Labs — an MIT-licensed SDK that gives AI agents secure execution rails across any blockchain. The whole thing is open-source: &lt;a href="https://github.com/kawacukennedy/kuberna-labs" rel="noopener noreferrer"&gt;github.com/kawacukennedy/kuberna-labs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's what we actually had to build.&lt;/p&gt;




&lt;h2&gt;
  
  
  What "agent execution" actually means
&lt;/h2&gt;

&lt;p&gt;Most people think "AI agent" means a chatbot with tool access. That's not what we're building.&lt;/p&gt;

&lt;p&gt;An agent that &lt;em&gt;calls an API&lt;/em&gt; and an agent that &lt;em&gt;settles a financial transaction&lt;/em&gt; are fundamentally different problems. The first is about formatting HTTP requests. The second is about moving value across chains, proving what happened, and resolving disputes when something goes wrong.&lt;/p&gt;

&lt;p&gt;Agent execution, in our definition, means:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;An agent forms an &lt;strong&gt;intent&lt;/strong&gt; ("swap 1 ETH for USDC on Solana")&lt;/li&gt;
&lt;li&gt;That intent is &lt;strong&gt;parsed&lt;/strong&gt; into a structured, verifiable format&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Executors&lt;/strong&gt; compete to fulfill the intent at the best price&lt;/li&gt;
&lt;li&gt;An &lt;strong&gt;escrow contract&lt;/strong&gt; holds funds until conditions are met&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;TEE attestation&lt;/strong&gt; proves the agent's decision was made correctly&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every layer above had to be built from scratch. No off-the-shelf solutions existed for open-source agent settlement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why intent-based execution is safer than direct wallets
&lt;/h2&gt;

&lt;p&gt;Giving an agent a private key is the obvious approach. And it's terrifying.&lt;/p&gt;

&lt;p&gt;If an agent holds a key, that key is accessible wherever the agent runs. A compromised agent means a drained wallet. There's no intermediary, no dispute window, no recourse.&lt;/p&gt;

&lt;p&gt;Our architecture inverts this: &lt;strong&gt;the agent never holds keys.&lt;/strong&gt; It posts intents. Executors compete to fulfill those intents. An on-chain escrow contract settles the transaction only when conditions are met.&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;sdk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;KubernaSDK&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;KUBERNA_API_KEY&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;intent&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;sdk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;intents&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;sourceChain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ethereum&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;destChain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;solana&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;sourceToken&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ETH&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;destToken&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;USDC&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;sourceAmount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1.0&lt;/span&gt;&lt;span class="dl"&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;The agent posts an intent. The SDK handles the rest. No keys, no custody, no single point of failure.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we stop the intent parser from hallucinating chains
&lt;/h2&gt;

&lt;p&gt;This was the hardest technical problem we solved.&lt;/p&gt;

&lt;p&gt;We started with GPT-4 to parse natural language intents. The results were terrifying:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Input: "bridge my ETH to Arbitrum"&lt;/span&gt;
&lt;span class="c1"&gt;// GPT-4 output:&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;sourceChain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Ethereum&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;destChain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Arbitrum&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ARB&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It confused the destination &lt;strong&gt;chain&lt;/strong&gt; with the &lt;strong&gt;ARB token&lt;/strong&gt;. If an agent executed this parse, it would swap ETH for ARB instead of bridging. That's a $10,000 hallucination.&lt;/p&gt;

&lt;p&gt;We built a 4-layer fallback system:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;compromise.js&lt;/strong&gt; — zero-dependency NLP that works fully offline. Handles 80% of intents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;12 regex patterns&lt;/strong&gt; — matching "X for Y on Z" and variations. Deterministic, no failure mode.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPT-4 fallback&lt;/strong&gt; — only when confidence &amp;lt; 0.6 from layers 1 and 2. Activated in ~15% of cases.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RAG memory&lt;/strong&gt; — learns from past parses. Common patterns are promoted to layer 2 over time.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each layer assigns a confidence score. We stop at the first layer with score &amp;gt; 0.6.&lt;/p&gt;

&lt;p&gt;The result: zero hallucinated chains in production. 175 tests covering every edge case.&lt;/p&gt;

&lt;h2&gt;
  
  
  What on-chain escrow looks like for AI agents
&lt;/h2&gt;

&lt;p&gt;Trustless settlement requires an escrow contract that handles the agent-specific edge cases:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function assignExecutor(
  bytes32 intentId,
  address executor,
  bytes calldata params
) external nonReentrant onlyAgent(intentId) {
  Escrow storage e = escrows[intentId];
  require(e.status == EscrowStatus.PENDING, 'not pending');
  e.executor = executor;
  e.executorParams = params;
  e.status = EscrowStatus.ASSIGNED;
  emit ExecutorAssigned(intentId, executor, params);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;nonReentrant&lt;/code&gt; modifier on &lt;code&gt;assignExecutor&lt;/code&gt; and &lt;code&gt;raiseDispute&lt;/code&gt; prevents reentrancy attacks. Every intent has a dispute window. If the agent disagrees with execution, funds are held pending resolution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why TEE attestation matters for provable decisions
&lt;/h2&gt;

&lt;p&gt;An agent's decision trace must be provable. Without attestation, the agent can claim "I don't know what happened" and you have no way to verify.&lt;/p&gt;

&lt;p&gt;We run decision-making inside an SGX enclave. Every inference produces a cryptographic receipt:&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;"intentId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0xabc..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"decision"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"executor_selected"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"executorAddress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0xdef..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.87&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"attestation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sgx://enclave-123/receipt/0x789..."&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;This receipt is stored on-chain. Anyone can verify that the agent made the decision it claims to have made, inside a trusted execution environment, at a specific point in time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The circuit breaker problem
&lt;/h2&gt;

&lt;p&gt;An agent that can't stop calling a dead API is an agent that burns money.&lt;/p&gt;

&lt;p&gt;We implemented a sliding-window circuit breaker around all OpenAI calls:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CLOSED&lt;/strong&gt; — normal operation&lt;/li&gt;
&lt;li&gt;3 failures in 5 minutes → &lt;strong&gt;OPEN&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;30 second probe interval → &lt;strong&gt;HALF_OPEN&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Probe succeeds → &lt;strong&gt;CLOSED&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Probe fails → back to &lt;strong&gt;OPEN&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;circuit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;CircuitBreaker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;intentParser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;windowMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;probeIntervalMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;&lt;span class="p"&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;result&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;circuit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;swap 1 ETH for USDC on Solana&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the circuit is open, the agent falls back to the local compromise.js parser. No API call needed. The agent still works — it just makes simpler decisions.&lt;/p&gt;

&lt;p&gt;Graceful degradation &amp;gt; perfect uptime.&lt;/p&gt;

&lt;h2&gt;
  
  
  What broke (the honest part)
&lt;/h2&gt;

&lt;p&gt;Not everything went smoothly. Here's what we got wrong:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Math.sin() as a price oracle.&lt;/strong&gt; Our first "market data provider" used &lt;code&gt;Math.sin()&lt;/code&gt; to generate fake price data. It was a placeholder that somehow made it to staging. A real API integration would have caught this earlier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Direct wallet integration.&lt;/strong&gt; Our first design gave agents access to a wallet. We reversed this after a close call in testing. The intent-based architecture is harder to build but fundamentally safer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No circuit breaker.&lt;/strong&gt; We deployed the first version without rate limiting on API calls. The agent called a dead OpenAI endpoint 47 times before we noticed. Each call cost money. Each call returned nothing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Intent parser hallucinating chains.&lt;/strong&gt; The GPT-4 hallucination problem above cost us a week of refactoring. The 4-layer system was born from failure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where we're going next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;zkTLS integration&lt;/strong&gt; — proving agent decisions without revealing sensitive data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solana support&lt;/strong&gt; — the first non-EVM chain in the execution layer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NEAR Intents&lt;/strong&gt; — cross-chain settlement using NEAR's intent infrastructure&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;The whole thing is MIT. 175 tests, all green. If you've fought with cross-chain settlement and won (or lost), I'd love to hear about it in the comments. PRs very welcome.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Next in this series: &lt;a href="https://dev.to/next-post-link"&gt;Why We Don't Let GPT-4 Parse Financial Intents (And What We Use Instead)&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>blockchain</category>
      <category>opensource</category>
      <category>discuss</category>
    </item>
    <item>
      <title>I Built a SaaS That Got 0 Users. Here's What I Learned About Actually Finding Problems Worth Solving.</title>
      <dc:creator>kennedy</dc:creator>
      <pubDate>Thu, 25 Jun 2026 15:56:45 +0000</pubDate>
      <link>https://dev.to/n3on/i-built-a-saas-that-got-0-users-heres-what-i-learned-about-actually-finding-problems-worth-16j</link>
      <guid>https://dev.to/n3on/i-built-a-saas-that-got-0-users-heres-what-i-learned-about-actually-finding-problems-worth-16j</guid>
      <description>&lt;p&gt;Last year I spent six months building a SaaS product. I did everything "right", polished UI, solid architecture, clean code. Launched to 12 signups. Zero paying users. Shut it down.&lt;/p&gt;

&lt;p&gt;The postmortem was brutal but clear: I built something nobody needed. I fell in love with the solution before verifying the problem existed.&lt;/p&gt;

&lt;p&gt;I'm sharing this because I know I'm not the only developer who's done this. And I want to do something different this time.&lt;/p&gt;

&lt;p&gt;I've decided to start with zero code and instead spend time talking to people about what's actually broken in their work. I'm treating customer discovery like a engineering problem: gather data, find patterns, then build.&lt;/p&gt;

&lt;p&gt;I'm looking for input from this community:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What task do you do manually every week that you keep thinking "there should be an API for this"?&lt;/li&gt;
&lt;li&gt;What existing tool frustrates you so much that you've considered building your own replacement?&lt;/li&gt;
&lt;li&gt;If you could wave a magic wand and automate one part of your development workflow, what would it be?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I'm not promoting anything. There's no landing page, no newsletter, no beta list. I'm genuinely trying to find a problem worth solving. If patterns emerge and I build something, I'll document the entire process here.&lt;/p&gt;

&lt;p&gt;What problems are you all facing?&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>showdev</category>
      <category>career</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Why We Don't Let GPT-4 Parse Financial Intents (And What We Use Instead)</title>
      <dc:creator>kennedy</dc:creator>
      <pubDate>Wed, 24 Jun 2026 14:47:02 +0000</pubDate>
      <link>https://dev.to/n3on/why-we-dont-let-gpt-4-parse-financial-intents-and-what-we-use-instead-3ij2</link>
      <guid>https://dev.to/n3on/why-we-dont-let-gpt-4-parse-financial-intents-and-what-we-use-instead-3ij2</guid>
      <description>&lt;p&gt;I asked GPT-4 to parse "bridge my ETH to Arbitrum" and it returned:&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;"sourceChain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Ethereum"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"destChain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Arbitrum"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"token"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ARB"&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;It confused the destination &lt;strong&gt;chain&lt;/strong&gt; with the &lt;strong&gt;ARB token&lt;/strong&gt;. If an agent executed this, it would swap ETH for ARB instead of bridging. That's a $10,000 hallucination.&lt;/p&gt;

&lt;p&gt;This isn't a prompt engineering problem. It's a fundamental issue with using probabilistic models for deterministic financial parsing. Here's the system we built to eliminate it entirely.&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/kawacukennedy" rel="noopener noreferrer"&gt;
        kawacukennedy
      &lt;/a&gt; / &lt;a href="https://github.com/kawacukennedy/kuberna-labs" rel="noopener noreferrer"&gt;
        kuberna-labs
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Kuberna Labs - The Full-Stack Platform for Agentic Web3. Build, deploy, and monetize autonomous AI agents across decentralized networks with TEEs, zkTLS, and cross-chain intents.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Kuberna Labs&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Agent Orchestration Platform&lt;/strong&gt; — Deploy, run, and certify autonomous AI agents that execute cross-chain Web3 tasks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/kawacukennedy/kuberna-labs/actions" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/2b5ef80d121d0c8454e58d1da53a44a3fdaece44e04dc36996f6f23a9f1ba6f2/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f6b61776163756b656e6e6564792f6b756265726e612d6c6162732f63692e796d6c3f6272616e63683d6d61696e266c6162656c3d4349266c6f676f3d676974687562" alt="CI Status"&gt;&lt;/a&gt;
&lt;a href="https://github.com/kawacukennedy/kuberna-labs/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0f8af3f82f53d7144899dc61369e12dbed60a01646fcd2d1501a20a3b483e2c1/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f6b61776163756b656e6e6564792f6b756265726e612d6c6162733f7374796c653d666c6174266c6f676f3d676974687562" alt="GitHub Stars"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/@kuberna/sdk" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/54f884de382aaf63a461e7e17ae3c7d6871f732f17ff4cb9aac598b5dc3b6b92/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f406b756265726e612f73646b3f6c6162656c3d53444b266c6f676f3d6e706d" alt="NPM Version"&gt;&lt;/a&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.typescriptlang.org/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/1c0e325b9f7692186108e036502a027c2b3d529adab93db6e73d91c3bddf125c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f547970655363726970742d352e332d3331373843363f6c6f676f3d74797065736372697074" alt="TypeScript"&gt;&lt;/a&gt;
&lt;a href="https://soliditylang.org/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/94073514357940dfdc0defefedf96bae5cb652bffbe0bba6f9d7ac602c3c4d57/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f536f6c69646974792d253545302e382e32302d3336333633363f6c6f676f3d736f6c6964697479" alt="Solidity"&gt;&lt;/a&gt;
&lt;a href="https://www.prisma.io/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/736409b0fb12480179bad7c0ea0b6105aeed1788a27d3dbac95b2e0515ad6b3f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f507269736d612d4c61746573742d3244333734383f6c6f676f3d707269736d61" alt="Prisma"&gt;&lt;/a&gt;
&lt;a href="https://x.com/Arnaud_Kennedy" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/fa6df6541242a3c330375f244750bb8b648c8c0bc363975cdcd013dd8ca7094d/68747470733a2f2f696d672e736869656c64732e696f2f747769747465722f666f6c6c6f772f41726e6175645f4b656e6e6564793f7374796c653d736f6369616c" alt="Twitter Follow"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;⭐️ &lt;strong&gt;If you find this project useful, please star it on GitHub!&lt;/strong&gt; ⭐️&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;It helps others discover the project and motivates contributors.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://star-history.com/#kawacukennedy/kuberna-labs&amp;amp;Date" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/7a53e2cf3f57e83721f826b8d537e22b61da978142b82731c64f9a17e8f799fa/68747470733a2f2f6170692e737461722d686973746f72792e636f6d2f7376673f7265706f733d6b61776163756b656e6e6564792f6b756265726e612d6c61627326747970653d44617465" alt="Star History Chart"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;📋 Table of Contents&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kawacukennedy/kuberna-labs#overview" rel="noopener noreferrer"&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kawacukennedy/kuberna-labs#architecture" rel="noopener noreferrer"&gt;Architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kawacukennedy/kuberna-labs#quick-start" rel="noopener noreferrer"&gt;Quick Start&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kawacukennedy/kuberna-labs#key-features" rel="noopener noreferrer"&gt;Key Features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kawacukennedy/kuberna-labs#project-structure" rel="noopener noreferrer"&gt;Project Structure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kawacukennedy/kuberna-labs#available-scripts" rel="noopener noreferrer"&gt;Available Scripts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kawacukennedy/kuberna-labs#contributing" rel="noopener noreferrer"&gt;Contributing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kawacukennedy/kuberna-labs#community" rel="noopener noreferrer"&gt;Community&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kawacukennedy/kuberna-labs#contributors" rel="noopener noreferrer"&gt;Contributors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kawacukennedy/kuberna-labs#roadmap" rel="noopener noreferrer"&gt;Roadmap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kawacukennedy/kuberna-labs#license" rel="noopener noreferrer"&gt;License&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;/div&gt;
&lt;p&gt;Kuberna Labs gives AI agents secure execution rails across any blockchain: agents parse natural language intents, make autonomous trading decisions, settle via on-chain escrow, and get post-quantum certified for verifiable reputation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Target users:&lt;/strong&gt; Web3 developers and teams who want to deploy autonomous AI agents that can trade, monitor, and execute on any chain without managing LLM infrastructure, blockchain RPCs, or certification pipelines.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;✨ What Makes Kuberna Different?&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Kuberna&lt;/th&gt;
&lt;th&gt;Others&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Natural Language → On-Chain Action&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Parse "swap 1 ETH for USDC on Solana" → escrow → execution → certificate&lt;/td&gt;
&lt;td&gt;Require&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;…&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/kawacukennedy/kuberna-labs" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  The problem with LLMs for structured extraction
&lt;/h2&gt;

&lt;p&gt;LLMs are probabilistic by design. They don't &lt;em&gt;know&lt;/em&gt; anything — they predict the most likely token sequence given their training data. For financial intents, this means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chain names overlap with token symbols&lt;/strong&gt; — "Arbitrum" vs "ARB", "Solana" vs "SOL"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amounts can be ambiguous&lt;/strong&gt; — "1 ETH" is clear, "send some" is not&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Missing chain names&lt;/strong&gt; — "swap 1 ETH for USDC" doesn't specify the destination chain&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Novel phrasing&lt;/strong&gt; — "bridge my bags over to polygon" needs to resolve to Polygon (MATIC)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of these is a recoverable error for a deterministic parser. Each is a potential loss-of-funds event for a probabilistic one.&lt;/p&gt;

&lt;p&gt;The cost of hallucination in financial execution is not a bad chatbot response. It's real money moving to the wrong chain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Our 4-layer approach
&lt;/h2&gt;

&lt;p&gt;We never call GPT-4 first. The LLM is the last resort, not the primary parser.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Layer 1: compromise.js   (zero-dep NLP, offline)    ← 80% of intents
Layer 2: 12 regex patterns (deterministic matching)  ← 5% of intents
Layer 3: GPT-4 fallback   (only when conf &amp;lt; 0.6)     ← 15% of intents
Layer 4: RAG memory        (learns from past parses)  ← ongoing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Layer 1: compromise.js
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/spencermountain/compromise" rel="noopener noreferrer"&gt;compromise.js&lt;/a&gt; is a zero-dependency NLP library that runs in the browser, Node.js, and Deno. It handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Subject-verb-object extraction ("swap ETH for USDC")&lt;/li&gt;
&lt;li&gt;Named entity recognition ("Ethereum", "Solana", "Arbitrum")&lt;/li&gt;
&lt;li&gt;Number and unit parsing ("1.5 ETH", "500 USDC")&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It weighs ~200KB and requires no API key. For well-formed intents, it's sufficient 80% of the time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;nlp&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;compromise&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;parseWithCompromise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;Intent&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&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;doc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;nlp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&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;tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#Noun+&lt;/span&gt;&lt;span class="dl"&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;amounts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="c1"&gt;// ... extract structured intent&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Layer 2: Regex patterns
&lt;/h3&gt;

&lt;p&gt;For the 5% of intents where compromise.js yields low confidence, we fall through to 12 regex patterns covering common structures:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PATTERNS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="c1"&gt;// "swap X for Y on Z"&lt;/span&gt;
  &lt;span class="sr"&gt;/swap&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;(?&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;amount&amp;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;\.?\d&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt;&lt;span class="se"&gt;)\s&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;(?&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;source&amp;gt;&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;)\s&lt;/span&gt;&lt;span class="sr"&gt;+for&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;(?&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;dest&amp;gt;&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;)\s&lt;/span&gt;&lt;span class="sr"&gt;+on&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;(?&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;chain&amp;gt;&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;)&lt;/span&gt;&lt;span class="sr"&gt;/i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="c1"&gt;// "bridge X to Y"&lt;/span&gt;
  &lt;span class="sr"&gt;/bridge&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;(?&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;amount&amp;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;\.?\d&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt;&lt;span class="se"&gt;)\s&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;(?&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;token&amp;gt;&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;)\s&lt;/span&gt;&lt;span class="sr"&gt;+to&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;(?&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;chain&amp;gt;&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;)&lt;/span&gt;&lt;span class="sr"&gt;/i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="c1"&gt;// "send X to Y on Z"&lt;/span&gt;
  &lt;span class="sr"&gt;/send&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;(?&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;amount&amp;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;\.?\d&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt;&lt;span class="se"&gt;)\s&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;(?&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;token&amp;gt;&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;)\s&lt;/span&gt;&lt;span class="sr"&gt;+to&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;(?&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;chain&amp;gt;&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;)&lt;/span&gt;&lt;span class="sr"&gt;/i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="c1"&gt;// ... 9 more patterns&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each pattern maps matched groups to a validated &lt;code&gt;Intent&lt;/code&gt; structure. If the mapping contains an unrecognized chain or token, the parse fails safely — no hallucination possible.&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 3: GPT-4 fallback
&lt;/h3&gt;

&lt;p&gt;Only when both layers 1 and 2 return confidence &amp;lt; 0.6 do we call GPT-4. The prompt is structured to minimize hallucination:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`
Parse the following cross-chain intent into JSON.
Only use chain names from this list: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;VALID_CHAINS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;, &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;
Only use token symbols from this list: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;VALID_TOKENS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;, &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;
If any value cannot be determined, set it to null. Do not infer.

Input: "&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"
Output:`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The LLM is constrained to a known vocabulary. If it returns a chain name not in &lt;code&gt;VALID_CHAINS&lt;/code&gt;, the system rejects the parse. This caught the "Arbitrum" → "ARB" hallucination described above.&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 4: RAG memory
&lt;/h3&gt;

&lt;p&gt;Every successful parse (regardless of which layer handled it) is stored in a vector database. Common patterns are promoted to new regex patterns over time.&lt;/p&gt;

&lt;p&gt;After 6 months of operation, layer 4 has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generated 4 new patterns now handled by layer 2&lt;/li&gt;
&lt;li&gt;Increased layer 1 hit rate from 72% to 80%&lt;/li&gt;
&lt;li&gt;Reduced LLM fallback from 22% to 15%&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Confidence scoring
&lt;/h2&gt;

&lt;p&gt;Each layer assigns a confidence score. We stop at the first layer with score &amp;gt; 0.6.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;confidence&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;parseIntent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;swap 1 ETH for USDC on Solana&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;intent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// {&lt;/span&gt;
&lt;span class="c1"&gt;//   sourceChain: "solana",&lt;/span&gt;
&lt;span class="c1"&gt;//   sourceToken: "ETH",&lt;/span&gt;
&lt;span class="c1"&gt;//   destToken: "USDC",&lt;/span&gt;
&lt;span class="c1"&gt;//   sourceAmount: "1",&lt;/span&gt;
&lt;span class="c1"&gt;//   confidence: 0.85&lt;/span&gt;
&lt;span class="c1"&gt;// }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Confidence is based on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How many fields were successfully extracted (4/4 is better than 3/4)&lt;/li&gt;
&lt;li&gt;Whether all chain/token names are in the known vocabulary&lt;/li&gt;
&lt;li&gt;Pattern match strength (regex exact match &amp;gt; compromise fuzzy match &amp;gt; LLM generation)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If confidence is below 0.6 after all 4 layers, the intent is rejected and the agent is asked to rephrase.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we tested this
&lt;/h2&gt;

&lt;p&gt;175 tests covering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Well-formed intents ("swap 1 ETH for USDC on Solana")&lt;/li&gt;
&lt;li&gt;Missing chain names ("swap 1 ETH for USDC")&lt;/li&gt;
&lt;li&gt;Novel phrasing ("move my bags to polygon")&lt;/li&gt;
&lt;li&gt;Deliberately adversarial inputs ("ETH for BTC on Ethereum ethereum ethereum")&lt;/li&gt;
&lt;li&gt;Chain/token confusion ("bridge to ARB on Arbitrum")&lt;/li&gt;
&lt;li&gt;Mixed case, typos, extra whitespace&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Property-based tests using &lt;code&gt;fast-check&lt;/code&gt; verify invariants: the parser never returns a chain name not in &lt;code&gt;VALID_CHAINS&lt;/code&gt;, never returns a token symbol not in &lt;code&gt;VALID_TOKENS&lt;/code&gt;, and never fabricates an amount.&lt;/p&gt;

&lt;p&gt;Zero hallucinated chains in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  When you SHOULD use an LLM
&lt;/h2&gt;

&lt;p&gt;The 4-layer system isn't anti-LLM. It's pro-determinism.&lt;/p&gt;

&lt;p&gt;Use an LLM when the input is genuinely novel, the phrasing is ambiguous, or the intent contains information your deterministic layers can't handle. But don't use an LLM as your &lt;strong&gt;primary&lt;/strong&gt; parser for financial inputs.&lt;/p&gt;

&lt;p&gt;The LLM is a safety net, not the primary system. Build deterministic layers first. Let the LLM handle edge cases. And always validate the output against a known vocabulary before accepting it.&lt;/p&gt;




&lt;p&gt;The parser is MIT licensed and works without any API key: &lt;a href="https://github.com/kawacukennedy/kuberna-labs/blob/main/backend/src/services/intentParser.ts" rel="noopener noreferrer"&gt;&lt;code&gt;backend/src/services/intentParser.ts&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you've hit similar hallucination problems with LLM-based extraction, I'd love to hear how you solved it in the comments.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Previously in this series: &lt;a href="https://dev.to/n3on/we-built-an-open-source-sdk-for-cross-chain-ai-agents-heres-what-broke-2in6"&gt;We Built an Open-Source SDK for Cross-Chain AI Agents — Here's What Broke&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Next in this series: &lt;a href="https://dev.to/next-post-link"&gt;How We Built a Circuit Breaker for AI Agents That Touch Real Money&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>typescript</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>We Built an Open-Source SDK for Cross-Chain AI Agents, Here's What Broke</title>
      <dc:creator>kennedy</dc:creator>
      <pubDate>Wed, 24 Jun 2026 14:28:31 +0000</pubDate>
      <link>https://dev.to/n3on/we-built-an-open-source-sdk-for-cross-chain-ai-agents-heres-what-broke-2in6</link>
      <guid>https://dev.to/n3on/we-built-an-open-source-sdk-for-cross-chain-ai-agents-heres-what-broke-2in6</guid>
      <description>&lt;p&gt;It's 3 AM and your AI agent just bridged $500 to a chain you've never heard of.&lt;/p&gt;

&lt;p&gt;The logs say "optimal route found." The balance says $0. The agent can't explain why.&lt;/p&gt;

&lt;p&gt;This is the problem we spent 6 months solving.&lt;/p&gt;

&lt;p&gt;We built Kuberna Labs, an MIT-licensed SDK that gives AI agents secure execution rails across any blockchain. The whole thing is open-source: &lt;a href="https://github.com/kawacukennedy/kuberna-labs" rel="noopener noreferrer"&gt;github.com/kawacukennedy/kuberna-labs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's what we actually had to build.&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/kawacukennedy" rel="noopener noreferrer"&gt;
        kawacukennedy
      &lt;/a&gt; / &lt;a href="https://github.com/kawacukennedy/kuberna-labs" rel="noopener noreferrer"&gt;
        kuberna-labs
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Kuberna Labs - The Full-Stack Platform for Agentic Web3. Build, deploy, and monetize autonomous AI agents across decentralized networks with TEEs, zkTLS, and cross-chain intents.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Kuberna Labs&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Agent Orchestration Platform&lt;/strong&gt; — Deploy, run, and certify autonomous AI agents that execute cross-chain Web3 tasks.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/kawacukennedy/kuberna-labs/actions" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/2b5ef80d121d0c8454e58d1da53a44a3fdaece44e04dc36996f6f23a9f1ba6f2/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f6b61776163756b656e6e6564792f6b756265726e612d6c6162732f63692e796d6c3f6272616e63683d6d61696e266c6162656c3d4349266c6f676f3d676974687562" alt="CI Status"&gt;&lt;/a&gt;
&lt;a href="https://github.com/kawacukennedy/kuberna-labs/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0f8af3f82f53d7144899dc61369e12dbed60a01646fcd2d1501a20a3b483e2c1/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f6b61776163756b656e6e6564792f6b756265726e612d6c6162733f7374796c653d666c6174266c6f676f3d676974687562" alt="GitHub Stars"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/@kuberna/sdk" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/54f884de382aaf63a461e7e17ae3c7d6871f732f17ff4cb9aac598b5dc3b6b92/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f406b756265726e612f73646b3f6c6162656c3d53444b266c6f676f3d6e706d" alt="NPM Version"&gt;&lt;/a&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.typescriptlang.org/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/1c0e325b9f7692186108e036502a027c2b3d529adab93db6e73d91c3bddf125c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f547970655363726970742d352e332d3331373843363f6c6f676f3d74797065736372697074" alt="TypeScript"&gt;&lt;/a&gt;
&lt;a href="https://soliditylang.org/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/94073514357940dfdc0defefedf96bae5cb652bffbe0bba6f9d7ac602c3c4d57/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f536f6c69646974792d253545302e382e32302d3336333633363f6c6f676f3d736f6c6964697479" alt="Solidity"&gt;&lt;/a&gt;
&lt;a href="https://www.prisma.io/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/736409b0fb12480179bad7c0ea0b6105aeed1788a27d3dbac95b2e0515ad6b3f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f507269736d612d4c61746573742d3244333734383f6c6f676f3d707269736d61" alt="Prisma"&gt;&lt;/a&gt;
&lt;a href="https://x.com/Arnaud_Kennedy" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/fa6df6541242a3c330375f244750bb8b648c8c0bc363975cdcd013dd8ca7094d/68747470733a2f2f696d672e736869656c64732e696f2f747769747465722f666f6c6c6f772f41726e6175645f4b656e6e6564793f7374796c653d736f6369616c" alt="Twitter Follow"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;br&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;⭐️ &lt;strong&gt;If you find this project useful, please star it on GitHub!&lt;/strong&gt; ⭐️&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;It helps others discover the project and motivates contributors.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://star-history.com/#kawacukennedy/kuberna-labs&amp;amp;Date" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/7a53e2cf3f57e83721f826b8d537e22b61da978142b82731c64f9a17e8f799fa/68747470733a2f2f6170692e737461722d686973746f72792e636f6d2f7376673f7265706f733d6b61776163756b656e6e6564792f6b756265726e612d6c61627326747970653d44617465" alt="Star History Chart"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;📋 Table of Contents&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/kawacukennedy/kuberna-labs#overview" rel="noopener noreferrer"&gt;Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kawacukennedy/kuberna-labs#architecture" rel="noopener noreferrer"&gt;Architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kawacukennedy/kuberna-labs#quick-start" rel="noopener noreferrer"&gt;Quick Start&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kawacukennedy/kuberna-labs#key-features" rel="noopener noreferrer"&gt;Key Features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kawacukennedy/kuberna-labs#project-structure" rel="noopener noreferrer"&gt;Project Structure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kawacukennedy/kuberna-labs#available-scripts" rel="noopener noreferrer"&gt;Available Scripts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kawacukennedy/kuberna-labs#contributing" rel="noopener noreferrer"&gt;Contributing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kawacukennedy/kuberna-labs#community" rel="noopener noreferrer"&gt;Community&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kawacukennedy/kuberna-labs#contributors" rel="noopener noreferrer"&gt;Contributors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kawacukennedy/kuberna-labs#roadmap" rel="noopener noreferrer"&gt;Roadmap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kawacukennedy/kuberna-labs#license" rel="noopener noreferrer"&gt;License&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;/div&gt;
&lt;p&gt;Kuberna Labs gives AI agents secure execution rails across any blockchain: agents parse natural language intents, make autonomous trading decisions, settle via on-chain escrow, and get post-quantum certified for verifiable reputation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Target users:&lt;/strong&gt; Web3 developers and teams who want to deploy autonomous AI agents that can trade, monitor, and execute on any chain without managing LLM infrastructure, blockchain RPCs, or certification pipelines.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;✨ What Makes Kuberna Different?&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Kuberna&lt;/th&gt;
&lt;th&gt;Others&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Natural Language → On-Chain Action&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Parse "swap 1 ETH for USDC on Solana" → escrow → execution → certificate&lt;/td&gt;
&lt;td&gt;Require&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;…&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/kawacukennedy/kuberna-labs" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  What "agent execution" actually means
&lt;/h2&gt;

&lt;p&gt;Most people think "AI agent" means a chatbot with tool access. That's not what we're building.&lt;/p&gt;

&lt;p&gt;An agent that &lt;em&gt;calls an API&lt;/em&gt; and an agent that &lt;em&gt;settles a financial transaction&lt;/em&gt; are fundamentally different problems. The first is about formatting HTTP requests. The second is about moving value across chains, proving what happened, and resolving disputes when something goes wrong.&lt;/p&gt;

&lt;p&gt;Agent execution, in our definition, means:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;An agent forms an &lt;strong&gt;intent&lt;/strong&gt; ("swap 1 ETH for USDC on Solana")&lt;/li&gt;
&lt;li&gt;That intent is &lt;strong&gt;parsed&lt;/strong&gt; into a structured, verifiable format&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Executors&lt;/strong&gt; compete to fulfill the intent at the best price&lt;/li&gt;
&lt;li&gt;An &lt;strong&gt;escrow contract&lt;/strong&gt; holds funds until conditions are met&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;TEE attestation&lt;/strong&gt; proves the agent's decision was made correctly&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every layer above had to be built from scratch. No off-the-shelf solutions existed for open-source agent settlement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why intent-based execution is safer than direct wallets
&lt;/h2&gt;

&lt;p&gt;Giving an agent a private key is the obvious approach. And it's terrifying.&lt;/p&gt;

&lt;p&gt;If an agent holds a key, that key is accessible wherever the agent runs. A compromised agent means a drained wallet. There's no intermediary, no dispute window, no recourse.&lt;/p&gt;

&lt;p&gt;Our architecture inverts this: &lt;strong&gt;the agent never holds keys.&lt;/strong&gt; It posts intents. Executors compete to fulfill those intents. An on-chain escrow contract settles the transaction only when conditions are met.&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;sdk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;KubernaSDK&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;KUBERNA_API_KEY&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;intent&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;sdk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;intents&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;sourceChain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ethereum&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;destChain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;solana&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;sourceToken&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ETH&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;destToken&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;USDC&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;sourceAmount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1.0&lt;/span&gt;&lt;span class="dl"&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;The agent posts an intent. The SDK handles the rest. No keys, no custody, no single point of failure.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we stop the intent parser from hallucinating chains
&lt;/h2&gt;

&lt;p&gt;This was the hardest technical problem we solved.&lt;/p&gt;

&lt;p&gt;We started with GPT-4 to parse natural language intents. The results were terrifying:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Input: "bridge my ETH to Arbitrum"&lt;/span&gt;
&lt;span class="c1"&gt;// GPT-4 output:&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;sourceChain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Ethereum&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;destChain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Arbitrum&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ARB&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It confused the destination &lt;strong&gt;chain&lt;/strong&gt; with the &lt;strong&gt;ARB token&lt;/strong&gt;. If an agent executed this parse, it would swap ETH for ARB instead of bridging. That's a $10,000 hallucination.&lt;/p&gt;

&lt;p&gt;We built a 4-layer fallback system:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;compromise.js&lt;/strong&gt; — zero-dependency NLP that works fully offline. Handles 80% of intents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;12 regex patterns&lt;/strong&gt; — matching "X for Y on Z" and variations. Deterministic, no failure mode.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPT-4 fallback&lt;/strong&gt; — only when confidence &amp;lt; 0.6 from layers 1 and 2. Activated in ~15% of cases.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RAG memory&lt;/strong&gt; — learns from past parses. Common patterns are promoted to layer 2 over time.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each layer assigns a confidence score. We stop at the first layer with score &amp;gt; 0.6.&lt;/p&gt;

&lt;p&gt;The result: zero hallucinated chains in production. 175 tests covering every edge case.&lt;/p&gt;

&lt;h2&gt;
  
  
  What on-chain escrow looks like for AI agents
&lt;/h2&gt;

&lt;p&gt;Trustless settlement requires an escrow contract that handles the agent-specific edge cases:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function assignExecutor(
  bytes32 intentId,
  address executor,
  bytes calldata params
) external nonReentrant onlyAgent(intentId) {
  Escrow storage e = escrows[intentId];
  require(e.status == EscrowStatus.PENDING, 'not pending');
  e.executor = executor;
  e.executorParams = params;
  e.status = EscrowStatus.ASSIGNED;
  emit ExecutorAssigned(intentId, executor, params);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;nonReentrant&lt;/code&gt; modifier on &lt;code&gt;assignExecutor&lt;/code&gt; and &lt;code&gt;raiseDispute&lt;/code&gt; prevents reentrancy attacks. Every intent has a dispute window. If the agent disagrees with execution, funds are held pending resolution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why TEE attestation matters for provable decisions
&lt;/h2&gt;

&lt;p&gt;An agent's decision trace must be provable. Without attestation, the agent can claim "I don't know what happened" and you have no way to verify.&lt;/p&gt;

&lt;p&gt;We run decision-making inside an SGX enclave. Every inference produces a cryptographic receipt:&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;"intentId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0xabc..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"decision"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"executor_selected"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"executorAddress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0xdef..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.87&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"attestation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sgx://enclave-123/receipt/0x789..."&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;This receipt is stored on-chain. Anyone can verify that the agent made the decision it claims to have made, inside a trusted execution environment, at a specific point in time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The circuit breaker problem
&lt;/h2&gt;

&lt;p&gt;An agent that can't stop calling a dead API is an agent that burns money.&lt;/p&gt;

&lt;p&gt;We implemented a sliding-window circuit breaker around all OpenAI calls:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CLOSED&lt;/strong&gt; — normal operation&lt;/li&gt;
&lt;li&gt;3 failures in 5 minutes → &lt;strong&gt;OPEN&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;30 second probe interval → &lt;strong&gt;HALF_OPEN&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Probe succeeds → &lt;strong&gt;CLOSED&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Probe fails → back to &lt;strong&gt;OPEN&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;circuit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;CircuitBreaker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;intentParser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;windowMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;probeIntervalMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;&lt;span class="p"&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;result&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;circuit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;swap 1 ETH for USDC on Solana&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the circuit is open, the agent falls back to the local compromise.js parser. No API call needed. The agent still works — it just makes simpler decisions.&lt;/p&gt;

&lt;p&gt;Graceful degradation &amp;gt; perfect uptime.&lt;/p&gt;

&lt;h2&gt;
  
  
  What broke (the honest part)
&lt;/h2&gt;

&lt;p&gt;Not everything went smoothly. Here's what we got wrong:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Math.sin() as a price oracle.&lt;/strong&gt; Our first "market data provider" used &lt;code&gt;Math.sin()&lt;/code&gt; to generate fake price data. It was a placeholder that somehow made it to staging. A real API integration would have caught this earlier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Direct wallet integration.&lt;/strong&gt; Our first design gave agents access to a wallet. We reversed this after a close call in testing. The intent-based architecture is harder to build but fundamentally safer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No circuit breaker.&lt;/strong&gt; We deployed the first version without rate limiting on API calls. The agent called a dead OpenAI endpoint 47 times before we noticed. Each call cost money. Each call returned nothing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Intent parser hallucinating chains.&lt;/strong&gt; The GPT-4 hallucination problem above cost us a week of refactoring. The 4-layer system was born from failure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where we're going next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;zkTLS integration&lt;/strong&gt; — proving agent decisions without revealing sensitive data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solana support&lt;/strong&gt; — the first non-EVM chain in the execution layer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NEAR Intents&lt;/strong&gt; — cross-chain settlement using NEAR's intent infrastructure&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;The whole thing is MIT. 175 tests, all green. If you've fought with cross-chain settlement and won (or lost), I'd love to hear about it in the comments. PRs very welcome.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Next in this series: &lt;a href="https://dev.to/n3on/why-we-dont-let-gpt-4-parse-financial-intents-and-what-we-use-instead-3ij2"&gt;Why We Don't Let GPT-4 Parse Financial Intents (And What We Use Instead)&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>blockchain</category>
      <category>opensource</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Building Autonomous Cross-Chain AI Agents with Kuberna Labs</title>
      <dc:creator>kennedy</dc:creator>
      <pubDate>Sun, 15 Mar 2026 20:13:27 +0000</pubDate>
      <link>https://dev.to/n3on/building-autonomous-cross-chain-ai-agents-with-kuberna-labs-4fdb</link>
      <guid>https://dev.to/n3on/building-autonomous-cross-chain-ai-agents-with-kuberna-labs-4fdb</guid>
      <description>&lt;p&gt;If you've ever tried to build an AI agent that can actually &lt;em&gt;do&lt;/em&gt; something on-chain—like swap tokens, monitor a protocol, or execute a trade across chains—you know the pain. You need to manage private keys, estimate gas, handle failed transactions, and orchestrate complex cross-chain flows. It's brittle, time-consuming, and error-prone.&lt;/p&gt;

&lt;p&gt;That's why we built &lt;strong&gt;Kuberna Labs&lt;/strong&gt;: an open-source SDK and infrastructure that abstracts away the complexity of cross-chain execution for AI agents.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Stack&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Our architecture is designed to take a high-level intent (e.g., "Swap 1 ETH to USDC on Solana") and execute it securely, with cryptographic guarantees. Here's how it works:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;LLM / NLP Engine&lt;/strong&gt; – Parses natural language into structured tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kuberna SDK&lt;/strong&gt; – Provides a unified API for agent creation, intent submission, and execution.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execution Layer&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TEEs&lt;/strong&gt; (Phala, Marlin) – Run agent logic in trusted enclaves with remote attestation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;zkTLS&lt;/strong&gt; (Reclaim, zkPass) – Fetch verified Web2 data without exposing credentials.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Intent Router&lt;/strong&gt; (ERC-7683) – Broadcasts intents to a decentralized solver network.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solver Network&lt;/strong&gt; – Agents compete to fulfill intents, with funds secured in escrow contracts.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Why This Matters&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most AI agents today are just chatbots—they can't actually transact value. Kuberna turns them into autonomous economic actors. Imagine an agent that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monitors a DeFi protocol's TVL and alerts you on Discord.&lt;/li&gt;
&lt;li&gt;Executes arbitrage across DEXes when profitable.&lt;/li&gt;
&lt;li&gt;Proves your bank balance on-chain without revealing the number (via zkTLS).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Get Started in 2 Minutes&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @kuberna/sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;KubernaSDK&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@kuberna/sdk&lt;/span&gt;&lt;span class="dl"&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;sdk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;KubernaSDK&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="dl"&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;agent&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;sdk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createAgent&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YieldOptimizer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;framework&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ElizaOS&lt;/span&gt;&lt;span class="dl"&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;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Agent &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; is live!`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The SDK handles all the hard stuff—wallet management, gas estimation, intent routing—so you can focus on your agent's logic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open Source &amp;amp; Community&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Kuberna Labs is 100% open-source and built in public. We're based in Kigali, Rwanda, and we're on a mission to become the operating system for the agentic economy.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/kawacukennedy/kuberna-labs" rel="noopener noreferrer"&gt;GitHub Repo&lt;/a&gt;&lt;br&gt;&lt;br&gt;
👉 &lt;a href="https://discord.gg/74jRFM7u" rel="noopener noreferrer"&gt;Discord&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;We'd love your contributions, ideas, and stars. Let's build the future of autonomous agents together.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>blockchain</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Sunder: The Open‑Source AI Coding Assistant That Translates, Explains, and Pairs With You</title>
      <dc:creator>kennedy</dc:creator>
      <pubDate>Thu, 12 Feb 2026 09:00:17 +0000</pubDate>
      <link>https://dev.to/n3on/sunder-the-open-source-ai-coding-assistant-that-translates-explains-and-pairs-with-you-1i1g</link>
      <guid>https://dev.to/n3on/sunder-the-open-source-ai-coding-assistant-that-translates-explains-and-pairs-with-you-1i1g</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Every developer knows the drill:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You find a brilliant Python snippet, but your project is in JavaScript.&lt;/li&gt;
&lt;li&gt;You want a second pair of eyes, but scheduling a code review takes days.&lt;/li&gt;
&lt;li&gt;Copilot helps, but it’s proprietary, doesn’t explain &lt;em&gt;why&lt;/em&gt;, and can’t translate.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Sunder&lt;/strong&gt; fixes all of that; and it’s now &lt;strong&gt;open source&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is Sunder?
&lt;/h2&gt;

&lt;p&gt;Sunder is an &lt;strong&gt;AI‑powered collaborative platform&lt;/strong&gt; for code snippets. Think GitHub Gists meets Figma meets Gemini.&lt;/p&gt;

&lt;p&gt;With Sunder you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Save &amp;amp; discover&lt;/strong&gt; snippets across 50+ languages
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Translate&lt;/strong&gt; code between languages with &lt;strong&gt;functional equivalence&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pair program&lt;/strong&gt; with an AI that learns your style
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real‑time collaborate&lt;/strong&gt; on snippets with cursors, chat, and video
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Get explanations&lt;/strong&gt; and refactoring suggestions on demand
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All inside a beautiful Next.js + Tailwind UI.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Open Source?
&lt;/h2&gt;

&lt;p&gt;We believe developer tools should be &lt;strong&gt;transparent, community‑owned, and accessible to everyone&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;By open‑sourcing Sunder we’re saying:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You shouldn’t need a corporate budget to have an AI pair programmer.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We also want to build the &lt;strong&gt;best AI‑first coding platform&lt;/strong&gt; – and that can only happen with contributions from developers like you.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It in 60 Seconds
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/kawacukennedy/sunder
&lt;span class="nb"&gt;cd &lt;/span&gt;sunder
./scripts/setup.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s it. Docker Compose spins up PostgreSQL, Redis, and a &lt;strong&gt;mock AI server&lt;/strong&gt; – you don’t even need a Gemini API key.&lt;br&gt;&lt;br&gt;
Then open &lt;code&gt;http://localhost:3000&lt;/code&gt; and start exploring.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 What Needs Help?
&lt;/h2&gt;

&lt;p&gt;We’ve curated &lt;strong&gt;20+ “good first issues”&lt;/strong&gt; with detailed instructions and mentors.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Area&lt;/th&gt;
&lt;th&gt;Example Issue&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🎨 Frontend (React)&lt;/td&gt;
&lt;td&gt;Add syntax highlighting for Rust&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⚙️ Backend (Node)&lt;/td&gt;
&lt;td&gt;Optimize snippet search with trigram indexes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🧠 AI (Gemini)&lt;/td&gt;
&lt;td&gt;Improve translation accuracy for Go → TypeScript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📚 Docs&lt;/td&gt;
&lt;td&gt;Write a tutorial for real‑time collaboration&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://github.com/kawacukennedy/sunder/labels/good%20first%20issue" rel="noopener noreferrer"&gt;Browse good first issues →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  💬 Join Our Community
&lt;/h2&gt;

&lt;p&gt;We’re on Discord; ask questions, share what you build, and meet other contributors.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://discord.gg/n8G4BVe7" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fdiscord%2F1234567890%3Fcolor%3D5865F2%26label%3DJoin%2520Discord%26logo%3Ddiscord" alt="Discord" width="179" height="20"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  One Last Thing
&lt;/h2&gt;

&lt;p&gt;If you believe AI tools should be open and collaborative:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Star the repo&lt;/strong&gt; – it helps others find us
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Share this post&lt;/strong&gt; with a friend who loves AI
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pick an issue&lt;/strong&gt; and make your first contribution today
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s build the future of coding – together.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Sunder on GitHub:&lt;/strong&gt; &lt;a href="https://github.com/kawacukennedy/sunder" rel="noopener noreferrer"&gt;github.com/kawacukennedy/sunder&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Contact:&lt;/strong&gt; &lt;a href="//kawacukent@gmail.com"&gt;Email&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Twitter:&lt;/strong&gt; &lt;a href="http://x.com/Arnaud_Kennedy" rel="noopener noreferrer"&gt;@Arnaud_Kennedy&lt;/a&gt;&lt;/p&gt;




</description>
      <category>opensource</category>
      <category>ai</category>
      <category>javascript</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>I’m Building a High-Signal Discord for Developers Who Actually Want to Build (Not Another Dead Server)</title>
      <dc:creator>kennedy</dc:creator>
      <pubDate>Thu, 08 Jan 2026 18:44:17 +0000</pubDate>
      <link>https://dev.to/n3on/im-building-a-high-signal-discord-for-developers-who-actually-want-to-build-not-another-dead-19je</link>
      <guid>https://dev.to/n3on/im-building-a-high-signal-discord-for-developers-who-actually-want-to-build-not-another-dead-19je</guid>
      <description>

&lt;p&gt;Most developer Discord servers fail for the same reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Too many channels&lt;/li&gt;
&lt;li&gt;No structure&lt;/li&gt;
&lt;li&gt;No onboarding&lt;/li&gt;
&lt;li&gt;Everyone talks, nobody builds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I decided to build something different.&lt;/p&gt;

&lt;p&gt;I just launched a &lt;strong&gt;Developer Discord Community&lt;/strong&gt; designed around &lt;strong&gt;clarity, progression, and real collaboration&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What makes this server different
&lt;/h3&gt;

&lt;p&gt;This is not a “drop a link and disappear” Discord.&lt;/p&gt;

&lt;p&gt;We’ve designed it with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Structured onboarding&lt;/strong&gt; (Beginner, Intermediate, Advanced)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clean channel UX&lt;/strong&gt; (you only see what’s relevant to you)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Focused help channels&lt;/strong&gt; (no noise, no spam)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Project collaboration&lt;/strong&gt; (ideas → teams → execution)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A new Web3 channel&lt;/strong&gt; for serious discussions around blockchain, smart contracts, and decentralized apps&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Who this is for
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Developers who want to &lt;strong&gt;learn properly&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Developers who want to &lt;strong&gt;build real projects&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Developers who want &lt;strong&gt;feedback, not fluff&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Developers who want a community that respects their time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stacks include:&lt;br&gt;
Frontend, Backend, Mobile, AI/ML, DevOps — and now &lt;strong&gt;Web3&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What you’ll actually do inside
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Ask and answer real technical questions&lt;/li&gt;
&lt;li&gt;Get code reviews&lt;/li&gt;
&lt;li&gt;Collaborate on projects&lt;/li&gt;
&lt;li&gt;Share resources that matter&lt;/li&gt;
&lt;li&gt;Learn from developers at different levels&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Join here
&lt;/h3&gt;

&lt;p&gt;👉 &lt;a href="https://discord.gg/9nqtzGVb" rel="noopener noreferrer"&gt;Discord Server&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you’re tired of low-signal communities and want a place that feels intentional and well-run, you’re welcome.&lt;/p&gt;

&lt;p&gt;Let’s build something meaningful.&lt;/p&gt;




</description>
      <category>developer</category>
      <category>career</category>
      <category>productivity</category>
      <category>discuss</category>
    </item>
    <item>
      <title>I Built 12 Projects In 12 Days… and Almost Lost My Mind 😭💻</title>
      <dc:creator>kennedy</dc:creator>
      <pubDate>Tue, 02 Dec 2025 11:51:56 +0000</pubDate>
      <link>https://dev.to/n3on/i-built-12-projects-in-12-days-and-almost-lost-my-mind-56p8</link>
      <guid>https://dev.to/n3on/i-built-12-projects-in-12-days-and-almost-lost-my-mind-56p8</guid>
      <description>&lt;p&gt;If you’ve ever said &lt;strong&gt;“I’ll start coding seriously tomorrow”&lt;/strong&gt;,&lt;br&gt;
and then tomorrow becomes &lt;em&gt;next week&lt;/em&gt;… and next week becomes&lt;br&gt;
&lt;strong&gt;“after this YouTube video”&lt;/strong&gt;…&lt;/p&gt;

&lt;p&gt;Yeah. Same.&lt;/p&gt;

&lt;p&gt;I wasn’t a “perfect” coder — I wasn’t even a consistent coder.&lt;/p&gt;

&lt;p&gt;I was more like:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start a project → Get excited → Get stuck → Open TikTok → Never return.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But deep inside, something had to change.&lt;/p&gt;

&lt;p&gt;So I did something… &lt;strong&gt;questionable&lt;/strong&gt;, bold, and slightly unhinged:&lt;br&gt;
I challenged myself to build &lt;strong&gt;12 projects in 12 days&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Did I suffer? Yes.&lt;br&gt;
Did I improve? &lt;em&gt;More than I expected.&lt;/em&gt;&lt;br&gt;
Would I do it again?&lt;/p&gt;

&lt;p&gt;…Let’s not talk about that yet.&lt;/p&gt;




&lt;h1&gt;
  
  
  😤 Days 1–3: “I Am Him” Energy
&lt;/h1&gt;

&lt;p&gt;I started small — a little too small.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A weather app&lt;/li&gt;
&lt;li&gt;A mini Pac-Man style game&lt;/li&gt;
&lt;li&gt;A simple note app&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I felt unstoppable. I was coding like I had a personal sponsorship from Red Bull.&lt;/p&gt;




&lt;h1&gt;
  
  
  😵 Days 4–6: Bug-Induced Hallucinations
&lt;/h1&gt;

&lt;p&gt;This is where things… shifted.&lt;/p&gt;

&lt;p&gt;You know those bugs that exist purely to test your patience?&lt;/p&gt;

&lt;p&gt;Like when a button doesn’t work because you spelled &lt;code&gt;onclick&lt;/code&gt; as &lt;code&gt;onlcik&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;for 2 hours straight&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;At one point, I opened my console and it opened &lt;em&gt;back at me&lt;/em&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  😭 Days 7–9: The Existential Dread Arc
&lt;/h1&gt;

&lt;p&gt;Halfway through, I questioned EVERYTHING:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;My skills&lt;/li&gt;
&lt;li&gt;My sanity&lt;/li&gt;
&lt;li&gt;My life decisions&lt;/li&gt;
&lt;li&gt;Whether computers were even meant for humans&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But each time I considered giving up, a tiny voice whispered:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“Bro, you already tweeted about this challenge. You can’t embarrass yourself now.”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So I kept going.&lt;/p&gt;




&lt;h1&gt;
  
  
  🤯 Days 10–12: Final Boss Mode
&lt;/h1&gt;

&lt;p&gt;Something weird happened:&lt;br&gt;
I started coding… calmly?&lt;/p&gt;

&lt;p&gt;My debugging got faster.&lt;br&gt;
My problem-solving improved.&lt;br&gt;
I didn’t cry (as much).&lt;/p&gt;

&lt;p&gt;By Day 12, I pushed the last project, closed VS Code, and just sat there.&lt;/p&gt;

&lt;p&gt;I felt &lt;strong&gt;peace&lt;/strong&gt;.&lt;br&gt;
Or maybe burnout. Hard to tell.&lt;/p&gt;




&lt;h1&gt;
  
  
  💡 What I Learned (that school doesn’t teach you)
&lt;/h1&gt;

&lt;h3&gt;
  
  
  ✔ Consistency &amp;gt; Motivation
&lt;/h3&gt;

&lt;p&gt;Motivation comes and goes.&lt;br&gt;
Consistency stays — especially when your pride is on the line.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✔ Projects teach faster than tutorials
&lt;/h3&gt;

&lt;p&gt;You can’t “tutorial” your way into mastery.&lt;br&gt;
You need to build stuff. Break stuff. Fix stuff. Cry a bit.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✔ Your future self will thank you
&lt;/h3&gt;

&lt;p&gt;Even if your current self is suffering and eating cold noodles at 2 AM.&lt;/p&gt;




&lt;h1&gt;
  
  
  🔥 Final Thoughts
&lt;/h1&gt;

&lt;p&gt;This challenge didn’t turn me into a genius overnight.&lt;/p&gt;

&lt;p&gt;But it &lt;strong&gt;changed my mindset&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you're a beginner reading this, let me tell you:&lt;br&gt;
You &lt;em&gt;can&lt;/em&gt; become a great developer — just don’t quit when it gets hard.&lt;/p&gt;

&lt;p&gt;Start small. Build consistently.&lt;br&gt;
And maybe don’t do 12 projects in 12 days unless you're mentally prepared.&lt;/p&gt;

&lt;p&gt;(You’re probably not. I wasn’t.)&lt;/p&gt;




&lt;h1&gt;
  
  
  ❤️ If You Enjoyed This
&lt;/h1&gt;

&lt;p&gt;Leave a comment!&lt;br&gt;
Share the article!&lt;br&gt;
Tell me if you want the &lt;strong&gt;“12 Projects in 12 Days” full breakdown + code&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I might drop it.&lt;br&gt;
After I recover.&lt;/p&gt;




</description>
      <category>beginners</category>
      <category>productivity</category>
      <category>discuss</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
