<?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: Tanisha Naruka</title>
    <description>The latest articles on DEV Community by Tanisha Naruka (@tanisha_naruka_c61a4d0da0).</description>
    <link>https://dev.to/tanisha_naruka_c61a4d0da0</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%2F4156093%2F6c614c45-efe8-48f7-b025-45f8416a6d21.png</url>
      <title>DEV Community: Tanisha Naruka</title>
      <link>https://dev.to/tanisha_naruka_c61a4d0da0</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tanisha_naruka_c61a4d0da0"/>
    <language>en</language>
    <item>
      <title>Hammock Report</title>
      <dc:creator>Tanisha Naruka</dc:creator>
      <pubDate>Sun, 25 Oct 2026 13:49:11 +0000</pubDate>
      <link>https://dev.to/tanisha_naruka_c61a4d0da0/hammock-report-2j4k</link>
      <guid>https://dev.to/tanisha_naruka_c61a4d0da0/hammock-report-2j4k</guid>
      <description>&lt;p&gt;*This is a submission for the [Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady]&lt;/p&gt;

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

&lt;p&gt;You come back from a week offline and your group chat has 1,400 unread messages. Most of it is memes. Somewhere inside is the one question that was waiting for you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hammock Report&lt;/strong&gt; reads an exported WhatsApp chat and sorts every conversation into three piles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Needs you&lt;/strong&gt;: you were asked directly, or a decision is still waiting on you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Already resolved&lt;/strong&gt;: someone raised it and a later message settled it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safe to ignore&lt;/strong&gt;: banter and small talk that asked nothing of you.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every verdict comes with a one-line reason, so you can check the model instead of trusting it. The report also shows the reading time you save, a timeline of the conversations, and who talked most. You can move any conversation to a different pile and download the result as Markdown.&lt;/p&gt;

&lt;p&gt;The lazy part: you export the chat, press one button, and read only the pile that needs you.&lt;/p&gt;

&lt;p&gt;It comes in two forms: a single-file web app with a mission-control look (radar scan, gauge, star map), and a Python command-line script that uses only the standard library.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://drive.google.com/file/d/1sod2JuwYfVdYHk55ZsIpvuCXw8vjdA5u/view?usp=sharing" rel="noopener noreferrer"&gt;https://drive.google.com/file/d/1sod2JuwYfVdYHk55ZsIpvuCXw8vjdA5u/view?usp=sharing&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/tanisha-naruka/Hammock-Report.git" rel="noopener noreferrer"&gt;https://github.com/tanisha-naruka/Hammock-Report.git&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;The open-source AI is &lt;a href="https://ollama.com" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt; running &lt;strong&gt;Qwen2.5 3B&lt;/strong&gt; on the user's own machine. The model name is one setting, so you can swap in Llama 3.2 3B or Gemma.&lt;/p&gt;

&lt;p&gt;A 3B model reads a short conversation far better than a week of chat, so the app:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Parses the WhatsApp export (Android and iPhone formats), skipping system lines and media placeholders.&lt;/li&gt;
&lt;li&gt;Splits the messages into conversations wherever there is a quiet gap, 30 minutes by default.&lt;/li&gt;
&lt;li&gt;Asks the model, for each conversation, three yes/no questions plus a one-line summary and reason. It uses Ollama's JSON mode at temperature 0, so the same chat gives the same answers.&lt;/li&gt;
&lt;li&gt;Sorts the answers: Needs you wins first. Otherwise a raised-and-resolved conversation is Resolved, and the rest is Safe to ignore.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The prompt, sent for every conversation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You triage a group chat for {name}, who was away. Read this conversation.
Reply with JSON only, with keys:
"request_raised": true/false (was a question, request or decision raised?)
"resolved": true/false (was it answered or settled later in this same conversation?)
"needs_me": true/false (does it still need {name} to act or decide, or was {name} directly asked?)
"summary": one short sentence
"reason": one short sentence explaining the verdict
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Small models are unreliable, so I added some safety nets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If a model call fails, the conversation is filed under &lt;strong&gt;Needs you&lt;/strong&gt;, so a failure never hides something.&lt;/li&gt;
&lt;li&gt;Small models sometimes answer &lt;code&gt;"false"&lt;/code&gt; as text instead of a real boolean. The code reads both correctly, and I have a test for it.&lt;/li&gt;
&lt;li&gt;Very long conversations are trimmed to their start and end so they fit the model.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The web app is one HTML file with vanilla JavaScript and no build step.&lt;/p&gt;

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

