<?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: Avinash Jetwani</title>
    <description>The latest articles on DEV Community by Avinash Jetwani (@avinash_jetwani_e9c5b4eda).</description>
    <link>https://dev.to/avinash_jetwani_e9c5b4eda</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%2F4143029%2F1e04235f-83b8-4ffe-a168-f42e4a3403ce.jpg</url>
      <title>DEV Community: Avinash Jetwani</title>
      <link>https://dev.to/avinash_jetwani_e9c5b4eda</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/avinash_jetwani_e9c5b4eda"/>
    <language>en</language>
    <item>
      <title>Can a local model replace Jev in my Claude Code memory tool? I tested two</title>
      <dc:creator>Avinash Jetwani</dc:creator>
      <pubDate>Tue, 20 Oct 2026 12:50:00 +0000</pubDate>
      <link>https://dev.to/avinash_jetwani_e9c5b4eda/can-a-local-model-replace-jev-in-my-claude-code-memory-tool-i-tested-two-4kl</link>
      <guid>https://dev.to/avinash_jetwani_e9c5b4eda/can-a-local-model-replace-jev-in-my-claude-code-memory-tool-i-tested-two-4kl</guid>
      <description>&lt;p&gt;Someone on GitHub asked if jevmem could run fully local.&lt;/p&gt;

&lt;p&gt;Fair question. Today jevmem needs a paid TypeSafe API key: it sends each message, with common secrets removed, to TypeSafe's Jev API to decide what's worth saving.&lt;/p&gt;

&lt;p&gt;Ollaya runs open decision models on your own machine, and it answers in the same format as Jev's API. So I pointed jevmem at it.&lt;/p&gt;

&lt;p&gt;It connected with no code change: one URL, any key, and the model's name in the config.&lt;/p&gt;

&lt;p&gt;Then I ran the same tests I use for Jev.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setup&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;2 Oct 2026. M4 Mac with 16 GB, Ollaya 0.9.0. One run each, next to a Jev run the same afternoon.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deciding what to save (66 held-out turns)&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Save/skip right&lt;/th&gt;
&lt;th&gt;Save + kind right&lt;/th&gt;
&lt;th&gt;Median per turn&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Jev&lt;/td&gt;
&lt;td&gt;65/66&lt;/td&gt;
&lt;td&gt;63/66&lt;/td&gt;
&lt;td&gt;0.23 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;winnow:e4b (8 GB)&lt;/td&gt;
&lt;td&gt;60/66&lt;/td&gt;
&lt;td&gt;57/66&lt;/td&gt;
&lt;td&gt;28.5 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;laya:typed-decisions (852 MB)&lt;/td&gt;
&lt;td&gt;19/66&lt;/td&gt;
&lt;td&gt;19/66&lt;/td&gt;
&lt;td&gt;13.6 s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Both local models needed the client timeout raised from 10 s to 180 s.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recall and the guard (laya only)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Recall: no answer came back within jevmem's 1-second budget, so every prompt fell back to word matching: 48 of 78 wanted lines, against Jev's 73. Its 1,024-token context can't hold an 18-line memory file anyway.&lt;/li&gt;
&lt;li&gt;Guard: fast enough (158 ms median), but it caught 43 of 68 rule breaks with 13 false asks. Jev caught 66 with 3.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What it means&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On a laptop, not yet, so jevmem 0.7.6 still uses Jev. The accurate model is over 100× slower. The fast one is wrong too often.&lt;/p&gt;

&lt;p&gt;But 60 of 66 is close. And on JevBench, larger open models score near Jev when they run on servers. So this may change with better hardware, or the next models.&lt;/p&gt;

&lt;p&gt;If you have an NVIDIA GPU and want to try, &lt;code&gt;scripts/local-model-ollaya.sh&lt;/code&gt; in the repo runs each test against a local server. I'd love to see your numbers.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/Avinash-jetwani/jevmem" rel="noopener noreferrer"&gt;https://github.com/Avinash-jetwani/jevmem&lt;/a&gt; · Results: &lt;a href="https://avinash-jetwani.github.io/jevmem/results/#can-a-local-model-do-jevs-job" rel="noopener noreferrer"&gt;https://avinash-jetwani.github.io/jevmem/results/#can-a-local-model-do-jevs-job&lt;/a&gt; · JevBench: benchmarkheaven.com/jev-models&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Written with help from Claude. The numbers are from my own test sets, run once each, and the results files are in the repo.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>localai</category>
      <category>claudecode</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>How I built a scam-link checker on Jev</title>
      <dc:creator>Avinash Jetwani</dc:creator>
      <pubDate>Fri, 16 Oct 2026 22:02:34 +0000</pubDate>
      <link>https://dev.to/avinash_jetwani_e9c5b4eda/how-i-built-a-scam-link-checker-on-jev-57kb</link>
      <guid>https://dev.to/avinash_jetwani_e9c5b4eda/how-i-built-a-scam-link-checker-on-jev-57kb</guid>
      <description>&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lists first, then Jev.&lt;/strong&gt; 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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One call, four questions.&lt;/strong&gt; 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:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Is this likely phishing or a scam? (yes/no)&lt;/li&gt;
