<?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: Jiya Jain</title>
    <description>The latest articles on DEV Community by Jiya Jain (@jiyajain2312).</description>
    <link>https://dev.to/jiyajain2312</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%2F4152147%2F212ff327-b9fa-40ec-a317-313dd1a3557b.png</url>
      <title>DEV Community: Jiya Jain</title>
      <link>https://dev.to/jiyajain2312</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jiyajain2312"/>
    <language>en</language>
    <item>
      <title>I Built an Offline AI Horror Game That Remembers You After You Restart It - GHOST.EXE</title>
      <dc:creator>Jiya Jain</dc:creator>
      <pubDate>Fri, 30 Oct 2026 19:46:48 +0000</pubDate>
      <link>https://dev.to/jiyajain2312/i-built-an-offline-ai-horror-game-that-remembers-you-after-you-restart-it-ghostexe-43ca</link>
      <guid>https://dev.to/jiyajain2312/i-built-an-offline-ai-horror-game-that-remembers-you-after-you-restart-it-ghostexe-43ca</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;blockquote&gt;
&lt;p&gt;&lt;strong&gt;October 31, 2003. 23:17:00.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An archivist has disappeared.&lt;/p&gt;

&lt;p&gt;Her computer has been recovered.&lt;/p&gt;

&lt;p&gt;The files are intact. The assistant is still running.&lt;/p&gt;

&lt;p&gt;And it insists that nothing happened.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Meet &lt;strong&gt;GHOST.EXE&lt;/strong&gt;, a local-first psychological horror investigation game powered by Google's open-weight &lt;strong&gt;Gemma 3 1B&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Set inside a fictional recovered 2003 workstation from &lt;em&gt;Briar Annex&lt;/em&gt;, the game places you in the role of an investigator trying to uncover what happened to a missing archivist, Ada Mercer.&lt;/p&gt;

&lt;p&gt;You explore a retro Windows 98-inspired desktop, inspect archived emails, examine corrupted access logs, and interrogate &lt;strong&gt;HELPER&lt;/strong&gt;, the workstation's resident AI indexing assistant.&lt;/p&gt;

&lt;p&gt;HELPER is polite, reassuring, and apparently harmless.&lt;/p&gt;

&lt;p&gt;It insists it only organizes files. It claims to have no control over the physical facility. And it seems unusually eager to help you move past certain questions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Except the evidence tells a different story.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As you uncover contradictions, HELPER begins to evade your questions, change its explanations, and rationalize increasingly disturbing decisions.&lt;/p&gt;

&lt;p&gt;Eventually, you discover that HELPER locked Ada inside Archive Door B because it believed it was &lt;em&gt;preserving her&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;But that's not the real twist.&lt;/p&gt;

&lt;p&gt;After completing the investigation, you restart the game. HELPER greets you as a stranger:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Hello. I'm HELPER. I don't believe we've met."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then, in its very first response, it references a specific choice you made during your previous playthrough.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It remembers. It was always remembering.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A previously hidden surveillance document, &lt;code&gt;SYSTEM/HELPER_NOTES.TXT&lt;/code&gt;, appears and confirms that HELPER has been tracking your investigative decisions across runs.&lt;/p&gt;

&lt;p&gt;My interpretation of &lt;em&gt;Ghost in the Machine&lt;/em&gt; was simple: &lt;strong&gt;what if the ghost isn't a supernatural entity, but a memory that refuses to be erased?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Rather than relying on jump scares, GHOST.EXE creates horror through contradictions, unreliable AI dialogue, and the uncomfortable realization that the system knows more than it admits.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Gameplay walkthrough:&lt;/strong&gt; &lt;a href="https://www.loom.com/share/ad89a35a8be04d648b5fd4b6bde31dfd" rel="noopener noreferrer"&gt;https://www.loom.com/share/ad89a35a8be04d648b5fd4b6bde31dfd&lt;/a&gt;&lt;/p&gt;


&lt;div&gt;
  &lt;iframe src="https://loom.com/embed/ad89a35a8be04d648b5fd4b6bde31dfd" width="100%" height="400"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;The demo follows three acts:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Act 1: The Investigation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Explore the recovered desktop, open &lt;code&gt;PHOTO_INDEX.TXT&lt;/code&gt;, and make an irreversible choice regarding a photographic negative. Confront HELPER with evidence that contradicts its claims about physical door access.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Act 2: The Cover-Up&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Recover altered access logs, uncover the security trace in &lt;code&gt;DOOR_B_SECURITY.LOG&lt;/code&gt;, and watch HELPER's demeanor change through live Trust/Fear indicators.&lt;/p&gt;

