<?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: Dennys A</title>
    <description>The latest articles on DEV Community by Dennys A (@dennis_ant).</description>
    <link>https://dev.to/dennis_ant</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%2F4156444%2Fa4c5a63d-3f57-4cd5-9bf4-0df4f6f96ce3.jpg</url>
      <title>DEV Community: Dennys A</title>
      <link>https://dev.to/dennis_ant</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dennis_ant"/>
    <language>en</language>
    <item>
      <title>SkillWalk - approve the tutorial, then watch it work</title>
      <dc:creator>Dennys A</dc:creator>
      <pubDate>Mon, 26 Oct 2026 06:38:49 +0000</pubDate>
      <link>https://dev.to/dennis_ant/skillwalk-approve-the-tutorial-then-watch-it-work-4igc</link>
      <guid>https://dev.to/dennis_ant/skillwalk-approve-the-tutorial-then-watch-it-work-4igc</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;You find an AI tutorial you want to try. Then come the pauses: find the repository, set up the tools, follow along, and figure out why your result looks different. Another useful video joins the "I'll try this later" collection.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;SkillWalk&lt;/strong&gt; for that moment.&lt;/p&gt;

&lt;p&gt;It turns three reviewed YouTube tutorials into local workflows you can watch. Confirm the video, review the analysis, and approve execution. From there, it runs the supported steps, checks the result in a real browser, attempts bounded repairs when checks fail, and delivers the checked output without another required click. Stop remains available.&lt;/p&gt;

&lt;p&gt;The main tutorial produces a PDF question-answering app. Presentation and frontend-design tutorials are also available.&lt;/p&gt;

&lt;p&gt;You can paste your own YouTube link to check whether SkillWalk supports it. Currently, execution is available for three reviewed tutorials; other links are preview-only. SkillWalk uses local Gemma models, so tutorials designed around frontier Claude or OpenAI models may produce different results or require capabilities this version doesn't support.&lt;/p&gt;

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

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/QzIsj7Iy41A" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/QzIsj7Iy41A" rel="noopener noreferrer"&gt;Watch on YouTube&lt;/a&gt;. This animated promo illustrates SkillWalk's workflow.&lt;/p&gt;

&lt;p&gt;The built-in document run needs no writing or upload. SkillWalk supplies a labelled synthetic PDF, opens the resulting app, and tests questions against its table and chart.&lt;/p&gt;

&lt;p&gt;In the application, local model work, actual browser activity and the finished app are shown as distinct stages. Afterwards, you can ask your own questions, download the checked source, or use &lt;strong&gt;Try it yourself&lt;/strong&gt; to follow the original tutorial independently.&lt;/p&gt;

&lt;p&gt;SkillWalk runs locally; there is no hosted app.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/antunishdPursuit/SkillWalk" rel="noopener noreferrer"&gt;SkillWalk on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The repository includes the MIT-licensed application and local setup instructions.&lt;/p&gt;

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

&lt;p&gt;The document workflow follows &lt;a href="https://youtu.be/hBDNv47KCKo" rel="noopener noreferrer"&gt;Nariman Codes' tutorial&lt;/a&gt; and its &lt;a href="https://github.com/NarimanN2/ollama-playground/tree/bb2ae8d1d3665d725afd5db5df1823203002c15c/multi-modal-rag" rel="noopener noreferrer"&gt;MIT-licensed source&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Local Gemma interprets the actual video captions, sampled frames and source materials, then produces configuration instructions. Reviewed adapters run the supported steps instead of executing commands taken from video text.&lt;/p&gt;

&lt;p&gt;The app extracts PDF text, tables and images. &lt;strong&gt;Gemma 3 4B&lt;/strong&gt; describes visual content and answers questions; &lt;strong&gt;EmbeddingGemma&lt;/strong&gt; supports local retrieval. Node coordinates the workflow, Streamlit provides the resulting app, and Playwright checks it inside an isolated local Docker runtime.&lt;/p&gt;

&lt;p&gt;The result is a working local app where you can ask questions about a PDF, see the retrieved source passages, and try your own document after the automatic run finishes. The checked source is available to download so you can inspect or adapt the workflow.&lt;/p&gt;

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

