<?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: Faraz S.</title>
    <description>The latest articles on DEV Community by Faraz S. (@faraz_s_0a6e70a4bbdc6622).</description>
    <link>https://dev.to/faraz_s_0a6e70a4bbdc6622</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%2F3964947%2F2f8dd02b-3654-4339-b46d-cf24ee4ce90f.jpg</url>
      <title>DEV Community: Faraz S.</title>
      <link>https://dev.to/faraz_s_0a6e70a4bbdc6622</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/faraz_s_0a6e70a4bbdc6622"/>
    <language>en</language>
    <item>
      <title>RecallSloth: Your Medical Revision Queue Can Do the Sorting</title>
      <dc:creator>Faraz S.</dc:creator>
      <pubDate>Sat, 24 Oct 2026 10:22:06 +0000</pubDate>
      <link>https://dev.to/faraz_s_0a6e70a4bbdc6622/recallsloth-your-medical-revision-queue-can-do-the-sorting-3lea</link>
      <guid>https://dev.to/faraz_s_0a6e70a4bbdc6622/recallsloth-your-medical-revision-queue-can-do-the-sorting-3lea</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;p&gt;I wanted opening a revision app to end with one small choice: &lt;strong&gt;start&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;No rearranging a deck. No deciding which chapter deserves attention. No reviewing the same fact twice because it appeared under two different headings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RecallSloth&lt;/strong&gt; is the little system I built around that idea: a medical revision desk that turns definition notes into source-linked recall cards, uses an open model to find overlapping explanations, and picks a short daily queue. A very contented sloth keeps it company.&lt;/p&gt;

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

&lt;p&gt;The intended user is a medical student or another learner revising physiology from their own trusted notes. The effort I want to remove is the repeated organization around studying: formatting definitions into cards, spotting duplicates, balancing due topics, and carrying unfinished sessions forward.&lt;/p&gt;

&lt;p&gt;The flow is small enough to explain without a tutorial:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Import TXT/Markdown notes with one &lt;code&gt;Term: definition&lt;/code&gt; per line.&lt;/li&gt;
&lt;li&gt;Check and approve the extracted source cards.&lt;/li&gt;
&lt;li&gt;Let the &lt;strong&gt;local AI overlap scout&lt;/strong&gt; find explanations worth comparing. Confirm any groups yourself.&lt;/li&gt;
&lt;li&gt;Choose a two-, five-, or ten-minute session and start recalling.&lt;/li&gt;
&lt;li&gt;Reveal the exact source answer, self-rate, and let the due date move.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every source card survives grouping. Each answer points back to the original note, line, character range and text checksum. Nothing invents a new medical explanation.&lt;/p&gt;

&lt;p&gt;The sample contains twelve newly written pulmonary-physiology definitions grounded in &lt;a href="https://www.nhlbi.nih.gov/health/lungs/breathing-benefits" rel="noopener noreferrer"&gt;NIH/NHLBI factual references&lt;/a&gt;. They are educational examples, not patient records or an endorsed curriculum. Your own course notes remain the authority for what you study.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  &lt;a href="https://recallsloth.onrender.com/" rel="noopener noreferrer"&gt;Open RecallSloth →&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;The app runs on Render's Free plan. It can take a little time to wake after inactivity. The first local-model download needs internet; later cached runs can work offline.&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%2Fqdcq6cst5sz31mk4hlml.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%2Fqdcq6cst5sz31mk4hlml.png" alt="RecallSloth's real study desk, with a small daily session budget and a resting sloth" width="800" height="773"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Choose &lt;strong&gt;Try the sample notes&lt;/strong&gt;, then &lt;strong&gt;Review &amp;amp; approve cards&lt;/strong&gt;. Open &lt;strong&gt;Overlap scout&lt;/strong&gt; and consent to the model download. Compare the proposed pairs; only group cards if they test the same fact, including direction and context.&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%2F7atccdaucsw4oo1e7n1e.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%2F7atccdaucsw4oo1e7n1e.png" alt="The real source-comparison dialog asks the learner to confirm that two definitions test the same fact" width="800" height="583"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Return to &lt;strong&gt;Today&lt;/strong&gt;, set your budget, and start a queue. Think about the term, press &lt;strong&gt;Space&lt;/strong&gt; to reveal its source answer, then use &lt;strong&gt;1–4&lt;/strong&gt; to self-rate. The queue stops when its selected cards are done. There is no timer to race or streak to protect.&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%2F358cm2gomybc5rtfw60h.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%2F358cm2gomybc5rtfw60h.png" alt="An actual RecallSloth recall session with its original source answer and four self-rating controls" width="800" height="595"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Close the tab halfway through and return: the unfinished session resumes from browser storage. If a rating was a misclick, undo it during that in-memory session. You can pause cards, separate a group, export a checksum-verified deck backup, restore it after confirmation, or clear the browser's study data.&lt;/p&gt;

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

&lt;p&gt;In the sample, four learner-confirmed pairs turn &lt;strong&gt;twelve source cards into eight recall steps&lt;/strong&gt; for a complete pass. All twelve originals remain inspectable.&lt;/p&gt;

&lt;p&gt;At the app's illustrative estimate of &lt;strong&gt;45 seconds per step&lt;/strong&gt;, that is &lt;strong&gt;three fewer estimated minutes&lt;/strong&gt; per full pass. It is arithmetic on a demonstration deck—not measured time saved or a learning-outcome claim. A daily session may cover only part of that deck.&lt;/p&gt;

&lt;p&gt;The repeatable payoff is the routine: notes come in once, approved groups stay together, ratings update due dates, and the next queue respects the chosen budget. Taking a rest day does not erase progress. The system does the sorting again whenever you return.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/faraz-shamim/recallsloth" rel="noopener noreferrer"&gt;Source, tests, measured diagnostic, licenses and self-hosting instructions&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm ci &lt;span class="nt"&gt;--ignore-scripts&lt;/span&gt;
npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The application code is MIT. Model/runtime licenses and reused infrastructure code are credited separately.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Keep the answers attached to the notes
&lt;/h3&gt;

&lt;p&gt;The card parser does one narrow job: extract explicitly defined terms from the learner's notes. It preserves each definition's exact source span. Unstructured prose without definition lines is rejected rather than converted into speculative questions.&lt;/p&gt;

&lt;p&gt;The app checks a citation against its source before approval or study. A modified answer in an imported backup fails validation. Restoring a backup never replays session or history commands.&lt;/p&gt;

&lt;p&gt;Notes, cards, groups, due dates and review history persist in &lt;strong&gt;local, unencrypted IndexedDB&lt;/strong&gt;. A backup contains the source text, so it belongs somewhere private. This is personal study software; patient records should stay out.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use an open model for the fuzzy part
&lt;/h3&gt;

&lt;p&gt;The overlap scout runs &lt;a href="https://huggingface.co/Xenova/all-MiniLM-L6-v2" rel="noopener noreferrer"&gt;Xenova/all-MiniLM-L6-v2&lt;/a&gt;, pinned to revision &lt;code&gt;751bff37182d3f1213fa05d7196b954e230abad9&lt;/code&gt;. Transformers.js loads quantized weights into ONNX Runtime Web and produces normalized 384-dimensional embeddings on WASM CPU.&lt;/p&gt;

