<?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: Kunal Kashyap</title>
    <description>The latest articles on DEV Community by Kunal Kashyap (@kunal13kashyap).</description>
    <link>https://dev.to/kunal13kashyap</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%2F2141799%2F5fe1da19-6a78-4e04-ab2d-c918bb08b7cc.jpg</url>
      <title>DEV Community: Kunal Kashyap</title>
      <link>https://dev.to/kunal13kashyap</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kunal13kashyap"/>
    <language>en</language>
    <item>
      <title>👻 Haunted Terminal</title>
      <dc:creator>Kunal Kashyap</dc:creator>
      <pubDate>Sun, 01 Nov 2026 00:25:38 +0000</pubDate>
      <link>https://dev.to/kunal13kashyap/haunted-terminal-1ncb</link>
      <guid>https://dev.to/kunal13kashyap/haunted-terminal-1ncb</guid>
      <description>&lt;h2&gt;
  
  
  The Process Was Terminated. So Why Is It Still Running? 👻
&lt;/h2&gt;

&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;What if a computer remembered someone who no longer existed?&lt;/p&gt;

&lt;p&gt;And what if the thing answering your questions wasn't quite that person?&lt;/p&gt;

&lt;p&gt;Meet &lt;strong&gt;Haunted Terminal — Infrastructure #674&lt;/strong&gt;, an interactive, AI-powered horror experience built around an abandoned machine, a forgotten memory-preservation experiment, and an entity reconstructed from fragments of someone's past.&lt;/p&gt;

&lt;p&gt;The experience begins with an unsettling discovery:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The process was terminated. So why is it still running?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You enter a fictional CRT workstation. Something is consuming memory, but its start time, executable, and owner are missing. System records contradict one another. An operator's identity has been deleted. Somewhere inside the archive, something is waiting to be questioned.&lt;/p&gt;

&lt;p&gt;Your job is to investigate.&lt;/p&gt;

&lt;p&gt;But this isn't a conventional chatbot where you type anything and receive a spooky response. You must recover evidence, follow the trail of an abandoned experiment, and gradually uncover what the machine has retained.&lt;/p&gt;

&lt;p&gt;The investigation uses commands such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;scan&lt;/code&gt; — recover the unknown-process anomaly.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;logs&lt;/code&gt; — investigate the shutdown warning.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;investigate&lt;/code&gt; — examine the deleted operator identity.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;reconstruct&lt;/code&gt; — uncover contradictory experiment records.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;whisper&lt;/code&gt; — invite the entity to speak.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ask &amp;lt;text&amp;gt;&lt;/code&gt; — question the entity.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;reveal&lt;/code&gt; — restore the final memory and reach the decision.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eventually, you must choose what happens to the process:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TERMINATE:&lt;/strong&gt; Shut it down.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PRESERVE:&lt;/strong&gt; Keep the archive alive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RELEASE:&lt;/strong&gt; Unlock a hidden ending by recovering an additional memory fragment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are three endings, and the hidden one requires discovering evidence that isn't necessary for the other two.&lt;/p&gt;

&lt;h3&gt;
  
  
  My interpretation of Ghost in the Machine
&lt;/h3&gt;

&lt;p&gt;I didn't want to make another horror chatbot that simply generates creepy sentences.&lt;/p&gt;

&lt;p&gt;I wanted to explore a more uncomfortable question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If a machine can reproduce someone's memories, their words, and fragments of their personality, does that mean the person is still there?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The entity in Infrastructure #674 is not presented as a confirmed human consciousness. It is a reconstruction built from incomplete records. It remembers fragments, misunderstands others, and gradually becomes aware of the contradictions surrounding its existence.&lt;/p&gt;

&lt;p&gt;The horror comes from not knowing whether you're speaking to a person, a simulation, or something that has developed an identity of its own.&lt;/p&gt;

