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

Share this project:

Updates