<?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: Analyse with Vanshaj Poonia</title>
    <description>The latest articles on DEV Community by Analyse with Vanshaj Poonia (@vanshaj).</description>
    <link>https://dev.to/vanshaj</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%2F1214193%2F7c5eef47-3a39-44bd-82a5-581dc20b92cb.png</url>
      <title>DEV Community: Analyse with Vanshaj Poonia</title>
      <link>https://dev.to/vanshaj</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vanshaj"/>
    <language>en</language>
    <item>
      <title>Duplicate of #...: an open model that remembers 23,000 GitHub issues so maintainers don't have to</title>
      <dc:creator>Analyse with Vanshaj Poonia</dc:creator>
      <pubDate>Sat, 24 Oct 2026 21:42:11 +0000</pubDate>
      <link>https://dev.to/vanshaj/duplicate-of-an-open-model-that-remembers-23000-github-issues-so-maintainers-dont-have-to-49h</link>
      <guid>https://dev.to/vanshaj/duplicate-of-an-open-model-that-remembers-23000-github-issues-so-maintainers-dont-have-to-49h</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;The laziest comment in open source is four words long: &lt;strong&gt;“Duplicate of #1234.”&lt;/strong&gt; Paste it, and GitHub links the two issues and closes the new one.&lt;/p&gt;

&lt;p&gt;It is only lazy if you already know #1234 exists. In zed-industries/zed, maintainers have written it &lt;strong&gt;1,653 times&lt;/strong&gt;, and the issue they pointed to was filed a median of &lt;strong&gt;1,343 issues (64 days) earlier&lt;/strong&gt;. Nobody remembers that far back. So every duplicate is a search through a tracker with thousands of open issues, or a contributor fixing a bug that already has a thread, a workaround and a PR somewhere else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Already Filed&lt;/strong&gt; remembers for you. Point it at a GitHub repo and an open model, running in your browser tab, reads every open issue (and every one closed in the last 30 days), then lists the open issues that say the same thing as an earlier one. Each comes with the earlier issues it most resembles and a button that copies “Duplicate of #…”. It suggests; you decide.&lt;/p&gt;

&lt;p&gt;It works the other way too: paste the issue you are about to file, and it shows you whether someone got there first.&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%2F1uskxxk1olg4ub1wtofp.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%2F1uskxxk1olg4ub1wtofp.png" alt="Already Filed on a snapshot of ollama/ollama: 51 of 2,585 open issues flagged, each shown next to the earlier issue it most resembles, with a button to copy " width="800" height="1099"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Who gets to be lazier: maintainers on triage duty, and anyone about to file a bug who would rather not be told “dupe” by a bot an hour later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;🔗 &lt;a href="https://vanshajpoonia.github.io/already-filed/" rel="noopener noreferrer"&gt;vanshajpoonia.github.io/already-filed&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No sign-up, no API key. Press &lt;strong&gt;ollama/ollama (instant snapshot)&lt;/strong&gt; to open a snapshot of ollama's 2,711 open and recently closed issues, read in advance by the same model, so you see results straight away. On that snapshot it flags 51 of 2,585 open issues as probably filed before: two requests for the same Rockchip NPU, two for a Windows portable mode, three reports of the Mac app stuck on “Loading…”, and a run of Apple M5 Metal shader crashes.&lt;/p&gt;

&lt;p&gt;Or type any public repo and press &lt;strong&gt;Find the duplicates&lt;/strong&gt; to read it live. The model (197 MB) downloads once. After that, ollama's 2,714 open and recently closed issues take about five minutes on my laptop: 45 seconds to fetch them from GitHub, four minutes to read them on the GPU, and a few seconds to compare.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&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/VanshajPoonia" rel="noopener noreferrer"&gt;
        VanshajPoonia
      &lt;/a&gt; / &lt;a href="https://github.com/VanshajPoonia/already-filed" rel="noopener noreferrer"&gt;
        already-filed
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Finds the open GitHub issues that were already filed. EmbeddingGemma reads every issue in your browser; tested against every duplicate maintainers linked in zed and neovim.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Already Filed 🦥&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Finds the open GitHub issues that say the same thing as an earlier one, so maintainers can type “Duplicate of #…” without remembering thousands of issues. And lets a reporter check before filing.&lt;/p&gt;
&lt;p&gt;Point it at a repo. &lt;strong&gt;EmbeddingGemma&lt;/strong&gt;, Google's open-weight embedding model, reads every open issue (and every one closed this month) in your browser, and the page lists the open issues that look like one filed before, with the comment ready to copy. Nothing is sent anywhere except the request to GitHub's public API for the issues.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://vanshajpoonia.github.io/already-filed/" rel="nofollow noopener noreferrer"&gt;https://vanshajpoonia.github.io/already-filed/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/VanshajPoonia/already-filed/docs/results.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FVanshajPoonia%2Falready-filed%2FHEAD%2Fdocs%2Fresults.png" alt="Already Filed on a snapshot of ollama/ollama: open issues next to the earlier issues they resemble, with a button to copy Duplicate of" width="640"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Big repos get the same bug reported again and again. In zed-industries/zed, maintainers have linked &lt;strong&gt;1,653 issues&lt;/strong&gt; to the issue they duplicate; the original was filed a median &lt;strong&gt;1,343 issues (64 days) earlier&lt;/strong&gt;. Nobody remembers that far back, so every duplicate costs a maintainer a search, or a contributor's time on an issue…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/VanshajPoonia/already-filed" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Static files, no build step, no backend. MIT.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&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%2Fgu6vux3pzohsyzj2k7no.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%2Fgu6vux3pzohsyzj2k7no.png" alt="How Already Filed works: GitHub's API sends the issues to the browser tab, which cleans them, embeds them with EmbeddingGemma, scores every pair with a mix of the body vector, the title vector and keyword search, and shows the best matches for a person to decide" width="799" height="298"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Ground truth that maintainers already made
&lt;/h3&gt;

&lt;p&gt;The best thing about this problem is that the answers already exist. When a maintainer writes “Duplicate of #123”, or uses GitHub's close-as-duplicate menu, GitHub records a &lt;code&gt;MarkedAsDuplicateEvent&lt;/code&gt; linking the two issues. So I downloaded every issue of three busy repos through the GraphQL API, with those links, and froze them into the repo:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Repo&lt;/th&gt;
&lt;th&gt;Issues&lt;/th&gt;
&lt;th&gt;Linked duplicates&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ollama/ollama (tuning)&lt;/td&gt;
&lt;td&gt;11,478&lt;/td&gt;
&lt;td&gt;681&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;zed-industries/zed (test)&lt;/td&gt;
&lt;td&gt;23,450&lt;/td&gt;
&lt;td&gt;1,653&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;neovim/neovim (test)&lt;/td&gt;
&lt;td&gt;14,762&lt;/td&gt;
&lt;td&gt;379&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The test replays each repo in the order issues were filed. For every issue that was later linked as a duplicate, the question is simple: is the issue it duplicates among the top suggestions, using only what existed on the day it was filed? Every choice below was made on ollama, then frozen. I did not look at zed or neovim until the end.&lt;/p&gt;

&lt;h3&gt;
  
  
  First attempt: barely better than Ctrl+F
&lt;/h3&gt;

