// case study mobile
Fischly
A full-stack React Native fishing companion for the Bavarian licence exam: learning flows, statistics, loadouts, catalog-backed product search, maps, and a Fastify/PostgreSQL backend.
// tl;dr — did it work?
// the itch
The problem
Fischly began with the official Bavarian exam catalog, a print-oriented source that needed to become reliable app data. As the product grew, the same challenge expanded to equipment, loadouts, map places, catches, and photos: each workflow needed normalized server-side data instead of fragile local-only state.
// the setup
Context & constraints
Fischly started as a learning app for the Bavarian fishing licence exam and is evolving into a broader fishing companion. The project spans an Expo/React Native mobile app, Fastify APIs, Prisma/PostgreSQL data models, a shared typed API client, import workflows, deployment, and production-safe maintenance scripts.
// the calls I made
Decisions & tradeoffs
Turn exam material into a maintainable data source
The official catalog changes over time and contains more than a thousand questions. Fischly keeps that source as structured question data with reviewed corrections and repeatable imports, instead of relying on manual app updates.
Model equipment as normalized catalog data
Loadouts reference product variants for rods, reels, lines and lures instead of duplicating catalog fields. Product search combines a curated catalog data source with custom equipment, manufacturer filters, attributes, prices and images.
Separate mobile app, backend API, and shared packages in a TypeScript monorepo
Shared types and API contracts reduce duplication across the React Native app, Fastify backend, learning flows, loadouts, product search, and map features while keeping each layer independently maintainable.
// how it fits together
Architecture
Structured exam data, catalog-backed equipment data, and map/water data flow through a Fastify API into PostgreSQL and the React Native app. Shared TypeScript packages provide typed contracts across the stack.
// the hard parts
Key challenges
- Turning print-oriented exam material into a structured, refreshable question source.
- Normalizing equipment variants and attributes so product search and loadouts can show consistent details.
- Keeping learning state, equipment, maps, catches and photos behind typed, validated backend contracts.
// did it ship?
Outcome
A production-ready mobile platform with structured exam data, API-backed learning state, statistics, exam simulation, mistake training, normalized equipment search/loadouts, and an integrated fishing map.
// hindsight, 20/20
The next product risk is keeping the growing data surfaces easy to refresh, validate, and operate safely as the app expands from exam preparation into a broader fishing companion.
Stack
- React Native
- Expo
- Expo Router
- TypeScript
- Fastify
- Prisma
- PostgreSQL
- Zod
- TanStack Query
- Node.js
- Docker
- Maestro