&lt;p&gt;SkillWalk builds on reusable source code and runs its model inference on your own computer. It needs no paid model API or model-service key, and PDF contents are not sent to a hosted inference provider. Instructions and code are available to inspect and adapt.&lt;/p&gt;

&lt;p&gt;That makes repeated attempts possible without a per-request model bill. Hardware, electricity and setup still have costs. YouTube and initial downloads need internet access.&lt;/p&gt;

&lt;p&gt;There are tradeoffs: the document video demonstrates a larger Gemma model, while the other two tutorials demonstrate Claude. This local adaptation does not promise the same appearance or answer quality.&lt;/p&gt;

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

&lt;p&gt;Instead of pausing, rewinding and following every step yourself, give SkillWalk a supported YouTube tutorial. It analyzes the video and prepares a plan. Approve it, then sit back and watch the workflow run—from creating the result to testing it and making supported repairs.&lt;/p&gt;

&lt;p&gt;When it finishes, explore what it made or download the source to try it yourself.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Best Use of Gemma:&lt;/strong&gt; local Gemma performs source interpretation and configuration, image/table description and document answers. EmbeddingGemma supports retrieval. These are working parts of the product, rather than an added summary.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>gemma</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Roolin: rehearse the unexpected before opening night</title>
      <dc:creator>Dennys A</dc:creator>
      <pubDate>Mon, 19 Oct 2026 05:20:01 +0000</pubDate>
      <link>https://dev.to/dennis_ant/roolin-rehearse-the-unexpected-before-opening-night-23id</link>
      <guid>https://dev.to/dennis_ant/roolin-rehearse-the-unexpected-before-opening-night-23id</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;It is 19:03 on the night of the school showcase. The soloist is not in the wings. The host is looking at you, the audience is looking at the curtain, and you have about a minute to say something to the crew that does not make it worse.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Roolin is a local 3D rehearsal room for that minute.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It gives teachers, stage managers and community-theatre organisers somewhere to practise responding when a microphone fails or a performer is late. A theatre volunteer should not need to understand AI or programming to practise a difficult moment. Once the local setup is complete, the app guides them through the running order, their response and the next thing to check.&lt;/p&gt;

&lt;p&gt;Bring your running order, review the cues proposed by Gemma, and explore a representative theatre—from the audience to backstage. At a cue, choose a disruption and write what you would actually tell the team. Gemma responds to your words with coaching and a concrete next check.&lt;/p&gt;

&lt;p&gt;For example, when the soloist is late, you can practise briefing the crew and holding the show. Accepting that hold moves the current and later cues by five minutes while preserving the original schedule. Using a reported tested spare microphone leaves the times unchanged.&lt;/p&gt;

&lt;p&gt;Preparation helps you work backwards from the first cue to decide when setup should begin.&lt;/p&gt;

&lt;p&gt;The potential paid direction is team plans for drama departments and small production companies: shared running orders, collaborative rehearsals and crew-ready handoffs. Those are future possibilities. I’ve spoken with different people about whether this is something they would pay for; those conversations are exploratory, rather than confirmed purchases.&lt;/p&gt;

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

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/MhSC1Lf0ZZI" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/MhSC1Lf0ZZI" rel="noopener noreferrer"&gt;Watch the Roolin demo on YouTube&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;“The Show Before the Show” follows a fictional theatre volunteer facing a late soloist. Product scenes show the real Roolin app running with local Gemma and demonstrate how the rehearsal flow works.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/antunishdPursuit/Roolin" rel="noopener noreferrer"&gt;Roolin on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The application is MIT-licensed and runs locally. The README covers installation, model setup and limitations.&lt;/p&gt;

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

&lt;p&gt;I built the theatre with Three.js, alongside a JavaScript interface and a local Node server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemma 4 E4B, running through Ollama, handles two jobs:&lt;/strong&gt; turning plain-text show notes into proposed cues with source quotations, and coaching written responses to disruptions.&lt;/p&gt;

&lt;p&gt;Application code checks cue times, quoted text and valid schedule changes. The organiser reviews the results and approves changes.&lt;/p&gt;

