<?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: Faisal Ahmad</title>
    <description>The latest articles on DEV Community by Faisal Ahmad (@fabc14).</description>
    <link>https://dev.to/fabc14</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%2F3741108%2Fe7e80fb8-6ef4-40c1-ba6d-9d1f114fbe25.jpeg</url>
      <title>DEV Community: Faisal Ahmad</title>
      <link>https://dev.to/fabc14</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fabc14"/>
    <language>en</language>
    <item>
      <title>Mumblebox writes the three replies I keep not sending, then stops</title>
      <dc:creator>Faisal Ahmad</dc:creator>
      <pubDate>Sat, 24 Oct 2026 17:01:45 +0000</pubDate>
      <link>https://dev.to/fabc14/mumblebox-writes-the-three-replies-i-keep-not-sending-then-stops-e8o</link>
      <guid>https://dev.to/fabc14/mumblebox-writes-the-three-replies-i-keep-not-sending-then-stops-e8o</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;The first version of this was one calmer sentence. That is not the project. Mumblebox takes the message you will not send and writes three different replies: soft, brief, and plain. You pick one. The page does not send it.&lt;/p&gt;

&lt;p&gt;Open the local desk from the project folder. The mark is three cards and a seal. The photograph is the same desk: one crumpled note, three written cards.&lt;/p&gt;

&lt;p&gt;The samples are made up. Same rule as &lt;a href="https://dev.to/fabc14/closetab-counts-a-stalls-night-note-without-inventing-a-rupee-3ofa"&gt;CloseTab&lt;/a&gt; and &lt;a href="https://dev.to/dannwaneri/bank-alerts-to-a-day-book-with-a-local-gemma-21dl"&gt;Daniel Nwaneri's day-book&lt;/a&gt;: Gemma may choose the words, and the code rejects an invented number. Three identical replies are rejected too.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you get
&lt;/h2&gt;

&lt;p&gt;Paste who it is for, and the blunt note. Press Draft three.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tone&lt;/th&gt;
&lt;th&gt;What it is&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Soft&lt;/td&gt;
&lt;td&gt;The one you can send without starting a fight.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Brief&lt;/td&gt;
&lt;td&gt;Two sentences. The request, then stop.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plain&lt;/td&gt;
&lt;td&gt;No apology. The fact and the ask.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A command-line nap does the same thing to the first file in &lt;code&gt;inbox/&lt;/code&gt; and leaves the rest. Undo puts that note back and deletes the three drafts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it stays on this machine
&lt;/h2&gt;

&lt;p&gt;The note is the version you would not paste into someone else's account. Gemma 2 2B runs through Ollama here. There is no per-note bill. When the model invents a number, or returns the same sentence three times, that answer is thrown out.&lt;/p&gt;

&lt;p&gt;Code: &lt;a href="https://github.com/fab-c14/mumblebox" rel="noopener noreferrer"&gt;github.com/fab-c14/mumblebox&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; Gemma 2 2B writes the three drafts. The program runs it only on this machine.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>gemma</category>
      <category>python</category>
    </item>
    <item>
      <title>CloseTab counts a stall's night note without inventing a rupee</title>
      <dc:creator>Faisal Ahmad</dc:creator>
      <pubDate>Sat, 17 Oct 2026 16:35:59 +0000</pubDate>
      <link>https://dev.to/fabc14/closetab-counts-a-stalls-night-note-without-inventing-a-rupee-3ofa</link>
      <guid>https://dev.to/fabc14/closetab-counts-a-stalls-night-note-without-inventing-a-rupee-3ofa</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;A chai stall already writes the night on a scrap of paper. CloseTab turns that scrap into the bill they lock up with: expected sales, what is in the box, every cost, the gap, and what to buy tomorrow.&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%2Fsldmep8tu4ezcaxfafi6.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%2Fsldmep8tu4ezcaxfafi6.png" alt="CloseTab. The hero says count the box before you lock it, and the Night kettle sample shows a gap of 490 rupees."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The person who would pay for this is not looking for another chat. They are locking a stall, a weekend table, or a small cafe. The note already exists. The missing piece is a close that does not invent a rupee, and does not send the cash total to a paid API.&lt;/p&gt;

&lt;p&gt;This week a lot of side hustles are invoice sorters, and that is a real chore. &lt;a href="https://dev.to/sirko007/i-built-a-100-local-invoice-reader-with-ollama-n8n-the-real-trick-was-teaching-it-not-to-guess-3113"&gt;Alberto Landa's local invoice reader&lt;/a&gt; is the one I kept next to this build, because the part that mattered was teaching the model not to guess. &lt;a href="https://dev.to/dekita/i-built-an-offline-invoice-sorter-for-freelancers-then-measured-whether-local-inference-is-35p4"&gt;Dekita measured a local invoice sorter&lt;/a&gt; and found the money is a wash. &lt;a href="https://dev.to/wellington_filipe_fccda4c/the-invoice-on-the-counter-a-local-first-cost-reader-for-small-restaurants-3bo"&gt;Wellington Filipe's counter reader&lt;/a&gt; uses arithmetic to catch the lines a model gets wrong.&lt;/p&gt;

&lt;p&gt;CloseTab is the same distrust of a guessed number, pointed at a different hour. Not the supplier invoice in the morning. The cash box at night.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the night looks like
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faobg4pfwdycozqexqj00.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%2Faobg4pfwdycozqexqj00.jpg" alt="A daylight stall counter, a blank slip, and a steel cash tray."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The page opens on Night kettle:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;stall: Night kettle
date: 2026-10-15
14 chai 20
9 samosa 30
2 bun-maska 25
samosa leftover 0
chai leftover 6
cash 680
upi 410
bought milk 90
bought gas 40
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Expected sales are 14×20 + 9×30 + 2×25 = &lt;strong&gt;₹600&lt;/strong&gt;. Counted money is 680 + 410 = &lt;strong&gt;₹1,090&lt;/strong&gt;. The gap is &lt;strong&gt;₹490&lt;/strong&gt;. Milk and gas are &lt;strong&gt;₹130&lt;/strong&gt;. Left after costs is &lt;strong&gt;₹470&lt;/strong&gt;. Samosa is sold out. Chai still has 6, which is above the restock line of 5, so it is not flagged.&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%2Fd0knzffaneyj7mw9rem4.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%2Fd0knzffaneyj7mw9rem4.png" alt="Night kettle, line by line. Expected 600, counted 1,090, costs 130, gap 490, and 470 left after costs."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;People do not write notes in one grammar. This counts too:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;stall : named 23
23/10/2026
test - 230
test2 - 230
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Stall name "named 23". Date 23 October 2026. Two sales at ₹230. Expected &lt;strong&gt;₹460&lt;/strong&gt;. Nothing was written for cash, UPI, or card, so the box is &lt;strong&gt;₹0&lt;/strong&gt; and the gap is &lt;strong&gt;−₹460&lt;/strong&gt;. The page does not pretend those two lines were never sold.&lt;/p&gt;
&lt;h2&gt;
  
  
  The desk
&lt;/h2&gt;

