<?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: henry</title>
    <description>The latest articles on DEV Community by henry (@henry_redfox).</description>
    <link>https://dev.to/henry_redfox</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%2F3976988%2Fbc61215f-4947-44b6-844c-75570b29663a.png</url>
      <title>DEV Community: henry</title>
      <link>https://dev.to/henry_redfox</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/henry_redfox"/>
    <language>en</language>
    <item>
      <title>How I Built a Contract Review Chrome Extension That Grounds AI in Real Statutes</title>
      <dc:creator>henry</dc:creator>
      <pubDate>Thu, 11 Jun 2026 06:38:04 +0000</pubDate>
      <link>https://dev.to/henry_redfox/how-i-built-a-contract-review-chrome-extension-that-grounds-ai-in-real-statutes-4c9</link>
      <guid>https://dev.to/henry_redfox/how-i-built-a-contract-review-chrome-extension-that-grounds-ai-in-real-statutes-4c9</guid>
      <description>&lt;p&gt;I signed a contract I didn't read. The auto-renewal cost me money I didn't have. So I built PactLens.&lt;/p&gt;

&lt;p&gt;The hard part wasn't the AI. It was preventing hallucinations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Hallucination Problem&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ask an LLM "review this contract clause" and it will confidently cite laws that don't exist. I tested this — GPT-4 invented a "Fair Contract&lt;br&gt;
  Terms Act 2024" and gave it a fake section number.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Solution: Statute Grounding&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PactLens pre-loads 1,700+ real statutes across 8 jurisdictions. Before the AI generates any analysis, we:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Extract clause semantics from the contract text&lt;/li&gt;
&lt;li&gt;Run keyword matching against the statute database&lt;/li&gt;
&lt;li&gt;Inject the top N matching statutes as context into the prompt&lt;/li&gt;
&lt;li&gt;Force the AI to cite ONLY from the provided statutes&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Result: zero hallucinated laws. Every citation is verifiable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Not a Vector Database?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Embedding 1,700+ statutes would make sense architecturally. But CF Workers doesn't have great vector support, and the statutes are stable&lt;br&gt;
  enough for keyword matching + TF-IDF. The simpler approach works better at this scale.&lt;/p&gt;

&lt;p&gt;Stack&lt;/p&gt;

&lt;p&gt;WXT + TypeScript for the extension. Hono + CF Workers for the backend. DeepSeek for AI inference. The entire statute database lives in CF KV&lt;br&gt;
  as JSON.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I Learned&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chrome Web Store review takes 2-3 weeks. Submit early.&lt;/li&gt;
&lt;li&gt;The statute grounding is what makes users trust the output. Without it, it's just another GPT wrapper.&lt;/li&gt;
&lt;li&gt;Freelancers don't search for "contract review AI." They search for "is this NDA clause normal?" Meet them where they are.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Try it: &lt;a href="https://dev.tourl"&gt;pactlens.net/contract&lt;/a&gt;&lt;/p&gt;

</description>
      <category>legaltech</category>
      <category>chrome</category>
      <category>ai</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How I Shipped 3 Chrome Extensions as a Solo Developer in 3 Months</title>
      <dc:creator>henry</dc:creator>
      <pubDate>Thu, 11 Jun 2026 06:33:05 +0000</pubDate>
      <link>https://dev.to/henry_redfox/how-i-shipped-3-chrome-extensions-as-a-solo-developer-in-3-months-4h49</link>
      <guid>https://dev.to/henry_redfox/how-i-shipped-3-chrome-extensions-as-a-solo-developer-in-3-months-4h49</guid>
      <description>&lt;p&gt;Three months ago I had zero Chrome Extensions. Last week, my third one got approved.&lt;/p&gt;

&lt;p&gt;Here's the honest timeline, technical stack, and what I'd do differently.&lt;/p&gt;

&lt;p&gt;Month 1: The Contract That Started Everything&lt;/p&gt;

&lt;p&gt;I signed a SaaS contract without reading the auto-renewal clause. Cost me money I didn't have. So I built PactLens — a Chrome extension that  reviews contracts before you sign.&lt;/p&gt;

&lt;p&gt;Key decisions that saved weeks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WXT framework over raw Chrome APIs (hot reload, TypeScript, manifest generation)&lt;/li&gt;
&lt;li&gt;Hono + Cloudflare Workers for the backend (zero cold start, global edge)&lt;/li&gt;
&lt;li&gt;DeepSeek for AI inference (20x cheaper than GPT-4 for the same quality)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Month 2: Pivot to Problems, Not Features&lt;/p&gt;

&lt;p&gt;I almost made the classic mistake: building features nobody asked for. Instead, I watched what freelancers were complaining about on Reddit&lt;br&gt;
  and Twitter.&lt;/p&gt;

&lt;p&gt;That's how DocuVox (document OCR &amp;amp; chat) and JobPilot (1-click job autofill) were born — not from brainstorming, but from real complaints.&lt;/p&gt;

&lt;p&gt;Month 3: The Chrome Web Store Is Not Your Friend&lt;/p&gt;