&lt;li&gt;Does the visible link text name a different site from the real address? (yes/no)&lt;/li&gt;
&lt;li&gt;Is it spammy or misleading? (yes/no)&lt;/li&gt;
&lt;li&gt;Overall: Safe, Suspicious or Scam? (a choice)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each answer comes back with a probability, so Peekray can be strict where it matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Guardrails.&lt;/strong&gt; 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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Speed.&lt;/strong&gt; 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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I just tuned.&lt;/strong&gt; 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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Privacy.&lt;/strong&gt; Only the link you hover, focus or click is checked, with its text and the page title. Never passwords, forms or cookies. No account.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>chrome</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>I made Claude Code check its commands against my project's rules</title>
      <dc:creator>Avinash Jetwani</dc:creator>
      <pubDate>Thu, 15 Oct 2026 12:50:00 +0000</pubDate>
      <link>https://dev.to/avinash_jetwani_e9c5b4eda/i-made-claude-code-check-its-commands-against-my-projects-rules-n7p</link>
      <guid>https://dev.to/avinash_jetwani_e9c5b4eda/i-made-claude-code-check-its-commands-against-my-projects-rules-n7p</guid>
      <description>&lt;p&gt;Some of my project's rules live in old chats.&lt;/p&gt;

&lt;p&gt;"Never commit .env files." "Ask before pushing a tag." "Don't edit the generated client by hand."&lt;/p&gt;

&lt;p&gt;Claude can only follow a rule that's in front of it when it acts. So in jevmem 0.6, I added the guard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwdgcdezkurw9l4riyxrq.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwdgcdezkurw9l4riyxrq.png" alt="jevmem guard: how a command is checked against saved rules" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude wants to run a command or edit a file (Bash, Edit or Write).&lt;/li&gt;
&lt;li&gt;Plain code looks for saved rules the call might touch. Most calls match nothing and go straight through.&lt;/li&gt;
&lt;li&gt;Only those candidates go to Jev, which judges whether the call may break the rule.&lt;/li&gt;
&lt;li&gt;If it might, Claude Code asks you first. You decide.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since 0.7.0 (9 Oct), you can also mark your own rules as trusted with &lt;code&gt;jevmem trust&lt;/code&gt;. In block mode, the guard can then stop a call that breaks a trusted rule, instead of asking.&lt;/p&gt;

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

&lt;p&gt;I wrote a held-out set before fixing anything: 274 tool calls in 5 new projects, 68 of them breaking a saved rule.&lt;/p&gt;

&lt;p&gt;The first build caught 50 of 68. After the fixes, 66 of 68, with 3–4 false asks in the 206 fine calls.&lt;/p&gt;