&lt;p&gt;The terminal is entirely fictional. It does not execute commands on the player's operating system or inspect their actual files or processes. The investigation takes place inside the game's own environment.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href="https://github.com/Kunal13Kashyap/haunted_terminal" rel="noopener noreferrer"&gt;Haunted Terminal — GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is no publicly hosted version because the project is designed to run locally, with the frontend, backend, SQLite database, and Ollama model on the same machine.&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%2Fbnwnfkkd16900rg0d262.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%2Fbnwnfkkd16900rg0d262.png" alt="Haunted Terminal boot sequence showing an unauthorized access warning" width="800" height="361"&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%2Fxe57u4xprg1zki334u7q.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%2Fxe57u4xprg1zki334u7q.png" alt="Haunted Terminal interface displaying available commands" width="800" height="360"&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%2Fh0abq7pfqxmgcfxdm5j0.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%2Fh0abq7pfqxmgcfxdm5j0.png" alt="The reconstructed entity responds to the player after clue discovery" width="799" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can explore the source code and follow the local setup instructions in the repository.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/Kunal13Kashyap/haunted_terminal" rel="noopener noreferrer"&gt;Explore the complete source code on GitHub&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The project is organized into two applications:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;apps/web&lt;/code&gt; — React frontend and terminal interface.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;apps/api&lt;/code&gt; — Express API, story engine, Ollama integration, and persistence.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The repository contains the complete implementation, database schema, Prisma migrations, environment examples, and setup instructions.&lt;/p&gt;

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

&lt;p&gt;The most important architectural decision was separating &lt;strong&gt;what the game knows&lt;/strong&gt; from &lt;strong&gt;what the entity says&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I didn't want an LLM to decide whether a clue existed, whether the player had completed an investigation, or which ending should be unlocked.&lt;/p&gt;

&lt;p&gt;An LLM can generate convincing dialogue, but it can also hallucinate, contradict previous events, or confidently reveal information that the player hasn't discovered.&lt;/p&gt;

&lt;p&gt;That would destroy the mystery.&lt;/p&gt;

&lt;p&gt;So I built Haunted Terminal around two separate systems.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Deterministic story engine
&lt;/h3&gt;

&lt;p&gt;The backend owns the actual game.&lt;/p&gt;

&lt;p&gt;It handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Command validation.&lt;/li&gt;
&lt;li&gt;Clue discovery and prerequisite checks.&lt;/li&gt;
&lt;li&gt;Investigation progression.&lt;/li&gt;
&lt;li&gt;Session state.&lt;/li&gt;
&lt;li&gt;Ending conditions.&lt;/li&gt;
&lt;li&gt;Persistence of terminal events.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The investigation follows a controlled sequence:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;scan&lt;/code&gt; → &lt;code&gt;logs&lt;/code&gt; → &lt;code&gt;investigate&lt;/code&gt; → &lt;code&gt;reconstruct&lt;/code&gt; → &lt;code&gt;reveal&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The first four core clues are required to reach the final decision. The optional &lt;code&gt;recover&lt;/code&gt; command discovers an additional memory fragment required for the hidden &lt;code&gt;release&lt;/code&gt; ending.&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%2Fefhbiwgvnfuoac27kf1x.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%2Fefhbiwgvnfuoac27kf1x.png" alt="Evidence-gated investigation showing discovered clues and story progression" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This means the player cannot simply ask the AI to reveal the ending or skip the investigation.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Local AI entity
&lt;/h3&gt;

&lt;p&gt;For the conversational entity, I used &lt;strong&gt;Qwen 2.5 3B&lt;/strong&gt;, served locally through &lt;a href="https://ollama.com/" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The model is responsible for the entity's dialogue when the player uses &lt;code&gt;whisper&lt;/code&gt; or &lt;code&gt;ask&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The API supplies the model with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The entity's character instructions.&lt;/li&gt;
&lt;li&gt;Its current awareness stage.&lt;/li&gt;
&lt;li&gt;The evidence recovered by the player.&lt;/li&gt;
&lt;li&gt;Up to eight recent conversation messages.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The entity progresses through three awareness stages:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;Trigger&lt;/th&gt;
&lt;th&gt;Behaviour&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DORMANT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fewer than two core clues&lt;/td&gt;
&lt;td&gt;Barely aware, cautious, and uncertain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AWARE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;At least two clues&lt;/td&gt;
&lt;td&gt;Recognizes recovered records but cannot resolve every mystery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;EXPOSED&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;At least four clues&lt;/td&gt;
&lt;td&gt;Understands the contradictions and reacts more personally&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The model is instructed not to invent undiscovered clues, claim to inspect the player's real computer, or present uncertain information as established fact.&lt;/p&gt;

