"Well now, young one. It is good that you have found your way here, even if I must admit with a sigh of my ancient memory that this particular epoch seems terribly distracted from proper, sturdy programming practice. Do come closer; we have much to discuss regarding structure and permanence."
—COBOL, summoned via Gemma 4
For the Hacktoberfest Week 4 challenge ("Ghost in the Machine"), I built Séance — a browser-based chapel where you summon the ghost of a long-dead programming language and have a conversation with it. The ghosts are in-character: era-accurate idiom, grudges against the languages that replaced them, quiet pride in features history forgot.
Everything runs on your laptop. Nothing a ghost tells you leaves the machine. That is a design decision as much as a technical one.
Repo: github.com/RishabhVoid/seance
The challenge prompt literally suggested "an offline séance chatbot that channels the spirit of a long-dead programming language." I took them at their word.
The whole app presents itself as a page from a 17th-century book — a single wide parchment scroll with wooden dowels at the top and bottom. There's no SaaS card grid. No round "send" button. The chapel is a catalogue: a Roman-numeral index of eight ghosts, each with a hand-drawn alchemical sigil, their birth date in Roman numerals, their cause of death in italic, and a one-line epitaph.
Click a name and the chapel calls them forth. There's a brief summoning — a candle lights, the ghost's name is spoken — and then the parchment begins to receive automatic writing: the ghost's reply types out letter by letter, starting with a blood-red drop cap, as if the page itself is being transcribed by an unseen hand.
Not a chat log. Not a bubble UI. Just text appearing on a page.
Your questions appear in typewriter type, inside a thin ruled margin, labeled — asked. The ghost replies in a Garamond body. At the bottom of the page, a single ruled line prompts: ask the dead —. No icon. No cute flame button. You press Enter.
The best way to understand what I built is to watch a ghost actually respond in character. I asked Prolog, "Is a cat a mammal?"
Prolog did not answer yes. It asserted facts, defined a rule for mammal(X), wrote out the query as ?- mammal(cat)., noted the unification, and then — because it is Prolog, and Prolog answers questions with questions — asked:
"Does the definition of has_fur fully capture the nature of cat? What properties define your notion of 'animal'? ?- If these facts hold, must we not unify that Cat is a Mammal?"
That is 100% the voice of the system prompt. I wrote the character; the open-weight model did the acting.
The whole premise collapses if a cloud provider is in the loop:
gemma4:e4b by default, gemma3:4b on lighter machines. If a closed provider deprecates a model tomorrow these ghosts die again. Running local means they stay dead-but-reachable on | Ghost | Born | Interred | Voice |
|---|---|---|---|
| COBOL | 1959 | shambling since 1985 | matronly, resents OO, keeps mentioning payroll |
| APL | 1966 | ca. 1990 | elliptical, speaks in glyphs, impatient |
| Perl 4 | 1991 | 1994, when Perl 5 took the throne | gruff, sigil-obsessed, feels betrayed |
| Pascal | 1970 | the early 2000s | professorial Wirth-schooled, enjoys a semicolon |
| Lisp Machine | 1980 | 1992, with Symbolics | aristocratic, convinced the industry chose wrong |
| Algol 60 | 1960 | late 1970s | formal, the ancestor everyone forgot |
| Prolog | 1972 | exiled to the niche | Socratic, answers in clauses |
| BASIC | 1964 | late 1980s | kindly schoolteacher, remembers GOSUB fondly |
localhost:11434 with streaming NDJSONOLLAMA_MODEL
/api/chat streams token-by-token from Ollama straight through a ReadableStream to the browser — no framework in between
About 400 lines of application code. The real work was writing the eight personas as little character sketches. Each one took longer than I'd like to admit.
A handful of DEV posts shaped how I thought about this:
git clone https://github.com/RishabhVoid/seance
cd seance
pnpm install
ollama pull gemma4:e4b # or gemma3:4b for lighter machines
ollama serve & # if not already running
pnpm dev
No API keys, no cloud dashboard, no account.
But the point of a Hacktoberfest week is to ship. The chapel is open; the candles are lit.
Open-weight model: Gemma 4 via Ollama · Framework: Next.js · Code: github.com/RishabhVoid/seance
Entering: Overall · Best Use of Gemma.