&lt;p&gt;It encodes the source definitions, compares cosine similarity, and offers the highest-ranking comparisons above an illustrative threshold. It generates no answers, approves no cards, and merges nothing automatically.&lt;/p&gt;

&lt;p&gt;The most useful debugging result was a failure. Two gas-transfer definitions could look very similar to the model while describing different facts. A high cosine score was enough to justify comparison, but it did not establish equivalence.&lt;/p&gt;

&lt;p&gt;I added a small contrast check that flags different gas terms, negation and numeric details, and moves flagged comparisons behind unflagged ones. Its vocabulary is deliberately limited. It cannot verify medical meaning, and every group still needs the learner's explicit confirmation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Publish the misses too
&lt;/h3&gt;

&lt;p&gt;The app includes a downloadable diagnostic: eight directional alias lookups across the twelve sample definitions, compared with Jaccard word overlap.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Expected alias ranked first&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Word-overlap baseline&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4 / 8&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Raw MiniLM similarity&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5 / 8&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MiniLM with the limited contrast ordering&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;6 / 8&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The &lt;a href="https://github.com/faraz-shamim/recallsloth/blob/main/docs/sample-diagnostic.json" rel="noopener noreferrer"&gt;raw report&lt;/a&gt; includes every prediction, its source checksum, the pinned model and actual inference duration.&lt;/p&gt;

&lt;p&gt;These examples were revised during development. The contrast check was added after observing related errors. This is &lt;strong&gt;not an independent holdout&lt;/strong&gt;, and those numbers establish no general or medical accuracy. Even the contrast-aware version misses two expected aliases. Alternatives, source inspection and reversible learner decisions remain part of the product.&lt;/p&gt;

&lt;h3&gt;
  
  
  Let Render handle a very small tool
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Render hosts the study-agent frontend, the queue-planning API, and the compressed inference runtime assets.&lt;/strong&gt; The model and note text stay on the learner's device.&lt;/p&gt;

&lt;p&gt;The queue tool receives only opaque card/topic/group IDs, due timestamps, lapse counts, estimated step durations and the time budget. The browser offers only approved, unpaused cards with valid source citations. The tool then:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;keeps future cards out;&lt;/li&gt;
&lt;li&gt;choose one representative per learner-confirmed group;&lt;/li&gt;
&lt;li&gt;balance due topics within the budget;&lt;/li&gt;
&lt;li&gt;return a visible tool trace and the selected IDs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Its schema rejects extra fields and unbounded inputs. There is no note-upload endpoint or server database. The browser checks the result against the same deterministic planner running locally. If the service is waking or unavailable, the queue can still be built on-device. You can turn the server option off yourself.&lt;/p&gt;

&lt;p&gt;The model loader, tokenizer files and runtime are pinned. Generic runtime assets are self-hosted with correct compression/MIME headers, and a service worker caches the app shell. The real browser check disables the network, reloads the stored deck, runs actual model inference again, and starts an on-device queue.&lt;/p&gt;

&lt;h3&gt;
  
  
  Test the quiet details
&lt;/h3&gt;

&lt;p&gt;A &lt;a href="https://github.com/faraz-shamim/recallsloth/actions/runs/40074739937" rel="noopener noreferrer"&gt;fresh Linux CI run&lt;/a&gt; passed the build and complete software checks. The repository includes &lt;strong&gt;26 unit/API tests&lt;/strong&gt; and &lt;strong&gt;21 browser checks&lt;/strong&gt; covering source fidelity, grouping, schedule boundaries, undo, persistence, keyboard controls, backup tampering, mobile layouts and offline use.&lt;/p&gt;

&lt;p&gt;A unique synthetic private marker in a test note never appears in outgoing request URLs or bodies. The browser test uses real embeddings and synthetic actions; model responses are not mocked. It runs in its own isolated browser profile, never a signed-in user's existing browser.&lt;/p&gt;

&lt;p&gt;The interval ladder is intentionally transparent: Again is one minute; Hard, Good and Easy increase the interval at different rates, capped at 365 days. A grouped card moves its confirmed siblings together. This is a simple prototype schedule, not a validated retention model or a claim of mastery.&lt;/p&gt;

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

&lt;p&gt;The open model can do the fuzzy comparison on a laptop CPU while the note text stays in the browser. There is no inference API key, per-definition API charge or GPU dependency. The learner can inspect a failure, keep an alternative separate, and continue with cached assets offline.&lt;/p&gt;

&lt;p&gt;The surrounding rules are open too. Someone can change the queue budget, examine the contrast vocabulary, replace the scheduling ladder, or evaluate another embedding model without depending on a hosted model's hidden behavior.&lt;/p&gt;

&lt;p&gt;There are still practical limits. First use downloads generic assets; providers can see ordinary connection metadata; browsers can evict caches; and Render's Free service sleeps and shares workspace allowances. Local storage is unencrypted, and backups contain notes. The current deployment is a free educational prototype, with no clinical use, student trial, retention validation or measured educational outcome.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Best Use of Render&lt;/strong&gt; — the single partner category I am entering. Render serves the study-agent frontend, strict queue tool, and self-hosted runtime assets, with a functioning on-device fallback.&lt;/p&gt;

&lt;h2&gt;
  
  
  Credits
&lt;/h2&gt;

&lt;p&gt;Built by &lt;strong&gt;&lt;a class="mentioned-user" href="https://dev.to/faraz_s_0a6e70a4bbdc6622"&gt;@faraz_s_0a6e70a4bbdc6622&lt;/a&gt;&lt;/strong&gt; with AI coding assistance. The cover was generated with OpenAI's built-in image tool; &lt;a href="https://github.com/faraz-shamim/recallsloth/blob/main/docs/artwork.md" rel="noopener noreferrer"&gt;the exact prompt and saved asset paths&lt;/a&gt; are included. Screenshots show the actual app.&lt;/p&gt;

&lt;p&gt;The generic pinned browser-model loader, WASM compression and service-worker patterns are adapted from my earlier &lt;a href="https://github.com/faraz-shamim/referralglass" rel="noopener noreferrer"&gt;ReferralGlass&lt;/a&gt; project and credited in &lt;a href="https://github.com/faraz-shamim/recallsloth/blob/main/THIRD_PARTY.md" rel="noopener noreferrer"&gt;THIRD_PARTY.md&lt;/a&gt;. RecallSloth's study workflow, source-card parser, overlap/contrast controls, grouping, scheduler, IndexedDB store, UI and tests were written for Week 3.&lt;/p&gt;

&lt;p&gt;Factual background for the newly written sample: National Heart, Lung, and Blood Institute; National Institutes of Health; U.S. Department of Health and Human Services. No agency endorsement is implied. No agency images, logos or formatted publications are reproduced.&lt;/p&gt;