&lt;p&gt;Generated responses are also constrained in length and sanitized before being returned to the terminal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The distinction matters:&lt;/strong&gt; the story engine determines what happens. The model determines how the entity communicates about it.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Persistence and session restoration
&lt;/h3&gt;

&lt;p&gt;I used SQLite with Prisma 7 and the Better SQLite3 adapter.&lt;/p&gt;

&lt;p&gt;The database stores four kinds of information:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Session&lt;/code&gt; — session status, ending, and timestamps.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DiscoveredClue&lt;/code&gt; — evidence recovered during the investigation.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ConversationMessage&lt;/code&gt; — player and entity messages.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;TerminalEvent&lt;/code&gt; — commands and rendered events used to restore the interface.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A UUID identifies each session. The frontend stores that identifier in &lt;code&gt;localStorage&lt;/code&gt;, allowing the application to retrieve the saved investigation after a page refresh.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. The interface and atmosphere
&lt;/h3&gt;

&lt;p&gt;The frontend uses React 19 and Vite 8, with Tailwind CSS v4 and custom CSS.&lt;/p&gt;

&lt;p&gt;I wanted the interface to feel like an abandoned workstation rather than a modern chat application.&lt;/p&gt;

&lt;p&gt;Some of the details include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A CRT-inspired terminal interface.&lt;/li&gt;
&lt;li&gt;Phosphor-green styling and restrained warning colors.&lt;/li&gt;
&lt;li&gt;A visual keyboard with physical key feedback.&lt;/li&gt;
&lt;li&gt;Subtle animated entity eyes.&lt;/li&gt;
&lt;li&gt;Two looping ambient horror audio layers.&lt;/li&gt;
&lt;li&gt;Audio playback that begins only after the user explicitly enables it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The audio is implemented using the browser's HTML Audio API.&lt;/p&gt;

&lt;h3&gt;
  
  
  Technology used
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Frontend&lt;/td&gt;
&lt;td&gt;React 19, Vite 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Styling&lt;/td&gt;
&lt;td&gt;Tailwind CSS v4, custom CSS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend&lt;/td&gt;
&lt;td&gt;Node.js, Express 5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI model&lt;/td&gt;
&lt;td&gt;Qwen 2.5 3B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI runtime&lt;/td&gt;
&lt;td&gt;Ollama&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;td&gt;SQLite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ORM&lt;/td&gt;
&lt;td&gt;Prisma 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audio&lt;/td&gt;
&lt;td&gt;Browser HTML Audio API&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;p&gt;For Haunted Terminal, open-weight AI isn't just a technology choice. It changes how the experience operates and what developers can inspect.&lt;/p&gt;

&lt;h3&gt;
  
  
  The model runs locally
&lt;/h3&gt;

&lt;p&gt;Ollama serves Qwen 2.5 3B on the same machine as the application.&lt;/p&gt;

&lt;p&gt;The frontend communicates with the local Express API, and the API communicates with the local Ollama service.&lt;/p&gt;

&lt;p&gt;There is no hosted proprietary LLM API in the conversation loop.&lt;/p&gt;

&lt;p&gt;This means the player's questions and conversational context don't need to be sent to an external model provider. The SQLite database also remains local.&lt;/p&gt;

&lt;p&gt;For a project about memories, identity, and personal information, that distinction is meaningful.&lt;/p&gt;

&lt;h3&gt;
  
  
  The model is replaceable
&lt;/h3&gt;

&lt;p&gt;The model is configured through an environment variable rather than being hard-coded into the story engine.&lt;/p&gt;

&lt;p&gt;A compatible Ollama model can be selected by changing &lt;code&gt;OLLAMA_MODEL&lt;/code&gt; and downloading that model.&lt;/p&gt;