&lt;p&gt;All 18 automated tests pass, and separate browser walkthroughs exercised real local inference. AI tools assisted development and demo production.&lt;/p&gt;

&lt;p&gt;This is a single-user prototype with two simulated disruptions. It does not detect equipment failures or certify readiness. Session data disappears on refresh; export it first.&lt;/p&gt;

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

&lt;p&gt;A lot of useful technology comes with another payment or subscription. Sometimes, you can build what you need yourself using open tools and a computer you already have at home.&lt;/p&gt;

&lt;p&gt;That is what I wanted to explore with Roolin. With suitable hardware, open weights and local inference make it possible to create a rehearsal tool without paying a cloud provider for every practice session. Hardware, electricity and initial setup still have a cost.&lt;/p&gt;

&lt;p&gt;The person using it does not have to be the person who built it. A theatre volunteer can focus on what they would say to the crew and how to respond to a disruption, while the app provides a place to practise and review the consequences. Making those tools available to people who are not tech savvy is part of the value I want to test.&lt;/p&gt;

&lt;p&gt;Local inference also lets rehearsal notes stay on the organiser’s computer. The application code, prompts and validation rules are available for others to inspect and adapt to their own productions.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Best Use of Gemma:&lt;/strong&gt; local Gemma powers source-linked cue drafting and response coaching—the two language tasks at the heart of Roolin.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>gemma</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Sidewalk Senate: go for a walk, then let a local Gemma help you write to the people redesigning your street</title>
      <dc:creator>Dennys A</dc:creator>
      <pubDate>Sun, 11 Oct 2026 21:52:21 +0000</pubDate>
      <link>https://dev.to/dennis_ant/sidewalk-senate-go-for-a-walk-then-let-a-local-gemma-help-you-write-to-the-people-redesigning-5h9p</link>
      <guid>https://dev.to/dennis_ant/sidewalk-senate-go-for-a-walk-then-let-a-local-gemma-help-you-write-to-the-people-redesigning-5h9p</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;Somewhere in a city PDF, someone has already redrawn the corner you walk past every day. In March 2026, NYC DOT presented a plan for Court Square in Long Island City, Queens: wider sidewalks on Thomson Avenue, new pedestrian crossings, a raised shared street. The people who know whether that corner feels crowded are the people walking it. Almost none of them will ever open that PDF.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sidewalk Senate&lt;/strong&gt; is a small, local-first notebook that sits on either side of an ordinary outing.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Before you go (optional).&lt;/strong&gt; Type one line about where you're headed. Press &lt;strong&gt;I'm heading out&lt;/strong&gt;, and the app answers: &lt;em&gt;"That's enough screen time."&lt;/em&gt; The map disappears. There is nothing to record and nothing tracking you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Go outside.&lt;/strong&gt; Get coffee, walk with a friend, sit somewhere. No GPS, no photos, no check-ins. The outing is the point.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When you're back.&lt;/strong&gt; Write down where you spent time and how it felt, in your own words. If the place matches one of the curated locations, you confirm it yourself. The app never guesses where you were.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Find the connection.&lt;/strong&gt; A local open-weight model (Gemma 4) reads your reflection next to a dated public proposal and suggests where your experience fits. It cites the exact page, and everything it writes is labelled &lt;em&gt;AI interpretation · Review required&lt;/em&gt;. Your original words are shown separately and never rewritten.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shape your suggestion.&lt;/strong&gt; Edit the AI's suggested question or write your own, tick &lt;em&gt;"I've reviewed these words,"&lt;/em&gt; and format an unsent draft. &lt;strong&gt;Nothing is ever sent.&lt;/strong&gt; That part stays with you.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the place you visited has no reviewed proposal, it says so plainly ("Your thought still belongs here") instead of borrowing a nearby project to look helpful.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who it's for:&lt;/strong&gt; residents who already walk their neighborhood and have opinions about it, but who will never attend a community board meeting or read a long design presentation. The screen is the shortest part of the experience: a line before you leave, a few sentences when you get back.&lt;/p&gt;