&lt;p&gt;What part of setting up a revision session would you most like to hand over to a sloth?&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>education</category>
    </item>
    <item>
      <title>ReferralGlass: An AI Referral Desk That Shows Its Work</title>
      <dc:creator>Faraz S.</dc:creator>
      <pubDate>Sun, 18 Oct 2026 06:32:56 +0000</pubDate>
      <link>https://dev.to/faraz_s_0a6e70a4bbdc6622/referralglass-an-ai-referral-desk-that-shows-its-work-43h3</link>
      <guid>https://dev.to/faraz_s_0a6e70a4bbdc6622/referralglass-an-ai-referral-desk-that-shows-its-work-43h3</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;p&gt;“&lt;strong&gt;The imaging report is still pending.&lt;/strong&gt;”&lt;/p&gt;

&lt;p&gt;Put that sentence inside a referral packet and a semantic search for &lt;em&gt;investigation reports&lt;/em&gt; will find a convincing match. The office still needs the actual report.&lt;/p&gt;

&lt;p&gt;That small distinction became the center of &lt;strong&gt;ReferralGlass&lt;/strong&gt;, a medical-office paperwork agent I built for this week's challenge. It finds relevant passages, opens their source pages, and asks a person to decide whether the requested paperwork is actually there. Every checklist begins with &lt;strong&gt;zero automatic approvals&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;ReferralGlass is a referral-packet desk for a small independent practice. Its intended user is the coordinator preparing documents for a receiving specialist office: several files, an office-specific checklist, and a handoff that another person needs to understand.&lt;/p&gt;

&lt;p&gt;The workflow is deliberately concrete:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Import PDFs, text files, or scans. PDF extraction and English OCR run locally.&lt;/li&gt;
&lt;li&gt;Describe the receiving office's paperwork requirements, including optional age limits.&lt;/li&gt;
&lt;li&gt;Run a small open model in the browser to locate candidate passages.&lt;/li&gt;
&lt;li&gt;Inspect the exact extracted quote, file, page, and original page image.&lt;/li&gt;
&lt;li&gt;Confirm each source manually, then export a review or draft a request for missing paperwork.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.ahrq.gov/health-literacy/improve/precautions/tool21.html" rel="noopener noreferrer"&gt;AHRQ's referral guidance&lt;/a&gt; provided useful background on organizing a referral and its relevant information. The six bundled checklist items are illustrative office rules, not an official clinical checklist.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The buyer hypothesis:&lt;/strong&gt; an independent practice could pay for reusable checklists, private packet preparation, consistent handoffs, and support. I would test &lt;strong&gt;$29/month per office&lt;/strong&gt; as a starting price. That is an unvalidated hypothesis: there is no active subscription, paying customer, clinic pilot, or measured time-saving claim.&lt;/p&gt;

&lt;p&gt;The first validation step would be a consented pilot with de-identified packets, measuring staff time, missed paperwork, corrections, and willingness to pay. The prototype provides a working workflow to evaluate before making those promises.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  &lt;a href="https://referralglass.onrender.com/" rel="noopener noreferrer"&gt;Open ReferralGlass →&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;The live version runs on Render's free web-service plan. It may take a little time to wake after inactivity. A recent desktop browser works best for the first model download; the interface also fits a phone.&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%2Ftrcbxyhczfjl3xzqm2vx.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%2Ftrcbxyhczfjl3xzqm2vx.png" alt="ReferralGlass packet desk with file import, a customizable office checklist, and local AI controls" width="800" height="793"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try the missing-report scenario:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Choose &lt;strong&gt;Try a sample packet&lt;/strong&gt;. The four fictional files contain six pages.&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;Find evidence&lt;/strong&gt; and allow the one-time generic model download. No account or inference key is required.&lt;/li&gt;
&lt;li&gt;Open &lt;strong&gt;Investigation reports&lt;/strong&gt;. The closest passage explicitly says the report is pending. Attempting to confirm it opens an explanation and leaves the item outstanding.&lt;/li&gt;
&lt;li&gt;Inspect the other source pages and confirm them. Each confirmation requires an acknowledgement that the passage belongs to this packet and meets this office's requirement.&lt;/li&gt;
&lt;li&gt;Open &lt;strong&gt;Prepare handoff&lt;/strong&gt;. The missing-paperwork request follows the staff decisions. Save the source-linked JSON or print/save a PDF locally.&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%2Fvxda75qf62pbz1a6uf9o.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%2Fvxda75qf62pbz1a6uf9o.png" alt="Real evidence review showing the pending investigation-report passage and its source-page controls" width="800" height="661"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The original-page viewer makes extraction checkable. The bundled two-page sample PDF also gives you a safe way to try real PDF import and scan reading. Every example is explicitly fictional.&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%2Fub9zbcn7rx1v0utunq08.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%2Fub9zbcn7rx1v0utunq08.png" alt="A fictional PDF rendered locally in the original source-page viewer" width="800" height="583"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is a complete-packet example too, along with manual source selection, checklist import/export, and an activity record. Changing files, dates, or the checklist clears earlier findings and confirmations so stale decisions do not silently survive an edit.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/faraz-shamim/referralglass" rel="noopener noreferrer"&gt;Source, setup instructions, tests, licenses and measured reports on GitHub&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm ci &lt;span class="nt"&gt;--ignore-scripts&lt;/span&gt;
npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The application is MIT-licensed. The open model and supporting engines retain their own licenses, which are documented and distributed with the runtime.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  A compact model, close to the documents
&lt;/h3&gt;

&lt;p&gt;The model is &lt;a href="https://huggingface.co/Xenova/all-MiniLM-L6-v2" rel="noopener noreferrer"&gt;Xenova/all-MiniLM-L6-v2&lt;/a&gt;, pinned to revision &lt;code&gt;751bff37182d3f1213fa05d7196b954e230abad9&lt;/code&gt;. Transformers.js runs its quantized weights through ONNX Runtime Web on WASM CPU. It produces normalized 384-dimensional embeddings for the office's requirements and the source passages.&lt;/p&gt;

&lt;p&gt;The index preserves a document reference, page number, exact character range, and SHA-256 of the source file. Clicking a citation resolves the passage against the current extracted text. A changed passage cannot become a valid citation. For PDFs and OCR, “exact” means the extracted text: the original page remains available because extraction can be wrong.&lt;/p&gt;

&lt;p&gt;The agent then runs a bounded plan: inspect ranked candidates, flag uncertainty or quality problems, present the sources, and wait for staff. It does not generate a clinical summary. The missing-paperwork message is assembled from the unconfirmed required checklist items, so it stays tied to the review state.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Render boundary
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Render hosts the agent frontend, the stateless review planner, and the compressed PDF/OCR/inference runtime assets.&lt;/strong&gt; Keeping the language model on the user's device lets the server operate within a small free instance while avoiding a document-upload workflow.&lt;/p&gt;

&lt;p&gt;The planner request contains only a short internal requirement ID and candidates like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ref"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"d0:p1:c0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.5134&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"absence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dateIssue"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ocr"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"weakOcr"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No names, filenames, document text, checklist descriptions, images, or source quotes are needed. Imported checklist IDs are replaced with internal IDs before use. The API rejects unknown fields and unbounded inputs; there is no upload endpoint, session database, or application request-body logging.&lt;/p&gt;

