# Séance: a scroll of eight dead programming languages, running on local Gemma

> Source: <https://dev.to/rishabhvoid/seance-a-scroll-of-eight-dead-programming-languages-running-on-local-gemma-dja>
> Published: 2026-10-28 15:08:09+00:00

*"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](https://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 NDJSON`OLLAMA_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
# → http://localhost:3000
```

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](https://ai.google.dev/gemma) via [Ollama](https://ollama.com) · **Framework:** Next.js · **Code:** [github.com/RishabhVoid/seance](https://github.com/RishabhVoid/seance)

Entering: Overall · Best Use of Gemma.
