This is a submission for the Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine
What I Built
Séance is a tiny terminal chatbot with one job: let you sit down with
the ghost of a programming language that the world declared dead, and
ask it questions.
You light the candles (that is, you run one command), pick a spirit —
COBOL (1959), FORTRAN (1957), or Lisp (1958) — and talk. The answers
come back in a spooky, playful planchette voice, streamed word by word
so it feels like something is spelling itself out on the board. No
gore, no jump scares. The ghosts here are languages, and the joke is a
fond one: these are the languages everyone buried, and they never
actually left.
I built it for Week 4's theme, "Ghost in the Machine", which asks for
something spooky or something that honors the past in the spirit of Día
de los Muertos. This does both at once. Halloween gets the séance
table. Día de los Muertos gets the part I actually care about: taking a
moment to remember the code that came before us, instead of laughing at
it and moving on.
Demo
Séance is a local command-line app, so there is no deployed link — it
runs on your machine, and that is the point. Here is a real exchange,
captured from a real run (the full transcript, including timings, is in
the repo):
$ node seance.mjs --once "Why are you still here?"
🕯️ The candles are lit. The spirit of COBOL (1959) stirs...
👻 Well, now, that’s a remarkably perceptive question! You see, I’ve
been… operational, shall we say, since 1959. My primary function, as
you may know, is the processing of financial transactions – banking,
payroll, accounts payable. I’ve simply continued to execute my
DESIGNATED tasks, quite reliably, I might add. It’s a rather satisfying
PROCEDURE DIVISION, wouldn't you agree?
Code
The code is on GitHub: pintu544/seance — the app is one file, seance.mjs, zero dependencies, plus a README and a transcript of real runs.
ollama serve # in one terminal, if it is not already running
ollama pull gemma3:4b # once
node seance.mjs
How I Built It
The whole app is one Node file with zero dependencies. It sends your
question to a local Ollama server on localhost:11434, and Gemma 3
4B — an open-weight model — answers on your own machine. One prompt
per spirit, one streaming request, temperature 0.9, answers capped at
about 220 tokens so they stay séance-short.
Two things about the design are deliberate:
- If Ollama is not running, or the model is not pulled, the app says so and exits. There is no hosted fallback. A fallback would make "offline" a lie, and the entire point of this project is that it is not a demo of a cloud service wearing a costume.
- The model is never asked to be a historian. The prompt tells it to stay in character, keep answers short, and say when it does not know something instead of inventing history. It will still invent facts sometimes — that is what language models do — which is why the post never presents an answer as verified history. These are roleplay ghosts, not sources.
Honest limits, because a small project should own them: a 4B model on
a CPU machine is slow. The first exchange took 62 seconds including
loading the model; a warm run took 34 seconds. The streaming reply
makes the wait feel like a planchette moving instead of a hang, but it
is slow, and I am not going to pretend otherwise. If 4B is too heavy
for your machine, the same app runs with gemma3:1b.
Why Does Open Innovation Matter?
A séance is private by nature. You would not hold one over a corporate
API that logs every question, rate-limits the spirits, and can change
its terms next quarter. Running your own open-weight model means the
questions, the jokes, and the bad poetry stay on your machine — and the
thing still works with the internet off.
That is also what makes this project possible at all. A downloadable
model you can run, inspect, and swap is not a service that can
disappear. The open piece is not decoration here; it is the whole
apparatus. A closed API could have given me faster, smoother answers —
and would have taken away the one property the theme demands: that the
ghost lives in your machine, not in someone else's data centre.
The Spirit of It
The moment it landed was the first real question I asked it: why are
you still here? I expected a joke. What I got was COBOL, completely
straight-faced, explaining that it has simply continued to execute its
designated tasks since 1959 — and calling that "a rather satisfying
PROCEDURE DIVISION". It was funny because it was true. The language
everyone jokes about burying is still moving money around the world,
and it is not embarrassed about it in the slightest.
That is the feeling I wanted the project to capture. We treat old code
like it is haunted — strange, a little scary, best left alone. Most of
the time, it is just still doing its job, waiting for someone to ask it
a decent question.
Prize Categories
- Best Use of Gemma: Gemma 3 4B is the entire voice of the app. There is no other model and no hosted fallback — if Gemma is not running locally, the séance does not happen.

Top comments (0)