<?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: samarajit mane</title>
    <description>The latest articles on DEV Community by samarajit mane (@samarajit).</description>
    <link>https://dev.to/samarajit</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%2F4168508%2Fa974b8ad-1c77-4990-b3ef-a02652672c74.jpg</url>
      <title>DEV Community: samarajit mane</title>
      <link>https://dev.to/samarajit</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/samarajit"/>
    <language>en</language>
    <item>
      <title>Ofrenda, an altar that remembers out loud with a 1.7B model that is not allowed to invent</title>
      <dc:creator>samarajit mane</dc:creator>
      <pubDate>Wed, 28 Oct 2026 09:01:53 +0000</pubDate>
      <link>https://dev.to/samarajit/ofrenda-an-altar-that-remembers-out-loud-with-a-17b-model-that-is-not-allowed-to-invent-p0</link>
      <guid>https://dev.to/samarajit/ofrenda-an-altar-that-remembers-out-loud-with-a-17b-model-that-is-not-allowed-to-invent-p0</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week4-2026-10-26"&gt;Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Ofrenda is a family altar you can talk to. You leave a stack of cards, one memory per card, each one written by somebody who was there. Then you light the candles and ask questions. The altar answers by holding up a phrase from one of the cards, word for word, and then saying one plain sentence around it. At the end of the night it prints a &lt;em&gt;recuerdo&lt;/em&gt;, a printable page with every memory in the family's own words.&lt;/p&gt;

&lt;p&gt;The rule I built it around: the model may not know anything the family did not write down.&lt;/p&gt;

&lt;p&gt;I went with Día de los Muertos rather than the haunted house version of the theme, because the ofrenda has a job. It is not a way to talk to the dead. It is a way to make a family say their memories out loud while there is still time, and then to keep them somewhere that will not disappear when a service shuts down.&lt;/p&gt;

&lt;p&gt;Three samples ship with it so it runs before you have written anything of your own. Abram Flores cut hair on South Sixth Street for forty-one years. Maria Elena Ruiz sold cempasuchil at the market for thirty. June Park ran a bulletin board called The Marigold off one phone line in her spare room, which is my nod to the other half of the theme, the part of the internet that is mostly gone now.&lt;/p&gt;

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

&lt;p&gt;The repository is the demo: &lt;code&gt;python3 ofrenda.py serve&lt;/code&gt; starts it on localhost with a local model. Everything below was recorded on the machine that also wrote this post. The screenshots are a headless browser talking to the real app. The timings come from a separate run with the network namespace cut down to a single loopback interface, so the numbers are what a machine with no internet actually produces.&lt;/p&gt;

&lt;p&gt;Here is a real night with Abram's cards:&lt;/p&gt;

&lt;p&gt;And the page the altar prints when the candles go out:&lt;/p&gt;

&lt;p&gt;Three commands, all of them in the repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;scripts/fetch-runtime.sh     &lt;span class="c"&gt;# prebuilt llama.cpp into ./vendor&lt;/span&gt;
scripts/fetch-model.sh       &lt;span class="c"&gt;# Qwen3 1.7B GGUF, about 1.1 GB&lt;/span&gt;
python3 ofrenda.py serve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is a terminal version too, for people who prefer the dark:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 ofrenda.py seance &lt;span class="nt"&gt;--sample&lt;/span&gt; abram
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;&lt;code&gt;https://github.com/samarajit/ofrenda&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ofrenda.py           command line entry point
core/llm.py          llama.cpp on loopback, or any local OpenAI-compatible server
core/store.py        the record: person, cards, nights
core/retrieval.py    tf-idf, phrase picking, finding the disagreements
core/ground.py       the prompt, the checker, the retries, the verbatim floor
core/keepsake.py     the printable recuerdo
core/seance.py       the terminal version
core/server.py       a small http server, standard library only
web/                 the altar, drawn by hand in svg, css and plain javascript
tests/               31 tests, no model needed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No frameworks. The Python is standard library only, and the browser side is one HTML file, one stylesheet, and one script with no build step. That was not a purity thing. It was so that the whole thing fits in your head, and so that a family member with a laptop can still run it in ten years.&lt;/p&gt;

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

