<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Philipp</title>
    <description>The latest articles on Forem by Philipp (@breakfinder).</description>
    <link>https://forem.com/breakfinder</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3760616%2F91c1e5b3-603b-4efe-9c43-e5b3ffe24ed9.png</url>
      <title>Forem: Philipp</title>
      <link>https://forem.com/breakfinder</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/breakfinder"/>
    <language>en</language>
    <item>
      <title>I Built BreakFinder: Personalized Surf Forecasts + Full Garmin Ecosystem</title>
      <dc:creator>Philipp</dc:creator>
      <pubDate>Sun, 08 Feb 2026 21:00:19 +0000</pubDate>
      <link>https://forem.com/breakfinder/i-built-breakfinder-personalized-surf-forecasts-full-garmin-ecosystem-4ama</link>
      <guid>https://forem.com/breakfinder/i-built-breakfinder-personalized-surf-forecasts-full-garmin-ecosystem-4ama</guid>
      <description>&lt;p&gt;I Built BreakFinder: Personalized Surf Forecasts + Full Garmin Integration&lt;br&gt;
I try to build something surfers actually needed. &lt;/p&gt;

&lt;p&gt;Today I'm sharing the technical journey, what worked, and what I'd do differently.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem:
&lt;/h2&gt;

&lt;p&gt;I'm a surfer. I check forecasts constantly. But here's the thing:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A 6ft beach break ≠ a 6ft reef break&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most forecast apps show you swell size and wind direction. Cool. But they &lt;br&gt;
don't tell you if the break matches YOUR skill level. &lt;br&gt;
Or if you're about to paddle into something dangerous.&lt;br&gt;
So I spent 2 months building BreakFinder to solve that.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Solution: Three Pillars
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Personalized Condition Scores&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of generic forecasts, BreakFinder gives you a &lt;strong&gt;personalized condition &lt;br&gt;
score&lt;/strong&gt; based on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your preferred wave height range&lt;/li&gt;
&lt;li&gt;Your preferred wind direction&lt;/li&gt;
&lt;li&gt;Your preferred tide&lt;/li&gt;
&lt;li&gt;Your preferred wave period&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Forecast: "6ft swell, 15kt offshore wind"&lt;/li&gt;
&lt;li&gt;My app: "🟢 Perfect for you today" (because I'm intermediate + like 4-6ft)&lt;/li&gt;
&lt;li&gt;But for a beginner: "🔴 Too big for your level"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Full Garmin Integration (100+ Devices)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This was the hardest part. I integrated with Garmin because I use a Garmin &lt;br&gt;
watch and wanted accurate session tracking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's included:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;5 Connect IQ apps (Forecast, Session Tracker, Surf Skate Tracker, Watch Face, 
Breath Training)&lt;/li&gt;
&lt;li&gt;Wave counting (how many waves you caught today)&lt;/li&gt;
&lt;li&gt;Post-session data sync to your account at BreakFinder&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why it was hard:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Garmin's Connect IQ SDK is powerful but poorly documented. I had to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Support 100+ different watch models (each with different capabilities)&lt;/li&gt;
&lt;li&gt;Handle offline functionality (watches have limited storage)&lt;/li&gt;
&lt;li&gt;Optimize for battery life (can't drain your watch)&lt;/li&gt;
&lt;li&gt;Build fallbacks when devices don't support certain features&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Worth it? &lt;strong&gt;Maybe.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skill-Level Spot Matching&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The database of 1500+ spots includes difficulty ratings. So when you're trip &lt;br&gt;
planning, you see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Beginner spots: Mellow beach breaks&lt;/li&gt;
&lt;li&gt;Intermediate: Reefs with some risk&lt;/li&gt;
&lt;li&gt;Advanced: Heavy breaks (Sunset, Pipe territory)&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;The Tech Stack&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fullstack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rails 7 (API + Monolith)&lt;/li&gt;
&lt;li&gt;Hotwire (Turbo + Stimulus)&lt;/li&gt;
&lt;li&gt;PostgreSQL for user data + spots&lt;/li&gt;
&lt;li&gt;Redis for caching forecasts&lt;/li&gt;
&lt;li&gt;Event-Driven-Architecture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;External:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Garmin Connect IQ SDK (C++)&lt;/li&gt;
&lt;li&gt;OpenMeteo for first 7 days forecast data&lt;/li&gt;
&lt;li&gt;NOAA for 8–16 days forecast data (own blog worth documenting the pain)&lt;/li&gt;
&lt;li&gt;Geocoder (Ruby Gem) &lt;/li&gt;
&lt;li&gt;Leaflet for spot maps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;DevOps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker for dev environment&lt;/li&gt;
&lt;li&gt;Hetzner + Kamal (loving it! So easy and cheap)&lt;/li&gt;
&lt;li&gt;GitHub Actions for CI/CD&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Current Metrics (2 Months In)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;5,000 downloads&lt;/strong&gt; (Garmin IQ Store)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3.9★ rating&lt;/strong&gt; (honest reviews, we support 100+ devices = some quirks and early version had some major issues like no wave counting at all)&lt;/li&gt;
&lt;li&gt;1000+ registered surfers&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Business Side (Launching Feb 2026)
&lt;/h3&gt;

&lt;p&gt;Here's where it gets interesting. I'm building a &lt;strong&gt;marketplace for local &lt;br&gt;
guide operators&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The idea:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Small surf shops, guides, crews can list themselves&lt;/li&gt;
&lt;li&gt;Traveling surfers can find them directly&lt;/li&gt;
&lt;li&gt;Fair pricing (€19-€299/month per business, NO algorithm trap)&lt;/li&gt;
&lt;li&gt;No 30% commission like booking platforms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where the real revenue lives. A solo surfer might pay €5/month. &lt;br&gt;
A local business? They'll pay €50-200/month to reach customers.&lt;/p&gt;




&lt;h2&gt;
  
  
  For Other Solo Devs
&lt;/h2&gt;

&lt;p&gt;If you're building something:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Pick a niche you understand deeply&lt;/strong&gt; (I am a surf addict)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Focus on one metric early&lt;/strong&gt; (mine: Garmin support)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write about the technical journey&lt;/strong&gt; (not just the marketing angle)&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://apps.garmin.com/apps/6127de13-7f60-4360-9d45-7fa057de353f" rel="noopener noreferrer"&gt;Garmin IQ Store&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://breakfinder.surf" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Questions?
&lt;/h2&gt;

&lt;p&gt;I read every comment. Ask me about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Garmin APIs&lt;/li&gt;
&lt;li&gt;Rails architecture&lt;/li&gt;
&lt;li&gt;Forecasting algorithms&lt;/li&gt;
&lt;li&gt;What I'd do differently&lt;/li&gt;
&lt;li&gt;Building as a solo dev&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's talk! 🏄‍♂️&lt;/p&gt;

</description>
      <category>devjournal</category>
      <category>iot</category>
      <category>showdev</category>
      <category>sideprojects</category>
    </item>
  </channel>
</rss>