&lt;p&gt;The obvious version is: embed every issue with &lt;a href="https://huggingface.co/google/embeddinggemma-300m" rel="noopener noreferrer"&gt;EmbeddingGemma&lt;/a&gt;, compare each new issue with every earlier one, and show the closest. On ollama it put the right issue in the top three &lt;strong&gt;42%&lt;/strong&gt; of the time. Keyword search (BM25, roughly what GitHub's own search box does) managed &lt;strong&gt;38%&lt;/strong&gt;. Four points is not a reason to download a 197 MB model.&lt;/p&gt;

&lt;p&gt;Three things fixed it, and none of them was a bigger model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Search where duplicates actually point.&lt;/strong&gt; I looked at the issues maintainers pointed to: &lt;strong&gt;91%&lt;/strong&gt; were still open when the duplicate was filed, and another &lt;strong&gt;7%&lt;/strong&gt; had been closed in the 30 days before. Old closed issues are almost never the answer, but there are thousands of them, all waiting to be a near miss. Comparing each new issue only with issues open at the time (or closed in the last month) took the top three from 42% to &lt;strong&gt;49%&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Tell the model what the vectors are for.&lt;/strong&gt; EmbeddingGemma takes a task prompt. I had started with "sentence similarity", which sounds exactly right for "are these two issues the same?". On the tuning repo's titles I tried five prompts: "sentence similarity" found the right issue in the top three 41% of the time, "clustering" 40%, no prompt 47%, the document prompt 48%, and the &lt;strong&gt;retrieval prompt, &lt;code&gt;task: search result | query:&lt;/code&gt;, 51%&lt;/strong&gt;. Same weights, one line changed: on the full issues it took the top three from 49% to &lt;strong&gt;61%&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Three signals instead of one.&lt;/strong&gt; Issue templates make unrelated issues look alike: every ollama issue starts with "What is the issue?", "OS", "GPU", "Ollama version". Instead of hard-coding anyone's template, the app treats any line that appears in more than 2% of a repo's issues as template, and drops it, along with links, images and all but the first four lines of each log. Then each issue gets two vectors (title and body, and the title alone, because the title is where people name the bug), and keyword search comes back as a small third signal for exact error strings and model names that an embedding blurs. &lt;code&gt;0.7 × body + 0.3 × title + 0.1 × keywords&lt;/code&gt; took the top three to &lt;strong&gt;65%&lt;/strong&gt; and the top one from 29% to &lt;strong&gt;46%&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Measured on two repos it never saw
&lt;/h3&gt;

&lt;p&gt;Then I froze everything and ran the two test repos, which I had not looked at since downloading them.&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;zed: top 1&lt;/th&gt;
&lt;th&gt;top 3&lt;/th&gt;
&lt;th&gt;top 5&lt;/th&gt;
&lt;th&gt;neovim: top 1&lt;/th&gt;
&lt;th&gt;top 3&lt;/th&gt;
&lt;th&gt;top 5&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Keyword search (BM25)&lt;/td&gt;
&lt;td&gt;25%&lt;/td&gt;
&lt;td&gt;38%&lt;/td&gt;
&lt;td&gt;43%&lt;/td&gt;
&lt;td&gt;26%&lt;/td&gt;
&lt;td&gt;39%&lt;/td&gt;
&lt;td&gt;45%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EmbeddingGemma alone&lt;/td&gt;
&lt;td&gt;44%&lt;/td&gt;
&lt;td&gt;62%&lt;/td&gt;
&lt;td&gt;69%&lt;/td&gt;
&lt;td&gt;42%&lt;/td&gt;
&lt;td&gt;59%&lt;/td&gt;
&lt;td&gt;64%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bge-small (a sixth of the size), same recipe&lt;/td&gt;
&lt;td&gt;45%&lt;/td&gt;
&lt;td&gt;64%&lt;/td&gt;
&lt;td&gt;72%&lt;/td&gt;
&lt;td&gt;40%&lt;/td&gt;
&lt;td&gt;56%&lt;/td&gt;
&lt;td&gt;60%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EmbeddingGemma recipe (shipped)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;45%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;65%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;72%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;43%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;58%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;64%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;On zed's 1,653 duplicates, the issue a maintainer pointed to is in the top three suggestions &lt;strong&gt;65%&lt;/strong&gt; of the time, against 38% for keyword search. Of the duplicates only one of the two methods gets, 518 are EmbeddingGemma's and 64 are keyword search's. On neovim's 379 it is 58% against 39%. One result I did not expect: on neovim, EmbeddingGemma alone was as good as the full mix (59% against 58% at top three). The weights were fixed on ollama, and I left them alone rather than tune on the test set.&lt;/p&gt;

&lt;p&gt;One honest surprise: &lt;strong&gt;a model a sixth of the size is almost as good once the recipe is right.&lt;/strong&gt; bge-small, with the same search window and the same mix, is within two points of EmbeddingGemma on ollama and zed, and two to four behind on neovim. EmbeddingGemma is ahead at top three on all three repos, so it ships; but if you take one thing from this post, take the recipe: where to look, the right prompt, and a pinch of keywords.&lt;/p&gt;

&lt;h3&gt;
  
  
  Not every false alarm is false
&lt;/h3&gt;

&lt;p&gt;The thresholds were chosen on ollama: “likely” is where 5% of issues that were never linked to anything would still get a suggestion. On zed, “likely” shows the right earlier issue for 12% of duplicates and fires on 4% of the other issues. On paper those 4% are all false alarms. But maintainers do not link every duplicate: plenty get closed as “completed” with a comment, or just sit there.&lt;/p&gt;

&lt;p&gt;So I read them. &lt;code&gt;node scripts/audit.mjs zed-industries/zed 30&lt;/code&gt; prints a fixed random sample of 30 of zed's “false alarms”. By my reading, &lt;strong&gt;21 are the same problem&lt;/strong&gt; (two even have the same title, word for word: “Allow light/dark icon theme preference”, filed twice on the same day), &lt;strong&gt;9 are related&lt;/strong&gt; (same feature, a different bug: two Copilot problems in the agent panel, two MCP transport hangs with different triggers), and &lt;strong&gt;none are unrelated&lt;/strong&gt;. That is my judgement, not the maintainers', and every number above still counts all 30 as wrong.&lt;/p&gt;

&lt;h3&gt;
  
  
  Running it in a browser tab
&lt;/h3&gt;

&lt;p&gt;EmbeddingGemma runs through &lt;a href="https://github.com/huggingface/transformers.js" rel="noopener noreferrer"&gt;transformers.js&lt;/a&gt;, 4-bit, on WebGPU, or on WASM where there is no GPU (with a build that keeps the token table unquantised, because the WASM runtime lacks the quantised lookup). The issues come from GitHub's REST API, following GitHub's own pagination links: page numbers stop working after page 10 on big repos, which I found out from a 422 in the middle of a test run. The demo snapshot stores 8-bit vectors (4 MB for 2,711 issues), made by the same script and model as the tests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;It needs no permission from anyone.&lt;/strong&gt; The usual way to get duplicate detection is to install a bot: a GitHub App or Action that gets access to the repo and, often, sends each new issue to a hosted model API. Already Filed is a web page. Public issues come from GitHub's public API straight to your browser, and the model is a file your browser downloads. Add a token and it works on a private repo too, and the private issues still never leave the tab.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The ground truth is open too.&lt;/strong&gt; Every number in this post comes from thousands of “Duplicate of #” comments that maintainers wrote in public. That is a labelled dataset nobody had to pay for, and it is the reason I can tell you how often this is wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The thresholds only mean something because the model cannot change under me.&lt;/strong&gt; “Likely” is a number chosen on one repo's similarity scores. With a hosted embedding API, a quiet model update would shift every score and nobody would know the thresholds had stopped meaning anything. These weights are a file; the tests and the page use the same one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reading 38,000 issues cost nothing.&lt;/strong&gt; The test embeds every issue in both test repos with two models, on a laptop. No quota, no bill, no key to rotate, so it is cheap to measure properly instead of guessing.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;I built this with Claude Code as a pair programmer, and did not save the session to DevRelay, so here is the next best thing: every number in this post can be re-run.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/VanshajPoonia/already-filed
&lt;span class="nb"&gt;cd &lt;/span&gt;already-filed &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That replays both test repos (it embeds about 38,000 issues the first time, about two hours on an M4, cached after) and prints the table above. &lt;code&gt;npm run tune&lt;/code&gt; shows every choice made on ollama, and &lt;code&gt;node scripts/audit.mjs zed-industries/zed 30&lt;/code&gt; prints the false alarms I read.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Lazy Payoff
&lt;/h2&gt;

&lt;p&gt;Every duplicate in that test set was a maintainer doing the remembering by hand. In zed alone that happened 1,653 times, each time for an issue filed a median of 1,343 issues (two months) earlier.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;For 65% of them, the right issue is in Already Filed's top three.&lt;/strong&gt; That is one click on "Copy “Duplicate of #…”" instead of a search through 2,300 open issues.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It finds the ones nobody linked.&lt;/strong&gt; Of 30 confident suggestions for zed issues that were never marked as duplicates, 21 were the same problem anyway. Each of those is a conversation happening twice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It is lazy for reporters too.&lt;/strong&gt; Pasting a draft into "About to file an issue?" takes seconds, and for about two thirds of zed's past duplicates, the issue they repeated would have been among the three it shows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On ollama today&lt;/strong&gt;, the snapshot flags 51 of 2,585 open issues as probably filed before. Finding them by hand would mean comparing every open issue with every other one; the snapshot does it in about six seconds.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best Use of Gemma&lt;/strong&gt;: EmbeddingGemma (300M, 4-bit) runs in the browser and reads every issue. Every suggestion comes from its vectors, and the test runs the same model on 49,690 issues across three repos.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>github</category>
      <category>hacktoberfest</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Kokoro read 'Chapter IV' as 'Chapter Roman Four'. So I gave it a proofreader with ears.</title>
      <dc:creator>Analyse with Vanshaj Poonia</dc:creator>
      <pubDate>Tue, 13 Oct 2026 19:27:03 +0000</pubDate>
      <link>https://dev.to/vanshaj/kokoro-read-chapter-iv-as-chapter-roman-four-so-i-gave-it-a-proofreader-with-ears-9id</link>
      <guid>https://dev.to/vanshaj/kokoro-read-chapter-iv-as-chapter-roman-four-so-i-gave-it-a-proofreader-with-ears-9id</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;An indie author with fifteen novels has fifteen audiobooks they will probably never make. A human narrator costs roughly $200 to $400 per finished hour, so a ten-hour novel is a few thousand dollars, before anyone knows whether the audiobook will sell. Multiply by a backlist and the answer is "not this year", every year.&lt;/p&gt;

&lt;p&gt;Text-to-speech solves the cost. It does not solve the other half of making an audiobook: &lt;strong&gt;proof-listening&lt;/strong&gt;. Somebody has to hear every minute against the manuscript and catch the skipped words, the misread words and the lines that came out garbled. With a human narrator, that is a paid job of its own. With a voice model, it is ten hours of your life spent waiting for the six lines it got wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Backlist&lt;/strong&gt; does both halves on your own laptop:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Kokoro&lt;/strong&gt;, an open-weight voice model, narrates your chapter in the browser.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Whisper&lt;/strong&gt;, an open-weight speech recogniser, listens to every line it produced and checks it against your manuscript.&lt;/li&gt;
&lt;li&gt;You only listen to the lines it flags. If one sounds right, say so. If not, fix the text the narrator reads (or add a name to your pronunciation guide) and re-narrate just that line. Then download a chapter file mastered to audiobook spec.&lt;/li&gt;
&lt;/ol&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%2F5kz29sppi46nervnrudh.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%2F5kz29sppi46nervnrudh.png" alt="Proof-listening a passage of A Study in Scarlet: one line of 15 flagged, showing the words that did not match, everything the listener heard, and buttons to re-narrate or accept it by ear" width="800" height="524"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That flag is real. Doyle's newspaper paragraph runs through "the Vehmgericht, aqua tofana, Carbonari, the Marchioness de Brinvilliers", and the listener heard "the Vame direct, Aquatophana, Carbonari, the Martianest of Brinvaliers". Fourteen other lines of the passage passed. Instead of 2 minutes 16 seconds of listening, the author has 19 seconds to check.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who pays for this?&lt;/strong&gt; Self-published authors with a backlist, which is a lot of people: the indie side hustle that already pays for covers, editing and ads. What they would pay for is not the voice (open voices are free) but the workflow that makes a voice usable: the proof-listening, the pronunciation guide, the mastering. Because everything runs on the author's machine, each extra book costs me nothing to serve, so it can be a one-off price per book, or a few dollars a month for a whole backlist, and still be a business.&lt;/p&gt;

&lt;p&gt;An honest note on where the files can go: at the time of writing, Audible's ACX requires human narration, while Google Play Books has a "Synthesized voice" narrator type in its Partner Center, Kobo Writing Life accepts digitally narrated audiobooks if you say so, and selling direct (your own site, Bookfunnel, a Kickstarter reward tier) has no such rule. Backlist is for those.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;🔗 &lt;a href="https://vanshajpoonia.github.io/backlist/" rel="noopener noreferrer"&gt;vanshajpoonia.github.io/backlist&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No sign-up. Pick a sample and press &lt;strong&gt;Narrate this chapter&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;A Princess of Mars&lt;/em&gt;, chapter XI&lt;/strong&gt;, which is full of names nobody has heard of: Dejah Thoris, Tars Tarkas, Sarkoja, Lorquas Ptomel. The pronunciation guide comes filled in, the way an author would hand one to a human narrator.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;A Study in Scarlet&lt;/em&gt;, chapter I&lt;/strong&gt;: "Dr.", 1878, Netley, the Fifth Northumberland Fusiliers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first run downloads both models once (about 400 MB if your browser can use the graphics card, 170 MB if not). On my laptop, the Mars chapter (3 minutes 21 seconds of audio) is narrated, proof-listened and mastered in 44 seconds. Your manuscript never leaves the tab.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&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/VanshajPoonia" rel="noopener noreferrer"&gt;
        VanshajPoonia
      &lt;/a&gt; / &lt;a href="https://github.com/VanshajPoonia/backlist" rel="noopener noreferrer"&gt;
        backlist
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Audiobooks of your backlist, made on your own laptop: Kokoro narrates, Whisper proof-listens every line, both in the browser.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Backlist 🎙️&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Audiobooks of the books you have already written, made on your own laptop.&lt;/p&gt;
&lt;p&gt;Paste a chapter. &lt;strong&gt;Kokoro&lt;/strong&gt;, an open-weight voice model, narrates it in your browser. Then &lt;strong&gt;Whisper&lt;/strong&gt;, an open-weight speech recogniser, listens to every line and checks it against the manuscript. You re-check the handful of lines it flags instead of the whole chapter (accept them by ear, or fix the text and re-narrate just that line), and download a file mastered to audiobook spec.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://vanshajpoonia.github.io/backlist/" rel="nofollow noopener noreferrer"&gt;https://vanshajpoonia.github.io/backlist/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/VanshajPoonia/backlist/docs/review.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FVanshajPoonia%2Fbacklist%2FHEAD%2Fdocs%2Freview.png" alt="Proof-listening a passage of A Study in Scarlet: one line of 15 flagged, with what the listener heard, Re-narrate and Sounds right" width="560"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why a second model&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;A human-narrated audiobook costs an indie author $200 to $400 per finished hour, so a ten-hour novel is $2,000 to $4,000. An author with fifteen books in their backlist does not have that, which is why most backlists are never narrated. Text-to-speech fixes the cost. It does not fix the other half of audiobook production: &lt;strong&gt;proof-listening&lt;/strong&gt;, where someone hears every minute against the…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/VanshajPoonia/backlist" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Static files, no build step, no backend, no API keys. MIT.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&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%2Fmqy4m2gxpem9ir5shqjm.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%2Fmqy4m2gxpem9ir5shqjm.png" alt="How Backlist proof-listens: Kokoro narrates each line, Whisper hears it back one line behind, and only lines that do not match the book are flagged for the author" width="800" height="696"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Two open models, two workers, one runtime
&lt;/h3&gt;

&lt;p&gt;Both models run on &lt;a href="https://github.com/huggingface/transformers.js" rel="noopener noreferrer"&gt;transformers.js&lt;/a&gt;, each in its own Web Worker. The narrator works ahead and the listener follows one line behind, so proof-listening costs almost no extra time and the page never freezes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Narrator: &lt;a href="https://huggingface.co/hexgrad/Kokoro-82M" rel="noopener noreferrer"&gt;Kokoro-82M&lt;/a&gt;&lt;/strong&gt; (Apache-2.0). On the GPU through WebGPU when there is one, 8-bit on the CPU otherwise. Kokoro's official JavaScript package is built on an older transformers.js, and loading both versions would mean two copies of the ONNX runtime in one tab. So I ported its text handling (about a hundred lines: normalisation, eSpeak NG phonemes, voice styles) onto the same runtime as the listener. That also means the browser and the test suite run identical code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Listener: &lt;a href="https://huggingface.co/openai/whisper-base.en" rel="noopener noreferrer"&gt;Whisper base.en&lt;/a&gt;&lt;/strong&gt; (MIT), 8-bit, on the CPU.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What the listener caught in the narrator
&lt;/h3&gt;

&lt;p&gt;I built the listener to catch narration errors, and the first thing it did was catch Kokoro's:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Roman numerals are read as "Roman".&lt;/strong&gt; &lt;em&gt;Chapter IV&lt;/em&gt; came back from the listener as "Chapter Roman 4". &lt;em&gt;Henry VIII&lt;/em&gt; was "Henry Roman 8". A great many chapter headings look exactly like that. Backlist now reads book structure as cardinals ("Chapter Four") and monarchs as ordinals ("Henry the Eighth").&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Long sentences are cut off without a word.&lt;/strong&gt; Kokoro reads at most 510 phoneme tokens at a time and silently drops the rest. I counted: across &lt;em&gt;A Princess of Mars&lt;/em&gt;, &lt;em&gt;A Study in Scarlet&lt;/em&gt; and &lt;em&gt;A Christmas Carol&lt;/em&gt;, &lt;strong&gt;21 sentences&lt;/strong&gt; are over that limit. The longest, in &lt;em&gt;A Princess of Mars&lt;/em&gt;, is 168 words, which is 1,317 tokens: more than half of it would simply never be said, and nothing would tell you. Backlist splits sentences over 50 words at their own semicolons and commas, and re-splits any line that still comes close.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I measured the narration rules too: of 31 test lines they change, the listener flagged 6 as written and 1 with the rules. Five of the six were chapter headings ("Chapter Romans 3, my Advent on Mark" is my favourite), all fixed. The one left is &lt;em&gt;"bade adieu to their landlady upon Tuesday, the 4th inst."&lt;/em&gt;, which comes back as "bated due" either way: archaic and French words are exactly what the pronunciation guide is for. My other rules (Saint or Street, military titles) never changed a verdict in these books, so I am not claiming they fixed anything.&lt;/p&gt;

&lt;h3&gt;
  
  
  Teaching the listener what not to worry about
&lt;/h3&gt;

&lt;p&gt;The obvious checker compares what Whisper heard with the book, word by word. On clean, correct narration of &lt;em&gt;A Christmas Carol&lt;/em&gt;, that flagged &lt;strong&gt;40%&lt;/strong&gt; of the lines. Whisper is a model with habits of its own, and almost none of the differences were narration errors. A few I collected along the way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dickens writes "door-nail"; Whisper writes "doornail". "Ironmongery" came back as "iron mongering".&lt;/li&gt;
&lt;li&gt;"In 1878" comes back as digits, "Mister" comes back as "Mr.", "colour" as "color".&lt;/li&gt;
&lt;li&gt;"There I was struck" came back as "Their eye was struck". Correct narration, creative spelling.&lt;/li&gt;
&lt;li&gt;And names. Whisper has never heard of Dejah Thoris, and writes "Digiothorus". "Tars Tarkas" was "Tar's Tar Cuss".&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the checker (&lt;code&gt;src/compare.js&lt;/code&gt;) aligns the two word sequences, compares words by how they sound rather than how they are spelled, turns numbers into words on both sides, and forgives compounds, homophones and abbreviations. For names, it only checks that &lt;em&gt;something&lt;/em&gt; name-shaped was said in the right place. Whether Tars Tarkas sounds right is a question for the author's pronunciation guide and the author's ears, and the app says so.&lt;/p&gt;

&lt;p&gt;What it never forgives: words skipped, words added or said twice, a word swapped for a different one, a line cut short.&lt;/p&gt;

&lt;h3&gt;
  
  
  Measuring it with planted faults
&lt;/h3&gt;

&lt;p&gt;A proof-listener has two jobs: catch real mistakes, and stay quiet on good audio. One that cries wolf sends you back to listening to everything. To measure both, &lt;code&gt;npm test&lt;/code&gt; takes real lines from the books and renders each one five times through the real narrator: once as written, and four times with a fault planted in the text the narrator reads (three words skipped, three words said twice, one word swapped for an unrelated one, the last 40% never said). Every rendering is heard back by the real listener and checked against the book. Lines rotate through four voices, two American and two British.&lt;/p&gt;

&lt;p&gt;I tuned the checker's rules on 30 lines of &lt;em&gt;A Christmas Carol&lt;/em&gt;, then froze them and tested on lines from &lt;em&gt;A Study in Scarlet&lt;/em&gt; and &lt;em&gt;A Princess of Mars&lt;/em&gt; that it had never seen:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Checker&lt;/th&gt;
&lt;th&gt;False alarms on clean audio&lt;/th&gt;
&lt;th&gt;Skipped&lt;/th&gt;
&lt;th&gt;Repeated&lt;/th&gt;
&lt;th&gt;Swapped&lt;/th&gt;
&lt;th&gt;Cut off&lt;/th&gt;
&lt;th&gt;All faults&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Exact match after normalising&lt;/td&gt;
&lt;td&gt;25/80 (31%)&lt;/td&gt;
&lt;td&gt;74/74&lt;/td&gt;
&lt;td&gt;68/74&lt;/td&gt;
&lt;td&gt;74/74&lt;/td&gt;
&lt;td&gt;74/74&lt;/td&gt;
&lt;td&gt;98%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Word error rate ≤ 15%&lt;/td&gt;
&lt;td&gt;1/80 (1%)&lt;/td&gt;
&lt;td&gt;27/74&lt;/td&gt;
&lt;td&gt;24/74&lt;/td&gt;
&lt;td&gt;5/74&lt;/td&gt;
&lt;td&gt;74/74&lt;/td&gt;
&lt;td&gt;44%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Backlist, rules frozen before the test&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1/80 (1%)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;74/74&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;67/74&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;72/74&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;74/74&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;97%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backlist after fixing what the test exposed&lt;/td&gt;
&lt;td&gt;0/80&lt;/td&gt;
&lt;td&gt;74/74&lt;/td&gt;
&lt;td&gt;67/74&lt;/td&gt;
&lt;td&gt;74/74&lt;/td&gt;
&lt;td&gt;74/74&lt;/td&gt;
&lt;td&gt;98%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The exact-match checker catches nearly everything and cries wolf on almost a third of perfectly good lines. The usual word-error-rate threshold is quiet but misses more than half the faults, including 69 of 74 swapped words, because one wrong word in a long sentence is under 15%. Backlist's checker is as quiet as the threshold and nearly as thorough as exact match.&lt;/p&gt;

&lt;p&gt;The test also found three gaps in my rules. A title-case table of contents had made "Through" count as a name (so a swap there was forgiven), "Decameron" came back as "de Cameron", and "corps" came back as its homophone "core". I fixed all three; the last row is after those fixes, so the frozen row above it is the honest held-out number.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Every fault it still misses is a repetition.&lt;/strong&gt; Kokoro said "after he had after he had listened", and Whisper wrote it down once. Whisper was trained on tidied-up transcripts, and it tidies. That is a limit of the listener, not something a rule can fix, so the README says so plainly: a stutter can get through.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mastering, and making it fast
&lt;/h3&gt;

&lt;p&gt;The chapter file is built in the browser (&lt;code&gt;src/audio.js&lt;/code&gt;): Kokoro's own silences trimmed, consistent pauses added (sentence, paragraph, scene break), resampled to 44.1 kHz with a windowed-sinc filter, the loudness set to -20 dB RMS and the peaks held under -3 dB with a limiter. That is the spec most audiobook distributors publish, and the app checks the file against it.&lt;/p&gt;

&lt;p&gt;The listener was the bottleneck. It runs on the CPU, and single-threaded WebAssembly is slow. Cross-origin isolation lets ONNX Runtime use several threads, but it needs two HTTP headers, and GitHub Pages cannot send headers. So the service worker adds them to every file it serves, and the page reloads itself once on the first visit. On my laptop that took the Mars chapter (3 minutes 21 seconds of audio) from 1 minute 34 seconds to &lt;strong&gt;44 seconds&lt;/strong&gt;, 4.5x real time. A browser without WebGPU still gets there, with both models on the CPU, at 0.7x real time: a chapter is something to start before making a cup of tea.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Because the business is the backlist.&lt;/strong&gt; One audiobook is a few hundred thousand characters, rendered more than once while you fix things. A backlist is fifteen of those. With a voice model you rent by the character, every re-render is a line item, and the economics push you towards narrating only the books you are already sure will sell. With open weights on the author's own machine, the fifteenth book costs the same as the first: nothing. That is what makes a cheap tool for indie authors possible at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Because a manuscript is the most private thing an author has.&lt;/strong&gt; Unpublished and backlist books are the author's income. Plenty of authors are, reasonably, unwilling to upload them to a service whose terms they cannot control. Here the chapter goes into a model in the tab, and audio comes out. Nothing is uploaded.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Because I could take the narrator apart.&lt;/strong&gt; Every finding in this post (the 510-token cliff, the "Roman four", the stutters Whisper tidies away) came from running the same open weights in Node hundreds of times, reading the code that feeds them, and porting it. The test suite alone renders and listens to about 600 clips, and costs nothing to re-run. With a closed voice API I could not have found the truncation, only suffered it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Because the safety net is open too.&lt;/strong&gt; The proof-listener is itself an open model I can run locally and measure. That is why I can tell you how often it is wrong, on books it was not tuned on, instead of asking you to trust it.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;I built this with Claude Code as a pair programmer. I didn't save the session to DevRelay, so here is the next best thing: every number in this post can be re-run.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/VanshajPoonia/backlist
&lt;span class="nb"&gt;cd &lt;/span&gt;backlist &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That downloads the three public-domain books from Project Gutenberg, renders every test line and its planted faults through Kokoro, listens to all of them with Whisper, and prints the table above along with every false alarm and every missed fault. &lt;code&gt;SET=tuning npm test&lt;/code&gt; reproduces the tuning set; &lt;code&gt;LISTENER=whisper-tiny.en npm test&lt;/code&gt; swaps in the smaller listener.&lt;/p&gt;

&lt;h2&gt;
  
  
  My First User
&lt;/h2&gt;

&lt;p&gt;Not yet, and I would rather leave this empty than invent one. If you write, paste in a chapter of your own (it never leaves your browser) and tell me in the comments what it flagged, how your character names came out, and whether you would pay for it. I will add the first answers here.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>There is no Red Tomb: making a 1B model write walking quests without making things up</title>
      <dc:creator>Analyse with Vanshaj Poonia</dc:creator>
      <pubDate>Sat, 10 Oct 2026 22:16:45 +0000</pubDate>
      <link>https://dev.to/vanshaj/there-is-no-red-tomb-making-a-1b-model-write-walking-quests-without-making-things-up-4p4b</link>
      <guid>https://dev.to/vanshaj/there-is-no-red-tomb-making-a-1b-model-write-walking-quests-without-making-things-up-4p4b</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;"Go touch grass" is good advice that rarely works, because a walk with no destination loses to the couch every time. What gets people out of the house is a reason: a dog that needs walking, a kid who needs tiring out, a thing to go and see.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sidequest&lt;/strong&gt; gives a walk a reason. You tell it three things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;where&lt;/strong&gt; (your location, or one of four famous parks if you are trying it from a desk),&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;how long&lt;/strong&gt; (20 minutes, 40, or an hour),&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;who is coming&lt;/strong&gt; (just you, you and a kid, or you and a dog).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It reads OpenStreetMap around you, picks the most interesting real things within reach (a 500-year-old tomb, a statue, a bench with an inscription, a tree someone bothered to name), and routes the shortest loop through them that fits your time. Then &lt;strong&gt;Gemma, running on your device&lt;/strong&gt;, writes you one small thing to do at each stop.&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%2Fex8ik6nmpvs51xvbx9ed.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%2Fex8ik6nmpvs51xvbx9ed.png" alt="A 40-minute quest on Hampstead Heath: a sketch map of the loop and three stops, each with a mission written by Gemma in the browser" width="716" height="2216"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is for anyone who wants to walk more and keeps not doing it, and for the parent at 4 pm on a Saturday who needs the next 40 minutes to have a plot. The quest is written at home on wifi and saved on the phone, so it still works in the middle of a park with one bar of signal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;🔗 &lt;a href="https://vanshajpoonia.github.io/sidequest/" rel="noopener noreferrer"&gt;vanshajpoonia.github.io/sidequest&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No sign-up. Pick &lt;strong&gt;Lodhi Garden&lt;/strong&gt;, &lt;strong&gt;Golden Gate Park&lt;/strong&gt;, &lt;strong&gt;Hampstead Heath&lt;/strong&gt; or &lt;strong&gt;Central Park&lt;/strong&gt;, choose a length, and press &lt;em&gt;Make my quest&lt;/em&gt;. Or press &lt;em&gt;Start where I am&lt;/em&gt; and get a walk around your own block.&lt;/p&gt;

&lt;p&gt;The first quest downloads Gemma once (about 860 MB, so use wifi). After that, on my laptop in Chrome with WebGPU, the three-stop quest above took 21 seconds to write, retries included. Every stop has a &lt;strong&gt;Walk there ↗&lt;/strong&gt; link for directions and a &lt;strong&gt;"Why this mission?"&lt;/strong&gt; panel, which turns out to be the most important part of the app:&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%2Flac73lb84hlnvb3jaevw.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%2Flac73lb84hlnvb3jaevw.png" alt="The Why this mission panel for a radio mast: the OpenStreetMap facts, and a rejected first draft that said Ascend the tower" width="648" height="810"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That is a real one from the quest above. Gemma's first idea for a radio mast was to climb it. The checker said no, told Gemma why, and the second draft kept you on the ground. The panel shows you all of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&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/VanshajPoonia" rel="noopener noreferrer"&gt;
        VanshajPoonia
      &lt;/a&gt; / &lt;a href="https://github.com/VanshajPoonia/sidequest" rel="noopener noreferrer"&gt;
        sidequest
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Turns the real map around you into a short walking quest. OpenStreetMap stops, missions written by Gemma 3 running in your browser.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Sidequest 🧭&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Turns the real map around you into a short walking quest.&lt;/p&gt;
&lt;p&gt;Pick a start and a length (20 minutes, 40, an hour). Sidequest reads OpenStreetMap around you, picks the most interesting real things within reach (a 500-year-old tomb, a blue plaque, the 1894 Liberty Tree, a whispering bench), routes the shortest loop through them that fits your time, and then &lt;strong&gt;Gemma, running in your browser&lt;/strong&gt;, writes you one small thing to do at each stop.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://vanshajpoonia.github.io/sidequest/" rel="nofollow noopener noreferrer"&gt;https://vanshajpoonia.github.io/sidequest/&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Stop 2 · 🏛️ Viaduct Bridge.&lt;/strong&gt; Cross the Viaduct Bridge and examine the bridge’s construction – is it solid stone or a cleverly constructed timber?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/VanshajPoonia/sidequest/docs/quest.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FVanshajPoonia%2Fsidequest%2FHEAD%2Fdocs%2Fquest.png" alt="A 40-minute quest on Hampstead Heath" width="320"&gt;&lt;/a&gt; &lt;a rel="noopener noreferrer" href="https://github.com/VanshajPoonia/sidequest/docs/why.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FVanshajPoonia%2Fsidequest%2FHEAD%2Fdocs%2Fwhy.png" alt="Why this mission: the OpenStreetMap facts and a rejected draft" width="320"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;The model writes. The code navigates.&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Given only a place's name, a 1B model fills the gaps with confident inventions (the table below counts them). So Gemma is never asked where to go: choosing stops and adding up distances is arithmetic, and arithmetic belongs in…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/VanshajPoonia/sidequest" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Static files, no build step, no backend, no API keys. MIT.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&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%2Foaotwycjrqwsk2yiyw52.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%2Foaotwycjrqwsk2yiyw52.png" alt="How Sidequest works: OpenStreetMap data is scored and routed in code, Gemma writes one mission per stop, a checker sends failed drafts back with the reason, and a plain template takes over after three strikes" width="399" height="1056"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The model writes. The code navigates.
&lt;/h3&gt;

&lt;p&gt;The first decision was what &lt;strong&gt;not&lt;/strong&gt; to ask Gemma. Picking stops and adding up distances is a job ordinary code does perfectly, so Gemma never chooses where you go. &lt;code&gt;src/plan.js&lt;/code&gt; scores OpenStreetMap features by what their tags prove (has a name? an inscription? a Wikipedia link? a date?), keeps one of each kind where it can, and brute-forces the shortest start → stops → start loop, walked at 75 m a minute with a 1.3× allowance for paths not being straight, plus three minutes at each stop. If a loop does not fit your time, you are not offered it.&lt;/p&gt;

&lt;p&gt;That leaves Gemma one job, the one a language model is actually good at: turning a list of facts about a place into a sentence a person wants to act on. &lt;em&gt;"Race your kid to the English oak and see if the two of you can reach all the way around its trunk."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The hard part was getting it to do only that.&lt;/p&gt;

&lt;h3&gt;
  
  
  Measuring it
&lt;/h3&gt;

&lt;p&gt;I took the six best stops around each of the four parks (24 in all, a mix of tombs, statues, plaques, trees, viewpoints and benches), cycled through solo, kid and dog walkers, and wrote a checker that flags a mission if it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;mentions a &lt;strong&gt;year or a proper noun that is not in the stop's OpenStreetMap tags&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;asks the walker to find out a &lt;strong&gt;date the map does not have&lt;/strong&gt; (&lt;em&gt;"determine the original construction date"&lt;/em&gt; turned out to be Gemma's favourite filler),&lt;/li&gt;
&lt;li&gt;asks for anything &lt;strong&gt;unsafe&lt;/strong&gt; (climbing, wading, picking, feeding, going inside),&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;describes the place instead of giving an instruction&lt;/strong&gt;, or talks to a kid on a dog walk,&lt;/li&gt;
&lt;li&gt;runs past 35 words.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then I ran Gemma 3 1B (4-bit, the exact weights the browser loads) over all 24 stops in four configurations, with greedy decoding so the numbers come out the same on every run.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prompt&lt;/th&gt;
&lt;th&gt;Invented a name or date&lt;/th&gt;
&lt;th&gt;Asked for a date the map lacks&lt;/th&gt;
&lt;th&gt;Not a mission, or wrong walker&lt;/th&gt;
&lt;th&gt;Clean&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;The place's name only (rules + examples)&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;8 / 24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OSM tags + rules, no examples&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;12 / 24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OSM tags + rules + 4 examples as chat turns&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;16 / 24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;+ checker, retry with feedback, template (&lt;strong&gt;shipped&lt;/strong&gt;)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;24 / 24&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Nothing unsafe and nothing over-long turned up in any configuration, so those columns are left out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Attempt 1: give it the name and let it use what it knows.&lt;/strong&gt; This is the obvious prompt, and &lt;strong&gt;15 of 24&lt;/strong&gt; missions invented something. Gemma knows &lt;em&gt;of&lt;/em&gt; Lodhi Garden and Golden Gate Park, but not well enough to send someone anywhere real, so it fills the gaps with confident detail:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Lion&lt;/strong&gt; (a statue in Golden Gate Park): "Search the Lion statue in Golden Gate Park for a discarded leash."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Richard Tucker&lt;/strong&gt; (a bust near Central Park), for a parent and kid: "Search the Red Tomb for your kid's favorite toy, a red rubber ball, and see if it's visible from the entrance."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There is no leash, there is no ball, and there is no Red Tomb in New York. More on the Red Tomb shortly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Attempt 2: give it the tags and a set of clear rules.&lt;/strong&gt; The rules worked: no invented names at all. But only half the answers were missions. For a 1B model, rules written in prose are not instructions so much as text to continue, and it often just echoed the input back. Asked for a mission at the Athpula Bridge, it replied &lt;strong&gt;"Athpula Bridge"&lt;/strong&gt;. Twice it replied, in full, &lt;strong&gt;"Place:"&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Attempt 3: show it, do not tell it.&lt;/strong&gt; I kept the rules and added four worked examples, each as a real turn in the conversation (user: the facts, assistant: the mission) rather than as a paragraph of examples in the prompt. Small models copy the &lt;em&gt;shape&lt;/em&gt; of what they have already "said" far more reliably than they follow instructions. Clean missions went from 12 to 16 out of 24.&lt;/p&gt;