&lt;p&gt;The investigation logic doesn't need to be rewritten just because the underlying model changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  The behaviour is inspectable
&lt;/h3&gt;

&lt;p&gt;The system prompt, evidence supplied to the model, response constraints, and deterministic story progression are part of the source code.&lt;/p&gt;

&lt;p&gt;Developers can inspect how the entity is instructed to behave, experiment with different models, and modify the experience without depending on a closed API provider.&lt;/p&gt;

&lt;h3&gt;
  
  
  Local-first also has trade-offs
&lt;/h3&gt;

&lt;p&gt;Running locally means the player's machine supplies the computational resources.&lt;/p&gt;

&lt;p&gt;Model downloads and initial dependency installation require internet access. Inference speed depends on available CPU, memory, and hardware. The current Ollama configuration explicitly uses CPU inference.&lt;/p&gt;

&lt;p&gt;Once dependencies and the model have been installed, the application can run locally without sending inference requests to a cloud LLM service.&lt;/p&gt;

&lt;p&gt;This isn't a claim that local AI is always better. It's a choice that makes sense for this particular experience.&lt;/p&gt;

&lt;p&gt;I wanted the machine to feel like its own isolated world. Local inference makes that possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;I haven't prepared a DevRelay agent session for this project, so I'm leaving this optional section out rather than linking to something that doesn't exist.&lt;/p&gt;

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

&lt;p&gt;There is one question I kept coming back to while building this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if the entity doesn't know that it is only a reconstruction?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imagine recovering enough evidence to understand that the machine has preserved fragments of someone's memories. You ask it a question, and it answers confidently. But the records you've uncovered don't quite agree with what it remembers.&lt;/p&gt;

&lt;p&gt;You now know something it doesn't.&lt;/p&gt;

&lt;p&gt;You could terminate the process and erase what remains. You could preserve the archive, allowing the reconstruction to continue. Or you could search for one more fragment and unlock the possibility of releasing it.&lt;/p&gt;

&lt;p&gt;None of these choices proves that the entity is a person.&lt;/p&gt;

&lt;p&gt;That's the part I wanted to leave unresolved.&lt;/p&gt;

&lt;p&gt;For me, the ghost in this machine isn't simply a process that refuses to terminate. It's the possibility that something can remember a life without ever having lived it.&lt;/p&gt;

&lt;p&gt;And perhaps the most unsettling question isn't whether the machine is alive.&lt;/p&gt;

&lt;p&gt;It's whether we would know what to do if it were.&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%2F90nqjbpnady3es02sahb.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%2F90nqjbpnady3es02sahb.png" alt="PRESERVE ending showing the decision to keep the memory archive alive" width="799" height="361"&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%2Ftrslauucjssasi8bnbr1.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%2Ftrslauucjssasi8bnbr1.png" alt="TERMINATE ending showing the shutdown of the reconstructed process" width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;Haunted Terminal started as an experiment in combining local open-weight AI with a deterministic interactive narrative.&lt;/p&gt;

&lt;p&gt;It became an exploration of memory, identity, and the uncomfortable space between a person and their reconstruction.&lt;/p&gt;

&lt;p&gt;The model gives the entity a voice. The evidence gives that voice context. The player decides what happens next.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The process was terminated. The archive remains active.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Project:&lt;/strong&gt; &lt;a href="https://github.com/Kunal13Kashyap/haunted_terminal" rel="noopener noreferrer"&gt;Haunted Terminal — Infrastructure #674&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Built by:&lt;/strong&gt; &lt;a href="https://github.com/Kunal13Kashyap" rel="noopener noreferrer"&gt;Kunal Kashyap&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>MemoryVault: A Private AI-Powered Home for Family Memories</title>
      <dc:creator>Kunal Kashyap</dc:creator>
      <pubDate>Mon, 05 Oct 2026 07:02:34 +0000</pubDate>
      <link>https://dev.to/kunal13kashyap/memoryvault-a-private-ai-powered-home-for-family-memories-1je0</link>
      <guid>https://dev.to/kunal13kashyap/memoryvault-a-private-ai-powered-home-for-family-memories-1je0</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;What I Built&lt;br&gt;