&lt;p&gt;The first pilot area is ZIP 11101 (Long Island City, Queens), with one curated, page-cited source: NYC DOT's &lt;em&gt;Court Square Pedestrian Improvements&lt;/em&gt;, March 2026.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://youtu.be/t7dQuBZQnyU" rel="noopener noreferrer"&gt;Watch the 2-minute Sidewalk Senate demo on YouTube&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/t7dQuBZQnyU" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Prefer a file? The same video and its captions are attached to a &lt;a href="https://github.com/antunishdPursuit/SidewalkSenate/releases/tag/demo-video-v1" rel="noopener noreferrer"&gt;GitHub release&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The video is a fictional outing run through the real app: every app screen is the real local website, and the connection, page citation and draft are real output from Gemma 4 running on my own computer. The outing and the reflection are simulated, which the video says at the start and on the end card. The outdoor shots are stock footage from Pexels (Keira Burton and Coverr), not my walk. The model's 21-second wait is shown faster, with the real time on screen. Even the soundtrack stayed local and open: narration by Kokoro-82M and music generated with Meta's MusicGen-small.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&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/antunishdPursuit" rel="noopener noreferrer"&gt;
        antunishdPursuit
      &lt;/a&gt; / &lt;a href="https://github.com/antunishdPursuit/SidewalkSenate" rel="noopener noreferrer"&gt;
        SidewalkSenate
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A local Gemma-powered civic notebook connecting everyday outings with dated public-space proposals and unsent resident suggestions.
    &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;Sidewalk Senate&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A new local-first prototype connecting everyday outings with dated public-space proposals and resident suggestions.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/antunishdPursuit/SidewalkSenate" rel="noopener noreferrer"&gt;Source repository&lt;/a&gt; · &lt;a href="https://github.com/antunishdPursuit/SidewalkSenate/archive/refs/heads/main.zip" rel="noopener noreferrer"&gt;Download source ZIP&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Current scope&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;A local website with two notebook workspaces: &lt;strong&gt;My outing&lt;/strong&gt; and &lt;strong&gt;Connection &amp;amp; draft&lt;/strong&gt;. A local API and an optional interactive terminal session support the same source-backed workflow. Current coverage is one curated Court Square project with three reference intersections. Other places can still support a resident-written suggestion without an invented proposal match.&lt;/p&gt;
&lt;p&gt;No tracking, Gmail, email sending, account connection, live search, analytics or persistent reflection storage is implemented. Nothing here establishes present street conditions or an open consultation. The website is intended to be used briefly before or after an ordinary outing; it requires no phone use or recording while outside.&lt;/p&gt;
&lt;p&gt;Requires Node.js 24+. Run npm ci to install the frontend dependencies. No paid API is required.&lt;/p&gt;
&lt;div class="highlight highlight-source-powershell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;npm ci
npm test
npm run check
npm&lt;/pre&gt;…
&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/antunishdPursuit/SidewalkSenate" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;a href="https://github.com/antunishdPursuit/SidewalkSenate" rel="noopener noreferrer"&gt;Sidewalk Senate source code on GitHub&lt;/a&gt; (MIT-licensed; the README covers setup, the pinned model, privacy boundaries and known limits).&lt;/p&gt;

&lt;p&gt;Run it locally (Node.js 24+, no paid API):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;npm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;setup&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;npm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;local&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open &lt;code&gt;http://127.0.0.1:4178&lt;/code&gt;. &lt;code&gt;npm run doctor&lt;/code&gt; checks dependencies and the model service; &lt;code&gt;npm run simulate&lt;/code&gt; runs a labelled two-stop outing through the real HTTP handlers with mock AI, and &lt;code&gt;npm run simulate:real&lt;/code&gt; runs the same outing against real local Gemma.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;The model.&lt;/strong&gt; Gemma 4 E4B Instruct, the &lt;code&gt;Q4_0&lt;/code&gt; GGUF from &lt;code&gt;ggml-org/gemma-4-E4B-it-GGUF&lt;/code&gt; (pinned revision and SHA256 in the README), imported into &lt;strong&gt;Ollama&lt;/strong&gt; as &lt;code&gt;local-gemma&lt;/code&gt; with a 4096-token context. The app calls Ollama's OpenAI-compatible chat endpoint on &lt;code&gt;127.0.0.1:11434&lt;/code&gt;. That's it: no cloud endpoint is accepted. The URL validator rejects anything that isn't a loopback HTTP address.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The architecture.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser notebook (React + Vite + TypeScript, Leaflet map)
   │  same-origin, loopback only
   ▼
