<?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: Ishika Mahadar</title>
    <description>The latest articles on DEV Community by Ishika Mahadar (@ishika_mahadar_d922f1e46d).</description>
    <link>https://dev.to/ishika_mahadar_d922f1e46d</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%2F4201551%2Fe8e423fe-dd6e-41bb-8798-c600c19fcd3f.png</url>
      <title>DEV Community: Ishika Mahadar</title>
      <link>https://dev.to/ishika_mahadar_d922f1e46d</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ishika_mahadar_d922f1e46d"/>
    <language>en</language>
    <item>
      <title>Git Séance: the deleted files that still haunt your repo</title>
      <dc:creator>Ishika Mahadar</dc:creator>
      <pubDate>Fri, 30 Oct 2026 03:28:45 +0000</pubDate>
      <link>https://dev.to/ishika_mahadar_d922f1e46d/git-seance-the-deleted-files-that-still-haunt-your-repo-29k9</link>
      <guid>https://dev.to/ishika_mahadar_d922f1e46d/git-seance-the-deleted-files-that-still-haunt-your-repo-29k9</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;Every repository has a graveyard: the files someone deleted. &lt;code&gt;git log&lt;/code&gt; knows who wrote each one, when it died, and what the commit message said at the funeral. Nobody reads it.&lt;/p&gt;

&lt;p&gt;Git Séance does. It digs up a repo's deleted files, gives each a tombstone made only of git facts, and lets a local open-weight model speak for it. The spooky part turned out to be useful, because deleted files are not always gone. Something still points at them.&lt;/p&gt;

&lt;p&gt;This is the feature I'd keep installed. &lt;code&gt;git seance --install-hook&lt;/code&gt; adds a pre-commit hook. Stage a deletion and commit, and it checks what still mentions the file. This is a real &lt;code&gt;git commit&lt;/code&gt; in a small repo I made to test it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git &lt;span class="nb"&gt;rm &lt;/span&gt;billing/invoice_formatter.py
&lt;span class="nv"&gt;$ &lt;/span&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Remove the old invoice formatter"&lt;/span&gt;
  LAST RITES: 1 file staged &lt;span class="k"&gt;for &lt;/span&gt;deletion.

  billing/invoice_formatter.py  &lt;span class="o"&gt;(&lt;/span&gt;7 lines, born 2025-03-01 by Ada, lived 607 days&lt;span class="o"&gt;)&lt;/span&gt;
  Still haunting 2 places:
    README.md:2  Invoices are formatted by billing/invoice_formatter.py
    main.py:1  from billing.invoice_formatter import format_invoice
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That &lt;code&gt;main.py&lt;/code&gt; line is a broken import the commit would have shipped. Add &lt;code&gt;--eulogy&lt;/code&gt; and the file says goodbye in its own voice (&lt;a href="https://github.com/Ishika-eng/git-seance/blob/main/examples/last-rites.txt" rel="noopener noreferrer"&gt;full transcript&lt;/a&gt;). The hook only warns unless you add &lt;code&gt;--strict&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Run it over a repo's whole history and you get a graveyard:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tombstones and a coroner's report&lt;/strong&gt;: who deleted the most, the commit that was a mass grave, the average lifespan, and the files that died and came back ("zombies").&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Successors&lt;/strong&gt;: what replaced each dead file, as a git rename or the file added in the same commit that overlaps most, with the percentage shown.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hauntings and reincarnations&lt;/strong&gt;: living code that still mentions a dead file, and files that were only renamed (&lt;code&gt;useWebSocket.js&lt;/code&gt; became &lt;code&gt;.jsx&lt;/code&gt;), which it reports as alive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A séance&lt;/strong&gt; (&lt;code&gt;--talk&lt;/code&gt;): ask a deleted file questions. It knows only its own code and history, and says "I do not remember" otherwise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;--raise&lt;/code&gt;&lt;/strong&gt; restores a file's last version into a folder, and &lt;strong&gt;&lt;code&gt;--html&lt;/code&gt;&lt;/strong&gt; writes a self-contained graveyard page.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I read the theme two ways at once: the spooky one (a file speaking from beyond &lt;code&gt;git rm&lt;/code&gt;, still haunting its old imports) and the Día de los Muertos one (honoring work that existed, mattered for a while, and was set down on purpose).&lt;/p&gt;

