DEV Community

TaseenTariq
TaseenTariq

Posted on

I held a séance for a feature that lived 17 minutes

Hacktoberfest Open-Source AI Challenge: Ghost in the Machine Submission 👻🌼

This is a submission for the Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine

What I Built

On 30 September, at 15:07:58, I gave my Android app TapOff a new trick: turn the phone on its side, tap the camera hole, and the brightness and volume sliders open. At 15:25:05 I deleted it.

Seventeen minutes and seven seconds. About the camera tap, the commit that killed it says only "Removed the lock-screen double-tap switch and the landscape camera tap, with their code". The rest of the story is in the code that died. One comment in it explains the whole thing: in portrait, Android's status bar sits over the camera and takes every tap there. So the trick only ever worked sideways, and I asked for it to go.

Every project has a graveyard like this, and nobody visits it. So for Día de los Muertos I built Exhume: a medium that runs on my laptop, digs up the dead, and lets me ask them what happened.

Exhume knows three graveyards:

  • Code: files and functions deleted from a git repo, read from its history.
  • Websites: dead sites, read back from the Wayback Machine. My demo is Orkut.
  • Apps: Mac apps I stopped opening, from the last-opened date macOS keeps.

For each one it does the same three things:

  1. Finds the dead and collects the evidence: commits, dates, authors, archived pages. Each piece gets an ID (E1, E2, …). The facts (when it was born, when it died, who made it, how long it lived) are worked out by code, not by the model.
  2. Writes a tombstone: a cause of death and an epitaph, written by Gemma from that evidence only.
  3. Holds a séance: you ask questions, and every answer cites the evidence it rests on. Under each answer Exhume prints the sentence from that evidence that backs it up, so you can check it yourself. If the evidence doesn't say, the answer is "The spirits are silent."

Here's the camera tap, summoned:

$ python3 exhume.py summon cameraTap "Why only in landscape?"
  The code that was removed included a comment stating that the camera tap was for landscape only because in portrait the status bar sits over the camera and takes every tap there.  [E5]
    E5: // Tapping the camera, in landscape only: in portrait the status bar sits over the camera and takes every tap there.
Enter fullscreen mode Exit fullscreen mode

And here's what happens when the evidence has nothing to say. EdgeVolume was a TapOff file that lived 46 minutes; the commit that added it called it "untested on device yet".

$ python3 exhume.py summon EdgeVolume "How many people downloaded you?"
  The spirits are silent.
Enter fullscreen mode Exit fullscreen mode

Then I pointed it at a bigger grave: Orkut, Google's first social network. The oldest copy of orkut.com in the Wayback Machine is from 2 February 2001, three years before Orkut opened. In 2003 its title was "Web Page Under Construction". Orkut itself ran from January 2004 to September 2014, says the archive page Google left behind.

$ python3 exhume.py summon orkut "When did you die?"
  I was bid farewell in June 2014, and the service was set to shut down on September 30, 2014.  [E4]
    E4: We will shut down Orkut on September 30, 2014.
Enter fullscreen mode Exit fullscreen mode

Asked how many users it had, Orkut's spirit said "over 300 million" and cited E7. E7 isn't Google: it's the page the founder, the engineer orkut.com was named after, put up at orkut.com in 2016. So the number is his own claim, and the citation is what tells you so.

The apps graveyard is the smallest. find apps --days 14 found one app I'd stopped opening, NordVPN, last opened on 7 October. Its tombstone's cause of death reads "The record does not say why." That's the right answer: macOS knows when, not why.

Demo

Exhume in 58 seconds

The full 58-second video, with sound and captions: exhume.tech/demo.mp4. The terminal scenes are real runs of the same exhume.py that's on GitHub, replayed on screen with Gemma's waits sped up; the real time each call took is shown.

The live site: exhume.tech. It tells the camera tap's story as a scrolling comic, with the real evidence behind each grave one click away.

Every answer in this post is copied from a real run on my Mac.

Code

GitHub logo taseen-t / exhume

A local Gemma medium for three graveyards: deleted code, dead websites and unused Mac apps. Every answer cites its evidence.

Exhume

Talk to the dead, on your own laptop.

Exhume is a medium that runs Gemma 4 locally through Ollama. It lets you question three kinds of dead things: code deleted from a git repository, websites that now live only in the Wayback Machine, and Mac apps you stopped opening.

Exhume in 58 seconds: real runs on dead code, a dead website and a forgotten app

Live: exhume.tech · Code: this repo · Agent session: Entire checkpoint

Every graveyard works the same way:

  1. Find the dead. Code collects the evidence, numbers each piece (E1, E2, …) and works out the facts itself: dates, commits, authors, how long it lived.
  2. Tombstone. Gemma writes the cause of death and an epitaph, from the evidence only.
  3. Summon. Ask it anything. Every answer cites the evidence it rests on. When the evidence doesn't say, the answer is "The spirits are silent."

Verify in 30 seconds












Model
Gemma 4 E4B (gemma4:e4b), run locally with Ollama. Licence: Apache 2.0.

…




