Skip to content

Release history

Changelog

Rider-facing changes, grouped by date and Android and iOS build number.

The headline change is that an alert can now speak: the system speech engine says the reading and its value, the phrase can be rewritten and heard in advance, and speech stays silent under a sounding alarm. Conditions gained a "repeat every N" step, without which "trip over one kilometre" fired once per ride. The track on the map is now laid out by the seconds of the ride rather than by satellite fixes, and coloured with the worst of each second — a PWM dip lasting a third of one no longer falls between points. Settings are split into two doors: "Wheel settings" for what is written into the machine, "Settings" for everything that lives on the phone, with a new "Map & GPS" section. Moving rides in and out shows a progress window and can be cancelled, and a single ride exports as a "LoEUC archive".

Android · vc63

  • An alert can speak instead of beeping. The editor has a "How it signals" switch: "Sound" or "Voice". A spoken rule says the reading and its value through the system speech engine — "Speed 60", "Battery 10", "Trip 5" — and always fires once: a phrase that repeats stops being a message. To hear a reading more than once per ride, give its condition a "repeat every N" step.

  • The spoken phrase can be rewritten. The unit is not spoken by default: "sixty" rather than "sixty kilometres per hour" — at 60 km/h that is fifteen extra metres of road; insert "{unit}" if you do want it, and the word agrees with the number on its own. Under the field there is a "How it will sound" line: the whole sentence with its number filled in, and an estimate of how long it takes to say, so you can compare variants.

  • Speech never overlaps a beep. If an alarm is sounding when the rule fires, the phrase waits for it to stop; if an alarm starts mid-phrase, the phrase is cut. A waiting phrase is re-checked and rebuilt from fresh data before it speaks: "Speed 80" does not survive you braking to forty and is never said at all, while "Battery 10" that waited out a long alarm comes out as "Battery 8".

  • Voice needs a rule with one top-level condition: with two branches joined by "OR" there is no telling which one fired and the phrase would name the wrong thing — the switch is unavailable there, and the editor says why. All voice announcements are switched off by a single toggle in the alerts manager; beeps stay. If the phone has no system voice for your language, the editor offers to open the speech settings. Spoken rules are not sent to the watch: a buzz means "something is wrong", and "Trip 5" is not "wrong".

  • Conditions gained a "repeat every N" step. The condition rearms every so many units of the reading, without waiting for it to fall back past the reset value. Without it, "trip over one kilometre" fired once per ride: distance never falls. The step counts in the direction of the comparison, so "battery below fifty, every ten" walks down — 50, 40, 30 — and the editor shows the marks the rule will fire at right under the number.

  • The track on the map is laid out by the seconds of the ride rather than by satellite fixes. Under bridges and between buildings fixes arrive once every hundred metres, and a stretch like that was a single colour all the way through — the instrument had no point inside it at all. Points are placed by the wheel's odometer, so where you braked they sit closer together, and a place on the map now means the same thing as a moment in the recording: what you tapped is what you are shown. Wheels that do not report distance are laid out by time, exactly as before.

  • The colour of each track point is the worst of its second, not the value at its exact mark. Telemetry is written many times a second, and a PWM dip lasting a third of one used to fall between points and colour nothing. The readout line now says so — "in that second".

  • A tap on the track lands where you tapped. On the OSM basemap the app picked not the part of the line nearest your finger but the first one within tolerance: the point drifted along the track towards the start of the ride, and the readings with it. A tap that misses the track now clears the selection.

  • The three-dot menu has two distinct doors. "Wheel settings", under WHEEL, opens what gets written into the machine itself: hardware, presets, plugins, the shutdown timer — two taps away now instead of four, and they get changed while riding. "Settings", under APP, is everything else, the part that lives on the phone. The tile used to be called "Wheel settings" while the screen it opened was titled "App settings".

  • App settings gained a "Map & GPS" section: the basemap type, the map provider and track recording moved there out of "Recording & data", which is now simply "Data" — log rate, auto-deletion, battery model. Wear OS moved out of the dashboard menu into "Connection & sensors", next to TPMS: it is another device on the same end of the link.

  • Exporting and importing rides show a progress window — how many rides of how many have moved — and can be cancelled. Cancelling stops at a ride boundary, so the history only ever holds whole rides. Importing the same file again brings the rest across and creates no duplicates, and an interrupted archive deletes itself: it cannot be unpacked anyway, but in the file list it would look finished.

  • A single ride exports as a "LoEUC archive" — the app's own format. GPX drops the telemetry, WheelLog drops everything its columns have no room for; this archive is what our own import reads, so the ride moves to another phone whole, along with the summary the charge forecast is built from. In selection mode the same archive exports the rides you have ticked — "Export selected".

iOS · build 66

  • An alert can speak instead of beeping. The editor has a "How it signals" switch: "Sound" or "Voice". A spoken rule says the reading and its value through the system speech engine — "Speed 60", "Battery 10", "Trip 5" — and always fires once: a phrase that repeats stops being a message. To hear a reading more than once per ride, give its condition a "repeat every N" step.

  • The spoken phrase can be rewritten. The unit is not spoken by default: "sixty" rather than "sixty kilometres per hour" — at 60 km/h that is fifteen extra metres of road; insert "{unit}" if you do want it, and the word agrees with the number on its own. Under the field there is a "How it will sound" line: the whole sentence with its number filled in, and an estimate of how long it takes to say, so you can compare variants.

  • Speech never overlaps a beep. If an alarm is sounding when the rule fires, the phrase waits for it to stop; if an alarm starts mid-phrase, the phrase is cut. A waiting phrase is re-checked and rebuilt from fresh data before it speaks: "Speed 80" does not survive you braking to forty and is never said at all, while "Battery 10" that waited out a long alarm comes out as "Battery 8".

  • Voice needs a rule with one top-level condition: with two branches joined by "OR" there is no telling which one fired and the phrase would name the wrong thing — the switch is unavailable there, and the editor says why. All voice announcements are switched off by a single toggle in the alerts manager; beeps stay. If the phone has no system voice for your language, the editor offers to open the speech settings.

  • Conditions gained a "repeat every N" step. The condition rearms every so many units of the reading, without waiting for it to fall back past the reset value. Without it, "trip over one kilometre" fired once per ride: distance never falls. The step counts in the direction of the comparison, so "battery below fifty, every ten" walks down — 50, 40, 30 — and the editor shows the marks the rule will fire at right under the number.

  • The track on the map is laid out by the seconds of the ride rather than by satellite fixes. Under bridges and between buildings fixes arrive once every hundred metres, and a stretch like that was a single colour all the way through — the instrument had no point inside it at all. Points are placed by the wheel's odometer, so where you braked they sit closer together, and a place on the map now means the same thing as a moment in the recording: what you tapped is what you are shown. Wheels that do not report distance are laid out by time, exactly as before.

  • The colour of each track point is the worst of its second, not the value at its exact mark. Telemetry is written many times a second, and a PWM dip lasting a third of one used to fall between points and colour nothing. The readout line now says so — "in that second".

  • The dashboard menu has two distinct doors. "Wheel settings" opens what gets written into the machine itself: hardware, presets, plugins, the shutdown timer — two taps away now instead of four. "Settings" is everything else, the part that lives on the phone. The item used to be called "Wheel settings" while the screen it opened was titled "App settings".

  • App settings gained a "Map & GPS" section: the basemap type, the map provider and track recording moved there out of "Recording & data", which is now simply "Data" — log rate, auto-deletion, battery model.

  • Exporting and importing rides show a progress window — how many rides of how many have moved — and can be cancelled. Cancelling stops at a ride boundary, so the history only ever holds whole rides. Importing the same file again brings the rest across and creates no duplicates, and an interrupted archive deletes itself: it cannot be unpacked anyway, but in the file list it would look finished.

  • A single ride exports from the ride card as a "LoEUC archive" — the app's own format. GPX drops the telemetry, WheelLog drops everything its columns have no room for; this archive is what our own import reads, so the ride moves to another phone whole, along with the summary the charge forecast is built from. The ride card also gained the WheelLog CSV export, which used to be available only from the ride list.