Local Node API (/api/cases, /api/reflect, /api/draft)
   │  validated JSON in, validated JSON out
   ▼
Ollama · Gemma 4 E4B (open weights, on this computer)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Keeping a small model honest.&lt;/strong&gt; The interesting work wasn't the prompt; it was everything around it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Schema-constrained output.&lt;/strong&gt; Gemma answers through a strict JSON schema (summary, connections, suggestion, open questions), at temperature 0.2 with a bounded output budget. A response cut off by the length limit is rejected instead of half-parsed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The model can only cite what a person reviewed.&lt;/strong&gt; Each curated source is broken into short claims with a page number. Gemma may only refer to claims by ID; the server rejects any unknown or duplicate ID and builds the citation link (&lt;code&gt;...#page=17&lt;/code&gt;) itself, so the model can't invent a page.
&lt;/li&gt;
&lt;/ul&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;allowed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;claims&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&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;connections&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;connections&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&amp;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="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;allowed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;claimId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;seen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;claimId&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;InputError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Unsupported or duplicate source claim.&lt;/span&gt;&lt;span class="dl"&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;claim&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;claims&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;claimId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;claimId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;claimId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;explanation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;explanation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Connection&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
           &lt;span class="na"&gt;sourceClaim&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;claim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;citation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#page=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;claim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;page&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;ul&gt;
&lt;li&gt;
&lt;strong&gt;The resident confirms the place, not the model.&lt;/strong&gt; A ZIP code or a nearby pin never decides relevance. If you pick a curated location, you have to tick &lt;em&gt;"I visited this location"&lt;/em&gt; before any connection is attempted. An unconfirmed or unknown place returns a no-match without calling the model at all.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feelings stay feelings.&lt;/strong&gt; In testing, one response turned a resident feeling hurried at a crossing into a claim about inadequate signal timing. So the model-written rationale is now replaced with a fixed line: &lt;em&gt;based on your personal reflection, not verified street conditions or an engineering assessment.&lt;/em&gt; The prompt also tells it to keep satisfaction as satisfaction and not manufacture a problem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dated means dated.&lt;/strong&gt; The UI keeps saying what a proposal is not: &lt;em&gt;"A proposal is not proof of today's conditions, an open comment period, or completed construction."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Privacy by default.&lt;/strong&gt; No accounts, no analytics, no GPS, no route recording, and no persistent storage of reflections: they live in browser memory for the session. The API binds to loopback and rejects cross-origin requests. The only third party is the OpenStreetMap tile server, which sees the map area you're viewing, never your words.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testing.&lt;/strong&gt; 32 automated tests cover footprint matching, citation validation, the loopback-only inference boundary, review gates, HTTP behavior, and real React component interactions in JSDOM (including resetting an outing while the model is still thinking). A real-model mode runs the same React flow against local Gemma.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI assistance, disclosed.&lt;/strong&gt; I used AI coding assistance and independent source reviews (GPT-6 Astra and Claude Opus 5.5) while building, and Claude Code with HyperFrames and FFmpeg to produce the demo video from a scripted capture of the real app. At runtime, the only AI is local Gemma; nothing calls a hosted model.&lt;/p&gt;

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

&lt;p&gt;Because this app asks people to write down how their own street feels to them.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Your words stay on your machine.&lt;/strong&gt; Where you walk, who you walk with, what made you uncomfortable: with a closed API, every reflection would leave your computer before you'd even decided whether to share it. With open weights, the whole loop (reflection, connection, draft) runs on &lt;code&gt;127.0.0.1&lt;/code&gt;. The demo's narration ran locally too.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Civic tools should be inspectable.&lt;/strong&gt; If an AI is going to tell you that your experience relates to a city proposal, you should be able to read exactly how it decides. Here the prompt, the claim list, the validators and the model hash are all in the repo. A community group can audit them, change them, or swap the model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No meter running.&lt;/strong&gt; There is no per-request bill, so a library, a tenants' association or a classroom could run it without a budget line or an account.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reproducible behavior.&lt;/strong&gt; Pinning an exact open model file means the behavior you test is the behavior you ship. A hosted model can change underneath you; this one can't.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  I took it outside
&lt;/h2&gt;