How I Built It

  • Model: Gemma 4 E4B (gemma4:e4b, open weights, Apache 2.0), running locally through Ollama's HTTP API. No cloud model is called.
  • Code: one Python file, exhume.py, 723 lines, standard library only. It calls git, curl and macOS's mdls. No frameworks, nothing to pip install.
  • Code graveyard: git log -M --diff-filter=D finds deleted files that never came back. For functions, Exhume walks the whole history (git log -p -M --unified=0) and matches definition lines in common languages. That's a heuristic, not a parser. Renamed files don't count, and neither does a function that comes back in the same place under a new name. Binary files are skipped, and --skip GLOB ignores generated folders. On TapOff it found 8 graves.
  • Website graveyard: the Wayback Machine's CDX index lists the saved copies of the home page, and Exhume reads four of them, spread across the years; --page adds snapshots you name. For Orkut that's 8 pages: four home pages (2003, 2008, 2023, 2026) plus four I picked (Google's June 2014 goodbye post, the archive notice, the "Preserving Orkut's history" post and the founder's 2016 page). Pages are cached on disk, so once find has run, tombstones and séances work offline.
  • Apps graveyard: mdls reads kMDItemLastUsedDate for each app in /Applications. Apps macOS has no record of opening are left out unless you ask for them with --unrecorded. Apps only, never documents.
  • Keeping Gemma honest:
    • Gemma never supplies a date, a commit or a name. Code gives it the evidence as a numbered list in the prompt.
    • Gemma must answer in JSON that matches a schema (Ollama's format). Its cites list is an enum of that grave's real evidence IDs, and code drops anything else anyway.
    • The answer becomes "The spirits are silent." when it cites nothing real, when Gemma itself says the evidence is silent, or when it contains any number that isn't in the evidence it cites. A reply that loops until the 400-token cap gets one retry with a new seed, then silence.
    • selftest builds a small haunted git repo (a dead file, a dead function, a rename, a binary, a skipped folder) and checks what the finder digs up, the citation guard, the number check and the receipts. With Ollama running, it also asks Gemma when the ghost died (the answer must cite the commit that deleted it) and what its favourite colour was (the answer must be silence). Its last run printed offline checks passed and live checks passed.
  • Hardware: a 16 GB Mac. The whole selftest, three Gemma calls included, took 36 seconds. When the Mac is short on memory, one call can take minutes.

It isn't perfect, and the citations show where. Gemma's tombstone for the camera tap gives as its cause of death "screen off closes in on your tap; simpler back-tap sliders". That's the title of the commit that removed it: a headline, not a reason. The citation points straight at it, so you can see that's all it had.

Why Does Open Innovation Matter?

  • The dead stay private. My code graveyard is my git history, and some repos are private. After find, nothing leaves my laptop: not the code, not my questions.
  • It works with the lights off. Once the archive pages are cached, a séance needs no internet.
  • It costs nothing to ask. No API key, no account, no bill for every question to a ghost.
  • It can't be taken away. The challenge asks whether what you build is "locked inside a service that might disappear someday". Orkut was a Google service. It ran from January 2004 to September 2014, and then it disappeared. Gemma is also from Google, but its weights are on my disk, and no shutdown notice can take them back.
  • I can see every knob. I set the context window (4,096 tokens), the reply cap (400), the seed and the temperature myself, and Exhume checks how many tokens the prompt really used before it trusts a reply. The model I tested against is the one that will still run next year, because it's a file on my laptop and not an endpoint someone can retire.

My Agent Session

I built Exhume with Claude Code, with Entire recording the sessions started in the repo folder.

The session that moved the site into the repo is checkpoint 01M68DJQZ15JTSD4DEV3RTZ8D7, tied to the commit "Site: the Exhume page, moved into site/" by its Entire-Checkpoint trailer.

A note on the checkpoint: I redacted it before publishing. The Claude app puts my private notes, my email and my list of connected services into every session, so I kept only the conversation itself, cut it off at the commit, and replaced my email and home-folder paths. The work it records is unchanged.

It's a small séance of its own: ask the checkpoint where site/ came from, and it answers with the session that copied the page and its 16 images in, then checked every path the page loads before committing.

The Spirit of It

Gemma's epitaph for the camera tap, as it came out: "A tap that once saw the light, now rests in the dark."

The moment that got me was Orkut. Its founder's 2016 page says people went on dates, found jobs, got married and had kids because of it. Google's last Orkut blog post says 51 million communities were saved. So I asked Orkut's spirit which community was its favourite.

$ python3 exhume.py summon orkut "What was your favourite community?"
  The spirits are silent.
Enter fullscreen mode Exit fullscreen mode

Fifty-one million communities kept, and nothing in the record says which one it loved. The medium won't make one up.

Prize Categories

  • Best Use of Gemma: Gemma 4 E4B, running on my laptop through Ollama, writes every tombstone and answers every question, held to the evidence by a JSON schema, a citation guard and a number check.
  • Best Use of Entire: the build was recorded with Entire; the published checkpoint is 01M68DJQZ15JTSD4DEV3RTZ8D7, redacted as described above.
  • Best Use of a .tech Domain: the project lives at exhume.tech.

I wrote this post with help from an AI assistant, working from my build notes and the repo's history.

Top comments (0)