I Built BreakFinder: Personalized Surf Forecasts + Full Garmin Ecosystem

Published: (February 8, 2026 at 04:00 PM EST)
4 min read
Source: Dev.to

Source: Dev.to

Cover image for I Built BreakFinder: Personalized Surf Forecasts + Full Garmin Ecosystem

I Built BreakFinder: Personalized Surf Forecasts + Full Garmin Integration
I try to build something surfers actually needed. Today I’m sharing the technical journey, what worked, and what I’d do differently.

The Problem

I’m a surfer. I check forecasts constantly. But here’s the thing:

A 6 ft beach break ≠ a 6 ft reef break

Most forecast apps show you swell size and wind direction—cool—but they don’t tell you if the break matches your skill level or if you’re about to paddle into something dangerous. So I spent two months building BreakFinder to solve that.

The Solution: Three Pillars

Personalized Condition Scores

Instead of generic forecasts, BreakFinder gives you a personalized condition score based on:

  • Your preferred wave height range
  • Your preferred wind direction
  • Your preferred tide
  • Your preferred wave period

Example

  • Forecast: “6 ft swell, 15 kt offshore wind”
  • My app: “🟢 Perfect for you today” (because I’m intermediate and like 4‑6 ft)
  • For a beginner: “🔴 Too big for your level”

Full Garmin Integration (100+ Devices)

This was the hardest part. I integrated with Garmin because I use a Garmin watch and wanted accurate session tracking.

What’s included

  • 5 Connect IQ apps (Forecast, Session Tracker, Surf Skate Tracker, Watch Face, Breath Training)
  • Wave counting (how many waves you caught today)
  • Post‑session data sync to your account at BreakFinder

Why it was hard

Garmin’s Connect IQ SDK is powerful but poorly documented. I had to:

  • Support 100+ different watch models (each with different capabilities)
  • Handle offline functionality (watches have limited storage)
  • Optimize for battery life (can’t drain your watch)
  • Build fallbacks when devices don’t support certain features

Worth it? Maybe.

Skill‑Level Spot Matching

The database of 1 500+ spots includes difficulty ratings. When you’re trip‑planning, you see:

  • Beginner spots: Mellow beach breaks
  • Intermediate: Reefs with some risk
  • Advanced: Heavy breaks (Sunset, Pipe territory)

The Tech Stack

Fullstack

  • Rails 7 (API + Monolith)
  • Hotwire (Turbo + Stimulus)
  • PostgreSQL for user data + spots
  • Redis for caching forecasts
  • Event‑Driven Architecture

External Services

  • Garmin Connect IQ SDK (C++)
  • OpenMeteo for the first 7‑day forecast data
  • NOAA for 8–16‑day forecast data (own blog worth documenting the pain)
  • Geocoder (Ruby gem)
  • Leaflet for spot maps

DevOps

  • Docker for development environment
  • Hetzner + Kamal (so easy and cheap)
  • GitHub Actions for CI/CD

Current Metrics (2 Months In)

  • 5 000 downloads (Garmin IQ Store)
  • 3.9★ rating (honest reviews; we support 100+ devices, so some quirks and early‑version issues like missing wave counting)
  • 1 000+ registered surfers

What’s Next

Business Side (Launching Feb 2026)

I’m building a marketplace for local guide operators.

  • Small surf shops, guides, crews can list themselves
  • Traveling surfers can find them directly
  • Fair pricing (€19‑€299 /month per business, NO algorithm trap)
  • No 30 % commission like booking platforms

Revenue model: a solo surfer might pay €5 /month; a local business could pay €50‑200 /month to reach customers.

For Other Solo Devs

  • Pick a niche you understand deeply (I am a surf addict)
  • Focus on one metric early (mine: Garmin support)
  • Write about the technical journey (not just the marketing angle)

Questions?

I read every comment. Ask me about:

  • Garmin APIs
  • Rails architecture
  • Forecasting algorithms
  • What I’d do differently
  • Building as a solo dev

Let’s talk! 🏄‍♂️

0 views
Back to Blog

Related posts

Read more »

A Beginner’s Guide to Testing in Go

Tests Enforce Contracts Now right off the bat, you don’t want to get this wrong. When writing tests, the key thing to keep in mind is that we should treat what...