&lt;p&gt;They also copied things they were never supposed to copy. One of my examples was a made-up place called the Red Tomb, and it started turning up everywhere:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Karl Marx's original grave&lt;/strong&gt;, Highgate, London: "Count the stones surrounding the Red Tomb and note the faint scent of lavender."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Attempt 4: do not trust it, check it, and tell it what was wrong.&lt;/strong&gt; What ships runs every draft through the checker. If it fails, the draft goes back to Gemma with the specific reason (&lt;em&gt;It mentions "Red", which is not in the facts. Write the mission again, using only the facts.&lt;/em&gt;). After three failures, a plain template takes over: &lt;em&gt;"Find the view, then name the farthest thing you can see."&lt;/em&gt; A boring mission beats an invented one.&lt;/p&gt;

&lt;p&gt;Result: &lt;strong&gt;24 of 24 clean&lt;/strong&gt;. Sixteen passed on the first try, five after being told what was wrong, and three fell back to a template.&lt;/p&gt;

&lt;h3&gt;
  
  
  Check the checker
&lt;/h3&gt;

&lt;p&gt;That Karl Marx line was in my &lt;em&gt;shipped&lt;/em&gt; results on the first full run, marked clean. The checker had compared words with a substring search, and the stop's inscription says the remains were &lt;em&gt;buRIED&lt;/em&gt;, &lt;em&gt;REmoved&lt;/em&gt; and &lt;em&gt;re-inteRRED&lt;/em&gt;. As far as the checker could tell, "Red" was right there in the facts.&lt;/p&gt;

