Workouts export as .fit
#28 asked for this and was told it could not be done honestly, because Zepp's cloud supposedly does not return enough raw data. That answer was wrong, and the reporter was right. ZeppBridge had been decoding the per-second series out of Zepp's workout detail all along — GPS track, heart rate, speed, altitude, running power, ground contact time, vertical oscillation, per-kilometre splits and pause intervals — and the GPX exporter already read them. The only missing piece was a FIT writer.
Pick FIT on the export page, choose a folder, and every workout in range with a decoded series becomes its own .fit file. Fields that were never measured stay absent rather than being padded with zeroes, and a workout with no series produces no file rather than an empty one.
The files carry average speed, top speed, total ascent and cadence, and have been checked by importing them into a phone health app and reading them back with an independent FIT decoder. Cadence is written as the FIT spec defines it — halved for running, walking and hiking, where one revolution is a full stride, and left alone for cycling. Its unit was established against the workout's own cloud summary rather than assumed.
Thirteen numbers Zepp was already sending, including the heart-rate zone split
An audit of the stored raw payloads found 198 distinct fields on a workout, of which 26 were being read. Discounting the slots Zepp reserves but never fills, 66 carried real data and were discarded on arrival.
This release keeps the ones a person can actually see: minimum heart rate, step count, moving time, total ascent and descent, highest and lowest altitude, aerobic and anaerobic training effect, perceived exertion, average and peak cadence, and average stride length — plus the time spent in each heart-rate zone, already computed by the watch against the zone boundaries you set on it. All of them appear in the JSON export and the FIT files.
Sentinels stay absent rather than becoming zeroes: a bike ride reporting 0 steps has no step count, it did not walk zero steps.
Total ascent now comes from Zepp rather than from our own reading of the altitude series. Both numbers exist and they disagree — a 6.37 km walk is 59 m to Zepp and 37 m by our own count — and what you see in the Zepp app is 59.
Linux
- A window that opened white now opens. WebKitGTK 2.42 turned its DMABUF renderer on by default, and on a number of driver and compositor combinations it fails outright — the window appears, it is blank, and the terminal prints nothing at all. #32 reported exactly that on openSUSE, from both the AppImage and the Flatpak. ZeppBridge now disables that renderer unless you have set
WEBKIT_DISABLE_DMABUF_RENDERERyourself. - A missing tray library no longer stops the app from starting. The tray icon comes from the desktop, through
libayatana-appindicator3, which the GNOME Flatpak runtime does not ship and some desktops do not install. When absent, that C library panics rather than returning an error, which took the whole app down at launch. It now runs without a tray icon and prints the install command for your distribution. With no tray, closing the window quits instead of hiding. The.deband.rpmpackages declare the dependency.
Please read this before relying on either fix. CI builds and tests every Linux package, and it passes — but neither fix has been confirmed on a real Linux desktop, because nobody involved has one. Sign-in plus keyring on Linux is still unconfirmed too, from 2.0.0. The Linux packages remain a preview. If something breaks, an issue is exactly what this needs.
Other fixes
- Firmware version numbers are no longer listed as devices. Three "unidentified data sources" labelled
0.91.20.5and the like were appearing in the sidebar, unclickable and unremovable. Zepp puts a firmware string in thedeviceIdposition in some payloads and the extractor matched on the field name without looking at the value, so every firmware version became a "device" and every update added another. Rows already stored are removed on upgrade; the samples filed under them are real and are re-attributed on the next sync. - Two more Amazfit models are recognised by number alone — T-Rex 3 Pro gains a second device number and Helio Ring gets its first, both from two independent, undisputed reports.
- The issue templates are bilingual and know Linux exists. Both forms were Chinese-only and the package list offered Windows and macOS only, so the first Linux install report had to be filed against a form with no way to say it was Linux.
Upgrading
The local database schema moves to v19. Upgrading is automatic and takes a backup first. Older ZeppBridge builds, including the CLI and MCP server, cannot open a v19 database — upgrade all of them together.