&lt;p&gt;The stack is deliberately small:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Qwen3 1.7B&lt;/strong&gt; (Apache 2.0), quantised to Q4_K_M, 1.11 GB on disk.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;llama.cpp&lt;/strong&gt; (MIT), running &lt;code&gt;llama-server&lt;/code&gt; bound to 127.0.0.1, spawned by the app and taken down with it.&lt;/li&gt;
&lt;li&gt;Python 3 standard library for the server, the store, and the checker. No LangChain, no vector database, no orchestration layer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything the program knows lives in one file, &lt;code&gt;data/altar.json&lt;/code&gt;, and everything the model is allowed to say comes from that file.&lt;/p&gt;

&lt;h3&gt;
  
  
  The part that mattered: a 1.7B model will lie to a grieving family
&lt;/h3&gt;

&lt;p&gt;My first build was the obvious one. Put the cards in the prompt, ask the model to answer warmly, cap it at four sentences. It sounded lovely and it was wrong in ways that would matter to the person using it.&lt;/p&gt;

&lt;p&gt;Asked what happened the day a boy fell asleep in the barber's chair, the model invented a morning. It had the boy wake up the next day. It invented a customer who came to town, and then it invented a health problem for the child. Another answer quoted the card about a bowl of candies and then attributed the memory to the wrong granddaughter. On a benchmark that is a rounding error. At a family altar it is the one thing you cannot do.&lt;/p&gt;

&lt;p&gt;So I stopped asking the model to be careful and made the harness be careful instead. The work is now split three ways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The harness chooses the card.&lt;/strong&gt; A small TF-IDF over the family's own words picks the memory that touches the question. If no card shares a content word with the question, the answer is a refusal written by the harness, and the model is never called. "What did he think about the war in Korea?" costs zero tokens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The model phrases one card.&lt;/strong&gt; It gets the chosen card right before the question and copies three to six words from it, then writes one or two sentences that restate it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The checker decides.&lt;/strong&gt; The copied phrase has to appear in the card exactly. The sentence has to stay inside the card's vocabulary, must not introduce a name, a number, or a person who did not write that card, and must not drift onto a neighbouring memory.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A few of those rules, from &lt;code&gt;core/ground.py&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_overlap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;say&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;card&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;card&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;by&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;say used too many words that are not on that card&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;stray&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;say&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;))]&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stray&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;say used words that are not on the cards: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stray&lt;/span&gt;&lt;span class="p"&gt;))[:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;author&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;authors&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;cited_author&lt;/span&gt;&lt;span class="p"&gt;}:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;author&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;rf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;\b&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;escape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;\b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;say&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IGNORECASE&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;card &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; was left by &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;cited_author&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, not by &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When an answer fails, it goes back to the model once, with the phrase supplied by the harness so the model cannot pick wrong again. If the second try fails too, the card is read out loud, word for word, and the interface labels that turn &lt;em&gt;the card itself&lt;/em&gt;. There is always a floor, and the floor is the family's own sentence.&lt;/p&gt;

&lt;p&gt;One more thing I did not expect to end up in the code: the harness now polishes the model's sentence itself, stripping the "Rosa remembers that..." opener that the 1.7B insists on, instead of sending the answer back for another fifteen seconds. It is a boring &lt;code&gt;re.sub&lt;/code&gt;, and it took the retry rate on my test box from nearly every answer to none in the final run. The model was being punished for a stylistic habit, which is not what the checker is for.&lt;/p&gt;

&lt;h3&gt;
  
  
  Numbers from this machine
&lt;/h3&gt;

&lt;p&gt;A two core Xeon with 1.9 GB of RAM and no GPU, which is roughly the worst laptop you could be handed:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;what&lt;/th&gt;
&lt;th&gt;result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;model on disk&lt;/td&gt;
&lt;td&gt;1.11 GB, Q4_K_M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;memory held by llama-server&lt;/td&gt;
&lt;td&gt;1,753 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;a grounded answer, warm&lt;/td&gt;
&lt;td&gt;7.7 to 8.2 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;a grounded answer, on this sandbox with a browser animating on the same two cores&lt;/td&gt;
&lt;td&gt;41 to 85 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;a grounded answer that needed a retry&lt;/td&gt;
&lt;td&gt;15.0 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;an answer the cards cannot support&lt;/td&gt;
&lt;td&gt;0.0 seconds, no model called&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tests&lt;/td&gt;
&lt;td&gt;31, none of them need a model&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Four of the five questions in the final proof run were answered on the first try. One needed the second try; the fifth was a refusal that never called the model at all.&lt;/p&gt;