&lt;p&gt;It now matches whole words, that case is a regression test, and the numbers in the table are from the fixed version.&lt;/p&gt;

&lt;p&gt;It was not the only one. Taking the screenshots for this post, I watched the checker reject &lt;em&gt;"Listen carefully to the faint hum emanating from the St. Columba Radio Mast"&lt;/em&gt; for "describing the place instead of giving you something to do". The full stop in "St." looked like the end of a sentence. Worse, the draft before it, &lt;em&gt;"Ascend the tower of the St. Columba Radio Mast"&lt;/em&gt;, had been rejected only by that same accident, because "ascend" was not on the unsafe list. Both are fixed and both are tests now.&lt;/p&gt;

&lt;p&gt;I found every one of these bugs the same way: by reading the raw output to choose quotes for this post. I now think that is the most underrated debugging technique in AI work.&lt;/p&gt;

&lt;h3&gt;
  
  
  What the checker cannot catch
&lt;/h3&gt;

&lt;p&gt;It catches names, dates, unsafe verbs and the wrong audience. It cannot catch an invented &lt;em&gt;ordinary&lt;/em&gt; object: at a temple whose tags say nothing about lions, Gemma asked for "the most detailed carving of the lion's head", and that shipped. Some sentences that pass are just odd ("Listen carefully to the plaque"). And Gemma has no sense of occasion. At the spot in Delhi where Indira Gandhi was assassinated, its first draft asked a parent and child to "estimate the exact time of the assassination". The date rule rejected it, but by luck, not judgement.&lt;/p&gt;

