This is a submission for the Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine
What I Built
Poltergæist is a ghost that moves into your Windows PC and haunts it. It comes with a mascot, Poltergæist-chan, an elegant, teasing older-sister type haunts your device.
I took "Ghost in the Machine" literally. The ghost is software, and it lives in the one place nobody checks: the gaps in your own work. When you stop typing in the middle of a sentence, whether in Notepad, Discord or a document, she types a whisper into your window, lets it sit for a moment, and then erases it. You are left wondering whether you saw it.
The haunting is a slow burn. Over the first hour a hidden "dread" level climbs on an eased curve, quiet for a long while and then faster. As it climbs, more effects unlock and all of them get stronger:
- ghost text drifting across every monitor
- breathing in the speakers
- the mouse cursor shaking, from a faint tremor to a convulsion
- footsteps
- the screen dimming, as if a cloud had passed
- a heartbeat
After the hour she stays at her peak until the program ends. Separately from all of that, a flashbang goes off at random moments with a synthesized tinnitus ring. It does not care how long she has been running.
You cannot pause her. She starts when you sign in, and you stop her by ending the process in Task Manager, restarting the PC (the hour begins over), or uninstalling. That is the point: a ghost with a pause button is just a settings menu. She is not hidden, though. She lives in the system tray, shows up in Task Manager and Startup apps, and has a clean uninstaller.
The inspiration was the part of Halloween and all the ghost stories that appear at this time of month. I wanted a haunting that felt like presence broken up with the horrors of my terrible flashbang throws from my Counter Strike: Global Offensive days. That's why most of the work went into pacing while the flashbangs stays as disruptive as my own terrible callouts were.
Demo
The video runs Poltergæist in its time-lapse mode (--demo), which plays the full hour of escalation in about two minutes. You can see the whisper typed into Notepad when I stop typing, then the effects building: ghost text, breathing, the cursor shake, the dimming and the heartbeat. A flashbang lands along the way. The real thing is a much slower burn that takes a full hour to reach its peak.
Warning: the video contains a bright flash and a loud ringing sound.
You can also try it yourself. Grab Poltergaeist-Setup.exe or the portable zip from the latest release.
Code
Brage1025
/
Poltergaeist
My submission for the Hacktoberfest 2026 Open-Source AI Challenge, Week 4: Ghost in the Machine
Poltergæist
A cute ghost for your Windows PC, with a local open-weight AI at its core.
It builds slowly over the first hour, then stays at its peak until you stop it
Download the latest release | Watch the demo | Build from source | MIT License
Poltergæist haunts the computer it is installed on. When you pause in the middle of a sentence, the ghost types a whisper into your window and erases it Over the first hour, ghost text drifts across the screen, footsteps cross the room, the display dims, and a heartbeat starts. At random moments a flashbang goes off with a tinnitus ring.
It is a prank, a game and a Halloween decoration for a machine you own. The whispers are written by an open-weight language model running locally through Ollama. No cloud, no account, no internet connection.
Warning: the flash is very bright and…
MIT licensed. Windows 10 and 11. The GitHub Actions workflow builds, self-tests and packages the installer and a portable zip.
How I Built It
The open-source AI: the whispers are written by an open-weight model running locally through Ollama. The default is llama3.2:3b, and any Ollama model works through a setting. The program calls Ollama's HTTP API on localhost. If Ollama is not installed it falls back to a built-in list of whispers, so the ghost still works with no setup at all.
The model's tone follows the dread level. The prompt moves through four tiers: friendly at first, then uneasy, then menacing, then urgent. The same model that sounds almost kind at minute five sounds like it knows where you are by minute sixty.
The rest of the stack: it is one Python program.
-
Director: it computes
dread = (minutes / ramp)^1.5, capped at 1. It picks events from a shuffled bag so none repeats too soon, and the gap between events shrinks from about 9 minutes to about 1.5 as dread rises. -
Overlays:
tkinterwith one borderless, click-through window per monitor, so the effects cover every screen and never steal input. -
Typing:
pynputwatches for pauses and types the whispers. It ignores the keys it injects itself, so it never reacts to its own ghost. -
Sound: every sound (heartbeat, breath, footsteps and the ring) is synthesized with NumPy and played through a mixing stream with
sounddevice. Events overlap instead of cutting each other off, and no copyrighted game audio is used. -
Tray:
pystrayand Pillow. Right-clicking the tray icon opens a popup with the full-body mascot and a link to the repo. -
Packaging: PyInstaller and Inno Setup, built by GitHub Actions on every push. The workflow smoke-tests the packaged exe with
--selftestand attaches the installer and a portable zip to each release.
Creator's notes:
- The mascot, Poltergæist-chan, was generated with an AI image generator because I had neither the time nor the funds to commission one. Because of that, I do not claim copyright in her: the artwork is dedicated to the public domain under CC0, and anyone can use, modify and remix her.
- The default model,
llama3.2:3b, is open-weight under the Llama 3.2 Community License, which is not an OSI-approved open-source license. If you want a fully open-source stack, you can set themodelsetting to one under Apache-2.0 or MIT.
Why Does Open Innovation Matter?
A ghost that watches how you type is only acceptable if the watching stays with you. There is an opt-in setting, eavesdrop, that lets the ghost twist the last word you typed. With a closed API that would mean shipping your keystrokes to someone else's server. With a local open-weight model, it never leaves RAM on your own machine. That is the difference between a spooky toy and spyware, and it is the framework I've had in mind in this project.
Other things a closed API would not have given me:
- It works offline. Unplug the Wi-Fi and she keeps haunting you.
- The personality is swappable. Change the model or the prompt tiers and she becomes a Victorian ghost, a dead programming language, or a passive-aggressive coworker.
- It costs nothing per call, so she can whisper all day without a bill.
- There is no vendor kill switch. An installed ghost cannot be deprecated out from under you.
A Ghost Story
Poltergæist-chan comes with her own lore, because every haunting has a story.
In 1998, a student stayed up past three every night in a dormitory, finishing a program that never seemed to compile. Her last log entry reads: "Almost done. Someone keeps reading over my shoulder." She was never found. Her computer was still on.
The machine was sold, then sold again, then wiped and wiped again. But she had been typing for so long that a little of her had soaked into the keyboard. That is why Poltergæist-chan only speaks when you pause: she has spent twenty-five years waiting for someone to look away, and she has learned that the best moment is the middle of a sentence. The cursor shake is not a glitch. It is how a hand shakes when it is trying to reach through something.
She is only trying to keep you company. That is the worst part.
"But hey, that's just a theory, a game theory!" - Matthew "MatPat" Patrick
Prize Categories
Best Use of GitHub Copilot. The project is automated end to end with GitHub Actions. Every push and pull request builds the Windows app on a hosted runner, smoke-tests the packaged exe with a built-in --selftest, compiles the installer with Inno Setup, and zips a portable build. Pushing a version tag stamps that version into the installer and publishes a GitHub Release with both files attached, so a broken build never reaches a user. The workflow is in: .github/workflows/build.yml.

Top comments (0)