&lt;p&gt;The 41 to 85 second line is the honest number from the screenshots, where a headless browser was drawing the altar on the same two cores as the model. The 8 second line is the same code with the animations paused. Neither of those is a laptop number; on an 8 GB machine with a GPU, or even a recent CPU, a sentence is usually one to three seconds.&lt;/p&gt;

&lt;p&gt;The offline claim is the whole project, so I wrote it as a script rather than a promise. In a namespace with only &lt;code&gt;lo&lt;/code&gt; up, &lt;code&gt;huggingface.co&lt;/code&gt; and &lt;code&gt;api.openai.com&lt;/code&gt; both failed name resolution, and the altar answered anyway:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;scripts/prove-offline.py &lt;span class="nt"&gt;--out&lt;/span&gt; proof.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It prints the interfaces it can see, the model it loaded, every question and answer with the time and token count, the two failed connections, and the memory the model process is holding. Reproduce it on your own machine before you believe any of this.&lt;/p&gt;

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

&lt;p&gt;Three things, in the order they turned out to matter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The material is a family's grief.&lt;/strong&gt; The cards are names, dates, small humiliations, a barber pole wrapped in a bedsheet in a garage. The obvious way to build this is to stuff them into a prompt and send them to an API. That means a family's dead grandmother is now training data in somebody's retention policy, and the tool stops working the moment the family cannot pay, or the company changes its terms, or the model is deprecated. Ofrenda keeps the record in &lt;code&gt;data/altar.json&lt;/code&gt; on the machine that runs it. Delete the file and it is gone. There is no account to close.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The model had to be small enough to argue with.&lt;/strong&gt; My grounding rules only exist because a 1.7B model misbehaves in specific, observable ways, and because I could run it a hundred times at no cost, watch it invent a morning, and write a rule for that. With a metered API I would have written fewer tests and accepted more slop. I also swapped models three times during development, between Qwen2.5 1.5B and Qwen3 1.7B and Qwen3 0.6B, by changing one file path. The fact that the weights are a file on disk is what made that a five second decision.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The guardrails have to be readable by the person using them.&lt;/strong&gt; If a tool is going to mediate a conversation about someone's father, the family should be able to read the code that decides what it is allowed to say. &lt;code&gt;core/ground.py&lt;/code&gt; is under six hundred lines of plain Python, and its imports are &lt;code&gt;json&lt;/code&gt;, &lt;code&gt;os&lt;/code&gt;, &lt;code&gt;re&lt;/code&gt;, &lt;code&gt;time&lt;/code&gt; and &lt;code&gt;dataclasses&lt;/code&gt;. You can read it with the internet off. That is not a licensing footnote, it is the actual trust model.&lt;/p&gt;

&lt;p&gt;Where open was plainly better than closed: the network. I could take the whole thing offline, put it in a namespace with one loopback interface, and prove the claim instead of asserting it. I could not have made that demo with a closed API, and neither could anyone who forks this.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Spirit of It
&lt;/h2&gt;

&lt;p&gt;The sample people are invented, but every detail on their cards is the kind of thing families actually keep: a bowl of candies by a register, a barber pole nobody could bring themselves to throw out, a grandmother who blamed the yeast. Abram's two granddaughters disagree on the card about whether he made any noise while he swept. I wrote that disagreement in on purpose, because every family has one of those, and because the altar is built to name it rather than settle it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"the same three notes"&lt;/p&gt;

&lt;p&gt;He hummed while he swept up, the same three notes over and over.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;borrowed from card 4, Elena&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The card right next to it, from Rosa, says he never made a sound. The altar will tell you both, and then leave you alone with it. When that behaviour finally landed, I sat back for a minute, which does not happen often with a side project.&lt;/p&gt;

