<?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: Shristi Sharma</title>
    <description>The latest articles on DEV Community by Shristi Sharma (@shristi132005).</description>
    <link>https://dev.to/shristi132005</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%2F4160042%2Fae2440d4-9341-4920-8e53-75076d391739.png</url>
      <title>DEV Community: Shristi Sharma</title>
      <link>https://dev.to/shristi132005</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shristi132005"/>
    <language>en</language>
    <item>
      <title>👻🎬Miedocuentista: a fully local AI that turns your photos into haunted stories, film scripts and novels📜🪶</title>
      <dc:creator>Shristi Sharma</dc:creator>
      <pubDate>Sat, 31 Oct 2026 19:00:05 +0000</pubDate>
      <link>https://dev.to/shristi132005/miedocuentista-a-fully-local-ai-that-turns-your-photos-into-haunted-stories-film-scripts-and-21</link>
      <guid>https://dev.to/shristi132005/miedocuentista-a-fully-local-ai-that-turns-your-photos-into-haunted-stories-film-scripts-and-21</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;&lt;strong&gt;Miedocuentista&lt;/strong&gt; ("fear-teller") is a spooky storytelling machine that runs entirely on my laptop. You feed it images one at a time and it writes the story frame by frame: a &lt;strong&gt;short film script&lt;/strong&gt;, a &lt;strong&gt;film story&lt;/strong&gt;, or a &lt;strong&gt;novel&lt;/strong&gt; with one chapter per image.&lt;/p&gt;

&lt;p&gt;How it works in one breath: a small vision model looks at each image and lists what it sees (objects, setting, mood), I can correct that list and add my own twists, and a small language model writes the next scene while a rolling "story memory" keeps the plot, characters and open threads alive between scenes. After the final image, I run a &lt;strong&gt;Final AI Story Editor&lt;/strong&gt; that reads the whole story, looks for plot holes and timeline problems, and rewrites every scene so they connect, trying to keep the storyline intact.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How I interpret the theme.&lt;/strong&gt; The ghost in this machine isn't hiding inside the model. It is what the machine &lt;em&gt;sees in your photographs&lt;/em&gt; (every frame is treated as a haunted scene) and what it &lt;em&gt;remembers between scenes&lt;/em&gt;: the story memory literally haunts each new scene with everything that came before. It has a Halloween interface, a horror default, and a Día de los Muertos tone for warmer, remembrance-style stories.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What inspired it.&lt;/strong&gt; It started from one of the challenge's own ideas, a ghost story generator. My first version was simple: one photo in, one ghost story out, using a small vision model and a small language model on my laptop. But one photo only gives you one scene, and stories, films and novels are made of many frames. So I extended it into a frame-by-frame studio where every new image continues the story. I also wanted to build the front end of a future AI video workflow: storyboard images go in, a structured script comes out (visuals, sound, dialogue, transitions) that other open-source tools could later turn into video. And I wanted all of it to run on my own machine, so my photos and stories never leave it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why a pipeline, not just a toy.&lt;/strong&gt; The script format separates &lt;code&gt;VISUAL&lt;/code&gt;, &lt;code&gt;SOUND&lt;/code&gt;, dialogue and &lt;code&gt;TRANSITION&lt;/code&gt; on purpose, and every scene is stored as structured JSON. My longer-term goal is to feed this into open-source image/video and text-to-speech workflows (storyboard in, script out, shots next). That hand-off is &lt;strong&gt;not built yet&lt;/strong&gt;; today it produces the script, story or novel and exports &lt;code&gt;.txt&lt;/code&gt;/&lt;code&gt;.md&lt;/code&gt;.&lt;/p&gt;

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

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