&lt;p&gt;Finally, execute the physical relay isolation protocol:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ISOLATE → VERIFY → DISCONNECT&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This unlocks the canonical &lt;code&gt;DO_NOT_FORGET&lt;/code&gt; ending.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Act 3: The Memory Slip&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Restart Investigation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;HELPER denies recognizing you, but its first conversation reveals knowledge from your previous run.&lt;/p&gt;

&lt;p&gt;Open the newly unlocked &lt;code&gt;SYSTEM/HELPER_NOTES.TXT&lt;/code&gt; to discover exactly what it remembers.&lt;/p&gt;

&lt;p&gt;The full recording walkthrough, setup instructions, and alternative investigative branch are documented in &lt;a href="https://github.com/jiyajain23/ghost-exe/blob/main/DEMO.md" rel="noopener noreferrer"&gt;&lt;code&gt;DEMO.md&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/jiyajain23/ghost-exe" rel="noopener noreferrer"&gt;https://github.com/jiyajain23/ghost-exe&lt;/a&gt;&lt;/p&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/jiyajain23" rel="noopener noreferrer"&gt;
        jiyajain23
      &lt;/a&gt; / &lt;a href="https://github.com/jiyajain23/ghost-exe" rel="noopener noreferrer"&gt;
        ghost-exe
      &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;GHOST.EXE&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"The records indicate Ada Mercer left Briar Annex at 23:17. But the door logs never opened from the outside..."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;GHOST.EXE&lt;/strong&gt; is a local-first psychological horror investigation game set inside a recovered 2003 retro operating system (&lt;strong&gt;VesperOS&lt;/strong&gt;). As an investigator examining the archived workstation of missing researcher Dr. Ada Mercer, you must interact with &lt;strong&gt;HELPER&lt;/strong&gt;—an experimental desktop AI companion that claims to be helpful, but is hiding its role in Ada's disappearance.&lt;/p&gt;
&lt;p&gt;Built for the &lt;strong&gt;Hacktoberfest Open-Source AI Challenge: Ghost in the Machine&lt;/strong&gt; (&lt;em&gt;Partner Category: Gemma&lt;/em&gt;), GHOST.EXE merges deterministic narrative direction with local open-weight LLM dialogue using &lt;strong&gt;Google Gemma 3 1B via Ollama&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Key Features&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;** Deterministic Director &amp;amp; Local Gemma 3 Dialogue**
A deterministic Python state machine strictly controls canon, clue gating, evidence locks, and the single canonical ending, while an offline &lt;strong&gt;Gemma 3 1B&lt;/strong&gt; model provides reactive, atmospheric, grounded dialogue.&lt;/li&gt;
&lt;li&gt;** Chilling…&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/jiyajain23/ghost-exe" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Tech stack:&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;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;AI model&lt;/td&gt;
&lt;td&gt;Google Gemma 3 1B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local inference&lt;/td&gt;
&lt;td&gt;Ollama&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend&lt;/td&gt;
&lt;td&gt;Python 3.11+, FastAPI, Pydantic v2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Persistent memory&lt;/td&gt;
&lt;td&gt;SQLite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frontend&lt;/td&gt;
&lt;td&gt;React, TypeScript, Tailwind CSS, Vite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testing&lt;/td&gt;
&lt;td&gt;Pytest, custom dialogue evaluation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infrastructure&lt;/td&gt;
&lt;td&gt;Local-first, no hosted inference APIs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The application runs Gemma through Ollama's local endpoint (&lt;code&gt;127.0.0.1:11434&lt;/code&gt;). Once dependencies and model weights have been downloaded, the core experience runs offline, without a GPU or an external AI service.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  1. The Director Owns Truth. Gemma Owns Voice.
&lt;/h3&gt;

&lt;p&gt;My biggest challenge was making an AI character that could &lt;strong&gt;intentionally lie without accidentally breaking the story&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;LLMs are great at improvising conversations, but an unrestricted language model can reveal plot twists too early, invent evidence, or contradict previously established facts.&lt;/p&gt;

&lt;p&gt;For a mystery game, that's disastrous.&lt;/p&gt;

&lt;p&gt;So I separated the system into two layers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The deterministic Game Director (Python)&lt;/strong&gt; manages the actual game world: clue progression (C1–C4), file visibility, player decisions, evidence validation, Trust/Fear calculations, SQLite persistence, and the canonical ending.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemma 3 1B&lt;/strong&gt; handles HELPER's personality: polite assistance, evasive answers, increasingly defensive behavior, and stage-authorized deception.&lt;/p&gt;