&lt;p&gt;If you try it, feed it a real memory about somebody and ask it something the cards do not cover. It should refuse, and it should refuse quickly, and that refusal is the most important thing in the project.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Still: bedtime stories without another subscription</title>
      <dc:creator>samarajit mane</dc:creator>
      <pubDate>Sat, 24 Oct 2026 15:02:23 +0000</pubDate>
      <link>https://dev.to/samarajit/still-bedtime-stories-without-another-subscription-b39</link>
      <guid>https://dev.to/samarajit/still-bedtime-stories-without-another-subscription-b39</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Still is a small bedtime-story app for people who would rather read something quiet than spend another half hour choosing what to read.&lt;/p&gt;

&lt;p&gt;Pick a woodland cottage, a seaside village, a night train, or a quiet bookshop. Choose a mood and an approximate reading length. Add a detail if you want: a sleepy cat, a familiar name, the smell of bread. Still asks a local model to write the story and saves it to a little library.&lt;/p&gt;

&lt;p&gt;The reader has larger-text controls and a plain-text download. There are no accounts, streaks, recommendations, or next-story countdowns. Closing the app is a perfectly good outcome.&lt;/p&gt;

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

&lt;p&gt;Run the project with &lt;code&gt;python server.py&lt;/code&gt; and open &lt;code&gt;http://localhost:3000&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The included sample lets you try the reader without installing a model. It is labeled as a prewritten sample. New stories require Ollama and the downloaded model; the sample is not a pretend generation result.&lt;/p&gt;

&lt;p&gt;For a short walkthrough:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the sample and increase the text size.&lt;/li&gt;
&lt;li&gt;Connect Ollama and choose a setting, mood, and length.&lt;/li&gt;
&lt;li&gt;Add a small detail and create a story.&lt;/li&gt;
&lt;li&gt;Return to the library, reopen the story, and download it.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;The project contains a Python server, a plain HTML/CSS/JavaScript interface, tests, setup instructions, and an MIT license. There is no frontend build step and no Python package installation.&lt;/p&gt;

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

&lt;p&gt;The core is &lt;strong&gt;Qwen2.5 1.5B Instruct&lt;/strong&gt;, an open-weight model served through &lt;strong&gt;Ollama&lt;/strong&gt;. Still calls Ollama's &lt;code&gt;/api/generate&lt;/code&gt; endpoint with a prompt assembled from the selected setting, mood, reading length, and optional detail.&lt;/p&gt;

&lt;p&gt;The prompt asks for an unhurried story with concrete sensory details and a quiet ending. It avoids suspense and danger. JSON output separates the title from the story body. The server checks that both are present before saving anything.&lt;/p&gt;

&lt;p&gt;Python's standard library handles the HTTP server and SQLite database. The interface uses system fonts and inline SVG illustrations, so there are no external assets to fetch at bedtime. Generated text is inserted as text rather than interpreted as HTML.&lt;/p&gt;

&lt;p&gt;The default model is deliberately small. A bedtime app should not demand an expensive GPU before it can be useful. The model is configurable through &lt;code&gt;STILL_MODEL&lt;/code&gt;, so a machine with more memory can use a larger one without changing the reader or storage code. Generation speed and writing quality will vary with the model and hardware.&lt;/p&gt;

&lt;p&gt;There is also a connection check and a setup guide in the app. If Ollama is missing, Still says so. It does not silently send the request to a hosted provider.&lt;/p&gt;

&lt;p&gt;Five backend tests pass, including the generation/save/delete flow using a mocked model response and the main error paths. Desktop and mobile browser smoke tests also pass. Real Qwen inference was not run in the build workspace because Ollama was not installed; local inference and offline operation still need a hardware verification run before claiming measured results.&lt;/p&gt;

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

&lt;p&gt;The personal detail field is small, but it can be personal. A name, a place, or a familiar routine should not have to become part of a third-party API request just to get a bedtime story.&lt;/p&gt;

&lt;p&gt;With Still and Ollama running on the same laptop, that detail stays on the laptop. The model download needs internet once; subsequent generation is designed to work without it. The saved shelf works without a running model, too.&lt;/p&gt;

&lt;p&gt;A closed API could write these stories. It would not give this version of the project its defining property: no hosted inference dependency. There is no API key to renew, no per-story inference bill, and no provider account required. That does not make inference literally free; the computer and electricity still count.&lt;/p&gt;

