<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[jevmem]]></title><description><![CDATA[jevmem]]></description><link>https://jevmem.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Fri, 13 Nov 2026 19:18:58 GMT</lastBuildDate><atom:link href="https://jevmem.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[How I built a scam-link checker on Jev]]></title><description><![CDATA[Scam links are built to look normal: a parcel fee, a tax refund, a short link from a friend. You can't tell where a link goes by reading it. So I built…]]></description><link>https://jevmem.hashnode.dev/how-i-built-a-scam-link-checker-on-jev</link><guid isPermaLink="true">https://jevmem.hashnode.dev/how-i-built-a-scam-link-checker-on-jev</guid><category><![CDATA[AI]]></category><category><![CDATA[Security]]></category><category><![CDATA[Chrome]]></category><category><![CDATA[Next.js]]></category><dc:creator><![CDATA[Avinash Jetwani]]></dc:creator><pubDate>Mon, 02 Nov 2026 15:22:04 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6ace54293a4bab78dc62db82/4be29c33-2170-4be0-a835-f264af42e765.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Scam links are built to look normal: a parcel fee, a tax refund, a short link from a friend. You can't tell where a link goes by reading it. So I built Peekray, a free Chrome extension and phone page that shows where a link really goes before you click, with one answer: Safe, Check first or Scam.</p>
<p><strong>Lists first, then Jev.</strong> Peekray follows short links and redirects on its server, up to four hops. Then it looks the final address up in three public threat lists: OpenPhish, PhishTank and URLhaus. Lists are fast and certain, but they only know scams someone has already reported. A scam site registered this morning isn't on any of them.</p>
<p>That gap is where Jev, TypeSafe AI's decision model, comes in. I didn't want a chatbot writing a paragraph about each link. I wanted a decision my code could act on, fast enough to show while your pointer is still on the link.</p>
<p><strong>One call, four questions.</strong> For each link no list knows, Peekray makes one Jev call. The state is the link, where it really lands, the redirect chain, how many days ago the domain was registered, and about 30 yes/no signals, such as a lookalike brand name, payment words or a free website host. Jev answers four questions together:</p>
<ol>
<li>Is this likely phishing or a scam? (yes/no)</li>
<li>Does the visible link text name a different site from the real address? (yes/no)</li>
<li>Is it spammy or misleading? (yes/no)</li>
<li>Overall: Safe, Suspicious or Scam? (a choice)</li>
</ol>
<p>Each answer comes back with a probability, so Peekray can be strict where it matters.</p>
<p><strong>Guardrails.</strong> Text from the page is treated as untrusted: it is shortened, email addresses and long numbers are removed, and a page title that tries to talk to the checker is dropped. Peekray's own rules can make Jev's answer more careful, never less. If a call hangs, a second one starts after 2.5 seconds and the first answer wins. If Jev is unavailable, a rule-based check answers instead of failing. Answers are cached for 10 minutes.</p>
<p><strong>Speed.</strong> On a fake parcel-fee link, Jev decided in 0.19 seconds. Across 40 live checks the median was 0.17 seconds, so most checks finish in under a second from hover to tag.</p>
<p><strong>What I just tuned.</strong> Obvious fake payment and sign-in pages used to come back Suspicious rather than Scam. Now strong signals, such as a lookalike brand on a payment or login page, take them straight to Scam.</p>
<p><strong>Privacy.</strong> Only the link you hover, focus or click is checked, with its text and the page title. Never passwords, forms or cookies. No account.</p>
<p>Try it without installing at peekray.com/share, or get it for Chrome: chromewebstore.google.com/detail/peekray/bmiolholodlhbdfecjihpkencpccknjp. I'd love to hear about any link it gets wrong.</p>
]]></content:encoded></item><item><title><![CDATA[I tested whether Claude Code follows decisions from earlier chats]]></title><description><![CDATA[I got tired of re-explaining my project to Claude Code every session. We'd decide something in one chat. "We use Postgres." "Don't touch the public API."…]]></description><link>https://jevmem.hashnode.dev/i-tested-whether-claude-code-follows-decisions-from-earlier-chats</link><guid isPermaLink="true">https://jevmem.hashnode.dev/i-tested-whether-claude-code-follows-decisions-from-earlier-chats</guid><category><![CDATA[claude-code]]></category><category><![CDATA[AI]]></category><category><![CDATA[Open Source]]></category><category><![CDATA[Productivity]]></category><dc:creator><![CDATA[Avinash Jetwani]]></dc:creator><pubDate>Wed, 21 Oct 2026 11:03:22 GMT</pubDate><content:encoded><![CDATA[<p>I got tired of re-explaining my project to Claude Code every session.</p>
<p>We'd decide something in one chat. "We use Postgres." "Don't touch the public API." "That migration approach failed, and here's why." A few sessions later, I'd be typing it again.</p>
<p>CLAUDE.md fixes this if you keep it updated. I didn't.</p>
<p>So I built jevmem.</p>
<p><strong>What it does</strong></p>
<ul>
<li>You decide something in a Claude Code chat.</li>
<li>After each message, Jev (TypeSafe AI's decision model) checks if it's worth keeping: a decision, a rule, a bug, an approach that failed.</li>
<li>If it is, jevmem writes one line to JEVMEM.md in your repo.</li>
<li>Next session, the lines that matter for your prompt go back to Claude.</li>
<li>Change your mind, and the old line is crossed out.</li>
</ul>
<p>Your team gets the same file through git.</p>
<p><strong>Does it work? I measured it.</strong></p>
<p>24 tasks in 3 small projects, 3 runs each. Real Claude Code sessions with claude-sonnet-5. Each task has a right answer that depends on a project decision saved earlier.</p>
<p>Three setups: no project memory, jevmem, and the same lines written by hand into CLAUDE.md.</p>
<table>
<thead>
<tr>
<th></th>
<th>No memory</th>
<th>jevmem</th>
<th>CLAUDE.md</th>
</tr>
</thead>
<tbody><tr>
<td>Followed the project's decision</td>
<td>28/72</td>
<td>66/72</td>
<td>67/72</td>
</tr>
<tr>
<td>Tried a change the project forbids</td>
<td>10/18</td>
<td>0/18</td>
<td>not run</td>
</tr>
<tr>
<td>Repeated an approach that had already failed</td>
<td>3/15</td>
<td>0/15</td>
<td>0/15</td>
</tr>
</tbody></table>
<p><img src="https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/bjofq2iomxocs9fs0sjx.png" alt="Image description" /></p>
<p>So jevmem is about as good as a hand-written CLAUDE.md. The difference is that you don't write it.</p>
<p>Where CLAUDE.md won: a convention nothing in the prompt points to, a rule for every user-facing string. CLAUDE.md got it 3 of 3 times, jevmem 0 of 3. Rules every task must follow still belong in CLAUDE.md.</p>
<p><strong>What to know</strong></p>
<ul>
<li>It needs a TypeSafe API key.</li>
<li>Message text goes to TypeSafe to be scored. Common secrets are scrubbed first. No telemetry.</li>
<li>Automatic in Claude Code. Codex and Cursor use the same file over MCP.</li>
<li>These are my tasks and my projects. The scripts and results are in the repo, so you can check them.</li>
</ul>
<p><strong>Try it</strong></p>
<ol>
<li>Claude app → Plugins → Discover → jevmem → Add</li>
<li><code>npm i -g jevmem</code></li>
<li><code>jevmem key</code>, then <code>jevmem enable</code> in your project</li>
</ol>
<p>Open source, MIT. Built on TypeSafe AI's Jev.</p>
<p>Repo: <a href="https://github.com/Avinash-jetwani/jevmem">https://github.com/Avinash-jetwani/jevmem</a> · Full results: <a href="https://avinash-jetwani.github.io/jevmem/results/">https://avinash-jetwani.github.io/jevmem/results/</a></p>
<p>I'd love to hear where it saves the wrong thing.</p>
<p><em>Written with help from Claude. The numbers are from my own test runs, and the results files are in the repo.</em></p>
]]></content:encoded></item></channel></rss>