&lt;p&gt;A group chat is not only my data. It holds my friends' messages too, and they never agreed to have them sent to a cloud API. Running an open-weight model locally means the whole chat stays on my machine, which a closed API could not offer.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Private:&lt;/strong&gt; nothing is uploaded.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline:&lt;/strong&gt; it works on a train once the model is downloaded.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free at any size:&lt;/strong&gt; a bigger backlog costs time, not money, so I never have to think about per-message cost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swappable:&lt;/strong&gt; &lt;code&gt;--model&lt;/code&gt; lets me try another model on the same chat and compare.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Where a closed model would likely be more accurate, I say so plainly in the next section. For this job, privacy mattered more to me than the last few points of accuracy.&lt;/p&gt;

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

&lt;p&gt;[Run it on a real chat export and fill this in with real numbers: messages, conversations, how many needed you, how long the run took, and how many mistakes you found when you spot-checked the Safe to ignore pile. If you can't, delete this section.]&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest limits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A 3B model can miss a request buried in a long thread. That is why every verdict shows its reason.&lt;/li&gt;
&lt;li&gt;Dry run mode is only a keyword check for testing the page. Do not judge accuracy from it.&lt;/li&gt;
&lt;li&gt;The "minutes saved" figure assumes about 5 seconds per message, so it is an estimate.&lt;/li&gt;
&lt;li&gt;The numbers on the home page (1,400 messages, 11 that need you) are example figures. The report screen shows real counts.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>CULL</title>
      <dc:creator>Tanisha Naruka</dc:creator>
      <pubDate>Sun, 18 Oct 2026 17:49:16 +0000</pubDate>
      <link>https://dev.to/tanisha_naruka_c61a4d0da0/cull-jki</link>
      <guid>https://dev.to/tanisha_naruka_c61a4d0da0/cull-jki</guid>
      <description>&lt;p&gt;&lt;em&gt;This is my submission for the Hacktoberfest Open-Source AI challenge, Side Hustle week.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Three thousand photos, one weekend
&lt;/h2&gt;

&lt;p&gt;After a wedding, a photographer has around 3,000 frames and needs to throw away two-thirds of them before editing can begin. That means squinting at near-identical bursts, hunting for blinks, and zooming in to check focus, one photo at a time. It takes hours. It is also the one step of the job that clients never see and never want to pay for.&lt;/p&gt;

&lt;p&gt;AI cullers exist, but they ask for the one thing a photographer can't hand over: the whole shoot, uploaded to a server they don't control. Wedding, family and school photos come with privacy promises. For many photographers, that rules those tools out.&lt;/p&gt;

&lt;p&gt;That gap is the idea behind &lt;strong&gt;Cull&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Cull does
&lt;/h2&gt;

&lt;p&gt;Cull sorts a shoot into keepers and rejects, and every step runs on the photographer's own machine. It is plain HTML, CSS and JavaScript, with no backend and no build step.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: a fast first pass, in the browser.&lt;/strong&gt; Each photo is scored on sharpness and exposure, and a perceptual hash groups bursts so only the best frame of each one survives. The sharpness score is the variance of a Laplacian filter over a downscaled copy, which is cheap and works well for catching blur:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="c1"&gt;// Laplacian at each pixel&lt;/span&gt;
&lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;s2&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sharpness&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;s2&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                    &lt;span class="c1"&gt;// variance = how sharp&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2: Gemma makes the hard calls.&lt;/strong&gt; The photos that land close to the keep threshold are exactly the ones maths can't judge: is that a blink, is the face soft or the background? After upload, Cull sends each borderline photo to &lt;strong&gt;Gemma 3 running in the photographer's own Ollama&lt;/strong&gt; and asks whether the eyes are open, the subject is sharp and the composition is worth keeping. Gemma answers KEEP or REJECT, and that verdict overrides the score.&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="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;ollamaUrl&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/api/generate`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;body&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;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gemma3:4b&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;images&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;jpegBase64&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 3: the AI is visible, and the human stays in charge.&lt;/strong&gt; The workspace has a Gemma panel that shows the model, the score, Gemma's reasoning and how many photos the AI has judged. Photos Gemma decided carry an AI badge. K and X keep or reject, and any photo can be compared with the best frame of its burst.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: real output.&lt;/strong&gt; Export a ZIP of the kept originals, or a CSV of every decision with its reason.&lt;/p&gt;

&lt;p&gt;Around that are the practical pieces: adjustable thresholds and weights, saved shoots, a Models page that lists what your Ollama has installed, and a local-only account so settings persist. Nothing leaves the machine except requests to &lt;code&gt;localhost&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why open innovation matters for what I built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Privacy is the product.&lt;/strong&gt; With a hosted vision API, my pitch would be "trust us with your clients' faces". With open weights it becomes "there is nothing to trust: open the network tab and look." For wedding, family and school photographers, that is the reason to buy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The economics only work with a local model.&lt;/strong&gt; Hosted vision APIs charge per image, and a single wedding is thousands of images. Local inference costs nothing per photo, so I can charge a flat price and never meter a customer's usage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I can swap and tune the model.&lt;/strong&gt; The model is one setting in the app. When a better open vision model appears, I change one string. The critique prompt is editable too, so a portrait photographer and a wildlife photographer can ask Gemma different questions. A closed API would leave me with whatever the provider decides to ship, at whatever price they decide to charge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where the open approach fell short.&lt;/strong&gt; A 4B-parameter model is weaker than the largest closed models, and each Gemma call takes a few seconds on a laptop. That is why Gemma only sees the borderline photos and the cheap maths handles the rest. I haven't benchmarked Cull against a professional culler, so I won't quote an accuracy number. RAW files aren't read directly yet, so photographers export JPG previews first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/tanisha-naruka/Cull-project.git" rel="noopener noreferrer"&gt;https://github.com/tanisha-naruka/Cull-project.git&lt;/a&gt;&lt;br&gt;
&lt;a href="https://drive.google.com/file/d/1J6mHriBak1qwHotPanyfiztWmIZcqEB3/view?usp=sharing" rel="noopener noreferrer"&gt;https://drive.google.com/file/d/1J6mHriBak1qwHotPanyfiztWmIZcqEB3/view?usp=sharing&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama pull gemma3:4b
&lt;span class="nv"&gt;OLLAMA_ORIGINS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;*&lt;/span&gt; ollama serve    &lt;span class="c"&gt;# Windows PowerShell: $env:OLLAMA_ORIGINS="*"; ollama serve&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;code&gt;index.html&lt;/code&gt; (or run &lt;code&gt;npm start&lt;/code&gt;), create a local account, upload a folder of JPGs and watch Gemma review the borderline ones. If Ollama isn't running, Cull still works using the maths-only first pass.&lt;/p&gt;

&lt;h2&gt;
  
  
  The side hustle
&lt;/h2&gt;

&lt;p&gt;Cull is free for local use. The paid version I'd sell is a one-off licence for XMP sidecars, so every keep and reject lands directly in Lightroom. I haven't built that part yet. Because there are no servers to run, almost all of the price is margin.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize categories
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best Use of Gemma&lt;/strong&gt;: Gemma 3 is the judge in the pipeline, running locally through Ollama.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Nature Bingo</title>
      <dc:creator>Tanisha Naruka</dc:creator>
      <pubDate>Sun, 11 Oct 2026 14:56:16 +0000</pubDate>
      <link>https://dev.to/tanisha_naruka_c61a4d0da0/nature-bingo-4pn9</link>
      <guid>https://dev.to/tanisha_naruka_c61a4d0da0/nature-bingo-4pn9</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;Nature Bingo is a web app designed so that the best session is the shortest one: open it, get a quest, put the phone in your pocket, and go outside.&lt;/p&gt;

&lt;p&gt;You tell the app what you like (birds, plants, photography, hiking, mindfulness), how much time you have (5 to 60 minutes), and whether you're indoors or out. Gemma, an open-weight model, writes one short, safe nature quest for you, like "Listen and Count: stand still and note every different bird call you hear."&lt;/p&gt;

&lt;p&gt;Then you play in the real world:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;3x3 Nature Bingo:&lt;/strong&gt; tick off real finds like a bird, a feather or running water. Completing a line earns bonus XP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nature Journal:&lt;/strong&gt; record what you noticed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nature Passport:&lt;/strong&gt; collect twelve stamps as you play.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Screen-time page:&lt;/strong&gt; log your minutes against a daily goal.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's for anyone who wants a gentle nudge outside without another app competing for their attention: students, desk workers, families, and beginner birders or hikers.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://drive.google.com/file/d/1Tu0LLBFrjHmqe3Ih2ZnQOzDoN33-pzN7/view?usp=sharing" rel="noopener noreferrer"&gt;https://drive.google.com/file/d/1Tu0LLBFrjHmqe3Ih2ZnQOzDoN33-pzN7/view?usp=sharing&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/tanisha-naruka/Nature-Bingo.git" rel="noopener noreferrer"&gt;https://github.com/tanisha-naruka/Nature-Bingo.git&lt;/a&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model:&lt;/strong&gt; Gemma, Google's open-weight model, running locally through &lt;strong&gt;Ollama&lt;/strong&gt; (&lt;code&gt;gemma3:1b&lt;/code&gt; while developing, configurable up to &lt;code&gt;gemma3:4b&lt;/code&gt; or larger).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stack:&lt;/strong&gt; Next.js 14 (App Router), TypeScript and Tailwind CSS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server route:&lt;/strong&gt; Gemma is only ever called from a server route. It validates input, caps lengths, rate limits requests, and asks the model&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Panel Prep</title>
      <dc:creator>Tanisha Naruka</dc:creator>
      <pubDate>Mon, 05 Oct 2026 06:57:06 +0000</pubDate>
      <link>https://dev.to/tanisha_naruka_c61a4d0da0/panel-prep-31n0</link>
      <guid>https://dev.to/tanisha_naruka_c61a4d0da0/panel-prep-31n0</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I built &lt;strong&gt;PanelPrep&lt;/strong&gt;, a local AI interview-practice coach designed to help someone prepare for important interviews.&lt;/p&gt;

&lt;p&gt;The problem wasn't finding another list of interview questions. The difficult part was actually practicing out loud.&lt;/p&gt;

&lt;p&gt;PanelPrep turns the user's own study material into an interactive mock interview. Users can upload PDFs, DOCX files, text files, images, or scanned documents, and PanelPrep generates questions based on that material.&lt;/p&gt;

&lt;p&gt;Users can answer by speaking or typing, receive follow-up questions, and review measurable feedback such as speaking speed, filler words, answer length, and important terms used.&lt;/p&gt;

&lt;p&gt;It supports both English and Hindi, making interview practice more comfortable and accessible.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://drive.google.com/file/d/148w7j5kkjxSWfAF4OC9RqslQQr40H3aJ/view?usp=sharing" rel="noopener noreferrer"&gt;https://drive.google.com/file/d/148w7j5kkjxSWfAF4OC9RqslQQr40H3aJ/view?usp=sharing&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/tanisha-naruka/Panelprep.git" rel="noopener noreferrer"&gt;https://github.com/tanisha-naruka/Panelprep.git&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;The core of PanelPrep is &lt;strong&gt;Gemma&lt;/strong&gt;, Google's open-weight model, running locally through &lt;strong&gt;Ollama&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The user provides their own preparation material, which is processed by the application and used to generate interview questions through the local Gemma model.&lt;/p&gt;

&lt;p&gt;The application is built with JavaScript and Node.js. It also includes document extraction, OCR, voice interaction, interview metrics, profiles, history, backups, and progress tracking.&lt;/p&gt;

&lt;p&gt;The AI generates the interview questions, while normal application code calculates measurable results such as speaking speed, filler words, answer length, and important terms used.&lt;/p&gt;

&lt;p&gt;If the model produces invalid output or Ollama is unavailable, PanelPrep can fall back to a built-in question bank instead of simply breaking.&lt;/p&gt;

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

&lt;p&gt;Interview preparation can involve personal information, resumes, academic records, and private preparation material.&lt;/p&gt;

&lt;p&gt;Using an open-weight model locally means the core AI experience can run directly on the user's computer instead of requiring their personal preparation material to be sent to a closed AI service.&lt;/p&gt;

&lt;p&gt;This gives PanelPrep:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Privacy for personal preparation material&lt;/li&gt;
&lt;li&gt;No per-session cloud AI cost&lt;/li&gt;
&lt;li&gt;The ability to change or compare local models&lt;/li&gt;
&lt;li&gt;More control over how AI output is handled&lt;/li&gt;
&lt;li&gt;An AI experience that can work locally without depending on a paid API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For this project, open innovation wasn't just a technical choice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It made it possible to build a more private and controllable interview coach for a real person.&lt;/strong&gt;&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Best Use of Gemma
&lt;/h3&gt;

&lt;p&gt;PanelPrep uses &lt;strong&gt;Gemma 3 locally through Ollama&lt;/strong&gt; as the core AI model for generating interview questions from the user's own material.&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

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

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

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

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

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

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

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