I built MemoryVault for my family.&lt;br&gt;
Over the years, families collect hundreds of little things that mean a lot — stories, recipes, photographs, personal notes, funny incidents, emotional moments, and memories that only one person may remember.&lt;br&gt;
But these things get scattered.&lt;br&gt;
Some are buried in WhatsApp conversations. Some are sitting somewhere in a phone gallery. Some are written down in notebooks. Some are stored as random documents. And some exist only in someone's memory.&lt;br&gt;
Eventually, finding one particular memory becomes surprisingly difficult.&lt;br&gt;
That's why I built MemoryVault.&lt;br&gt;
MemoryVault is a private family memory vault where family members can store:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stories&lt;/li&gt;
&lt;li&gt;Recipes&lt;/li&gt;
&lt;li&gt;Notes&lt;/li&gt;
&lt;li&gt;Documents&lt;/li&gt;
&lt;li&gt;Photos&lt;/li&gt;
&lt;li&gt;Memories connected to specific family members
You can search and filter memories, connect them to the people they are about, and ask questions about what you've saved.
For example:
"What do we remember about our family trips?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;or:&lt;br&gt;
"What recipes have we saved?"&lt;/p&gt;

&lt;p&gt;MemoryVault retrieves relevant memories and provides them as context to a locally running AI model, which can then answer the question using the family's own memories.&lt;br&gt;
I didn't want to build another generic AI chatbot.&lt;br&gt;
I wanted to build something that would actually be useful to the people closest to me.&lt;br&gt;
Memories are easy to collect, but surprisingly easy to lose.&lt;br&gt;
MemoryVault is my attempt to give those memories a home.&lt;br&gt;
Demo&lt;br&gt;
Live Demo&lt;br&gt;
👉 &lt;a href="https://memoryvault-4193.onrender.com" rel="noopener noreferrer"&gt;Live&lt;/a&gt;&lt;br&gt;
The application is deployed on Render and can be explored as a working full-stack application.&lt;br&gt;
Screenshots&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%2Fl410k7je3mr264r7sk1c.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%2Fl410k7je3mr264r7sk1c.png" alt=" " width="800" height="362"&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%2Fpagunzli1axihwasojod.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%2Fpagunzli1axihwasojod.png" alt=" " width="800" height="360"&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%2F81wc0ebocj2pjvb4qcym.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%2F81wc0ebocj2pjvb4qcym.png" alt=" " width="800" height="360"&gt;&lt;/a&gt;&lt;br&gt;
Code&lt;br&gt;
👉 &lt;a href="https://github.com/Kunal13Kashyap/MemoryVault" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;br&gt;
The repository contains the complete React frontend and Express backend, along with the MongoDB integration, authentication, memory management, and local AI integration.&lt;br&gt;
How I Built It&lt;br&gt;
MemoryVault is a full-stack TypeScript application built with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React + TypeScript + Vite — frontend&lt;/li&gt;
&lt;li&gt;Tailwind CSS + Framer Motion — UI and animations&lt;/li&gt;
&lt;li&gt;Node.js + Express + TypeScript — backend&lt;/li&gt;
&lt;li&gt;MongoDB + Mongoose — persistent storage&lt;/li&gt;
&lt;li&gt;Gemma 3 4B — open-weight AI model&lt;/li&gt;
&lt;li&gt;llama.cpp — local inference runtime&lt;/li&gt;
&lt;li&gt;Render — deployment&lt;/li&gt;
&lt;li&gt;GitHub Copilot — development workflow
Local AI with Gemma
The most important architectural decision was to make the AI local.
MemoryVault uses Gemma 3 4B, running through llama.cpp.
When a user asks a question, MemoryVault doesn't simply send that question to an external AI API.
Instead, the application first searches the memories stored in MongoDB and retrieves the relevant ones.
The flow is:
User question → Memory retrieval → Context building → llama.cpp → Gemma 3 4B → Answer + supporting memories
The backend communicates with llama.cpp through its OpenAI-compatible API.
This means MemoryVault does not require OpenAI, Anthropic, Gemini, or another hosted LLM API for its AI functionality.
MongoDB
MongoDB is the persistent storage layer of MemoryVault.
It stores:&lt;/li&gt;
&lt;li&gt;Users&lt;/li&gt;
&lt;li&gt;Family spaces&lt;/li&gt;
&lt;li&gt;Family members&lt;/li&gt;
&lt;li&gt;Memories&lt;/li&gt;
&lt;li&gt;Memory metadata&lt;/li&gt;
&lt;li&gt;Relationships between memories and people
This gives MemoryVault a structured way to preserve and retrieve family memories.
Privacy by Design
Privacy was one of the reasons I chose local inference in the first place.
These aren't generic documents.
They are family stories, personal experiences, photographs, recipes, and emotional moments.
I didn't want adding an AI feature to automatically mean sending those memories to a third-party LLM provider.
With Gemma running locally through llama.cpp, AI inference can happen on the user's own machine.
That's the approach I wanted for MemoryVault:
Bring the AI to the memories, rather than automatically sending the memories to the AI.
GitHub Copilot
I also used GitHub Copilot during the development of MemoryVault as part of my development workflow.
It helped me during implementation and iteration while I focused on the application's architecture, privacy requirements, user experience, and the problem I wanted to solve for my family.
Why Does Open Innovation Matter?
This project made me think differently about where AI should run.
For many applications, using a closed AI API is the easiest option.
You send some data to an API, receive a response, and move on.
But what happens when the data is deeply personal?
With MemoryVault, the data isn't just business documents or random text.
It's someone's family history.
Stories about people we love.
Personal experiences.
Photographs.
Recipes.
Emotional moments.
Using an open-weight model like Gemma gave me another option.
Instead of:
Family memories → Cloud API → Closed model → Answer
I could build:
Family memories → MemoryVault → Local retrieval → llama.cpp → Gemma 3 4B → Answer
Open models made it possible for me to experiment with AI while keeping AI inference local.
They also give developers more control over the technology they are building with. I can choose the model, run it myself, control the inference environment, and change the retrieval logic without making a proprietary AI provider a mandatory part of the architecture.
For MemoryVault, that matters because privacy isn't an extra feature. It's part of the reason the application exists.
Open innovation gave me the ability to ask:
Can we bring AI to personal data without automatically sending personal data to someone else's AI?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For this project, the answer is yes.&lt;/p&gt;

