<?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: Penta Dank</title>
    <description>The latest articles on DEV Community by Penta Dank (@pentadank).</description>
    <link>https://dev.to/pentadank</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%2F3145348%2F08d18db4-cffc-4612-ac2a-463b1348152d.jpg</url>
      <title>DEV Community: Penta Dank</title>
      <link>https://dev.to/pentadank</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pentadank"/>
    <language>en</language>
    <item>
      <title>Storyhouse: I built my grandmother somewhere for her stories to live</title>
      <dc:creator>Penta Dank</dc:creator>
      <pubDate>Mon, 05 Oct 2026 02:13:42 +0000</pubDate>
      <link>https://dev.to/pentadank/storyhouse-i-built-my-grandmother-somewhere-for-her-stories-to-live-1f6m</link>
      <guid>https://dev.to/pentadank/storyhouse-i-built-my-grandmother-somewhere-for-her-stories-to-live-1f6m</guid>
      <description>&lt;p&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;/p&gt;

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

&lt;p&gt;I built Storyhouse for my grandmother.&lt;/p&gt;

&lt;p&gt;She's in her eighties, and she's living with early Alzheimer's. The hardest part isn't only the memories she may lose — it's realizing how many stories she's carrying right now. The Sunday peach pies her mother baked. The dance where she met my grandfather. The old blue Beetle with the heater that never worked. Eighty years of stories, and almost none of them written down. And fewer people around to tell them to than there used to be.&lt;/p&gt;

&lt;p&gt;I didn't want to build another chatbot.&lt;/p&gt;

&lt;p&gt;I wanted to build somewhere her stories could live.&lt;/p&gt;

&lt;p&gt;Storyhouse is a local-first, voice-first AI companion and family memory archive. It sits in the room, listens while she talks, responds warmly, and quietly turns the meaningful moments into a structured, family-owned Memory Vault — connecting people, places, recipes, and decades into something the whole family can keep forever.&lt;/p&gt;

&lt;p&gt;It is deliberately not a few things: not an Alzheimer's treatment, not a medical device, not a replacement for family, and never a fake relative pretending to be her granddaughter. It's a companion and a memory-preservation system — and it always nudges her back toward real people.&lt;/p&gt;

&lt;p&gt;The interface isn't a chat window. It's a house you walk into: a Living Room to talk, a Library of preserved stories in her own words, a Gallery, a Life Timeline, and a Vault she (and the family) fully own. There's a read-only Family View so relatives can wander the archive, and a printable storybook PDF so her words can live on paper too.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;She spent 80 years collecting stories. We built somewhere for them to live.&lt;/p&gt;
&lt;/blockquote&gt;

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

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

&lt;p&gt;The demo runs in Demo Mode with a fictional woman, "Margaret," so no real family memory is ever exposed. Her seeded life is built to show the system actually &lt;em&gt;thinking&lt;/em&gt;: ask it about "Grandpa's car" and it retrieves the right memory; it links the blue Chevrolet to teaching their son to drive; it holds an unfinished story to gently return to later; and it keeps a deliberately conflicting date ("1957"… "actually, maybe 1958") as two recollections — because it is not allowed to quietly decide which one is true.&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/5thlegend" rel="noopener noreferrer"&gt;
        5thlegend
      &lt;/a&gt; / &lt;a href="https://github.com/5thlegend/storyhouse" rel="noopener noreferrer"&gt;
        storyhouse
      &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;🏠 Storyhouse&lt;/h1&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;A home for the stories that make us who we are.&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;Storyhouse is a &lt;strong&gt;local-first, voice-first AI companion and family memory archive&lt;/strong&gt;. It listens to an elderly loved one tell the stories of their life, remembers them, connects them across the decades, and preserves them in a structured, family-owned &lt;strong&gt;Memory Vault&lt;/strong&gt; — all powered by an &lt;strong&gt;open-weight Gemma model running locally&lt;/strong&gt;, so the most private memories a family has never leave the device.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;She spent 80 years collecting stories.&lt;/em&gt;
&lt;em&gt;We built somewhere for them to live.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;The person I built it for&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;I built Storyhouse for &lt;strong&gt;my grandmother&lt;/strong&gt;, who is in her eighties and living with early Alzheimer's.&lt;/p&gt;
&lt;p&gt;The hardest part isn't only the memories she may lose. It's realizing how many stories she is carrying &lt;em&gt;right now&lt;/em&gt; — about her mother's Sunday peach pies, the dance where she met my grandfather, the old blue…&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/5thlegend/storyhouse" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


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