&lt;p&gt;A raw cosine score describes similarity, not confidence that an office requirement has been met. Closely competing sources, explicit missing-document language, low OCR quality, and office date limits remain visible. Those heuristics are illustrative and can fail; source inspection is essential.&lt;/p&gt;

&lt;p&gt;Every response records &lt;code&gt;autoApproved: 0&lt;/code&gt; and &lt;code&gt;nextAction: "staff_review"&lt;/code&gt;. A visible activity record shows the steps. If Render is waking or unavailable, the same planner runs locally. You can also turn off the server planner yourself.&lt;/p&gt;

&lt;h3&gt;
  
  
  What the real tests caught
&lt;/h3&gt;

&lt;p&gt;The first browser run revealed that the inference runtime tried loading an external JavaScript module that the site's content policy blocked. I self-hosted the exact matching runtime and compressed its large WASM binary; its gzip transfer is about 6.8 MB.&lt;/p&gt;

&lt;p&gt;Later, visiting the retrieval lab exposed a service-worker bug: the lab's page could overwrite the main app's offline cache entry. Navigation responses now retain their own request keys. The browser check visits both pages, disables the network, reloads, and runs actual inference again.&lt;/p&gt;

&lt;p&gt;The SDK also probed an unpinned metadata URL while discovering tokenizer files, which broke offline startup. The loader now constructs the public feature-extraction pipeline with the exact pinned tokenizer assets. The browser test checks every model request against the immutable revision.&lt;/p&gt;

&lt;p&gt;These are the reasons I wanted executable checks and real source images alongside the polished interface.&lt;/p&gt;

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

&lt;p&gt;The &lt;a href="https://referralglass.onrender.com/lab.html" rel="noopener noreferrer"&gt;retrieval lab&lt;/a&gt; compares MiniLM with a TF-IDF cosine baseline on &lt;strong&gt;24 fixed synthetic cases&lt;/strong&gt;, each with one target passage and five other document types. Both methods receive the same requirements and text. The corpus was fixed before the first run, and all predictions are published.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Top-1 matches on this fixture&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Local MiniLM semantic retrieval&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;21 / 24&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TF-IDF cosine baseline&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;21 / 24&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The aggregate is a tie. MiniLM finds one paraphrased referral example that the lexical method misses; it also confuses an administrative example that TF-IDF gets right. Both miss two other cases. The &lt;a href="https://github.com/faraz-shamim/referralglass/blob/main/docs/retrieval-benchmark.json" rel="noopener noreferrer"&gt;raw report&lt;/a&gt; includes those failures.&lt;/p&gt;

&lt;p&gt;This is a small software fixture, not clinical accuracy or evidence of better real-world performance. It supports keeping alternatives and manual source selection available, and keeping human confirmation mandatory.&lt;/p&gt;

&lt;p&gt;A &lt;a href="https://github.com/faraz-shamim/referralglass/actions/runs/39104148344" rel="noopener noreferrer"&gt;fresh Linux GitHub Actions run&lt;/a&gt; passed the build and the complete software checks. The repository includes &lt;strong&gt;24 passing unit/API tests&lt;/strong&gt; and &lt;strong&gt;26 passing browser checks&lt;/strong&gt; in the &lt;a href="https://github.com/faraz-shamim/referralglass/blob/main/docs/browser-qa.json" rel="noopener noreferrer"&gt;full browser report&lt;/a&gt;. The browser checks use actual local embeddings, real PDF parsing, actual English OCR, source confirmations, JSON and A4 PDF exports, mobile layouts, and offline reload. A unique synthetic private marker never appears in outgoing request URLs or bodies. Staff actions are automated with fictional records; clipboard behavior is stubbed during the test.&lt;/p&gt;

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

&lt;p&gt;An open local model makes the data boundary possible. The browser can encode a document without sending its text to an inference provider, inspect the ranking, and continue with cached assets offline. The same small planner is readable, testable, and runnable on the device or on Render.&lt;/p&gt;

&lt;p&gt;It also makes the business hypothesis easier to test. There is no per-document inference API charge or GPU requirement in this prototype. A practice could self-host the code, change its checklist, inspect a failure, or replace the model. Model swaps would need fresh evaluation rather than an assumption that larger means better.&lt;/p&gt;

&lt;p&gt;There are still ordinary hosting and download costs and limits. First use downloads roughly 50 MB of generic model/runtime assets; OCR adds its assets when needed. Hugging Face and Render can see normal connection metadata. Browser caches can be evicted, and free Render services sleep and share workspace allowances. This is a prototype deployment, not a production healthcare hosting or compliance claim.&lt;/p&gt;

&lt;p&gt;Documents and review state stay in browser memory; exports contain excerpts and need an approved secure workflow. There is no clinical validation, automatic patient identity reconciliation, diagnosis, urgency assessment, treatment recommendation, or automatic sending. A real deployment would need a separate assessment with the practice and appropriate specialists.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Best Use of Render&lt;/strong&gt; — the single partner category I am entering. Render serves the agent's frontend, bounded score-planning API, and self-hosted runtime assets, with an on-device fallback when the service is unavailable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Credits
&lt;/h2&gt;

&lt;p&gt;Built by &lt;strong&gt;&lt;a class="mentioned-user" href="https://dev.to/faraz_s_0a6e70a4bbdc6622"&gt;@faraz_s_0a6e70a4bbdc6622&lt;/a&gt;&lt;/strong&gt; with AI coding assistance. The cover was generated using OpenAI's image tool; &lt;a href="https://github.com/faraz-shamim/referralglass/blob/main/docs/artwork.md" rel="noopener noreferrer"&gt;the exact prompt and provenance&lt;/a&gt; are in the repository. Screenshots show the real application with fictional data.&lt;/p&gt;

&lt;p&gt;Generic deployment and browser-cache experience from my earlier &lt;a href="https://github.com/faraz-shamim/stillroot" rel="noopener noreferrer"&gt;Stillroot&lt;/a&gt; and &lt;a href="https://github.com/faraz-shamim/ascend" rel="noopener noreferrer"&gt;ASCEND&lt;/a&gt; projects informed the setup. ReferralGlass is a new project built during this challenge window, with a new ingestion, evidence, planning and review workflow. &lt;a href="https://github.com/faraz-shamim/referralglass/blob/main/THIRD_PARTY.md" rel="noopener noreferrer"&gt;Third-party licenses and source credits&lt;/a&gt; are included.&lt;/p&gt;

&lt;p&gt;If you work with referral packets, which paperwork requirement would you want your office's first checklist to include?&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>healthcare</category>
    </item>
    <item>
      <title>ASCEND: A Solo Levelling Anime Based App To Turn a Small Walk into a Real-World Quest with Local Gemma</title>
      <dc:creator>Faraz S.</dc:creator>
      <pubDate>Thu, 08 Oct 2026 11:37:28 +0000</pubDate>
      <link>https://dev.to/faraz_s_0a6e70a4bbdc6622/ascend-turn-a-small-walk-into-a-real-world-quest-with-local-gemma-2347</link>
      <guid>https://dev.to/faraz_s_0a6e70a4bbdc6622/ascend-turn-a-small-walk-into-a-real-world-quest-with-local-gemma-2347</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;p&gt;A nearby park can feel ordinary. Give it a mysterious gate, a small story, and a leaf-eared companion waiting at the end, and the same walk becomes an adventure.&lt;/p&gt;