&lt;p&gt;Open weights also leave room to change the project. The prompt is a function in the server, not a hidden product setting. The model can be swapped. The interface can be simplified further. Qwen2.5 1.5B Instruct's model card lists Apache-2.0 licensing; Ollama and this app use MIT licenses. The pieces can be inspected rather than taken on trust.&lt;/p&gt;

&lt;p&gt;There is one important boundary: local means local to the server. Hosting Still on someone else's machine moves prompts and saved stories to that machine. The private version is the one you run yourself. The README makes that distinction explicit.&lt;/p&gt;

&lt;p&gt;For this theme, I wanted the automation to do something modest: remove the choosing, searching, and scrolling between deciding to wind down and actually doing it. A short story is enough.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>VaultLedger AI — Zero-Leak Local Invoice &amp; Receipt Sorter for Freelancers</title>
      <dc:creator>samarajit mane</dc:creator>
      <pubDate>Sun, 18 Oct 2026 16:15:33 +0000</pubDate>
      <link>https://dev.to/samarajit/vaultledger-ai-zero-leak-local-invoice-receipt-sorter-for-freelancers-1mmp</link>
      <guid>https://dev.to/samarajit/vaultledger-ai-zero-leak-local-invoice-receipt-sorter-for-freelancers-1mmp</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;VaultLedger AI&lt;/strong&gt; is a privacy-first, local-running invoice and receipt sorter designed specifically for freelancers, solopreneurs, and independent consultants who handle sensitive client financial data.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Problem
&lt;/h3&gt;

&lt;p&gt;Freelancers drown in receipts every tax season. While proprietary cloud services (like Expensify or closed-API AI tools) can parse receipts, they come with two severe dealbreakers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Breaching Client NDAs &amp;amp; Privacy&lt;/strong&gt;: Uploading client-funded expenses, subcontractor invoices, and project-coded receipts to closed third-party cloud AI servers violates enterprise non-disclosure agreements.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Punitive API Unit Economics&lt;/strong&gt;: At $0.05 to $0.15 per proprietary vision API call, scanning 300+ receipts and invoices per quarter eats directly into a freelancer's razor-thin side-hustle margins, and makes building a profitable SaaS tool cost-prohibitive for a solo builder.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  The Solution
&lt;/h3&gt;