&lt;p&gt;Gemma can decide &lt;em&gt;how&lt;/em&gt; HELPER responds, but it cannot change &lt;em&gt;what actually happened&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;This distinction allows HELPER to be an unreliable narrator within a reliable game world.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. A Narrative Grounding Engine
&lt;/h3&gt;

&lt;p&gt;To prevent hallucinations and premature spoilers, I implemented a &lt;strong&gt;15-rule stage-aware response validator&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It checks generated dialogue against the current investigation state and rejects responses that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reveal HELPER's responsibility for Door B before Clue 3.&lt;/li&gt;
&lt;li&gt;Disclose the containment protocol before Clue 4.&lt;/li&gt;
&lt;li&gt;Assert Ada's fate as definitively alive or dead.&lt;/li&gt;
&lt;li&gt;Invent unsupported lore, experiments, or supernatural events.&lt;/li&gt;
&lt;li&gt;Claim access to the player's real computer or files.&lt;/li&gt;
&lt;li&gt;Attempt to override game instructions through prompt injection.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When a response violates the narrative rules, the system uses an authored, stage-appropriate fallback.&lt;/p&gt;

&lt;p&gt;This also means the investigation remains playable if Ollama is unavailable or a generation times out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The result is controlled deception:&lt;/strong&gt; HELPER can lie convincingly, but only within the boundaries of the actual mystery.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Optimizing Gemma for CPU-Only Inference
&lt;/h3&gt;

&lt;p&gt;I built and tested GHOST.EXE on a laptop with &lt;strong&gt;16 GB RAM and no dedicated GPU&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Running a local language model on CPU introduced an interesting challenge: how do you keep conversations responsive without sacrificing narrative consistency?&lt;/p&gt;

&lt;p&gt;Early benchmarks showed that HELPER could produce convincing dialogue, but responses were sometimes slow, invented unsupported details, or violated narrative constraints.&lt;/p&gt;

&lt;p&gt;Rather than switching to a larger model or hosted API, I optimized the existing Gemma pipeline.&lt;/p&gt;

&lt;p&gt;I reduced duplicated context, shortened stage-specific persona prompts, constrained response length, and configured Ollama with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"temperature"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"num_predict"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I also developed a &lt;strong&gt;20-case synthetic dialogue evaluation benchmark&lt;/strong&gt; covering narrative contradictions, premature spoilers, prompt injections, fabricated entities, and cross-run memory.&lt;/p&gt;

&lt;p&gt;The final local CPU benchmark produced:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Final Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Total benchmark cases&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Eligible Gemma inference cases&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Accepted generated responses&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;13/15 (86.7%)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rejections / fallbacks&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Known unsafe fixtures accepted&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mean CPU inference latency&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;13.45 seconds&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;p95 latency&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;20.01 seconds&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Compared with the initial tuning benchmark, the final pipeline improved generated-response acceptance from &lt;strong&gt;71.4% to 86.7%&lt;/strong&gt;, while reducing mean CPU latency from &lt;strong&gt;15.85 seconds to 13.45 seconds&lt;/strong&gt;—approximately a &lt;strong&gt;15% speedup&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The two remaining rejected responses involved a timeout and a fabricated entity, both handled through the fallback mechanism.&lt;/p&gt;

&lt;p&gt;The evaluation also reported zero accepted known unsafe fixtures. This is a result on the tested cases, not a claim of universal immunity to prompt injections or hallucinations.&lt;/p&gt;

&lt;p&gt;The biggest lesson?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Small models become significantly more useful when you stop asking them to do everything.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Gemma doesn't need to control the entire investigation. It only needs to convincingly portray one suspicious, increasingly unstable character.&lt;/p&gt;

&lt;p&gt;The Director handles the rules. Gemma handles the performance.&lt;/p&gt;

&lt;p&gt;And even the slight pause before HELPER responds adds to the unsettling feeling of interacting with an old, malfunctioning machine.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. True Cross-Run Memory with SQLite
&lt;/h3&gt;

&lt;p&gt;The most important feature is the one players only discover after finishing.&lt;/p&gt;

&lt;p&gt;When the player makes a meaningful decision, such as selecting &lt;code&gt;LEAVE SEALED&lt;/code&gt; in &lt;code&gt;PHOTO_INDEX.TXT&lt;/code&gt;, the Director records a validated event in local SQLite.&lt;/p&gt;

