<?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: Surbhi Jha</title>
    <description>The latest articles on DEV Community by Surbhi Jha (@surbhi_jha).</description>
    <link>https://dev.to/surbhi_jha</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%2F4156055%2Fa4ab040f-cef0-481a-b57c-8c85b5b5ebbf.jpg</url>
      <title>DEV Community: Surbhi Jha</title>
      <link>https://dev.to/surbhi_jha</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/surbhi_jha"/>
    <language>en</language>
    <item>
      <title>Echoes of History: letting the past speak with an AI that runs offline.</title>
      <dc:creator>Surbhi Jha</dc:creator>
      <pubDate>Sun, 01 Nov 2026 04:40:08 +0000</pubDate>
      <link>https://dev.to/surbhi_jha/echoes-of-history-letting-the-past-speak-with-an-ai-that-runs-offline-4bfl</link>
      <guid>https://dev.to/surbhi_jha/echoes-of-history-letting-the-past-speak-with-an-ai-that-runs-offline-4bfl</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;Echoes of History is a small app where the past tells its own story. You pick a moment (the Salt March, Indian independence, the Apollo 11 landing, or anything you type in), you pick who is telling it, and you pick a style: narration, short story, diary entry, or a letter to someone far away. Then you can ask the narrator a question, and they answer in character.&lt;/p&gt;

&lt;p&gt;For the "honors the past" side of the theme, I wanted ordinary people, not famous ones. A village elder on 15 August 1947. A young clerk writing home after the first train from Bombay to Thane. A model running on my own laptop writes all of it.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Local Deployment
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/surbhi-codes/echoes-of-history" rel="noopener noreferrer"&gt;View Source Code&lt;/a&gt; &lt;br&gt;
&lt;strong&gt;Application Screenshots:&lt;/strong&gt; See below.&lt;/p&gt;

&lt;p&gt;This project currently runs locally using Streamlit and Ollama with an open-weight language model. It does not have a publicly hosted live demo because the AI model runs locally on my machine.&lt;/p&gt;

&lt;p&gt;This is the Apollo 11 landing as a diary entry:&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%2Fru7pq24hca7a5ivjlnvr.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%2Fru7pq24hca7a5ivjlnvr.png" alt="Apollo 11 diary entry in Echoes of History" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To run it yourself, install &lt;a href="https://ollama.com" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt; and then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama pull gemma3:4b
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
python &lt;span class="nt"&gt;-m&lt;/span&gt; streamlit run app.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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/surbhi-codes" rel="noopener noreferrer"&gt;
        surbhi-codes
      &lt;/a&gt; / &lt;a href="https://github.com/surbhi-codes/echoes-of-history" rel="noopener noreferrer"&gt;
        echoes-of-history
      &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;Echoes of History&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;A small offline app that retells moments in history as short fiction, using an open-weight AI model running on my own laptop through Ollama. No account, no cloud, no cost.&lt;/p&gt;

&lt;p&gt;Built for the &lt;strong&gt;Hacktoberfest Open-Source AI Challenge, Week 4: Ghost in the Machine&lt;/strong&gt; (Oct 26 to Oct 31, 2026). I read the theme as "honoring the past": the app gives a voice to people who lived through historical moments.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What it does&lt;/h2&gt;
&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Pick a moment in history (or describe your own).&lt;/li&gt;
&lt;li&gt;Pick who is telling it: a student, a shopkeeper, a village elder, a reporter, or a custom narrator.&lt;/li&gt;
&lt;li&gt;Pick a style: first-person narration, short story, diary entry, or a letter to a loved one.&lt;/li&gt;
&lt;li&gt;Click "Hear the echo". The model writes a short piece of fiction of about 150 words.&lt;/li&gt;
&lt;li&gt;Ask the narrator a follow-up question and get an in-character answer.&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;


&lt;ul&gt;

&lt;li&gt;Five preset events plus…&lt;/li&gt;

&lt;/ul&gt;&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/surbhi-codes/echoes-of-history" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


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

&lt;p&gt;The stack is small: Ollama to run the model, gemma3:4b as the open-weight model, Python, and Streamlit for the interface. It runs on my Windows laptop with 16 GB of RAM.&lt;/p&gt;

&lt;p&gt;The app turns your choices into a prompt and sends it to the model on localhost. A system instruction tells the model to write fiction inspired by real events and not to invent dates, statistics or named people. For follow-ups, it sends the earlier echo plus your question back to the model.&lt;/p&gt;

&lt;p&gt;The first answer took about 30 SECONDS because the model had to load. After that it was faster.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your choices (event, narrator, style)
        |
        v
app.py builds a prompt + one rule: "write fiction, don't invent dates or names"
        |
        v
Ollama on localhost  --&amp;gt;  gemma3:4b writes the echo
        |
        v
Echo shown on the parchment page
        |
        v
Your question + the echo go back to the model  --&amp;gt;  in-character answer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;&lt;strong&gt;It works with no internet.&lt;/strong&gt; I switched on airplane mode, ran &lt;code&gt;ping google.com&lt;/code&gt; (it failed), and asked the narrator a follow-up question. It still answered.&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%2Fywh9jzukdxxbb28j1ql7.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%2Fywh9jzukdxxbb28j1ql7.png" alt="Airplane mode on, ping failing, app still answering" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I type stays on my machine.&lt;/strong&gt; That matters if someone uses an idea like this for family stories.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's free, and I can swap the model.&lt;/strong&gt; There's no API key and no bill. To try another model, I change one line.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It can't be switched off on me.&lt;/strong&gt; If a service changes its rules or disappears, my app still runs.&lt;/p&gt;

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

&lt;p&gt;I read a lot of echoes while testing. The one that stuck was the village elder on Independence Day, mostly for one line: "Today, those whispers became a roar." The model has never been to India and knows nothing about my family, but I'm from India, so that sentence felt closer to me than the Moon landing or the Great Fire of London did.&lt;/p&gt;

&lt;p&gt;A good sentence isn't the same as a true one, though, so I checked a few things against published sources.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it got right.&lt;/strong&gt; In the Apollo 11 diary, the dust is "fine as powdered charcoal" and clings to the boots. That matches Armstrong's own description in NASA's mission log. The date it wrote, July 20th, 1969, was also correct. I had told it not to invent dates, so I think that was luck.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it got wrong.&lt;/strong&gt; I asked the astronaut what the Moon dust smelled like. The model said a mineral tang, wet stone, and a faint sweetness. The Apollo crews reported spent gunpowder. Buzz Aldrin compared it to burnt charcoal or damp ashes. They also only smelled it inside the lunar module, because their suits were sealed outside.&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%2F0qm59gbzbx54evvfricc.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%2F0qm59gbzbx54evvfricc.png" alt="The model's wrong answer about the smell of Moon dust" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Mumbai train letter had a smaller slip. It called the first journey "a trial run" that began "just last month", but the 1853 journey was the formal opening, and a trial run had happened months earlier. When I asked what the crowd on the platform said, it described gasps and clapping, gave no actual words, and left out the 21-gun salute that greeted the first train.&lt;/p&gt;

&lt;p&gt;So the app says "fiction inspired by history, verify before relying on it". I mean it.&lt;/p&gt;

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

&lt;p&gt;Best Use of Gemma: Gemma 3 (4B) runs locally through Ollama and writes every echo and every follow-up answer.&lt;/p&gt;

&lt;p&gt;Thanks for reading. Happy Halloween!&lt;/p&gt;

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