Inspiration
Most games hand you a jump button. I wanted one where you never touch the character at all. You're the wind blowing a scrap of paper across a bored kid's notebook, nudging the world, but the ghost is never yours to command.
The other idea was to make dying leave something behind. This is a Reddit game, so death should be social: when you die, your crumpled paper corpse stays in the level, tagged with your username, for everyone who plays after you. Touch a corpse and it gives you a small boost. A hard level slowly fills with everyone who failed it before you.
What it does
- You control the wind, not the ghost. Hold and drag anywhere; the drag becomes a gust that blows the ragdoll around. One input, no buttons, and it works the same on mobile.
- A breath meter drains while you blow and refills when you let go, so you play in short pulses instead of holding one direction.
- Dodge ink-drawn spikes and ride graphite boost smears to reach the escape door at the end of the notebook page.
- Every death drops a username-tagged corpse into the level, permanently, for all players. Touch one for a speed boost; deadly levels fill with piles of the fallen.
- Miss a platform and the ghost plummets off the page. It swaps to a screaming, speed-lined panic drawing and wails as it falls into the void below the paper.
- Reach the door and a results card scrawls your time, your leaderboard rank, and a playful "flight report" (distance flown, top speed, max angle of attack), then dots your exact route across the page in pencil.
- A daily "Tonight's Séance" track regenerates at midnight from a date seed. Each day is a fresh procedural level with its own leaderboard and its own corpses.
How I built it
- Devvit Web and Phaser 4, running inside a Reddit Interactive Post. A splash card in the feed expands into the game canvas.
- Matter.js for the ghost: a head with trailing tail segments on loose constraints, low gravity and high air friction so it floats and the wind feels earned.
- A rendering layer that imitates ballpoint pen on ruled paper: blue rules, a red margin line, and seeded per-stroke wobble so every drawn line looks hand-made but never shimmers.
- The ghost is three hand-drawn frames cross-faded by what it is doing: a calm idle, a squinting wind-blown pose, and a screaming free-fall, blended by wind pressure and fall speed so the states never pop.
- A Hono server on Devvit with Redis: per-post leaderboards and cross-player corpses as sorted sets with rank-based capping, and each level's JSON keyed by post ID, including the date-seeded daily tracks.
- A tiny custom art pipeline mattes, crops and area-downscales the raw hand-drawn PNGs, which kills edge shimmer and keeps the art, font and audio small with no external requests at runtime.
Challenges I ran into
- Tuning the wind is most of the game. Too weak is infuriating, too strong removes the skill. I settled on a gust that can barely lift the ghost against gravity, so fighting gravity always costs effort.
- Redis on Devvit has no lists, which the obvious corpse design assumed. I rebuilt corpses and leaderboards on sorted sets with rank-based capping instead.
- Phaser's
scene.restart()skips field initializers and fails silently if you call it inside a pointer handler. I flag restarts and run them in the update loop to keep retries under a second. - Playtesting needed Reddit auth, so I built a local harness that serves the built client and drives synthetic gusts through Chrome to tune the feel quickly.
What's next
- Better mobile support: a responsive camera that scales to the screen width so small screens aren't cramped, plus tuned touch controls.
- A notebook level editor: draw your own ink terrain, spikes and boost smears, and publish each as its own Reddit post (the server plumbing is already in place).
- Champion replays: sample winning runs and bring the daily winner back as a golden ghost at the start line.
- Daily streaks that unlock cosmetic ghost skins, tallied in the margin.
- Two-player séances, both players blowing the same ghost.
- Letting corpses carry a one-word scribble, not just a username, and using the corpse map to flag levels that are unfairly hard.
Built With
- devvit
- hono
- matter.js
- phaser.js
- redis
- typescript
- vite


Log in or sign up for Devpost to join the conversation.