&lt;p&gt;Here is a tombstone from my own college project, and a séance with that file:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;╭─────────────────────────────────────╮
│             R . I . P .             │
│      pilot/run_poison_pilot.py      │
│       2026-09-22 - 2026-10-10       │
│       lived 18 days, 157 lines      │
│               "main()"              │
│  cause of death: collateral damage  │
╰─────────────────────────────────────╯

you &amp;gt; why were you deleted?
run_poison_pilot.py &amp;gt; I was deleted because the project's goals shifted, and the team decided to
incorporate a self-evolving coding assistant loop, evaluation harness, and Assistant UI. [...]
you &amp;gt; what is the capital of France?
run_poison_pilot.py &amp;gt; I do not remember.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

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

&lt;p&gt;Git Séance is a command line tool, so nothing is deployed. This is the graveyard page it generated for my college project, with one tombstone opened:&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%2Frwf8tiexxkb7kvx924ia.jpg" 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%2Frwf8tiexxkb7kvx924ia.jpg" alt="The graveyard page, one tombstone opened" width="800" height="655"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The full run is in &lt;a href="https://github.com/Ishika-eng/git-seance/tree/main/examples" rel="noopener noreferrer"&gt;&lt;code&gt;examples/&lt;/code&gt;&lt;/a&gt;. Try it on your own repo:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;git+https://github.com/Ishika-eng/git-seance
git seance &lt;span class="nt"&gt;--html&lt;/span&gt; graveyard.html     &lt;span class="c"&gt;# run inside any git repo&lt;/span&gt;
&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/Ishika-eng" rel="noopener noreferrer"&gt;
        Ishika-eng
      &lt;/a&gt; / &lt;a href="https://github.com/Ishika-eng/git-seance" rel="noopener noreferrer"&gt;
        git-seance
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Let a repo's deleted files speak, with a local open-weight model. Ghost in the Machine, Hacktoberfest 2026.
    &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;Git Séance&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;Raise the dead files of your repository, question them, and find out what is still haunting your code.&lt;/p&gt;

&lt;p&gt;Git Séance digs through a repo's history for deleted text files. Every fact about each one comes from git. A local open-weight model, run through &lt;a href="https://ollama.com" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt; on localhost, only gives it a voice.&lt;/p&gt;