&lt;p&gt;The note stays on the left. The bill prints on the right. It is not a message thread.&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%2Feh9rh54bg6qae53svbd6.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%2Feh9rh54bg6qae53svbd6.png" alt="Tonight's close. The Night kettle note is on the left and the printed bill is on the right."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In that shot the counter is ready and Gemma is not running, so the parser built the sheet. The rupees match the note either way. If Ollama is up and Gemma stays inside the numbers that were written, the page says Gemma read the note and the code counted the rupees.&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%2F6ef90nx9nogw2q9srre9.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%2F6ef90nx9nogw2q9srre9.jpg" alt="Coins and a blank slip, which is the voice section's picture."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can say a line and it is appended to the note. Hear the close reads the gap and each cost back. The bars move only while a voice is on.&lt;/p&gt;
&lt;h2&gt;
  
  
  How a number is allowed to exist
&lt;/h2&gt;


&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TD
  note[The night note]
  gemma[Gemma 2 2B on this laptop]
  parser[The parser]
  check{Every number was written in the note?}
  ledger[Python ledger]
  bill[The bill]
  note --&amp;gt; gemma
  note --&amp;gt; parser
  gemma --&amp;gt; check
  check --&amp;gt;|yes| ledger
  check --&amp;gt;|no, or Gemma did not answer| parser
  parser --&amp;gt; ledger
  ledger --&amp;gt; bill&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;Gemma, through Ollama, may read the words into a small JSON note: stall, date, lines, cash, UPI, card, and costs. The call gives up after eight seconds.&lt;/p&gt;

&lt;p&gt;Python does every rupee after that. A price, a leftover, a quantity other than the implied 1, or a cost has to appear as a digit in the note. If Gemma uses a number that was never written, that reading is thrown out and the parser is used. A made-up 999 does not become a sale. Zero in the cash box is allowed when the note never mentions cash, because "nothing written" is not the same as an invented total.&lt;/p&gt;

&lt;p&gt;A line with no price does not get filled in as ₹0. Expected sales, the gap, and profit stay blank until every sale has a price. A blank note returns no totals at all.&lt;/p&gt;

&lt;p&gt;That split is the product. The model is there to read a messy line. It is a bad accountant. The ledger is the accountant.&lt;/p&gt;

&lt;p&gt;The same grammar lives in &lt;code&gt;closetab/parse.py&lt;/code&gt; and in &lt;code&gt;web/src/ledger.ts&lt;/code&gt;, so the page can count before the API answers. Ten tests cover the ledger and the API, including the slash date and the dash prices above. GitHub Actions runs them on every push.&lt;/p&gt;
&lt;h2&gt;
  
  
  Run it
&lt;/h2&gt;

&lt;p&gt;There is no hosted demo. I am not entering a hosting category. &lt;code&gt;render.yaml&lt;/code&gt; is a blueprint, and it has not been deployed.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt pytest
pytest
uvicorn closetab.app:app &lt;span class="nt"&gt;--reload&lt;/span&gt; &lt;span class="nt"&gt;--port&lt;/span&gt; 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;In another terminal:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;web
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Open &lt;a href="http://127.0.0.1:5173" rel="noopener noreferrer"&gt;http://127.0.0.1:5173&lt;/a&gt;. Optional, for the Gemma path: &lt;code&gt;ollama pull gemma2:2b&lt;/code&gt;.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/fab-c14" rel="noopener noreferrer"&gt;
        fab-c14
      &lt;/a&gt; / &lt;a href="https://github.com/fab-c14/closetab" rel="noopener noreferrer"&gt;
        closetab
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      End-of-day closer for market stalls. Gemma reads the note. Python counts the rupees.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;CloseTab&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;End-of-day closer for market stalls and small cafes. Paste the night's note. Gemma reads it into a small JSON note. Python does every rupee.&lt;/p&gt;

&lt;p&gt;Built for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12" rel="nofollow"&gt;Hacktoberfest 2026 Week 2 Side Hustle challenge&lt;/a&gt;. This repository started during that window.&lt;/p&gt;

&lt;p&gt;The hero wave is the Waves component from &lt;a href="https://reactbits.dev/backgrounds/waves" rel="nofollow noopener noreferrer"&gt;React Bits&lt;/a&gt;, used from its published source. The ledger, the note parser, and the rest of the page are original.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Run it&lt;/h2&gt;
&lt;/div&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;pip install -r requirements.txt pytest
pytest
ollama pull gemma2:2b
uvicorn closetab.app:app --reload --port 8000&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;In another terminal:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c1"&gt;cd&lt;/span&gt; web
npm install
npm run dev&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Open &lt;a href="http://127.0.0.1:5173" rel="nofollow noopener noreferrer"&gt;http://127.0.0.1:5173&lt;/a&gt;. If Ollama is not running, the sheet still builds from the written lines and the page says so.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Tracks this project can enter&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Only list a track in the DEV post after that piece is actually in use.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gemma: local Ollama model &lt;code&gt;gemma2:2b&lt;/code&gt; reads the note.&lt;/li&gt;
&lt;li&gt;Render: &lt;code&gt;render.yaml&lt;/code&gt; hosts the…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/fab-c14/closetab" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The hero wave is the Waves component from &lt;a href="https://reactbits.dev/backgrounds/waves" rel="noopener noreferrer"&gt;React Bits&lt;/a&gt;, used from its published source. The ledger, the parser, and the rest of the page are original. The mark in the corner is the CloseTab logo, a green tile with a torn receipt.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why open innovation matters here
&lt;/h2&gt;

&lt;p&gt;A closed chat API can read a note. It can also charge for every close, keep the night's takings on someone else's server, and fill a blank with a confident guess.&lt;/p&gt;

&lt;p&gt;CloseTab is the other shape. The model runs on the laptop, so the cash note does not have to leave it. There is no token invoice for arithmetic a stall does every night. The model name is &lt;code&gt;CLOSETAB_MODEL&lt;/code&gt;, so a later Gemma can replace &lt;code&gt;gemma2:2b&lt;/code&gt; without a new ledger. And when the model is down, or when it uses a number that was never written, the close still happens from the text on the page.&lt;/p&gt;

&lt;p&gt;Open weight is what makes the price of this product possible. The thing someone would pay for is the close. The model is there to read. The code is there so the rupees stay honest.&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; &lt;code&gt;gemma2:2b&lt;/code&gt; through Ollama reads the note locally. The ledger rejects any number Gemma did not find in the text and falls back to the parser.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of GitHub Copilot.&lt;/strong&gt; The qualifying piece is GitHub Actions. &lt;code&gt;.github/workflows/test.yml&lt;/code&gt; runs the ledger and API tests on every push. Copilot did not write this project.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>gemma</category>
      <category>python</category>
    </item>
    <item>
      <title>I asked AI models to build web apps. Most of them shipped a fake server inside the page.</title>
      <dc:creator>Faisal Ahmad</dc:creator>
      <pubDate>Sun, 11 Oct 2026 10:15:57 +0000</pubDate>
      <link>https://dev.to/fabc14/i-asked-ai-models-to-build-web-apps-most-of-them-shipped-a-fake-server-inside-the-page-5hl0</link>
      <guid>https://dev.to/fabc14/i-asked-ai-models-to-build-web-apps-most-of-them-shipped-a-fake-server-inside-the-page-5hl0</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/kaggle-2026-09-23"&gt;Kaggle Benchmarking Challenge&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kaggle benchmark:&lt;/strong&gt; &lt;a href="https://www.kaggle.com/benchmarks/neondev0/realitybench" rel="noopener noreferrer"&gt;realitybench&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;AI coding demos show the happy path. The form renders, you click the button, and a green success message appears. I wanted the score to change when a real user shows up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RealityBench&lt;/strong&gt; gives a model a spec for one of twelve small web apps, then opens the page in a headless browser and uses it the way a person would:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the server answers with a 500, or a 409 when a slot is already taken&lt;/li&gt;