&lt;p&gt;Screenshots, in the order of the workflow:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5mv5s3xrj10uk4btr88q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5mv5s3xrj10uk4btr88q.png" alt="Miedocuentista screenshot 1" width="800" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdwu8y6y99sxfsehyh3et.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdwu8y6y99sxfsehyh3et.png" alt="Miedocuentista screenshot 2" width="800" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjm7dp97dxfqatembt9v9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjm7dp97dxfqatembt9v9.png" alt="Miedocuentista screenshot 3" width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffh9y2cz610rhl8l4l3kj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffh9y2cz610rhl8l4l3kj.png" alt="Miedocuentista screenshot 4" width="799" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdsu1ndc5on5w34ss1ahl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdsu1ndc5on5w34ss1ahl.png" alt="Miedocuentista screenshot 5" width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8i184wmzmbi2nvy88cq7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8i184wmzmbi2nvy88cq7.png" alt="Miedocuentista screenshot 6" width="800" height="766"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F158xvsnz141un88tuqph.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F158xvsnz141un88tuqph.png" alt="Miedocuentista screenshot 7" width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwx19q6crowdcs8jrlac4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwx19q6crowdcs8jrlac4.png" alt="Miedocuentista screenshot 8" width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffovo0yri0r8s9fph9mwp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffovo0yri0r8s9fph9mwp.png" alt="Miedocuentista screenshot 9" width="800" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqxgmqfup730q44otr836.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqxgmqfup730q44otr836.png" alt="Miedocuentista screenshot 10" width="800" height="403"&gt;&lt;/a&gt;&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/shristi005" rel="noopener noreferrer"&gt;
        shristi005
      &lt;/a&gt; / &lt;a href="https://github.com/shristi005/Miedocuentista" rel="noopener noreferrer"&gt;
        Miedocuentista
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Feed the spirits one frame at a time. They write the film, the script, the novel.
    &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;👻 Miedocuentista&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;A fully local, open-source AI story studio that turns a sequence of images into a short story, a film script or a novel, one frame at a time.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Miedo&lt;/em&gt; (fear) + &lt;em&gt;cuentista&lt;/em&gt; (storyteller): the fear-teller. Built for the &lt;strong&gt;Hacktoberfest Open-Source AI Challenge, Week 4: Ghost in the Machine&lt;/strong&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Everything runs on your own computer through &lt;a href="https://ollama.com" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt;. No cloud, no API key, no cost, and your images never leave your machine.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Table of contents&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/shristi005/Miedocuentista#-miedocuentista" rel="noopener noreferrer"&gt;👻 Miedocuentista&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/shristi005/Miedocuentista#table-of-contents" rel="noopener noreferrer"&gt;Table of contents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shristi005/Miedocuentista#1-what-is-this" rel="noopener noreferrer"&gt;1. What is this?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shristi005/Miedocuentista#2-purpose-and-where-it-is-going" rel="noopener noreferrer"&gt;2. Purpose and where it is going&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shristi005/Miedocuentista#3-features" rel="noopener noreferrer"&gt;3. Features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shristi005/Miedocuentista#4-user-flow" rel="noopener noreferrer"&gt;4. User flow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shristi005/Miedocuentista#5-architecture" rel="noopener noreferrer"&gt;5. Architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/shristi005/Miedocuentista#6-how-the-ai-part-works" rel="noopener noreferrer"&gt;6. How the AI part works&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/shristi005/Miedocuentista#61-reading-a-frame-vision" rel="noopener noreferrer"&gt;6.1 Reading a frame (vision)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shristi005/Miedocuentista#62-writing-a-scene" rel="noopener noreferrer"&gt;6.2 Writing a scene&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shristi005/Miedocuentista#63-rolling-story-memory" rel="noopener noreferrer"&gt;6.3 Rolling story memory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shristi005/Miedocuentista#64-final-ai-story-editor" rel="noopener noreferrer"&gt;6.4 Final AI Story Editor&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shristi005/Miedocuentista#7-technology-used" rel="noopener noreferrer"&gt;7. Technology used&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shristi005/Miedocuentista#8-file-structure" rel="noopener noreferrer"&gt;8. File structure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shristi005/Miedocuentista#9-setup-windows-step-by-step" rel="noopener noreferrer"&gt;9. Setup (Windows, step by step)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shristi005/Miedocuentista#10-configuration" rel="noopener noreferrer"&gt;10. Configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shristi005/Miedocuentista#11-api-reference" rel="noopener noreferrer"&gt;11. API reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shristi005/Miedocuentista#12-data-model" rel="noopener noreferrer"&gt;12. Data model&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shristi005/Miedocuentista#13-problems-faced-and-known-limitations" rel="noopener noreferrer"&gt;13. Problems faced and known limitations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/shristi005/Miedocuentista" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The outputs from my test runs (problems included) are in the &lt;code&gt;tested_outputs&lt;/code&gt; folder of the repo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run it yourself&lt;/strong&gt; (needs &lt;a href="https://ollama.com" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt; and Node.js 18+):&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 moondream
ollama pull qwen2.5:3b
git clone https://github.com/shristi005/Miedocuentista.git
&lt;span class="nb"&gt;cd &lt;/span&gt;Miedocuentista/backend
npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open &lt;code&gt;http://localhost:3002&lt;/code&gt;. There is no &lt;code&gt;npm install&lt;/code&gt; step; the backend has zero dependencies.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Open models (via Ollama, all local):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;moondream&lt;/strong&gt; (about 1.7 GB, open weights): the "eyes". For each frame it answers four short questions (caption, objects, setting, mood). Small vision models follow short questions far better than one long prompt.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;qwen2.5:3b&lt;/strong&gt; (about 1.9 GB, open weights): the "writer", the "memory keeper" and the "editor".&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;App:&lt;/strong&gt; Node.js backend with &lt;strong&gt;zero npm dependencies&lt;/strong&gt;, plain HTML/CSS/JS frontend, and one JSON file per project. Frontend and backend are separate folders.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The parts I'm proudest of:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Rolling story memory.&lt;/strong&gt; A 3B model on a small GPU can't re-read a novel for every scene. After each scene, the model merges the old memory with the new scene into a note of about 140 words (characters, setting, events, open threads). The note stays the same size however long the story gets, and only the previous scene's ending is passed word for word.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regenerate / undo that restores the story memory.&lt;/strong&gt; Each scene saves the memory from before it, so regenerating or undoing the last scene brings back the exact earlier state.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Final AI Story Editor.&lt;/strong&gt; Pass 1 reads the complete story and writes an edit report (canon, plot holes, timeline errors, repetition, weak transitions, per-scene fixes). Pass 2 rewrites each scene using that report plus the neighbouring scenes. The original is always kept, with an Edited/Original toggle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human in the loop.&lt;/strong&gt; The vision model makes mistakes, so every frame's caption and element chips are editable before they shape the story.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Challenges I Hit (and Why I Think They Happen)
&lt;/h2&gt;