&lt;p&gt;That is the idea behind &lt;strong&gt;ASCEND&lt;/strong&gt;. The next level is somewhere outside your front door.&lt;/p&gt;

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

&lt;p&gt;ASCEND is a browser-based outdoor quest game. It combines the anticipation of anime progression with the joy of finding things in the real world. You start at E-rank, finish small adventures, collect original companions, unlock trophies, and gradually work toward S-rank.&lt;/p&gt;

&lt;p&gt;The game begins with your location and the time you have. It finds nearby parks, gardens, outdoor artwork, viewpoints, and other eligible places in OpenStreetMap, with a separate Wikidata fallback for urban parks, monuments, and fountains. &lt;strong&gt;Gemma runs on your device&lt;/strong&gt; and writes a short fantasy atmosphere for the mapped destination. The story also helps choose a bounded observation prompt for a discovery quest.&lt;/p&gt;

&lt;p&gt;There are three ways to explore:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Quest&lt;/th&gt;
&lt;th&gt;What you do&lt;/th&gt;
&lt;th&gt;Reward&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Reach a gate&lt;/td&gt;
&lt;td&gt;Walk to one mapped place and check in&lt;/td&gt;
&lt;td&gt;100 XP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Make a discovery&lt;/td&gt;
&lt;td&gt;Arrive, photograph something you notice, and write a few words&lt;/td&gt;
&lt;td&gt;150 XP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Follow a trail&lt;/td&gt;
&lt;td&gt;Check in at three places in order&lt;/td&gt;
&lt;td&gt;250 XP&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Your first completed quest unlocks &lt;strong&gt;Fernfox&lt;/strong&gt;. Later adventures introduce a moss-covered tortoise, a luminous moth, a moonlit owl, an ember salamander, and an astral fawn. They are original characters with original generated artwork.&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%2F41uu53bfgqgnju0qtw4e.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%2F41uu53bfgqgnju0qtw4e.png" alt="ASCEND’s companion collection, shown with labelled rehearsal progress" width="800" height="839"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Companions are earned through completed quests. Rehearsal rewards stay separate from real-world rankings.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;There is no streak punishment. A quiet walk tomorrow is still welcome if you missed today.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;&lt;a href="https://ascend-quests.onrender.com" rel="noopener noreferrer"&gt;Play ASCEND&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Start with &lt;strong&gt;Try the rehearsal&lt;/strong&gt; to explore all three quest types without GPS, camera permissions, or an account. Its places and arrivals are explicitly fictional, and its scores never enter the global leaderboard.&lt;/p&gt;

&lt;p&gt;For a real quest, choose &lt;strong&gt;Find my next quest&lt;/strong&gt;, allow location, and select an adventure. Try the local Gemma writer, read or listen to the briefing, then open the pocket guide. At the checkpoint, reopen the app and check in.&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%2F8its1sslngvk7yyawjcv.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%2F8its1sslngvk7yyawjcv.png" alt="The actual ASCEND quest board" width="800" height="866"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The pocket guide has large controls for repeating the briefing, pausing, and checking in. Installed device voices can read the briefing. Optional browser recognition supports commands such as “repeat,” “status,” “pause,” and “check in.” No ElevenLabs is used. When a browser lacks voice support, the same actions are available on screen.&lt;/p&gt;

&lt;p&gt;Browser GPS pauses when the page is hidden or the phone is locked, so ASCEND asks you to reopen at checkpoints. The phone helps launch the adventure and record its ending; the walk happens between those moments.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/faraz-shamim/ascend" rel="noopener noreferrer"&gt;Source, setup, tests, and deployment configuration&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Explore the &lt;a href="https://github.com/faraz-shamim/ascend/blob/main/web/lib/domain.js" rel="noopener noreferrer"&gt;quest engine&lt;/a&gt;, &lt;a href="https://github.com/faraz-shamim/ascend/blob/main/web/gemma-worker.js" rel="noopener noreferrer"&gt;Gemma worker&lt;/a&gt;, or &lt;a href="https://github.com/faraz-shamim/ascend/blob/main/render.yaml" rel="noopener noreferrer"&gt;deployment configuration&lt;/a&gt;. The README includes the commands to run it yourself.&lt;/p&gt;

&lt;p&gt;The code is MIT-licensed. The generated art has its own attribution instructions, and downloaded model weights retain Gemma’s terms.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  A story layer grounded in an actual map
&lt;/h3&gt;

&lt;p&gt;The map service uses OpenStreetMap Overpass, with bounded provider fallbacks. A real deployment test exposed unavailable Overpass gateways, so I added an independent Wikidata lookup for urban parks, monuments, and fountains. Its bounded query searches the local area before following category relationships, then checks known indoor, dissolved, and future locations. Broad residential-garden and amusement-park categories are excluded.&lt;/p&gt;

&lt;p&gt;Searches are cached and shared across concurrent explorers. Known private and indoor OpenStreetMap tags are filtered out. Access information and the original OpenStreetMap or Wikidata item remain visible because a mapped place is not proof that it is open or reachable by a pedestrian route.&lt;/p&gt;

&lt;p&gt;Gemma writes the story; a separate quest engine pins the destinations, objectives, and XP. The model cannot invent a destination or grant rewards. Long, code-like, or unsuitable narratives fall back to a clearly labelled curated briefing.&lt;/p&gt;

&lt;p&gt;The small model taught a useful lesson: a complicated formatting prompt could produce code or an overly dramatic story. A short request for two peaceful fairy-tale sentences worked better. I kept the output guard even after improving the prompt.&lt;/p&gt;

&lt;h3&gt;
  
  
  Local Gemma, measured rather than assumed
&lt;/h3&gt;

&lt;p&gt;The app uses &lt;strong&gt;Gemma 3 270M&lt;/strong&gt;, Transformers.js, and ONNX Runtime in a worker. WebGPU is used when available; a separately pinned compatible model revision supports WASM on CPU. The first use downloads hundreds of megabytes, so the app explains that before loading.&lt;/p&gt;

&lt;p&gt;A genuine browser inference produced this line:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The Lantern Garden whispered secrets as the sun warmed the mossy leaves, a gentle breeze rustled the silver petals of the flowers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;On the tested browser, generation took &lt;strong&gt;5.1 seconds&lt;/strong&gt;. The first model download plus generation took &lt;strong&gt;98.5 seconds&lt;/strong&gt;. Those are measurements from one machine, not a promise for every phone. The full prompt, output, revision, and timings are recorded in &lt;a href="https://github.com/faraz-shamim/ascend/blob/main/docs/gemma-inference.json" rel="noopener noreferrer"&gt;the inference report&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The CPU fallback was tested with WebGPU disabled: &lt;strong&gt;33.1 seconds&lt;/strong&gt; for generation and &lt;strong&gt;170.4 seconds&lt;/strong&gt; including the first download, on the same computer. Its &lt;a href="https://github.com/faraz-shamim/ascend/blob/main/docs/gemma-cpu-inference.json" rel="noopener noreferrer"&gt;separate report&lt;/a&gt; records actual WASM inference.&lt;/p&gt;