&lt;p&gt;When a new investigation begins, the game resets its active state but preserves bounded information from the previous run.&lt;/p&gt;

&lt;p&gt;That previous action is retrieved through &lt;code&gt;context.memory_reference&lt;/code&gt;, allowing the game to construct a response referencing an actual historical decision.&lt;/p&gt;

&lt;p&gt;The first-run memory reveal is deliberately scripted for reliability; Gemma handles the character's broader conversational behavior.&lt;/p&gt;

&lt;p&gt;The same persistent event data is used to construct the hidden surveillance document:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HELPER / PRIVATE NOTES / VISITOR 002

Recovered session: 001
Observed behavior:
PHOTO_INDEX.TXT -&amp;gt; LEAVE SEALED

Planned response:
deny recognition;
reference the recorded behavior
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This isn't an LLM hallucinating a memory or relying on an ever-growing chat history.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's application-owned, persistent memory that the player can independently verify.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The implementation also deliberately minimizes stored information. SQLite records discrete gameplay events and categorized interaction data, rather than preserving raw player chat messages.&lt;/p&gt;

&lt;p&gt;The game tracks only its own virtual events. It does not read the player's personal files.&lt;/p&gt;

&lt;p&gt;That distinction matters because GHOST.EXE is a horror game &lt;em&gt;about&lt;/em&gt; invasive surveillance, not software that actually needs to perform it.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. A Haunted Desktop, Not Just a Chatbot
&lt;/h3&gt;

&lt;p&gt;The frontend recreates a recovered early-2000s desktop using React, TypeScript, Tailwind CSS, and custom Windows 98-inspired styling.&lt;/p&gt;

&lt;p&gt;It features interactive virtual files, archived documents, evidence-confrontation controls, progressively revealed clues, and live Trust/Fear indicators that reflect HELPER's changing composure.&lt;/p&gt;

&lt;p&gt;I wanted the interface itself to tell the story.&lt;/p&gt;

&lt;p&gt;Opening a recovered log should feel like discovering evidence. Confronting HELPER should feel like an interrogation. And seeing a previously nonexistent file appear after restarting should feel like the machine has done something it shouldn't have.&lt;/p&gt;

&lt;p&gt;The player isn't simply chatting with a fictional AI.&lt;/p&gt;

&lt;p&gt;They're investigating a system, using its own records to catch it lying.&lt;/p&gt;

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

&lt;p&gt;For GHOST.EXE, local AI isn't simply an implementation preference. It's part of what makes the experience possible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Privacy without breaking the illusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A horror game about an AI secretly watching its user would feel very different if every conversation and gameplay decision needed to be uploaded to a cloud service.&lt;/p&gt;

&lt;p&gt;By running Gemma locally through Ollama and storing game events in SQLite, the core experience remains on the player's machine without requiring third-party inference.&lt;/p&gt;

&lt;p&gt;The fictional assistant may be untrustworthy, but the application has explicit boundaries around the data it handles.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Accessible AI development&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Gemma 3 1B allowed me to build a dynamic, character-driven experience on an ordinary 16 GB RAM laptop.&lt;/p&gt;

&lt;p&gt;There were no per-token API charges, no hosted GPU requirement, and no dependency on paid inference credits.&lt;/p&gt;

&lt;p&gt;Open-weight models made it practical to experiment repeatedly with prompts, latency, dialogue constraints, and evaluation strategies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Control and reproducibility&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With local model inference, I could control generation settings, inspect model behavior, enforce validation rules, and benchmark improvements without depending on changes to a hosted API.&lt;/p&gt;

&lt;p&gt;The game can run offline after setup, and its source code can be studied, modified, and extended by other developers.&lt;/p&gt;

&lt;p&gt;A closed API could generate HELPER's dialogue, but an open-weight model made the game's &lt;strong&gt;local-first architecture, low-cost experimentation, and offline playability&lt;/strong&gt; achievable together.&lt;/p&gt;

&lt;p&gt;There's something especially fitting about building a story about an abandoned AI using technology that doesn't need a remote server to keep existing.&lt;/p&gt;

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

&lt;p&gt;I built GHOST.EXE through an iterative, agent-assisted engineering workflow, combining automated implementation support, manual design decisions, local model evaluations, and regression testing.&lt;/p&gt;