&lt;p&gt;I tested with a three-frame lighthouse story: a boat and pier, a stone archway ringed with red roses and an urn, and a keeper's room with a journal. The pipeline worked end to end (image to elements to scene to memory to next scene to editor), but a 3B model on a 4 GB GPU has real limits. I'd rather show them than hide them. The causes below are my best diagnosis from reading the outputs and my own prompts, not proven facts.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem I saw&lt;/th&gt;
&lt;th&gt;What it looked like&lt;/th&gt;
&lt;th&gt;Likely cause&lt;/th&gt;
&lt;th&gt;Planned fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Copy-pasting earlier text&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The same paragraphs ("The room spun, making her dizzy for a moment…", "The handprint on the urn matched the others…") show up in all three chapters&lt;/td&gt;
&lt;td&gt;My prompt passes the last ~1,200 characters of the previous scene word for word. Small models tend to copy what is sitting in their context, and I set no repetition penalty&lt;/td&gt;
&lt;td&gt;Pass a one-line summary of the last beat instead of raw text; set a repeat penalty; detect duplicated sentences and regenerate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;The story stalls and loops&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Chapters keep re-describing the lantern, the midnight, the room and the handprint instead of moving on&lt;/td&gt;
&lt;td&gt;I tell the writer to use every visible element, neighbouring frames overlap, and the model has no plan for what NEW thing happens&lt;/td&gt;
&lt;td&gt;A "beat planning" step: decide one new event and one new piece of information, then write from that plan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Memory feeds on itself&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Repetition gets worse in later chapters, and the timeline resets (she arrives at the dock again)&lt;/td&gt;
&lt;td&gt;The story memory is summarised by the same small model from text that is already repetitive, so the repetition is baked into the memory. There is no location/time tracking&lt;/td&gt;
&lt;td&gt;Structured memory (character sheet, event list, current place and time), facts the user can pin, and de-duplication before summarising&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Headings and numbering ignored&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Two blocks labelled "Chapter 2" and a third with no heading; chapter titles reuse the book's title&lt;/td&gt;
&lt;td&gt;I ask the model to write the heading itself, and 3B models follow formatting loosely&lt;/td&gt;
&lt;td&gt;The app inserts the chapter number; a separate tiny call writes a new chapter title&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Prompt wording leaks into the prose&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Phrases like "the journal from the previous scene" appear inside the story&lt;/td&gt;
&lt;td&gt;Labels in my prompt (PREVIOUS SCENE, reader-added elements) get echoed&lt;/td&gt;
&lt;td&gt;Rename labels, clean leaked phrases after generation, add a worked example&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Script mode leaks its template&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;NAME:&lt;/code&gt; printed literally, &lt;code&gt;CUT TO / FADE OUT / SMASH CUT&lt;/code&gt; copied as-is, the prompt's input block echoed&lt;/td&gt;
&lt;td&gt;I used placeholders in the format instructions and the model copied them&lt;/td&gt;
&lt;td&gt;Replace placeholders with one concrete example scene; strip stray labels&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;The Final Editor can't fix it&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The edited version still has repeated passages&lt;/td&gt;
&lt;td&gt;The editor is the same small model that wrote the problems, so it cannot reliably spot them&lt;/td&gt;
&lt;td&gt;A deterministic de-duplication pass first; a larger model for the editor only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Vision mistakes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The 1.7 GB vision model sometimes misses or invents objects&lt;/td&gt;
&lt;td&gt;Tiny model&lt;/td&gt;
&lt;td&gt;Already mitigated: every caption and chip is editable before it shapes the story. Next: a stronger vision model&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;What this taught me.&lt;/strong&gt; Small local models are good at structure and weak at long, coherent prose. Most of what went wrong is engineering around the model (what I put in its context, what I let it decide, what I check afterwards), not a flaw in the idea. The rolling memory and two-pass editor are my first answer to that; the table above is the second round.&lt;/p&gt;