&lt;p&gt;The intelligence is Google Gemma 3 (open-weight, 4B), running entirely locally via &lt;a href="https://ollama.com" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt; — no cloud, no API key, no bill. Gemma does the real work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the warm companion responses (streamed token-by-token, so it feels like talking, not waiting),&lt;/li&gt;
&lt;li&gt;memory extraction — turning a spoken passage into structured JSON (title, people, places, dates, emotions, themes),&lt;/li&gt;
&lt;li&gt;entity extraction and novelty reasoning,&lt;/li&gt;
&lt;li&gt;retrieval synthesis ("what did I tell you about Grandpa's car?").&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Semantic memory search uses the open &lt;code&gt;nomic-embed-text&lt;/code&gt; model, also local. Everything sits behind a provider abstraction, so the model is swappable and nothing is coupled to a vendor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AIProvider
  ├── OllamaProvider   (Gemma — the open-source core)
  └── MockProvider     (honest offline fallback: the app still opens, the Vault still works)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;It's a real memory system, not a prompt stuffed with history. Her words → embedding → cosine search over the vault → only the relevant memories are assembled into Gemma's context. The whole archive is never dumped into the model.&lt;/p&gt;

&lt;p&gt;And the honesty rails are in the data model, not just the vibes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Immutable originals — her exact words are stored once, never overwritten. A revised detail becomes a &lt;em&gt;new&lt;/em&gt; recollection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Provenance on everything&lt;/strong&gt; — each fact is tagged &lt;code&gt;DIRECT&lt;/code&gt; (her words), &lt;code&gt;APPROXIMATE&lt;/code&gt;, &lt;code&gt;FAMILY_REPORTED&lt;/code&gt;, &lt;code&gt;DERIVED&lt;/code&gt; (AI inference), or &lt;code&gt;GENERATED&lt;/code&gt; (AI art). The UI shows it; the AI is told to say "you told me…", never "it is true that…".&lt;/li&gt;
&lt;li&gt;Never invent — if nothing relevant is retrieved, it says "I don't have that one yet — I'd love to hear about it," instead of making something up. If she says "1944," it keeps the year; it won't fabricate a day.&lt;/li&gt;
&lt;li&gt;Consent — a story is kept only when offered and accepted. The microphone only listens when tapped.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the whole family. A read-only Family View (passcode-unlocked) lets relatives browse the Library, Gallery, Timeline and Vault — but the Living Room, the microphone, and all editing stay private to her, and anything marked private is never shown. It's enforced on the server, not just hidden in the UI. It runs on the home device; for family far away, a Cloudflare Tunnel keeps the data on that device while making it privately reachable — no cloud database, ever. And the whole archive exports as a storybook PDF (her words, provenance, and the memory art embedded) or as JSON/Markdown — the family owns it, forever.&lt;/p&gt;

&lt;p&gt;Memory art uses another open-weight model — Flux.1 &lt;a href="//Apache-2.0"&gt;schnell&lt;/a&gt; — hosted on Cloudflare Workers AI, which turns a scene she described ("an enormous orange tree, the light coming through all gold") into a labeled painting. It runs on Cloudflare's GPUs so it doesn't fight Gemma for the laptop's 6 GB. It's the one piece that calls out — disclosed in the app, and always labeled "AI-generated visual interpretation," never a real photograph.&lt;/p&gt;

&lt;p&gt;Stack: React + Vite + Tailwind on the front, Node + Express on the back, and the Memory Vault in SQLite via Node's built-in &lt;code&gt;node:sqlite&lt;/code&gt; (which, as a bonus, means zero native build step — a real gift on Windows without a C++ toolchain). A nice detail for small hardware: on a 6 GB laptop GPU, Gemma and the embedder were fighting for VRAM, so I pinned both resident with &lt;code&gt;keep_alive&lt;/code&gt; and a boot warmup. Warm turns land in ~2 seconds.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;Because these are a dying woman's most intimate memories.&lt;/p&gt;