The headline changes are up to six dashboard layouts per wheel switched with a swipe, a wheel model you pick by hand instead of the app guessing from voltage, and a rewritten charge and range: the gauge no longer climbs while you ride, no longer jumps mid-ride and no longer sits flat at zero, and the range tile no longer doubles after a stop. The track now bridges GPS gaps with a dashed stretch of the right length, the learned battery model travels with your ride export, and a wheel's history survives reinstalling the app. On Android the home-screen widget finally draws, and there is now training on past rides and an auto-light that switches off by pedal angle.

Android · vc62

  • 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.

iOS · build 65

  • 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.

The headline changes are a wheel-status widget for the home screen, a new GPS Speed metric with a calibration that learns your wheel's speed offset over several rides, and settings reorganised into seven sections instead of two flat lists. Also: a floating quick-actions dock, a session peak reset, typing threshold values by hand, and a working headlight on the larger Shermans.

Android · vc61

  • A wheel-status widget for the home screen. Between rides it shows charge, remaining range, the wheel's name and how long ago it was last in touch; while riding, speed, PWM and trip distance. Two sizes, styled from the app's own theme. The widget never talks to the wheel itself — it shows what the app last recorded, refreshed every fifteen seconds while the app is connected.

  • A floating quick-actions dock. Instead of a bar taking up space below the header for the whole ride, a single dot sits in a corner: tap it to open the dock, and it closes after an action or thirty seconds since the last touch. The dot snaps to any of the four corners and remembers where you put it.

  • The header menu moved from a list to a grid of tiles grouped by what the action affects: wheel, screen, app, connection. Twelve items read about twice as fast. Powering the wheel off moved from the dock into the menu, behind a confirmation.

  • "Reset peaks" clears the current session's maximums: peak markers on the instruments and dials stretched to fit a record go back to normal. The ride record itself is untouched — the history keeps what actually happened.

  • A new GPS Speed metric you can put on the dashboard. It comes from the phone's receiver, and the speed correction is not applied to it. When the signal is lost the metric goes blank instead of freezing on the last value, and an alert built on it will not fire at that moment — that is deliberate.

  • GPS speed calibration. The app compares the wheel's reading with GPS speed during steady riding and, once it has at least three rides and a tight enough spread, offers a correction and shows what it is based on. You apply it, not the app: automatic correction would quietly spoil both readings and alerts in places where coordinates are spoofed.

  • The speed correction is now remembered per wheel — different wheels have different odometry. A correction you already set is kept and becomes the default.

  • A speed dial maximum of your own. By default the app picks the ceiling itself and stretches the dial when you go faster; a ceiling you set is hard — the needle stops at the edge, so its position always means the same thing. In "Auto" you can see the number the app chose.

  • In the threshold editor you can tap the value and type it: a stepper with a step of five will never land on 87. The minus and plus buttons stay, a comma works as well as a period, hold time is entered in seconds, and invalid input silently reverts to the previous value.

  • Settings are grouped into seven sections — Speed and accuracy, Alerts, Wheel, Automation, Recording and data, Connection and sensors, Diagnostics — instead of being ordered by control type. Each section prints its current values underneath its name, so the settings root reads as a summary. The "Extras" screen is gone, and the alert manager opens directly from its tile.

  • The average cell voltage now appears on wheels that never send individual cells: the pack voltage is divided by the known number of cells in series. Such a wheel still has no per-cell minimum and maximum, but the familiar "volts per cell" figure is there.

  • On the ride map and on the metric ribbon the cursor lands on the point under your finger, not on the nearest satellite fix. Fixes are written every two seconds — some twenty metres of riding — while the readings come from the ride record, so they exist even where there is no fix.

  • The headlight works again on Sherman, Sherman Max, Sherman S and Abrams. Their firmware understands only the text light command — there is no binary one in it at all — so the headlight button was silent on these wheels; the app now checks which wheel answered and sends the form that firmware parses. The mapping was read out of the firmware images and has not yet been confirmed on a live wheel. The label on wheels with a single light button was also fixed — it said "High beam" on wheels that have none.

  • "Firmware update" used to appear on every wheel, including KingSong and the charger, though exactly one format is actually supported. It now exists only on LeaperKim wheels, and the screen states plainly that flashing has only been proven on the Lynx S: other wheels of the brand use the same file format, but entry into the bootloader was never verified, and the Sherman L additionally runs a different microcontroller.

  • A firmware plugins screen for LeaperKim: installing add-ons into the wheel's second flash bank, with three ready-made plugins bundled, plus slot and memory state. Only a wheel running patched firmware accepts them — a stock wheel ignores the frames — and this has so far been proven on a firmware emulator, not on a live wheel.

iOS · build 62

  • A wheel-status widget for the home screen. Between rides it shows charge, remaining range, the wheel's name and how long ago it was last in touch; while riding, speed, PWM and trip distance. Two sizes, styled from the app's own theme. The widget never talks to the wheel itself — it shows what the app last recorded, refreshed every fifteen seconds while the app is connected.

  • A floating quick-actions dock. Instead of a bar below the header, a single dot sits in a corner: tap it to open the dock, and it closes after an action or thirty seconds since the last touch. The dot snaps to any of the four corners and remembers where you put it. Powering the wheel off moved from the dock into the menu, behind a confirmation.

  • "Reset peaks" clears the current session's maximums: peak markers on the instruments and dials stretched to fit a record go back to normal. The ride record itself is untouched — the history keeps what actually happened.

  • A new GPS Speed metric you can put on the dashboard. It comes from the phone's receiver, and the speed correction is not applied to it. When the signal is lost the metric goes blank instead of freezing on the last value, and an alert built on it will not fire at that moment — that is deliberate.

  • GPS speed calibration. The app compares the wheel's reading with GPS speed during steady riding and, once it has at least three rides and a tight enough spread, offers a correction and shows what it is based on. You apply it, not the app: automatic correction would quietly spoil both readings and alerts in places where coordinates are spoofed.

  • The speed correction is now remembered per wheel — different wheels have different odometry. A correction you already set is kept and becomes the default.

  • A speed dial maximum of your own. By default the app picks the ceiling itself and stretches the dial when you go faster; a ceiling you set is hard — the needle stops at the edge, so its position always means the same thing. In "Auto" you can see the number the app chose.

  • In the threshold editor you can tap the value and type it: a stepper with a step of five will never land on 87. The minus and plus buttons stay, a comma works as well as a period, hold time is entered in seconds, and invalid input silently reverts to the previous value.

  • Settings are grouped into seven sections — Speed and accuracy, Alerts, Wheel, Automation, Recording and data, Connection and sensors, Diagnostics — instead of being ordered by control type. Each section prints its current values underneath its name, so the settings root reads as a summary. The "Extras" screen is gone, and the alert manager opens directly from its tile.

  • The average cell voltage now appears on wheels that never send individual cells: the pack voltage is divided by the known number of cells in series. Such a wheel still has no per-cell minimum and maximum, but the familiar "volts per cell" figure is there.

  • On the ride map and on the metric ribbon the cursor lands on the point under your finger, not on the nearest satellite fix. Fixes are written every two seconds — some twenty metres of riding — while the readings come from the ride record, so they exist even where there is no fix.

  • The headlight works again on Sherman, Sherman Max, Sherman S and Abrams. Their firmware understands only the text light command — there is no binary one in it at all — so the headlight button was silent on these wheels; the app now sends the form that the answering wheel's firmware parses. The mapping was read out of the firmware images and has not yet been confirmed on a live wheel.

  • The battery tabs on the BMS screen only switched about one tap in twenty. The switcher was rebuilt and now responds to every tap, and the screen itself is a normal push, with the system back arrow and an edge swipe.

  • Going back from an open ride returns to the ride list instead of jumping straight to the dashboard.

  • The second lead metric of the band is now saved: a twin speedometer no longer quietly became a single one after restarting the app.

  • Winding temperature is now shown on iPhone, and LeaperKim wheels also show motor temperature — the shared engine decoded both, but the screen never displayed them.

The ride map stops jumping out from under your finger: its own zoom buttons, a fallback base map instead of an API-key notice, and a track you can hit without aiming. Plus an honest light-theme switch, readable peak labels on iPhone, and a wheel opened from the garage that remembers its metrics offline.

