01. Overview
Fishub is a full-stack social network built for anglers: log a catch, get the species identified by computer vision, see whether the fish are actually biting right now, and compare notes with a club or the leaderboard. I built both halves of the product, a FastAPI/PostgreSQL backend and a cross-platform React Native mobile app, as a monorepo with a shared Docker Compose dev environment.
The app leans on real environmental data rather than static content: catches are enriched with live weather, tide/solunar timing, and AI-assisted species recognition, then folded into a social layer of feeds, clubs, challenges, trophies, and an end-of-year "Wrapped" recap.
02. Backend & Data Engineering
The API is a FastAPI service backed by PostgreSQL, modeling catches, species, locations, water conditions, clubs, and a full social graph (follows, likes, comments, blocks) behind Firebase-authenticated endpoints.
- Domain modeling: 20+ SQLAlchemy models covering catches, species, clubs, challenges, trophies, notifications, and moderation state, versioned through Alembic migrations.
- Gamification engine: Built a trophy and seasonal-challenge system (catch counts, weight/length thresholds, species-diversity milestones) plus a leaderboard service that ranks anglers per season.
- Insights & "Wrapped": A dedicated insights service aggregates a user's catch history into personal stats, best conditions, top species/spots, and a Spotify-Wrapped-style annual recap.
- Trust & safety: Implemented block, report, and hide flows so moderation state (not just deletion) governs what surfaces in a user's feed.
- Testing & CI: 29 Pytest suites cover the service layer; a GitHub Actions workflow builds the backend's Docker image on every push.
03. Environmental & AI Intelligence
Rather than treat every catch as an isolated data point, the backend layers in the conditions around it, which is the part of the product I found most interesting to build.
- Species recognition: Integrated the Fishial AI vision API to identify species from a catch photo, with a Wikipedia-backed enrichment step and graceful fallback to manual entry when the API is unavailable.
- Solunar calculations: Computed major/minor feeding windows and moon-phase data directly from astronomical ephemeris data (via
ephem), with no third-party API or network call required.
- Feeding forecast heuristic: Wrote a composite scoring model that blends solunar windows, golden-hour low light, and barometric pressure trends into a ranked "best time to fish" forecast, mirroring the heuristics anglers already use by hand.
- Live conditions: A weather client and reverse-geocoding pipeline attach location-aware temperature, pressure, and place-name context to every catch and forecast.
04. Mobile App & Product Design
The client is a single TypeScript/React Native (Expo) codebase shipping to iOS and Android.
Catch Logging
Camera/photo-library capture, AI species suggestion, and map-based location tagging via react-native-maps.
Feed & Clubs
Following, likes, comments, club membership, and follow-request flows layered on Firebase auth.
Trophies & Challenges
25+ trophy tiers and rotating seasonal challenges tracked against a live leaderboard.
Forecast & Insights
Feeding-window forecasts, personal stats, and an annual "Wrapped" recap screen.
- Navigation & state: React Navigation (stack + bottom tabs) across 20+ screens, with Firebase-backed auth state gating protected routes.
- Native integration: Expo Camera/Image Picker, Location, and Notifications, plus a native Google Sign-In flow and push notifications wired through Firebase.
- Build tooling: Patched native dependencies (via
patch-package) to fix an expo-device iOS build break on newer Xcode toolchains, and maintain native icon/splash assets across both platforms.