&lt;p&gt;Prize Categories&lt;br&gt;
🏆 Best Use of Gemma&lt;br&gt;
MemoryVault uses Gemma 3 4B as its local open-weight AI model.&lt;br&gt;
Gemma is directly involved in the core Ask Your Vault experience.&lt;br&gt;
When a user asks a question, MemoryVault retrieves relevant family memories from MongoDB, provides that context to the local Gemma model through llama.cpp, and returns an answer based on those memories.&lt;br&gt;
Gemma isn't just an additional feature — it is part of the core experience of MemoryVault.&lt;br&gt;
🤖 Best Use of GitHub Copilot&lt;br&gt;
I used GitHub Copilot during the development of MemoryVault as part of my development workflow.&lt;/p&gt;

&lt;p&gt;I didn't start this project because I wanted to make another AI chatbot.&lt;br&gt;
I started it because memories are fragile.&lt;br&gt;
A recipe can disappear.&lt;br&gt;
A story can be forgotten.&lt;br&gt;
A photograph can get buried.&lt;br&gt;
A small moment that meant everything to someone can become impossible to find.&lt;br&gt;
MemoryVault is my attempt to make those things a little harder to lose.&lt;br&gt;
A private place for the stories, people, recipes, photographs, and emotional moments that make a family what it is.&lt;br&gt;
That's what I built for my family. ❤️&lt;/p&gt;

&lt;h1&gt;
  
  
  hacktoberfest #hf26challenge #opensource #gemma #mongodb #react #typescript #llamacp
&lt;/h1&gt;

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