&lt;p&gt;For this project, open-weight, local AI isn't a nice-to-have — it's the only ethically defensible architecture.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔒 Private by construction. Her stories are processed on the device and stored in a local vault. Nothing is uploaded. A closed API would mean sending my grandmother's life to a company's servers.&lt;/li&gt;
&lt;li&gt;✈️ Works offline. It runs on a laptop with no internet — and the roadmap puts it on her own phone, fully on-device, using Gemma 3n via Google AI Edge / MediaPipe.&lt;/li&gt;
&lt;li&gt;💸 Free to run, forever. No per-token meter running while a grandchild keeps a grandparent's memory alive.&lt;/li&gt;
&lt;li&gt;🔧 Ours to change. We own the weights. We can swap models or fine-tune on the family's own voice, because nothing is locked behind a vendor. Even the image model is open-weight (Flux.1) — the only thing we don't own is the GPU it briefly borrows.&lt;/li&gt;
&lt;li&gt;🧭 Provable. Because I control the whole pipeline, I can show that her conversations never leave the device — not just promise it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A closed API could have produced the conversation. It could not have produced the ownership. That difference is the entire point.&lt;/p&gt;
&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;I built this with Claude Code (and saved the session with DevRelay). Here's the real build — including the honest engineering saves: swapping a native SQLite dependency for Node's built-in &lt;code&gt;node:sqlite&lt;/code&gt; when there was no C++ toolchain, pinning both models resident to stop VRAM thrashing on a 6 GB GPU, and catching the moment it fabricated a memory (a stale fallback embedding had broken retrieval) and hardening it so it can never invent her life.&lt;/p&gt;


&lt;div class="ltag-agent-session"&gt;
  &lt;div class="agent-session-header"&gt;
    
    &lt;span class="agent-session-tool-icon-badge" title="Claude Code"&gt;
