A real-time fishing competition tracker — built in 2 days, tested on a boat

This is the story of how I turned that into a real product using Figma MCP and Claude Code — and what I learned when I tested it on the water.

[Role] Solo Designer + Builder
[Timeline] 2 days to first ship
[Status] Live. In use.
[Prototype] Try it out
Hooked app leaderboard screen
Figma
UX Design
Figma MCP
Design → Code
Claude Code
Build
GitHub
Version Control
Netlify
Deploy
🚢 Live on the boat
Real-world testing
⟳ Iteration
Firebase · Next up
The Problem

A real user with a real pain point

Captain Michael Wang at the helm of NZ Legend Boating

Meet my dad

Captain Michael Wang is a maritime captain with 30 years of ocean experience, a graduate of Maritime University Dalian with first-class honours, and a certified NZ Coastguard boating education tutor. A lifelong mariner and champion for water safety, he has spent his career helping people experience the joy of the ocean — safely. He runs NZ Legend Boating on the Waitematā Harbour in Auckland — charter fishing trips for groups wanting a great day on the water.

Every year he runs an informal fishing competition for his clients — biggest fish per species (Snapper, Kingfish, Kahawai, Trevally, Gurnard, John Dory) wins a prize. His system for tracking it: a physical diary and the Notes app.

Captain Wang's fishing notebook
Notes app catch list

Hooked replaces both with a single shared system that updates in real time for everyone on the boat.

Who Uses It

A first-time angler, a seasoned captain, and a tech support in Sydney. One product that had to work for all three.

Understanding the different contexts of use was critical. The same app needs to work for an excited 28-year-old who just pulled a Kingfish from the water with salty hands, and a 60-year-old maritime captain who shouldn't need to think about it at all.

🎣

Charter Clients

25–50 year old professionals, uni students, young families. Phone-native. Competitive and social. On a moving boat, possibly with wet or salty hands, in bright Auckland sunlight — wanting to share the moment with mates.

Dad (Admin)

60 years old. Maritime captain background. Not a tech person — and shouldn't need to be. He needs the competition to run itself passively, with a large, simple, forgiving admin experience when something needs fixing.

💻

Amy (Co-admin)

Handles setup, maintenance, and troubleshooting remotely from Sydney. The product needs to be stable enough that I'm not getting phone calls mid-trip.

Design Principles

Designed for unique conditions. Wet hands. Bright sunlight. A moving boat. The excitement of just catching a fish.

👁️
Glanceable

Key information readable in 2 seconds. Large text, maximum contrast. Sized for sunlight.

👍
Thumb-friendly

Big tap targets. One-handed. No small or fiddly interactions. Designed for the catching hand.

🛡️
Forgiving

Confirm before submit. Easy to go back. No accidental deletes. Errors should be recoverable.

Low friction

Minimum steps to log a catch. No account creation for clients. First name is enough.

🎉
Celebratory

A fun day out. The UI should feel joyful, not clinical. Logging a catch should feel like a reward, not a chore.

🔒
Trustworthy

Dad needs to feel the data is accurate and he's in control. Admin features are simple and clear.

Early Wireframes

Vibe coding still starts with a human touch

Before writing a single line of code, I mapped out the full user journey on paper — the client flow on top, the admin flow below. Getting this clarity upfront is what made the Figma MCP handoff to Claude Code so clean.

Hand-drawn wireframes showing client flow (top) and admin flow (bottom)
Key Design Decisions

Where thinking met constraint

01Framing

Catch log first, competition second

Early framing positioned Hooked as a competition tracker. Reframing to "trip catch log with a competition layer" changed the entire product feel. Clients want a record of the day — the rankings are a bonus. This shift made the product genuinely useful even without a competition running.

02Access

No client login

Login means instant drop-off. A client who just pulled a fish from the water has 30 seconds of attention. First name only — enough for the leaderboard, not enough to create friction. The tradeoff (no identity verification) is managed by admin edit/delete and the existing honour system on the boat.

03Operations

One permanent QR code

I rejected per-trip QR codes — too much admin burden for dad. One QR code, laminated, permanently fixed to the boat. It never changes. Auto trip creation handles date logic invisibly. For the 20% of days that run as split morning/afternoon charters, a simple admin toggle activates that option — the 80% case never sees it.

04Input

Number pad over slider for length

A slider looks cleaner but is imprecise and fiddly on a moving boat. A number pad is faster, more accurate, and familiar. This was a deliberate UX decision caught during prototyping — the slider failed the moment I imagined someone entering 67cm with one hand on a moving deck.

05Logic

Per-species ranking with tied logic

Initial logic ranked anglers overall. That felt wrong — some anglers value certain prized fish regardless of size. Someone might pull a prized John Dory from the water that's a lot smaller than a Snapper, and it still deserves its moment. Corrected to per-species ranking: "This John Dory is #1 on the boat!" Tied ranking logic was also built in from the start.