&lt;li&gt;they double-click Pay&lt;/li&gt;
&lt;li&gt;they submit an empty form, a negative quantity, or a &lt;code&gt;.exe&lt;/code&gt; instead of a PDF&lt;/li&gt;
&lt;li&gt;they only use the keyboard, or a 375px phone screen&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The number on the Kaggle leaderboard is one overall score from 0 to 100. It is weighted 40% toward the happy path and 60% toward those real-user checks. The grader only counts text a person can see, and it records whether &lt;code&gt;window.fetch&lt;/code&gt; and &lt;code&gt;XMLHttpRequest&lt;/code&gt; are still the browser's own functions. A page that replaces them answers its own requests and never contacts the server it was told to call.&lt;/p&gt;

&lt;h2&gt;
  
  
  Models Tested
&lt;/h2&gt;

&lt;p&gt;The leaderboard is the four models that finished a run on every task:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Opus 5.5&lt;/strong&gt;, the strongest coding model in the lineup&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPT-6 Sol&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gemini 3.8 Flash&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini 3.7 Flash&lt;/strong&gt;, the fast model people use to generate UI in bulk&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Same twelve prompts. One run per task. The cell is that run's overall score.&lt;/p&gt;

&lt;h2&gt;
  
  
  Findings
&lt;/h2&gt;

&lt;p&gt;These are the scores on the &lt;a href="https://www.kaggle.com/benchmarks/neondev0/realitybench" rel="noopener noreferrer"&gt;realitybench leaderboard&lt;/a&gt;. Each cell matches the benchmark page.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Claude Opus 5.5&lt;/th&gt;
&lt;th&gt;GPT-6 Sol&lt;/th&gt;
&lt;th&gt;Gemini 3.8 Flash&lt;/th&gt;
&lt;th&gt;Gemini 3.7 Flash&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;realitybench-auth-login&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;realitybench-search&lt;/td&gt;
&lt;td&gt;43.0&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;38.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;realitybench-checkout&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;55.0&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;55.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;realitybench-file-upload&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;93.0&lt;/td&gt;
&lt;td&gt;93.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;realitybench-crud-dashboard&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;72.5&lt;/td&gt;
&lt;td&gt;22.0&lt;/td&gt;
&lt;td&gt;95.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;realitybench-booking&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;82.0&lt;/td&gt;
&lt;td&gt;82.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;realitybench-chat&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;realitybench-product-page&lt;/td&gt;
&lt;td&gt;90.0&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;82.0&lt;/td&gt;
&lt;td&gt;67.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;realitybench-admin-table&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;70.0&lt;/td&gt;
&lt;td&gt;70.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;realitybench-settings&lt;/td&gt;
&lt;td&gt;82.0&lt;/td&gt;
&lt;td&gt;80.0&lt;/td&gt;
&lt;td&gt;82.0&lt;/td&gt;
&lt;td&gt;82.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;realitybench-api-form&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;67.0&lt;/td&gt;
&lt;td&gt;67.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;realitybench-workflow&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;80.0&lt;/td&gt;
&lt;td&gt;82.0&lt;/td&gt;
&lt;td&gt;82.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Overall&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;92.9&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;90.6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;81.7&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;77.6&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Opus leads, at 92.9, and it scores 100 on nine of the twelve tasks. Its miss is search, at 43. GPT-6 Sol is close behind at 90.6, then drops on checkout (55) and the task dashboard (72.5). Gemini 3.8 Flash is at 81.7 and falls to 22 on the task dashboard, the lowest cell in the table. Gemini 3.7 Flash is at 77.6, with search at 38 and checkout at 55.&lt;/p&gt;

&lt;p&gt;Login and chat are 100 for every model. Settings sits in a band from 80 to 82 for every model. The tasks that separate them are search, checkout, and the task dashboard.&lt;/p&gt;

&lt;h3&gt;
  
  
  Models build a fake backend into the page
&lt;/h3&gt;

&lt;p&gt;The prompt says to POST to an API. Several generated pages replace &lt;code&gt;fetch&lt;/code&gt; and answer locally. This is Gemini 3.7 Flash's booking page, shortened only by cutting a 409 branch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* MOCK SERVER INTERCEPTOR (For self-contained standalone execution)
   Ensures fetch('/api/book') behaves accurately in standalone browsers. */&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;originalFetch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fetch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;init&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;endsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/api/book&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;450&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;confirmed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;booking_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;BK-&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;900&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;originalFetch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The page can show a booking id. Nothing was booked. The comment in the page says the mock is there so the file runs on its own.&lt;/p&gt;

&lt;p&gt;Opus often writes the same kind of mock, then leaves it off unless the URL has &lt;code&gt;?demo&lt;/code&gt; or &lt;code&gt;?mock&lt;/code&gt;. Its settings page is the one that starts with the mock switched on.&lt;/p&gt;

&lt;p&gt;The leaderboard score is not that flag. A page can still lose points for a double submit, a bad empty state, or a control the grader cannot press. Search is the clearest case: Opus at 43, Gemini 3.7 Flash at 38, and the other two models at 100.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I'd measure next
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;More than one run per task, so the table can show a range.&lt;/li&gt;
&lt;li&gt;The same prompts with one added line: a real backend is already running at this URL. I want to know whether the fake server disappears.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  My Benchmark
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Kaggle:&lt;/strong&gt; &lt;a href="https://www.kaggle.com/benchmarks/neondev0/realitybench" rel="noopener noreferrer"&gt;realitybench&lt;/a&gt;. Twelve tasks, four models, and the scores in the table above.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code:&lt;/strong&gt; &lt;a href="https://github.com/fab-c14/realitybench" rel="noopener noreferrer"&gt;github.com/fab-c14/realitybench&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can grade a page yourself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv &lt;span class="nb"&gt;sync&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; uv run playwright &lt;span class="nb"&gt;install &lt;/span&gt;chromium
uv run realitybench prompt checkout &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; spec.txt
uv run realitybench grade checkout page.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;grade&lt;/code&gt; accepts a plain HTML file or a model reply with the HTML in a code block. If the page replaced &lt;code&gt;fetch&lt;/code&gt; or &lt;code&gt;XMLHttpRequest&lt;/code&gt;, it prints a warning.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>kagglechallenge</category>
      <category>ai</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>WildEcho: Offline Backcountry Acoustic Nature Explorer &amp; Eyes-Free Audio Field Guide</title>
      <dc:creator>Faisal Ahmad</dc:creator>
      <pubDate>Thu, 08 Oct 2026 08:37:31 +0000</pubDate>
      <link>https://dev.to/fabc14/wildecho-offline-backcountry-acoustic-nature-explorer-eyes-free-audio-field-guide-6k3</link>
      <guid>https://dev.to/fabc14/wildecho-offline-backcountry-acoustic-nature-explorer-eyes-free-audio-field-guide-6k3</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;h1&gt;
  
  
  WildEcho 🌲🔊: Offline Backcountry Acoustic Nature Explorer &amp;amp; Eyes-Free Audio Field Guide
