<?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: Hina Zia</title>
    <description>The latest articles on DEV Community by Hina Zia (@hinazia).</description>
    <link>https://dev.to/hinazia</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%2F4198662%2Ffac36114-b402-4810-8b5b-40ae9e048f40.jpg</url>
      <title>DEV Community: Hina Zia</title>
      <link>https://dev.to/hinazia</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hinazia"/>
    <language>en</language>
    <item>
      <title>I Built a Digital Ofrenda That Keeps Your Family's Stories Off the Cloud</title>
      <dc:creator>Hina Zia</dc:creator>
      <pubDate>Sat, 31 Oct 2026 07:02:17 +0000</pubDate>
      <link>https://dev.to/hinazia/i-built-a-digital-ofrenda-that-keeps-your-familys-stories-off-the-cloud-5h9h</link>
      <guid>https://dev.to/hinazia/i-built-a-digital-ofrenda-that-keeps-your-familys-stories-off-the-cloud-5h9h</guid>
      <description>&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%2Fmkng5tgs3jv41ao7yyac.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%2Fmkng5tgs3jv41ao7yyac.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The page: a dark, warm ofrenda with flickering CSS candles, marigold accents, each person's name and dates, a short tribute, and their memory in their family's own words.&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/hinazia01" rel="noopener noreferrer"&gt;
        hinazia01
      &lt;/a&gt; / &lt;a href="https://github.com/hinazia01/ofrenda-keeper" rel="noopener noreferrer"&gt;
        ofrenda-keeper
      &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;Ofrenda Keeper 🕯️&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A local remembrance keeper for Día de los Muertos — built for the
Hacktoberfest 2026 DEV Challenge, Week 4: &lt;em&gt;Ghost in the Machine&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;You write memories of loved ones as simple &lt;code&gt;.txt&lt;/code&gt; files. One command
weaves them into a beautiful, self-contained remembrance page
(&lt;code&gt;out/ofrenda.html&lt;/code&gt;) — candle glow, marigolds, their names, and the words
you kept for them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Everything happens on your machine.&lt;/strong&gt; No cloud, no account, no API
Family stories are the most private data there is; this tool treats them
that way.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How it works&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rules do the structure&lt;/strong&gt; — parsing memory files (&lt;code&gt;Name:&lt;/code&gt;, &lt;code&gt;Dates:&lt;/code&gt;
&lt;code&gt;Place:&lt;/code&gt;, &lt;code&gt;Memory:&lt;/code&gt;), HTML-escaping every word you wrote (so a &lt;code&gt;&amp;lt;&lt;/code&gt;
in a memory can never break the page), and building the page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemma&lt;/strong&gt; (Google's open-weight model, running locally through
&lt;a href="https://ollama.com" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt;) does only the writing: a warm 2–3
sentence tribute per person.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No&lt;/strong&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/hinazia01/ofrenda-keeper" 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 architecture follows one rule I learned the hard way on a previous project: &lt;strong&gt;the model must never be trusted with structure — only with words.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rules do the structure.&lt;/strong&gt; A small parser reads &lt;code&gt;Name:&lt;/code&gt;, &lt;code&gt;Dates:&lt;/code&gt;, &lt;code&gt;Place:&lt;/code&gt;, &lt;code&gt;Memory:&lt;/code&gt; fields from each text file. Every word of user content is HTML-escaped before it touches the page (a &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; in a memory becomes harmless text, never code). The page itself is one self-contained HTML file — I tested that it makes zero external requests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemma does only the writing.&lt;/strong&gt; The local model (gemma3:1b via Ollama) receives the person's details and writes a warm 2–3 sentence tribute. That's it — it never sees file paths, never builds HTML, never decides anything structural.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Honest fallback.&lt;/strong&gt; If Ollama is unreachable, a template tribute is used instead — and every tribute on the page is labelled with the engine that wrote it (&lt;code&gt;gemma-local&lt;/code&gt; or &lt;code&gt;fallback-rules&lt;/code&gt;). A prompt-echo guard also rejects replies where a small model echoes the prompt's instructions instead of writing a real tribute.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;13 automated tests&lt;/strong&gt; lock all of this in: parsing, the echo guard, HTML escaping, page self-containment, and a full end-to-end run.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your real memories stay in &lt;code&gt;memories/&lt;/code&gt;, which is gitignored — they can never be pushed anywhere by accident.&lt;/p&gt;

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

&lt;p&gt;A remembrance is intimate data: names, dates, the stories a family tells about its dead. A closed cloud service could build this in an afternoon — but then your family's memories would live on someone else's server, inside a product that could change its terms, start charging, or simply shut down one day. The dead can't consent to that.&lt;/p&gt;

&lt;p&gt;Openness fixes it at the root: an open-weight model I can run myself, on a machine I own, with code I can read and keep. Ofrenda Keeper works with the internet off, costs nothing per tribute, and will still work in twenty years — which is exactly the timescale a remembrance deserves.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I built this with the help of an AI coding assistant; every line was read, tested, and verified by me. The demo tributes above were generated by Gemma 3 1B running locally via Ollama on a Linux machine — no cloud APIs were involved at any point.&lt;/em&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Best Use of Gemma&lt;/li&gt;
&lt;/ul&gt;

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