GhostBust Hotline
A polished 2D top-down shooter built entirely in Elm — invisible ghosts, hand-crafted particle effects, per-ghost AI, and a CI pipeline. Led a 3-person team from concept to shipped game.
3
TEAM SIZE
100% Elm
LANGUAGE
Per-ghost, distinct
GHOST AI BEHAVIOURS
Overview
GhostBust Hotline is a 2D top-down shooter with a twist: the ghosts hunting you are invisible. You have to reveal them before you can fight them, and each ghost type demands a different strategy once it shows itself.
The entire game is written in Elm — a pure functional language with no runtime exceptions — using the Messenger framework. Shipping a real-time action game in a language designed for web forms was half the fun.
What I did
- Led the 3-person team from concept through to the shipped, publicly playable build — scope, task split, and the integration work that makes three people's code feel like one game.
- Core gameplay mechanics: player movement and combat, the reveal-then-fight loop around invisible ghosts, and per-ghost AI behaviours so each enemy type forces a distinct player strategy.
- Hand-crafted particle effects. Elm has no off-the-shelf particle engine, so muzzle flashes, ghost reveals, and death bursts are all custom systems tuned frame by frame.
- CI pipeline with GitHub Actions verifying Elm compilation on every push and pull request — the codebase stayed green for the whole development cycle.
- Produced the game trailer end-to-end in DaVinci Resolve: capture, edit, and post-production.
What I learned
Pure functional game development inverts your habits: there is no sneaky mutable state, so every gameplay system — AI, particles, collisions — becomes an explicit fold over messages. It is verbose at first, then suddenly it's the easiest codebase to debug you've ever worked in.
Play it
The game runs in the browser — play it here.
APPENDIX A // MEDIA
IMAGE SLOT — AWAITING UPLOAD
VIDEO SLOT — AWAITING UPLOAD
IMAGE SLOT — AWAITING UPLOAD