&lt;p&gt;So the app does not hide any of this. Every stop's &lt;strong&gt;"Why this mission?"&lt;/strong&gt; shows exactly what Gemma was given, links to the OpenStreetMap object, and lists every draft that was rejected and why. If a mission is odd, you can see where it came from.&lt;/p&gt;

&lt;h3&gt;
  
  
  Choosing the model
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemma 3 1B instruction-tuned&lt;/strong&gt;, 4-bit ONNX, through &lt;a href="https://github.com/huggingface/transformers.js" rel="noopener noreferrer"&gt;transformers.js&lt;/a&gt; on WebGPU, falling back to WASM. About 860 MB, cached after the first visit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemma 3 270M&lt;/strong&gt; is about a quarter of the size, and in my tests it mostly repeated the prompt back. Too small for this job.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemma 4 E2B&lt;/strong&gt; is the obvious next step up, but its ONNX build is around 3.2 GB, which is too much to ask of a phone browser for a walking app. I did not ship what I could not run on a phone.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Privacy, by construction
&lt;/h3&gt;

&lt;p&gt;"Start where I am" snaps your position to a roughly 500 m grid before asking Overpass for map data, pads the search radius to cover the snap, and does the real distance filtering on the device. The map server learns which neighbourhood you are in, not which house. The AI learns nothing, because the AI is a file on your phone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;Sidequest is two open things working together, and both halves matter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open data is what makes the stops real.&lt;/strong&gt; Every stop is an OpenStreetMap object that a volunteer mapped, often down to the text on a bench plaque. When a mission is wrong because the map is wrong, the "Why this mission?" link takes you to the exact object, and anyone can fix it. That fix then improves every app that uses OSM, not just mine. A closed maps API gives you a rating and a photo carousel, and if it is wrong, you file feedback and wait.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An open model is what makes the walk private and offline.&lt;/strong&gt; Where you walk, when, and with whom is about as personal as data gets. With Gemma running in the tab, the place facts go into a model on your own device and a sentence comes out. There is no request to an AI service to log, and nothing breaks when the signal does, which in a park is often.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And I could take it apart.&lt;/strong&gt; Every number in the table above came from running the same weights in Node that the browser downloads, against frozen map snapshots, with greedy decoding. Anyone can run &lt;code&gt;npm test&lt;/code&gt; and get the same table. I could compare prompt strategies, swap in a smaller Gemma with one environment variable, and find out exactly where the model needed help. With a hosted model the thing I measured could change next week behind an endpoint, and every stop would cost money forever. Here it costs nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;I built this with Claude Code as a pair programmer. I didn't save the session to DevRelay, so here is the next best thing: the whole evaluation is reproducible.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/VanshajPoonia/sidequest
&lt;span class="nb"&gt;cd &lt;/span&gt;sidequest &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That runs 31 planner and checker checks, then Gemma 3 1B over the 24 stops in all four configurations, and prints the table above along with every failed draft. &lt;code&gt;MODEL=onnx-community/gemma-3-270m-it-ONNX npm test&lt;/code&gt; runs the smaller model for comparison.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best Use of Gemma&lt;/strong&gt;: Gemma 3 1B runs entirely in the browser and writes every mission, constrained to OpenStreetMap facts by a measured prompt, a checker and a retry loop.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>I turned my grandmother's voice notes into a recipe book, and none of it left my laptop</title>
      <dc:creator>Analyse with Vanshaj Poonia</dc:creator>
      <pubDate>Mon, 05 Oct 2026 05:53:49 +0000</pubDate>
      <link>https://dev.to/vanshaj/i-turned-my-grandmothers-voice-notes-into-a-recipe-book-and-none-of-it-left-my-laptop-1eej</link>
      <guid>https://dev.to/vanshaj/i-turned-my-grandmothers-voice-notes-into-a-recipe-book-and-none-of-it-left-my-laptop-1eej</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Nani's Kitchen&lt;/strong&gt; turns a grandparent's rambling voice memos into a printable family recipe book. It runs entirely in a browser tab. No server, no API key, no account, no upload.&lt;/p&gt;