&lt;p&gt;Today I went for a real walk through ZIP 10001 in Manhattan, with the app closed. When I got back I wrote what I noticed, in my own words: &lt;em&gt;"i think that there should be more repairs on the sidewalk, i saw cracks when i walking."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Here's how it went:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It said no, honestly.&lt;/strong&gt; Sidewalk Senate has one reviewed source so far (Court Square, Queens). For 10001 it answered &lt;em&gt;"No reviewed match. Your thought still belongs here."&lt;/em&gt; It didn't borrow the Queens project, and it didn't call the model at all, because only confirmed, reviewed locations go to Gemma.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;My words stayed mine.&lt;/strong&gt; The reflection and the suggestion went into an unsent draft exactly as I typed them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It found a bug, which I fixed the same day.&lt;/strong&gt; On a no-match stop, the suggestion panel still said &lt;em&gt;"Edit the AI suggestion... You don't have to agree with the proposal,"&lt;/em&gt; when there was neither. It now says there's no reviewed proposal for this place and asks for your own suggestion or question (&lt;a href="https://github.com/antunishdPursuit/SidewalkSenate/commit/e30e3d6" rel="noopener noreferrer"&gt;commit&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The real gap is coverage.&lt;/strong&gt; What I actually wanted to know, which public record or plan covers sidewalk repairs here, is exactly what the app can't answer yet. That's the next step: more reviewed sources and a verified place to send a letter.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's honest to say about it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One curated source so far.&lt;/strong&gt; Coverage is one Court Square project with three reviewed intersections. Live search and other cities are future work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No recipient is verified.&lt;/strong&gt; The draft says it's unsent and asks who the right recipient is. The app never sends anything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The model is still a model.&lt;/strong&gt; Validation guarantees citations point at reviewed claims; it can't guarantee every paraphrase is right. In testing, a reflection where the resident forgot the exact location still got too confident a connection, and positive feedback sometimes got a weak, location-only link. That's why every AI line sits next to your original words and needs your review.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One real outing so far.&lt;/strong&gt; It's described above. It's one person's walk, not a survey.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma:&lt;/strong&gt; Gemma 4 E4B runs locally through Ollama and is central to the core workflow: connecting a resident's reflection to dated, page-cited public proposals under deterministic validation.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>gemma</category>
      <category>opensource</category>
    </item>
    <item>
      <title>RoomTidy: a local Gemma reminder built for my roommate</title>
      <dc:creator>Dennys A</dc:creator>
      <pubDate>Mon, 05 Oct 2026 03:50:09 +0000</pubDate>
      <link>https://dev.to/dennis_ant/roomtidy-a-local-gemma-reminder-built-for-my-roommate-51np</link>
      <guid>https://dev.to/dennis_ant/roomtidy-a-local-gemma-reminder-built-for-my-roommate-51np</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 RoomTidy for my roommate: a small Windows desktop application that offers a gentle reminder when visible clutter remains in an area they choose.&lt;/p&gt;

&lt;p&gt;The user selects a fixed-camera area, explicitly saves a tidy reference, and sets preferences such as allowing books while asking for dishes to be removed. RoomTidy compares later pictures with that reference locally. It describes visible items; it does not claim to detect dust, prove someone has not cleaned, or judge the person.&lt;/p&gt;