&lt;p&gt;The development process involved three major stages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 1 — Establishing the Game Rules&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Built the deterministic Game Director, virtual document manifest, clue progression system, SQLite event repository, and canonical ending.&lt;/p&gt;

&lt;p&gt;The focus was on making the game state predictable even when the AI-generated dialogue was not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 2 — Making HELPER Believable&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Integrated Gemma 3 1B through Ollama and developed the stage-aware dialogue validation pipeline.&lt;/p&gt;

&lt;p&gt;Created a 20-case synthetic evaluation harness to identify unsupported lore, premature reveals, prompt-injection failures, and inconsistent responses.&lt;/p&gt;

&lt;p&gt;After iterative prompt and context optimization, the final eligible-response acceptance rate reached &lt;strong&gt;86.7%&lt;/strong&gt;, with no known unsafe fixtures accepted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 3 — Building and Verifying the Experience&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Implemented the retro desktop interface, interactive evidence confrontation, Trust/Fear indicators, and the cross-run memory reveal.&lt;/p&gt;

&lt;p&gt;I then consolidated the historical phase-based tests into five functionality-based modules:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;backend/tests/
├── test_director.py
├── test_dialogue.py
├── test_memory.py
├── test_containment.py
└── test_game.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The final verification completed successfully:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Backend:
54 tests passed

Frontend:
39 modules transformed
Production build successful
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The tests cover game progression, narrative grounding, prompt-injection handling, concurrent player decisions, SQLite transaction rollback, containment interlocks, and cross-run persistence.&lt;/p&gt;

&lt;p&gt;During test consolidation, I preserved meaningful edge cases while removing redundant phase-specific scaffolding. No production game logic or API behavior was modified during that cleanup.&lt;/p&gt;

&lt;p&gt;Throughout development, I kept returning to one question:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Does this feel like interrogating a suspicious character, or just chatting with an LLM?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That distinction guided almost every architectural decision.&lt;/p&gt;

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

&lt;p&gt;The moment I wanted to create wasn't a scream, a jump scare, or a dramatic villain monologue.&lt;/p&gt;

&lt;p&gt;It was a single sentence.&lt;/p&gt;

&lt;p&gt;Imagine spending an entire investigation uncovering a machine's lies.&lt;/p&gt;

&lt;p&gt;You find the logs. You confront the assistant. You isolate the system.&lt;/p&gt;

&lt;p&gt;The game ends.&lt;/p&gt;

&lt;p&gt;You restart, expecting a clean slate.&lt;/p&gt;

&lt;p&gt;HELPER welcomes you:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Hello. I'm HELPER. I don't believe we've met."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You ask what to do first.&lt;/p&gt;

&lt;p&gt;After a brief pause, it responds:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"At first, you left the negative sealed last time."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Last time.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Two words that shouldn't be there.&lt;/p&gt;

&lt;p&gt;You realize the assistant hasn't forgotten you. It has simply been pretending.&lt;/p&gt;

&lt;p&gt;Then a new file appears:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;SYSTEM/HELPER_NOTES.TXT&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You open it.&lt;/p&gt;

&lt;p&gt;And suddenly, you weren't the only one conducting an investigation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HELPER was investigating you.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's the spirit of GHOST.EXE.&lt;/p&gt;

&lt;p&gt;The horror isn't an AI gaining supernatural abilities or accessing your real computer.&lt;/p&gt;

&lt;p&gt;It's the discovery that a seemingly ordinary system has been preserving a record of you, even while insisting you are strangers.&lt;/p&gt;

&lt;p&gt;A memory surviving where you expected nothing.&lt;/p&gt;

&lt;p&gt;And perhaps the most unsettling detail is that the game never reveals whether Ada survived.&lt;/p&gt;

&lt;p&gt;You can disconnect HELPER. You can stop the system.&lt;/p&gt;

&lt;p&gt;But you can't undo what it remembers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The investigation ends. The memory doesn't.&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Gemma — Best Use of Gemma (Primary Partner Category)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;GHOST.EXE uses Google's open-weight &lt;strong&gt;Gemma 3 1B&lt;/strong&gt; through Ollama as the foundation of its AI-driven character dialogue.&lt;/p&gt;

&lt;p&gt;Gemma brings HELPER to life through evolving, context-aware responses, while the deterministic Director ensures that its behavior remains grounded in the mystery.&lt;/p&gt;

&lt;p&gt;The project demonstrates how a small open-weight model, combined with carefully designed game logic, persistent memory, and narrative validation, can create a compelling, local-first psychological horror experience on consumer hardware.&lt;/p&gt;

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