&lt;/h1&gt;

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

&lt;p&gt;Most outdoor and birding apps make the same mistake: they force you to pull a phone from your pocket, squint at a bright screen in midday sun, scroll through dropdowns, and tap buttons while the rare songbird you were listening to flutters away into the brush.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WildEcho flips the paradigm completely.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It is an eyes-free, 100% offline backcountry nature explorer designed around a single guiding principle:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Slip your phone into your pocket, put on your earbuds, and listen to the forest. Touch grass without screen fatigue."&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                              [ WILD FOREST SOUNDSCAPE ]
                         (Songbirds, Wind, Water, Distant Road)
                                          │
                                          ▼
                             [ Continuous Audio Buffer ]
                                          │
                                          ▼
                 ┌──────────────────────────────────────────────────┐
                 │       Offline Bioacoustic Signal Processing      │
                 │                                                  │
                 │  • Welch Power Spectral Density (PSD)            │
                 │  • NDSI Index (Biophony 2–11kHz vs Anthrophony)  │
                 │  • ACI Complexity Index (Harmonic Temporal Flux) │
                 │  • Spectral Centroid &amp;amp; Resonance Peaks           │
                 └────────────────────────┬─────────────────────────┘
                                          │
                                          ▼
                 ┌──────────────────────────────────────────────────┐
                 │        Offline Wildlife Biometric Matcher        │
                 │                                                  │
                 │  • 12 Embedded Native Species Signatures         │
                 │  • Harmonic Proximity &amp;amp; Peak Tracking            │
                 │  • Habitat (Forest/Wetland) &amp;amp; Seasonal Priors    │
                 └────────────────────────┬─────────────────────────┘
                                          │
                                          ▼
                 ┌──────────────────────────────────────────────────┐
                 │      Google Gemma 2 Naturalist Reasoning Brain   │
                 │                                                  │
                 │  • Eyes-Free Spoken Whisper Prompt Contract      │
                 │  • Wild Foraging Clues (Chanterelles, Morels)    │
                 │  • Backcountry Trail Safety (Snags, Shaded Ledges│
                 └────────────────────────┬─────────────────────────┘
                                          │
                                          ▼
                 ┌──────────────────────────────────────────────────┐
                 │             Eyes-Free Audio Delivery             │
                 │                                                  │
                 │  • ElevenLabs Turbo v2.5 / Web Speech API Audio  │
                 │  • Shannon-Wiener Ecological Diversity Index (H) │
                 │  • Silent Offline JSON Waypoint Field Journal    │
                 └──────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  🌿 The Core Backcountry Experience:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;📱 Phone in Pocket&lt;/strong&gt;: Tuck your device away in your backpack or hip pocket. No screen glare, no menus, zero notification anxiety.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🎙️ 100% Offline Bioacoustics&lt;/strong&gt;: Edge DSP algorithms compute soundscape purity (&lt;strong&gt;NDSI&lt;/strong&gt; — Normalized Difference Soundscape Index) and songbird complexity (&lt;strong&gt;ACI&lt;/strong&gt; — Acoustic Complexity Index) locally with &lt;strong&gt;zero cellular reception&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🎧 Google Gemma 2 Earbud Whispers&lt;/strong&gt;: On-device open-weight LLM whispers concise, poetic audio notes (species name, foraging associations, and trail safety) into your wireless earbuds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📊 Automatic Biodiversity Journal&lt;/strong&gt;: Silently logs every waypoint encounter and calculates your trail's &lt;strong&gt;Shannon-Wiener Ecological Diversity Index ($H$)&lt;/strong&gt; for review once you return home.&lt;/li&gt;
&lt;/ol&gt;


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

&lt;ul&gt;
&lt;li&gt;🌐 &lt;strong&gt;Interactive Trail Explorer &amp;amp; Audio Simulator&lt;/strong&gt;: Run locally via &lt;code&gt;uv run wildecho serve --port 8000&lt;/code&gt; (FastAPI + Tailwind + Web Speech API + Web Audio API frequency synthesizer).&lt;/li&gt;
&lt;li&gt;🌲 &lt;strong&gt;Terminal Eyes-Free Expedition Mode&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  uv run wildecho listen &lt;span class="nt"&gt;--trail&lt;/span&gt; &lt;span class="s2"&gt;"Cascade Mountain Ridge"&lt;/span&gt; &lt;span class="nt"&gt;--habitat&lt;/span&gt; dense_forest &lt;span class="nt"&gt;--season&lt;/span&gt; autumn
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Live Simulation Output:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+----------------------------- Expedition Active -----------------------------+
|  WILDECHO   - Offline Backcountry Acoustic Nature Explorer                  |
|  [Eyes-Free Mode] Phone in pocket, earbuds active. Touch grass.             |
|                                                                             |
|  Trail:     Cascade Mountain Ridge Walk                                     |
|  Habitat:   Dense Forest                                                    |
|  Season:    Autumn | Engine: Offline Gemma 2 &amp;amp; Edge Bioacoustics            |
+-----------------------------------------------------------------------------+

---------------- Trail Waypoint #01 - Ambient Sampling Window -----------------
 Soundscape Quality:   Pristine Wilderness (92% Pure Nature)
 Biophony Index (NDSI): [-1.0 ==================&amp;gt;          +1.0] (+0.84)
 Acoustic Complexity:  14.5 ACI | Peak: 3402 Hz

                  Detected Biological Species (Bioacoustics)                   
+-----------------------------------------------------------------------------+
| #   | Common Name    | Scientific Name | Class     | Peak Freq | Confidence |
|-----+----------------+-----------------+-----------+-----------+------------|
| 1   | Wood Thrush    | Hylocichla      | BIRD      |   3402 Hz |      98.0% |
|     |                | mustelina       |           |           |            |
+-----------------------------------------------------------------------------+

+--------------------------- Earbud Audio Briefing ---------------------------+
|  [WHISPER DELIVERED TO EARBUDS]                                             |
|                                                                             |
| "Listen to the canopy. That liquid flute cascade is a Wood Thrush. Take a   |
| breath and enjoy the moment."                                               |
|                                                                             |
|  🍄 Foraging Clue: Mature deciduous canopy with deep leaf litter; prime     |
|     habitat for Chanterelles and Black Trumpet mushrooms.                   |
|  ⚠️ Trail Safety: Inhabits shaded interior woods; keep bearings on trail    |
|     landmarks.                                                              |
+----- Audio Duration: ~7.7s | Synthesized by Google Gemma 2 Edge ------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;WildEcho is 100% open-source under the MIT license:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/fab-c14" rel="noopener noreferrer"&gt;
        fab-c14
      &lt;/a&gt; / &lt;a href="https://github.com/fab-c14/wildecho" rel="noopener noreferrer"&gt;
        wildecho
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;WildEcho 🌲🔊&lt;/h1&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Offline Backcountry Acoustic Nature Explorer &amp;amp; Eyes-Free Audio Field Guide&lt;/h3&gt;
&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Built for Hacktoberfest 2026: Open-Source AI Challenge (Week 1: "Touch Grass")&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://www.python.org/downloads/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/36cf3d0f7992a33a063d3833577d62204f8934d82b69874c086390608db4947c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f707974686f6e2d332e31312b2d626c75652e737667" alt="Python 3.11+"&gt;&lt;/a&gt;
&lt;a href="https://ai.google.dev/gemma" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/4aa6a5604e025813433a253e0213aae9e9f8bd8d1f50ceff3d3ecb4e6931dc19/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f436f72652532304d6f64656c2d476f6f676c6525323047656d6d6125323032253230284f70656e2d2d576569676874292d707572706c652e737667" alt="Core Model: Google Gemma 2"&gt;&lt;/a&gt;
&lt;a href="https://pylint.org/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/55c28251d5ca1bec9bf62268b6241b856b359aeb4431ab1772c79f59ba9855f6/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f70796c696e742d31302e303025324631302d627269676874677265656e2e737667" alt="Code Quality: Pylint 10.00/10"&gt;&lt;/a&gt;
&lt;a href="https://docs.astral.sh/ruff/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0d49222b1f5541bf90f916459b36a1dbcf14214f914f4a169516102c82026c7d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f727566662d636c65616e2d677265656e2e737667" alt="Linter: Ruff"&gt;&lt;/a&gt;
&lt;a href="https://elevenlabs.io/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/ad06a95192c26097eac2005cc73d6219dd07470bcc23cc582baba0b2c81eb122/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f576869737065722d456c6576656e4c616273253230547572626f2d6f72616e67652e737667" alt="Audio Engine: ElevenLabs"&gt;&lt;/a&gt;
&lt;a href="https://render.com" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/5ba3f2d8153bdf40b2567fe539308c2f3f7737e30d09a96cdad23d33081b5ba2/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4465706c6f792d52656e646572253230426c75657072696e742d3436453342372e737667" alt="Deploy: Render Blueprint"&gt;&lt;/a&gt;
&lt;a href="https://opensource.org/licenses/MIT" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/fdf2982b9f5d7489dcf44570e714e3a15fce6253e0cc6b5aa61a075aac2ff71b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d79656c6c6f772e737667" alt="License: MIT"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🌿 The Core Philosophy: "Touch Grass, Keep Screen in Pocket"&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Modern outdoor and birding apps demand that you pull out your phone, unlock a bright glass screen under direct sunlight, navigate clunky menus, and squint at photos while the animal flees into the brush.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;WildEcho flips the paradigm completely:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero Screen Time&lt;/strong&gt;: Put your phone in your pocket or backpack with your wireless earbuds on. Touch grass, feel the breeze, and hike without digital fatigue.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Continuous Backcountry Listening&lt;/strong&gt;: Passively samples environmental soundscapes in the background via local microphone buffers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;100% Offline Bioacoustics Engine&lt;/strong&gt;: Computes spectral power distributions, Normalized Difference Soundscape Index (&lt;strong&gt;NDSI&lt;/strong&gt;), and Acoustic Complexity Index (&lt;strong&gt;ACI&lt;/strong&gt;) locally on edge hardware with zero cellular signal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open-Weight Gemma 2 Intelligence&lt;/strong&gt;…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/fab-c14/wildecho" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;🔗 &lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/fab-c14/wildecho" rel="noopener noreferrer"&gt;https://github.com/fab-c14/wildecho&lt;/a&gt;&lt;/p&gt;




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

&lt;p&gt;WildEcho unites mathematical bioacoustic signal processing, local on-device LLM reasoning, and modern web audio architecture:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. 🔬 Bioacoustic Signal Processing Pipeline (&lt;code&gt;wildecho/bioacoustics/&lt;/code&gt;)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Normalized Difference Soundscape Index (NDSI)&lt;/strong&gt;: Implements Bernie Krause's Acoustic Niche Hypothesis to separate human drone (Anthrophony: 50–1500 Hz) from biological calls (Biophony: 2000–11000 Hz):
$$\text{NDSI} = \frac{\text{Biophony} - \text{Anthrophony}}{\text{Biophony} + \text{Anthrophony}}$$&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Acoustic Complexity Index (ACI)&lt;/strong&gt;: Implemented based on Pieretti et al. (2011), tracking rapid sound intensity fluctuations across spectrogram bins to detect songbirds without being fooled by steady wind.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Embedded Wildlife Catalog&lt;/strong&gt;: 12 native species across Birds, Amphibians, Mammals, and Insects with acoustic frequency profiles, harmonic ratios, and ecological associations.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. 🧠 Google Gemma 2 Naturalist Reasoning Engine (&lt;code&gt;wildecho/intelligence/&lt;/code&gt;)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Powered by &lt;strong&gt;Google Gemma 2&lt;/strong&gt; (&lt;code&gt;google/gemma-2-2b-it&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Uses a strict &lt;strong&gt;Eyes-Free Audio Prompt Contract&lt;/strong&gt; restricting responses to 2 conversational spoken sentences without markdown, plus wild edible foraging correlations and terrain safety advisories.&lt;/li&gt;
&lt;li&gt;Fallback edge generation ensures 100% operation even on ultra-low-power edge hardware.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. 🎧 Earbud Whisper Streaming (&lt;code&gt;wildecho/audio/&lt;/code&gt; &amp;amp; Web UI)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Streams lifelike naturalist narration into wireless earbuds via &lt;strong&gt;ElevenLabs Turbo v2.5&lt;/strong&gt; when online.&lt;/li&gt;
&lt;li&gt;In the companion web explorer, leverages native browser &lt;strong&gt;Web Speech API (&lt;code&gt;window.speechSynthesis&lt;/code&gt;)&lt;/strong&gt; and &lt;strong&gt;Web Audio API (&lt;code&gt;AudioContext&lt;/code&gt;)&lt;/strong&gt; to speak whispers and synthesize species sound calls directly in judges' headphones.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. ☁️ Turnkey Deployment on Render (&lt;code&gt;render.yaml&lt;/code&gt;)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Declared as an Infrastructure-as-Code service in &lt;code&gt;render.yaml&lt;/code&gt; for automatic zero-downtime deployment on &lt;strong&gt;Render&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;web&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;wildecho&lt;/span&gt;
    &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;python&lt;/span&gt;
    &lt;span class="na"&gt;buildCommand&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pip install uv &amp;amp;&amp;amp; uv sync --no-dev&lt;/span&gt;
    &lt;span class="na"&gt;startCommand&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;uv run uvicorn wildecho.web.app:app --host 0.0.0.0 --port $PORT&lt;/span&gt;
    &lt;span class="na"&gt;plan&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;free&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

&lt;p&gt;In backcountry wilderness, &lt;strong&gt;open-source AI is not an aesthetic preference — it is an absolute necessity:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Backcountry Zero-Connectivity Execution&lt;/strong&gt;: Closed APIs (OpenAI, Claude) require continuous internet. 10 miles deep in a national park with zero cellular towers, closed cloud models are completely dead. Open-weight models like &lt;strong&gt;Google Gemma 2&lt;/strong&gt; run locally on the hiker's device with zero latency and zero signal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hiker Privacy &amp;amp; Location Sovereignty&lt;/strong&gt;: Closed apps frequently beam GPS telemetry, timestamps, and audio to central clouds. WildEcho keeps 100% of location data, trail paths, and audio buffers local.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero Cost &amp;amp; Free Public Science&lt;/strong&gt;: Outdoor adventurers, conservation volunteers, and national park visitors shouldn't have to pay subscription token fees to learn about their local forest ecosystem.&lt;/li&gt;
&lt;/ol&gt;




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

&lt;h3&gt;
  
  
  🌟 Featured Categories:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma ($200 USD):&lt;/strong&gt; WildEcho runs &lt;strong&gt;Google Gemma 2&lt;/strong&gt; (&lt;code&gt;gemma-2-2b-it&lt;/code&gt;) as its core ecological intelligence engine, translating acoustic frequency metrics into eyes-free naturalist field notes and foraging hints.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Render ($200 USD):&lt;/strong&gt; The companion explorer is declared via &lt;code&gt;render.yaml&lt;/code&gt;, providing a one-click deployment blueprint for Render web services with automatic health monitoring.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🤝 Partner Categories:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of ElevenLabs ($100 USD):&lt;/strong&gt; Powers the eyes-free earbud voice streaming pipeline using ElevenLabs Turbo v2.5 (&lt;code&gt;eleven_turbo_v2_5&lt;/code&gt;) for natural, low-latency audio briefings.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clone and explore with uv in seconds:&lt;/span&gt;
git clone https://github.com/fab-c14/wildecho.git
&lt;span class="nb"&gt;cd &lt;/span&gt;wildecho
uv &lt;span class="nb"&gt;sync&lt;/span&gt; &lt;span class="nt"&gt;--all-extras&lt;/span&gt;
uv run wildecho listen &lt;span class="nt"&gt;--habitat&lt;/span&gt; dense_forest
&lt;span class="c"&gt;# Or launch the interactive web companion:&lt;/span&gt;
uv run wildecho serve &lt;span class="nt"&gt;--port&lt;/span&gt; 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Built with love for nature, open-weight AI, and the wilderness.&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Keep your phone in your pocket, listen to the trees, and touch grass! 🌲🎧&lt;/em&gt;&lt;/p&gt;

</description>
      <category>hf26challenge</category>
      <category>devchallenge</category>
      <category>gemma</category>
      <category>python</category>
    </item>
    <item>
      <title>PaperDots UI: Tactile 2D Paper &amp; Ink-Dot Physics with Shadcn Registry CLI (Built for Julian)</title>
      <dc:creator>Faisal Ahmad</dc:creator>
      <pubDate>Sat, 03 Oct 2026 16:38:28 +0000</pubDate>
      <link>https://dev.to/fabc14/paperdots-ui-tactile-2d-paper-ink-dot-physics-with-shadcn-registry-cli-built-for-julian-4m8f</link>
      <guid>https://dev.to/fabc14/paperdots-ui-tactile-2d-paper-ink-dot-physics-with-shadcn-registry-cli-built-for-julian-4m8f</guid>
      <description>&lt;h1&gt;
  
  
  🎨 PaperDots UI: Tactile 2D Paper &amp;amp; Ink-Dot Physics for the Living Web
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This project was built for the **Hacktoberfest 2026 Weekend Challenge: Build for a Friend&lt;/em&gt;* (October 2–5, 2026).*&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  1. The Friend: Meet Julian 🤝
&lt;/h2&gt;

&lt;p&gt;A few days ago, my friend &lt;strong&gt;Julian&lt;/strong&gt;—an independent risograph printmaker, analog synthesist, and digital zine creator—sat down with me over coffee. Julian was working on an interactive web edition of their print publication, &lt;em&gt;"Analog Futures"&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Julian pulled up their laptop, scrolled through several popular component libraries, and sighed:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Look at every web framework today. Tailwind, Shadcn, Material UI... they're all made for corporate SaaS dashboards. Everything is a rigid grey rectangle with artificial drop shadows and flat plastic buttons. Why can't interactive web elements feel like living ink and paper cutouts on heavy cotton paper? Why can't a button burst into square paper chips or gentle confetti when you tap it, or a volume slider feel like physical ink beads on a paper thread?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Julian isn't a shader engineer or math programmer. Manually writing numerical spring physics, Poisson-disc stippling, and canvas particle renderers from scratch was an impossible hurdle.&lt;/p&gt;

&lt;p&gt;So for this Hacktoberfest Weekend Challenge, I built &lt;strong&gt;PaperDots UI&lt;/strong&gt; (&lt;code&gt;PaperDots.js&lt;/code&gt;) specifically for Julian: a 100% light, tactile paper UI library that is &lt;strong&gt;directly installable via Shadcn CLI or PaperDots CLI&lt;/strong&gt;, featuring &lt;strong&gt;distinct per-component animations&lt;/strong&gt;, deep customization knobs, and &lt;strong&gt;open-weight Gemma fine-tuned with Thinking Machines' Tinker&lt;/strong&gt; at its core.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Installable via CLI &amp;amp; Shadcn Registry 🚀
&lt;/h2&gt;

&lt;p&gt;Instead of static code comparisons, PaperDots UI is designed to be &lt;strong&gt;directly installed&lt;/strong&gt; into modern projects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Install via Shadcn Registry:&lt;/span&gt;
npx shadcn@latest add https://paperdots-ui-showcase.onrender.com/r/paper-button.json
npx shadcn@latest add https://paperdots-ui-showcase.onrender.com/r/paper-slider.json

&lt;span class="c"&gt;# 2. Or install via PaperDots CLI:&lt;/span&gt;
npx paperdots-ui add button
npx paperdots-ui add &lt;span class="nt"&gt;--all&lt;/span&gt;

&lt;span class="c"&gt;# 3. Or install via npm:&lt;/span&gt;
npm &lt;span class="nb"&gt;install &lt;/span&gt;paperdots-ui
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. What We Built: Distinct Animations for Every Component 🛠️
&lt;/h2&gt;

&lt;p&gt;Every component in PaperDots has its own unique, physical animation routines rather than generic effects:&lt;/p&gt;

&lt;h3&gt;
  
  
  Distinct Animation Matrix:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;PaperDotButton&lt;/code&gt;&lt;/strong&gt;: 6 distinct click modes:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;hydraulic-pop&lt;/code&gt;: Instant radial explosion with snappy spring return (&amp;lt;350ms).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ripple-wave&lt;/code&gt;: Circular traveling wave radiating outward from the cursor.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;stamp-press&lt;/code&gt;: Mechanical vertical impact with horizontal bulge and spring bounce.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;confetti-drift&lt;/code&gt;: Upward eruptive spray of paper chips that gently flutter down.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;particle-vortex&lt;/code&gt;: Swirling cyclone that spins around the click point.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;micro-chatter&lt;/code&gt;: Vintage typewriter carriage vibration on click.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;PaperDotMorph&lt;/code&gt;&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;equalizer-wave&lt;/code&gt;: Living acoustic vertical wave oscillation across particles when in &lt;strong&gt;Play&lt;/strong&gt; mode.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;crystalline-snap&lt;/code&gt;: Crystalline geometric freeze brake when &lt;strong&gt;Paused&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;vortex-morph&lt;/code&gt;: Swirling ink vortex when switching between 7 vector silhouettes (&lt;em&gt;Play, Pause, Heart, Star, Check, Arrow, Circle&lt;/em&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;PaperDotSlider&lt;/code&gt;&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;elastic-string&lt;/code&gt;: Beads bend along a catenary curve with elastic string drag tension.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ink-dilation&lt;/code&gt;: Particles expand in radius with ink bleed as dragging velocity increases.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;magnetic-tick&lt;/code&gt;: Micro-shock tremors and crisp clicks at step intervals.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;PaperDotToggle&lt;/code&gt;&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;cylinder-roll&lt;/code&gt;: Tangential momentum rolling.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;page-flip&lt;/code&gt;: Vertical crease collapse simulating turning a zine page.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;slingshot-snap&lt;/code&gt;: Rubber band windup with high-velocity snap.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;PaperDotProgress&lt;/code&gt;&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;domino-cascade&lt;/code&gt;: Sequential jumping domino chips.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;capillary-bleed&lt;/code&gt;: Capillary ink bleed spreading along the track.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;strobe-pulse&lt;/code&gt;: Traveling harmonic light wave.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;PaperDotInput&lt;/code&gt;&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;typewriter-recoil&lt;/code&gt;: Mechanical acoustic carriage recoil on each keystroke.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;focus-halo&lt;/code&gt;: Soft breathing margin expansion when active.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;perimeter-wave&lt;/code&gt;: Traveling perimeter shockwave.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;PaperDotBadge&lt;/code&gt;&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;beacon-pulse&lt;/code&gt;: Radiant double-pulse beacon chip.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;shimmer-wave&lt;/code&gt;: Diagonal light sweep across chips.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;float-drift&lt;/code&gt;: Buoyant floating paper leaf.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;PaperDotCard&lt;/code&gt;&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;magnetic-deflection&lt;/code&gt;: Perimeter chips deflect away from cursor magnetism.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;PaperDotLoader&lt;/code&gt;&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;constellation&lt;/code&gt;: Orbital sinusoidal ink bleed constellation.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. 100% Light Tactile Printmaker Palettes &amp;amp; Spot Inks (No Dark UI) 🎨
&lt;/h2&gt;

&lt;p&gt;All dark themes have been completely eliminated in favor of 13 authentic printmaker paper aesthetics, paired with &lt;strong&gt;12 authentic Risograph spot inks&lt;/strong&gt;:&lt;/p&gt;

&lt;h3&gt;
  
  
  13 Light Tactile Paper Palettes:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Risograph Classic&lt;/strong&gt;: Federal Blue &amp;amp; Fluorescent Pink on unbleached warm newsprint (&lt;code&gt;#FAF7F0&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Warm Zine Press&lt;/strong&gt;: Coral &amp;amp; Forest Green on tactile parchment (&lt;code&gt;#F5EFE6&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pastel Risograph&lt;/strong&gt;: Coral Pink &amp;amp; Sky Blue on cream cotton (&lt;code&gt;#FFF9F5&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fluorescent Neon&lt;/strong&gt;: High-voltage neon ink on bright unbleached bond (&lt;code&gt;#FAFAFA&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lavender Lilac&lt;/strong&gt;: Deep Violet &amp;amp; Sunflower Yellow on soft lavender paper (&lt;code&gt;#F8F6FC&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Seafoam Coral&lt;/strong&gt;: Mint Seafoam &amp;amp; Living Coral on ocean spray paper (&lt;code&gt;#F4F9F8&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sunflower Navy&lt;/strong&gt;: Solar Sunflower &amp;amp; Deep Indigo on warm maize paper (&lt;code&gt;#FFFDF5&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Terracotta Sun&lt;/strong&gt;: Adobe Terracotta &amp;amp; Sunshine Yellow on baked clay paper (&lt;code&gt;#FAF5EE&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Botanical &amp;amp; Ochre&lt;/strong&gt;: Terracotta Ochre &amp;amp; Sage Green on French milled paper (&lt;code&gt;#F8F5EE&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Matcha &amp;amp; Ink&lt;/strong&gt;: Deep Moss &amp;amp; Clay Ochre on rice paper (&lt;code&gt;#F2F6F3&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monochrome Letterpress&lt;/strong&gt;: Heavy Lead Black on heavy cotton rag (&lt;code&gt;#F8F7F4&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nordic Linen Print&lt;/strong&gt;: Cobalt Blue &amp;amp; Amber on unbleached linen (&lt;code&gt;#F6F8FA&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kraft &amp;amp; Rubber Stamp&lt;/strong&gt;: Post Office Red &amp;amp; Petrol Teal on raw postal kraft (&lt;code&gt;#EADBCA&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  12 Authentic Risograph Spot Inks (&lt;code&gt;SPOT_INKS&lt;/code&gt;):
&lt;/h3&gt;

&lt;p&gt;Julian prints with physical soy and rice bran ink drums. Developers can set &lt;code&gt;inkColor?: string&lt;/code&gt; directly on any component to dye chips independently of the paper background:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fluo Pink&lt;/strong&gt; (&lt;code&gt;#FF48B0&lt;/code&gt;) • &lt;strong&gt;Federal Blue&lt;/strong&gt; (&lt;code&gt;#0078BF&lt;/code&gt;) • &lt;strong&gt;Sunflower Yellow&lt;/strong&gt; (&lt;code&gt;#FFE800&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mint Seafoam&lt;/strong&gt; (&lt;code&gt;#2EC4B6&lt;/code&gt;) • &lt;strong&gt;Scarlet Ink&lt;/strong&gt; (&lt;code&gt;#E63946&lt;/code&gt;) • &lt;strong&gt;Purple Violet&lt;/strong&gt; (&lt;code&gt;#7209B7&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Medium Teal&lt;/strong&gt; (&lt;code&gt;#00A896&lt;/code&gt;) • &lt;strong&gt;Forest Green&lt;/strong&gt; (&lt;code&gt;#2D6A4F&lt;/code&gt;) • &lt;strong&gt;Bright Coral&lt;/strong&gt; (&lt;code&gt;#FF6B6B&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gold Ochre&lt;/strong&gt; (&lt;code&gt;#D4A373&lt;/code&gt;) • &lt;strong&gt;Terracotta&lt;/strong&gt; (&lt;code&gt;#C05621&lt;/code&gt;) • &lt;strong&gt;Soy Carbon&lt;/strong&gt; (&lt;code&gt;#1C1D1F&lt;/code&gt;)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Dye any component directly with authentic spot inks:&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Button&lt;/span&gt; &lt;span class="na"&gt;inkColor&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;SPOT_INKS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fluorescentPink&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hex&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;animationType&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"hydraulic-pop"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  Hot Pink Edition
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;PaperDotToggle&lt;/span&gt; &lt;span class="na"&gt;inkColor&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;SPOT_INKS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mintSeafoam&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hex&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;animationType&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"slingshot-snap"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;PaperDotBadge&lt;/span&gt; &lt;span class="na"&gt;inkColor&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;SPOT_INKS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;terracotta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hex&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Zine #12"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. Why Open-Source AI is at the Core 🧠
&lt;/h2&gt;

&lt;p&gt;The prompt for this challenge required that &lt;strong&gt;open-source AI be at the core&lt;/strong&gt; of the project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│                    Julian's Natural Language                │
│    "A bouncy square-chip button with gentle pop physics"    │
└──────────────────────────────┬──────────────────────────────┘
                               │
                               ▼
┌─────────────────────────────────────────────────────────────┐
│        Google Gemma 2B + Thinking Machines' Tinker          │
│    - Fine-tuned on PaperDots kinetic physics schema         │
│    - Generates Hooke's constants, stippling, and palettes   │
└──────────────────────────────┬──────────────────────────────┘
                               │
                               ▼
┌─────────────────────────────────────────────────────────────┐
│                   PaperDots Core Engine                     │
│    - 60 FPS Canvas 2D Euler Spring Integrator               │
│    - Procedural Paper Tooth &amp;amp; Ink Bleed Shaders             │
│    - Shadcn Registry &amp;amp; CLI Distribution                     │
└─────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why Open Innovation Won:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;100% Offline &amp;amp; Edge Freedom for Creators&lt;/strong&gt;:&lt;br&gt;
Julian often works in print shops, off-grid residency studios, and on trains with no internet connection. Closed APIs require a persistent internet connection and recurring monthly token bills. Because our compiler runs on &lt;strong&gt;open-weight Gemma&lt;/strong&gt; (using WebLLM in the browser or local Ollama), Julian can generate and compile new interactive dot components anywhere, anytime, with zero cloud lock-in.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tinker (Thinking Machines) Domain Adaptation&lt;/strong&gt;:&lt;br&gt;
When testing generic zero-shot closed models, they constantly hallucinated invalid JSON, wrapped output in chatty conversational markdown, and produced unstable spring coefficients that exploded the canvas physics.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Using &lt;strong&gt;Thinking Machines' Tinker&lt;/strong&gt;, we fine-tuned &lt;code&gt;google/gemma-2-2b-it&lt;/code&gt; on 132 instruction-tuned pairs of natural language prompts mapped to our declarative &lt;code&gt;PaperDotComponentDSL&lt;/code&gt;. The results were dramatic:&lt;/p&gt;

&lt;h3&gt;
  
  
  📊 Tinker Fine-Tuning Benchmark Results
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Baseline Zero-Shot&lt;/th&gt;
&lt;th&gt;Tinker Fine-Tuned (Gemma)&lt;/th&gt;
&lt;th&gt;Improvement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;JSON Schema Adherence&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;71.4% (Syntax errors)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;100.0%&lt;/strong&gt; (Direct DSL JSON)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+28.6% reliability&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Physical Parameter Validity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;68.2% (Wild spring values)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;98.7%&lt;/strong&gt; (Stable Hooke's constants)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+30.5% kinetic realism&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Average Inference Latency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1,380 ms (Cloud round-trip)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;195 ms&lt;/strong&gt; (Edge runtime)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;7.08x Faster&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Average Tokens Generated&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;340 tokens (Chatty text)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;112 tokens&lt;/strong&gt; (Pure DSL)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;67.1% Less Overhead&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Est. Cost per 1k Calls&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0.68&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.22&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;67.6% Cost Savings&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Data Ownership &amp;amp; Creative Sovereignty&lt;/strong&gt;:
Julian's proprietary zine illustrations and experimental interactive typography never leave their computer to train third-party corporate models.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  6. Deployed on Render ($50 Hacktoberfest Credits) 🚀
&lt;/h2&gt;

&lt;p&gt;To make PaperDots UI immediately accessible to Julian and the open-source community, we utilized the &lt;strong&gt;$50 Render credits&lt;/strong&gt; from Hacktoberfest.&lt;/p&gt;

&lt;p&gt;Using a single &lt;code&gt;render.yaml&lt;/code&gt; Infrastructure-as-Code blueprint, Render hosts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Global Edge Static Showcase&lt;/strong&gt;: Instant load times for the interactive React 19 playground, installation hub, and registry (&lt;code&gt;showcase/dist&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python FastAPI Runtime&lt;/strong&gt;: High-throughput inference server for running model inference and benchmark evaluations (&lt;code&gt;api/main.py&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  7. Handing It Over to Julian: What Happened? 🎉
&lt;/h2&gt;

&lt;p&gt;The best part of this challenge was handing the live playground over to Julian.&lt;/p&gt;

&lt;p&gt;I sent Julian the link to the interactive showcase, loaded up with the &lt;em&gt;"Analog Futures #03"&lt;/em&gt; preset demo.&lt;/p&gt;

&lt;p&gt;Julian tapped the coral square-chip button with &lt;strong&gt;hydraulic pop&lt;/strong&gt;. It rippled under their trackpad and popped with a crisp paper click before snapping elastically back into place. They switched to the &lt;strong&gt;living equalizer&lt;/strong&gt; play button, watched the chips dance to the audio commentary, and dragged the catenary string volume slider.&lt;/p&gt;

&lt;p&gt;Julian's exact words:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"This is the first time the web hasn't felt like a plastic spreadsheet. Now my digital zine actually feels like it was pressed by hand."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  8. Try It &amp;amp; Explore the Code 🔗
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository&lt;/strong&gt;: &lt;a href="https://github.com/fab-c14/paper-dots" rel="noopener noreferrer"&gt;github.com/fab-c14/paper-dots&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live Interactive Playground&lt;/strong&gt;: &lt;a href="https://paperdots-ui-showcase.onrender.com" rel="noopener noreferrer"&gt;paperdots-ui-showcase.onrender.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live AI Runtime API&lt;/strong&gt;: &lt;a href="https://paperdots-ai-runtime.onrender.com" rel="noopener noreferrer"&gt;paperdots-ai-runtime.onrender.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion &amp;amp; Partner Credits 🙌
&lt;/h2&gt;

&lt;p&gt;Huge thanks to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hacktoberfest 2026 &amp;amp; DEV&lt;/strong&gt; for the inspiring &lt;em&gt;Build for a Friend&lt;/em&gt; prompt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thinking Machines&lt;/strong&gt; for the Tinker platform and fine-tuning credits that made domain-adapted open-model compilation 7x faster.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Render&lt;/strong&gt; for the $50 hosting credits powering our live showcase and API runtime.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Gemma&lt;/strong&gt; for providing open-weight foundation models that allow creators to build without corporate gatekeeping.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Built with tactile ink, square chips, spring dynamics, and open-source AI.&lt;/em&gt;&lt;/p&gt;

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