Hook That Fish — Project Story

What inspired me

I like incremental games, the bigger the number the better i feel lol. Fishing seemed like the obvious choice with a mix of my recent discovery of rouge lite games, I wanted to make something that involved the two.

The “Games with a Hook” theme was almost too literal to pass up. I wanted something that felt like a mobile arcade roguelite, but lived inside Reddit — where a cast isn’t just a personal high score, it’s a community flex on the leaderboard.

The core fantasy I chased:

You are the hook.
One cast. One plunge. How greedy are you willing to get?

How I built it

Hook That Fish is a Devvit web app: a Phaser game client inside Reddit’s iframe, with a small serverless backend for saves, gold, upgrades, and leaderboards.

Stack

Layer Tech
Client Phaser 4 + Vite
Hosting Devvit Web (Reddit)
API Hono + typed procedures
Persistence Redis (via Devvit)
Language TypeScript end-to-end

Architecture

  • Expanded game view — full Phaser scene stack (menu → cast → summary → shops)
  • Shared module — fish, zones, upgrades, and formulas shared by client and server so progression can’t desync as easily

Game systems that shaped the build

  1. A single cast as a run — depth increases, tension builds, and you choose when to reel
  2. Roguelite mid-run picks — every few fish you draft an upgrade and reshape the cast
  3. Permanent meta progression — Deep Spool, Zone Pass, lure/tackle upgrades between runs
  4. Zones as a cadence — each zone has a full set of fish roles (anchovy → emperor), tinted deeper as you unlock further
  5. Legend bosses — a scaled, glowing random fish from that zone, with a bobber minigame
  6. Predators — sharks, marlin, swordfish, and orca as animated threats once you’re deep enough

Art was treated like content pipeline work: JSON + PNG atlases, with a generated manifest so dropping new sprites into public/assets/fish/ actually ships in the build.

What I Learned

  • Constraints are a creative engine. Reddit's iframe restrictions (no alert, limited browser APIs, and a mobile-first flow that expands into the full game) forced cleaner UX decisions from the start instead of relying on desktop assumptions.

  • Creating assets by hand builds consistency. Nearly every visual element—from the fish and environments to UI icons and animations—was drawn and animated by hand. Working within a limited pixel canvas reinforced how important readability, silhouette, and subtle animation are to making a game feel alive.

  • Platforms have their own design challenges. Developing for Reddit Games meant solving problems beyond gameplay. Features like fullscreen behavior, supporting screens larger than mobile, iframe limitations, and platform-specific quirks required thoughtful workarounds to ensure the game felt natural wherever it was played.

  • Balance is an ongoing process. Every upgrade had to feel meaningful without making earlier progression obsolete. Tuning costs, rewards, and progression involved constant iteration to keep the game engaging from the first cast to the final unlock.

  • A cohesive experience comes from hundreds of small decisions. Good game feel wasn't created by a single feature—it came from ensuring the visuals, animations, progression, UI, controls, and audio all worked together to create an experience that felt polished and intentional.

A tiny example of the kind of "economy loop" thinking that kept coming up, where every cast contributes to both immediate satisfaction and long-term progression.

this was great practice for the rouge lite I've been working on for the past year.

Challenges I faced

1. Making one experience work for everyone

Defaulting to a mobile layout while keeping keyboard playable in a desktop Reddit iframe was messy. Pointers, focus, and “REEL IN vs drag” kept colliding until input sources were explicit.

2. Depth vs discovery

Early spawn math let the next zone start before you’d actually seen every fish role. Players unlocked Ghost on the license track while Moray never appeared. Spacing fish across each zone’s depth band fixed the fantasy: finish the zone’s cast of characters before the ocean changes.

3. Accidental UI disasters

Holding click to steer, then getting an upgrade popup under the cursor, meant pointerup selected a card. Blocking “already-down” pointers on overlay open was a humble but essential fix.

4. Bosses and predators as content, not blobs

Procedural shapes got us shipping, but legends needed to feel like fish — random species, zone tint, scaled up, still glowing. Predators needed four readable silhouettes with swim loops (shark, marlin, swordfish, orca), not three gray ellipses forever.

5. Shipping on a platform, not just a localhost game

Devvit setup, playtest, asset paths, and “works in the Reddit frame” bugs ate real time. The game had to feel good in a small iframe and as an expanded session.

Closing

Hook That Fish started as a pun and became a full progression loop: cast deeper, draft greedier, unlock the next zone, and leave a mark on the leaderboard.

If I keep going, I want better predator ai, more authored fish polish, and a more polished progression system maybe fish generator that generates new fish as you go deeper.

Built With

Share this project:

Updates