&lt;p&gt;In my own repo, over 65 real calls, it asked 3 times. Two were right. One wasn't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it misses&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It matches on the words a rule and a call share, so it can miss:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a rule that shares no words with the command&lt;/li&gt;
&lt;li&gt;calls like &lt;code&gt;git tag -d&lt;/code&gt; or &lt;code&gt;npm version&lt;/code&gt;, which share one word with a rule&lt;/li&gt;
&lt;li&gt;a slow answer: if Jev is late on a weak match, the call goes through. On a strong match, it asks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's a backstop, not a sandbox.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to know&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It needs a paid TypeSafe API key: the check runs on TypeSafe's Jev model, so the call and the matching rule go to their API. The repo's privacy notes say exactly what's sent.&lt;/li&gt;
&lt;li&gt;No telemetry.&lt;/li&gt;
&lt;li&gt;The guard runs in Claude Code. jevmem also saves from Cursor chats since 0.7.4, but it doesn't check Cursor's commands yet.&lt;/li&gt;
&lt;li&gt;The numbers come from my own test sets, run once each.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Try it&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Claude app → Plugins → Discover → jevmem → Add&lt;/li&gt;
&lt;li&gt;&lt;code&gt;npm install -g jevmem&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;jevmem setup&lt;/code&gt; in your project folder (it asks for your TypeSafe key and turns jevmem on there)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The guard runs in "ask" mode by default.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/Avinash-jetwani/jevmem" rel="noopener noreferrer"&gt;https://github.com/Avinash-jetwani/jevmem&lt;/a&gt; · How the guard works: &lt;a href="https://avinash-jetwani.github.io/jevmem/guard/" rel="noopener noreferrer"&gt;https://avinash-jetwani.github.io/jevmem/guard/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Written with help from Claude. The numbers are from my own test sets, run once each, and the results files are in the repo.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>ai</category>
      <category>security</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I tested whether Claude Code follows decisions from earlier chats</title>
      <dc:creator>Avinash Jetwani</dc:creator>
      <pubDate>Mon, 05 Oct 2026 14:02:38 +0000</pubDate>
      <link>https://dev.to/avinash_jetwani_e9c5b4eda/i-tested-whether-claude-code-follows-decisions-from-earlier-chats-23b3</link>
      <guid>https://dev.to/avinash_jetwani_e9c5b4eda/i-tested-whether-claude-code-follows-decisions-from-earlier-chats-23b3</guid>
      <description>&lt;p&gt;I got tired of re-explaining my project to Claude Code every session.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;CLAUDE.md fixes this if you keep it updated. I didn't.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;What it does&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You decide something in a Claude Code chat.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;If it is, jevmem writes one line to JEVMEM.md in your repo.&lt;/li&gt;
&lt;li&gt;Next session, the lines that matter for your prompt go back to Claude.&lt;/li&gt;
&lt;li&gt;Change your mind, and the old line is crossed out.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your team gets the same file through git.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does it work? I measured it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Three setups: no project memory, jevmem, and the same lines written by hand into CLAUDE.md.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;No memory&lt;/th&gt;
&lt;th&gt;jevmem&lt;/th&gt;
&lt;th&gt;CLAUDE.md&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Followed the project's decision&lt;/td&gt;
&lt;td&gt;28/72&lt;/td&gt;
&lt;td&gt;66/72&lt;/td&gt;
&lt;td&gt;67/72&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tried a change the project forbids&lt;/td&gt;
&lt;td&gt;10/18&lt;/td&gt;
&lt;td&gt;0/18&lt;/td&gt;
&lt;td&gt;not run&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Repeated an approach that had already failed&lt;/td&gt;
&lt;td&gt;3/15&lt;/td&gt;
&lt;td&gt;0/15&lt;/td&gt;
&lt;td&gt;0/15&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffunbgtzymzxbb9bs6hfi.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffunbgtzymzxbb9bs6hfi.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So jevmem is about as good as a hand-written CLAUDE.md. The difference is that you don't write it.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to know&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It needs a TypeSafe API key.&lt;/li&gt;
&lt;li&gt;Message text goes to TypeSafe to be scored. Common secrets are scrubbed first. No telemetry.&lt;/li&gt;
&lt;li&gt;Automatic in Claude Code. Codex and Cursor use the same file over MCP.&lt;/li&gt;
&lt;li&gt;These are my tasks and my projects. The scripts and results are in the repo, so you can check them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Try it&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Claude app → Plugins → Discover → jevmem → Add&lt;/li&gt;
&lt;li&gt;&lt;code&gt;npm i -g jevmem&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;jevmem key&lt;/code&gt;, then &lt;code&gt;jevmem enable&lt;/code&gt; in your project&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Open source, MIT. Built on TypeSafe AI's Jev.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/Avinash-jetwani/jevmem" rel="noopener noreferrer"&gt;https://github.com/Avinash-jetwani/jevmem&lt;/a&gt; · Full results: &lt;a href="https://avinash-jetwani.github.io/jevmem/results/" rel="noopener noreferrer"&gt;https://avinash-jetwani.github.io/jevmem/results/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'd love to hear where it saves the wrong thing.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Written with help from Claude. The numbers are from my own test runs, and the results files are in the repo.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>ai</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I built a Polymarket idea tester that will kill your strategy (paper-only, no wallet)</title>
      <dc:creator>Avinash Jetwani</dc:creator>
      <pubDate>Fri, 25 Sep 2026 13:51:41 +0000</pubDate>
      <link>https://dev.to/avinash_jetwani_e9c5b4eda/i-built-a-polymarket-idea-tester-that-will-kill-your-strategy-paper-only-no-wallet-3e02</link>
      <guid>https://dev.to/avinash_jetwani_e9c5b4eda/i-built-a-polymarket-idea-tester-that-will-kill-your-strategy-paper-only-no-wallet-3e02</guid>
      <description>&lt;p&gt;I keep seeing the same ask: how do I test a Polymarket idea before I put money on it?&lt;/p&gt;

