# SML Parser

SML Parser helps inspect how a Suunto watch recorded an activity. It displays a GNSS track, altitude readings, receiver-estimated accuracy, activity events and sensor values. The application is developed by Łukasz Szmigiel and is independent of Suunto.

- Application: https://smlanal.szmigiel.design/
- Source: https://github.com/szmigieldesign/smlanal
- Language: English
- Requirements: a modern web browser with JavaScript enabled

## Supported files and getting started

Choose or drop one JSON file on the start screen. Two structures are supported:

- `samples.json`, extracted from a Suunto `smlzip` archive, containing a top-level `Samples` array.
- An activity JSON export from the Suunto app, containing `DeviceLog.Samples`.

Extract `samples.json` before selecting it: the application does not directly open ZIP, SMLZIP, FIT or GPX files. Available sensor fields depend on the recording.

Use **Load demo file** to explore the bundled recording without choosing your own file. After loading, **Replace file** opens another recording. An invalid replacement leaves the previous recording available.

## Exploring a recording

The summary includes GNSS point count, recording duration, distance, satellite range, start and end times, battery use and an estimated battery life where data is available. The battery-life estimate is extrapolated from the recorded discharge; short recordings are flagged.

The map supports Track and Dots modes, coloring by EHPE, EVPE, satellite count or Best SNR, a dimmed basemap, kilometer markers, 10- and 15-minute markers, and min/max markers for numeric fields. Point navigation and map/chart selections share a selection state.

Two synchronized chart bands show GNSS and recorded altitude, and EHPE/EVPE. Each series can be toggled. Drag to zoom, reset the view, or select a point to inspect it on the map. Warning links focus the relevant part of the recording.

Events include laps, pauses and activity changes when present in the source file. Raw JSON and recorded sensor values are available for inspection. The raw-values switch changes the display of supported sensor units.

When the file contains R-R intervals from a heart rate strap (`R-R` IBI batches in `samples.json`, or `DeviceLog["R-R"].Data` in an app export), a Heart rate & R-R panel shows the R-R tachogram with excluded beats, rolling DFA α1 and rolling RMSSD on the same timeline as the altitude chart, plus average HR, SDNN, RMSSD, pNN50, strap artifacts, ectopic pairs (count and rate per hour) and R-R coverage.

On mobile, use the Map, Chart, Heart (when R-R data is present), Insights and Summary tabs. Summary has its own panel with the recording statistics. Light and dark themes follow the system initially; a manual choice is stored locally. Animations respect the system's reduced-motion preference.

## Interpreting warnings

These are application heuristics, not manufacturer specifications or independent measurements of real-world accuracy:

- EHPE bands: below 5 m, 5 m to below 10 m, and 10 m or above.
- An EHPE warning requires at least 10 m continuously for 15 seconds.
- An altitude warning requires an absolute difference greater than 20 m between GNSS altitude and the recorded Altitude field for 30 seconds.
- Missing usable values interrupt an interval. A time gap greater than three times the median sample interval also interrupts it, with that gap limit capped at 30 seconds.

The headline selects the longest detected warning. Brief peaks remain visible even if they do not meet the duration threshold. Missing data means the metric cannot be assessed, not that the recording was accurate.

Satellite and Best SNR medians are compared between the longest EHPE warning interval and the rest of the activity where possible. These comparisons are descriptive; satellite count alone does not establish position accuracy.

EHPE and EVPE are the receiver's estimated horizontal and vertical errors. The recorded Altitude field may incorporate FusedAlti processing. A discrepancy between altitude readings does not identify the faulty sensor or prove either value is correct.

R-R analysis uses these heuristics:

- A beat is a recording artifact when its interval is outside 300–2000 ms or differs by more than 20% from the median of the surrounding beats.
- A likely ectopic pair is a beat more than 10% shorter than that median, followed by one more than 5% longer, with both together within 10% of two median beats. Ectopic pairs are reported separately and do not count against strap quality.
- A strap warning appears when more than 5% of all beats are artifacts, or when any one-minute window has more than 5% artifacts.
- A jump of more than 2 seconds between R-R batch timestamps is a recording gap.
- SDNN, RMSSD and pNN50 use clean beats only (artifacts and ectopic pairs left out); successive differences require both beats to be clean.
- DFA α1 uses 2-minute windows every 5 seconds, scales of 4 to 16 beats, and only windows with at most 5% excluded beats. The first stretch of at least one minute below 0.75 is reported as an orientation for the aerobic threshold. This is not a medical assessment.
- The share of estimated time is reported in three research-based bands: above 0.75 (light, below the aerobic threshold), 0.5 to 0.75 (between the thresholds) and below 0.5 (around or above the anaerobic threshold). Values below 0.3 get a note to check for artifacts or ectopic pairs. The bands are population averages; individual thresholds differ.

## Privacy and network use

The selected activity file is read and parsed in the browser. It is not sent to an analysis server. There is no server-side analysis API or account requirement in the application.

OpenStreetMap supplies map tiles over the network. Those requests expose the requested map area to the tile provider. The demo and application assets are fetched from this site. The theme preference is stored locally; the selected activity is not persisted by the application.
