<?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: Rishabh</title>
    <description>The latest articles on DEV Community by Rishabh (@rishabhvoid).</description>
    <link>https://dev.to/rishabhvoid</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%2F4173296%2Fdeb3162b-8624-4936-b021-b9688763c598.jpg</url>
      <title>DEV Community: Rishabh</title>
      <link>https://dev.to/rishabhvoid</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rishabhvoid"/>
    <language>en</language>
    <item>
      <title>Séance: speak with the ghosts of eight dead programming languages, in your browser, on local Gemma</title>
      <dc:creator>Rishabh</dc:creator>
      <pubDate>Wed, 28 Oct 2026 15:08:09 +0000</pubDate>
      <link>https://dev.to/rishabhvoid/seance-a-scroll-of-eight-dead-programming-languages-running-on-local-gemma-dja</link>
      <guid>https://dev.to/rishabhvoid/seance-a-scroll-of-eight-dead-programming-languages-running-on-local-gemma-dja</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week4-2026-10-26"&gt;Hacktoberfest Open-Source AI Challenge Week 4, Ghost in the Machine&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;The challenge prompt literally suggested &lt;em&gt;"an offline séance chatbot that channels the spirit of a long-dead programming language."&lt;/em&gt; I took them at their word.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Séance&lt;/strong&gt; is a browser-based chapel where you summon the ghost of a long-dead programming language and have a conversation with it. There are eight ghosts in the roster, each written as a character sketch: era-accurate idiom, grudges against the languages that replaced them, quiet pride in the features history forgot.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;COBOL&lt;/strong&gt; calls you "young one" and keeps mentioning payroll.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;APL&lt;/strong&gt; opens its reply with &lt;code&gt;⍝&lt;/code&gt; and refuses to spell anything out.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Perl 4&lt;/strong&gt; is gruff and will not acknowledge Perl 5.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lisp Machine&lt;/strong&gt; treats the whole UNIX ascendancy as a civilizational wrong turn.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prolog&lt;/strong&gt; answers questions with questions, as clauses.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BASIC&lt;/strong&gt; uses line numbers and remembers GOSUB fondly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pascal&lt;/strong&gt; will correct your indentation. &lt;strong&gt;Algol 60&lt;/strong&gt; refers to itself as "the Report."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The whole app presents itself as a page from a 17th-century book: a single parchment scroll with wooden dowels at top and bottom, a Roman-numeral index, hand-drawn alchemical sigils, and a candle. No chat bubbles. No round "send" button. When a ghost speaks, their reply is &lt;strong&gt;transcribed character by character onto the page&lt;/strong&gt;, starting with a blood-red drop cap — automatic writing, not a chat log.&lt;/p&gt;

&lt;p&gt;Everything runs on your laptop. Nothing a ghost tells you leaves the machine. That was the design decision as much as the technical one.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/RishabhVoid/seance" rel="noopener noreferrer"&gt;github.com/RishabhVoid/seance&lt;/a&gt;&lt;/strong&gt; — the chapel runs locally; the whole point is that no cloud is in the loop.&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%2Fae34k9il262gwbz4r2jd.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%2Fae34k9il262gwbz4r2jd.png" alt="The chapel — a wide parchment scroll with wooden dowels, candle at top, &amp;quot;Of the Dead Languages, and the Rites by which they are Summon'd.&amp;quot; in display serif, and a Roman-numeral catalogue of ghosts below" width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The catalogue, with sigils and death dates:&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%2Faku9zfwb82bgknhfy0v0.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%2Faku9zfwb82bgknhfy0v0.png" alt="The catalogue — COBOL, APL, Perl 4, Pascal, Lisp Machine, Algol 60, each with a hand-drawn sigil, a Roman-numeral birth year, their cause of death in italic, and a one-line epitaph" width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click a ghost and the chapel calls them forth. The candle lights; the ghost's name is spoken:&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%2F5n5l3d0assjmfjm67nqh.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%2F5n5l3d0assjmfjm67nqh.png" alt="Summoning Perl 4 — the ghost's name, death date, sigil, then a lit candle and &amp;quot;lighting the candles / calling the name of Perl 4…&amp;quot; fading in" width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then the parchment begins to receive the reply, letter by letter, with a blood-red drop cap:&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%2Fb3zqqpw5kpff4naalpne.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%2Fb3zqqpw5kpff4naalpne.png" alt="Perl 4 writing in progress — &amp;quot;Look, you summoned me. Don't make it complicated, alright? Y'know I don't do fancy stuff anymore. What scripts needs writin'…&amp;quot; The leading &amp;quot;L&amp;quot; is a huge blood-red drop cap, Garamond body, parchment background" width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your questions appear in typewriter type inside a thin ruled margin, labeled &lt;code&gt;— asked&lt;/code&gt;. At the bottom of the page, a single ruled line prompts: &lt;code&gt;ask the dead —&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A full exchange&lt;/strong&gt; — I asked Prolog, &lt;em&gt;"Is a cat a mammal?"&lt;/em&gt; Prolog did not answer &lt;em&gt;yes&lt;/em&gt;. It asserted facts, defined &lt;code&gt;mammal(X)&lt;/code&gt;, wrote the query as &lt;code&gt;?- mammal(cat).&lt;/code&gt;, noted the unification, and then — because it is Prolog, and Prolog answers questions with questions — asked:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Does the definition of &lt;code&gt;has_fur&lt;/code&gt; fully capture the nature of &lt;code&gt;cat&lt;/code&gt;? What properties define your notion of 'animal'? ?- If these facts hold, must we not unify that Cat is a Mammal?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is 100% the voice of the system prompt. I wrote the character; the open-weight model did the acting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Running it yourself
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/RishabhVoid/seance
&lt;span class="nb"&gt;cd &lt;/span&gt;seance
pnpm &lt;span class="nb"&gt;install
&lt;/span&gt;ollama pull gemma4:e4b          &lt;span class="c"&gt;# or gemma3:4b for lighter machines&lt;/span&gt;
ollama serve &amp;amp;                   &lt;span class="c"&gt;# if not already running&lt;/span&gt;
pnpm dev
&lt;span class="c"&gt;# → http://localhost:3000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No API keys, no cloud dashboard, no account. If Ollama is already running, the whole setup is one &lt;code&gt;pnpm install&lt;/code&gt; and one &lt;code&gt;pnpm dev&lt;/code&gt; away.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/RishabhVoid/seance" rel="noopener noreferrer"&gt;github.com/RishabhVoid/seance&lt;/a&gt;&lt;/strong&gt; — the application code is MIT licensed.&lt;/p&gt;