&lt;h2&gt;
  
  
  Future Improvements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Quality guardrails:&lt;/strong&gt; a repetition score for every scene, automatic regeneration when a scene copies earlier text, and a "must change something" rule for each scene.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Planning before writing:&lt;/strong&gt; generate a short beat (new event, new information, emotional turn) from the story memory and the frame, then write the scene from that beat.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better memory:&lt;/strong&gt; structured JSON memory with a character sheet, timeline and open threads, plus facts the author can pin so names and relationships never drift.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stricter formats:&lt;/strong&gt; the app owns chapter numbers and scene headings; script output is cleaned and validated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bigger or better models:&lt;/strong&gt; because the models are environment variables, a 7B or 8B model (on a machine with more VRAM) can be dropped in. I want to benchmark a few open models side by side on the same frames.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;In-browser editing&lt;/strong&gt; of any scene, and a side-by-side diff between original and edited versions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Video-workflow hand-off:&lt;/strong&gt; export each scene as a shot list (&lt;code&gt;VISUAL&lt;/code&gt;, &lt;code&gt;SOUND&lt;/code&gt;, dialogue, duration) so open-source image/video and text-to-speech tools can pick it up. &lt;strong&gt;Not built yet.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A Día de los Muertos "ofrenda" mode:&lt;/strong&gt; remembrance stories from old family photos, kept fully on the owner's machine. Today the Día de los Muertos option is only a tone setting.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How It Can Be Used
&lt;/h2&gt;

&lt;p&gt;Today, Miedocuentista is best treated as a &lt;strong&gt;first-draft and idea engine&lt;/strong&gt;, not a finished-story generator. You get structure and momentum quickly, then you edit.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Short films and YouTube videos:&lt;/strong&gt; drop in storyboard frames or concept art, get a scene-by-scene script with visuals, sound and dialogue to rewrite. Later, the same structure is meant to feed AI video workflows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Novel and short-story outlines:&lt;/strong&gt; turn a mood board or a folder of reference images into chapters to react to.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Game and world-building:&lt;/strong&gt; turn level screenshots or location art into lore and quest text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Classrooms and writing groups:&lt;/strong&gt; the same photos, different frames, different stories; compare and discuss.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Private projects:&lt;/strong&gt; because everything is local, it is suitable for personal photos and unreleased art.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How:&lt;/strong&gt; (1) pick short film, feature film or novel; (2) choose script or story; (3) add your frames one by one and correct the elements; (4) mark the last frame; (5) run the Final Editor; (6) export &lt;code&gt;.txt&lt;/code&gt; or &lt;code&gt;.md&lt;/code&gt; and finish by hand.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Your photos stay yours.&lt;/strong&gt; Stories get built from personal images: old family photos, sketches, unreleased concept art. With local open-weight models, none of it is uploaded anywhere.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It works with the lights (and the internet) off.&lt;/strong&gt; No API key, no rate limit, no per-token bill. The UI even avoids external fonts and CDNs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's not locked inside a service that might disappear.&lt;/strong&gt; Projects are plain JSON files I own. If a hosted API changes its pricing or shuts down, my stories and my workflow survive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swappable models.&lt;/strong&gt; The vision and story models are environment variables, so another open model can be tried without touching the code, and a stronger machine should give better stories. (So far I have only tested moondream and qwen2.5:3b.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It made a tiny-model design possible.&lt;/strong&gt; The rolling memory and two-pass editor exist &lt;em&gt;because&lt;/em&gt; I had to make a 3B model on a 4 GB GPU work. A closed API with a huge context window would have hidden that problem instead of letting me solve it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free to run,&lt;/strong&gt; which matters for students and indie creators.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;I gave it three images: a boat with a lantern at a lighthouse pier, a stone archway ringed with red roses, and a keeper's room with a journal. Out of those three photos, with no plot from me, it wrote a novel in my first test run whose final chapter ends on a twist I did not plan: the light the heroine had been chasing for fifteen years was her missing brother all along.&lt;/p&gt;

&lt;p&gt;The outputs from my test runs (problems included) are in the &lt;a href="https://github.com/shristi005/Miedocuentista/tree/main/tested_outputs" rel="noopener noreferrer"&gt;&lt;code&gt;tested_outputs&lt;/code&gt; folder&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/shristi005/Miedocuentista/blob/main/tested_outputs/the-keeper-s-last-light-novel.txt" rel="noopener noreferrer"&gt;Novel output&lt;/a&gt; (3 chapters)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/shristi005/Miedocuentista/blob/main/tested_outputs/the-keeper-s-last-light-short-film-script.txt" rel="noopener noreferrer"&gt;Short film script output&lt;/a&gt; (3 scenes; the weakest result, see the Challenges section)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shristi005/Miedocuentista/tree/main/tested_outputs/input_frame_images" rel="noopener noreferrer"&gt;The three input frame images&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>ClaimReady: a local-AI claims workbench for hospital front desks</title>
      <dc:creator>Shristi Sharma</dc:creator>
      <pubDate>Mon, 19 Oct 2026 05:31:03 +0000</pubDate>
      <link>https://dev.to/shristi132005/claimready-a-local-ai-claims-workbench-for-hospital-front-desks-1258</link>
      <guid>https://dev.to/shristi132005/claimready-a-local-ai-claims-workbench-for-hospital-front-desks-1258</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;ClaimReady&lt;/strong&gt; is a claims workbench for hospital front-desk and billing staff. It puts three jobs in one place: checking a claim before it goes out, tracking the insurer's follow-up questions, and reconciling what the insurer actually paid.&lt;/p&gt;