&lt;/span&gt;
    &lt;span class="agent-session-title"&gt;Building Storyhouse: a local-first memory companion on open-weight Gemma&lt;/span&gt;
  &lt;/div&gt;

  &lt;div class="agent-session-scroll"&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;For the Hacktoberfest 'Build for a Friend' challenge: build Storyhouse — a local-first, voice-first AI memory companion for my grandmother (80s, early Alzheimer's) to preserve her life stories. Open-source AI must be at the core. Can it run open AI locally, and ideally on-device on her phone?&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Yes — and Gemma is the ideal pick. Gemma 3 runs locally via Ollama now, and Gemma 3n is purpose-built for on-device Android (text + audio) via MediaPipe, so the same open model family can eventually run fully offline on her phone. For a weekend we'll ship a local-first web MVP (installable as a PWA), with on-device Android documented as Phase 2. Let me check the hardware first.&lt;/p&gt;

                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-bash"&gt;bash&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;nvidia-smi --query-gpu=name,memory.total --format=csv,noheader&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ nvidia-smi --query-gpu=name,memory.total --format=csv,noheader&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;NVIDIA GeForce RTX 4050 Laptop GPU, 6141 MiB&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;6 GB VRAM — enough for gemma3:4b (quality sweet spot) plus a small embedder. Pulling both open models.&lt;/p&gt;

                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-bash"&gt;bash&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;ollama pull gemma3:4b &amp;amp;&amp;amp; ollama pull nomic-embed-text&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ ollama pull gemma3:4b &amp;amp;&amp;amp; ollama pull nomic-embed-text&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;gemma3:4b (3.3 GB) + nomic-embed-text (274 MB) pulled&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-bash"&gt;bash&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;curl ollama /api/chat gemma3:4b 'Reply: ready'&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ curl ollama /api/chat gemma3:4b 'Reply: ready'&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;reply: 'Ready!'  |  gen ~23 tok/s warm&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Open core confirmed. Architecture: React + Vite + Tailwind client; Node + Express API; a real Memory Vault in SQLite (not chat logs). Every model sits behind an AIProvider abstraction (OllamaProvider for Gemma + an honest MockProvider fallback) so the open model is the core and nothing is coupled to a vendor. Scaffolding the server, DB schema, provider layer, memory store, and the fictional 'Margaret' demo seed.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;First real snag: better-sqlite3 tried to compile from source and failed — no Visual Studio C++ toolchain on this Windows machine.&lt;/p&gt;

                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-bash"&gt;bash&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;npm install&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ npm install&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;gyp ERR! find VS — Could not find any Visual Studio installation to use (better-sqlite3 rebuild failed)&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Rather than make the user install a multi-GB compiler, I switched to Node's built-in node:sqlite (--experimental-sqlite) — same synchronous API, zero native build. A nice side effect: the project now installs clean on any machine with no toolchain.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Second snag, specific to small VRAM: the first conversation turn timed out and retrieval came back empty. Gemma (~5 GB) and the embedder were evicting each other between turns. Checked residency:&lt;/p&gt;

                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-bash"&gt;bash&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;ollama ps&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ ollama ps&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;gemma3:4b 100% GPU + nomic-embed-text 100% GPU  |  GPU 5.5/6.1 GB — both fit!&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;They fit together; the models were just unloading on the default keep_alive. Fix: pin both resident with keep_alive:'30m' on every call + a boot warmup. Warm turns now land in ~2–4 s.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Core loop working end-to-end. The companion is grounded ONLY in retrieved memories (embed the query → cosine search the vault → assemble just the relevant memories → Gemma). Tested:&lt;/p&gt;

                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-api"&gt;api&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;POST /conversations/:id/messages { text: "Do you remember what I told you abo...&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;POST /conversations/:id/messages { text: "Do you remember what I told you about Grandpa's car?" }&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;Storyhouse: "You mentioned… Harold's blue Chevrolet. Is that what you were thinking of?"  |  grounded on: Teaching their son to drive (0.62), The old blue Chevrolet …&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Memory extraction: Gemma turns a spoken passage into a structured, provenance-tagged memory — never a raw transcript, never inventing facts.&lt;/p&gt;

                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-api"&gt;api&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;POST /consolidate { text: "My sister Eleanor and I walked to the schoolhouse ...&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;POST /consolidate { text: "My sister Eleanor and I walked to the schoolhouse in Cedar Falls every morning in 1944, even in the snow..." }&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;TITLE: Morning Walks to School | ENTITIES: person:Eleanor, place:Cedar Falls, place:schoolhouse, event:walking to school | THEMES: family, childhood | CONFIDENCE: DIRECT&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Honesty rails are in the data model, not just prompts: immutable originals (a revised date becomes a SECOND recollection — both kept, never silently chosen), provenance tags on every fact (DIRECT / APPROXIMATE / DERIVED / GENERATED), never-invent-date-precision (I clamp year-only dates so '1944' never becomes a fabricated day), consent-to-save, mic-only-on-tap, and AI art always explicitly labeled as an interpretation.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Verified the UI live in the browser: the warm 'Memory House' renders with a breathing presence orb ('I'm here.'), a Gemma-online indicator, the Living Room conversation, and the Library showing memory cards with 'Her words' provenance badges and entity chips. Then shipped it: wrote the README + docs + MIT license, committed, and pushed a public repo.&lt;/p&gt;

                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-bash"&gt;bash&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;git commit &amp;amp;&amp;amp; gh repo create storyhouse --public --source=. --push&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ git commit &amp;amp;&amp;amp; gh repo create storyhouse --public --source=. --push&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;https://github.com/5thlegend/storyhouse — public, main branch, 54 files&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Why does the open-source approach matter here, honestly?&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Because these are a dying woman's most intimate memories. Local, open-weight AI is the only architecture that keeps them on the device (nothing uploaded), works offline, costs nothing to run, and lets the family own, swap, or fine-tune the model with nothing locked behind a vendor — and because I control the whole pipeline, I can PROVE nothing leaves the device rather than just promise it. A closed API could produce the conversation; it could not produce the ownership. That difference is the entire point of Storyhouse.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
  &lt;/div&gt;

  &lt;div class="agent-session-footer"&gt;
    &lt;span class="agent-session-meta"&gt;
        12 of 12 messages
    &lt;/span&gt;
  &lt;/div&gt;
&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;Gemma — the open-weight Gemma model is genuinely the core intelligence of the app (conversation, memory extraction, entity reasoning, retrieval), run locally. I've deliberately &lt;em&gt;not&lt;/em&gt; claimed partner categories for tech I didn't actually use.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Built by &lt;a href="https://dev.to/generaldank"&gt;Next Realm Interactive&lt;/a&gt;. For my grandmother — and for everyone's.&lt;/p&gt;

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