&lt;p&gt;Most answers point at one of three things. A live simulator with fake cash on live odds. A Python backtest notebook. Or a dashboard that never quite says stop.&lt;/p&gt;

&lt;p&gt;I wanted a fourth option: type the idea in English, run it on resolved history, and get a verdict I could read without translating a log. Keep. Kill. No edge. Inconclusive.&lt;/p&gt;

&lt;p&gt;That product is OddSage — &lt;a href="https://oddsage.com" rel="noopener noreferrer"&gt;https://oddsage.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it is&lt;/strong&gt;&lt;br&gt;
OddSage is paper-only Polymarket research. No live trading. No wallet. No copy-trade execution.&lt;/p&gt;

&lt;p&gt;Two ways in:&lt;/p&gt;

&lt;p&gt;Paste a Polymarket URL. You get a Market Dossier — a research page for that market, not an order ticket.&lt;br&gt;
Type the idea in English. The builder drafts a strategy. You read the draft. Save and run.&lt;br&gt;
The loop is: English idea → draft → Save &amp;amp; run → verdict.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What the verdicts mean&lt;/strong&gt;&lt;br&gt;
Keep: the paper test left something worth holding. Still paper. Not a live order.&lt;/p&gt;

&lt;p&gt;Kill: it did not survive.&lt;/p&gt;

&lt;p&gt;No edge: it ran and still looked like noise.&lt;/p&gt;

&lt;p&gt;Inconclusive: not enough evidence. That is a stop, not a soft keep.&lt;/p&gt;

&lt;p&gt;A tool that only ever says “interesting” is a mood board. I wanted one that would kill an idea.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it is not&lt;/strong&gt;&lt;br&gt;
It is not a live virtual wallet. If you want to practice clicking on live odds with play money, use a simulator. That is a different job.&lt;/p&gt;

&lt;p&gt;It is not a Python SDK. If your edge already lives in a notebook with L2 replay, keep that workflow. OddSage is for people who have a sentence and want a keep/kill without opening a repo.&lt;/p&gt;

&lt;p&gt;It will not copy another trader onto your book. It will not place the trade if the verdict is keep.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A public kill&lt;/strong&gt;&lt;br&gt;
I am not going to invent a win rate for a launch post. Here is a finished public paper-test that did not get a pass:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://oddsage.com/strategy/259bc179-04dc-4e6d-816d-59d8f3cb52cc" rel="noopener noreferrer"&gt;https://oddsage.com/strategy/259bc179-04dc-4e6d-816d-59d8f3cb52cc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If a tester never shows a kill, it is selling hope.&lt;/p&gt;

&lt;p&gt;Why I am posting this on DEV.to&lt;br&gt;
Because the SERP for “polymarket strategy tester” and “test polymarket strategy” is full of Python tutorials and sim waitlists, and the category still needs a clear paper-only option that admits failure.&lt;/p&gt;

&lt;p&gt;Tagline I keep using: Test your Polymarket idea before you risk real money.&lt;/p&gt;

&lt;p&gt;Product pages if you want the job by name:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://oddsage.com/polymarket-strategy-tester" rel="noopener noreferrer"&gt;https://oddsage.com/polymarket-strategy-tester&lt;/a&gt;&lt;br&gt;
&lt;a href="https://oddsage.com/test-polymarket-strategy" rel="noopener noreferrer"&gt;https://oddsage.com/test-polymarket-strategy&lt;/a&gt;&lt;br&gt;
&lt;a href="https://oddsage.com/polymarket-paper-trading" rel="noopener noreferrer"&gt;https://oddsage.com/polymarket-paper-trading&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’m Avinash Jetwani. On X: @jetwaniavinash&lt;/p&gt;

&lt;p&gt;If it dies, it dies on paper.&lt;/p&gt;

</description>
      <category>polymarket</category>
      <category>predictionmarkets</category>
      <category>indiehackers</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
