Documentation
The dashboard
Tiles, gauges, charts and the map: building a screen around the way you ride.
The main screen is a grid of tiles. Each tile shows one reading. Which tiles are there, how big they are and in what order is up to you, and the arrangement is saved per wheel.
While the app is open the phone's screen stays awake: an instrument is looked at, not touched, and the system timeout used to dim the display exactly when the readings were needed. Send the app to the background and the phone sleeps as usual.
Rearranging it#
-
The plus button at the top adds a tile. The list only offers readings your wheel actually reports, and each name carries its current value beside it — you can read a number right there without putting a tile on the dashboard for it. Wheel settings such as ride mode, danger speed or the power-off timer are not in the list: they are not readings, and tiles holding them disappear from dashboards you already built.
"Actually reports" is a property of the wheel, not of the current second. A reading the wheel has sent even once stays in the list and on the dashboard even while nothing is arriving: the tile draws a dash and waits for a value. Only you can take it off.
-
A tile can be dragged to a new position and resized by its corner. A new tile goes into a free cell, and the tiles you already placed stay where they are.
-
A tile you do not want can be removed — the others stay put, and a row left empty closes up.
-
A tap opens the reading even if your finger slides a little — on a moving wheel, say.
-
In tile settings the number can be centred — on graph, horizontal and vertical scale tiles; the title stays on the left.
-
The same screen sets the decimal places, per reading of the tile — the rows of a combined tile included. "Auto" keeps the app's own default. The choice belongs to the reading itself: it applies everywhere that reading is shown, on every wheel.
Some models start from a layout picked for them. An InMotion P6, for example, shows tyre pressure straight away, because that wheel reports it.
On the left of the header is a rate in hertz: how many times a second the wheel sends telemetry. It counts assembled frames rather than link packets, so the number means the same thing on every brand — a stock LeaperKim reads about five, the same wheel with the telemetry plugin up to twenty-five, other wheels their own. A rate drifting down without a disconnect is a wheel that has gone quiet: that is what one busy with another app looks like.
What can be shown#
The list depends on the brand and model. Everything the app knows how to display:
| Group | Readings |
|---|---|
| Motion | speed, trip distance, total distance, ride time, moving time, moving average speed, acceleration |
| Load | PWM, output current, phase current, battery power, apparent power, motor power, torque, current limit |
| Battery | charge level, voltage, battery current, left and right battery currents, lowest, highest and average cell, cell spread, average and current consumption in watt-hours per kilometre |
| Temperatures | controller, motor, board, CPU, IMU, battery, hottest cell, hottest battery board |
| Attitude | pitch angle, roll angle, target angle, pedal angle, acceleration and braking angle |
| Wheel limits | tilt-back speed, speed warning, tilt-back by PWM, PWM warning, tilt-back by bus current |
| Charger | whether it is charging, charge voltage and current, charge power, charger temperature, amp-hours and watt-hours delivered, target voltage |
| Other | tyre pressure, remaining range, LTE signal, the wheel's own maximum speed, battery power and motor power |
| Estimated by the app | predicted charge, predicted range |
The list is the same on Android and on iPhone: one catalogue in the shared core drives both, and a reading missing on one platform fails to build on the other. Before the 18 August 2026 release the iPhone showed only part of the set — the engines decoded the rest, but the app never lifted it onto the screen; now it does.
If a reading is missing from the add menu, either your wheel does not report it or that part of the protocol has not been decoded yet.
Readings your wheel does not report no longer vanish from the list: they sit at the bottom in a section of their own, greyed out and not selectable, with a line saying the wheel never sent them. That way you can see the reading exists in the app, and that it is this wheel that withholds it rather than the app that lacks it. The search box covers that section too.
Readings the app computes itself never land in that section: ride time, moving time, moving average speed, consumption, average cell, the charge and range forecasts, GPS speed. The wheel does not report them and cannot — they are derived from speed, voltage and power, which every wheel sends — so they are always available, including on a standing wheel and before the first ride. Until the 21 September 2026 release they were asked the same question as everything else ("did the wheel send this?"), and on iPhone the moving average speed disappeared from the picker at exactly the moment you set the dashboard up.
There is one exception: the Solowheel Xtreme reports speed and voltage only, so consumption stays a dash on it. The reading is still not removed from the picker — a dash on one wheel beats a reading that vanishes on every other.
A reading your wheel has sent at least once stays available for that wheel for good, even after it stops arriving.
Inside a section the readings are ordered by kinship — what is measured in the same units and carries the same colour comes first — rather than in the order they were once added to the catalogue. The order is the same on Android and on iPhone.
The list is long, so there is a search box above it: type "temp" or "current" and only the matching rows stay. It searches both the full name and the short one printed on the tile.
Average consumption and consumption now#
The app works out both of these itself, from battery power and speed, in watt-hours per kilometre.
Average consumption is everything that left the battery since the ride started, divided by the distance covered. It answers "what did this ride cost" and moves slowly: if the first five kilometres were in town, the motorway after them barely shifts the number.
Consumption now is the same thing over the last five hundred metres only. At 70 km/h that is the last half minute, at 20 km/h a minute and a half. While the wheel stands still or is walked alongside you, the number holds its last value: energy spent standing is lights and the controller, not the price of a kilometre. On a descent with regenerative braking consumption now can go negative - that is not a fault, the battery really is charging at that moment. For the first two hundred and fifty metres of a ride the number is not shown: over that stretch consumption is not yet defined.
An example from a real ride: town, then motorway at 65-70 km/h. By the end average consumption had crept up to 31 Wh/km, while consumption now sat at 37-40 on the motorway and reached 49 when accelerating. For "will I make it home at this speed", look at consumption now.
Average consumption used to be called "Consumption per km", and it was easy to take for the current figure. If it is already on your dashboard it stays where it was under its new name; consumption now has to be added separately.
Predicted charge and predicted range#
These two the app works out itself rather than reading off the wheel.
The charge a wheel reports is usually derived from voltage, and voltage sags under load. On a 36S pack with about 180 mOhm of internal resistance, fifty amps cost eight volts, so the number dives when you accelerate and recovers at the lights. On real rides the reading swung by 20-44% over rides that actually used 9-16%.
Predicted charge takes the sag out: the app measures your pack's internal resistance from your own riding and works out what the voltage would be with no load. It then cross-checks that against how many watt-hours actually left the pack, and each corrects the other.
Predicted range is the remaining charge divided by your consumption per kilometre, adjusted for how you are riding right now - speed and how ragged it is cost about the same.
Turning percent into kilometres needs the pack's capacity in watt-hours, and nothing reports it. For models the app knows it comes from a built-in catalogue, and from there your own pack's curve - built from your own rides - refines it.
The catalogue holds the nameplate capacity - what the maker claims for a new pack. Yours may hold noticeably less: age, winter, kilometres. So the app treats the nameplate as a starting point and walks the capacity toward what your own rides show. If the range estimate settles below the number on the box, that is a measurement, not a fault.
For a model the catalogue does not list, capacity is worked out from how many watt-hours went into each percent of drop, so it takes a while to appear. Until there is something to work it out from the range stays blank: half the truth is worse than none - range is what you plan the way home on.
Both sit alongside the factory numbers and replace nothing: "Battery" and "Remaining range" stay exactly as the wheel reports them. You have to add the tiles yourself - your screen will not change on its own.
Zero on this scale is 2.95 V per cell: that is as low as a modern wheel discharges safely, and it is what Veteran's low battery mode uses (106.2 V on a 36S pack). The pack's energy does not depend on a setting, so the pedal-tiltback threshold does not move zero - it cuts the bottom off. With the mode off the wheel stops holding you up at 113.4 V, and everything below that the scale marks unavailable. At the same voltage the mode being on shows more charge left: not a different pack, a different permission on the same one.
Train on past rides. The "Battery model" section has a "Train on past rides" button: the app walks the rides you have already recorded and builds this pack's curve from them, instead of waiting for you to ride new ones. It shows the list first - which rides it can learn from, how many kilometres that is, and why the rest did not qualify. Three kinds are left out: rides recorded by an older version, where braking was logged as spending; rides where the current sign never appears; and rides too short to say anything. Merged rides are cut at their seams - a charge may have happened between the parts - and telemetry from a standstill is skipped entirely: voltage recovers there, charge does not.
The trained model takes effect at once: the "Battery model" screen shows it as soon as training finishes, and the next ride learns from it. Only a ride in progress at that moment finishes on the previous model.
The trained model travels with your rides: it goes into the export and comes back on import on another phone. Moving used to lose everything the app had learned.
Accuracy grows with mileage. On the first rides the app knows little about your pack and falls back on a generic curve measured off a three-hour 36S charge - 1939 Wh, both ends taken at rest; the more you ride, the better it knows your pack in particular. A stretch of charge you have never ridden through is a stretch the app has never seen, so deep discharge only gets accurate after you have been there at least once.
None of this leaves the phone: your pack's model lives on the device, in the same database as your rides, and travels with their export.
When a charger is connected#
A charger is not a wheel, and its list of readings is its own: it has no speed, no PWM and no battery pack, so the add menu offers only the "Charger" row from the table above. The tiles are named after its own sensors — "Charge power" rather than "Battery power", "Charger temperature" rather than "Controller temperature".
The set also depends on the charger model: SKAT reports a target voltage, the HW Smart Charger has no such reading, and it will not appear in its add menu.
The reverse holds too: a wheel's add menu carries no charger readings. Charge power, charger temperature, the amp-hours and watt-hours delivered and the target voltage are measured by the charger itself, and no wheel reports them. The exception is charge voltage, charge current and the charging flag: Inmotion works those out itself and sends them in the wheel's own frame, so they stay in its menu.
A charger's settings are its own, and so is its settings screen — none of the wheel sections are there. On a SKAT the app writes the second-stage voltage and current, the maximum voltage and current, the pre-charge voltage and current and the two over-temperature thresholds; this works on Android and on iPhone alike. The charger does not report its current configuration back, so a value is typed in by hand from the charger's own screen, checked against the vendor limits and refused if it falls outside them rather than being silently clamped. The app asks for confirmation before writing: a mistake in the voltage can ruin a battery. The HW Smart Charger takes no setting writes from the app — readings only.
Multiple dashboards#
You can set up to six dashboard layouts for each wheel — for example, city, speed and diagnostics. Dashboards are switched with a horizontal swipe across the dashboard; a strip under the header shows which dashboard is open and how many there are, and when you switch, a dashboard's name pops up briefly. The easiest way to create a second one is to swipe while you have one — the app offers to add it. Management is through a tap on the strip or the dashboard menu item "Dashboards": create a copy of the current one, rename, delete.
The zoom level belongs to the dashboard too: a pinch is remembered per dashboard, so the diagnostics one can stay small while the speed one is large, and switching changes the scale along with the layout. Your existing zoom carries over to every dashboard of that wheel on update.
When the phone rides on your sleeve or on the bars, a pinch happens by itself and is saved the moment it does. For that there is a scale lock in Appearance: with it on, a two-finger gesture leaves the grid alone.
Pinned band side metrics can now be reordered — in the band settings, drag a row by the handle on the left.
The pinned band#
The band above the grid stays put while the grid scrolls, so the reading you watch for the whole
ride never leaves the screen. Turn it on from the ☰ menu → "Pinned band", and set it up there:
- a lead reading, drawn as large text, a speedometer or a scale;
- up to three side readings, each with its own margin scale;
- three heights, which the band itself also switches — drag the handle at its bottom edge.
The first row of its settings is a list of the metrics already in the band: colour, form and thresholds are edited on the metric screen, and you no longer have to hunt for the same metric in the grid.
The band is remembered per wheel, the same way the tile layout is.
The band's frame is the same as the tiles' in every theme, Pilot included: the tile frame colour in Appearance changes it too. Near an alert threshold the band tints and turns red just like the tiles.
Appearance#
Menu ☰ → "Appearance". Theme, accent, app background and tile background are chosen
separately, with a preview at the top that shows what you are getting.
There are four themes: system, light, dark and Pilot.
Motion#
Below the themes sits "Motion" — how much the app animates. Three positions: Full, Calm and Off.
Off really means off, not "very fast": animations are not played in zero milliseconds, they are not played at all. Figures change at once, a desk snaps into place without sliding in, a tile being edited does not wobble. On a screen that stays lit for a whole ride, that also saves phone battery.
This does not override the system setting. If animations are switched off across Android — in developer options or by battery saver — they are off here too, whichever position you pick. The reverse holds as well: the app honours a system slowdown, but accepts at most twice the normal duration, or the battery fill would crawl for a second and misreport the charge for all of it.
On iPhone the same role belongs to Reduce Motion in the Accessibility settings: with it on, the app does not animate, whichever position is picked here. iOS has no system slowdown, so there is nothing to accept.
Rolling digits#
Under "Motion" sits "Rolling digits". Digits are not swapped but rolled: a rising figure comes up from below, a falling one down from above. The point is not decoration — the direction reads peripherally, before you have read the figure itself.
Only the digit that actually changed moves: going from 34.2 to 34.8 rolls one digit, not the whole number. That works because the number first travels smoothly to its new value and is printed only then — otherwise going from 99 to 104 would flip every digit at once.
Off by default. A dashboard can hold a dozen tiles, each updating ten times a second, and rolling is one animation per digit; switch it on and see whether it stays smooth on your phone.
With Motion set to Off, rolling does nothing — the switch stays, but has no effect. On iPhone it is also greyed out.
On iPhone the rolling is drawn by the system, and there the number does not travel smoothly before it is printed. Going from 34.2 to 34.8 still rolls one digit, but going from 99 to 104 flips every digit at once.
The Pilot theme#
A high-contrast theme for riding in sunlight and at night. It came out of one rider's account of riding with the phone strapped to a sleeve and to handlebars: grey field labels and grey units on a dark background cannot be read at all while moving.
What is different about it:
- A black field with luminous marks. That is how cockpit instruments are built. By day the reflected ambient light sets the screen's black level anyway; at night a light field is a large lamp that shines back off the glass and undoes eyes that have adapted to the dark.
- No grey labels anywhere. The metric name, the unit and the numbers under a scale are set in ink as bright as the value itself. The hierarchy stays, but size and weight carry it instead of fading into the background.
- Red is past the limit, amber is the limit approaching. The severity colours come from the cockpit: red asks for action now, amber warns. No metric colour occupies either of those two at full saturation.
- You can still find a metric by its colour. PWM stays orange, speed yellow, temperature red — every hue is the one from the dark theme, lifted in brightness.
- Colour is always at full strength. In the other themes a value loses saturation the further it sits from your threshold. Not here: a calm metric burns in the same colour as one at the limit, and is never paler than its own label. State is carried by the colour changing, not by it fading — amber as the threshold nears, red past it.
- The digits fill the tile. Value size is computed from the room available rather than a flat 25-point ceiling, so the number grows with the tile. It never encroaches on the instrument or the scale row, and on a chart tile it does not grow at all: you picked that tile for the curve.
- Colour is never the only channel. Besides the colour, a breached threshold paints the tile border, lays a wash under the value and puts a notch on the scale — so a breach is visible to anyone who tells colours apart less well.
What it does not do#
- It does not cut the palette down to six colours. Aviation practice says six or fewer (FAA AC 25-11B, §5.8.3), but a cockpit display does not carry nine metric families that a rider recognises by colour. Recognition wins here: it is needed on every ride, while the six-colour limit was written for a screen that must be read correctly at the first glance.
- It does not free red and amber for alerts only. Temperature stays red, PWM orange, speed yellow, and they burn at full strength all the time — otherwise you cannot find a metric by eye. This is the theme's largest departure from instrument practice, and a deliberate one: an alert is marked by the colour changing, together with the tile border and the notch on the scale.
- It does not change screen brightness. The theme is colours; night brightness is still the phone's.
- It does not enlarge the labels. The value grows; the metric name and the unit are still computed from tile width, so they grow with the tile rather than with the theme.
The theme sets the app background, the tile background and the accent itself, so those swatches leave the screen while it is on: the contrast of a label against a tile is computed from one specific pair of colours, and a foreign background breaks it. The tile border and the chart bed stay yours — they sit on top of the palette. Your earlier background choice is kept intact and comes back the moment you switch away.
Accent, app background, tile background and border each end their row of swatches with "+" — a
custom colour, any colour, including by code such as 1F8F84. A custom background is the same
in the light and dark themes, so it picks the theme itself, as black does: a dark custom
background makes the app dark and a light one makes it light, otherwise the digits would sit on
a background of their own tone. You can still switch the theme against such a background — the
background then goes back to the standard one.
Two of the controls there are about tiles:
- Tile border. The theme's thin line by default. Next to it are six palette colours for a quick pick and a custom colour you choose in full. The pinned band takes the same colour — it is the first card of the same screen. A breached threshold never gives its colour up: that border reports state, not appearance, and stays the colour of the severity.
- Chart bed. It can be turned off — the curve then lies straight on the tile, with no well under it. Scales are untouched: on a scale the bed means "this is how far it did not get", and without it the fill stops being a mark.
- Scale lock. A pinch on the dashboard stops re-laying the grid. It is for the places where the screen shakes under your hand: an accidental pinch changes the layout and remembers it, and putting it back is something you would be doing while riding.
Dashboard presets#
A dashboard you have built can travel: to your second wheel, or to another rider. The ☰ menu →
"Dashboard presets". A preset carries every one of your dashboards — on each of them which tiles
there are, their sizes, order, look and colours, the metrics inside cluster tiles, the pinned
band setup and the zoom level — plus the dashboard names and the app's accent and backgrounds. Alerts and general settings
are not part of it.
Applying a preset with several dashboards replaces your whole set outright: you end up with as many as its author had, under their names, and the dialog before applying says so. A single-dashboard preset — your own older one, or one from a build that did not know about several dashboards yet — does the opposite: it lands on the open one and leaves the others alone.
Overwriting a preset#
"Overwrite" in a preset's row drops the current dashboard into an existing entry. The entry keeps its own name — you do not type one again, and that is the whole point: a rider with one dashboard that gets tweaked every ride otherwise had to create a new preset and invent a name for it every single time.
The app asks before it overwrites, and names the preset it is about to replace. Whatever was in that entry is gone for good, with nowhere to get it back from, so one extra tap is cheaper than a misplaced one.
One preset, four ways to hand it over:
- a link — "Share" sends it through any messenger; opened on a phone with LoEUC, it drops the preset into the library. The link is short: the preset itself lives on loeuc.ru and the link carries only a code. With no network the app quietly hands you the long self-contained link instead — it carries the whole preset, puts nothing on any server and works just the same (see the privacy policy). The site answers to two addresses, and a link from either of them opens;
- the clipboard — "Copy link" on one side, "Paste from clipboard" on the other;
- a QR code — show it on your screen and point the other phone's ordinary camera at it; no scanner of our own is involved;
- a file — "Save all to a file" writes the whole library at once, which doubles as the way to carry it to a new phone.
The dashboard catalogue#
Separately from handing a preset to one person, you can put it on the public catalogue — the "To catalogue" button in the same library. Sharing and publishing are two different decisions: a short link goes to whoever you sent it to, the catalogue is seen by everyone.
A catalogue card shows the preset's open dashboard — the one it was saved on. The others travel with the preset and appear when it is applied, but the preview does not show them.
The catalogue holds one card per dashboard. "The same dashboard" means the same arrangement: the same tiles in the same places, at the same sizes and in the same modes, with the same metrics inside cluster tiles and the same pinned band. Colours, themes and names do not count, so a recoloured copy does not become a second card: if that dashboard is already published by you, the new publication takes the old one's place; if by somebody else, the app tells you it is already there and nothing is added.
None of this touches links. The preset is unchanged, its link keeps working, and it can still be handed over and applied whatever the catalogue decides to list.
What happens on a different wheel#
Wheels report different telemetry, so a preset applies partially — but honestly. Before anything changes, the app shows a report in three parts:
- land as they are — the readings every wheel has: speed, voltage, PWM, power, controller temperature, battery level, distances;
- take the same slot under their own name — your wheel has no such sensor but has a close one. The tile keeps its position, size, look and colour, but it names the sensor it actually reads. MOSFET temperature from a LeaperKim becomes controller temperature on a Begode, and says so;
- dropped — no reading and no close match. The tile does not appear and the grid closes up.
Angles and currents are only replaced within one brand. Every brand puts its own zero on the pitch angle and calibrates its own gyroscope, and phase current runs several times higher than output current by an amount that depends on how the brand counts it. Across brands such a substitution would print a plausible but wrong number, so the reading is dropped instead. Roll is never substituted at all — that is a different axis.
How a tile looks#
You choose how each tile draws itself. Tapping a tile opens that reading's own screen, and the "Tile" button there opens the tile itself: its size, its look and its colour:
- a chart, which is the default;
- a speedometer — an arc with the thresholds on it and an "avg · max" line below;
- a horizontal scale;
- a vertical scale;
- a bipolar scale, for readings that go negative: current and power under braking;
- large text.
The same screen carries hide the unit. It is a property of the tile, not of the reading: "km/h" on a speedometer that fills half the screen says nothing — the metric is named by its label and recognised by its colour — while "°C" on one of three temperatures does. The space the unit gives up goes to the number: the unit's width is part of the font-size calculation, so the value grows on its own. A cluster is not offered the switch — there each row prints its own unit.
The same screen carries decimal places. It is a property of the reading, not of the tile:
what you pick applies everywhere the reading is shown — in the tile, in the pinned band, in
cluster rows, on scale labels and in the widget — and it is the same on every wheel. Auto does
not mean zero decimals; it means the usual rule, where a tenth is the last digit that matters
for most readings, a thousandth for a cell, and nothing at all for percentages and watts.
Picking a number by hand overrides that rule completely, including the habit of printing
three-digit values whole: pack voltage with two decimals stays 175.93 rather than rounding to
176.
A custom colour is picked on its own screen. At the top is the reading's tile in large
digits next to its neighbours on the dashboard, so you can see at once whether the colour reads
and whether it blends into the tile beside it. Below that is the colour code: type or paste one,
for example 1F8F84, and the colour changes as soon as all six characters are in; the hue,
saturation and brightness strips rewrite the code themselves. The "Same hue" row gives the same
colour darker or lighter in one tap. If the digits would be unreadable on the tile in that
colour, the screen says so, and "Fix" picks the nearest readable colour of the same hue. The
same screen opens for the custom colours under Appearance, just without the contrast check.
A reading's colour is now shared by every wheel too. It used to be stored per wheel, so "speed is orange" had to be chosen again on each one. On update the palette is carried over from whichever wheel's dashboard you opened first.
The metric's name and its unit grow with the tile. They have no setting of their own: a tile stretched across half the screen is itself the answer to how large its label should be. On a narrow tile the size is the one it always was.
A gauge does not turn red in one step. While the threshold is far off, the tile keeps the metric's own colour — that is what you find it by. Over the last quarter of the way to the threshold the severity colour is mixed into it, more of it the closer you get: the number, the scale fill and the speedometer arc all move together. Past the threshold they become the severity colour entirely, as the tile border already did. The zone beyond the threshold stays marked on the scale throughout — it answers "where the limit is", not "where you are".
A tile's chart scales by its own rule, and it does not follow the last few minutes. The window always covers the whole span of the ride, and where the reading has an alert, it also clears that limit by a tenth above it. The limit line therefore sits inside the chart instead of being pinned to its edge, and the same curve height means the same thing at the start of a ride and at its end. When the ride went higher than the limit, the window follows the ride: what already happened does not drop off the picture.
A bipolar scale carries a caret on each side of zero: 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 pack voltage scale and the cell scale are marked out by the same pair of numbers — 3.0 to 4.22 V per cell — so at any one voltage both rails are filled alike. The pack used to run 3.5 to 4.2 per cell and the cell 3.0 to 4.5, and side by side in one tile they disagreed: 175.9 V on a 42S read as an almost full rail while the same 4.186 V per cell read as four fifths. The top is 4.22 rather than 4.2 to leave room for the constant-voltage phase; a cell that climbs above it stays on the rail instead of hitting the end, because an overcharge belongs on the scale as a mark rather than as a wall.
Besides your thresholds, a scale also marks the peak of the ride as a short notch in its own colour. For readings that only fall over a ride — charge, voltage, cells, range left — the notch marks the sag instead of the top: their maximum is the state at the start, known in advance.
The ride's min and max are printed under the scale wherever there is room for them: in the pinned band at heights M and L, and in a tile from the size where the row still has height for numbers. Each number stands under its own point on the scale rather than at its end — so the meaningful one lands right below the peak notch and labels it. When the two points crowd together, or only one number fits, the meaningful edge stays: the sag for falling readings, the peak for rising ones.
A vertical scale does the same thing sideways: the peak's number sits opposite its notch. It yields both to the ends of the scale and to the threshold mark — if it lands at their height it is not printed at all, because the threshold cannot be read off the rail itself, while the peak is already visible as a notch.
One tile shows the map on the main screen, if route recording is on. Its corner carries the same buttons as the full map: "+", "−" and "fit track". The tile never moves the camera during a ride — the route grows, the map stays where your hand left it.
Several readings in one tile#
Related readings — three temperatures, the battery currents, the cells — can share a single tile. The tile's own screen is where they are added; how many fit is worked out from the tile's size and look, and the list only offers the ones that still do. A unit shared by all of them moves into the tile's header instead of repeating on every row.
Those rows are drawn as bars, as charts or as columns, chosen where any other tile's look is.
A reading's own screen#
Tapping a tile opens the reading in full: the value now, the minimum, average and maximum of the ride, the margin to the nearest threshold, and a chart you can run a cursor along. Next to the name sits a question mark — tapping it opens a short hint: what the reading is, where it comes from, and, for the computed ones, how it is calculated. Two fingers zoom it with a pinch and pan it along time, as on the ride charts screen. For riding readings — speed, PWM, currents, power, angles — the average counts only the time on the move, as in the ride history. The chart's scale is built from the whole ride and does not jump when you zoom into or pan a stretch. Below it is the list of that reading's thresholds — each one leads into its alert, and "Add threshold" opens a new alert with the reading already filled in.
Quick actions#
A dot floats over the dashboard; tapping it grows the quick actions panel. What appears there depends on the wheel:
- low beam,
- high beam,
- automatic light,
- horn,
- the parking guard, if its plugin is running on the wheel,
- the wheel's settings profile,
- reset peaks,
- reset the wheel's trip, where the wheel can do it.
Which light buttons you get is decided by brand and model, because the commands differ between wheels. Reset peaks is always there: it writes nothing to the wheel and does not depend on the brand.
The guard button appears only while the wheel is actually running the guard plugin — not merely because the plugin sits in the app, and never during dump playback. Its state follows the wheel's own frames rather than your tap: the firmware refuses arming outside parking without a word, and a button that lit up by itself would be lying. One tap arms it, another disarms it from any level. Android and the iPhone send the same command.
The panel closes only when you tap outside it or tap its dot. Pressing its buttons does not close it, and it does not hide on a timer: light, horn and profile can be switched one after another without opening it again.
Long press#
The two things most often wanted on the move work without opening the panel:
- Hold the dot to toggle the light. The panel does not open. It is the same one-button light as on the widget and the watch: on LeaperKim, NOSFET and KingSong it switches the headlight on and off, on Begode it steps through three modes in a circle (the third is strobe on the wheels that have one), on InMotion it toggles the low beam. The high beam on dual-beam wheels stays in the panel. On Android the wheel does not report its current light state, so the first hold may repeat the mode already on; hold once more then.
- Hold the profile in the panel to open the wheel settings. A plain tap still picks a profile.
The answer is a vibration, so you do not have to look: a short tick means the command went out, a "reject" buzz means there is nowhere to send it (no connection to the wheel; the dot is outlined in red then). The dot flashes with the same meaning: accent colour or red.
Horn#
One tap is one horn, with no confirmation. If nobody heard the first one, the second is right there: the panel stays open. It is the same command as the horn button on the widget, and the same on Android and iPhone.
The button appears only on wheels whose command is confirmed:
- Begode and KingSong;
- InMotion V9, V11Y, V12 and V12S, and the V11 on main board firmware 1.4 or later. The V13, V14 and P6 have none: the sources disagree on the bytes;
- the older InMotion V5, V8 and V10, once the wheel has reported its model;
- LeaperKim and NOSFET, except the Sherman, Sherman Max, Abrams and Sherman S, whose firmware has no handler for the command.
LeaperKim and NOSFET have no horn command of their own. The button sends a command that changes nothing on the wheel, counting on the beep the wheel gives when it accepts a command. Whether it actually beeps has not yet been checked on a real wheel.
With no connection, in the demo and while a dump plays back there is no horn button: there is nothing to send it to.
Automatic light#
The light comes on by itself once the wheel goes faster than a threshold you set. There are three ways to turn it back off, and exactly one is in effect:
- by speed — you drop below the threshold and the light goes off;
- by inactivity — the wheel has been standing still longer than the delay;
- by pedal angle — the pedals tilt past the threshold, 45° by default.
The third one differs from the other two in that it watches the wheel's pose rather than its motion. Picked up by the handle, laid on its side, put on its stand — the pedals go far past any riding tilt and the light goes off. Speed and timers are no help there: a wheel carried in your hand sways, and every sway restarts the inactivity delay.
The angle counts by absolute value, so tilting forwards and backwards work the same. Roll is ignored: that is a turn, and a turn is where the light is needed most.
Not every wheel reports a pedal angle — LeaperKim and Inmotion do. On the rest the option is unavailable, which is more honest than offering a mode that could never fire. And if a wheel reports no angle while the mode is somehow selected, the light stays on: turning it off blind is worse than not turning it off.
Session summary#
A separate row sums up the current session: top speed, average speed, peak PWM, battery used, distance and duration. It is the quickest way to compare two climbs or two launches without opening the ride history.
Reset peaks#
There are two ways in — "Reset peaks" in the header menu and the button of the same name in the quick actions panel. It is one action, and it has one confirmation: whichever way you call it, the app asks first. It clears the session maxima: the peak markers on the instruments and any scale stretched to fit a record go back to their usual values. Ride history is left alone — the recording still holds everything that actually happened. This helps when one ride is really several: you ride to the spot, and what you came for starts there, and you want to measure it from a clean slate.
Resetting the wheel's trip#
The wheel counts the distance it covers on its own, and after a charge it is useful to zero that counter to see how far you have gone on a full pack. This used to mean opening the brand's own app; the quick actions panel now has a "Reset the wheel's trip" button.
This is not the peak reset above. Peaks live in the phone, while this counter lives inside the wheel, and the button writes a command into it. Ride history and the peaks on screen stay as they are, and the app asks for confirmation first, because the write cannot be undone.
The button is there for LeaperKim and NOSFET only — except Sherman, Sherman Max, Abrams and Sherman S, whose firmware has no handler for the command. Begode, KingSong and InMotion have no such command at all: their own apps "reset the trip" with arithmetic of their own, remembering the odometer reading at the reset and sending nothing to the wheel. On NOSFET the button works even where the vendor's own does not: that app sends only the older form of the command, which the Aero and Aeon firmware does not parse, and LoEUC sends both.
With no link to the wheel, in the demo and while a dump plays there is no button: there is nowhere to send it.
Speed correction#
If the readings disagree with another instrument, Settings, Speed & accuracy has a speed correction. It is a percentage: a hundred means no change, a hundred and ten means show ten percent more. The correction changes only what you see and never touches the wheel.
The value is set to a tenth of a percent. A whole percent at forty km/h is 0.4 km/h — a
step bigger than the error you are trying to remove. The slider stays a coarse tool, and the
tenths come from the −0.1 and +0.1 buttons beside the figure: a tenth of a percent cannot
be caught with a finger on a slider track, and pretending otherwise promises a precision the
gesture does not have.
If you had already set a correction, your value carries over untouched — an old 96% reads as 96.0% and nothing is reset.
The correction is remembered per wheel. Odometry differs between wheels, and one value for the whole app would be wrong for both.
Speed scale maximum#
By default the app picks the speedometer ceiling itself, from battery voltage, and stretches the scale if you go faster than it. If that gets in the way, set your own maximum next to the speed correction. A ceiling you set is firm: the scale no longer stretches, and on a record the needle stops at the edge. That is the point — the needle's position always means the same thing.
The maximum is remembered per wheel too.
GPS speed#
With GPS recording on, you can put a "GPS speed" reading on the dashboard. It comes from the phone's receiver rather than from the wheel, and the speed correction is not applied to it.
When the signal goes — a tunnel, a bridge, a street of tall buildings — the reading goes blank instead of freezing at its last value. A frozen speed is more dangerous than a missing one, which is also why an alert built on it stops firing at that moment.
GPS speed calibration#
The app can work out how far off your wheel's speed reading is. It compares wheel speed against GPS speed, but only at a steady pace: acceleration and braking are left out, because the receiver answers with a lag and gets them wrong by more than the correction being looked for. A weak signal, standing still and suspicious position jumps are dropped as well.
Calibration only works with GPS recording on: while the phone's receiver is silent there is nothing to compare the wheel's speed against. Recording is turned on under Map & GPS, and it needs precise location — with the approximate one the receiver reports neither speed nor the accuracy that says whether a fix can be trusted. While recording is off, the calibration card says exactly that instead of showing progress that will never move.
The correction knows more than a multiplier#
A wheel's odometry is not wrong proportionally. Tyre circumference — wear, pressure, the firmware's own constant — gives a scale error; rounding and the cutoff at low speed give an additive one. A single percentage is right at exactly one point: tune it around town at 25 km/h and it is wrong at 70 on the open road, and the other way round.
So observations are collected per speed band, ten km/h wide, and each band gets its own error. Once at least three bands are populated and spread over at least 20 km/h, the app fits a line through them and offers a correction of two numbers — a multiplier and an offset. The card then shows how much the wheel is out at 20, 30, 45, 60 and 80 km/h: different figures in that line are exactly why one multiplier is not enough.
With too few bands, or bands sitting too close together, there is nothing to fit a line to — and the app honestly offers a single multiplier, as before. Promising a slope derived from one speed would be worse than promising nothing.
Below the speed the correction was learned at, the line is not extended: it fades linearly to zero. A standing wheel stays standing under any fit.
Dragging the correction slider by hand clears the offset: the slider sets a multiplier and knows nothing about an offset, and leaving somebody else's offset underneath it would look like a broken slider.
No suggestion appears until at least three rides and ten minutes of usable data have gone by, and until the spread inside the bands is narrow enough. The spread is measured within a band rather than across all observations at once, and that matters: inside a band the spread is noise, while between bands it is the very shape of the error we are trying to measure. Once it does, a card under Speed & accuracy offers the new value and shows what it rests on: how many rides, how many minutes and what spread. The spread is always shown — it is what tells you whether to trust the number.
Progress is visible as it happens: the minutes and rides on the card grow during the ride, and what has been gathered is saved without waiting for the ride to end — a ride cut short together with the app loses a couple of minutes rather than everything it collected.
What you have gathered travels with you. The calibration statistics sit in the ride archive alongside the rides themselves, so a new phone — including a move between Android and iPhone — does not start learning from scratch. If the new phone already holds more observations for that wheel, the arriving statistics do not overwrite them: the one with more minutes behind it stays. A "Not now" survives the move in either direction — that is your decision, and imported data does not undo it.
You apply the correction, not the app. That is deliberate: where GPS is spoofed, an automatic change would quietly corrupt both your readings and your alerts. If you do not like the suggestion, tap "Not now" and the app will not come back to it until it has gathered noticeably more data.