&lt;p&gt;I got rejected twice. Here's what the review team flagged:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;No remote code — eval() anywhere = instant rejection&lt;/li&gt;
&lt;li&gt;Every host permission must be justified in your description&lt;/li&gt;
&lt;li&gt;Description must be under 132 characters (yes, that tiny)&lt;/li&gt;
&lt;li&gt;Remove all console.log before submitting&lt;/li&gt;
&lt;li&gt;Privacy policy MUST be linked in the manifest&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What Worked for Getting Users&lt;/p&gt;

&lt;p&gt;Not Product Hunt. Not Hacker News. Reddit comments. Finding people with the exact problem and giving them a helpful answer. One well-placed&lt;br&gt;
  comment brought more users than any launch post.&lt;/p&gt;

&lt;p&gt;Stack Summary&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WXT + TypeScript for extensions&lt;/li&gt;
&lt;li&gt;Hono + Cloudflare Workers for backend&lt;/li&gt;
&lt;li&gt;DeepSeek for AI&lt;/li&gt;
&lt;li&gt;Lemon Squeezy for payments&lt;/li&gt;
&lt;li&gt;Zero servers, zero databases, zero DevOps&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%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftmyy1ebgoe9rbbi4ofg2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftmyy1ebgoe9rbbi4ofg2.png" alt=" " width="800" height="300"&gt;&lt;/a&gt;What I'd Do Differently&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Submit to the Chrome Web Store on DAY ONE. Review takes 2-3 weeks.&lt;/li&gt;
&lt;li&gt;Don't optimize before you have users. My first extension had 500 lines of unused code.&lt;/li&gt;
&lt;li&gt;Talk to users before writing code. Every successful feature came from a Reddit complaint.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;AMA in the comments about Chrome Extensions, solo dev, or the Chrome Web Store review process.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyg8hvoscrrelcm6aoj9a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyg8hvoscrrelcm6aoj9a.png" alt=" " width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>productivity</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How I Built a Chrome Extension That Analyzes Contracts Using 1,700+ Real Statutes as RAG Grounding</title>
      <dc:creator>henry</dc:creator>
      <pubDate>Wed, 10 Jun 2026 05:48:24 +0000</pubDate>
      <link>https://dev.to/henry_redfox/how-i-built-a-chrome-extension-that-analyzes-contracts-using-1700-real-statutes-as-rag-grounding-37fk</link>
      <guid>https://dev.to/henry_redfox/how-i-built-a-chrome-extension-that-analyzes-contracts-using-1700-real-statutes-as-rag-grounding-37fk</guid>
      <description>&lt;p&gt;Two months ago I signed a contract with an auto-renewal clause I didn't notice. When I tried to cancel, I owed another year. That $1,200&lt;br&gt;
  mistake turned into PactLens — a Chrome extension that reviews contracts before you sign.&lt;/p&gt;

&lt;p&gt;The core problem: LLMs hallucinate. You can't just ask an AI "is this clause risky" — it'll confidently make up laws that don't exist. So I&lt;br&gt;
  needed real statutes as a source of truth.&lt;/p&gt;

&lt;p&gt;The RAG Pipeline&lt;/p&gt;

&lt;p&gt;Here's how it works:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;User selects contract text on any page → right-clicks → "Review with PactLens"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The text hits our Cloudflare Worker backend, which extracts clause-level semantics&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We run semantic search against 1,700+ pre-loaded statutes using keyword matching + TF-IDF similarity&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The top N most relevant statutes are injected into the prompt as context&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The AI generates analysis grounded in those &lt;em&gt;actual&lt;/em&gt; statutes, not hallucinations&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The key insight: &lt;strong&gt;ground first, generate second&lt;/strong&gt;. The AI doesn't need to know every law — it just needs to know how to &lt;em&gt;apply&lt;/em&gt; the specific&lt;br&gt;
  statutes we feed it.&lt;/p&gt;

&lt;p&gt;Why Static Pre-Loading Over a Vector Database&lt;/p&gt;

&lt;p&gt;A vector DB would be "cleaner" architecturally. But:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Embedding 1,700+ statutes costs money and adds latency&lt;/li&gt;
&lt;li&gt;Cloudflare Workers don't have great vector DB support&lt;/li&gt;
&lt;li&gt;The statutes don't change daily — they're stable enough for pre-loading&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I went with plain text matching + TF-IDF stored in KV. Simple, fast, and surprisingly effective.&lt;/p&gt;

&lt;p&gt;## What I'd Do Differently&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start with the Chrome Web Store review guidelines FIRST, not last&lt;/li&gt;
&lt;li&gt;Use a lighter embedding model for better semantic search&lt;/li&gt;
&lt;li&gt;Add a feedback loop — let users flag incorrect analysis&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Stack&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hono + Cloudflare Workers (backend)&lt;/li&gt;
&lt;li&gt;WXT + TypeScript (extension)&lt;/li&gt;
&lt;li&gt;KV for statute storage&lt;/li&gt;
&lt;li&gt;DeepSeek for AI inference&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Links&lt;/p&gt;

&lt;p&gt;Chrome Store: [link]&lt;br&gt;
  Web App: &lt;a href="https://pactlens.net/contract" rel="noopener noreferrer"&gt;https://pactlens.net/contract&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Would love feedback from anyone who's worked on RAG systems — especially on making semantic search fast at the edge.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>typescript</category>
      <category>tutorial</category>
      <category>chromeextension</category>
    </item>
  </channel>
</rss>