&lt;p&gt;Here is how it works for &lt;strong&gt;Rachael&lt;/strong&gt;, a front-desk staff member, and &lt;strong&gt;Ritu&lt;/strong&gt;, a patient she is helping:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Claim Check.&lt;/strong&gt; Rachael uploads Ritu's claim form, hospital bill and discharge summary. ClaimReady flags anything that may need attention, such as a missing document or an amount that differs between files, and shows the exact text from each file. Rachael checks the findings, gets anything missing, and sends the claim to the insurer herself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Query Desk.&lt;/strong&gt; The insurer asks for the discharge summary and the admission and discharge dates. Rachael records the request and its due date. ClaimReady finds the matching lines in the uploaded documents, shows which file each came from, notes that the summary is missing, and prepares a draft reply. Rachael edits it, sends it herself, and updates the status (Open, Waiting for documents, Ready to review, Responded).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payment Tracking.&lt;/strong&gt; The insurer pays ₹40,000 on a ₹45,000 claim. Rachael records the claimed, approved and received amounts. ClaimReady shows the ₹5,000 difference and keeps it visible until she records what explains it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fapalonu5217sn9tqh73b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fapalonu5217sn9tqh73b.png" alt=" " width="799" height="384"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1hqao1mpyfpikmk5tzk0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1hqao1mpyfpikmk5tzk0.png" alt=" " width="800" height="378"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqsct97yk2zrx05c5s5bu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqsct97yk2zrx05c5s5bu.png" alt=" " width="800" height="376"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgl4tom3mjh0d63f6rd3a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgl4tom3mjh0d63f6rd3a.png" alt=" " width="799" height="376"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwgi4rk40oqzhpx07hvai.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwgi4rk40oqzhpx07hvai.png" alt=" " width="799" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who would pay:&lt;/strong&gt; small and mid-size hospitals and clinics whose front-desk or billing staff chase claims across folders, spreadsheets and messages. The cost of that is missed documents, forgotten insurer deadlines and shortfalls nobody explains. I have not tested pricing with a real customer yet, so I'm not claiming a price or a savings figure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does not do:&lt;/strong&gt; it does not decide coverage, approve or reject claims, send claims or replies, or connect to insurers. Staff stay in charge of every decision.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/ErQrxP_WPz0" width="710" height="399"&gt;
  &lt;/iframe&gt;
