<?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: NFRION</title>
    <description>The latest articles on DEV Community by NFRION (@nfrion).</description>
    <link>https://dev.to/nfrion</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%2F4213181%2Fda21435c-b212-4138-8466-1c59297f791e.png</url>
      <title>DEV Community: NFRION</title>
      <link>https://dev.to/nfrion</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nfrion"/>
    <language>en</language>
    <item>
      <title>git-ghost: I summoned the ghost of my first commit with a local Gemma model</title>
      <dc:creator>NFRION</dc:creator>
      <pubDate>Wed, 28 Oct 2026 13:26:55 +0000</pubDate>
      <link>https://dev.to/nfrion/git-ghost-i-summoned-the-ghost-of-my-first-commit-with-a-local-gemma-model-542b</link>
      <guid>https://dev.to/nfrion/git-ghost-i-summoned-the-ghost-of-my-first-commit-with-a-local-gemma-model-542b</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: 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;&lt;strong&gt;git-ghost&lt;/strong&gt; is a tiny command-line tool that summons the &lt;em&gt;ghost of your past self&lt;/em&gt; from the oldest commits of any git repository.&lt;/p&gt;

&lt;p&gt;It reads your first commits (the memories) and your latest commits (the living developer), then lets &lt;strong&gt;Gemma&lt;/strong&gt;, an open-weight model running locally through &lt;strong&gt;Ollama&lt;/strong&gt;, speak as the ghost of the developer you used to be. The ghost talks in three parts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;"I remember..."&lt;/strong&gt;: what the project was at the very beginning&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"I see you now..."&lt;/strong&gt;: how it changed, with real details from the log&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Before I fade..."&lt;/strong&gt;: one kind, concrete piece of advice&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It is a small Día de los Muertos ofrenda for your codebase: a way to honour the past version of a project, and of yourself, instead of only looking at the latest diff.&lt;/p&gt;

&lt;h2&gt;
  
  
  Theme interpretation
&lt;/h2&gt;

&lt;p&gt;Every repository is haunted. Under the newest commit there is a first &lt;code&gt;init&lt;/code&gt;, a forgotten &lt;code&gt;WIP&lt;/code&gt;, a 2 a.m. &lt;code&gt;fix typo&lt;/code&gt;. Those messages are the voices of someone who no longer exists: you, months or years ago. git-ghost gives that past self a voice, a little spooky, mostly warm.&lt;/p&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ python git_ghost.py ~/projects/my-blog

 .-.
 (o o) The ghost of your first commit rises...
 | O \
  \ \
   `~~~'

I remember... (the ghost's answer streams here, generated locally by Gemma)

 ~ the ghost fades back into .git ~
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Repository: &lt;a href="https://github.com/NFRION/git-ghost" rel="noopener noreferrer"&gt;https://github.com/NFRION/git-ghost&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;The whole tool is one Python file with zero dependencies: &lt;code&gt;git log&lt;/code&gt; through &lt;code&gt;subprocess&lt;/code&gt;, and a streaming call to the local Ollama &lt;code&gt;/api/chat&lt;/code&gt; endpoint with &lt;code&gt;urllib&lt;/code&gt;. The system prompt asks the model to use only facts present in the commit log, so the ghost doesn't invent files that never existed.&lt;/p&gt;

&lt;p&gt;A unit test spins up a fake Ollama server and a throwaway git repo, so the logic can be tested without downloading a model.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I built it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model:&lt;/strong&gt; Gemma (&lt;code&gt;gemma3:4b&lt;/code&gt; by default, any Ollama model works with &lt;code&gt;--model&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runtime:&lt;/strong&gt; Ollama, fully local&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Language:&lt;/strong&gt; Python 3 standard library only&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI assistance:&lt;/strong&gt; I used an AI assistant to help write and test the code and this post.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why open innovation matters here
&lt;/h2&gt;

&lt;p&gt;A commit history is private and personal. Sending it to a closed cloud API just to get a nostalgic paragraph would be the wrong trade. With an open-weight model running on my own machine, the ghost stays in the house: no API key, no data leaving the laptop, no cost per summon, and anyone can read, fork and change exactly how the ghost thinks. Open models make this kind of small, personal, slightly silly tool possible, and that is where a lot of creativity happens.&lt;/p&gt;

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