&lt;p&gt;Large model downloads also exposed interrupted CDN transfers during testing. The loader now fetches pinned artifacts in verified 8 MiB ranges, retries interrupted chunks, and rejects mismatched revisions. This made both real GPU and CPU runs complete.&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%2Fcjrp1nbuc0axn9iu8lme.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%2Fcjrp1nbuc0axn9iu8lme.png" alt="A real local Gemma story for the explicitly fictional rehearsal destination" width="800" height="878"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The model’s narration is fictional. The report confirms that generating it left the checkpoint coordinates unchanged.&lt;/p&gt;

&lt;h3&gt;
  
  
  Render for the shared game, the device for private memories
&lt;/h3&gt;

&lt;p&gt;The frontend and Express API run on Render. The release configuration uses a free web service and free Postgres in Singapore. Reward updates use database transactions, including protection against duplicate simultaneous check-ins. Explorer state and world rankings are stored in Render Postgres.&lt;/p&gt;

&lt;p&gt;GPS check-ins require a recent fix, acceptable accuracy, and proximity to the checkpoint. Previously completed destinations disappear from suggestions for 24 hours. Trail checkpoints must be completed in order.&lt;/p&gt;

&lt;p&gt;World rankings are opt-in and publish an alias with aggregate game statistics. They do not expose destinations or photos. Camera images and the latest 30 journal memories remain in the device’s IndexedDB; the server receives photo metadata rather than pixels. A private session export lets you restore access to your explorer.&lt;/p&gt;

&lt;p&gt;Render’s free service can take about a minute to wake, and its free Postgres expires after 30 days. The README documents those limits and the need to export or migrate before expiry. This entry uses free services and no paid AI API.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I actually verified
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;33 automated tests&lt;/strong&gt; cover auth, GPS validation, camera metadata, progression, cooldowns, duplicate rewards, map caching and backoff, and Postgres rollback and cleanup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;19 browser scenarios&lt;/strong&gt; cover the quest flows, camera capture, companions, trophies, rankings, session export/restore, journal deletion, and every screen at 390 px width.&lt;/li&gt;
&lt;li&gt;The deployed API returned &lt;strong&gt;18 real mapped landmarks&lt;/strong&gt; near a public central London test coordinate and created a grounded quest without claiming an outdoor visit or reward.&lt;/li&gt;
&lt;li&gt;A private explorer and its active quest survived a service restart with Postgres. The &lt;a href="https://github.com/faraz-shamim/ascend/blob/main/docs/deployment-check.json" rel="noopener noreferrer"&gt;live deployment report&lt;/a&gt; records the checks; no test XP was added to public rankings.&lt;/li&gt;
&lt;li&gt;Gemma’s inference ran for real in the browser; its measured output is linked above.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The browser suite uses &lt;strong&gt;simulated GPS and a synthetic camera feed&lt;/strong&gt;. Voice-command actions were tested with a synthesized transcript. Audible local speech and live microphone transcription still need testing on a physical phone. I have not claimed an outdoor field trial, and browser-reported GPS remains spoofable: these rankings support friendly play.&lt;/p&gt;

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

&lt;p&gt;A location-aware game can easily become another stream of private information sent to a remote model. Open weights let ASCEND generate its story on the explorer’s device. The prompt does not need a hosted AI endpoint, a per-story charge, or an AI API key.&lt;/p&gt;

&lt;p&gt;OpenStreetMap and Wikidata supply inspectable destinations. Transformers.js and ONNX Runtime make browser inference practical. The quest engine is readable, so someone can change reward rules, add companions, swap a model, or host their own version.&lt;/p&gt;

&lt;p&gt;Local inference does not make the whole app offline: new map lookups and shared rankings still need a connection. It does let the creative part run locally after the model is downloaded, on a capable device. That is a useful boundary for a game built around stepping outside.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build Notes and Credits
&lt;/h2&gt;

&lt;p&gt;ASCEND’s new repository, gameplay, API, databases, interface, artwork, and tests were built during this Week 1 window. Local-model compatibility work draws on my earlier &lt;a href="https://github.com/faraz-shamim/stillroot" rel="noopener noreferrer"&gt;Stillroot&lt;/a&gt; experiments. The anime progression and location-collecting inspirations are acknowledged; no Solo Leveling or Pokémon game assets are used.&lt;/p&gt;

&lt;p&gt;Codex assisted with implementation, testing, and this write-up. The cover and companion illustrations were generated for this project; &lt;a href="https://github.com/faraz-shamim/ascend/blob/main/docs/artwork.md" rel="noopener noreferrer"&gt;their prompts and provenance are documented&lt;/a&gt;.&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; genuine device-local Gemma inference writes the grounded adventure’s fantasy story and contributes to the discovery focus.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Render:&lt;/strong&gt; Render hosts the playable frontend and shared quest API, with Postgres for explorer progression and rankings.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your next gate might be a garden you have walked past a hundred times. Bring a little curiosity. Fernfox will meet you there.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>gemma</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Stillroot: a quiet plan companion for my friend</title>
      <dc:creator>Faraz S.</dc:creator>
      <pubDate>Sat, 03 Oct 2026 11:08:20 +0000</pubDate>
      <link>https://dev.to/faraz_s_0a6e70a4bbdc6622/stillroot-a-quiet-plan-companion-for-my-friend-5e2i</link>
      <guid>https://dev.to/faraz_s_0a6e70a4bbdc6622/stillroot-a-quiet-plan-companion-for-my-friend-5e2i</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;I built &lt;strong&gt;Stillroot&lt;/strong&gt;, a quiet plant-care companion for my friend &lt;strong&gt;Rohan&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The project is built around an everyday dilemma: a few plants on a windowsill, an upcoming weekend away, and the question, &lt;em&gt;"Will someone need to check the soil while I'm gone?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It's set up as a working gift prototype. The demo comes preloaded with sample data for a pothos, monstera, and basil so anyone can take it for a spin before Rohan connects his real sensors.&lt;/p&gt;

