DEV Community

BreakFinderSurf
BreakFinderSurf

Posted on Originally published at breakfinder.surf

Surf File Imports Now Detect Waves Properly

I'm the dev of BreakFinder, and this is the write-up of the file import work I finished in July. The import is no longer a dump-and-pray tool. You upload a raw file, the wave detector runs on its GPS and motion data, and you get an interactive map where you choose which detected waves count. Tuning sliders persist between uploads. The result saves as a real surf session that sits next to your watch-synced sessions in the logbook.

For a long time, the import path was the weak link. Watches worked. Manual entry worked. But the moment you handed BreakFinder a raw file from a watch export, a third-party app, or a friend's Strava download, the experience fell apart. It doesn't anymore.


Why the import used to be the weak link

Here is what happened before. You finished a session. Your watch recorded it. You exported the file because you wanted to keep the raw data, or because you switched apps, or because the live sync failed and all you had left was the FIT file in Garmin Connect's export folder.

You uploaded it to BreakFinder, and what came back was a flat list of GPS points. No waves. No ride segments. No speed breakdown. Just a track on a map and a total distance number.

That's a breadcrumb trail, and it tells you nothing about the surf.

The file itself was fine. FIT, GPX, and TCX files from modern sports watches all carry the raw material: timestamped latitude and longitude, speed, and often heart rate. The problem was that the import pipeline stopped at parsing. It never ran the data through the same wave detection that powers the wearable sync.

So you had two kinds of session in one logbook. Watch-synced sessions, with full wave-by-wave breakdowns. File-imported sessions with nothing in them.

That gap is closed now.


What the new import actually does

Three file formats are supported. FIT is Garmin's binary format and the most common export from surf-capable watches. GPX is the open XML standard that nearly every platform can produce. TCX is the older Training Center XML format that Strava, Garmin Connect, and a few other tools still emit.

All three go through the same path.

First, the parser extracts the sample stream: timestamp, latitude, longitude, speed where available, and heart rate where present. FIT files carry the richest data because Garmin's schema includes sport-specific messages. GPX and TCX are lighter, but the GPS track is usually complete enough for detection.

Second, the sample stream goes into the existing wave detection pipeline, the same detector that processes live watch data. It smooths the speed signal, finds riding-speed bursts that stand out from paddling, validates each candidate by duration and distance, and produces wave rides with a start point, an end point, max speed, and ride length.

Third, instead of just dumping the result, the import shows you an interactive map.


Interactive wave selection on the map

This is the part that changed the import from passive to active.

When detection finishes, you see your full GPS track with every detected wave highlighted. Each wave has a coloured segment along the track and a number. Click a wave and you get its details: duration, distance, max speed, and start and end coordinates.

Then you decide what counts.

Some detected waves are real. You remember them. The speed looks right, the segment sits along the peak, and the duration matches what you rode. Keep those.

Some are false positives. The detector caught a fast paddle into the impact zone, or a current-assisted drift that briefly hit riding speed. Unselect those and they disappear from the session.

Some waves were missed. Maybe you caught a small inside wave that never hit the speed threshold. You can add it by selecting the segment on the track.

The session totals update live as you select and deselect: wave count, riding time, distance ridden, and average speed. They reflect only what you confirm.

No wave detector gets every wave right. The honest approach is to run the detector, show the result, and let the surfer who was actually in the water make the final call. That's how every file import works now.


Presets and sliders that remember your settings

Every surfer is different. A longboarder at a mellow beach break rides at lower speed than a shortboarder at a hollow reef, so the same detection thresholds don't fit both.

The import now exposes tuning sliders: minimum riding speed, minimum ride duration, and minimum ride distance. Adjust one and the detection re-runs on the map straight away. Push the speed threshold up and the marginal waves drop away. Lower the duration threshold and the short inside waves come back.

Here is the part that took real work: the sliders persist.

You tune your settings on one import and save the session. Two weeks later you upload another file, and your slider values are right where you left them. You don't re-tune from scratch every time.

The persistence is per user, not per session. Your preset travels with your account. If you surf mostly the same spot on the same board, your detection settings are already dialed in by the second import. If you switch between a longboard spot and a shortboard spot, you can save several presets and switch between them.

People who import regularly were tired of re-adjusting the same sliders every session, so this was a common request.


The result is a real surf session

This is the change that ties everything together.

When you confirm your wave selection and save, the import doesn't create a special file-import record or a second-class session object. It creates a standard SurfSessions::Session, with the same model, the same associations, and the same wave ride structure as a session that came in from a Garmin, Apple Watch, Wear OS, Amazfit, HarmonyOS, Suunto, or Strava sync.

In practice, the imported session shows up in your logbook next to your watch sessions. It counts toward your session totals and your progression stats. If you have a board or wetsuit attached, it shows up in your equipment history. The wave map and the wave-by-wave breakdown look identical to a watch-synced session, because the data shape and the rendering pipeline are the same.

If you connect a watch later and start syncing live, your old imported sessions stay where they are. One continuous history.

The source is recorded, so you can always tell a session came from a FIT import, a live Garmin sync, or a manual entry. Functionally, they are peers.


Who this is for

A few groups get the most out of it.

Surfers who switched watches. You had a Garmin, moved to a Huawei Watch, and your old sessions are FIT files in a folder. Import them and they become real sessions with real wave data.

Surfers whose live sync failed. Saltwater kills Bluetooth connections. The phone got wet, the watch lost its pairing, and the session never synced. Pull the file off the watch, drop it in, and recover the session with full detection.

Surfers using third-party apps. Some people record with the watch's native sport mode or with another app, and want the BreakFinder wave analysis afterwards. GPX and TCX exports from those tools import cleanly now.

Surfers who want more control. The sliders and manual wave selection let you shape the final session more than the live watch path, where detection runs on the device and you accept what it gives you.


What still needs work

The import is better. It isn't finished.

FIT parsing is solid across Garmin surf exports and most fitness-watch open-water swim files. GPX handles standard tracks from Strava, Komoot, and similar tools. TCX is the roughest of the three because the format is loose and every tool writes it slightly differently. Some TCX files with unusual namespace declarations or missing timestamps can still produce incomplete sample streams. Those cases fail gracefully now instead of crashing, but the detection gets worse.

Heart rate parsing works when the file includes it. Many GPX exports from third-party tools strip heart rate, and nothing can recover data that was never written to the file.

Manual wave addition on the map works, but it's fiddly on touchscreens. Selecting a precise segment with a finger is harder than with a mouse. A touch-friendly selection mode is on the list.

The presets system currently allows unlimited saved presets per account, which sounds generous but gets messy fast. A sensible default limit and a preset management view are coming.


Try it

The import tool is at breakfinder.surf/en/surf_sessions/file-import.

You can upload and preview without an account. Saving the session requires a login, same as the board sensor import.

If something parses wrong or the detection looks off on a specific file, send the file to philipp.winkler@breakfinder.surf. Real files from real sessions are what make the parser and detector better.


I'm the dev of BreakFinder. This article was first published on breakfinder.surf, where the import tool linked above is part of the app.

Top comments (0)