Project: Spectre
Event: Kiroween Hackathon
Tech Stack: VLC, Lua Scripting, Unsplash API, Freesound API
The Concept: The "Uncanny Valley" of Software
We all know VLC Media Player. It's the reliable, orange-coned workhorse of video playback. It's safe. It's boring. It plays everything.
For the Kiroween Hackathon, I wanted to subvert that safety. I didn't want to build a "spooky" app from scratch that users would expect to be scary. I wanted to take something familiar and make it... wrong.
Enter Spectre. It looks like VLC. It functions like VLC. But if you watch closely, the buttons are slightly rusted. The play icon is 5 pixels off-center. And every once in a while, it screams at you.
The Design: Intentional Corruption
I compiled VLC 3.0.21 from source with a custom horror skin baked in. The design philosophy: "Digital Decay."
Key corruption elements:
- Play button offset by +5px (subtle, but triggers "something is broken" feeling)
- Volume slider 3px narrower than its background
- Hidden jumpscare overlay panel
- Blood splatter effects on custom button graphics
Under the Hood: The "Haunt Engine" ⚙️
Rather than rewriting VLC's C++ core, I leveraged Lua Extension capability to inject horror directly into the runtime.
How It Works
The Loop:
local CHECK_INTERVAL = 30000000 -- 30 seconds
local TRIGGER_CHANCE = 5 -- 5% chance
function trigger_event()
if math.random(100) <= TRIGGER_CHANCE then
fetch_and_scare()
end
end
The Flow:
- VLC launches → Auto-loads corrupted skin and Lua extension
- Timer ticks every 30 seconds during playback
- 5% chance to trigger the haunt
- Fetches horror assets from Unsplash ("scary face," "skull," "ghost") and Freesound ("scream")
- Caches to
%TEMP%\spectre_cache\for instant display - Overlays image and blasts audio through hidden skin panel
Challenges & Solutions
Build Complexity: Compiling VLC from source on Windows takes 2-4 hours with MSYS2. Created automated scripts to ensure reproducible builds.
Async API Calls: VLC's Lua API blocks the UI during HTTP requests. Solved with local caching—downloads happen in background, only display when ready.
Auto-Loading: Built a two-stage Lua system (spectre_loader.lua → spectre.lua) that activates automatically on startup.
Try It (If You Dare)
This project was a blast to build. It taught me that sometimes the scariest things aren't the ones that jump out at you immediately, but the ones that look familiar... until they aren't.
⚠️ WARNING: This mod is functional. It will scream at you. It will flash images. Do not use this if you have a heart condition or anxiety.
Check out the code and grab the release here: GitHub Repository
Happy Kiroween! 🎃💀
Top comments (0)