# Séance: Summon the Ghost of a Dead GitHub Repo

> Source: <https://dev.to/sagarmaurya/seance-summon-the-ghost-of-a-dead-github-repo-5a1e>
> Published: 2026-11-01 05:17:01+00:00

*This is a submission for the [Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine](https://dev.to/challenges/hacktoberfest-week4-2026-10-26)*

Every developer has a repo they walked away from. It sits on GitHub with its last commit, its unanswered issues and a README full of plans that never happened. It isn't gone, only silent.

**Séance gives it a voice.**

You paste the link to an abandoned GitHub repo. Séance reads its description, README, open issues, recent commits, star count and last push date. A local Gemma model then plays the repo's ghost in the first person, and a haunted voice speaks the reply aloud. After that you can keep talking to it, asking why it died, what it was proud of and what it wished someone had finished.

I took "Ghost in the Machine" literally. A dead repo is a ghost in the machine: still there, still addressable, still carrying its own history. Séance turns that history into a story you can listen to.

**Summon the ghost of an abandoned GitHub repo.**

Paste a dead repo's link and its ghost speaks to you in a haunted voice, telling you how it died. Then you can ask it anything.

An open-weight Gemma model runs locally on your machine and does the thinking, and ElevenLabs gives the ghost its voice.

**Built for the DEV Hacktoberfest Open-Source AI Challenge, Week 4: Ghost in the Machine**

**The open-source AI.** The ghost's brain is `gemma4:e4b`, an open-weight Gemma model that I run locally through Ollama. The system prompt gives it a persona and a set of rules: speak in the first person, be haunting and a little sad, mention specific details as memories rather than as a report, keep it to three short sentences, and use only the facts provided. Those facts come from four GitHub API calls: repo info, README, open issues and recent commits. Pull requests are filtered out of the issue list, so the ghost mourns real unanswered issues and not merged work.

**The voice.** The reply goes to ElevenLabs (`eleven_v3`), which understands expressive tags like `[whispers]` and `[sighs]`. I then process the raw audio myself in NumPy. A synthetic crypt-style reverb and a faint low drone sit under a single voice.

**The interface.** The UI is Streamlit with custom CSS and inline SVG, with no image assets: a blood moon, drifting clouds, bare branches, an owl with glowing red eyes, bats with flapping wings, step cards with torn edges, and a Summon button that drips.

**What went wrong first**

Séance only works the way it does because the model is open.

`ghost.py`. Pointing it at another open model gives the ghost a different personality, and I could tune the persona without waiting on anyone's roadmap.
I should be upfront about the one closed piece: the voice. The open model carries the project, and the voice is the finishing touch.

I summoned `mojombo/grit`, an old Ruby Git library, and the ghost said:

*"I was... a vibrant engine, once powering grand things... Now, only echoes remain of my object-oriented grace..."*

A dead project's own history, spoken back in a whisper, hit differently than reading its commit log ever has. Every abandoned repo was once someone's late nights and good intentions. Hearing it talk made me want to go back and finish one of mine.

`eleven_v3` model, with my own audio effects layered on top.
