I held a séance with Edgar Allan Poe. He may only speak through his own books. A developer built Bookshelf Séance, an open-source tool that ingests a user's EPUB library and lets them ask questions of a chosen author, with the ghost answering in the first person using only passages from that author's own books, each cited by book, chapter and sentence. The system ranks an author's passages against the question using a from-scratch BM25 implementation, then prompts a local model via Ollama (gemma4:e2b in the demo) to answer only from those passages; if no passage scores high enough, the model is never called and the tool replies "The spirits are silent on this." The demo, run on a 2-core CPU-only GitHub Actions runner, completed three questions in 44 seconds using only the Python standard library. 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 Bookshelf Séance lets you talk with the dead authors on your own bookshelf. You point it at your EPUB library. You summon an author, say "Edgar Allan Poe". You ask a question. The ghost answers in the first person. There is one rule: the ghost may speak only through passages from its own books , and it must cite them. Under every answer you get the book, the chapter and the sentence it used, so you can check it. And if the books say nothing on the subject, the ghost does not make something up. It says: The spirits are silent on this. That is how I read the theme. A ghost that says what it never said is not a ghost. It is a puppet. Honoring the dead means not putting words in their mouths. It is for readers with a library of EPUBs: public-domain classics, out-of-print books, maybe a scanned diary or family letters turned into an ebook. Things you would rather not upload anywhere. bash $ bash docs/demo.sh Bookshelf Seance demo, model gemma4:e2b, Ollama at http://localhost:11434 Wrote /tmp/tmp.kqnRXGqRSW/poe-tales.epub 3 tales by Edgar Allan Poe Ingested "Three Tales of Terror" by Edgar Allan Poe: 3 chapters, 53 passages Index: /tmp/tmp.kqnRXGqRSW/index/index.json 53 passages from 1 book What drives a man to madness? Edgar Allan Poe: The disease had sharpened my senses, and above all was the sense of hearing acute 2 . I heard many things in hell, and this acute perception drove my actions 2 . Cited passages: 2 Three Tales of Terror, "The Tell-Tale Heart" "... I heard many things in hell." 29 s Can anyone escape death? Edgar Allan Poe: No, escape from death is a phantom I have never witnessed. Darkness and Decay hold illimitable dominion over all 1 . The life of the ebony clock goes out with that of the last of the gay 1 . Cited passages: 1 Three Tales of Terror, "The Masque of the Red Death" "... And the life of the ebony clock went out with that of the last of the gay." 14 s What do you think of smartphones? The spirits are silent on this. why: no passage scored 2 or more the best scored 0.00 , so the model was not called. 0 s Model: gemma4:e2b via Ollama 0.40.12, on a GitHub Actions runner with 2 CPU cores and no GPU. The whole demo took 44 seconds. The output above is copied unedited from that run. The third question is my favorite moment. Poe has nothing to say about smartphones, so the model is never even called. Just silence. Hold a séance with the dead authors on your own bookshelf, on your own computer, with the Wi-Fi off. You summon an author from your EPUB library "Edgar Allan Poe" , ask a question, and the ghost answers in the first person. The catch: it may speak only through passages from its own books , and it has to cite them. If the books hold nothing on the subject, it does not improvise. It says: The spirits are silent on this For whom: readers with a library of EPUBs public-domain classics, family letters, out-of-print books who want to talk with what an author actually wrote, privately, without uploading their books anywhere. seance ingest opens each EPUB with zipfile META-INF/container.xml - OPF - manifest and spine , reads title and author from dc:title / dc:creator , chapter… Everything runs on your computer, in plain Python standard library only, nothing to pip install , with an open model served by Ollama https://ollama.com . ~/.seance . seance summon ranks that author's passages against your question with BM25, a classic search formula, written from scratch in about fifty lines. 1 , 2 , 3 , with an instruction: answer in the first person, use only these passages, cite them as n . The demo uses gemma4:e2b , the smallest Gemma 4, so it runs without a GPU: the run above took 44 seconds on 2 CPU cores. A bigger model answers better if your computer can run it: one flag, --model gemma4:12b . There are 47 tests. They run offline, against a fake Ollama server started in a thread. It has honest limits, and the README lists them. The biggest one: BM25 matches words, not meanings. "Can anyone escape death?" finds "The Masque of the Red Death". "What is mortality?" finds nothing, even though Poe writes about death on every page. So silence sometimes means "no matching words", not "Poe never thought about it". I chose a ghost that is too quiet over a ghost that lies. Because the books never leave the computer. A séance is private. Your library might hold your grandmother's letters, or a book you love and can't find in print anymore. With an open model running locally, none of it goes to a server. The only network request the program makes is to Ollama on localhost . It also works with the Wi-Fi off. And no company can shut down the séance next year, change the price, or retire the model. The weights are on your disk. Finally, it costs nothing to run. That matters for a toy like this: nobody pays a monthly fee to chat with Poe. On the Día de los Muertos, families set up an ofrenda with things that really belonged to the dead: their photos, their favorite food, their objects. Not imitations. For a writer, the thing that really belonged to them is their words. That is the idea behind the citation check. The ghost can only bring to the table what the author actually wrote. When it has nothing, it says so, and the silence is part of the respect. A note on how this was made: the repository was created on October 24 with only a license and the technical ground rules, no code. All the code was written during the challenge week by AI agents, with a person reviewing the work. This article was written with AI assistance and approved by a person before publishing.