Android · vc60

  • The dashboard map no longer jumps out from under your finger: the track is framed once, when it first appears, and after that the camera is yours.

  • Your own "+" and "−" buttons next to "Fit track", both on the ride screen and on the dashboard map tile.

  • The base map no longer arrives with "API KEY REQUIRED" written across it: the app checks CARTO itself once an hour and switches to Esri Gray Canvas when it is refused — Esri has its own zoom ceiling of z16.

  • Map settings let you pick the base map by hand: "Auto", CARTO or Esri. Attribution now follows the chosen source and has appeared on the dashboard tile, where there was none.

  • The track can be hit with a finger: the tap zone grew to 56 dp on both OSM and Google — a tap on the track scrubs the ride ribbon.

  • The ribbon cursor is visible straight away: before you touch it, a dimmed bar sits at the leading metric's peak — the very place the numbers beside it come from.

  • The light theme and the black background no longer argue: pick light and black goes away, pick black and the theme moves to dark. Before, the switch said "Light" while the screen stayed black.

  • The tile preview in the editor shows the colour the metric will actually get on the dashboard, not the family colour.

iOS · build 58

  • Peak labels on the ride map are readable again: the numbers no longer come out black, and every peak is labelled instead of just one — when peaks land almost on the same spot, the labels stack.

  • The track can be hit with a finger: the tap zone is 56 pt, the same as on Android.

  • The ribbon cursor is back in place — it used to drift past the edge — and it is visible before you touch it: a dimmed bar at the leading metric's peak.

  • A wheel opened from the garage remembers its metrics: tiles, band metrics and presets can be set up with no connection, using the set recorded in that wheel's last ride.

  • The endless "Waiting for telemetry…" spinner on a disconnected wheel is replaced by "Wheel not connected", and the panel no longer swallows taps.

  • The dual-arc gauge is no longer squashed on narrow screens: it gets its own width and sits higher in the band.

  • Light mode set in the system turns off the black background, and black is no longer offered in the palette while the system is light.

  • Tile colour: all ten swatches instead of six, plus a custom colour through the system picker — a colour chosen on Android is now visible on iPhone too. On a composite tile the dead palette is replaced by a hint: the colour is picked on the metric's own tile.

The ride track screen has been rewritten: the route is coloured by a reading in the same colours and thresholds the dashboard uses, a second reading is carried by line thickness, and under the map the same track is straightened into lanes with one shared cursor and every threshold breach lined up in a row. The track has also stopped lying: points logged after the ride ended, receiver jumps and distance counted from those points no longer spoil the route. The dashboard gains "Cluster: speedometer" — two readings on one ribbon in two tracks — and the Pinned band screen has been rebuilt. A wheel in the garage now opens without connecting, the phone screen stays awake while the app is open, and predicted charge and range no longer break on a bad learned curve or a long descent. Android additionally gains LeaperKim firmware updates and motor and coil temperature tiles.