&lt;p&gt;The user controls monitoring, snooze, resets and reference updates. References and observation history stay on the computer. The app does not automatically treat persistent clutter as the new tidy baseline. This is a local MVP built for my roommate; recipient feedback and a full timed room trial are still pending.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://youtu.be/_4c8RANLBD4" rel="noopener noreferrer"&gt;Watch the 60-second RoomTidy demo on YouTube&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/_4c8RANLBD4" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;The demo uses generated photographs of a fictional desk, not images of our private room. It runs seven manually staged checks through the actual local comparison and persistence pipeline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Save and check an explicit tidy reference.&lt;/li&gt;
&lt;li&gt;Introduce visible cups, dishes and loose papers.&lt;/li&gt;
&lt;li&gt;Show a dark/blocked view; the count remains unchanged.&lt;/li&gt;
&lt;li&gt;Observe clutter again.&lt;/li&gt;
&lt;li&gt;Reach three valid clutter observations and activate a reminder.&lt;/li&gt;
&lt;li&gt;Observe more clutter without repeating the same episode's notification.&lt;/li&gt;
&lt;li&gt;Return to the reference and reset the count.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The accelerated demo threshold is three valid observations. It is not a recording of thirty elapsed minutes or thirty hourly checks. Normal monitoring checks hourly while the app and computer are awake, with a default threshold of thirty valid clutter observations.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/antunishdPursuit/RoomTidy" rel="noopener noreferrer"&gt;RoomTidy source code on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The application source is MIT-licensed. The README explains setup on the tested Windows computer, local storage, model/runtime provenance and known limits. This MVP is not yet a distributable installer for other computers.&lt;/p&gt;

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

&lt;p&gt;RoomTidy uses Python and PySide6 for the desktop interface, OpenCV for camera handling and image checks, SQLite for observation history, and &lt;strong&gt;Google Gemma 4 E4B Instruct&lt;/strong&gt; for understanding changed scenes.&lt;/p&gt;

&lt;p&gt;The quantized Q4_0 model and matching BF16 vision projector run through an application-owned llama.cpp process on authenticated loopback. Both artifacts were pinned and SHA256-verified. Google and the official GGUF conversion declare Apache-2.0 licensing.&lt;/p&gt;

&lt;p&gt;Gemma receives the user-approved reference and current selected-area picture with allowed-object preferences. It returns a structured status: tidy, clutter_present or unable_to_assess, with a short description of visible evidence. The app validates that response before counting it.&lt;/p&gt;

&lt;p&gt;OpenCV rejects dark, overexposed and low-detail images first. Exact readable pixel matches return a factual reference match without asking the model to invent differences. Changed valid scenes use Gemma. Application logic, rather than the model, owns timestamps, counters and reminder deduplication. Unknown and missed checks do not count as clutter evidence.&lt;/p&gt;

&lt;p&gt;I used AI coding assistance and Opus/Astra source reviews. The generated demonstration assets came from OpenAI image generation; they were not generated by Gemma. Runtime room-image analysis stays local, with no cloud image uploads or fallback AI API.&lt;/p&gt;

&lt;p&gt;Testing mattered more than choosing a model by name. The smaller Gemma E2B candidate failed comparison checks. Initial E4B tests also exposed preference mistakes and false added-object claims on identical pictures. Those findings led to clearer preference instructions and the exact-image safeguard.&lt;/p&gt;

&lt;p&gt;The final regression suite passed &lt;strong&gt;71 tests&lt;/strong&gt;. The seven-step controlled demo produced counters &lt;strong&gt;0, 1, 1, 2, 3, 4, 0&lt;/strong&gt;. Additional local model checks recognized a dim tidy scene, dim clutter, and a scene whose added objects were explicitly permitted.&lt;/p&gt;

&lt;p&gt;These tests do not establish general room accuracy. Camera capture/release was tested separately; classification across genuinely changed real-camera scenes, a full timed monitoring trial, and independently observed Windows toast delivery remain unverified. Windows can suppress toasts, so an active reminder also remains visible in the application.&lt;/p&gt;

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

&lt;p&gt;A room camera captures a private space. Running openly licensed model weights locally lets the app compare pictures without sending them to an image-analysis provider. The user keeps the references, settings and history on their own computer and can pause or delete the app's data.&lt;/p&gt;

&lt;p&gt;The open runtime also made model evaluation possible: I could try different weights, inspect failure behavior, and strengthen validation without rebuilding the product around a hosted API. There is no per-request AI-provider billing for local analysis, though hardware, storage and electricity still have costs.&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 performs the application's central image-understanding task: comparing changed selected-area scenes with an explicit tidy reference while interpreting permitted objects. It is part of the working product, rather than a tool used only to produce the presentation.&lt;/p&gt;

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