&lt;p&gt;Stillroot focuses on three things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A 7-day moisture forecast with an estimated range.&lt;/li&gt;
&lt;li&gt;A care plan that adapts to how long he'll be away, plus a ready-to-share note for a friend who's house-sitting.&lt;/li&gt;
&lt;li&gt;A compact, on-device Gemma companion that explains the forecast in plain English.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The interface is intentionally simple: one plant, one forecast, and one clear action. If a sensor reading looks stale, the app flags it before making any predictions. And if dry soil is forecasted while he's traveling, it suggests asking a friend to check on the plant instead of guessing a generic watering schedule.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;&lt;a href="https://stillroot.onrender.com" rel="noopener noreferrer"&gt;Open Stillroot on Render&lt;/a&gt;&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%2Fs5e418mu3a0k68xf2au9.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%2Fs5e418mu3a0k68xf2au9.jpg" alt="Stillroot showing a recorded TabPFN forecast, a six-day trip plan, local Gemma companion, and measured results" width="800" height="1384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Try this quick walkthrough:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Choose &lt;strong&gt;Basil&lt;/strong&gt; and slide &lt;strong&gt;Days away&lt;/strong&gt; to 7. The status updates to &lt;strong&gt;ASK FRIEND&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Turn on &lt;strong&gt;Simulate a stale sensor reading&lt;/strong&gt; to see it switch to &lt;strong&gt;VERIFY SENSOR&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Turn that off and click &lt;strong&gt;Before I water&lt;/strong&gt; to watch Gemma generate advice locally in your browser.&lt;/li&gt;
&lt;li&gt;Head to &lt;strong&gt;Try your own CSV history&lt;/strong&gt; and upload the included sample file to see custom predictions in action.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Note: Since this runs on Render's free tier, the demo may take around a minute to spin up if it hasn't been visited recently. Gemma downloads on the first run (~350 MB on WebGPU, ~850 MB on CPU fallback) and is cached in your browser for subsequent visits.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/faraz-shamim/stillroot" rel="noopener noreferrer"&gt;GitHub: faraz-shamim/stillroot&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The repository includes the frontend app, local prediction runtime, dataset generator, forecast experiments, raw benchmark files, and deployment config. Application code is MIT licensed; TabPFN and Gemma retain their respective licenses.&lt;/p&gt;

&lt;p&gt;To run it locally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm ci
npm run build
python &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
python &lt;span class="nt"&gt;-m&lt;/span&gt; uvicorn backend.app:app &lt;span class="nt"&gt;--host&lt;/span&gt; 127.0.0.1 &lt;span class="nt"&gt;--port&lt;/span&gt; 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;code&gt;http://127.0.0.1:8000&lt;/code&gt;. The README includes instructions for reproducing the TabPFN experiments and running predictions on custom CSVs.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  TabPFN provides the forecast
&lt;/h3&gt;

&lt;p&gt;I used &lt;strong&gt;Prior Labs' TabPFN v2&lt;/strong&gt; running on CPU, feeding it historical soil moisture, temperature, humidity, light hours, pot size, and days since watering to predict the next reading.&lt;/p&gt;

&lt;p&gt;To evaluate accuracy, I benchmarked it across 294 rows of data spanning 42 watering cycles, split cleanly by full cycle (196 train / 49 calibration / 49 test) so readings from the same drying cycle never leaked across splits.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model / Baseline&lt;/th&gt;
&lt;th&gt;Error (MAE in relative moisture points)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TabPFN v2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.4890 MAE&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mean training-drop baseline&lt;/td&gt;
&lt;td&gt;0.9766 MAE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Last-reading baseline&lt;/td&gt;
&lt;td&gt;6.2986 MAE&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;TabPFN cut prediction error by roughly &lt;strong&gt;50%&lt;/strong&gt; compared to the mean-drop baseline, achieving 91.8% empirical coverage on a 90% prediction interval.&lt;/p&gt;

&lt;p&gt;The hosted demo serves precomputed TabPFN outputs for fast load times and a light Render footprint, while the local Python runtime allows running TabPFN directly on custom CSV uploads.&lt;/p&gt;

&lt;p&gt;You can view the &lt;a href="https://github.com/faraz-shamim/stillroot/blob/main/web/public/data/tabpfn-report.json" rel="noopener noreferrer"&gt;measurement report&lt;/a&gt;, &lt;a href="https://github.com/faraz-shamim/stillroot/blob/main/web/public/data/data-card.json" rel="noopener noreferrer"&gt;dataset card&lt;/a&gt;, and &lt;a href="https://github.com/faraz-shamim/stillroot/blob/main/ml/forecast.py" rel="noopener noreferrer"&gt;experiment code&lt;/a&gt; in the repo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gemma makes the numbers understandable
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Google's Gemma 3 270M instruction model&lt;/strong&gt; runs right inside the user's browser via a Web Worker using Transformers.js and ONNX Runtime. The app packages the plant's recent telemetry and current care signal into a concise prompt, and the model explains the situation conversationally. Because inference runs client-side, sensor data never leaves the device.&lt;/p&gt;

&lt;p&gt;On WebGPU, Gemma answers questions like &lt;em&gt;"What should I check before I water?"&lt;/em&gt; in about &lt;strong&gt;7.9 seconds&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;One practical detail from the build: the latest embedding operator worked smoothly on WebGPU but broke under WASM. Pinning an earlier compatible conversion resolved the issue for the CPU fallback. Deterministic logic always guides the signal, so the AI focuses on explaining the plan clearly rather than making unpredictable watering decisions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Render makes it easy to give away
&lt;/h3&gt;

&lt;p&gt;A lightweight FastAPI service on &lt;strong&gt;Render's free plan&lt;/strong&gt; serves the frontend, static prediction assets, and care-policy endpoints. Because Gemma runs directly in the client and TabPFN runs locally during development, the backend stays lean and doesn't need PyTorch or heavy model dependencies in production.&lt;/p&gt;

&lt;p&gt;The full stack runs reliably on &lt;strong&gt;$0 in infrastructure costs and API fees&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;For this gift, openness means Rohan actually understands how his plant monitor works.&lt;/p&gt;

&lt;p&gt;Nothing is hidden behind a black box: the care logic is a short, transparent function, the forecast model and benchmarks are easy to inspect, and Gemma runs directly on his hardware without relying on an external API or sending personal home data over the wire. If he wants to tweak the thresholds, test a new plant, or build a version for someone else, the whole system is his to modify.&lt;/p&gt;

&lt;p&gt;Open weights and open tooling made it possible to build an intelligent, responsive assistant that costs nothing to run and respects user privacy by design.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of TabPFN&lt;/strong&gt; — Fast, tabular time-series forecasts evaluated on cycle-aware splits with solid baseline gains.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma&lt;/strong&gt; — A 270M open-weight model running entirely in the browser via WebGPU/WASM for private, on-device guidance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Render&lt;/strong&gt; — A clean full-stack deployment combining FastAPI and static frontend assets on a free-tier web service.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>hf26challenge</category>
      <category>weekendchallenge</category>
      <category>devchallenge</category>
    </item>
    <item>
      <title>Stillroot: a quiet plant companion for my friend Rohan</title>
      <dc:creator>Faraz S.</dc:creator>
      <pubDate>Sat, 03 Oct 2026 10:52:52 +0000</pubDate>
      <link>https://dev.to/faraz_s_0a6e70a4bbdc6622/stillroot-a-quiet-plant-companion-for-my-friend-rohan-1j26</link>
      <guid>https://dev.to/faraz_s_0a6e70a4bbdc6622/stillroot-a-quiet-plant-companion-for-my-friend-rohan-1j26</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;I built &lt;strong&gt;Stillroot&lt;/strong&gt;, a quiet plant-care companion for my friend &lt;strong&gt;Rohan&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The project is built around an everyday dilemma: a few plants on a windowsill, an upcoming weekend away, and the question, &lt;em&gt;"Will someone need to check the soil while I'm gone?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It's set up as a working gift prototype. The demo comes preloaded with sample data for a pothos, monstera, and basil so anyone can take it for a spin before Rohan connects his real sensors.&lt;/p&gt;