&lt;p&gt;I built it for my friend, my grandmother. She has never written a recipe down in her life. What she does is send four-minute WhatsApp voice notes that open with "okay so today I am going to make" and close with an unrelated story about the coal fire.&lt;/p&gt;

&lt;p&gt;Those memos &lt;em&gt;are&lt;/em&gt; the recipes. They are also the only copy, sitting in a chat backup, one phone replacement away from gone.&lt;/p&gt;

&lt;p&gt;Drop a memo in, get back a recipe card with ingredients, method, and the part I actually care about: a section called &lt;strong&gt;In her words&lt;/strong&gt; that keeps the stories instead of deleting them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;🔗 &lt;a href="https://nanis-kitchen.vercel.app" rel="noopener noreferrer"&gt;nanis-kitchen.vercel.app&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
Mirror: &lt;a href="https://vanshajpoonia.github.io/nanis-kitchen/" rel="noopener noreferrer"&gt;vanshajpoonia.github.io/nanis-kitchen&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No sign-up. Load a model, then press &lt;strong&gt;Use the sample memo&lt;/strong&gt; if you have no microphone handy - it drops in a real spoken aloo paratha transcript so you can see the structuring without recording anything.&lt;/p&gt;

&lt;p&gt;Watch for the little ▶ buttons on each line. Whisper returns timestamps, so every ingredient and every step replays the exact second she said it. The transcript is a convenience; her voice is the source of truth, and I did not want the app to quietly swap one for the other.&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&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/VanshajPoonia" rel="noopener noreferrer"&gt;
        VanshajPoonia
      &lt;/a&gt; / &lt;a href="https://github.com/VanshajPoonia/nanis-kitchen" rel="noopener noreferrer"&gt;
        nanis-kitchen
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Turn a grandparent's voice memos into a printable family recipe book. Whisper runs in your browser tab; the audio never leaves your laptop.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Nani's Kitchen 🍲&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Turn a grandparent's voice memos into a printable family recipe book. Entirely on your own laptop.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;My grandmother does not write recipes down. She has never written one down. What she does is send
four-minute WhatsApp voice notes that start with "okay so today I am going to make" and end with an
unrelated story about the coal fire. Those memos are the recipes. They are also the only copy.&lt;/p&gt;
&lt;p&gt;Nani's Kitchen takes those memos, transcribes them with &lt;strong&gt;Whisper running inside the browser tab&lt;/strong&gt;
pulls out ingredients, method and the stories, and builds a recipe book you can print and hand over.&lt;/p&gt;
&lt;p&gt;No server. No API key. No account. The audio never leaves the machine.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why it had to be open&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;This is the part that is not a technicality.&lt;/p&gt;
&lt;p&gt;Uploading a recording of your grandmother to somebody's inference API is a thing you only do…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/VanshajPoonia/nanis-kitchen" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;MIT. Static files, no build step, no runtime dependencies.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Whisper&lt;/strong&gt; — open weights from OpenAI, Apache-2.0 — running in the tab through &lt;a href="https://github.com/huggingface/transformers.js" rel="noopener noreferrer"&gt;transformers.js&lt;/a&gt;. WebGPU where the browser has it, CPU/WASM everywhere else, picked at runtime.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
  A[Voice memo&amp;lt;br/&amp;gt;.m4a / mic] --&amp;gt; B[AudioContext&amp;lt;br/&amp;gt;decode + resample 16 kHz]
  B --&amp;gt; C[Whisper&amp;lt;br/&amp;gt;transformers.js&amp;lt;br/&amp;gt;WebGPU / WASM]
  C --&amp;gt; D[Transcript&amp;lt;br/&amp;gt;+ timestamps]
  D --&amp;gt; E{Structurer}
  E --&amp;gt;|offline, instant| F[Rule parser]
  E --&amp;gt;|optional| G[Ollama&amp;lt;br/&amp;gt;any open-weight LLM]
  F --&amp;gt; H[Recipe card]
  G --&amp;gt; H
  H --&amp;gt; I[(localStorage)]
  I --&amp;gt; J[Markdown / printable book]&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;The interesting file is not the ASR, it is &lt;code&gt;src/recipe.js&lt;/code&gt;. &lt;strong&gt;Spoken recipes and written recipes are different languages&lt;/strong&gt;, and every recipe parser I could find assumes the written one. Nobody says "250 g all-purpose flour". They say "about two cups of maida, maybe a bit more if the dough feels dry". So the parser had to learn a few things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vague stays vague.&lt;/strong&gt; "A pinch", "plenty of ghee, do not be shy with it". Converting those to numbers would be inventing data and would make the book worse.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bare counts are ingredients.&lt;/strong&gt; "Also four potatoes, medium size, boiled" has no unit anywhere in it, but it is obviously a shopping line, not an instruction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Descriptors belong to the line above.&lt;/strong&gt; That same sentence must not become three ingredients called &lt;em&gt;four potatoes&lt;/em&gt;, &lt;em&gt;medium size&lt;/em&gt; and &lt;em&gt;boiled&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"And then" is a sentence boundary.&lt;/strong&gt; "Knead it and then cover it" is two steps. My first attempt produced a cooking step that was just the word &lt;strong&gt;"And"&lt;/strong&gt;, which is how I learned to stop re-scanning a string I had already matched.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memories are not instructions, and must not be deleted.&lt;/strong&gt; "When I was a girl we had no gas, only the coal fire" is the reason you want the book at all.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are 16 checks in &lt;code&gt;tests/run.mjs&lt;/code&gt; covering exactly those cases. They run offline in milliseconds, because the parser is pure functions with no model in it.&lt;/p&gt;