Android · vc59

  • The ride track screen has been rewritten. The route is coloured by a reading you choose, in the same colours and thresholds as the dashboard: the hue says which reading it is, the saturation how loaded the stretch was, and red means exactly one thing — your threshold fired. A second reading is carried by line thickness, so speed by colour and PWM by thickness read off one route. Under the map sits the same track straightened out along the distance: one lane per chosen reading, one cursor across all of them, and every threshold breach lined up as notches. Readings are picked with chips at the bottom, up to four at once, and a tap walks a chip around the circle: off → lane → colour → thickness. Start, finish and the peak of every chosen reading are marked with their values. The colour scale is stretched over the ride itself, so colours are comparable within a ride but not between rides.

  • The track has stopped lying. Points logged after the ride ended no longer reach the route: on one rider's ride there were 216 of them out of 474, the last one 44 minutes later, and the way home in a pocket was drawn onto the route. A receiver jump is no longer joined by a straight line across half the city — the wheel's own speed is a witness independent of the satellites, and a fix the wheel does not confirm is either dropped or left as a break. Single stray points no longer blow up the zoom: the frame came out 13 × 4.8 km where the route occupies 1.7 × 1.8. Distance is taken from the wheel instead of being summed over the points: the map showed 5.74 km where the wheel had done 12.4.

  • The ride card takes the same track as the map. It used to build the route from the raw log itself, so the map showed an honest route while the card still had the way home in a pocket drawn onto it.

  • A new instrument, "Cluster: speedometer" — two readings on one ribbon in two tracks: the outer one for the lead, the inner one for its companion. There will be no third: the instrument is built for exactly a pair. The peak over the ride is marked by a caret on the arc. The mode is available both to an ordinary tile and to the lead cell of the pinned band, where it needs height L and a second metric.

  • The "Pinned band" screen has been rebuilt: it now talks about what the band is made of — the lead cell with its slots, the side readings one row each, the height — and the catalogue of readings opens per slot. Three full-size catalogues in a row used not to fit into two and a half screens of scrolling, and the second metric hid exactly in the middle. Now the screen fits whole.

  • A wheel in the garage opens without connecting — the wheel menu gained "Open without connecting". The layout, auto volume and auto light are app settings rather than writes to the wheel, so they can be edited while the wheel sits switched off; a needless connection would only drain it. Tapping the row still means "let's ride". The rename dialog has become a menu of actions at the same time, with the name edited as a second step.

  • Tiles no longer vanish from the layout. The reading picker was seeded with whatever the wheel reports right now, and saving rebuilt the layout out of what was shown — a reading that stopped arriving took its tile away on the first visit, even though nobody had unticked it.

  • The screen stays awake while the app is open. An instrument is looked at, not touched, and the system timeout dimmed the display exactly when the readings were needed. Send the app to the background and the phone sleeps as usual; no permissions are involved.

  • Predicted charge and predicted range are steadier. A badly stitched discharge curve stretched the whole 0–100 scale over a narrow band of voltage, where hundredths of a volt were worth tens of points — such a curve is now rejected and the fallback per-cell table takes over. The remaining range no longer disappears on a long descent, where consumption goes negative, and no longer produces numbers like 2325 km: it is divided by the lowest consumption a wheel with a rider can physically ride at.

  • Begode without a smart BMS: the number of cells in series is taken from the model catalogue instead of being guessed from voltage. It cannot be derived from voltage alone — a 36S and a 40S at 3.78 V per cell both read 151.2 V — and the charge percentage and the range prediction disagreed with each other. Both now work from the same pack. A model the catalogue does not list is unaffected, and the manual voltage-class picker is untouched.

  • LeaperKim firmware update, as its own entry in the wheel menu. The app parses the firmware file, shows the version, size and checksum, requires the wheel to be tilted (as the manufacturer's own app does) and asks again before the first byte goes out; the command sequence repeats the official one, and the upload was tried on a real Lynx-S. Writing the flash is irreversible and there are no guarantees here: if the firmware does not take, only the recovery mode of the manufacturer's app can bring the wheel back.

  • New tiles, "Motor temperature" and "Coil temperature", for LeaperKim. Stock firmware does not fill these fields — the frame carries placeholders there — so the tiles are offered only to a wheel that actually reports them, which means a patched firmware. The values were read off a real wheel: 23.80 °C motor and 30.00 °C coil.

  • In the LeaperKim diagnostics, "Export values" now hands over the whole stream: every record of every packet with its own timestamp, around 500 Hz instead of the previous ~6, and each record says which values the wheel sent and which the predictor filled in. The old export was too coarse to study sensor behaviour.

iOS · build 57

  • The ride track screen has been rewritten. The route is coloured by a reading you choose, in the same colours and thresholds as the dashboard: the hue says which reading it is, the saturation how loaded the stretch was, and red means exactly one thing — your threshold fired. A second reading is carried by line thickness, so speed by colour and PWM by thickness read off one route. Under the map sits the same track straightened out along the distance: one lane per chosen reading, one cursor across all of them, and every threshold breach lined up as notches. Readings are picked with chips at the bottom, up to four at once, and a tap walks a chip around the circle: off → lane → colour → thickness. Start, finish and the peak of every chosen reading are marked with their values. The colour scale is stretched over the ride itself, so colours are comparable within a ride but not between rides.

  • The track has stopped lying. Points logged after the ride ended no longer reach the route: on one rider's ride there were 216 of them out of 474, the last one 44 minutes later, and the way home in a pocket was drawn onto the route. A receiver jump is no longer joined by a straight line across half the city — the wheel's own speed is a witness independent of the satellites, and a fix the wheel does not confirm is either dropped or left as a break. Single stray points no longer blow up the zoom. Distance is taken from the wheel instead of being summed over the points: the map showed 5.74 km where the wheel had done 12.4.

  • A new instrument, "Cluster: speedometer" — two readings on one ribbon in two tracks: the outer one for the lead, the inner one for its companion. There will be no third: the instrument is built for exactly a pair. The peak over the ride is marked by a caret on the arc, larger than the usual one. The geometry numbers are the same as on Android — it is one and the same instrument.

  • The pinned band settings gained a slot for a second metric: a pair assembled at height L turns the lead cell into the two-track speedometer, and choosing the same metric again removes it. The second reading was added to the row of links to the metric screens too — without it the lower ring's screen could not be opened at all.

  • A wheel opens without connecting: swipe the wheel's row for "Settings". That also closes a cruder hole — tapping a wheel that was not on the air used to do nothing at all. A tap still means "let's ride", and the offline view closes when you leave the dashboard and on any connection.

  • The screen stays awake while the app is open. An instrument is looked at, not touched, and the system timeout dimmed the display exactly when the readings were needed. Send the app to the background and the phone sleeps as usual; this is not background work.

  • Predicted charge and predicted range are steadier. A badly stitched discharge curve stretched the whole 0–100 scale over a narrow band of voltage, where hundredths of a volt were worth tens of points — such a curve is now rejected and the fallback per-cell table takes over. The remaining range no longer disappears on a long descent, where consumption goes negative, and no longer produces numbers like 2325 km: it is divided by the lowest consumption a wheel with a rider can physically ride at.

  • Begode without a smart BMS: the number of cells in series is taken from the model catalogue instead of being guessed from voltage. It cannot be derived from voltage alone — a 36S and a 40S at 3.78 V per cell both read 151.2 V — and the charge percentage and the range prediction disagreed with each other. Both now work from the same pack. A model the catalogue does not list is unaffected.

  • Consumption per kilometre for a ride is now worked out from the watt-hours spent and the distance covered. In a merged ride the counter resets at the seam between pieces, so the last snapshot described only the last leg: riders saw the consumption of an evening stretch where they expected the figure for the day.

  • The "⋯" menu on the home screen no longer closes by itself. The screen's one-second tick fired while the system was tracking a finger too, and the menu collapsed under your hand.

The Wear OS watch has stopped being a screen for the phone: it finds the wheel itself, connects to it, shows telemetry, vibrates on alerts and records the ride while the phone stays at home. The dashboard gains predicted charge and predicted range — the app builds a model of your own pack and takes the voltage sag out, so the percentage no longer dives when you accelerate. Your dashboard can now be published to the catalog on the site straight from the app, and braking has stopped counting as consumption, so the energy figures are honest. On iPhone, the crash after the wheel dropped out is fixed and the dashboard is noticeably smoother; Android gains a Cars section that reads a BMW over OBD.

Android · vc58

  • The Wear OS watch is now a wheel client in its own right. It scans for the wheel, connects to it, shows telemetry, vibrates on alerts and records the ride, then hands the ride to the phone for the shared history — a ride recorded by the watch is marked as such. A wheel holds one connection at a time, so the phone has the last word: if it is nearby and holding the wheel, the watch stays a companion; with no phone around, the watch rides on its own.

  • Three commands are available from the wrist: the light, the auto light and shutting the wheel down with a two-second hold. Only the ones your wheel actually supports are shown, and shutdown is the only one behind a hold, so a stray tap cannot switch the wheel off under the rider. Alerts and the metric layout arrive from the phone with the Sync button; if you have never synced, standalone mode runs one built-in alert — PWM above 80%.

  • What the watch records without the phone is chosen on the phone, in the watch settings: totals only, telemetry every half second, or telemetry together with a GPS track from the watch. The level travels to the watch with the rest of the sync.

  • Syncing does not need Google services: when the Data Layer does not work, the watch fetches its configuration and hands over rides over plain BLE. The watch settings on the phone say whether the watch can see the phone, and offer the missing Bluetooth permission right there.

  • The watch face has one main reading and three slots around it, and what goes in them is chosen on the watch itself. Scrolling by crown and bezel is off by default: inside a sleeve it moved the screen on its own. In companion mode the watch shows the same set of readings as it does standalone.

  • The watch APK is now published on the site alongside the phone build. That is the only way to get it if you installed the phone app from an APK: Wear OS will not deliver the watch half to a sideloaded phone app.

  • New tiles: "Predicted charge" and "Predicted range". The percentage a wheel reports is derived from voltage, and voltage sags under load — the app measures your pack's internal resistance from your own riding, works out the voltage with no load, and cross-checks it against the watt-hours that actually left the pack. You add the tiles yourself; they replace nothing. Accuracy grows with mileage, and for a model the built-in catalogue does not list, predicted range takes a while to appear — while there is nothing to work the capacity out from, it stays blank. Additional features gains a "Battery model" screen where the curve is visible and can be reset without touching your rides.

  • Braking no longer counts as consumption. Both engines took the current as a magnitude, so energy returned by regeneration was integrated as energy spent: on a real 20,000-frame Begode ride that overstated consumption by 47%. The sign is now taken against the direction of travel rather than the direction of power flow. PWM and phase current still read as magnitudes, deliberately.

  • LeaperKim Sherman-S: a fully charged wheel reported 15%. It was missing from the model table, so its 24S pack was taken for a 30S one. The curve for the whole 24S Sherman family was rebuilt at the same time: it physically could not express more than 53% before, and the lower half of the pack read at roughly half its true charge.

  • An alert can now be built on battery temperature — the hottest battery reading the wheel reports, because a battery alert is an overheat warning and the coldest pack cannot raise one. Readings a wheel does not have are gone from the editor at the same time: no Begode measures pack temperature in any frame, so the app stopped offering an alert on it that could never fire.

  • Your dashboard preset can be published to the catalog on the site — a "To catalog" item next to "Copy link". Publishing is deliberately separate from sharing: a link goes to one person, the catalog is seen by everyone. A dashboard that differs from one already in the catalog only by its colours is refused, with a message saying so, and taking your preset back off the catalog goes the same way. So that a preset has an owner, the app silently creates a guest account; the recovery key is shown on the "Account" screen in the home menu, where you can also restore from a key or revoke the local session.

  • Preset links now open on loeuc.pro as well as loeuc.ru, and without "https://" too — browsers hide it, and text copied out of an address bar used to be rejected.

  • When a pasted link does not open, the app says which of the three things went wrong: the clipboard does not hold a preset link, the site is unreachable, or the code no longer names a preset. All three used to answer "no preset in the clipboard", which sent riders looking in the wrong place.

  • The ride duration tile prints a duration instead of raw milliseconds: half an hour of riding showed as 1834000.0.

  • Ride charts drop single-frame spikes on readings that physically cannot jump in one frame — voltage, temperatures, charge. A corrupt frame from the wheel drew a spike on flat ground. Current, power and PWM are left alone: their spikes are real.

  • A new "Cars" section in the garage reads a BMW through a Bluetooth OBD adapter. It shows the VIN, the list of modules, live readings and faults, and the section appears only if an OBD adapter is paired with the phone. Where the limits are: the standard OBD-II readings, the VIN and the module inventory were checked on a live car, while the BMW-specific sensor decodes come from the manufacturer's own app and are not hardware-confirmed field by field. The code reference book is too large for the store build, so faults appear as bare codes.

iOS · build 56

  • New tiles: "Predicted charge" and "Predicted range". The percentage a wheel reports is derived from voltage, and voltage sags under load — the app measures your pack's internal resistance from your own riding, works out the voltage with no load, and cross-checks it against the watt-hours that actually left the pack. You add the tiles yourself; they replace nothing. Accuracy grows with mileage, and for a model the built-in catalogue does not list, predicted range takes a while to appear — while there is nothing to work the capacity out from, it stays blank. Additional features gains a "Battery model" screen where the curve is visible and can be reset without touching your rides.

  • Braking no longer counts as consumption. Both engines took the current as a magnitude, so energy returned by regeneration was integrated as energy spent: on a real 20,000-frame Begode ride that overstated consumption by 47%. The sign is now taken against the direction of travel rather than the direction of power flow. PWM and phase current still read as magnitudes, deliberately.

  • LeaperKim Sherman-S: a fully charged wheel reported 15%. It was missing from the model table, so its 24S pack was taken for a 30S one. The curve for the whole 24S Sherman family was rebuilt at the same time: it physically could not express more than 53% before, and the lower half of the pack read at roughly half its true charge.

  • An alert can now be built on battery temperature — the hottest battery reading the wheel reports, because a battery alert is an overheat warning and the coldest pack cannot raise one. Readings a wheel does not have are gone from the editor at the same time: no Begode measures pack temperature in any frame, so the app stopped offering an alert on it that could never fire.

  • Your dashboard preset can be published to the catalog on the site — a "To catalog" item next to "Copy link". Publishing is deliberately separate from sharing: a link goes to one person, the catalog is seen by everyone. Taking your preset back off the catalog goes the same way. So that a preset has an owner, the app silently creates a guest account; the recovery key is shown on the "Account" screen in the home menu, where you can also restore from a key or revoke the local session.

  • Preset links now open on loeuc.pro as well as loeuc.ru, and without "https://" too. A loeuc.pro link finally raises the app instead of falling through to Safari.

  • The app no longer crashes after the wheel drops out. When the reconnect window expired, a reading with no value took the app down — on TestFlight build 49 it happened a few minutes after the link was lost, often in the background, and the rider saw nothing but a crash report.

  • The dashboard is noticeably smoother. The header menu was being rebuilt ten times a second — a long list now scrolls properly instead of sliding over itself; the add-metric screen, opened above a live dashboard, no longer recomputes the whole list on every frame; and tile curves redraw three times a second instead of ten, while values, colours and breached thresholds stay at the old rate.

  • Ride charts drop single-frame spikes on readings that physically cannot jump in one frame — voltage, temperatures, charge. A corrupt frame from the wheel drew a spike on flat ground. Current, power and PWM are left alone: their spikes are real.

  • The Apple Watch icon was redrawn: it was a copy of the phone one, and a near-black background did not read as a circle on a black watch face. The mark is unchanged, the relationship is inverted — cyan background, dark wheel.

A tile's chart no longer follows the last few minutes: the window covers the whole span of the ride plus the alert threshold with headroom, so the limit line sits inside the chart instead of being pinned to its edge. The PWM alarm card has left the first settings screen — the way into the alerts manager takes its place, and the alarm is edited there along with every other alert. Appearance gains a tile border colour and a chart bed you can turn off, while iPhone gets fixes for the battery drain from auto volume, for charger readings, and for the pinned band on narrow screens.

Android · vc52

  • A tile's chart is built on the whole ride rather than the last few minutes: the window covers the entire ride span and clears the alert threshold with headroom. The limit line now lies inside the chart, and the same curve height means the same thing at the start of a ride and at its end.

  • A bipolar scale gained a second caret: acceleration and regeneration for current, acceleration and braking for the rate of change. The second one appears only if the ride actually crossed zero.

  • The PWM alarm card with its slider is gone from the first settings screen; the way into the alerts manager takes its place. The alarm itself is untouched: its threshold, conditions, priority and beep pattern are edited where all the others are, and nothing needs reconfiguring.

  • The PWM limit on the watch is read from your enabled alerts instead of the old card: if you built your own PWM alert, the watch shows that threshold.

  • The percentages in auto volume are loudness as you hear it, not a position on the system slider — the low end no longer means near silence. The curve is the same on Android and iPhone, so one setting sounds the same on both.

  • An alert bound to a specific wheel shows up again on the reading's screen and on tile scales. Before, the app contradicted itself: the alert sounded while the screen said no thresholds were assigned.

  • The first row of the pinned band's settings is a list of the metrics already in it — colour, form and thresholds are edited straight away, without hunting for the same metric in the grid.

  • Appearance: the tile border can take its own colour — six palette colours and a custom one you pick in full — and the chart bed can be turned off, letting the curve lie straight on the tile. A breached threshold never gives its border colour up: that one reports state.

  • The appearance sheet no longer jumps under your finger or closes itself while you scroll it.

  • Your wheel is always listed in the garage, even when it goes quiet in the air — tapping it connects by the saved address. Before, the card disappeared entirely after a manual disconnect.

  • Going back from the dashboard to the garage no longer pulls you straight back to the dashboard. The link holds and the ride continues, but reconnecting is your call.

  • The dashboard header shows the name you gave the wheel in the garage, not the factory name from the air.

  • InMotion: the "Fall angle" tile no longer shows the live lean — InMotion has no such setting at all. The lean itself stays, as pitch, and is now filled in on older firmware too.

  • Pedal stiffness leads the wheel settings screen on every brand — it is what riders open that screen for most often.

iOS · build 50

  • A tile's chart is built on the whole ride rather than the last few minutes: the window covers the entire ride span and clears the alert threshold with headroom. The limit line now lies inside the chart, and the same curve height means the same thing at the start of a ride and at its end.

  • A bipolar scale gained a second caret: acceleration and regeneration for current, acceleration and braking for the rate of change. The second one appears only if the ride actually crossed zero.

  • The PWM alarm toggle and its threshold slider are gone from settings; the way into the alerts manager takes their place. The alarm itself is untouched: its threshold, conditions, priority and beep pattern are edited where all the others are.

  • The PWM limit on Apple Watch is read from your enabled alerts: if you built your own PWM alert, the watch shows that threshold.

  • Auto volume no longer drains the battery: it stopped querying the audio system on every packet from the wheel and writes the volume only when the target actually changes. A rider on an iPhone X measured 15–20% of battery per hour with it on.

  • The percentages in auto volume are loudness as you hear it, not a position on the system slider — the low end no longer means near silence. The curve is the same on iPhone and Android.

  • An alert bound to a specific wheel shows up again on the reading's screen and on tile scales. Before, the alert sounded while the screen said no thresholds were assigned.

  • HW Smart Charger and SKAT / CAN-Control chargers finally show their readings on the dashboard: their frames were being dropped by a plausibility check written for wheels, so the dashboard sat in dashes on a live link.

  • A reading's screen opened from a ride no longer closes itself a moment after it appears.

  • Ride charts and the reading's screen draw noticeably faster on older iPhones.

  • The pinned band fits on narrow screens such as the iPhone 8 again. The side readings are taller — the margin scale under the value is fully visible — and the speedometer grew along with the band.

  • The chart bed in a tile grows with the dashboard scale instead of staying a narrow strip at every size.

  • The first row of the pinned band's settings is a list of the metrics already in it — colour, form and thresholds are edited straight away, without hunting for the same metric in the grid.

  • Appearance: the tile border can take its own colour — a palette for a quick pick and the system picker with its eyedropper — and the chart bed can be turned off, letting the curve lie straight on the tile. The chosen border colour applies at once, without a restart, and a breached threshold never gives its border colour up.

  • TPMS tire pressure sensor: the binding is no longer offered again after every connection, and the sensor is listened to for the whole ride after the app is restored by the system.

  • Dashboard presets: importing the same one twice no longer creates duplicates; a preset opened from a link appears in the library right away and is no longer wiped by a later file import.

  • The dashboard menu button responds across its whole area, not only on the dots themselves.

  • Pedal stiffness leads the wheel settings screen on every brand — it is what riders open that screen for most often.

The app now listens to wireless TPMS tire pressure sensors: pressure, tire temperature and the sensor's own battery show up right on the dashboard. On iPhone the new alert rule screens have landed and their sound has been rebuilt — a ramping alert finally merges into a continuous tone, and the PWM alarm became an ordinary rule carrying your own settings. Android and iPhone now offer the same set of readings: 73 on iPhone instead of 41.

Android · vc51

  • Support for wireless TPMS tire pressure sensors (iBar-compatible). The app spots a sensor next to your wheel and offers to bind it; pressure, tire temperature and the sensor's battery appear as dashboard tiles and charts. The binding can be replaced, and a hidden sensor brought back, in wheel settings. The sensor packets were decoded from the sensor's own official app and checked against a simulator — this has not been confirmed against a real sensor yet.

  • "Disconnect" now really disconnects: the app no longer reconnects to the same wheel by itself until you pick it by hand.

  • An alert rule combined as "all at once" no longer loses its conditions after a restart — such a rule used to come back empty and stop firing.

  • One rule with broken settings no longer holds back the others: only that rule is skipped.

  • Readings in the add menu and in ride metrics are grouped by meaning rather than by colour: the pressure sensor now has its own TPMS section, and pressure no longer sits among the voltages.

  • A reading's colour belongs to the reading itself: it survives deleting the tile and is picked up by the instrument band.

  • Under the band's lead speedometer you can see how far the value went during the ride — the maximum or the minimum, whichever suits the reading.

  • The band height is chosen in the band settings (the drag-the-bottom-edge gesture is gone), and at the tallest height the speedometer becomes the lead instrument straight away.

  • Distances are labelled in kilometres and the shutdown timer in seconds.

iOS · build 49

  • New alerts screens: a rule reads as a phrase, the threshold is set on the reading's own scale, and the whole sound lives on one screen — repeat mode, tone, length and the shape of the ramp curve. The separate "Templates" tab is gone; threshold presets stay next to the threshold.

  • Alert sound rebuilt on a single engine: a ramping alert speeds up smoothly and merges into a continuous tone instead of beeping once a second, and the alert voice goes quiet when the link drops and when dump playback is paused.

  • The PWM alarm is now an ordinary built-in rule. Your previous threshold and on/off state carry over once at startup, and the PWM card in settings edits that very alert again — before it looked like it worked but changed nothing.

  • The editor gained the ramp settings: pitch rise, the point where the sound merges into a continuous tone, and the curve shape. Previously the curve shape and these settings were reset on every save.

  • The app no longer crashes when connecting to a wheel because of a saved rule with inverted ramp settings.

  • Switches in the alert editor respond to the first tap — with live telemetry they used to need two or three taps, and the choice snapped back.

  • An alert rule combined as "all at once" no longer loses its conditions after a restart.

  • 73 readings instead of 41: everything the app was already decoding is now on screen — the full set of InMotion readings and LeaperKim pedal angle.

  • Labels fixed: InMotion pitch is no longer called "Fall angle", and pack and max cell temperatures are no longer shown as "Min/Max battery temp"; temperatures got their degree sign back, and the duplicate "Motor current", which showed the same number as phase current, is gone.

  • Dashboard presets: a library, a report of what a preset will change before you apply it, and four ways to share — link, clipboard, QR and file. A preset link from loeuc.ru now opens straight in the app.

  • Support for wireless TPMS tire pressure sensors, same as on Android: the sensor offers itself, pressure, tire temperature and sensor battery go to the dashboard, and the binding is replaced in wheel settings. The packets were decoded from the sensor's own official app and checked against a simulator, not yet confirmed against a real sensor.

  • A wheel switched on before the app no longer makes you wait: the list of found wheels fills up right away instead of after eight seconds of a blind connection attempt.

  • Dashboard edits made after the wheel disconnected or fell asleep are now saved instead of rolling back on the next launch.

  • A reading's colour stays with the reading and survives deleting its tile; the picker is grouped by meaning, including its own TPMS section.

  • The band height is chosen in the band settings (the drag-the-bottom-edge gesture is gone), and at the tallest height the speedometer becomes the lead instrument straight away.

On Android the accelerating alarm no longer just speeds up: the pitch climbs with the beep, and at the top of the curve the beeps merge into one continuous tone. And exactly one alert sounds at a time — the one that matters, with no mush of beeps taking turns. The PWM alarm became an alert like any other, at the highest priority of all, and the rule screen was rebuilt: a phrase instead of a builder, the threshold on a scale, the sound on one screen. A dashboard you have set up can now be handed to your second wheel or to another rider — by link, QR code, clipboard or file. There are also your own accent and backgrounds, a Dashboard metrics screen, a diagnostic log, swiping between BMS batteries, and chargers with readings of their own. On iPhone: cell and charger metrics, the ride's min and max under the scale, and sending a crash report.

Android · vc50

  • The accelerating alarm sounds new. The beep does not just speed up — the pitch climbs with it, and at the top of the curve the beeps merge into one continuous tone. The merge point, how far the pitch rises and the shape of the curve — even, steeper at the top, or steeper at the start — are yours to set, and the Preview the ramp button plays the whole curve from the threshold to the merged tone rather than one pass of the pattern. All sound now runs through a single continuous oscillator: no more clicks between beeps and no more beeps cut off mid-way.

  • Exactly one alert sounds. Alerts of equal importance used to take turns, and what came out was mush instead of a signal. Now, while the one that matters is sounding, the rest stay fully silent and show only on the dashboard. Music ducking, if you turned it on, happens once for the whole alarm instead of on every beep.

  • The PWM alarm became an alert like any other — at the highest priority of all, with its threshold still edited right on its card in the settings. It has no separate sound path any more. The first time the new version starts, its threshold, frequency range and merge-into-tone point are carried over automatically; nothing to reconfigure.

  • The rule screen was rebuilt. The card in the list names the rule by when it fires — as a phrase, not as a set of terms. The threshold got a screen of its own with a scale: the notch is the threshold, the band past it the hysteresis ("auto" if you did not set one), the hatching the dangerous zone; "Hold for over" and "Ramps up to" live there too, and without the latter a ramp on a percentage never reached the merged tone. The sound is on one screen. The Conditions tab is gone, but the templates are not — they sit behind the "From preset" button.

  • Dashboard presets. Menu ☰ → Dashboard presets: the dashboard you have set up is saved and handed to your second wheel or to another rider — by link, clipboard, QR code or file. For the QR, just point the other phone's built-in camera at it; no separate scanner needed. Before it is applied, the app shows an honest report: what lands as it is, what takes the same slot under its own name (your wheel has no such sensor but has a close one — and the tile is labelled with the sensor it actually reads), and what is dropped. Angles and currents are only substituted within one brand. The short link puts the look itself on loeuc.ru and nothing else; with no network the app quietly hands out a long self-contained link that works the same way.

  • The app's look is yours to set: theme, your accent, the app background and the tile background from ten swatches, and any tile can take a custom colour by hue, saturation and brightness. The accent editor was removed from the Share screen — one setting, edited in one place.

  • A new Dashboard metrics screen: readings are grouped, and the selection is confirmed or discarded as a whole rather than one at a time.

  • The ride's minimum and maximum are printed under the scale when there is room for them, and each number stands under its own point on the scale. For readings that only fall over a ride — battery, voltage, cells, range — the peak mark shows the low point rather than the high one: their maximum is known in advance, it is the state at the start.

  • BMS batteries can be swiped through, not just tabbed. On a wheel with four packs the row of tabs ran off the edge, and the last one could only be reached by a gesture nothing on screen mentioned.

  • Chargers now have readings of their own: charge power, charger temperature, the amp-hours and watt-hours delivered, and on the SKAT a target voltage as well. A charger used to fill the wheel's own fields, so its output was labelled "Pack voltage" and "Controller temperature". On the HW Smart Charger the field names had been read wrong — they are now matched against the vendor's own app, and the frame layout is confirmed against a real charger. One caveat: both captures were taken with the output closed, so its current and delivered Ah/Wh have only ever been seen as zeros.

  • A diagnostic log. Turn it on in the extra features, repeat the ride and send the file: it shows what the app actually did — when it connected to the wheel and when it lost the link, what the automatic light decided at every change of speed, why the automatic volume was or was not applied, and the moment the system pushed the app into the background. It is plain text and holds no raw wheel data; the log is off by default and does not affect performance.

  • Fixed: the charger settings screen opened onto nothing; the acceleration curve shape you picked was silently lost on save and the linear one played instead; an alarm caught by a dropped connection kept howling through every reconnection attempt; an alert enabled in the manager switched itself off when the wheel connected; the switch on the PWM card stopped doing anything if the alert itself had been deleted; a second condition you had added was erased on every move of the threshold slider; the rule screen ran under the status bar and the navigation bar.

  • Fixed on the instruments: LeaperKim's pedal angle is back — it is read from telemetry and was never a wheel setting; the min/max row was clipped on a small grid; the metric manager's header ran under the clock; labels named one sensor by another's name — the MOSFET temperature was called "Controller" and roll was called "Pedal angle"; a reading with no thresholds was drawn dimmed although there is nothing to dim; the detail chart's axis dipped below zero; the speedometer in a pinned band below height L now says plainly that it needs height L instead of being silently swapped out; the "Keep in the pinned band" switch was removed from the tile settings — the band's contents are edited on the band's own screen; the packet rate in the header no longer freezes at its old value when the stream goes quiet.

iOS · build 48

  • A tile's value and unit now sit on one baseline. The harder a large number was squeezed, the further the unit slid down — on a big zero it was plain to the eye.

  • Cell metrics arrived: minimum, maximum, average and spread — the same four as on Android. When the BMS does not answer they honestly sit in the "no data" section.

  • Chargers now have readings of their own: charge power, charger temperature, the amp-hours and watt-hours delivered, and on the SKAT a target voltage as well. A charger used to fill the wheel's own fields. On the HW Smart Charger the field names are fixed and matched against the vendor's own app, and the frame layout is confirmed against a real charger; its current and delivered figures have only ever been seen as zeros — both captures were taken with the output closed.

  • The ride's minimum and maximum are printed under the scale, and for readings that only fall over a ride the mark shows the low point rather than the high one — the same as on Android.

  • Merging rides is back in the list: it was lost in the move to the new history screens.

  • The "Keep in the pinned band" switch was removed from the tile settings — the band's contents are edited on the band's own screen.

  • After a crash, a "Send crash report" item appears in the home screen menu: the error's name, its reason and the call stack. What reaches the developer through TestFlight is usually not enough to tell what happened, and this file is. The item only shows up if a crash actually occurred, and the report holds no personal data or routes.

The iPhone app got the same new look and the same shape Android got the day before: the home screen became a garage with a wheel card, the dashboard was redrawn from the tile up to the header, a pinned band sits above the grid, related readings share a single tile, every reading has a screen of its own, and the ride history split into four screens. The dashboard now opens on a tap, and leaving it no longer drops the connection. Android is unchanged this time.

iOS · build 45

  • The home screen became a garage. It holds as many of your wheels as you like, each with its own state, and at the top sits the card of the one the app is about to connect to. While the link comes up, a rail runs under the name through its stages: scanning, found, linking, streaming. Once telemetry arrives, the card grows into numbers — battery, voltage and odometer appear in it on their own. Other devices moved to the bottom, and the Search and Stop buttons are gone: the scan runs the whole time the screen is open.

  • The dashboard opens when you tap the card, instead of replacing the screen by itself. The app used to jump to the instruments the moment it connected, so nobody ever saw the card. Now the screen changes only when you ask for it — after an automatic connection too.

  • Back from the dashboard no longer drops the connection. It returns to the wheel card, the wheel stays connected, and you can look into your rides or the garage without losing it. Disconnecting is now its own item in the three-dot menu, a deliberate act.

  • The instruments were redrawn from end to end. A tile has one order of elements and a bed of constant height, colour saturation shows how close a reading is to its limit, and your own thresholds from enabled alerts stand as notches on the scale. The ride's maximum is marked by a small triangle under the scale, the same as on Android. The header was rebuilt: the wheel name with a live-link dot and the measured packet rate, a battery pill filled to its level, and the menu.

  • A band can be pinned above the grid: the lead reading large, and up to three side readings with their own margin to the threshold. Its height switches on the band itself, its contents in its settings, and it is remembered per wheel.

  • Related readings share a single tile. Three temperatures, currents, cells — they split one tile into rows, charts or columns, and a shared unit moves up into the tile's header. How many rows fit, the tile works out from its own size.

  • Every reading now has a screen of its own: the value now, the minimum, average and maximum, the margin to the nearest threshold, and a chart with a cursor. Below it the list of thresholds, each leading to its alert. The Tile button opens the tile's own settings — size, look, colour and contents. When the tile is a composite one, a switcher sits at the top: the chart of any reading in it.

  • The look is yours to set: your accent, your app background and your tile background, from ten tested swatches. The accent editor was removed from the Share screen — one setting, edited in one place.

  • The ride history split into four screens instead of one. The list groups rides by day with a monthly total, a search, and a route silhouette on every record. Then comes the single ride with its totals, the track on the map coloured by speed, and its profiles; the screen of every recorded reading with sparklines, where a checkmark marks the ones that go on the chart; and the charts screen — tracks with their own scales, or an overlay on one axis, with a shared cursor and a viewport below.

  • Fixed: after a restart the app could stop connecting to the wheel and wait silently forever. A connection attempt now has a deadline, and the scan starts as soon as the radio is ready. If the wheel did not answer, the app says so instead of showing "connecting" without end.

  • Fixed: a reading marked for the chart did not appear on it until you left the ride and came back; an alert enabled on a reading's screen did not show up on the tile, and one disabled in the manager still looked enabled on the reading's screen; a composite tile spilled out of its cell in the grid; the chosen tile background was not applied; the ride map was rendered again on every opening.

The Android app got both a new look and a new shape: the home screen became a garage that holds as many of your wheels as you like, the dashboard was redrawn from the tile up to the header, a pinned band now sits above the grid, related readings share a single tile, every reading has a screen of its own with its thresholds, and the ride history split into four screens instead of one browser. The iPhone app is unchanged this time.

Android · vc48

  • The home screen became a garage. The app used to remember one wheel, the last one; now it can hold as many as you like — each sits in "My wheels" with its own charge, voltage and odometer, and the one it connects to is whichever is actually on the air. A long press gives a wheel a name you recognise or drops it from the garage; the factory name stays with the rides, settings and alerts either way. Demo mode is still there: on the first run it is in plain sight, later it lives in the menu.

  • The dashboard was redrawn completely. A tile now has one order of elements and an instrument bed of fixed height, so neighbouring tiles no longer dance against each other. Colour saturation shows how close a reading has come to its limit, a crossed threshold tints the tile's border, and the scales and the arc carry your own thresholds — taken from the alerts you have enabled — as notches, with the ride's peak as a mark of its own. The header was rebuilt: the wheel's name with a live-link dot and the measured packet rate, the charge pill, and three icon buttons.

  • A band can be pinned above the grid. It stays put while the grid scrolls: a lead reading as large text, a speedometer or a scale, with up to three side readings, each showing its margin to its threshold. The height switches on the band itself, the contents in the menu → "Pinned band", and both are remembered per wheel.

  • Related readings share one tile. Three temperatures, the battery currents, the cells — all of them can live in a single tile, a unit shared by all of them moves into its header, and the rows are drawn as bars, as charts or as columns. How many fit is worked out by the tile from its own size and look, and the add menu only offers the ones that still do.

  • Every reading now has a screen of its own: the value now, the minimum, average and maximum of the ride, the margin to the nearest threshold, and a chart with a cursor. Below it is the list of thresholds — each leads into its alert, and "Add threshold" opens a new alert with the reading already filled in. The "Tile" button on the same screen opens the tile itself: size, look and colour, its contents, and whether it is pinned in the band. The looks are shown as thumbnails, and one that does not fit the current size says plainly what it is short of.

  • The ride history split into four screens instead of one browser. The list groups rides by day with the totals for the period and a search; every card carries the outline of its route and a severity dot — how close that ride came to your own thresholds. Then come a single ride with its totals, its track on the map coloured by a reading of your choice and an elevation profile; a screen of every reading recorded, each with a sparkline; and a charts screen — tracks with their own scales, or overlaid on one axis, sharing a cursor, with the viewport at the bottom.

  • Records shorter than three hundred metres no longer clutter the list: they are collected into a row of their own that expands on a tap.

  • Screens carry a back arrow in their header again — the system gesture keeps working exactly as before.

  • LeaperKim and Lynx: the lateral angle is live now, readings that were really wheel settings are gone from the metric list, and the MOS temperature is findable in the grouped pickers.

  • Wheel settings moved out of the header into the menu — the header keeps adding a reading, BMS and the menu.

  • Fixed: on a fresh install the app no longer crashed on its first connection. The foreground service type is now assembled from the permissions you actually granted; without the location permission it simply records no track and connects to the wheel as usual. Decoding InMotion frames from a saved capture is no longer corrupted by unescaping them twice.

A ride that landed in the history as several pieces can now be merged into one, and a pause in the recording no longer becomes a straight line — not on the charts, not on the map, not in the climb total. Ninebot Z is supported, the InMotion V11 gains fuller support with settings you can change from the app, and iOS no longer gets stuck in sessions that connect but never deliver data.

Android · vc45

  • The ride history has a Merge action: select the pieces of one ride and their telemetry and tracks move into the earliest of them. The distance adds up even if the wheel's trip counter reset in between. Only finished, consecutive rides from the same wheel can be merged, and merging cannot be undone.

  • A pause in the recording breaks the line instead of running it across the emptiness — on the charts, on the map track, on the ride card and in the elevation profile. The straight line between pieces counts as neither distance ridden nor height climbed.

  • Charts now carry numbers at their edges: the peak and the low of the visible stretch, each reading in its own colour. A single-reading chart gets a labelled grid at round values instead.

  • InMotion V11: fuller support for the wheel. Settings can now be changed straight from the app — speed limit, pedals, lights, sound, the acceleration and braking assists, wheel lock and the ride modes; after a write the wheel re-reads the block, so the screen shows the value it accepted. The headlight is now a single quick-action button, motor temperature is no longer shown as zero (this wheel has no such sensor), and the settings screen no longer empties itself during a long session. The commands come from the manufacturer's own app and are not fully confirmed on live hardware, and some of them can cut power under your feet — only change those while parked.

  • Ninebot Z (Z6/Z8/Z10): telemetry, both battery packs with their cells, and settings — speed limit, Speed alarm 1–3 with their thresholds, headlight, daytime running and tail lights, LED and its colours, pedal sensitivity, speaker volume and wheel lock. The protocol was built from a description of the byte layout and no part of it has been checked on a real wheel. PWM is not reported by the wheel but computed from speed and voltage, so it is only an estimate of load.

  • SKAT / CAN-Control charger: experimental support.

iOS · build 42

  • The ride history has a Merge action: select the pieces of one ride and their telemetry and tracks move into the earliest of them. The distance adds up even if the wheel's trip counter reset in between. Only finished, consecutive rides from the same wheel can be merged, and merging cannot be undone.

  • A pause in the recording breaks the line instead of running it across the emptiness — on the charts, on the map track, on the ride card and in the elevation profile. The straight line between pieces counts as neither distance ridden nor height climbed.

  • Charts now carry numbers at their edges: the peak and the low of the visible stretch, each reading in its own colour, for up to four readings at once.

  • Fixed: when a wheel exposed several characteristics the app knows, commands could go to the wrong one. On a V11 that left the whole session waiting for telemetry — the characteristic is now picked by priority.

  • Fixed: connecting to a saved wheel now rediscovers its services. Such a session could previously sit "connected" without ever delivering a single packet.

  • Exporting a protocol dump now always produces a file, including the commands sent and the steps the connection got through. A silent session — the one actually worth reading — used to produce no file at all.

  • InMotion V11: fuller support for the wheel. Settings can now be changed straight from the app — speed limit, pedals, lights, sound, the acceleration and braking assists, wheel lock and the ride modes; after a write the wheel re-reads the block, so the screen shows the value it accepted. The headlight is now a single quick-action button, and motor temperature is no longer shown as zero — this wheel has no such sensor. The commands come from the manufacturer's own app and are not fully confirmed on live hardware, and some of them can cut power under your feet — only change those while parked.

  • Ninebot Z (Z6/Z8/Z10): telemetry, both battery packs with their cells, and settings — speed limit, Speed alarm 1–3 with their thresholds, headlight, daytime running and tail lights, LED and its colours, pedal sensitivity, speaker volume and wheel lock. The protocol was built from a description of the byte layout and no part of it has been checked on a real wheel. PWM is not reported by the wheel but computed from speed and voltage, so it is only an estimate of load.

  • SKAT / CAN-Control charger: experimental support, readings only.

Rides now export in WheelLog format, InMotion P6 answers settings reads, and InMotion and LeaperKim telemetry got more reliable.

Android · vc44

  • Ride history now offers “Export Wheellog” — a ride exported in WheelLog format. Rides recorded without a GPS track can be exported too.

  • InMotion P6 now answers settings reads: 22 fields with their names, units, and values were confirmed on a real wheel and cross-checked against the official app.

  • Some P6 settings can now be changed straight from the app. The commands are built from the protocol but have never been written to a real wheel yet, so check the result on the wheel.

  • Quick light, auto-light, and power-off actions now recognize InMotion P6, and the P6 charging voltage is shown at the correct scale.

  • Preliminary telemetry and settings reading was added for InMotion V11. There is still no real V11 capture, so the data is unconfirmed and the settings are view-only.

  • Wheel settings are split into clear sections: ride, speed, lighting, sound, battery, protection, and system. Decoded blocks no longer show rows of raw bytes.

  • LeaperKim Patton no longer shows a jumping battery percentage or phantom currents of hundreds of amps: the app stopped reading the checksum as telemetry and uses the confirmed 30S configuration.

  • Experimental HW Smart Charger support: the write channel and command framing were fixed, and a password prompt with safe per-device storage was added. Receiving telemetry from a real charger is still unconfirmed.

  • The dashboard now has an explicit disconnect action, and ride history keeps the open ride, selected charts, zoom, and selection mode across screen rotation.

  • Layouts behave better on compact screens and with large system text. The device scanner now shows the app version and build number.

  • Built-in example alerts now start switched off on a fresh or reset installation until the rider turns them on.

  • Diagnostic dumps export even from a device that stays silent: outgoing commands are kept and counted.

iOS · build 34

  • Ride history now offers “Export Wheellog” — a ride exported in WheelLog format. Rides recorded without a GPS track can be exported too.

  • InMotion settings reads were fixed: P6 finally answers and shows 22 fields, confirmed on a real wheel and cross-checked against the official app.

  • InMotion telemetry no longer freezes on an empty screen when the wheel misses the first request or its answer is lost — the app resumes polling on its own.

  • The P6 dashboard now fills in the charging voltage and current tiles, and the charging voltage scale was corrected.

  • Wheel settings are split into the same sections as on Android: ride, speed, lighting, sound, battery, protection, and system.

  • Preliminary telemetry and settings reading was added for InMotion V11. There is still no real V11 capture, so the data is unconfirmed and the settings are view-only.

  • LeaperKim Patton no longer shows a jumping battery percentage or phantom currents of hundreds of amps: the app stopped reading the checksum as telemetry and uses the confirmed 30S configuration.

  • Experimental HW Smart Charger support: commands no longer go nowhere, and a password prompt with safe per-device storage was added. Receiving telemetry from a real charger is still unconfirmed.

  • The device scanner now shows the app version and build number.

  • Built-in example alerts now start switched off on a fresh or reset installation until the rider turns them on.

New watch and diagnostic capabilities, additional wheel settings, and connection and audio fixes.

Android · vc43

  • Added experimental HW Smart Charger support with a dedicated dashboard for charge voltage and current, charging state, power, and temperature. Device detection and the BLE protocol have not yet been tested with a real charger.

  • LeaperKim and NOSFET wheel settings now expose Speed Alarm separately from tiltback speed. The command was recovered from firmware and has only been lab-tested so far, without a write to a real wheel.

  • LeaperKim diagnostics now offer a Fast mode that reads all 54 co-stream fields together at 500 Hz, reports packet loss when the BLE link is saturated, and switches to the selected mode more reliably. Exiting requires restarting the wheel.

  • PWM and custom alerts now mix correctly over music. A new setting can duck music for the entire alert without volume pumping between tones.

  • Improved InMotion P6 settings reads immediately after connection by sending requests sequentially, reducing missed short-lived responses.

iOS · build 33

  • Added an Apple Watch companion with one large configurable reading, two additional cards with sparklines, light control, and PWM threshold haptics. Telemetry comes from the iPhone; the watch never connects directly to the wheel.

  • Added experimental HW Smart Charger support with a dedicated dashboard for charge voltage and current, charging state, power, and temperature. Device detection and the BLE protocol have not yet been tested with a real charger.

  • LeaperKim and NOSFET wheel settings now expose Speed Alarm separately from tiltback speed. The command was recovered from firmware and has only been lab-tested so far, without a write to a real wheel.

  • A manual disconnect now prevents lifecycle and Bluetooth-state auto-connect from reconnecting to the wheel. Auto-connect resumes only after an explicit connection.

  • Alert sounds now recover after returning from another app, a system audio interruption, or an iOS media-services reset.