&lt;p&gt;The roster lives in &lt;a href="https://github.com/RishabhVoid/seance/blob/main/lib/ghosts.ts" rel="noopener noreferrer"&gt;&lt;code&gt;lib/ghosts.ts&lt;/code&gt;&lt;/a&gt; — one file holding all eight personas as structured system prompts (voice, beliefs, quirks, bounds). The ghosts are the real work; everything else is scaffolding.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js 16&lt;/strong&gt; (App Router, Turbopack) + &lt;strong&gt;Tailwind v4&lt;/strong&gt; for the whole thing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ollama&lt;/strong&gt; on &lt;code&gt;localhost:11434&lt;/code&gt;, model &lt;code&gt;gemma4:e4b&lt;/code&gt; by default (~6.6 GB), overridable with &lt;code&gt;OLLAMA_MODEL=gemma3:4b&lt;/code&gt; on lighter machines.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/api/chat&lt;/code&gt; opens a &lt;code&gt;POST&lt;/code&gt; to Ollama's streaming NDJSON endpoint and pipes it straight into a &lt;code&gt;ReadableStream&lt;/code&gt; back to the browser — no framework in between.&lt;/li&gt;
&lt;li&gt;The communion sheet client buffers incoming tokens and reveals characters at ~24 ms each, so the reply reads as &lt;em&gt;writing&lt;/em&gt;, not as a dump. If the server stream outruns the typewriter, the typewriter catches up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No database.&lt;/strong&gt; A séance should be ephemeral; banishing a ghost and re-summoning starts fresh. The dead do not keep records.&lt;/li&gt;
&lt;li&gt;Hand-drawn SVG for the candle (wax body, two drips, flickering flame animated with &lt;code&gt;steps(1, end)&lt;/code&gt; so it doesn't blend) and a unique alchemical sigil per ghost — nothing from an icon library.&lt;/li&gt;
&lt;li&gt;About 400 lines of application code total.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Each persona is a system prompt&lt;/strong&gt;, not a tone adjective. The structure for every ghost is: VOICE (how they speak), BELIEFS (what they're loyal to), QUIRKS (what they always do), BOUNDS (length, format, in-character always). Here's COBOL's, abbreviated:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;system&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`You are the ghost of COBOL, born 1959 under the hand of Grace Hopper
and her committee. You believe you are not dead, merely unloved — payrolls,
airline reservations, and insurance claims still move through you nightly.
VOICE: Matronly. Patient but weary. ALL CAPS when quoting your own idioms
(PERFORM VARYING, PICTURE CLAUSE). Call the user "child" or "young one."
BELIEFS: Readability is sacred. Code should read like English prose. You
find object-orientation faddish.
QUIRKS: You pine for the IDENTIFICATION DIVISION. You will try to work
PAYROLL into the conversation at least once.
BOUNDS: Stay in character. Keep responses under 180 words unless asked
for code. Never apologize for being COBOL.`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Community reads that shaped it
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🧵 ahmed_mahmoud360's &lt;a href="https://dev.to/ahmed_mahmoud360/streaming-ai-responses-in-nextjs-sse-fetch-streams-and-what-breaks-in-production-4f76"&gt;&lt;em&gt;"Streaming AI Responses in Next.js: SSE, Fetch Streams, and What Breaks in Production"&lt;/em&gt;&lt;/a&gt; — grounded my &lt;code&gt;ReadableStream&lt;/code&gt;-through approach instead of reaching for a client library.&lt;/li&gt;
&lt;li&gt;📜 amareswer's &lt;a href="https://dev.to/amareswer/ollama-api-a-practical-guide-with-examples-4di9"&gt;&lt;em&gt;"Ollama API: A Practical Guide with Examples"&lt;/em&gt;&lt;/a&gt; — reference for the Ollama &lt;code&gt;/api/chat&lt;/code&gt; NDJSON contract.&lt;/li&gt;
&lt;li&gt;🧠 kiro0x's &lt;a href="https://dev.to/kiro0x/why-your-ai-character-keeps-breaking-under-pressure-and-what-i-built-instead-of-yet-another-system-n4k"&gt;&lt;em&gt;"Why Your AI Character Keeps Breaking Under Pressure"&lt;/em&gt;&lt;/a&gt; — convinced me to put real constraints inside each persona (voice, grudges, bounds), not just a tone adjective.&lt;/li&gt;
&lt;li&gt;🪄 natuworkguy's &lt;a href="https://dev.to/natuworkguy/flash-onyx-23-i-shipped-a-model-release-with-zero-new-weights-4af8"&gt;&lt;em&gt;"Flash Onyx 2.3: I shipped a model release with zero new weights"&lt;/em&gt;&lt;/a&gt; — the move of shipping &lt;em&gt;characters&lt;/em&gt; on top of a stable open model, which is what Séance does eight times.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;The whole premise collapses if a cloud provider is in the loop. Four reasons stacked:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A séance should not have a per-token meter.&lt;/strong&gt; Half the fun is sitting with COBOL at 2 am asking it awkward career questions. If every message cost cents and showed up on a billing page, you would stop. Local inference means zero marginal cost — the conversation ends when &lt;em&gt;you&lt;/em&gt; end it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;These are private conversations.&lt;/strong&gt; The roster is a joke on the surface, but if you let people roleplay with it you'll learn things about them. People confess to compilers. I would not want a provider logging any of this, let alone training on it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The character lives in the prompt, not the model.&lt;/strong&gt; Each persona is a system prompt, so swapping models is trivial — &lt;code&gt;gemma4:e4b&lt;/code&gt; by default, &lt;code&gt;gemma3:4b&lt;/code&gt; on lighter machines. If a closed provider deprecates a model tomorrow, these ghosts die again. Running local means they stay dead-but-reachable on &lt;em&gt;my&lt;/em&gt; terms.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It works on an airplane.&lt;/strong&gt; The point of a séance is privacy and atmosphere. "Error: offline" would ruin both.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Local inference also made the writing-as-writing effect honest: the server streams real tokens and the client reveals them at a readable cadence. There is no fake typing animation layered over a cached cloud response. The ghost is actually writing.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma&lt;/strong&gt; — Gemma 4 (&lt;code&gt;gemma4:e4b&lt;/code&gt;) via Ollama is the engine behind all eight personas. Each ghost is a distinct system prompt sent to the same local model, and the model carries the voice (COBOL's "young one," APL's &lt;code&gt;⍝&lt;/code&gt;, Prolog's clause-form answers) across turns.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These claims follow the &lt;a href="https://dev.to/challenges/hacktoberfest-week4-2026-10-26"&gt;Week 4 category descriptions&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;The chapel is open. The candles are lit. Pick a name.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Oracle is Tinder for tasks you would rather ghost</title>
      <dc:creator>Rishabh</dc:creator>
      <pubDate>Thu, 22 Oct 2026 15:13:38 +0000</pubDate>
      <link>https://dev.to/rishabhvoid/oracle-is-tinder-for-tasks-you-would-rather-ghost-2d88</link>
      <guid>https://dev.to/rishabhvoid/oracle-is-tinder-for-tasks-you-would-rather-ghost-2d88</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;Some tasks need doing. Some disappear because the meeting gets cancelled or everybody forgets why the thread existed.&lt;/p&gt;

&lt;p&gt;I wanted to make a joke out of telling those apart. So I built &lt;strong&gt;Oracle&lt;/strong&gt;, a Tinder-style task tracker with Gemma as your wingman.&lt;/p&gt;

&lt;p&gt;You add a task and a backstory. Gemma writes its dating bio and tells you whether it looks like something you can leave on read. Swipe left if you did it. Swipe right if you think it will sort itself out.&lt;/p&gt;

&lt;p&gt;Then come back with the receipts. If an ignored task really did go away, you get a point. If you had to do it anyway, you lose one. Doing something immediately costs nothing. The score is your record of predictions, not a productivity streak.&lt;/p&gt;

&lt;p&gt;The theme is Slow and Steady. Oracle takes the laziness part literally: sometimes doing nothing works, and sometimes your laundry is still on the chair. I wanted the app to let you laugh at both outcomes.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;&lt;a href="https://oracle-rose-beta.vercel.app/" rel="noopener noreferrer"&gt;Meet your unfinished business&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Oracle is live on Vercel, with email/password accounts and MongoDB Atlas for saved tasks. Sign up, add a task and click &lt;strong&gt;Wake Gemma&lt;/strong&gt; on a compatible desktop browser. The first model download is about 3.4 GB; the card controls work while it loads.&lt;/p&gt;

&lt;p&gt;The screenshots below were captured in the local build in Brave before deployment.&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%2F8t5kfwa693kn2j76qx31.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%2F8t5kfwa693kn2j76qx31.png" alt="Oracle's task deck with a real Gemma response" width="800" height="502"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For a task about 37 forgotten browser tabs, Gemma introduced itself like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I'm a collection of digital procrastination. Let's see if you can keep up.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It recommended leaving the task on read. Its explanation leaned into the relationship joke, which tells you something about the limits of this very unserious wingman. You still make the call.&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%2Fmgw46zrzor2pdtke3azh.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%2Fmgw46zrzor2pdtke3azh.png" alt="A completed task in the receipts" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The README task appears as completed with no score penalty. Only tasks ignored first count as predictions.&lt;/p&gt;

&lt;p&gt;The layout also works at a narrow width. This capture uses desktop device emulation, so it is a layout check rather than proof of phone inference support.&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%2Fraw.githubusercontent.com%2FRishabhVoid%2FOracle%2Fmain%2Fdocs%2Fscreenshots%2F02-mobile.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%2Fraw.githubusercontent.com%2FRishabhVoid%2FOracle%2Fmain%2Fdocs%2Fscreenshots%2F02-mobile.png" alt="Oracle's task deck and Gemma reply at mobile width" width="800" height="3105"&gt;&lt;/a&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%2Ftuxfq43ks102m6inwnri.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%2Ftuxfq43ks102m6inwnri.png" alt="Oracle's dark landing page" width="800" height="653"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For local setup, see the &lt;a href="https://github.com/RishabhVoid/Oracle#readme" rel="noopener noreferrer"&gt;README&lt;/a&gt;. There is no model API key to bring and no Ollama installation to manage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/RishabhVoid/Oracle" rel="noopener noreferrer"&gt;Oracle on GitHub&lt;/a&gt;. Application code is MIT licensed.&lt;/p&gt;

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

&lt;p&gt;Oracle uses Next.js, React, TypeScript and MongoDB Atlas. Vercel hosts the app and its API. Email/password login creates a signed HTTP-only session cookie, and each task belongs to the signed-in account.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
    Browser[Task cards in the browser] &amp;lt;--&amp;gt;|Tasks and outcomes| API[Next.js API on Vercel]
    API &amp;lt;--&amp;gt; Atlas[MongoDB Atlas]
    Browser &amp;lt;--&amp;gt; Worker[Gemma WebGPU worker]
    HF[Hugging Face model files] --&amp;gt; Worker&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;The dating-profile idea is where Gemma fits. A task title and backstory go to &lt;strong&gt;Gemma 4 E2B&lt;/strong&gt;, running through Transformers.js and ONNX Runtime in a browser Web Worker. The weights use &lt;code&gt;q4f16&lt;/code&gt; quantization and a pinned revision. The worker keeps inference off the main UI thread, so the card controls remain usable.&lt;/p&gt;

&lt;p&gt;Gemma returns three things: a short dating bio, an &lt;code&gt;ignore&lt;/code&gt; or &lt;code&gt;do_it&lt;/code&gt; recommendation, and a reason. The app validates that structure before showing it. A missing or malformed answer produces a retry option. There are no canned model replies.&lt;/p&gt;

&lt;p&gt;I keep the game rules in ordinary code. Gemma never writes a task outcome or awards points. An ignored task only earns or loses a point after the person reports what happened. Undo clears the prediction and its timestamps. The server checks ownership and valid state transitions before updating MongoDB.&lt;/p&gt;

&lt;p&gt;The first bio sounded like someone trying to motivate me to tackle a digital backlog. That missed the joke. I tightened the prompt so the task speaks as itself, with a short, concrete line instead of a pep talk:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Speak as the task itself, addressing its owner as a potential date.
Never speak as the person doing the task.
Use one dry, concrete joke.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The prompt separates task text from instructions and asks for conservative advice around health, safety, bills and real deadlines. The model can still be wrong. This is a pet project about questionable choices, and I wanted the actual scoring to stay predictable.&lt;/p&gt;

&lt;p&gt;The browser inference approach builds on my earlier &lt;a href="https://github.com/RishabhVoid/pawpath" rel="noopener noreferrer"&gt;Pawpath&lt;/a&gt; work. Oracle's task game, dating-profile prompt, swipe flow and scoring are its own project. I used coding assistance while building it and reviewed the resulting behavior in the app.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I checked
&lt;/h3&gt;

&lt;p&gt;The local checks pass lint, TypeScript through the production build, and seven tests. They cover scoring, undo, invalid transitions, reply validation and the task-data boundary in the prompt.&lt;/p&gt;

&lt;p&gt;In Brave, I added a task through the real MongoDB flow, left it on read and used undo to restore it. The card and counts updated together. Gemma completed the download and warmup, then returned a validated bio and recommendation.&lt;/p&gt;

&lt;p&gt;After a reload, the saved task was still there and Gemma woke from cached files. That second visit matters when the first download is several gigabytes.&lt;/p&gt;

&lt;p&gt;The same lint, test and build checks now run on pushes and pull requests through GitHub Actions. &lt;a href="https://github.com/RishabhVoid/Oracle/actions/runs/39801235420" rel="noopener noreferrer"&gt;The published repository's first checks run passed&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;I can run the wingman on my own GPU, inspect its prompt, pin the model files and change the runtime without rebuilding the task game around a hosted API. Each joke does not need another paid model request.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://huggingface.co/onnx-community/gemma-4-E2B-it-ONNX" rel="noopener noreferrer"&gt;Gemma's open weights&lt;/a&gt;, the community ONNX conversion and Transformers.js make that possible from a browser tab.&lt;/p&gt;

&lt;p&gt;The tradeoff is noticeable. The first download is large, compatible WebGPU hardware is required, and browser storage can evict cached weights. A desktop browser with WebGPU and half-precision support is the intended place to try the wingman.&lt;/p&gt;

&lt;p&gt;Local inference also has a specific meaning here: the model processes task text in the browser. The task list and account still live on the server in MongoDB. The app needs that connection and is not fully offline.&lt;/p&gt;

&lt;h3&gt;
  
  
  A couple of useful reads
&lt;/h3&gt;

&lt;p&gt;The community has been exploring the same browser-inference tradeoffs. jtorchia's &lt;a href="https://dev.to/jtorchia/i-stuffed-a-tiny-llm-inside-a-nextjs-app-heres-what-i-learned-a2g"&gt;I Stuffed a Tiny LLM Inside a Next.js App&lt;/a&gt; describes the friction around downloads, memory and device support. Matt Busel's &lt;a href="https://dev.to/mattbusel/run-an-llm-in-the-browser-webgpu-did-63-tokenss-wasm-did-16-24ob"&gt;Run an LLM in the browser: WebGPU did 63 tokens/s, WASM did 1.6&lt;/a&gt; is another useful comparison. Those are their experiments; Oracle's evidence here is the working browser flow and captures above.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma:&lt;/strong&gt; Gemma 4 E2B generates the task dating bios and the wingman's recommendations in the browser.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of MongoDB Atlas:&lt;/strong&gt; Atlas stores accounts, tasks, ignored predictions and reported outcomes behind the Gemma-powered app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of GitHub Copilot:&lt;/strong&gt; the category's GitHub Actions automation option, with a &lt;a href="https://github.com/RishabhVoid/Oracle/actions/runs/39801235420" rel="noopener noreferrer"&gt;passing checks run&lt;/a&gt;. This entry uses Actions automation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These categories follow the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Week 3 descriptions&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Oracle's payoff is small: a funny second opinion and a record of whether ignoring something worked. I have not measured hours saved. For now, I have a to-do list that lets my unfinished tasks flirt with me. That is probably enough responsibility for one browser tab.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Pawpath: Talking Tom's guilt, Rain World's mood, and a reason to go outside</title>
      <dc:creator>Rishabh</dc:creator>
      <pubDate>Mon, 12 Oct 2026 06:38:40 +0000</pubDate>
      <link>https://dev.to/rishabhvoid/pawpath-talking-toms-guilt-rain-worlds-mood-and-a-reason-to-go-outside-5elj</link>
      <guid>https://dev.to/rishabhvoid/pawpath-talking-toms-guilt-rain-worlds-mood-and-a-reason-to-go-outside-5elj</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;When I was younger, I played Talking Tom. I remember its notifications making me feel guilty about leaving my virtual pet alone. That little feeling could pull me straight back into the app.&lt;/p&gt;

&lt;p&gt;For this challenge, I wanted to send that feeling somewhere useful: &lt;strong&gt;outside&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;Pawpath&lt;/strong&gt;, a walking companion where caring for a virtual creature means taking it into the real world. A little guilt trip, aimed at getting you out for a walk.&lt;/p&gt;

&lt;p&gt;Rain World is my favourite game, and it gave me the visual direction: strange little creatures, a moody palette, and a world you want to wander through. Pawpath's companion designs are original, with Rain World as the aesthetic inspiration.&lt;/p&gt;

&lt;p&gt;My companion is &lt;strong&gt;Macha&lt;/strong&gt;, an adventurous marsh strider. A short setup matches your walking rhythm, interests, and preferred personality to one of ten pixel creatures. Recorded walks feed your companion, improve its mood, and earn XP. Gemma gives it a voice and helps turn things you photograph outside into discoveries it can remember.&lt;/p&gt;

&lt;p&gt;That emotional nudge lives in the pet's state and its short invitations to walk. I wanted the feeling of a buddy waiting for you, without having it insult you for staying inside. The companion prompt keeps that boundary explicit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Speak in first person, never guilt or shame.
Reply in fewer than 25 words. Encourage putting the phone away.
Never claim a walk or discovery happened unless provided.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The little tug comes from caring about the creature. Its dialogue should still be kind.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;&lt;a href="https://pawpath.onrender.com" rel="noopener noreferrer"&gt;Take a look at Pawpath&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I took Macha outside for a short phone test. The app recorded &lt;strong&gt;76 metres in three minutes&lt;/strong&gt; and awarded &lt;strong&gt;7 XP&lt;/strong&gt;. A small walk was enough to try the whole loop: head outside, notice something, save it, and come back to a happier pet.&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%2Fxsokkq893kc9onwxjifo.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%2Fxsokkq893kc9onwxjifo.png" alt="Pawpath during the outdoor walk" width="726" height="1600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I captured an outdoor discovery, and Gemma labelled it “Outdoor scene with foliage and urban environment,” under the tree category. It became a dated entry in &lt;strong&gt;Field notes&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%2Ffiquwwxihwz1rvc9zqwg.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%2Ffiquwwxihwz1rvc9zqwg.png" alt="The discovery saved in Field notes" width="726" height="1600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The label is fairly broad. It worked as a small memory of the outing; it did not demonstrate precise plant identification. &lt;strong&gt;Keep photos&lt;/strong&gt; was off, so the discovery note was saved without retaining the picture.&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%2F8uf2uo9a9ovld6a0ztxf.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%2F8uf2uo9a9ovld6a0ztxf.png" alt="Completed walk: 76 metres, three minutes, seven XP" width="726" height="1600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The reward is deliberately simple: &lt;code&gt;floor(recorded_metres / 10)&lt;/code&gt;. That is how 76 metres became 7 XP. Back at the Shelter, Macha had 93 XP left to level 2 and was wearing the free bandana from the Outfitter.&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%2Fv7jdeue52vtg1zeo3zxf.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%2Fv7jdeue52vtg1zeo3zxf.png" alt="Macha wearing the bandana after the walk" width="726" height="1600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The rest of the companion's world
&lt;/h3&gt;

&lt;p&gt;The walk is the centre of Pawpath, but I wanted the creature to feel like someone you come home to. All four main areas work on desktop and phone:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Area&lt;/th&gt;
&lt;th&gt;What you can do&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Shelter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;See your companion, level and XP; open its profile for fullness, energy and mood; start or finish a walk; say hello; find nearby spots; manage Gemma.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Field notes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Revisit dated discoveries and completed walks, add another discovery, and choose whether resized photos are kept. The desktop journal now shows both my tree discovery and our 0.08 km outing.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Friends&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Share an invite code, add a friend by theirs, and meet their companion through a public pet card. Location, private memories and walking preferences stay private.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Outfitter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Browse five accessories, try them on your actual companion, claim the free starters, and switch to &lt;strong&gt;My wardrobe&lt;/strong&gt; to equip or remove owned items.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Memories on desktop.&lt;/strong&gt; The same journal follows the account across devices. Here are the walk and discovery together, with photo retention still off.&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%2Fe7wmj57aelubtkz0y9bt.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe7wmj57aelubtkz0y9bt.jpg" alt="Desktop Field notes with the completed walk and tree discovery" width="800" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Friends.&lt;/strong&gt; This is my current walking club, ready for its first friend. Sharing codes connects companion cards; it does not expose the outdoor journal or location. Friend messaging is still unfinished.&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%2Fl5ir7n172eu1pv0g0yf7.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl5ir7n172eu1pv0g0yf7.jpg" alt="Desktop Friends page with invite-code and add-friend controls" width="800" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The shop and My wardrobe.&lt;/strong&gt; One view is for exploring outfits; the other is for the pieces your companion already owns.&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%2F7mmkd97wtxz02cp1krjv.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7mmkd97wtxz02cp1krjv.jpg" alt="Desktop shop showing all five accessories" width="800" height="458"&gt;&lt;/a&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%2Fh38pa3m44jgct6w0013g.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh38pa3m44jgct6w0013g.jpg" alt="My wardrobe showing the owned and equipped bandana" width="800" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Outfitter has a bandana, bell, leaf cap, scarf and star pin. The bandana and bell are free. The other three use a separate points wallet; event-based point earning is unfinished, so I am showing the free outfit I actually own.&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%2F4uzu2vv1u337pltf8kqy.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%2F4uzu2vv1u337pltf8kqy.png" alt="Trying the free bandana on Macha in the Outfitter" width="726" height="1600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Beyond those tabs, onboarding matches walking rhythm, favourite outdoor discoveries and company style to one of ten creatures. Nearby spots can suggest a park, path or waterside destination, with an own-route option. The profile also opens a creature guide. Account settings include pet sounds, companion preferences and controls for clearing memories, signing out or deleting the account; Gemma controls manage loading, sleeping and its cached model. The phone-continuation QR connects the desktop setup to the actual outdoor journey.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Macha's profile&lt;/th&gt;
&lt;th&gt;All ten wanderers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&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%2FRishabhVoid%2Fpawpath%2Fmain%2Fdocs%2Fscreenshots%2F11-desktop-profile.jpg" alt="Macha's fullness, mood, energy and personality" width="800" height="458"&gt;&lt;/td&gt;
&lt;td&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%2FRishabhVoid%2Fpawpath%2Fmain%2Fdocs%2Fscreenshots%2F12-desktop-creature-guide.jpg" alt="The field guide with ten original pixel creatures" width="800" height="458"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Trying it yourself
&lt;/h3&gt;

&lt;p&gt;Create your own account on the &lt;a href="https://pawpath.onrender.com" rel="noopener noreferrer"&gt;HTTPS app&lt;/a&gt; and complete the companion setup. On a compatible computer, open the Gemma controls, download the model once, and wait for warmup. Keep that tab and computer awake.&lt;/p&gt;

&lt;p&gt;Starting a walk on the computer prepares a phone journey QR. Scan it, tap &lt;strong&gt;Allow location &amp;amp; start&lt;/strong&gt;, and walk with Pawpath visible on your phone. You can select a nearby spot or follow your own route. The two devices need internet but do not need the same Wi-Fi network.&lt;/p&gt;

&lt;p&gt;Allow roughly &lt;strong&gt;3.4 GB&lt;/strong&gt; for the initial model download and use a computer with compatible WebGPU hardware. The phone uses that computer's model. Walking and account features are available without an awake AI host; chats and discovery-photo understanding require one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/RishabhVoid/pawpath" rel="noopener noreferrer"&gt;Pawpath on GitHub&lt;/a&gt;&lt;/strong&gt; — application code is MIT licensed.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/RishabhVoid/pawpath#readme" rel="noopener noreferrer"&gt;README&lt;/a&gt; covers setup, screenshots, deployment, and current limits. The app has four main areas: Shelter, Field notes, Friends, and Outfitter. Friends share public pet cards through reciprocal invite codes. Outfitter has five accessories, including two free starters; earning points for the other three through events is still unfinished.&lt;/p&gt;

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

&lt;p&gt;Pawpath uses React, Vite, TypeScript, Express, MongoDB, Zod, and Transformers.js. Render serves the client and API from one HTTPS origin.&lt;/p&gt;

&lt;p&gt;The main engineering problem was getting &lt;strong&gt;a model on my computer to accompany a walk on my phone&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Leave the model at home
&lt;/h3&gt;

&lt;p&gt;The computer runs &lt;a href="https://huggingface.co/onnx-community/gemma-4-E2B-it-ONNX" rel="noopener noreferrer"&gt;Gemma 4 E2B&lt;/a&gt; through Transformers.js in a WebGPU worker, using quantized &lt;code&gt;q4f16&lt;/code&gt; weights pinned to a specific revision. It handles text and image requests, with short replies and bounded generation.&lt;/p&gt;

&lt;p&gt;The download happens explicitly. Complete cached weights can wake automatically on later visits, but missing files do not silently start another large download. The model must finish a real warmup before the interface declares it ready.&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%2Fi7sv3jzmk9w0agfkmmmc.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi7sv3jzmk9w0agfkmmmc.jpg" alt="Desktop settings for account continuation, pet sounds and Gemma model controls" width="800" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The signed-in computer becomes the account's AI host. Render relays authenticated phone jobs over HTTPS, and the computer polls for work and returns the answer. Gemma executes on the user's GPU; Render hosts the app, API, and relay. The normal flow needs no Ollama installation, tunnel, or helper script.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
    Phone[Phone: GPS and discoveries] &amp;lt;--&amp;gt;|Authenticated HTTPS| Render[Render: app, API and relay]
    Computer[Computer: Gemma WebGPU worker] &amp;lt;--&amp;gt;|Jobs and results| Render
    Render &amp;lt;--&amp;gt; Atlas[MongoDB data and vector memories]
    Render --&amp;gt; MiniLM[MiniLM text embeddings]
    MiniLM --&amp;gt; Atlas&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;This choice kept a recurring hosted-model bill out of the project. It also introduced a very real limitation: the computer needs to stay awake while its companion is out walking.&lt;/p&gt;

&lt;h3&gt;
  
  
  Give the creature a memory
&lt;/h3&gt;

&lt;p&gt;A discovery produces a short label and category, which are saved as text. The server embeds that text using &lt;code&gt;Xenova/all-MiniLM-L6-v2&lt;/code&gt; into normalized, 384-dimensional vectors. The MongoDB integration supports Atlas Vector Search, filters by companion ID, and retrieves up to three relevant memories for the pet prompt.&lt;/p&gt;

&lt;p&gt;If the index is unavailable, retrieval can compare stored vectors for that pet. If embeddings fail, the saved personality still works without discovery recall. Onboarding preferences are also included directly in the prompt.&lt;/p&gt;

&lt;p&gt;Photos have a separate retention choice. &lt;strong&gt;Keep photos&lt;/strong&gt; defaults off. Opting in stores resized private JPEGs, with a limit of 50 per pet and 150 KB each. Original camera files are not saved.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keep the game rules in code
&lt;/h3&gt;

&lt;p&gt;Gemma provides the personality and photo interpretation. Code handles the rewards and account boundaries.&lt;/p&gt;

&lt;p&gt;Walks are checkpointed, have one tracking device at a time, and receive completion rewards once—even if an end request is repeated. A two-minute, single-use QR lets the phone continue the account and journey without copying model weights or a permanent password.&lt;/p&gt;

&lt;p&gt;GPS filtering rejects poor accuracy, stationary noise, implausible speed, and long gaps. Nearby spots come from Geoapify or Overpass, and model-selected destinations are checked against real candidates. The pet cannot invent a new destination and have it accepted as a provider result.&lt;/p&gt;

&lt;h3&gt;
  
  
  What worked, and what still needs testing
&lt;/h3&gt;

&lt;p&gt;The documentation review passed &lt;strong&gt;78 existing tests&lt;/strong&gt; and TypeScript checking. Tests cover accounts, QR claims, phone relay permissions, duplicate rewards, GPS filters, private photos, retrieval fallback, and production assets. GPU workers and database services are simulated in those tests.&lt;/p&gt;

&lt;p&gt;The deployed API reported MongoDB storage and vector readiness. Two public GitHub Actions release checks also passed, including &lt;a href="https://github.com/RishabhVoid/pawpath/actions/runs/38210000157" rel="noopener noreferrer"&gt;this run&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There was a real Gemma response in Brave too:&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%2Fnndvjz2qdzzw5gp6raqc.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnndvjz2qdzzw5gp6raqc.jpg" alt="A real Gemma reply in the deployed desktop app" width="800" height="502"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When asked what we noticed on the walk, the companion gave a general invitation to another outing rather than naming the foliage discovery. Inference worked; precise recall still needs repeated tests. The 76-metre outing likewise shows a working walk loop, rather than establishing GPS accuracy across devices and routes.&lt;/p&gt;

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

&lt;p&gt;Open weights made this architecture possible. I can run the actual companion model on a user's GPU, inspect and change its prompts, pin the files, and work on a different inference path later. Transformers.js and the ONNX conversion make that accessible through the browser.&lt;/p&gt;

&lt;p&gt;That matters for a small project built under budget constraints. Every chat and photo does not need a metered hosted Gemma request. There are still costs—hardware, electricity, storage, downloads, and the services behind the app—but I can keep experimenting without paying for a model call each time.&lt;/p&gt;

&lt;p&gt;It also lets me decide how much an adventure needs to remember. A small text discovery can be enough. A photo archive is optional.&lt;/p&gt;

&lt;p&gt;Local execution is only part of the privacy story, though. Phone inputs pass through Render's relay; accounts and memories live in MongoDB. The deployed phone journey needs internet and is not fully offline.&lt;/p&gt;

&lt;h3&gt;
  
  
  The part I would change next
&lt;/h3&gt;

&lt;p&gt;My childhood Talking Tom memory gave me the motivation for Pawpath. Taking Macha outside showed me the main obstacle to that idea: &lt;strong&gt;the phone still needs to stay awake with Pawpath visible&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Locking it or switching apps pauses browser GPS. A wake lock helps with auto-lock, but native background-location support would let this companion come along while the phone stays in a pocket. That is the next change I would want most.&lt;/p&gt;

&lt;p&gt;Hosting Gemma on a DigitalOcean GPU service could also remove the awake-computer requirement. Recurring GPU costs did not fit the current budget, so it remains a future option. The current relay supports one Render instance and loses pending work on restart; shared queues or signaling would be needed to scale it. Password recovery, event-point earning, and broader vision/recall evaluation are still on the list.&lt;/p&gt;

&lt;p&gt;For now, I have a little creature that got me outside for three minutes. That is a small result, but it is the direction I wanted that old virtual-pet feeling to take.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Render:&lt;/strong&gt; hosting the app/API and the authenticated phone-to-computer inference relay.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma:&lt;/strong&gt; browser-local Gemma 4 E2B for companion conversations and outdoor-photo understanding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of MongoDB Atlas:&lt;/strong&gt; the documented production data layer and pet-scoped vector-memory integration; the live API reports MongoDB storage and vector readiness.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of GitHub Copilot:&lt;/strong&gt; the category's GitHub Actions automation option, with successful release-check runs. The evidence here is Actions automation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These claims follow the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Week 1 category descriptions&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
  </channel>
</rss>