&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;  THE CORONER'S REPORT
  13 souls lie here, living 17 days on average.
  Longest life: app/frontend/src/pages/Demo.jsx (18 days).
  Hands that deleted the most: Ishika (13)
  Worst night: commit cb3fbaa3 took 9 files at once: "Central config and real sentence ..."
  Probable causes (guessed from commit messages): unrecorded 9, collateral damage 4

  ╭─────────────────────────────────────╮
  │             R . I . P .             │
  │      pilot/run_poison_pilot.py      │
  │       2026-09-22 - 2026-10-10       │
  │       lived 18 days, 157 lines      │
  │               "main()"              │
  │  cause of death: collateral damage  │
  ╰─────────────────────────────────────╯
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/Ishika-eng/git-seance/examples/graveyard.jpg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FIshika-eng%2Fgit-seance%2FHEAD%2Fexamples%2Fgraveyard.jpg" alt="The graveyard page for a real repository, one tombstone opened"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/Ishika-eng/git-seance/examples" rel="noopener noreferrer"&gt;&lt;code&gt;examples/&lt;/code&gt;&lt;/a&gt; holds a real run on one of my own repositories: the…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Ishika-eng/git-seance" 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;ul&gt;
&lt;li&gt;
&lt;strong&gt;Git does the remembering.&lt;/strong&gt; Deletions, births, lifespans, last lines and the coroner's numbers come from &lt;code&gt;git log&lt;/code&gt;, &lt;code&gt;git show&lt;/code&gt; and &lt;code&gt;git ls-files&lt;/code&gt;. Hauntings come from &lt;code&gt;git grep&lt;/code&gt;, and the hook searches the staged index with &lt;code&gt;git grep --cached&lt;/code&gt;. None of it is generated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An open-weight model does the speaking.&lt;/strong&gt; Qwen2.5-Coder 7B Instruct (Apache 2.0) runs through Ollama on localhost, streamed with Python's standard library. There are no dependencies to install.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The model is fenced in.&lt;/strong&gt; The prompt says to use only the facts and code given, never to invent names, dates or reasons, and to admit when it does not know. Facts and voice are always shown separately.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tested without a model.&lt;/strong&gt; 33 unit tests build throwaway git repos. They include a real &lt;code&gt;git commit&lt;/code&gt; with the hook installed, refusing to overwrite someone else's hook, and refusing &lt;code&gt;--raise&lt;/code&gt; paths that escape their folder.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Two bugs made it better. My cause-of-death guesser labelled "Remove the legacy script" a &lt;em&gt;refactor&lt;/em&gt;, because &lt;code&gt;move&lt;/code&gt; matches inside &lt;code&gt;Remove&lt;/code&gt;; a test caught it. And my first hauntings were noisy: running them on my other repos, a deleted &lt;code&gt;server/Dockerfile&lt;/code&gt; was blamed for every mention of the live root &lt;code&gt;Dockerfile&lt;/code&gt;, and a &lt;code&gt;.js&lt;/code&gt; to &lt;code&gt;.jsx&lt;/code&gt; rename looked like a broken import. Now a bare name only counts if it is distinctive and no living file shares it, and renames are reported as reincarnations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where it falls short.&lt;/strong&gt; The model is a 7B. It often admits "the reason is not recorded", but in the séance above it invented a reason from a commit message that did not say that, which is why the git facts sit above every whisper. The broken import in the hook demo is from a repo I built to test it, not one of my real projects. On my real repos, hauntings mostly taught me what to filter out, while successors found real moves: &lt;code&gt;useWebSocket.js&lt;/code&gt; replaced by &lt;code&gt;.jsx&lt;/code&gt; at 100%, and result files moved into a subfolder. Successor matches under about 60% are loose guesses, so I show the percentage.&lt;/p&gt;

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

&lt;p&gt;The files people delete are often the ones they would least like to paste into a hosted API: abandoned experiments, old client code, things with a bad commit message. Because the model runs on my machine, a repository's whole history can be read, questioned and turned into a graveyard page without any of it leaving. The only network call is to localhost, and the HTML page loads nothing from the network.&lt;/p&gt;

&lt;p&gt;The model is also a setting, not a dependency: &lt;code&gt;--model&lt;/code&gt; takes anything Ollama can run, and &lt;code&gt;--no-model&lt;/code&gt; still gives you every git fact. I did not benchmark closed models, so I won't claim this beats them. For this job, private and free to run was what mattered, and an open-weight 7B was enough.&lt;/p&gt;

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

&lt;p&gt;The first repo I pointed it at was my own college project. It reported 13 dead files, all deleted by me, living 17 days on average. I had written and removed them in a single month, and git had kept the record the whole time while I never went back to read it. One of them, an experiment script, said this about itself, and it is the part I keep rereading:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I was born to test a hypothesis about the effectiveness of a trust-aware retrieval system in a controlled environment. My days were short, yet I played a crucial role in understanding the dynamics of trust and memory in language models.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A 7B model wrote that from a file's code and commit history, on my laptop. It is a bit grand for a 157-line script, but it is right that the experiment mattered for a while and then was set down on purpose.&lt;/p&gt;

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