-
Multiple dashboards. You can set up to six layouts per wheel — city, speed and diagnostics, for example. Dashboards are switched with a horizontal swipe, a strip under the header shows which one is open and how many there are, and the name pops up briefly when you switch. While you only have one, a swipe offers to add a second; management is a tap on the strip or the dashboard menu item "Dashboards": copy the current one, rename, delete.
-
The wheel model is picked by hand: dashboard menu → "Model". The pick is stored for that wheel and survives a reconnect, and if the app recognised the model on its own it says so. Until the model is picked or recognised, charge from voltage is not shown at all: the series-cell count cannot be derived from a single voltage even in principle — a full 36S reads 151.2 V and so does a 40S at 3.78 V per cell. The app used to guess here, and on a T4 a sag below 90 V moved the divider from 24S to 20S: charge read 100 % on a half-empty pack for the rest of the ride. If you set the Begode voltage class by hand, it keeps working until you pick a model.
-
The charge reading no longer rises while the pack is being drained. Voltage recovers on its own after a load, and the curve read that as charge coming in: on a Lynx the gauge climbed eight points after a hard acceleration while another 46 Wh were still leaving the pack. The mid-ride jump of a couple of dozen points is gone too — a single frame of braking regen used to be enough to declare the pack full, and current into the pack now counts as charging only if it holds for half a minute.
-
Zero no longer arrives early: fitting the curve could drag its bottom node down to zero, and at 3.93 V per cell a rider saw a flat zero for thirty-four minutes straight. The opposite case is fixed as well — a full pack is now recognised after charging: a Sherman L pack rests at 4.1655 V per cell and missed the old threshold by four millivolts, so the gauge under-reported by roughly a quarter for the whole next cycle.
-
The range estimate no longer balloons out of nowhere: the tile showed 107 km where it had been 44 before a braking stop. Frames recorded standing still are left out of consumption — that energy is lights and electronics, not the price of a kilometre; consumption is measured over 250-metre chunks instead of four-metre odometer ticks, and smoothed over three kilometres instead of half of one.
-
"Train on past rides" in the "Battery model" section: the app walks the rides you have already recorded and builds the pack's curve from them instead of waiting for new ones. It shows the list first — which rides qualify, how many kilometres that is, and why the rest did not. Rides recorded by older versions, where braking was logged as spending, rides without a current sign, and rides too short are left out; merged rides are cut at their seams, and telemetry from a standstill is skipped.
-
The learned battery model and the ride summaries now go into the export and come back on import. Moving to a new phone no longer wipes everything the app had learned about the pack.
-
A wheel's history follows it when it turns up under a new address — for example when the archive came from an iPhone, where the wheel carries a different identifier. Rides, summaries, the pack model and the speed calibration are reattached to the wheel you are on. The rule is deliberately narrow: the transfer happens only when exactly one foreign identifier in the database carries that name.
-
Importing a ride archive no longer crashes the app. An eleven-megabyte archive imported while connected to the wheel crashed it three times in a row: the import held the database busy for the whole time it spent reading the file, and telemetry from the ride in progress could not get through. The import is also faster — 0.21 seconds against 13.3 on thirty-two thousand rows — and a failed import or export now shows a line about it instead of quitting.
-
The track goes through GPS gaps. Where there were no satellites but the wheel kept riding, a dashed stretch is drawn of exactly the length the odometer counted, labelled "no GPS" with the distance: on one rider's ride the ends of the gap were 4.1 km apart while 6.3 km had actually been covered. The metric ribbon hatches the same stretches, and the ride card breaks the line where the map breaks it — it used to show seven breaks the map does not have.
-
An odometer reset mid-ride no longer collapses the track. The wheel's counter went to zero at the twenty-first minute, and opening a ninety-minute ride showed an almost empty strip with the cursor stuck at the very start, even though every fix and all the telemetry were recorded. The distance on the ride card was right all along — only the map disagreed.
-
The home-screen widget finally draws. In release builds it showed a spinner forever — debug builds never had the problem. Along with it: a real card in the widget picker instead of that same spinner, stretching to five columns, ride totals on the wide tier (average and maximum speed, PWM peak, average cell), a headlight button that sends the same command as the one on the dashboard, and a choice of background — "Tile", "Frosted", "Clear". The horn button next to it is silent for now: no firmware we have taken apart has a horn command, and guessed bytes must not be sent to a wheel.
-
Auto-light can now switch off by pedal angle — a third way alongside speed and the timer. It looks at how the wheel is standing rather than whether it moves: picked up by the handle, laid on its side, set on its stand. LeaperKim ("Pedal angle") and Inmotion report the angle; on other wheels the option is unavailable, and an unknown angle never turns the headlight off.
-
An alarm button in the quick-actions dock: arm and disarm, with the toggle following the wheel's answer rather than your tap. The button appears only when the alarm plugin is actually running on the wheel — that is, on patched firmware. This was proven on the firmware emulation bench and has not been confirmed on a live wheel.
-
LeaperKim firmware is checked before it is flashed: an exact match against a known build, the structural soundness of the image, and a warning when the wheel calls itself something other than what the file says. A file that is not firmware at all is refused. And the upload now goes only to the characteristic the official app uses: the fallback branches could have sent the image somewhere else — in the worst case after the wheel had already been taken into the bootloader.
-
In the threshold editor, tapping the value finally brings up the keyboard. The field opened and drew a cursor, but there was nothing to type with.
-
"Search forever" in the connection settings: one reconnection attempt every thirty seconds with no time limit, until you disconnect yourself. Rarer than the normal search — otherwise the phone is flat by morning.
-
An "OSM" basemap — the plain OpenStreetMap map. Its labels and small streets are more detailed than the muted basemaps', and it is never dimmed in either theme: you choose it for what it is.
-
The "save current" button in the dashboard library no longer piles up identical entries. It invented a new name on every tap, so ten taps produced ten copies of one dashboard; now it greys out and tells you the name this dashboard is already saved under.
-
Pinned band side metrics can be reordered: in the band settings, drag a row by the handle on the left.
-
Multiple dashboards. You can set up to six layouts per wheel — city, speed and diagnostics, for example. Dashboards are switched with a horizontal swipe, a strip under the header shows which one is open and how many there are, and the name pops up briefly when you switch. While you only have one, a swipe offers to add a second; management is a tap on the strip or the dashboard menu item "Dashboards": copy the current one, rename, delete.
-
The wheel model is picked by hand: dashboard menu → "Model". The pick is stored for that wheel and survives a reconnect, and if the app recognised the model on its own it says so. Until the model is picked or recognised, charge from voltage is not shown at all: the series-cell count cannot be derived from a single voltage even in principle — a full 36S reads 151.2 V and so does a 40S at 3.78 V per cell. The app used to guess here, and on a T4 a sag below 90 V moved the divider from 24S to 20S: charge read 100 % on a half-empty pack for the rest of the ride. If you set the Begode voltage class by hand, it keeps working until you pick a model.
-
The charge reading no longer rises while the pack is being drained. Voltage recovers on its own after a load, and the curve read that as charge coming in: on a Lynx the gauge climbed eight points after a hard acceleration while another 46 Wh were still leaving the pack. The mid-ride jump of a couple of dozen points is gone too — a single frame of braking regen used to be enough to declare the pack full, and current into the pack now counts as charging only if it holds for half a minute.
-
Zero no longer arrives early: fitting the curve could drag its bottom node down to zero, and at 3.93 V per cell a rider saw a flat zero for thirty-four minutes straight. The opposite case is fixed as well — a full pack is now recognised after charging: a Sherman L pack rests at 4.1655 V per cell and missed the old threshold by four millivolts, so the gauge under-reported by roughly a quarter for the whole next cycle.
-
The range estimate no longer balloons out of nowhere: the tile showed 107 km where it had been 44 before a braking stop. Frames recorded standing still are left out of consumption — that energy is lights and electronics, not the price of a kilometre; consumption is measured over 250-metre chunks instead of four-metre odometer ticks, and smoothed over three kilometres instead of half of one.
-
The learned battery model and the ride summaries now go into the export and come back on import. Moving to a new phone no longer wipes everything the app had learned about the pack.
-
A wheel's history survives reinstalling the app. iOS hands out an identifier tied to the pair "this wheel, this installation": an App Store update keeps it, deleting and reinstalling does not, and everything the app remembered about the wheel stayed behind under the old key. Rides, summaries, the pack model and the speed calibration are now moved onto the wheel you are on. The rule is deliberately narrow: the transfer happens only when exactly one foreign identifier in the database carries that name.
-
The track goes through GPS gaps. Where there were no satellites but the wheel kept riding, a dashed stretch is drawn of exactly the length the odometer counted, labelled "no GPS" with the distance: on one rider's ride the ends of the gap were 4.1 km apart while 6.3 km had actually been covered. The ride card and the preview in the ride list break the line where the map breaks it.
-
An odometer reset mid-ride no longer collapses the track. The wheel's counter went to zero at the twenty-first minute, and opening a ninety-minute ride showed an almost empty strip with the cursor stuck at the very start, even though every fix and all the telemetry were recorded. The distance on the ride card was right all along — only the map disagreed.
-
The "save current" button in the dashboard library no longer piles up identical entries. It invented a new name on every tap, so ten taps produced ten copies of one dashboard; now it greys out and tells you the name this dashboard is already saved under.
-
Pinned band side metrics can be reordered: in the band settings, drag a row by the handle on the left.