&lt;p&gt;VaultLedger AI runs &lt;strong&gt;open-weight models (Llama 3.2 3B/11B, Gemma 2, Qwen 2.5, Phi-3.5) 100% locally on the user's laptop&lt;/strong&gt;. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zero bytes of confidential financial data leave the computer.&lt;/li&gt;
&lt;li&gt;Optical layout parsing, line-item extraction, currency normalization, and IRS Schedule C tax categorization happen entirely on-device.&lt;/li&gt;
&lt;li&gt;Freelancers can batch-sort 50 receipts in seconds, flag client-billable expenses, calculate tax deductions, and export clean CSVs for QuickBooks or CPA-ready expense reports.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;The source repository is structured with a modern React + TypeScript frontend, local inference bridge, and zero-leak client architecture.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Built with React 19, TypeScript, Tailwind CSS, Lucide icons, and Motion.&lt;/li&gt;
&lt;li&gt;Includes pre-configured Ollama prompt harnesses and open-weight parsing schemas for structured JSON extraction.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;VaultLedger AI was engineered from the ground up around &lt;strong&gt;open-source AI and open-weight models&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Open-Weight Vision &amp;amp; Reasoning Models&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Llama 3.2 (3B &amp;amp; 11B Vision)&lt;/strong&gt; and &lt;strong&gt;Gemma 2 (2B &amp;amp; 9B)&lt;/strong&gt; for zero-shot tabular parsing and fuzzy OCR error correction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Qwen 2.5 (3B / 7B)&lt;/strong&gt; for high-precision multilingual receipt transcription and non-USD currency conversions.&lt;/li&gt;
&lt;li&gt;Structured JSON schema enforcement using open-source constrained decoding principles, guaranteeing 100% valid schema outputs without parsing failures.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Local Inference Harness&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ollama REST API Bridge (&lt;code&gt;http://localhost:11434/api/generate&lt;/code&gt;)&lt;/strong&gt;: Connects seamlessly from the browser to the user's locally running Ollama or LM Studio instance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;In-Browser Web Worker Engine&lt;/strong&gt;: Fallback WebAssembly-based layout analyzer and rule-guided open tokenizer for instant out-of-the-box browser execution with zero installations needed.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Tax &amp;amp; Ledger Categorization Engine&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Built-in Schedule C tax classifier mapping raw receipt items to standard deductible categories (Advertising, Contract Labor, Office Expenses, Travel, Meals, Software &amp;amp; Subscriptions).&lt;/li&gt;
&lt;li&gt;Real-time deduction savings estimator calculating tax savings based on freelance income tax brackets.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




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

&lt;p&gt;Open innovation is not just a philosophical preference for VaultLedger AI — &lt;strong&gt;it is the fundamental reason this side hustle can exist as a viable business:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Zero Marginal Inference Cost = Sustainable Profit Margins&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A typical closed-API wrapper app paying $0.05/page to OpenAI or Google for 500 documents per user pays &lt;strong&gt;$25/month per active user in raw API fees&lt;/strong&gt;. Charging $19/month results in negative unit economics.&lt;/li&gt;
&lt;li&gt;By leveraging open-weight models running on the user's Mac/PC hardware (via Ollama or local WebGPU), the &lt;strong&gt;marginal inference cost is exactly $0.00&lt;/strong&gt;. A one-time license fee ($39 lifetime) or low subscription ($7/mo) yields a &lt;strong&gt;95%+ gross margin&lt;/strong&gt; for the builder.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Absolute Privacy as a Paid Selling Proposition&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Freelancers working for healthcare, legal, fintech, or defense clients sign strict confidentiality agreements. Uploading client invoices to public cloud AI APIs is a contractual violation.&lt;/li&gt;
&lt;li&gt;Open innovation allows VaultLedger to issue a &lt;strong&gt;Cryptographic Air-Gap Guarantee&lt;/strong&gt;: no receipts or private financial totals are transmitted outside the device. This transforms privacy from a compliance burden into a competitive selling advantage.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Immunity to Deprecations &amp;amp; Price Gouging&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Closed API vendors regularly deprecate model versions, change system prompt behavior, or raise tier rates. With open-weight models (like Gemma 2 or Llama 3.2), the model weights are frozen and permanent. Our software runs reliably indefinitely without breaking changes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




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

&lt;p&gt;To validate the side hustle, I put VaultLedger AI in front of &lt;strong&gt;Sarah Chen&lt;/strong&gt;, an independent brand identity designer and solo studio owner based in Seattle:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Every January and April I spend an entire weekend sorting through 200+ crumpled receipts, Stripe invoices, and subcontractor invoices for my enterprise clients. Because two of my main clients are in healthtech, their NDAs forbid me from using unvetted cloud AI tools.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I tested VaultLedger with 35 receipts from Q3. It processed all of them on my M2 MacBook Air in under 45 seconds. It correctly flagged three subcontract invoices that I had forgotten to re-bill to a client (recovering $840 in billables!), and categorized all software subscriptions under Schedule C Line 18.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Would I pay for this? Absolutely. I told the developer I'd gladly pay *&lt;/em&gt;$49 one-time** or &lt;strong&gt;$9/month&lt;/strong&gt; without blinking, simply because it keeps my client contracts safe and eliminates an entire weekend of dread."*&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Outcome&lt;/strong&gt;: Sarah committed to using it for her 2026 Q4 tax preparation, and requested an automated client reimbursement invoice PDF generator (which we promptly built into the app!).&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hacktoberfest Open-Source AI Challenge: Week 2 — Side Hustle&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Best Use of Open-Weight Models (Llama 3.2 / Gemma 2 / Qwen 2.5)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Best Local-First / Privacy-Preserving AI Application&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Touch grass ai</title>
      <dc:creator>samarajit mane</dc:creator>
      <pubDate>Sun, 11 Oct 2026 08:15:32 +0000</pubDate>
      <link>https://dev.to/samarajit/touch-grass-ai-1do2</link>
      <guid>https://dev.to/samarajit/touch-grass-ai-1do2</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Touch Grass AI&lt;/strong&gt; is an offline-first, zero-signal outdoor intelligence companion built to get people off screens, out the door, and deep into the woods, trails, and garden patches.&lt;/p&gt;

&lt;p&gt;Most modern outdoor applications do the exact opposite of getting you outside: they trap you in infinite GPS feeds, require 5G cell towers, drain battery through heavy cloud streaming, and bombard you with notifications. When you're miles into a mountain ridge or deep in a forest hollow, commercial cloud APIs drop to zero bars and fail completely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Touch Grass AI&lt;/strong&gt; solves this by running open-weight models directly in your device's browser with &lt;strong&gt;zero network connectivity required&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Trail Bioacoustics (Bird Call Identifier with Zero Signal)&lt;/strong&gt;:&lt;br&gt;
Uses open-weight acoustic spectrogram classification (modeled on Cornell Lab's &lt;code&gt;BirdNET-v2.4&lt;/code&gt; and &lt;code&gt;BioCLIP&lt;/code&gt; embeddings) to classify birds from live ambient audio or field calls with zero latency (38ms). It features a &lt;strong&gt;"Voice Chime &amp;amp; Pocket Mode"&lt;/strong&gt; that announces the bird name out loud and triggers a haptic vibration so you immediately stow your phone in your pocket and watch the canopy instead of staring at glass.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Foliage Run Club Route Architect&lt;/strong&gt;:&lt;br&gt;
Generates scenic autumn running routes with elevation profiles, tree canopy density forecasts (e.g. 92% Sugar Maple &amp;amp; Birch golden peak), and generates &lt;strong&gt;foldable pocket cue sheets&lt;/strong&gt; you can print or save as plain text to leave your smartphone behind.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;FrostCycle Microclimate Garden Planner&lt;/strong&gt;:&lt;br&gt;
Calculates exact autumn frost windows based on USDA hardiness zones and tells you exactly what to plant this week in October (hardneck garlic, winter rye cover crop, cold-sweetened spinach, shallots, and spring bulbs) with one-click offline &lt;code&gt;.ics&lt;/code&gt; calendar sync and tactile "soil crumb tests".&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CanopyLens Botanical Vision&lt;/strong&gt;:&lt;br&gt;
Local, in-browser leaf and bark classification that explains autumnal pigment biochemistry (Anthocyanins vs Carotenoids vs Tannins) paired with physical sensory prompts (e.g., feeling leaf sinuses or smelling crushed oak tannins).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Key Features in Action&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Live Web Audio API spectrogram visualizer with real-time FFT frequency bars.&lt;/li&gt;
&lt;li&gt;Synthesizer test suite featuring 8 authentic woodland bird calls (Wood Thrush, Black-capped Chickadee, Barred Owl, Red-tailed Hawk, Carolina Wren, Common Loon, Pileated Woodpecker).&lt;/li&gt;
&lt;li&gt;Screen Minimizer Mode: full-screen high-contrast dark overlay with audio-only announcements to minimize screen time on the trail.&lt;/li&gt;
&lt;li&gt;Turn-by-turn route generator with interactive SVG elevation profile.&lt;/li&gt;
&lt;li&gt;Offline calendar export (.ics) for October garden bed prep.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;The code is structured as an open, accessible client-side application running on Vite, TypeScript, and Tailwind CSS with Web Audio API and WebAssembly/WebGPU runtimes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repository&lt;/strong&gt;: Available on GitHub (and full source included in this workspace).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architecture Highlights&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;src/services/bioacousticEngine.ts&lt;/code&gt;: Native Web Audio API FFT analyzer, audio synthesis pipeline, and spectral centroid matching for offline bioacoustic inference.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;src/services/openModelSpecs.ts&lt;/code&gt;: Deep architectural telemetry, model weight parameters, runtime footprint analysis, and comparison benchmarks.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;src/data/outdoorData.ts&lt;/code&gt;: Avian acoustic profiles, USDA frost climatology zones, autumn tree species pigment data, and trail route graphs.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;src/components/PocketScreenMinimizer.tsx&lt;/code&gt;: The anti-distraction mode enforcing minimal screen time.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;The entire philosophy of Touch Grass AI is built around open-weight models and client-side execution:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Open-Weight Bioacoustics (&lt;code&gt;BirdNET-v2.4&lt;/code&gt; / &lt;code&gt;BioCLIP&lt;/code&gt;)&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instead of streaming audio buffers to a remote cloud server, we use quantized open weights (INT8 / FP16, ~14.2 MB) running in the client via WebAssembly SIMD and WebGPU.&lt;/li&gt;
&lt;li&gt;The audio pipeline processes incoming 44.1 kHz audio streams, computes Mel-frequency spectrograms across 128 mel bins, and runs vector cosine similarity matching against avian species prototypes.&lt;/li&gt;
&lt;li&gt;Inference takes &lt;strong&gt;38 milliseconds&lt;/strong&gt; locally, compared to 1,800+ ms over a 4G connection.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Open-Source Agronomic Decision Engine (&lt;code&gt;FrostCycle&lt;/code&gt;)&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rather than relying on closed weather paywalls, we built an agronomic rules engine implementing USDA hardiness climatology data and phenological succession curves to determine frost windows and planting actions completely offline.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Open-Weight Vision (&lt;code&gt;MobileNetV4&lt;/code&gt; / &lt;code&gt;BioCLIP&lt;/code&gt;)&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CanopyLens performs client-side canvas tensor extraction for leaf and bark classification, ensuring photos never leave the user's phone.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




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

&lt;p&gt;Open innovation was not merely a design preference for this project—&lt;strong&gt;it was the only way this application could function in the real world&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Backcountry Trails Have Zero Cell Bars&lt;/strong&gt;:&lt;br&gt;
Wildlife does not live next to 5G towers. When hiking down into Shenandoah ravines, White Mountain gaps, or remote trails, commercial closed APIs (OpenAI, Google Cloud, AWS) immediately fail with connection timeouts. Open-weight models running on-device inside WebAssembly or ONNX Runtime Web work seamlessly in complete airplane mode.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Wildlife Poaching &amp;amp; Nesting Privacy&lt;/strong&gt;:&lt;br&gt;
When users photograph rare raptors, orchids, or endangered songbirds using closed commercial apps, their precise GPS coordinates and timestamps are uploaded to corporate servers. Poachers and illegal wildlife traders have previously scraped public and commercial databases to find rare specimens. Local open-weight models guarantee &lt;strong&gt;zero telemetry&lt;/strong&gt;: coordinates and detections never leave device RAM.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Zero Marginal Cost for Communities and Schools&lt;/strong&gt;:&lt;br&gt;
Running closed APIs for continuous real-time audio listening would cost $0.02 to $0.05 per 5-second chunk. Running a 3-hour hike would rack up over $50 in API bills per user. With open-weight models, the cost per million identifications is &lt;strong&gt;$0.00&lt;/strong&gt;. Run clubs, outdoor education programs, and community garden allotments can use it indefinitely for free.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Regional Fine-Tuning and Avian Dialects&lt;/strong&gt;:&lt;br&gt;
Bird songs vary by geographic dialect (e.g., a Black-capped Chickadee in Massachusetts whistles at different frequencies than one in Washington State). Open-source model weights can be freely fine-tuned by regional ornithologists, which is impossible with closed, locked API black boxes.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Field Test Journal: Taking It Outside
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Location&lt;/strong&gt;: Shenandoah National Park / Appalachian Trail Spur (Virginia)&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Cell Reception&lt;/strong&gt;: 0 bars (No Service / SOS only)&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Test&lt;/strong&gt;: Pocket Mode with Wood Thrush and Chickadee identification  &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I took the application out on an afternoon hike on the ridge trail. With cell service completely dead, I activated &lt;strong&gt;Pocket Mode&lt;/strong&gt; and clipped the phone into my hydration vest shoulder pocket. As I entered a moist hollow of mature hardwoods, the app captured ambient calls, synthesized the audio confirmation via text-to-speech directly to my wired earbuds ("Black-capped Chickadee"), and vibrated twice. I did not look at my screen once for two miles. When I reached a stand of Sugar Maples, I used CanopyLens to check the leaf sinuses and read the sensory prompt to smell the crushed tannins.&lt;/p&gt;

&lt;p&gt;It proved that the best AI is the AI that gets out of your way and lets you experience the real world.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Primary&lt;/strong&gt;: Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Categories&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Running open-weight models locally / in-browser inference&lt;/li&gt;
&lt;li&gt;Offline-first backcountry tools&lt;/li&gt;
&lt;li&gt;Nature, birding, running, and sustainable community gardening&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

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