Inspiration

After going sea fishing while on holiday, I got the itch to fish again at home. After a couple of failed attempts buying the wrong gear and getting knots wrong, I finally got setup properly. With the right gear and weather, I managed to catch my personal best (3KG) within a short afternoon on the weekend. But even though I started to be more confident with this setup, I quickly realised I was losing track of what I caught (and most importantly - the tactics that were actually helping me catch more fish). So I decided I needed some app to keep track of these details. After looking on the app store three problems arose:

  • A lot of them included adverts which was quite distracting and not relevant to me
  • Priced quite high
  • Got abandoned and felt quite out of date

Tightlog is a comprehensive private diary that works offline and provides these valuable insights with a fair price tier and no adverts ever.

What it does

Tightlog is a local-first fishing logbook for IOS. The database is a SQLite DB on the phone, with optional syncing to ICloud or our own custom sync engine (so that you never lose your data)

  • Log a catch: The app auto-fills weather, pressure trends, wind, tide and moon phases. Multiple photos + videos per catch, a map populated with where you got the fish and also a map with nearby waters to help you find your next favorite spot. You can also log your favorite rod setup + bait setup and pair that with your catches

  • Sessions: Track the exact time you start fishing to the time you end. We collect elapsed time, fish count per hour, total weight caught and produce a debrief powered by on device / Gemini AI to give you insights on what worked and what didn't. Includes home screen widgets and live activities.

  • Insights: Show bite patterns vs the time of day and moon phases to help you pick the best time to go fishing. Includes 7-day solunar outlook, charts and a species dex (inspired by Pokemon).

  • Identify: Point the camera at a fish, snap a photo and we will identify it for you. We've trained a custom CoreML model to identify european fish with roughly 86% accuracy so that if you're puzzled by what you catch, we'll help you learn the species.

  • Coach: Answers common fishing questions and queries (on device model with a fallback to Google Gemini)

  • AI studio: Generate AI images of fish or edit your catches in whatever you want

  • Social: Opt in social aspect. Instagram style social feed for sharing your catches with the wider community. Make friends and groups to go fishing with. Join a competition with a QR code to see who can net the most fish.

  • Backup + restore: backup by recovery codes or by app store purchases with full CSV import and export, always free.

The free plan covers 10 catches, 2 spots, limited weather insights and anything else that is not AI. Tightlog pro unlocks unlimited catches + spots, unlimited (with fair use) AI usage, 14 day weather/solunar insights and the full coach.

How we built it

  • App: Expo and React Native, Expo router for routing and native Apple transitions, Legend state for local state, Tanstack Query for reading and writing data, Reanimated for animations/gestures, Skia for the live weather screen and react-native-vision-camera for the identify screen. We also wrote several native modules in Swift to support things such as a custom CoreML model for fish identification, sensitive content analysis (moderation) and apple maps (suggesting nearby fishing spots)

  • Backend: Four Cloudflare workers (sync engine, social API, AI API and push notification API). If the user chooses to sync their data with our servers it gets securely saved to Turso SQLite and R2. We protect the APIs by using Apple Attest.

  • Monetisation: Revenuecat for entitlements, trials, offer codes and a win-back offering. We use Statsig to run experiments for the paywall behind a Firebase remote config feature flag.

  • Growth + ops: OneSignal for remote push notifications, Firebase for analytics and feature flags, Sentry for observability and Layers for marketing.

  • AI: Gemini for simple queries and a custom classifier for fish identification. Harvested from open source nature data and trained to successfully identify European fish with high accuracy

Challenges we ran into

  • Two notification packages clashing with each other. We use expo-notifications for local-first notifications and OneSignal for remote notifications. OneSignal installs its own notification delegate and expo-notifications refuses to replace it. A small native module we wrote fixes this so we can keep using both.

  • Offline first: Building the logic so that the user never loses data and figuring out whether the server or the device holds the source of truth for the latest data.

  • Review. Two App Store rejections (a tracking declaration and iPad compatibility). During this period GitHub had multiple outages which made submitting new builds difficult.

  • Performance: Making sure the infinite logbook list stays fast and optimising skia

Accomplishments that we're proud of

  • A fish species AI identifier that runs offline, built from open data in a fortnight.
    • A logbook that works offline with no signal and gives you deep insights into what's working, how to improve your fishing and a product that puts you in touch with your local fishing community.
    • Fair monetisation layer: generous free tier and low prices.
    • Shipping everything! from the app to the infrastructure that supports it as one person in less than 12 weeks.

What we learned

  • Measure instead of guessing: Things such as performance and AI accuracy are not worth leaving up to guess work. Measure before and after each time, ideally with automation in place (such as a CI job or a script) to ensure you don't regress.

  • Cut scope if you need to: Cutting scope can feel disappointing, especially when you've worked hard on trying to get something out there. But sometimes it can hold you back more than it can propel you forward. We originally had plans to localize the app for all the regions its available in however we wanted to prioritise accuracy over what Claude was able to generate for us 😅.

What's next for Tightlog

  • Seasonal win-back offers (out of season i.e. winter times)
  • Reading paywall experiments
  • Marketing
  • Android release
Share this project:

Updates

Submission history