&lt;p&gt;There is also an optional path: if &lt;strong&gt;Ollama&lt;/strong&gt; is running, the app finds it, lists whatever open-weight models you have pulled, and uses one instead of the rule parser. Swap &lt;code&gt;llama3.2&lt;/code&gt; for &lt;code&gt;gpt-oss&lt;/code&gt; for &lt;code&gt;qwen2.5&lt;/code&gt; and nothing else changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;Three answers, in increasing order of how much I actually believe them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The easy one: cost.&lt;/strong&gt; Transcribing a few hundred old memos through a hosted ASR API is a real bill for something that should be a weekend favour for your family. Here it is zero, permanently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The better one: it works on the machine it needs to work on.&lt;/strong&gt; This is going to live on an old laptop in my parents' house, offline half the time. &lt;code&gt;whisper-tiny.en&lt;/code&gt; is 40 MB and runs instantly on hardware like that; &lt;code&gt;whisper-small.en&lt;/code&gt; is six times bigger and much better at accented English. The right trade-off differs per machine, so it is a dropdown rather than a decision I made for everyone. A closed API gives you whichever model the vendor is serving this quarter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The one that actually drove the build: uploading a recording of your grandmother is a thing you do exactly once without thinking about it.&lt;/strong&gt; That audio is her voice, her house, her health, whatever else was audible in the room, and often a language a cloud vendor charges a premium for. With a closed API, "it's private" is a sentence in a terms-of-service document that can be revised. With open weights running in &lt;code&gt;AudioContext&lt;/code&gt; and WASM, it is a property of where the code runs — and you can confirm it by opening the Network tab and finding no request to inspect, because there is no request.&lt;/p&gt;

&lt;p&gt;Open innovation did not make this &lt;em&gt;cheaper&lt;/em&gt; than the closed version. It made a promise checkable that would otherwise have stayed a promise.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;No DevRelay session on this one, so here is the trail instead: the &lt;a href="https://github.com/VanshajPoonia/nanis-kitchen/commits/main" rel="noopener noreferrer"&gt;commit history&lt;/a&gt; and the test suite.&lt;/p&gt;

&lt;p&gt;The parser was not designed up front, it was argued with. Every rule above exists because a test failed first, and &lt;code&gt;tests/run.mjs&lt;/code&gt; reads as a changelog of everything I got wrong about how people talk about food:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/VanshajPoonia/nanis-kitchen
&lt;span class="nb"&gt;cd &lt;/span&gt;nanis-kitchen &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;16 checks, no model, no network. The one I am fondest of is &lt;code&gt;no step is a lone conjunction&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Empowering Artisans in the Digital Marketplace</title>
      <dc:creator>Analyse with Vanshaj Poonia</dc:creator>
      <pubDate>Thu, 07 Dec 2023 10:38:57 +0000</pubDate>
      <link>https://dev.to/vanshaj/empowering-artisans-in-the-digital-marketplace-om1</link>
      <guid>https://dev.to/vanshaj/empowering-artisans-in-the-digital-marketplace-om1</guid>
      <description>&lt;p&gt;Etsy, founded in 2005 by Robert Kalin, Chris Maguire, and Haim Schoppik, has emerged as a global e-commerce platform specializing in handmade, vintage, and unique goods. It has redefined the landscape of online marketplaces by providing a space for independent artisans and crafters to showcase and sell their creations. With a commitment to sustainability and community, Etsy has grown into a unique online marketplace that fosters creativity and empowers small businesses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Background and History:&lt;/strong&gt;&lt;br&gt;
