DEV Community

Cover image for I built many ghosts that haunt my Windows desktop — each one reacts to a different action
Abhishek Emmanual Hansdak
Abhishek Emmanual Hansdak

Posted on

I built many ghosts that haunt my Windows desktop — each one reacts to a different action

Hacktoberfest Open-Source AI Challenge: Ghost in the Machine Submission 👻🌼

devchallenge #hf26challenge

👻 GITM: I Built a Windows Desktop That Gets Haunted When You Actually Use It

What if your computer had a ghost?

Not the kind that sits permanently on your desktop, consumes screen space, and waits for you to interact with it.

I'm talking about a ghost that appears when you type, reacts when you copy something, gets angry when you delete something, and disappears before you even realize it was there.

That's GITM — Ghost in the Machine.

A Windows desktop experience built around one simple idea:

Your desktop shouldn't need a permanent companion. Sometimes, it just needs a little haunting.

What exactly is GITM?

GITM is a Windows desktop tray application that stays invisible until something happens on your computer.

When a supported desktop event occurs, a small animated ghost appears, performs its reaction for approximately 2–3 seconds, and fades away.

No permanent character. No unnecessary notifications. No constant animation.

Just small, unexpected moments of personality throughout your normal desktop workflow.

The experience is built around an event-driven animation engine, where different desktop activities trigger different ghost behaviours.

Five things that make this more than a desktop pet

1. An event-driven ghost engine

GITM listens for desktop activity through keyboard, clipboard and filesystem hooks.

Different events can trigger different character animations, including typing, copying, pasting, moving files and idle behaviour.

The overlay is transparent and click-through, so the ghosts can appear over your desktop without unnecessarily interfering with normal interaction.

It also supports an idle multi-clone swarm and a drag-shove interaction.

2. SpriteForge-powered characters

The visual experience is built around custom sprite artwork created with SpriteForge my another app.

Instead of treating the characters as static decorations, GITM uses sprite sheets to give them different reactions and behaviours.

I'm also developing pet visits, wandering behaviour, character parking and more flexible sprite-sheet importing.

3. Local AI with Gemma 3 1B

This is where things get interesting.

GITM optionally integrates Gemma 3 1B through Ollama.

The model can generate a short whisper based on:

  • The event name.
  • The ghost's current mood.

It never receives actual keystrokes, clipboard contents or filenames.

The AI runs locally. If Ollama isn't available, GITM falls back to predefined dialogue.

The ghost doesn't need AI to function. AI simply gives it another layer of personality.

4. A progression system

I wanted the experience to reward interaction without turning it into another productivity application.

GITM includes:

  • Ectoplasm scoring.
  • Mood progression.
  • Candy interactions.
  • Unlockable badges.
  • Persistent progress stored locally in AppData.

Your ghost gradually develops its own little personality through the experience.

5. Seasonal haunting

GITM also reacts to the calendar.

On October 31, the Halloween experience takes over.

From November 1–2, the experience transitions into a Día de los Muertos-inspired visual theme.

These aren't just permanent decorations. They're date-based experiences designed to make the desktop feel a little different during special occasions.

There's an entire Studio behind the haunting

GITM isn't just a Python script displaying animated images.

It has a separate desktop Studio built with React 19, Vite and Electron.

The Studio provides an interface for managing character appearances, importing sprites and controlling pet visits.

The underlying Python engine handles the actual desktop interactions and animations.

The architecture currently looks like this:

Component Technology
Desktop engine Python
Transparent overlay PySide6
Desktop event monitoring pynput, watchdog
Clipboard integration pyperclip
Studio interface React 19
Studio bundler Vite
Desktop shell Electron
AI Gemma 3 1B
Local model runtime Ollama
Configuration YAML

The Python engine and Studio communicate through a dedicated bridge.

Privacy isn't an afterthought

Desktop applications can potentially observe a lot about their users.

I didn't want GITM to become another application that collects personal activity just to provide a little entertainment.

So the design follows a strict principle:

React to the event, never inspect the user's content.

For AI-generated whispers, only the event name and current mood are provided.

No keystroke contents.

No clipboard contents.

No filenames.

No cloud inference.

No content logging.

The model runs locally through Ollama, and the application has handwritten fallback dialogue when local AI is unavailable.

The goal is to make the desktop feel alive without making the user feel watched.

More than just haunting: Disk utilities

There's another experimental feature accessible through the system tray.

Haunt the disk explores folder suggestions, with TabPFN 3.5 planned for future integration.

Sweep temp provides temporary-file cleanup functionality.

The current dust scanning and sweeping functionality works without TabPFN. The model integration remains planned rather than a shipped dependency.

I like the idea of giving the ghost a little more responsibility than simply appearing and disappearing.

Maybe it can occasionally help clean up the place it haunts.

What's working, and what's next?

GITM already has a substantial foundation:

  • Transparent desktop overlay.
  • Idle multi-clone animations.
  • Keyboard, clipboard and filesystem event hooks.
  • Local AI whispers and fallback dialogue.
  • System tray integration.
  • Ectoplasm, moods and badges.
  • Seasonal themes.
  • Temporary-file scanning and cleanup.
  • React + Electron Studio.
  • Sprite importing and character customization.
  • Automated tests and a PyInstaller build script.

There are still areas I'm actively developing.

Some event types need their final sprite mappings, some interactions are intentionally disabled, and the complete Tamagotchi-style pet lifecycle is not finished yet.

I'm also working on better sprite-sheet grid detection, new artwork and pet parking behaviour.

The goal isn't to ship a collection of unfinished animations. It's to make each interaction feel intentional.

Why I built this

I think desktop software has become very functional, but often very personality-less.

We have applications that track everything, notify us about everything and constantly demand our attention.

I wanted to build something that does the opposite.

Something that doesn't demand attention.

Something that doesn't need to stay visible.

Something that can simply appear for two seconds, make you smile, and disappear.

GITM is my experiment in bringing a little personality back to the Windows desktop.

And perhaps the strangest part is that the computer doesn't even need to be haunted all the time.

It only needs to feel haunted occasionally.


Project: GITM — Ghost in the Machine

Platform: Windows

Built with: Python, PySide6, React, Electron, SpriteForge and Gemma 3 1B.

AI: Local inference through Ollama.

Privacy: Local-first, no cloud inference, no content logging.


The machine is working.

The ghosts are just getting started. 👻

Top comments (0)