&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/shristi005" rel="noopener noreferrer"&gt;
        shristi005
      &lt;/a&gt; / &lt;a href="https://github.com/shristi005/ClaimReady" rel="noopener noreferrer"&gt;
        ClaimReady
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;ClaimReady&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;A claims workbench for hospital front-desk and billing teams.&lt;/strong&gt; ClaimReady brings claim checks, insurer follow-up, and payment reconciliation into one place.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ClaimReady is a hackathon prototype that supports staff review. It does not decide coverage, approve or reject claims, or send claims or replies to insurers.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;The problem&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Staff helping with health insurance claims often need to coordinate forms, bills, insurer messages, deadlines, and payment records. When that work is scattered across folders, spreadsheets, and messages, it is easy to miss a missing document, forget a response deadline, or overlook a payment difference.&lt;/p&gt;
&lt;p&gt;ClaimReady gives staff one workflow to review a claim, manage insurer questions, and account for settlement amounts.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Who it is for&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;The prototype is designed for hospital front-desk and billing staff who help patients prepare and follow up on insurance claims.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Claim Check — review a claim before submission&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Staff upload documents such as a…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/shristi005/ClaimReady" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Fictional sample claims are in &lt;code&gt;backend/eval/testClaims/&lt;/code&gt; and &lt;code&gt;demo-assets/&lt;/code&gt;, so you can try it without any real data.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; React + Vite.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; Node + Express, with a local SQLite database and built-in accounts, hospital workspaces and roles. No cloud database or external login service is needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open-source AI:&lt;/strong&gt; an open-weight model, &lt;strong&gt;Qwen2.5 3B&lt;/strong&gt;, running locally through &lt;strong&gt;Ollama&lt;/strong&gt;. An optional Groq provider exists, but it is off by default and sends text to a hosted service.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Document reading:&lt;/strong&gt; text is read from PDFs and OCR handles images. Regular matching rules run first.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What the model does, exactly:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Where the model is used&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claim Check&lt;/td&gt;
&lt;td&gt;Only when the rules cannot find a required field or the bill's line items. The model's answer must include a quote that appears in the document, otherwise it is rejected and the item goes to "Check manually".&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Query Desk&lt;/td&gt;
&lt;td&gt;Not used. Evidence search and draft replies come from matching logic and a template.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Payment Tracking&lt;/td&gt;
&lt;td&gt;Reads an uploaded remittance advice (PDF, PNG or JPG) and suggests the settlement amounts and any stated deductions, with the supporting text. Nothing is saved until staff review it and save.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All comparisons, such as amounts, dates, IDs and the settlement balance, are plain code. The model reads messy text. It does not judge anything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Results on my own test set&lt;/strong&gt; (9 fictional claim packets with planted errors, &lt;code&gt;qwen2.5:3b&lt;/code&gt; on a Windows laptop with a GTX 1650 and 4 GB of GPU memory, run with &lt;code&gt;npm run eval&lt;/code&gt;):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Planted issues caught&lt;/th&gt;
&lt;th&gt;False alerts&lt;/th&gt;
&lt;th&gt;Items sent to manual check&lt;/th&gt;
&lt;th&gt;Average time per packet&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;9 of 9&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;2.3 s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The 4 manual checks all came from the two packets written in unusual wording. The model could not confirm a field, so the app asked a person instead of guessing. These packets are small, text-based and made by me, so this is &lt;strong&gt;not&lt;/strong&gt; a real-world accuracy benchmark. Real hospital paperwork will be messier.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Documents stay on the machine.&lt;/strong&gt; Claim papers contain sensitive health and financial details. With Ollama, the model runs on the computer hosting the app, so the AI step needs no third-party model API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No per-document cost.&lt;/strong&gt; A small clinic can run it without paying for every claim it checks. A 3B model runs fully on a 4 GB laptop GPU, as &lt;code&gt;ollama ps&lt;/code&gt; showed on my machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Control over behaviour.&lt;/strong&gt; Because I run the model myself, I could force structured JSON output, require a quote for every extracted value, reject answers that are not in the document, and swap the model by changing one setting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Where it was weaker.&lt;/strong&gt; The small model missed fields on unusual wording, and early on it reformatted dates in ways my first checker rejected. I fixed the checker, and the design now sends anything uncertain to a human. I did not benchmark closed APIs, so I'm not claiming open models are more accurate. My claim is about privacy, cost and control.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Honest limits:&lt;/strong&gt; this is a hackathon prototype, not a certified billing or compliance system. The local database is not encrypted by the app. OCR and extraction can miss or misread things, so staff must verify every suggestion. I used only fictional data.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Assistance
&lt;/h2&gt;

&lt;p&gt;Built with assistance from Claude and Codex.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>🌼🍃Flâner: Small steps, Bigger days— Let the Ordinary Lead You Somewhere New.</title>
      <dc:creator>Shristi Sharma</dc:creator>
      <pubDate>Sat, 10 Oct 2026 23:02:06 +0000</pubDate>
      <link>https://dev.to/shristi132005/flaner-small-steps-bigger-days-3mhb</link>
      <guid>https://dev.to/shristi132005/flaner-small-steps-bigger-days-3mhb</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;Flâner&lt;/strong&gt; (&lt;em&gt;to wander without hurry, and notice the little things along the way&lt;/em&gt;) is a gentle AI companion that helps you take one small step out of the house, then gets out of the way.&lt;/p&gt;

&lt;p&gt;Most apps want more of your attention. Flâner is built to want less of it. You talk to it for about a minute, it hands you a small plan, and then it tells you to put your phone away.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where the idea came from
&lt;/h3&gt;

&lt;p&gt;The theme was &lt;em&gt;Touch Grass&lt;/em&gt;, and the more I thought about it, the more it described something I see everywhere. Our homes are comfortable and our phones are endlessly interesting, so we stay in. Slowly we stop noticing what's outside: the street, the light, the small shop around the corner. And the less we go out, the less we explore.&lt;/p&gt;

&lt;p&gt;People stay in for many different reasons. Some are simply comfortable. Some find going out a hassle. Some dislike it, and some feel uneasy about it. Whatever the reason, the hardest part is almost always the first step, and "go outside more" is too big and vague to act on.&lt;/p&gt;

&lt;p&gt;What helps is a plan. A plan turns a vague wish into a short list, and ticking a box gives a small, real sense of achievement. So Flâner keeps the outing small enough to finish: a checklist for an outing. The reward comes from the real world, not from the app, which is why there are no points or streaks.&lt;/p&gt;