Etsy's inception stemmed from the founders' desire to create a platform that connected craftspeople directly with consumers. The initial focus was on handmade goods, but the marketplace evolved to include vintage items and craft supplies. Over the years, Etsy has expanded its reach globally, connecting millions of sellers with a diverse customer base.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Business Model:&lt;/strong&gt;&lt;br&gt;
Etsy operates on a commission-based business model, charging sellers a nominal fee for listing items and a percentage of each sale. This model incentivizes the platform to support its sellers, as Etsy's success is directly tied to the success of its community. The platform also generates revenue through optional seller services such as advertising and payment processing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unique Selling Proposition (USP):&lt;/strong&gt;&lt;br&gt;
Etsy's USP lies in its commitment to fostering a sense of community and supporting small businesses. Unlike conventional e-commerce giants, Etsy focuses on niche markets, providing a platform where buyers can find distinctive, handmade, and personalized items. This emphasis on uniqueness and craftsmanship has helped Etsy carve out a distinct identity in the competitive e-commerce space.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Technology and Innovation:&lt;/strong&gt;&lt;br&gt;
Etsy has continually invested in technology to enhance the user experience for both buyers and sellers. The platform leverages machine learning algorithms to improve search and recommendation features, helping users discover relevant products. Additionally, Etsy has embraced mobile commerce, ensuring that users can access the platform seamlessly through mobile apps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Community Building and Support:&lt;/strong&gt;&lt;br&gt;
One of Etsy's standout features is its emphasis on community building. The platform facilitates communication between buyers and sellers, enabling direct interaction and personalized customer service. Etsy also organizes events and forums, both online and offline, to connect sellers and share knowledge. This sense of community fosters trust and loyalty among users.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Challenges and Controversies:&lt;/strong&gt;&lt;br&gt;
While Etsy has experienced tremendous success, it hasn't been immune to challenges and controversies. Issues such as counterfeit goods, copyright infringement, and concerns about the platform losing its handmade focus have arisen. Etsy has responded by implementing stricter guidelines, deploying advanced algorithms to detect policy violations, and refining its policies to maintain the integrity of the marketplace.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sustainability and Ethical Practices:&lt;/strong&gt;&lt;br&gt;
Etsy places a strong emphasis on sustainability and ethical practices. The company has committed to offsetting carbon emissions from its shipping activities and has implemented initiatives to reduce its overall environmental impact. This commitment to sustainability aligns with the values of many artisans and resonates with environmentally conscious consumers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Global Impact and Expansion:&lt;/strong&gt;&lt;br&gt;
Etsy's impact extends beyond its platform, influencing the broader creative economy. By providing a global stage for artisans, Etsy has contributed to the economic empowerment of individuals worldwide. The platform's expansion into international markets has facilitated cross-cultural exchange and enabled small businesses from various regions to connect with a diverse customer base.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Financial Performance:&lt;/strong&gt;&lt;br&gt;
Etsy's financial performance has reflected its success in the e-commerce sector. The company's revenue has seen consistent growth, driven by an increase in active buyers and sellers. Strategic acquisitions, such as the purchase of Reverb, a musical instrument marketplace, have further diversified Etsy's portfolio and contributed to its financial resilience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Future Outlook:&lt;/strong&gt;&lt;br&gt;
As Etsy continues to evolve, it faces challenges and opportunities in an ever-changing e-commerce landscape. The platform's future success depends on its ability to balance growth with maintaining its commitment to handmade and unique goods. Innovations in technology, sustainability practices, and community engagement will likely play pivotal roles in shaping Etsy's trajectory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion:&lt;/strong&gt;&lt;br&gt;
Etsy's journey from a small online marketplace to a global e-commerce giant exemplifies the power of connecting artisans with consumers. The platform's unique focus on handmade, vintage, and personalized items has created a niche that resonates with a growing segment of conscientious consumers. Etsy's commitment to community, sustainability, and innovation positions it as a key player in the digital marketplace, with the potential to continue empowering independent creatives around the world.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Oracle Corporation - A Case Study on Success Factors</title>
      <dc:creator>Analyse with Vanshaj Poonia</dc:creator>
      <pubDate>Mon, 20 Nov 2023 09:49:44 +0000</pubDate>
      <link>https://dev.to/vanshaj/oracle-corporation-a-case-study-on-success-factors-20h5</link>
      <guid>https://dev.to/vanshaj/oracle-corporation-a-case-study-on-success-factors-20h5</guid>
      <description>&lt;p&gt;Oracle Corporation, founded in 1977 by Larry Ellison, Bob Miner, and Ed Oates, has emerged as one of the world's leading technology companies, specializing in database management systems, cloud solutions, and enterprise software. This case study delves into the key factors that have contributed to Oracle's remarkable success.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Innovation and Technology Leadership:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr8czu2a5iuotfvd7cvat.jpg" 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%2Fr8czu2a5iuotfvd7cvat.jpg" alt="Innovation" width="600" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Oracle has consistently been at the forefront of technological innovation. The company's early success can be attributed to the development of the Oracle Database, which revolutionized the field of relational databases.&lt;/li&gt;
&lt;li&gt;Continuous investment in research and development (R&amp;amp;D) has allowed Oracle to stay ahead of the curve. The company's commitment to cutting-edge technologies, such as artificial intelligence, blockchain, and cloud computing, has helped it maintain a competitive edge.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Comprehensive Product Portfolio:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Oracle offers a diverse range of products and services, catering to various business needs. The company's comprehensive product portfolio includes database management systems, cloud infrastructure, enterprise applications, and business analytics solutions.&lt;/li&gt;
&lt;li&gt;The breadth and depth of Oracle's offerings make it a one-stop solution for businesses, allowing them to integrate various software and hardware components seamlessly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Strategic Acquisitions:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq1hddeti8b4tslqr65ni.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%2Fq1hddeti8b4tslqr65ni.png" alt="Acquisition and Partnership" width="560" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Oracle has strategically pursued acquisitions to expand its product and service offerings. Notable acquisitions include Sun Microsystems, PeopleSoft, BEA Systems, and NetSuite.&lt;/li&gt;
&lt;li&gt;These acquisitions have not only broadened Oracle's product portfolio but also allowed the company to integrate new technologies and talent, strengthening its overall position in the market.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Global Presence and Customer Base:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmerffr8e4zcvg18lpcxt.jpg" 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%2Fmerffr8e4zcvg18lpcxt.jpg" alt="Customer base" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Oracle operates on a global scale, serving customers in virtually every industry. The company's expansive international presence has allowed it to tap into diverse markets and cater to the needs of a wide range of businesses.&lt;/li&gt;
&lt;li&gt;Building and maintaining strong relationships with a large and loyal customer base has been a key factor in Oracle's success. The company's commitment to customer satisfaction and support has fostered long-term partnerships.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Adaptability and Cloud Transition:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fslqp04ttfvr8gkfw45ge.jpg" 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%2Fslqp04ttfvr8gkfw45ge.jpg" alt="Cloud Technology" width="551" height="313"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Recognizing the industry shift towards cloud computing, Oracle has successfully transitioned its business model to focus on cloud services. The Oracle Cloud Infrastructure (OCI) offers a scalable and secure cloud platform for businesses.&lt;/li&gt;
&lt;li&gt;The adaptability to market trends and the successful execution of cloud initiatives have positioned Oracle as a major player in the cloud computing space.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Strong Leadership and Corporate Culture:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkc3porvtdf018820e22v.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%2Fkc3porvtdf018820e22v.png" alt="Leadership" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Larry Ellison, Oracle's co-founder and long-time leader, has played a pivotal role in the company's success. His visionary leadership and strategic decision-making have shaped Oracle's trajectory.&lt;/li&gt;
&lt;li&gt;Oracle's corporate culture emphasizes innovation, collaboration, and a commitment to excellence. The company fosters an environment that encourages employees to think creatively and stay at the forefront of technology.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Focus on Security and Compliance:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foqba9bycvyyuxfrertzb.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%2Foqba9bycvyyuxfrertzb.png" alt="Secure systems" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Given the critical nature of the data managed by Oracle's products, the company places a strong emphasis on security and compliance. Oracle databases are known for their robust security features, addressing the growing concerns around data protection.&lt;/li&gt;
&lt;li&gt;Adhering to industry regulations and proactively addressing security challenges has enhanced Oracle's reputation as a trusted provider of enterprise solutions.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Summary:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Oracle Corporation's success can be attributed to a combination of innovation, strategic acquisitions, a comprehensive product portfolio, global reach, adaptability to market trends, strong leadership, and a customer-centric approach. By staying at the forefront of technology and continuously evolving its offerings, Oracle has maintained its position as a leader in the highly competitive tech industry.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>oracle</category>
      <category>casestudy</category>
      <category>business</category>
    </item>
  </channel>
</rss>