&lt;p&gt;Stillroot focuses on three things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A 7-day moisture forecast with an estimated range.&lt;/li&gt;
&lt;li&gt;A care plan that adapts to how long he'll be away, plus a ready-to-share note for a friend who's house-sitting.&lt;/li&gt;
&lt;li&gt;A compact, on-device Gemma companion that explains the forecast in plain English.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The interface is intentionally simple: one plant, one forecast, and one clear action. If a sensor reading looks stale, the app flags it before making any predictions. And if dry soil is forecasted while he's traveling, it suggests asking a friend to check on the plant instead of guessing a generic watering schedule.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;&lt;a href="https://stillroot.onrender.com" rel="noopener noreferrer"&gt;Open Stillroot on Render&lt;/a&gt;&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%2Fs5e418mu3a0k68xf2au9.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%2Fs5e418mu3a0k68xf2au9.jpg" alt="Stillroot showing a recorded TabPFN forecast, a six-day trip plan, local Gemma companion, and measured results" width="800" height="1384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Try this quick walkthrough:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Choose &lt;strong&gt;Basil&lt;/strong&gt; and slide &lt;strong&gt;Days away&lt;/strong&gt; to 7. The status updates to &lt;strong&gt;ASK FRIEND&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Turn on &lt;strong&gt;Simulate a stale sensor reading&lt;/strong&gt; to see it switch to &lt;strong&gt;VERIFY SENSOR&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Turn that off and click &lt;strong&gt;Before I water&lt;/strong&gt; to watch Gemma generate advice locally in your browser.&lt;/li&gt;
&lt;li&gt;Head to &lt;strong&gt;Try your own CSV history&lt;/strong&gt; and upload the included sample file to see custom predictions in action.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Note: Since this runs on Render's free tier, the demo may take around a minute to spin up if it hasn't been visited recently. Gemma downloads on the first run (~350 MB on WebGPU, ~850 MB on CPU fallback) and is cached in your browser for subsequent visits.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/faraz-shamim/stillroot" rel="noopener noreferrer"&gt;GitHub: faraz-shamim/stillroot&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The repository includes the frontend app, local prediction runtime, dataset generator, forecast experiments, raw benchmark files, and deployment config. Application code is MIT licensed; TabPFN and Gemma retain their respective licenses.&lt;/p&gt;

&lt;p&gt;To run it locally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm ci
npm run build
python &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
python &lt;span class="nt"&gt;-m&lt;/span&gt; uvicorn backend.app:app &lt;span class="nt"&gt;--host&lt;/span&gt; 127.0.0.1 &lt;span class="nt"&gt;--port&lt;/span&gt; 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;code&gt;http://127.0.0.1:8000&lt;/code&gt;. The README includes instructions for reproducing the TabPFN experiments and running predictions on custom CSVs.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  TabPFN provides the forecast
&lt;/h3&gt;

&lt;p&gt;I used &lt;strong&gt;Prior Labs' TabPFN v2&lt;/strong&gt; running on CPU, feeding it historical soil moisture, temperature, humidity, light hours, pot size, and days since watering to predict the next reading.&lt;/p&gt;

&lt;p&gt;To evaluate accuracy, I benchmarked it across 294 rows of data spanning 42 watering cycles, split cleanly by full cycle (196 train / 49 calibration / 49 test) so readings from the same drying cycle never leaked across splits.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model / Baseline&lt;/th&gt;
&lt;th&gt;Error (MAE in relative moisture points)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TabPFN v2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.4890 MAE&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mean training-drop baseline&lt;/td&gt;
&lt;td&gt;0.9766 MAE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Last-reading baseline&lt;/td&gt;
&lt;td&gt;6.2986 MAE&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;TabPFN cut prediction error by roughly &lt;strong&gt;50%&lt;/strong&gt; compared to the mean-drop baseline, achieving 91.8% empirical coverage on a 90% prediction interval.&lt;/p&gt;

&lt;p&gt;The hosted demo serves precomputed TabPFN outputs for fast load times and a light Render footprint, while the local Python runtime allows running TabPFN directly on custom CSV uploads.&lt;/p&gt;

&lt;p&gt;You can view the &lt;a href="https://github.com/faraz-shamim/stillroot/blob/main/web/public/data/tabpfn-report.json" rel="noopener noreferrer"&gt;measurement report&lt;/a&gt;, &lt;a href="https://github.com/faraz-shamim/stillroot/blob/main/web/public/data/data-card.json" rel="noopener noreferrer"&gt;dataset card&lt;/a&gt;, and &lt;a href="https://github.com/faraz-shamim/stillroot/blob/main/ml/forecast.py" rel="noopener noreferrer"&gt;experiment code&lt;/a&gt; in the repo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gemma makes the numbers understandable
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Google's Gemma 3 270M instruction model&lt;/strong&gt; runs right inside the user's browser via a Web Worker using Transformers.js and ONNX Runtime. The app packages the plant's recent telemetry and current care signal into a concise prompt, and the model explains the situation conversationally. Because inference runs client-side, sensor data never leaves the device.&lt;/p&gt;

&lt;p&gt;On WebGPU, Gemma answers questions like &lt;em&gt;"What should I check before I water?"&lt;/em&gt; in about &lt;strong&gt;7.9 seconds&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;One practical detail from the build: the latest embedding operator worked smoothly on WebGPU but broke under WASM. Pinning an earlier compatible conversion resolved the issue for the CPU fallback. Deterministic logic always guides the signal, so the AI focuses on explaining the plan clearly rather than making unpredictable watering decisions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Render makes it easy to give away
&lt;/h3&gt;

&lt;p&gt;A lightweight FastAPI service on &lt;strong&gt;Render's free plan&lt;/strong&gt; serves the frontend, static prediction assets, and care-policy endpoints. Because Gemma runs directly in the client and TabPFN runs locally during development, the backend stays lean and doesn't need PyTorch or heavy model dependencies in production.&lt;/p&gt;

&lt;p&gt;The full stack runs reliably on &lt;strong&gt;$0 in infrastructure costs and API fees&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;For this gift, openness means Rohan actually understands how his plant monitor works.&lt;/p&gt;

&lt;p&gt;Nothing is hidden behind a black box: the care logic is a short, transparent function, the forecast model and benchmarks are easy to inspect, and Gemma runs directly on his hardware without relying on an external API or sending personal home data over the wire. If he wants to tweak the thresholds, test a new plant, or build a version for someone else, the whole system is his to modify.&lt;/p&gt;

&lt;p&gt;Open weights and open tooling made it possible to build an intelligent, responsive assistant that costs nothing to run and respects user privacy by design.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of TabPFN&lt;/strong&gt; — Fast, tabular time-series forecasts evaluated on cycle-aware splits with solid baseline gains.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma&lt;/strong&gt; — A 270M open-weight model running entirely in the browser via WebGPU/WASM for private, on-device guidance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Render&lt;/strong&gt; — A clean full-stack deployment combining FastAPI and static frontend assets on a free-tier web service.&lt;/li&gt;
&lt;/ul&gt;

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