&lt;p&gt;The second half of the idea is the reflection. When you come back, Flâner asks what you saw, enjoyed and noticed. Having to remember those details trains you to look for them next time. My hope is that, over time, your attention drifts from the phone to your surroundings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Pick a door.&lt;/strong&gt; &lt;em&gt;I have somewhere to go&lt;/em&gt; (groceries, errands, college), &lt;em&gt;I want to explore&lt;/em&gt; (a walk, your neighbourhood, some nature), or &lt;em&gt;I need a little nudge&lt;/em&gt; (for when you feel stuck).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Get a plan.&lt;/strong&gt; An open-weight model turns your task into a short, editable checklist: before leaving, getting there, the task itself, coming home. Groceries get your own shopping list word for word. Errands get "check opening hours" and "what to bring". Walks get optional "notice along the way" prompts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Go.&lt;/strong&gt; A calm "The world is waiting" screen. No chat, no GPS, no timer. The plan is already on your device as a checklist.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Look back.&lt;/strong&gt; When you return, Flâner asks what you saw, enjoyed and noticed. Recalling small details is meant to build observation skills. A second model then writes a short, specific acknowledgement.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Who it's for:&lt;/strong&gt; people who find the first step the hardest part (a grocery run they keep postponing, a walk they never start), and anyone who wants to notice more of the world around them. There are no XP, streaks or leaderboards, staying home is treated as okay, and partial progress counts.&lt;/p&gt;

&lt;p&gt;I tried to design against the usual engagement loop. Reflection notes are only stored if you choose &lt;strong&gt;Save this moment&lt;/strong&gt;, and the dashboard is a private record of getting out, not a score.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxownf7pm44cubnwfx7b3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxownf7pm44cubnwfx7b3.png" alt=" " width="800" height="466"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fezufy3r7yh1phpycn1mq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fezufy3r7yh1phpycn1mq.png" alt=" " width="799" height="492"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fulx5owelqxf4y13sb0sg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fulx5owelqxf4y13sb0sg.png" alt=" " width="799" height="511"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F28jdavqtdw4zfp9pb2gj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F28jdavqtdw4zfp9pb2gj.png" alt=" " width="800" height="514"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fktow0lcib293t3kwpkey.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fktow0lcib293t3kwpkey.png" alt=" " width="800" height="499"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3m3cy5zu2oj4ixbfystd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3m3cy5zu2oj4ixbfystd.png" alt=" " width="800" height="481"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo07145sjoa1r48me56n8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo07145sjoa1r48me56n8.png" alt=" " width="800" height="498"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4kog3wsci3j3rntf7qus.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4kog3wsci3j3rntf7qus.png" alt=" " width="800" height="457"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5tfdnz7cv55cw10mnszj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5tfdnz7cv55cw10mnszj.png" alt=" " width="800" height="460"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F91cstjk8vl4zxqwm65dj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F91cstjk8vl4zxqwm65dj.png" alt=" " width="800" height="430"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F592d5bae7k18h3201f6c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F592d5bae7k18h3201f6c.png" alt=" " width="799" height="514"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  I took it outside
&lt;/h3&gt;

&lt;p&gt;I needed groceries and had put it off for three days, half-tempted to just order online. I really didn't feel like going. Before leaving, I typed what I needed to buy into Flâner, so my plan already had my list in it. That helped more than I expected: at the shop I didn't have to stop and think about what I'd forgotten. I knew exactly what I was looking for and found the things faster.&lt;/p&gt;