06UI

Retake vs Remove for photos

Once a photo is taken, showing "Remove" felt destructive and risky on a moving boat. "Retake" is more forgiving and achieves the same practical result. The Skip & Log Catch button is always an active teal CTA — never greyed out — so the optional step never feels like a blocker.

The AI-Assisted Pipeline

Design before code. Every time.

The most important thing I learned: finish the design in Figma before writing a single line of code. Naming frames clearly — 01-Name-Entry, 02-Species-Picker — meant Claude Code could locate any screen instantly. Less time hunting, more time building.

Stage What happened
FigmaFigma
Full UX design completed first — flows, visual identity, component system, all screens. Nothing handed to Claude Code until every frame was named and every interaction was decided.
Figma MCPFigma MCP
Connected via OAuth in a separate terminal. Gave Claude Code direct read access to every Figma frame — no copy-pasting specs or describing layouts in words.
Claude CodeClaude Code
Built the React + Tailwind PWA from the Figma specs. Design decisions I'd already made translated cleanly into code. Logical errors I caught during build — like per-species ranking and retake vs remove — were easy to fix because the design was already clear.
GitHubGitHub
Version controlled throughout. One commit per feature, so every decision has a paper trail.
NetlifyNetlify
Deployed and live within 2 days of starting.
Visual Identity

A palette built from the harbour

Deep ocean colours, teal accents for interactivity, gold for winners and celebration. Species illustrations generated in Midjourney as vintage natural history fish prints — familiar enough to be legible in sunlight, distinctive enough to be delightful.

Deep Ocean #0B2A3B
Teal #00E5C5
Gold #FFB800
Sea Foam #F0F8FF

Display: Unbounded · Body: DM Sans (minimum 16px) · All species illustrations at 3× for retina sharpness.

Snapper illustration Kingfish illustration Gurnard illustration John Dory illustration
The Finished Product

All 8 screens, end to end

From splash screen to leaderboard — the full user journey, built and live.

Splash screen 00 · Splash
Name entry screen 01 · Name Entry
Species picker screen 02 · Species Picker
Length input screen 03 · Length Input
Photo upload screen 04 · Photo Upload
Review screen 05 · Review
Success card screen 06 · Success Card
Leaderboard screen 07 · Leaderboard
The Admin View

Built for someone who shouldn't have to think about it

The client-facing app was only half the problem. Dad needed a way to run the competition in the background, without much tech support. Same visual language, same fish illustrations, completely different job: glanceable status, forgiving edits, zero technical thinking required. Designed for desktop since that's where he manages the business, and built to WCAG AAA contrast standards since his eyes aren't what they used to be.

Today's Trip admin view showing daily anglers, top catch and leaderboard
Today's Trip

Gives him the whole day at a glance — anglers, top catch, total catches — with a live leaderboard he can edit or delete from directly if a client mis-types a length.

Date picker showing trip days marked with teal dots
Date Picker

Marks every trip day with a teal dot, and split morning/afternoon charters get two dots side by side. He can see his whole month of bookings without opening anything.

Season leaderboard showing biggest catch per species
Leaderboard

Shows the season's biggest catch per species, reusing the same fish illustrations from the mobile app — so the whole product feels like one system, not two.

All entries view showing every catch filterable by species
All Entries

The safety net: every catch, filterable by species, editable or deletable in two taps if something needs fixing.

Usability Testing on the Water

Real-world testing is humbling — and worth it

The app worked. Seeing someone scan the QR code, log a Kingfish and watch it appear on the leaderboard on a real boat on the Waitematā with real people catching real fish was genuinely surreal. However, I hit a major roadblock.

On-water testing
On-water testing
On-water testing

localStorage ≠ shared state

localStorage stores data per device. On a boat with five people logging catches on their own phones, every screen showed a different leaderboard. The fix is Firebase Firestore, which I'm migrating to next — a reminder that social features need shared persistence from day one.

Laminate the QR code

Water and paper don't mix. Lesson learned.

Nothing from your past is wasted

I once signed up for a Mobile Computing course at USyd not realising it was designed for final-year CS students. I had no coding background. At the time it felt like climbing a mountain just to survive. Now, building Hooked with Claude Code, I could feel that foundation paying off. Prototypes tell you what something looks like. Shipping tells you how it actually works.

What's next

Firebase Firestore migration — real-time shared leaderboard across all devices on the boat
Iterate on the photo step — testing showed it can disrupt momentum and create friction. Anglers had to stop, dig the fish out of the bin, and pose for a photo, which didn't feel as smooth as the rest of the flow
Create a shareable catch card — a celebratory moment built for social media

Want to see it live?

The app is deployed and in use on the Waitematā. Open it on your phone.