What changed
Newest first. Written for the people running it.
0.7.24 — 2026-08-17
- Fixed: the core names were invisible in the picker until you hovered them. On the dark map the Core dropdown drew its list as white text on a white background, so the names only showed when the mouse passed over each one. The options now carry a solid dark background, on both the map's Core picker and the core list on the plan-launch page.
- Fixed: a stray GPS reading drew long "shooting stars" across the map. Every so often the Core reports a position hundreds of feet from where it actually is. That point was plotted off in empty space, the trail drew a line out to it and back, and it dragged the whole map with it and shrank the real yard. Those jumps are now dropped before the map is drawn, so the trail stays on your property. The raw readings are untouched in the database, and a reading that was really valid still counts.
0.7.23 — 2026-08-16
- Added: the daily check-in can now be switched off. It is still on by default — it is how we catch a Yarbo firmware update that has broken installs, and it only ever sends the anonymized fields shown on the settings page — but there is now a toggle to turn it off. Off means off: nothing is sent. Added for Yarbo hardware beta testers, who should not be made to report an unreleased firmware version they are under NDA not to disclose.
- Fixed: the map no longer claims "everything merged" while showing one core. On an install tied to a single robot — the usual case — the map with nothing picked shows *that* robot, not a blend. The header still announced a merged view, though, and the core dropdown offered an "All cores" choice that did the same one-robot thing. Now the merged banner appears only when the view really is every core at once (a server not pinned to one robot), the "All cores" choice is offered only then, and the dropdown marks the core actually on screen. A tester with two cores was told his data was merged when it was not.
0.7.22 — 2026-08-16
- Added: remove a core you no longer have. Each robot on the settings page now has a "Remove this core" button that deletes it and purges everything Yardstick recorded from it — its samples, sessions and saved map. It shows how much that is and asks you to confirm first, because there is no undo. The one robot this computer is set up to record cannot be removed this way (it would just come back on the next restart); change the install for that one.
- Fixed: a docked robot is no longer reported as "off the map." The dock sits on its own pad, a few feet off the nearest mowing edge, so the boundary check read a machine on its charger as being outside its own map and raised the alarm. A robot at its dock has not escaped anything, so the check now excuses it — the same way every other alert already excuses the dock. Reported by a tester whose docked machine was told it was five feet out of bounds.
- Fixed: picking a core now filters the whole page — and works in Safari at last. The core dropdown was wired with an inline handler Safari quietly ignored, so choosing a core did nothing at all. And even where it worked, several panels — health, battery, readiness, the aerial photo and the live dot — ignored the choice and blended both machines. The dropdown is now wired properly, and every one of those panels shows the core you pick, or the one this computer records when you pick none — the same core the map is drawn for. The live dot no longer teleports between two docked cores either. Reported by two testers running more than one core.
- Fixed: the aerial photo no longer drifts out of place on a multi-core install. It was framed on the first core while the map was drawn for a different one, so the satellite image slid off the coverage — a row of bushes that belongs at the top of the plot ended up down in the middle. It now shares the map's core, so the two line up again. Reported by a tester whose aerial had wandered.
- Changed: on-screen wording is now "License," not "Licence." The American spelling throughout the setup page, the key email and the paywall, to match the rest of the product. Only what you read changed; keys, links and saved files are untouched.
0.7.21 — 2026-08-16
- Changed: the address you enter is the robot (Core) — undoing a mislabel from 0.7.20. 0.7.20 renamed the field "Data Center" and said Yardstick talks to the base station, not the robot. That was backwards. The Data Center (DC) is the home base the robot radios to; everything Yardstick connects to and records from is the Core — the robot itself. The field now reads "Robot / Core IP address" on the setup page, the first-run screen and the installer, and the yard's radio-coverage layers name the far end of that HaLow link the "home base" rather than confusing it with the address you connect to.
- Fixed: a second Yarbo no longer vanishes after a restart or update. The service names one robot on its command line, and that quietly replaced the whole list every time it started — so a second machine added in the settings page disappeared on the next restart. It now updates that one robot in place and leaves the others alone.
- Added: the installer can take just the robot's (Core) IP and find the serial. Give
./deploy/setup.sh 192.168.1.50and it reads the serial from that address instead of making you paste it — the same lookup the web "enter the address myself" screen does. And when a network scan turns up nothing (your server on a different subnet from the robot, say), it now asks for the address rather than just giving up.yardstick discover --host <ip>does the lookup on its own. - Fixed: updates no longer fail silently on a Mac with no certificates. A Python installed from python.org comes without root certificates, so every HTTPS call Yardstick makes — the update check, the licence refresh, the daily check-in — failed verification and was quietly swallowed, leaving "no updates" with no reason. Yardstick now carries its own certificate set and uses it for all of these, so they work regardless of how the machine's Python was set up.
- Fixed: the Mac installer now installs Python's certificates. When it has to fetch Python from python.org, it runs that Python's "Install Certificates" step afterwards — the one you were always meant to run — so a fresh Mac install can reach the update server from the start rather than looking dead until someone works out why.
0.7.20 — 2026-08-16
- Changed: adding a robot by hand now asks for the Data Center's IP, not the robot's. The field said "Robot IP address," but Yardstick talks to the Data Center — the base station the robot reaches over its own radio — and never to the robot directly. It now reads "Data Center (DC) IP address" and spells out which device that is, on the setup page, the first-run screen and the installer. The serial-number box is gone: it did nothing (the serial is always found from the DC), and it wrongly suggested you could search by serial.
- Changed: the "cannot get back to the dock" alert waits three minutes, not two. The homeward leg genuinely wanders — our own unit twice in one day drove about 95 ft over two minutes without closing on the dock, with the position fixed the whole time and no fault, and then docked fine a few minutes later. Two minutes cried wolf; three gives the robot room to take a winding route home before we say something is wrong.
0.7.19 — 2026-08-16
- Fixed: "Check for updates" now installs on Mac and Linux, not only Windows. On a Mac or Linux install the update button was sending the machine to the Windows installer — which cannot run there — so it reported the update was "only for Windows" and did nothing. It now uses the source self-update those installs are built for and actually updates. This was a routing bug that had been there since 0.7.15. There is now a test that runs the real update on each platform, end to end, before any release can ship, so the update button cannot break this way again without a release failing first.
- Added: a
yardstick updatecommand. One plain terminal command that updates to the newest version on your channel — the source swap on Mac and Linux, the signed installer on Windows. So there is always a supported one-liner, whatever happens, and "update by hand" never again means a command you have to be talked through.
0.7.17 — 2026-08-16
- Added: the robot shows up live on the map. A green dot marks where the robot is right now. It pulses while the robot is awake and reporting, so you can watch it move, and sits still once it goes quiet on the dock. It reads the robot's own GPS fix and places it in the same frame the map is drawn in, so it lands where the robot actually is rather than off in the odometry frame.
- Added: the map says when the aerial photo is coming. Until the robot has recorded enough of its own position to place your yard, there is no photo to show — so both the map and the Map imagery settings now say so plainly: the aerial fills in automatically after a job or two, once Yardstick can work out where the yard is, with no address to type and no pin to drop. The note on the map takes itself away the moment the photo appears.
- Fixed: the Blade Load map now reads in real amps. The robot reports its cutting-motor current in milliamps, but the map keyed it straight through as amps — so a reading of about a fifth of an amp showed up as "234 A," a hundred times what any blade actually draws. It now converts to amps, so the Blade Load layer lines up with the wheel load beside it and with the current figures on the rest of the machine. Caught by a tester who knew the walking motors only pull a few amps and rightly called the number impossible.
- Changed: the three panels under the map now match their buttons. The Health, Battery, and Table buttons open sections that are now headed with exactly those words — the health panel used to say "Robot health," and the table had no heading at all. The table also carries a one-line note saying what it is: every cell on the map, most degraded first.
- Fixed: the "Middle blade motor" light is gone. The deck has two blade motors, left and right — there is no middle one, and its health light sat permanently green for a motor that does not exist. The firmware carries the channel but never drives it (a flat zero in every sample we have), so it was only ever a source of confusion. Removed from the health panel; still recorded, in case a future head ever uses it.
- Changed: the table's column headers stay put while you scroll. On a wide table with a lot of rows the header row used to scroll off the top, leaving bare columns of numbers with no labels. The header row is now pinned in place as the rows scroll under it — the way a locked header row works in a spreadsheet. Suggested by a tester.
- Fixed: HTTPS on by default now actually works on a fresh install. The certificate library it needs was never declared as a dependency, so a clean machine quietly fell back to plain HTTP. It comes down with everything else now, so the secure address is there from the first run.
- Fixed: the Linux installer no longer stops halfway on Ubuntu. It found a usable
python3but Ubuntu ships venv support as a separate package (python3-venv), so building the environment failed part way and no service was ever installed — leaving nothing on the port and no clear reason why. The installer now checks that Python can actually build an environment, offers to install the missing venv/pip packages when it cannot, and rebuilds a half-finished environment left by an interrupted run instead of reusing one that has no pip. - Fixed: the Linux installer keeps the recorder running after you log out. A systemd user service stops at logout unless "lingering" is switched on — so a headless machine or a VM looked dead, with nothing on its port. The installer now offers to turn lingering on (asking first) instead of only mentioning it.
- Added: a daily check-in, so we can support what you're running. A licensed install now reports its version, channel, platform and basic health once a day. It never sends your coordinates, your recordings, your robot's serial, or your licence key — Settings → Software → Daily check-in shows the exact payload before you take our word for it, and the README's Privacy section spells out the whole of it.
0.7.15 — 2026-08-15
- Fixed: Check for updates now works on Windows, Mac and Linux alike. Updating from inside Yardstick works on every platform.
- Added: choose which core you are looking at. Running more than one Yarbo? The map, the Plans page and the Controller each have a core selector now, so you pick which machine you are viewing or driving. With a single machine nothing changes — the selector only appears when there is more than one to choose between.
- Added: set how long the wall display holds each machine. The television view rotates between machines; Settings → Wall display now lets you set how many seconds it holds on each one before moving to the next.
0.7.14 — 2026-08-15
- Added: aerial imagery under the map. The yard map can now sit on real satellite imagery, lined up to the ground so the robot's path lands where it actually drove. It defaults to USGS imagery — public domain, free, no key, covering the United States — and turns on by itself, nothing to set up. If you are outside the US or prefer Google's imagery, Settings → Map imagery takes a free Google Maps key of your own (there's a link to get one, and it costs nothing) and lets you switch the source. A control on the map turns the imagery on and off.
- Added: Yardstick also serves over HTTPS, with its own certificate. Alongside the usual address it now answers on a second, encrypted one —
https://…on the next port up (8478 by default) — for when you want the connection secured. The certificate is self-signed and generated on the machine, for the machine, so the browser warns once that it is not from a public authority: that is expected for a device on your own network — choose Advanced and proceed, once per browser. It is on by default, so updating switches it on with nothing to configure, and the Settings page shows the secure address to use. Plain HTTP keeps working exactly as before. - Fixed: some settings saved to disk but did not take effect until a restart. Pressing Save on the settings page wrote everything to disk correctly, but the running server only refreshed a hand-picked subset of those values in memory. Anything left out of that list — and every setting added since it was written — looked like it had not saved at all: the page reloaded showing the old value, because the page reads what the server is actually using, not what is on disk. The server now applies all of them the moment you press Save.
- Fixed: the Start-a-plan command was silently ignored. Starting a saved plan sent
{"planId": ...}, but the robot's key isid— so the command did nothing, in the usual silence. Confirmed by decompiling the Yarbo app, which sendsstart_plan {"id", "percent"}. Now it sends the same. - Fixed: the wall said the wrong thing about what the robot was doing. Two problems. It always said "mowing", even with a leaf blower on the front — the verb now follows the attachment: a mower mows, a leaf blower blows, a snow blower clears snow. And it read "mowing"/"blowing" while the robot sat parked and idle, because it trusted
working_state, which only means "awake". A verb now needs real evidence — a running plan, or awake and actually moving. Parked and still with no plan reads as idle. - Added: a Plans tab. A new page lists every plan you have built in the Yarbo app — by name, with the zones each covers — and starts any one of them with a button. It leaves the dock and runs the plan exactly as the app would, with no Yarbo account and no internet. While a plan runs, the page shows which one, how far along, and time left, and offers Pause, Resume, and Stop. Building new plans stays in the Yarbo app — that needs its map editor — but running the ones you have is now here.
- Added: the controls now match whatever is bolted on. The control page reads which attachment the robot is carrying and shows only the controls that belong to it — blades and cut height for a mower, speed and head height for a leaf blower, the chute for a snow blower — and names the attachment in plain words. Nothing that would command a tool the robot is not wearing appears: a chute control on a mower is how an interface tells you nobody checked.
- Fixed: the blade controls were sending commands the robot threw away. Blade height and blade speed went out under names copied from community notes —
set_blade_heightandset_blade_speed— that this firmware does not recognise. Every press did nothing, in complete silence, so the controls looked dead. The names Yarbo's own software uses aremower_target_cmdandmower_speed_cmd; with those, blade height now moves the deck (measured on the machine: 50 → 95 mm on command). There was a second reason nothing ran: the blades only spin while the command is re-sent several times a second, so a single press could never have worked even under the right name. - Added: Blades on and off, at the speed Yarbo runs them. One button to start, one to stop — no speed slider. "On" runs the blades at about 2,800 rpm, the same speed the Yarbo app uses, held by re-sending the command five times a second the way manual driving already is. Let go of it — close the tab, lose the network, press Stop, or send the robot to its dock — and the blades stop within a couple of seconds on their own: a spinning blade must not outlive the browser holding it. There is deliberately no speed setting. What an arbitrary speed does to the motors is a guess, and running them harder than the maker does is not a guess worth shipping.
- Added: leaf blower support — speed and head height. Attach a leaf blower and the control page now runs the blower at Low, Medium, or High, and raises or lowers the head. The blower holds until you press Off, and stops on its own if the browser goes away — the same dead-man that protects the blades.
- Added: Send to dock is back, and this time it works. The robot drives itself home and charges, from a button on the map, with no Yarbo account and no internet — measured on a real machine: 4.5 m under its own power, decelerating, turning to line up, stopping 7 cm from the dock.
- Fixed: you can drive the robot off its dock now. The firmware locks the wheels while the robot is charging, so a drive command on the dock did nothing — the wheels reported zero and it sat there. The missing step is to pause charging first, and the dock is a wireless charger:
wireless_charging_cmd {"cmd": 0}pauses it (and{"cmd": 1}resumes), which releases the wheels. The drive pad now does this automatically on the first press when the robot is charging, so it simply rolls off — no more moving it by hand. Found by decompiling the Yarbo app, whose own joystick sends exactly that command when you drive off the dock.
0.7.13 — 2026-08-14
- Added: backup and restore, for moving to another computer. Settings → Storage will write everything to a file: every recording, your robots, the alert address and the app password that goes with it, the yard map and your alarm sound. Download it, or write it straight to a memory stick or a network drive — the recordings are usually too big to want going through a browser. On the other computer, choose the file and restart; it is put in place before anything opens, which is the only moment a database can safely be replaced.
- Added: Yardstick tells you when it has updated itself. Updates install quietly and the program restarts — which is right, and completely invisible. Nobody remembers which version they were on, so a line now appears on the map saying what it updated to, with a link to what changed. It says it once, and goes away when you have looked.
- Added: your licence key is shown on the Licence page. People go there to find it again — for a second computer, or because the email is long gone — and it was the one thing the page would not tell them. It is there now, with a button to copy it.
- Fixed: a four-digit port lost its last digit. The web page port read 847 instead of 8477, with the 7 hidden under the edge of the box. The field was sized for the digits and not for the arrows the browser draws inside it.
- Changed: Yardstick asks about updates once a day instead of once an hour. The hourly check was per open browser tab rather than per install, so a wall display left on a kitchen screen asked twenty-four times a day to learn nothing. Checks are also spread out at random, so a hundred machines that started together do not all ask at the same second. Pressing check in Settings still asks immediately.
- Fixed: the licence email said it could activate on a computer it cannot reach. Its button only works when the email is read on the machine running Yardstick — not a phone, not a laptop, not a server in the garage. It says so now, with the key underneath either way. Every message we send also carries the date and identity headers it was missing, which is the difference between arriving and arriving in spam.
- Changed: the email alerts guide is linked from Settings. Notifications now points at the full guide — every provider's app password, what each error means, and what to do when a work mailbox refuses to send at all.
0.7.11 — 2026-08-14
- Added: a licence runs on one computer, and you can move it yourself. When a key is activated it registers to that machine. Pasting it into a second one is refused there and then, with a link to yardstickhome.com/licence — paste the key there, press Release, and it is free to register somewhere else straight away. If the key is still on the machine you are sitting at, Settings → Licence now has a Try again button, so there is nothing to paste.
- Added: releasing a licence needs proof it is you. Releasing takes a licence off the machine somebody is using, so holding a copy of the key is not enough on its own. On the website you enter the key, we email a six-digit code to the address that bought it, and the code releases it. On the computer that holds the licence there is no code — Settings → Licence has Release this computer, and being that computer is the proof.
- Added: a support page at yardstickhome.com/support, linked from the front page — where to send diagnostics, how to move a licence, and what to do about a lost key.
- Fixed: an install that could not reach us while activating held no registration at all, which is exactly the licence that could then be shared. Every install now registers itself once a day as well as at activation. Being unable to reach us still never blocks an activation — our outage must not become yours.
- Fixed: "Registered to this computer" could take a day to appear. The signed list of licences was only fetched daily, so the one line telling somebody to release a key before moving machines showed up long after they needed it. An install with a key it cannot yet account for now checks every few minutes, and goes back to daily once it is settled.
- Fixed: the licence email over-promised. Its Activate button only works on the computer that runs Yardstick, which for anyone reading mail on a phone — or running Yardstick on a server or a NAS — it never could. It says so now, and points at the key to paste instead.
- Fixed: a licence that never expires said "your subscription renews every year." Keys issued to testers and staff do not renew and never lapse, and the email now says that instead.
- Changed: the company name is written properly — North Lakes Consulting LLC, not Northlake, everywhere it appears.
0.7.10 — 2026-08-14
- Added: Yardstick is becoming a paid product, and this build is where that starts. There is a Licence section in Settings showing what state your copy is in, a 30-day trial that begins the first time it runs, and prices. Nothing is limited during the trial, and subscriptions are not open yet.
- Added: the settings page has been rebuilt. It was one long column of twelve cards, and a tester with a legitimate question could not find the answer in it. Now there is a list down the left — Your Yarbo, Recording, Storage, Alerts, Notifications, Manual control, Access and login, Wall display, Licence, Software and help — and each screen holds one subject. Every setting is a title, one line saying what it does, and a switch; the full explanation is still there, one click down, because for most of these settings that text is the only documentation there is.
- Added: the wall display says which zone it is cutting. Under the square footage it now reads "Currently in Zone 1 and 2", using the names from your own yard map. Blank while it drives between areas.
- Fixed: alert email to Gmail always failed, and said nothing useful about why. Google refuses ordinary passwords for mail and wants a 16-character app password. That was written on the page, inside a collapsed section, which is not where somebody looks when a thing has just failed. The error now explains it in words, with the address to create one, and covers Outlook's SMTP AUTH being switched off by an administrator as well.
- Changed: reporting a problem no longer goes through GitHub. It opens an email to [email protected] with the diagnostic report already on your clipboard. The old route needed a GitHub account, was public, and truncated the report to fit in a web address — the end of the log, which is the part worth reading.
0.7.9 — 2026-08-12
- Fixed: left and right were reversed on the drive pad. Pressing left turned the machine right. The sign convention was taken from the documented one rather than from a robot, and the robot disagrees.
- Fixed: a docked robot could never be driven off the dock. Driving was refused outright while charging — reverse included — so the only way off was the direction that was blocked, and the message told you to take it off the dock first. Charging is now something the page mentions rather than something it enforces, which also matters for anyone charging from a wall socket rather than a dock.
- Fixed: the machine stopped every time the network hiccupped. The wheels only turned while the browser kept re-posting every fifth of a second, so a wifi stutter, a busy laptop or a phone throttling its timers stopped the robot. The velocity is now held and re-sent by the recorder itself. The dead-man is unchanged: let go of the button, close the page or lose the connection and it still stops within a second.
- Fixed: the reason a control was refused was hidden while you held a button — the one moment you would be looking for it. Press and hold, wonder why nothing is happening, and the explanation was suppressed until you let go.
- Removed: Send to dock. It was published to a real machine eighteen times in one evening without a single acknowledgement or an inch of movement, so it was taken out rather than left to fail in silence. *(That diagnosis was wrong — see the entry above. The command works; the payload we sent did not.)*
0.7.8 — 2026-08-12
- Updates now come from yardstickhome.com. They used to be fetched from GitHub, which stopped answering when the account behind it was locked — every installed copy went from "up to date" to a silent failure, with no way to be told a new address by a build it could not download. Updates now come from our own host.
0.7.7 — 2026-08-12
- Fixed: three health indicators were permanently red and always wrong. DNS, Cloud broker and NTRIP corrections each showed as failing on every install, on every day. Across 737 samples not one of them has ever reported anything but zero — and the corrections that "NTRIP corrections" called failing were arriving less than a second old and holding a fixed RTK position 99.4% of the time. A service cannot be down while you are visibly using it. The fields are simply not filled in by this firmware, and a zero from a field nobody writes is not a fault. All three are gone, along with "LTE signal", which always read 0 dBm for the same reason.
0.7.6 — 2026-08-11
- Fixed: saving the settings page could delete a second robot. The page posts back the copy of the settings it loaded with. Opened before a second machine was added and saved afterwards, it wrote that older one-robot list over the stored one and the second robot was gone from the settings, the wall and the alerts. It carried on recording throughout — the recorder was already running, and its samples are filed under the robot's own serial — so it still appeared in the map's filter list, which is what made this look like a display fault rather than a deletion. Reported by a tester whose wall "used to rotate between the two". The robot list is no longer something that form can write; robots are added by their own route, which changes one and touches nothing else.
0.7.5 — 2026-08-11
- Fixed: the settings page came apart in Safari. Cards were scattered down the page at unrelated heights with whole columns left empty, so sections — "Where alerts go" and "Who can open this" among them — ended up so far from where anyone would look that they read as missing. They were always being sent to the browser; Safari simply could not lay out the CSS multi-column layout they sat in. Chrome and Edge were unaffected, which is why it lasted this long.
0.7.4 — 2026-08-11
- Fixed: "Cannot get back to the dock" fired while the robot was turning round. A job ends where the last stripe ended, usually pointing the wrong way, and the machine then turns, works out a route and sets off. From the far end of a property that first stretch need not get any closer to the dock in a straight line — it is driving, which this alert takes as proof it is trying, and gaining nothing, which it read as failing. So it fired 142 seconds into the leg, the first instant it possibly could.
0.7.3 — 2026-08-11
- Fixed: a new install found the robot and then recorded nothing. Setting up through the new welcome screen saved the robot, connected to it, fetched the yard outline and reported itself as connected — but never actually started recording, so the map went on saying "no georeferenced samples found yet" indefinitely. Introduced in 0.7.2 with the welcome screen; installs set up before that were unaffected. If you hit it, updating is enough — the robot you already chose starts recording on its own.
0.7.1 — 2026-08-11
- The documentation says so too. The README stated flatly that there is no login, which stopped being true with this release. It now says both halves: what leaving the default alone means, and what switching a login on gets you — along with the limit, which is that a password over plain HTTP defends against a guessed password and not against anyone who can watch the network. The startup banner no longer announces "no authentication" at an install that has just switched one on.
- An optional login, with an optional authenticator app. Off by default and staying that way: a fresh install behaves exactly as before, and an existing one updating is not suddenly asked for a password it was never given. Switch it on under Settings, choose a username and password there, and add a second factor if you want one.
- The wall display is exempt. A television has a remote rather than a keyboard, and what that screen shows is the machine's state — never the map, the coordinates, the settings, or anything that can move it. There is a switch to lock it too, for a screen that faces somewhere public.
- Forgotten it?
yardstick reset-loginon the machine itself clears the username, password and second factor. It grants nothing new — anybody with a shell there can already read the recordings — it just means a lost password is not a lost install. It restarts the service as part of doing so, because the running copy holds its own settings and would otherwise keep asking for the password and write the old one back at the next save. - Signing out. A session lasts twelve hours, so without a way to end it the only way off a shared computer was to wait. Sign out sits in the top right beside Settings, where people look for it, and also on the settings page itself. It ends that browser's session and nothing else.
- Fresh recovery codes on demand. The stored ones are hashed and cannot be read back, so losing the paper had no remedy short of re-enrolling the app.
- The enrolment code is a picture you scan. That needed a QR encoder, and this project ships no dependencies, so there is one now — about three hundred lines of standard library.
- The README now states plainly that nothing is protected. It was mentioned in the privacy notes as two bullets about the map having no password and not port-forwarding it, which understates it. Only manual control can be guarded, and only if a password is set — which it is not by default. Everything else answers anyone who can open the port: the settings page, the maintenance actions that delete recordings, and the one that starts a software update.
- "PC" is now "computer" where it means the machine running Yardstick. It runs on Windows, on a Mac and on a headless Linux box, and calling the host a PC in the setup page, the discovery help and the storage estimate quietly told two thirds of users the text was not about them. The phrase stays where it is genuinely Windows — the "Windows protected your PC" dialog, and the sleep warning in the Windows install section.
- A morning of watching a real robot, and everything it turned up. All of this came from one machine having a bad day while somebody stood over it — not from replaying recordings, which had already been done and had found none of it.
- It now notices when the robot leaves its own map. A machine drove nine feet past the edge of the map it carries, stopped, reported a planning fault and then cleared it, and sat outside the boundary for fourteen minutes. Leaving the map was the cause; everything else was a consequence.
- Off the map raises at once, with no dwell. Every other rule waits to be sure; a machine heading off the property at half a metre a second covers ten metres while a twenty-second dwell makes up its mind. Certainty comes instead from believing the position only on a fixed RTK solution — a float fix can be a metre out, which is the same size as the thing being measured.
- "Stuck" now has to mean stuck. The flag is momentary — all fifteen spells of it in the recording lasted under ten seconds, and the longest was a single sample — but the rule fired on the first one, so a morning of the machine catching and freeing itself woke somebody nine times in ten minutes while it carried on working. It now waits five minutes, which is longer than any blip ever recorded and short of anything that could be called free.
- And when the alarm does sound, an uploaded file now keeps sounding.
looponly keeps a *playing* element going — it does nothing if the first play was refused for autoplay, if the element stalled, or if an error dropped it. The repeat check askedif (customSound()) return, treating "a sound exists" as "a sound is playing", and building a fresh element as a side effect of the question. The result was a siren that went quiet and stayed quiet on a screen nobody is standing in front of. It now checks whether the file is actually running and starts it again if not. - A field was trusted for its name rather than its behaviour. The
stuckrule fired the moment the flag went up, and its description said "cannot free itself" — which the flag has never meant on a real machine. Fifteen spells of it across three days, every one under ten seconds, longest a single sample. It means *I hit something*, and the robot drives on. This is the same mistake asplan_state = 3being read as "paused" while the machine drove down the driveway at 1.1 mph. Both rules were written from what a field is called. - And a fix shipped without checking what it set off. The rule added to *quieten* the stuck noise was filed as a warning, and the wall display sounds its alarm on warnings as well as criticals — so it replaced one siren with another, about a robot that was mowing perfectly well.
0.7.0 — 2026-08-11
- The robot stopped 330 ft out and nothing was said for eleven minutes. Reported live: the machine halted, the Yarbo app showed *Track Slippage*, the speed read 0.0 mph, and neither an alert nor the wall display mentioned it.
- A fresh install now says what it is. A beta tester installed this on a Mac, saw a complete-looking map of his own property with nothing on it, and reasonably concluded it did not work.
- Tells you when the robot cannot get back to its dock. A Yarbo finished a job eighty feet from the barn charger and took ten and a half minutes to cover it, stopping and reversing the whole way. Nothing failed: no error code, no stuck flag, the machine reporting itself as working throughout. Yardstick recorded every second of it and showed none of it.
- Trouble now shows on the map, and every row leads to a place. The list says things like *"a 15 ft patch about 791 ft north of the dock rarely gets a strong signal lock"*, which nobody can turn into a location by looking at their yard. Clicking any row centres the map on the spot, zooms in and drops a crosshair on it. Clicking the map puts the crosshair away again. The coordinates were already in the payload and had never been used for anything.
- The wall display no longer says PAUSED while the robot is driving. It was reporting the machine's own
plan_stateof 3, which this project has called "paused" since the display was written. It is not a pause: across two days, every one of the sixteen spells spent in state 3 had the wheels turning between 90% and 99% of the time — one of them a 320 ft run from the dock to the first mowing area. It means "not executing the mowing plan", which mostly means going somewhere. - Trouble spots were drawn in the wrong coordinate frame. The map measures east and north from the south-west corner of the data; the trouble-spot code measured from the *first row* of its own query. On this property that is 50 m east and 101 m north apart, on a map only 73 m wide — so a crosshair landed well off the side of the yard. There is now a single origin, taken across the whole recording rather than the rows in view, because a date filter would otherwise move it and drag every marker along.
- Markers grew with the zoom. They sit in the group that scales with the map, so at 5x a 13-pixel ring became a 65-pixel target sprawling across the yard. They are now placed at their spot and scaled back by the same factor.
- Three CSS variables were used that nothing defined.
var(--gold)appeared in ten places and has never existed — the name is--accent— along with--lineand--line-2. Two predate this release. A misspelt custom property throws nothing, warns nothing and fails no test that checks markup; it falls back to the initial value, which forstrokeis *none* and forfillis *black*. The selected robot's pill had been drawing near-black text on a near-black background since it was written, and of three new navigation icons one drew in black on a black bar and two did not draw at all. Every page is now checked for variables it uses but does not define, in both themes. - The links to the other views were easy to miss. Drive, Wall display and Settings & storage were 13px muted grey — the same weight as a date chip — on a page carrying a map, tiles, alerts and a table, and they are the only route to the drive pad and the television view. They now have full-contrast text, solid glass, a larger tap target and an icon apiece, drawn as inline SVG because this page has to work from a phone on a network with no route out. Still quieter than an alert, which stays the loudest thing on the page.
0.6.25 — 2026-08-11
- Look at one day, or one week, instead of everything at once.
- Also: this file. Every release from 0.5.2 on is written up below, and the suite now refuses to pass without an entry for the version in the code, so a release cannot reach anybody undocumented. The notes on each GitHub release are taken from this file rather than written separately, because two accounts of the same release drift.
0.6.23 — 2026-08-10
- A wall display noticed it was running yesterday's page.
0.6.20 — 2026-08-10
- One recorder per database, enforced by the operating system.
- The alarm sound you chose stopped being chosen. *Send a test alarm* played your uploaded MP3 the first time and the built-in beep every time after. The audio element was created once and marked broken on any error, permanently — and stopping an alarm rewinds it, which throws while it is still loading. One hiccup and every later alarm was the beep, silently. It now falls back for the alarm in hand and forgets, rebuilding next time.
0.6.18 — 2026-08-10
- The "Report it on GitHub" button had never worked, and would have leaked.
0.6.17 — 2026-08-10
- macOS install confirmed working end to end, on a real Mac rather than reasoned about.
0.6.16 — 2026-08-10
- Say why no robot was found on a Mac. "No Yarbo found" is fine on Linux and close to useless on macOS, where the most likely cause is a permission dialog you have not answered. It now names that first, with where to switch it on, then the two ordinary causes, then how to skip discovery by passing the address and serial.
0.6.15 — 2026-08-10
- One command sets up a Mac or a Linux box.
0.6.14 — 2026-08-10
- One command to set a Mac up, and a useful error if not. Installing on a Mac by following the steps in order produced
ERROR: File "setup.py" or "setup.cfg" not found, which is true and explains nothing. The real cause is that macOS ships Python 3.9: too old for this, and carrying a pip too old to install a project that has nosetup.py. The version check existed but ran afterwards, so the confusing message came first and the useful one second.
0.6.13 — 2026-08-10
- Typing a name no longer fights the page.
0.6.12 — 2026-08-10
- Documentation that matches the software. Four things the README claimed that had stopped being true, found by checking its assertions against the code.
0.6.11 — 2026-08-10
- A way back off a testing build.
0.6.10 — 2026-08-10
- Stop waiting five minutes for the CDN. Manifests are served with a five-minute cache, so a release that had already been promoted stayed invisible and pressing *Check for updates* again changed nothing. The check now defeats the cache, so a promoted release is visible immediately.
0.6.9 — 2026-08-10
- The channel switch actually switches. Selecting Testing saved the setting and then reported no update. A copy of the stable manifest URL was sitting in
update_manifest_url, and that field wins by design — so the channel changed and where it looked did not. A pinned copy of one of the two channel URLs is now treated as the leftover it is.
0.6.8 — 2026-08-10
- A source install can update itself. Mac and Linux copies are git checkouts, and now update from the same button Windows uses: pull, reinstall, restart.
0.6.6 — 2026-08-10
- macOS support. A launchd user agent and an installer for it, so a Mac runs the recorder at login rather than in a terminal somebody has to leave open. Same shape as the Linux install: discovers the robot, fills in the paths, needs no root.
0.6.3 — 2026-08-10
- A wall display worth looking at. Four tiles stretched across a television left the numbers stranded in tall empty boxes with a dead third at the bottom. Six tiles in two rows fills the screen, and the two extra readings — area cut so far against the job's size, and how long it has been running — are ones people actually want.
0.6.2 — 2026-08-10
- Say plainly what Yarbo does not allow. Three things get asked about repeatedly and none is missing work on this side: cameras are not reachable on the local network, the yard map can be read but not written back, and the attachment's current settings are not published at all — so the control page can set a cut height but cannot show you the one in force.
0.6.1 — 2026-08-10
- Updates that say when they are done. An update looked as though nothing had happened: the page waited for the server to answer and then reloaded, but the old copy is usually still serving when the first poll lands, so it reloaded into the version it started on. It now waits for the reported version to change, says what it is waiting for, and gives up with an explanation after four minutes rather than spinning.
- Manual control now ships on. A control centre whose controls have to be found and switched on first is a poor greeting. With no password set, anything that can reach the port can drive the machine — the password field is there for anyone who wants it, and the safety properties are unchanged: control is taken deliberately, a charging robot will not move, and the dead-man stops it when the browser goes quiet.
0.6.0 — 2026-08-10
- Alerts, wall display and manual control. The release that turned a recorder into something you watch.
- Alerts. Nine rules over what the robot already records, each switchable, each dwell time chosen by replaying real recordings rather than invented. The one that matters is *stopped in the yard*: a Yarbo that loses its RTK fix stops with
stuckat zero, no error code and a plan still reading as running, so nothing else notices. Replaying a real day gives twelve alerts in twenty-eight hours, every one a real event. - Wall display at
/wallfor a television: progress, speed, battery and time left in type readable across a room, rotating between machines and holding on whichever needs attention. Alarms fill the screen with a repeating sound and a Dismiss button sized for a remote. Built-in beep by default, or upload an MP3, OGG or WAV — validated by header, not by extension. - Manual control at
/control. Hold-to-move with a 0.7-second dead-man stop, refusing to drive while charging or with the stop button pressed. Controls follow the attachment using Yarbo's own compatibility table, so a mower does not offer chute angle.
0.5.2 — 2026-08-09
- Let the update helper run on battery too. The service task had been fixed for this and the update's own helper task had not, one layer down, so an update could do everything it promised and change nothing: it checked, downloaded, verified the checksum, wrote the helper and scheduled it — and then Windows quietly declined to start that helper, because
schtaskshad set *start only on AC power* on it as well. No installer ran, no files changed, no log was written. From the outside the update simply did not happen.