&lt;p&gt;The first steps in the checklist (freshen up, get dressed) were what got me moving. I had a bath, got dressed, went to the shop and came back feeling prepared and glad I'd gone. It was a small, ordinary errand, and that's the point. (I used a test account, which I've since deleted.)&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Live app:&lt;/strong&gt; &lt;a href="https://flaner-twp3.onrender.com/" rel="noopener noreferrer"&gt;https://flaner-twp3.onrender.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You need an internet connection to use it.&lt;/p&gt;

&lt;p&gt;It runs on a free Render instance, so the first visit after a quiet period can take up to a minute to wake up. Sign up with any email to try it. &lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/shristi005/Flaner" rel="noopener noreferrer"&gt;View the code on GitHub&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; vanilla HTML/CSS/JS frontend (no framework, no build step), a Node and Express backend, Supabase for login and data. Everything is deployed as one web service on Render.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser ──► Express server ──► plan model       (open-weight gpt-oss-20b on Groq)
   │             │
   │             └──────────► reflection model  (swappable; Gemini in my demo)
   └── Supabase: login, profiles, saved outings (row-level security)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The open-source AI at the core&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Plan model: &lt;code&gt;openai/gpt-oss-20b&lt;/code&gt;&lt;/strong&gt;, an open-weight model, served through Groq's OpenAI-compatible API. It does the main work. A system prompt tells it to return only JSON, and the server then extracts it, validates the shape, trims lengths and drops unknown fields. If the model fails, a built-in plan takes over, so the user never sees a broken screen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompts as the "agent's behaviour."&lt;/strong&gt; The rules live in two plain-text prompts in the repo: be specific to the task, never invent a park, shop, route or opening time, treat safety worries as real, and never shame. Changing how the companion behaves means editing text, not retraining.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Any model, three lines.&lt;/strong&gt; The server talks to any OpenAI-compatible endpoint, so &lt;code&gt;LLM_BASE_URL&lt;/code&gt;, &lt;code&gt;LLM_API_KEY&lt;/code&gt; and &lt;code&gt;LLM_MODEL&lt;/code&gt; switch between Groq, a local Ollama model, Hugging Face, DeepSeek and others.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A second model for the closing reflection.&lt;/strong&gt; Each outing makes two AI calls. I split them across two providers so one provider's limits can never block the app. In my demo the reflection uses Gemini (&lt;code&gt;gemini-3.5-flash-lite&lt;/code&gt;). That one is &lt;strong&gt;not&lt;/strong&gt; open-weight. It only writes a few kind sentences, and &lt;code&gt;REFLECT_PROVIDER=off&lt;/code&gt; removes it, or it can point at any open model.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LLM_MODEL=openai/gpt-oss-20b
REFLECT_MODEL=gemini-3.5-flash-lite
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Things that went wrong, and what I did&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hugging Face returned HTTP 402&lt;/strong&gt; ("no remaining credits") when I first used it for the reflection. Because the model is a setting rather than hard-coded, I switched providers by changing configuration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The bottom buttons and tab bar sat off-screen&lt;/strong&gt; until you scrolled to the end of a page. A container's &lt;code&gt;overflow:hidden&lt;/code&gt; stopped them pinning, and switching it to &lt;code&gt;overflow:clip&lt;/code&gt; fixed it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Flâner needs an internet connection.&lt;/strong&gt; Sign-in, building a plan, the reflection and saving all go through Supabase and the AI models, so the app does not work offline. The live demo also runs on a free Render instance that sleeps when it's quiet, so the first visit can be slow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The model doesn't know where you are.&lt;/strong&gt; It never names real places. You supply any you want to mention.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The reflection model isn't open-weight.&lt;/strong&gt; Only the closing acknowledgement uses Gemini, and it can be switched off.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Privacy and your data
&lt;/h2&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;Where it goes&lt;/th&gt;
&lt;th&gt;Kept?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Email and password&lt;/td&gt;
&lt;td&gt;Supabase sign-in.&lt;/td&gt;
&lt;td&gt;For your account&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Name, step-size preference, optional "about me" note&lt;/td&gt;
&lt;td&gt;Supabase&lt;/td&gt;
&lt;td&gt;Until you delete it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;A record of each finished outing:&lt;/strong&gt; the type (e.g. "Got groceries"), how it felt, minutes outside, a place you name, and the date and time&lt;/td&gt;
&lt;td&gt;Supabase, readable only by you&lt;/td&gt;
&lt;td&gt;Yes. Saved when you finish (Done for today, Plan another outing or Save this moment)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reflection notes (what you saw, enjoyed, noticed, expected, happened, remember)&lt;/td&gt;
&lt;td&gt;Supabase, &lt;strong&gt;only if you tap "Save this moment"&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Only if you save&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What you type when building a plan or reflection (details, shopping items, notes)&lt;/td&gt;
&lt;td&gt;Sent to the AI models (Groq for plans, Gemini for the closing reflection) to write the reply&lt;/td&gt;
&lt;td&gt;Not saved by my server or in my database, except notes you choose to save&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;The plan itself&lt;/strong&gt; (the checklist the AI writes)&lt;/td&gt;
&lt;td&gt;On your own device only&lt;/td&gt;
&lt;td&gt;Until you finish or clear it. It is not saved in my database&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Outings you start but don't finish are never saved to the database.&lt;/p&gt;

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

&lt;p&gt;I'll be specific about what I did and didn't prove.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Swapping and control.&lt;/strong&gt; When one provider stopped working, I changed configuration and carried on. The companion's behaviour lives in prompts in the repo that anyone can read and edit. With a single closed API, a pricing change or a limit would have stopped the whole product.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy.&lt;/strong&gt; What people write about why going out feels hard is personal, and many wouldn't want it sent to a company's server. Because the plan model is open-weight, the same code is designed to run it on the user's own machine through Ollama, so that text never has to leave their laptop. My live demo doesn't work that way: it uses Groq to host the open weights and a hosted Gemini model for the closing reflection, so text goes to those providers. I haven't run the fully local setup in production.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A plan that stays available.&lt;/strong&gt; The generated checklist is kept on the user's device, so once it has loaded, it doesn't need another AI request to be viewed. The current app still needs an internet connection for sign-in and generating new plans; a fully offline version would need local model inference and offline data handling, which I haven't implemented yet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Right-sized AI.&lt;/strong&gt; Turning a short description into a checklist doesn't need the biggest model. A 20B open-weight model is enough, and that keeps it cheap and laptop-sized.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost.&lt;/strong&gt; There's no licence fee for the open model. Hosting and API calls still cost money beyond free tiers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What I didn't do.&lt;/strong&gt; I haven't benchmarked this against a closed model, so I can't claim it beats one on quality. I also haven't fine-tuned anything. The "what I feared, what happened" reflections could become a training set one day, but only with consent.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  AI Assistance
&lt;/h2&gt;

&lt;p&gt;Built with assistance from Claude and ChatGPT.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Render:&lt;/strong&gt; the whole app runs as a single Render web service. &lt;/li&gt;
&lt;/ul&gt;

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