我构建了BreakFinder:个性化冲浪预报 + 完整的Garmin生态系统

发布: (2026年2月9日 GMT+8 05:00)
5 分钟阅读
原文: Dev.to

Source: Dev.to

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

我构建了 BreakFinder:个性化冲浪预报 + 完整的 Garmin 集成
我尝试构建一些冲浪者真正需要的东西。今天我将分享技术历程、哪些方案有效,以及我会做哪些不同的选择。

问题

我是冲浪者。我会不断查看预报。但问题是:

6 英尺的海滩破浪 ≠ 6 英尺的礁石破浪

大多数预报应用会显示浪高和风向——很酷——但它们不会告诉你浪点是否符合你的技术水平,或者你是否正要划向危险的浪点。因此,我花了两个月时间开发了 BreakFinder 来解决这个问题。

Source:

解决方案:三大支柱

个性化条件评分

与其提供通用预报,BreakFinder 会根据以下因素为你给出个性化的条件评分:

  • 你偏好的浪高范围
  • 你偏好的风向
  • 你偏好的潮汐
  • 你偏好的波周期

示例

  • 预报:“6 英尺浪,15 节离岸风”
  • 我的应用:“🟢 今天非常适合你”(因为我属于中级,喜欢 4‑6 英尺的浪)
  • 对于初学者:“🔴 对你的水平来说太大了”

完整的 Garmin 集成(100+ 设备)

这是最困难的部分。我之所以集成 Garmin,是因为我使用 Garmin 手表并希望获得精准的冲浪记录。

包含内容

  • 5 个 Connect IQ 应用(预报、冲浪追踪、冲浪滑板追踪、表盘、呼吸训练)
  • 波浪计数(今天捕到的浪数)
  • 课后数据同步至你的 BreakFinder 账户

为何如此困难

Garmin 的 Connect IQ SDK 功能强大,却文档匮乏。我必须:

  • 支持 100+ 不同手表型号(每款功能各异)
  • 处理离线功能(手表存储空间有限)
  • 优化电池寿命(不能耗尽手表电量)
  • 在设备不支持某些功能时提供回退方案

值得吗?也许吧。

技能水平点位匹配

数据库中收录了 1 500+ 冲浪点,并附有难度评级。当你规划行程时,你会看到:

  • 初学者点位: 温和的海滩破浪
  • 中级点位: 有一定风险的礁石
  • 高级点位: 强劲破浪(如 Sunset、Pipe 区域)

技术栈

全栈

  • Rails 7(API + 单体)
  • Hotwire(Turbo + Stimulus)
  • PostgreSQL 用于用户数据 + 点位
  • Redis 用于缓存天气预报
  • 事件驱动架构

外部服务

  • Garmin Connect IQ SDK(C++)
  • OpenMeteo 提供前 7 天的预报数据
  • NOAA 提供 8–16 天的预报数据(值得在博客中记录痛点)
  • Geocoder(Ruby gem)
  • Leaflet 用于点位地图

DevOps

  • Docker 用于开发环境
  • Hetzner + Kamal(非常简单且便宜)
  • GitHub Actions 用于 CI/CD

当前指标(已运行 2 个月)

  • 5 000 下载 (Garmin IQ Store)
  • 3.9★ 评分 (真实评论;我们支持 100+ 设备,因此会有一些小问题和早期版本的缺陷,例如缺少波浪计数)
  • 1 000+ 已注册冲浪者

接下来

商业方面(2026 年 2 月上线)

我正在构建一个本地导游运营商的市场。

  • 小型冲浪店、导游、团队可以自行上架
  • 旅行冲浪者可以直接找到他们
  • 公平定价(每家企业每月 €19‑€299,算法陷阱)
  • 没有像预订平台那样的 30 % 佣金

收入模式:单个冲浪者可能每月支付 €5;本地企业每月可支付 €50‑200 以获取客户。

为其他独立开发者

  • 挑选你深刻了解的细分领域(我是一名冲浪爱好者)
  • 早期专注于一个指标(我的:Garmin 支持)
  • 写技术旅程(而不仅仅是营销视角)

链接

有问题吗?

我会阅读每条评论。请向我询问以下内容:

  • Garmin API
  • Rails 架构
  • 预测算法
  • 我会做的不同之处
  • 作为独立开发者的构建

来聊聊吧! 🏄‍♂️

0 浏览
Back to Blog

相关文章

阅读更多 »

Python–TypeScript 合约

《The Python–TypeScript Contract》封面图片 https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to...