# Valetudo: what changed from 2025 to 2026 - Product: Valetudo (https://whatsnew.fyi/product/valetudo) - Vendor: Hypfer - Range: changelog entries numbered after 2025.12.0 up to and including 2026.08.0, stable releases only - Entries below: 5 releases (newest first) - Resolved: 2025 is 2025.12.0 and 2026 is 2026.08.0, the newest stable release of each major we track - Carrying security changes: 0 · CVEs mentioned: 0 · Mentioning breaking changes: 0 · Removing or deprecating something: 0 - Page: https://whatsnew.fyi/product/valetudo/compare/2025...2026 What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. ## What changed (33 changes, grouped by kind) ### Added #### 2026.08.0 (2026-08-03) - Camera streaming support for local-only vacuum robot web interface with safeguards and ethics messaging - dustsrc GStreamer source element for video capture from proprietary vendor firmware - MPEG1-based video streaming using jsmpeg library for HTTP-only transmission without WebRTC - Stylized 90s CRT-themed video renderer using WebGL to display camera feed - Dedicated camera page in the web interface with fullscreen support #### 2026.07.0 (2026-07-23) - Add map annotations feature to mark passable thresholds, curtains, ramps, and other elements the robot needs to be aware of on the map - Support segment floor material type carpet with three variants: low-pile, high-pile, and carpet #### 2026.05.0 (2026-05-22) - Expose Dock Components (Freshwater, Wastewater, Dustbin, Detergent) to Home Assistant via MQTT - Support room cleaning via MQTT starting with Home Assistant 2026.5.2 - Add WASD keyboard controls to Manual Control UI - Add ability to select between Joystick, D-Pad, or Keyboard Controls in Manual Control UI #### 2026.02.0 (2026-01-25) - Dock component status view showing individual component status for supported robots - Robot options grouped with sub-headers to improve UX on robots with large option lists - MopDockMopDryingTimeControlCapability to control mop drying time in the mop dock - AutoEmptyDockAutoEmptyDurationControlCapability to control auto empty duration of the auto empty dock - CleanRouteControlCapability with context metadata properties to handle varying vendor implementations - Support for Dreame L20 (MR813) robot #### 2026.01.0 (2025-12-29) - Support for floor materials visualization on the map ### Changed #### 2026.08.0 (2026-08-03) - Camera streaming feature is disabled by default and hidden from menus when off to avoid persuasive dark patterns - Video streaming uses HTTP instead of WebSockets for better reverse proxy compatibility #### 2026.07.0 (2026-07-23) - Update Virtual Restrictions UI to use a grouped button layout, reducing from three rows to two - Implement map annotations for Dreame robots starting with X/L40 Master/Ultra models, with thresholds available on older Dreames back to L10s Ultra - Add Midea implementation for map annotations #### 2026.05.0 (2026-05-22) - Update documentation framework from Jekyll to eleventy with improved styling and visual identity - Valetudo can now replace itself with a cloned process instead of performing full system reboot during updates #### 2026.01.0 (2025-12-29) - Replace default Roboto font with IBM Plex Sans for improved visual identity - Redesign map view icons with multiple visual elements and subtle gradients instead of flat single-color circles - Implement automatic mipmap generation and raster graphics rendering for SVG icons to improve performance - Adjust red and purple colors of virtual restrictions to better fit the map visual language - Display text on map within pill-shaped containers for improved visual consistency - Improve zoom level handling so text and icons scale more sensibly at different zoom levels ### Fixed #### 2026.07.0 (2026-07-23) - Address issue with Dreame bots not remembering segment material settings by fixing another identified culprit #### 2026.05.0 (2026-05-22) - Valetudo no longer kills itself when reaching 1/3 of system memory by instead replacing itself with a cloned process ## Release notes ### 2026.08.0 — Valetudo 2026.08.0 - Date: 2026-08-03 - Version: 2026.08.0 - Original notes: https://github.com/Hypfer/Valetudo/releases/tag/2026.08.0 - Permalink: https://whatsnew.fyi/product/valetudo/releases/2026.08.0 - **added** — Camera streaming support for local-only vacuum robot web interface with safeguards and ethics messaging - **added** — dustsrc GStreamer source element for video capture from proprietary vendor firmware - **added** — MPEG1-based video streaming using jsmpeg library for HTTP-only transmission without WebRTC - **added** — Stylized 90s CRT-themed video renderer using WebGL to display camera feed - **added** — Dedicated camera page in the web interface with fullscreen support - **changed** — Camera streaming feature is disabled by default and hidden from menus when off to avoid persuasive dark patterns - **changed** — Video streaming uses HTTP instead of WebSockets for better reverse proxy compatibility
valetudo

2026.08.0

Camera Streaming — Yes, really #### Valetudo 2026.08.0 I've put an em dash there as a jumpscare. If you didn't notice, I have bad news for you. You might've previously been exposed to AI writing without you even noticing. (These release notes are quite inline-video-heavy, so for the best experience, I recommend [reading them on github](https://github.com/Hypfer/Valetudo/releases/tag/2026.08.0).) ##### Duststreaming ###### Why (only) now? So while this always was a technically complex thing, the main blocker has always been an ethics one. Because the software works and because a good Valetudo user is a self-sufficient invisible one, in my daily grind, I - for the most part - do not get to interact with you cool people. Instead, I get to experience the absolute worst consumer smarthome tech + foss has to offer, which historically made me quite hesitant to implement a technology with as much abuse potential as camera streaming on vacuum robots. I did however eventually realize that letting this decision be guided by the most terrible of people in a sense means supporting these guys in making the world worse by stripping us of cool stuff. So I sat down and found a solution. The feature now exists, but it comes with safeguards and a lecture that strips away any sort of plausible deniability for bad behavior. I cannot stop people from being shitty, but I think I’ve managed to ensure they'll at least feel bad about it when they are. Additionally, I do believe that the messaging in there is genuinely useful and extends beyond just vacuum robots, but you tell me. You can of course also just skip it by typing skip. ###### Design notes This whole "designing for better results" doesn't stop there, though. It extends to the feature being built with non-adoption as the goal. When it is off, you will see no mention of it in the menus other than the toggle to turn it on. This avoids the classic silicon valley thing of putting something disabled in front of you to make you feel like you're missing out - just so that you're to blame when you eventually do what they've funneled you into doing. With Valetudo, not having the spycam enabled is not just an option but the default people should hopefully gravitate towards. But, when you decide to enable it, you get cool shit, which we - now that this is all out of the way - will now get into. ###### History But first: History. How do you even build camera streaming for a local-only vacuum robot webinterface on a custom proprietary vendor firmware? ###### Getting Video Well, it starts with one thing. I don't know why the allwinner non-mainline kernel kept crashing. It did however matter how hard we tried. "We" being @Vivia here, who decided to take a break from hacking on gstreamer at work to do some recreational gstreamer hacking vacation instead. The solution is `dustsrc`, which is a source element that does v4l, but just enough v4l to not scare the kernel. You can find her talk about it here: https://indico.freedesktop.org/event/11/contributions/516/ As you can see, that was 2025, so a lot of patience with me coming to terms with that ethics dilemma was involved. Thanks, Vivia! ###### Transmitting Video So that's how we got frames, but how did we get them into the UI, given that Valetudo is http only, and with that cannot do webRTC. The answer is yet again some FOSS wizardry. 13 years ago, @phoboslab (which you probably know from other cool stuff like the [quite okay image format](https://qoiformat.org/)) li _[Truncated at 4000 characters — full notes: https://github.com/Hypfer/Valetudo/releases/tag/2026.08.0]_ ### 2026.07.0 — Valetudo 2026.07.0 - Date: 2026-07-23 - Version: 2026.07.0 - Original notes: https://github.com/Hypfer/Valetudo/releases/tag/2026.07.0 - Permalink: https://whatsnew.fyi/product/valetudo/releases/2026.07.0 - **added** — Add map annotations feature to mark passable thresholds, curtains, ramps, and other elements the robot needs to be aware of on the map - **added** — Support segment floor material type carpet with three variants: low-pile, high-pile, and carpet - **changed** — Update Virtual Restrictions UI to use a grouped button layout, reducing from three rows to two - **changed** — Implement map annotations for Dreame robots starting with X/L40 Master/Ultra models, with thresholds available on older Dreames back to L10s Ultra - **changed** — Add Midea implementation for map annotations - **fixed** — Address issue with Dreame bots not remembering segment material settings by fixing another identified culprit
valetudo

2026.07.0

Map annotations, carpeted rooms and updated moderation #### Valetudo 2026.07.0 I've been using some downtime to clean up my shelf, which is basically the entirety of this release. ##### Map Annotations Map annotations are the generic concept to house any kind of "there is something on the map the robot needs to be aware of, which might not be reliably auto-determined". For example, depending on firmware support, that could be a passable threshold, a curtain, a ramp or similar. These things existing in the map make the firmware behave differently in some way relating to the location they're at. It might then take a specific path or trust its obstacle avoidance less or really anything like that. This feature took me quite a while, not because the code would've been complicated, but because the concept should be easily adaptable to the future. At least as adaptable as something can reasonably be while trying to predict the future. I again had fun designing some more custom icons, but I can't tell you more about that, because that happened 6-8 months ago and my memory of it is by now a bit fuzzy. In said predicted future, there might be more map annotations. Though, as always and consequently, I will refrain from just mirroring the vendor app verbatim. For example, Dreame has "non-passable thresholds" which, to my understanding, logically achieve the exact same as virtual walls. I can see why for UX they have them as a counterpart that exists in the same view, but also, for UX reasons, it's kinda dumb to have two different things that do exactly the same. .. or I am just missing something, but I did at least ask the support and they didn't know either. ###### What do we have? For now, on Dreame, starting with the X/L40 Master/Ultra, we have thresholds, curtains and ramps. On older Dreames going back to the L10s Ultra, we only have thresholds. Unfortunately, I have none of those things at home, so I cannot personally test those things much. I've already asked users to test the nightly build and heard back good results for thresholds and curtains, but ramps are still a big mystery. So please, let me know if those ramps (and the other annotations) work for you. What they _should_ do is: 1. For thresholds, the robot should be able to better climb them through being aware that they exist and driving accordingly 2. For curtains, the robot should be able to clean below them through ignoring the "THERE IS A SOLID WALL" info it receives from its Lidar 3. For ramps, the robot should take the designated path to reach an otherwise inaccessible area https://github.com/user-attachments/assets/162c5323-2de5-43d4-acb6-d286f980b177 I also have the Midea implementation here, however, that has not seen any testing so far, so for this release, it's only Dreame. Also, no ramps there. One thing I am not quite happy with yet are the visuals in the map. Especially the colors, but honestly everything. So if you have thoughts/ideas there, please let me know! The only thing that will for sure stay is the wavieness of the curtain. A lot of tuning went into that. ###### Virtual Restrictions UI Cleanup Since I had to implement this grouped button for the Map Annotations anyway, I've also updated the Virtual Restrictions UI to use it: Much better. Still two rows, but not three. ##### Segment Floor Material Type Carpet Staring at firmwares, I've noticed that Dreame has, for pro _[Truncated at 4000 characters — full notes: https://github.com/Hypfer/Valetudo/releases/tag/2026.07.0]_ ### 2026.05.0 — Valetudo 2026.05.0 - Date: 2026-05-22 - Version: 2026.05.0 - Original notes: https://github.com/Hypfer/Valetudo/releases/tag/2026.05.0 - Permalink: https://whatsnew.fyi/product/valetudo/releases/2026.05.0 - **added** — Expose Dock Components (Freshwater, Wastewater, Dustbin, Detergent) to Home Assistant via MQTT - **added** — Support room cleaning via MQTT starting with Home Assistant 2026.5.2 - **added** — Add WASD keyboard controls to Manual Control UI - **added** — Add ability to select between Joystick, D-Pad, or Keyboard Controls in Manual Control UI - **changed** — Update documentation framework from Jekyll to eleventy with improved styling and visual identity - **changed** — Valetudo can now replace itself with a cloned process instead of performing full system reboot during updates - **fixed** — Valetudo no longer kills itself when reaching 1/3 of system memory by instead replacing itself with a cloned process
valetudo

2026.05.0

Some stuff you may find useful, lots of prose #### Valetudo 2026.05.0 The last release notes opened with > A surprising amount of relevant things has happened since the last release. Unsurprisingly, for Valetudo features, that momentum was not kept up. But still, a lot of things happened. A lot of stuff always happens. ##### MQTT / Interfacing with Home Assistant The meat of this release is in here. ###### Dock Components As promised in the last release notes, Dock Components (Freshwater, Wastewater, Dustbin, Detergent) are now exposed to Home Assistant via MQTT (depending on your model of robot and Firmware of course). This should make for some neat new automations. ###### Room Cleaning Lately, the `vacuum` entity in Home Assistant gained the ability to start a cleanup on a selection of HA Areas. Starting with HA `2026.5.2`, thanks to @jbouwh, this can now be done via MQTT. And, starting with this Valetudo release, thanks to @jhbruhn, it can be done with Valetudo. I have slightly mixed feelings about this. I can see myself personally using this and it is objectively useful, but it also pushes Valetudo further down the stack and more into invisibility. That might possibly have negative long-term impacts, however, with my cries of "I exist" being as loud as they are, this might already be compensated for. ##### Manual Control UI/UX Improvements Why did I not add WASD controls sooner? It's the obvious thing to do, so why didn't I? It's fun! Also, as you can see, you can now just select if you want a Joystick, the D-Pad or Keyboard Controls. I remember someone asking for this at one point, because iirc their partner liked the D-Pad better or something like that? There you go. ##### Eternal life One day, I woke up and thought > Hey, doesn't fork() + exec() mean that the process clones itself and then swaps out its internals with something else? > Can you do that on yourself? Answer being > Yes, that's execve() Follow-up question being > Can I just patch my nodejs runtime to expose that to Valetudo? Answer being > Someone beat me to it. https://nodejs.org/docs/latest/api/process.html#processexecvefile-args-env NodeJS can do it since v22.15.0. Valetudo (at the time of writing) uses v22.18.0 So, if Valetudo senses that its time has come, it can now write down its last thoughts, then replace itself with a clone and just continue as if nothing ever happened. I take great joy out of building mini sci-fi horror stories. ###### But why? There are currently two use-cases for this: ###### Updater First one is the updater not doing a full system reboot. That's very nice, but might possibly expose some yet unseen side-effects. We shall see. It could easily be deactivated and rebooting was fine, but this is quicker, less disruptive, and also fun and cool. ###### Failsafe Second one being Valetudo no longer killing itself if it ever reaches 1/3 of system memory. This hasn't happened since probably at least 5-6 years, however, with the Midea bots no longer rebooting nightly, after a Month of uptime, someone found no Valetudo on their bot. Ideally, you would fix this at the root, but the root - at least as far as I can tell - is not to be found in my JS code, but might instead be in the runtime itself. Replacing yourself with an identical clone with a memory implant is thus the next best thing to a solution to issu _[Truncated at 4000 characters — full notes: https://github.com/Hypfer/Valetudo/releases/tag/2026.05.0]_ ### 2026.02.0 — Valetudo 2026.02.0 - Date: 2026-01-25 - Version: 2026.02.0 - Original notes: https://github.com/Hypfer/Valetudo/releases/tag/2026.02.0 - Permalink: https://whatsnew.fyi/product/valetudo/releases/2026.02.0 - **added** — Dock component status view showing individual component status for supported robots - **added** — Robot options grouped with sub-headers to improve UX on robots with large option lists - **added** — MopDockMopDryingTimeControlCapability to control mop drying time in the mop dock - **added** — AutoEmptyDockAutoEmptyDurationControlCapability to control auto empty duration of the auto empty dock - **added** — CleanRouteControlCapability with context metadata properties to handle varying vendor implementations - **added** — Support for Dreame L20 (MR813) robot
valetudo

2026.02.0

Features, Robots, Maintenance and everything in-between #### Valetudo 2026.02.0 A surprising amount of relevant things has happened since the last release. I'm not sure how, given the comparatively short time frame. But it did, so here's me talking about it. ##### Features As said, a ton of stuff happened, but first, let's focus on what you as a user will see. ###### Dock Components On robots that support it, the controls for the Dock have been updated with a status view for all the individual components: This starts off collapsed and only renders expanded if there is something going on. The icons are custom and were made in-house by our janitor that likes to go on long philosophical tangents. In the next release, I'd like to expose these to MQTT for even better automations. ###### Robot Options On the most recent supported robots, the list of options has grown to a size that was becoming actively harmful to the UX. Having dabbled in the vendor apps and done some market research however, it was clear that hiding everything in submenus would be worse, as those suffer from bad organic discoverability. Thus, it's now both. By grouping and introducing these sub-headers, the wall of text has been broken up into something a lot more mentally digestible. ###### New capabilities Now that we have all this new free conceptual space + the idea of "discoverability" fresh in my mind, I've turned to the quirks and found some worthy of hoisting up into their own capability. ###### MopDockMopDryingTimeControlCapability This one controls the mop drying time of the mop in the mop dock. ###### AutoEmptyDockAutoEmptyDurationControlCapability This one controls the auto empty duration of the auto empty dock. ###### CleanRouteControlCapability This one... was surprisingly hard, because of vendor behavior varying a lot more than you'd want it to for a unified capability. What might apply to "just mopping" on one vendor might be for all cleanup tasks on the other. Also, some options might be one-time toggles. Fortunately though, the very extensible concept of capabilities having properties that are context metadata did provide the solution here. ##### New Bots In the 2025.08 release notes, I wrote > Extrapolating from the current state, it is unlikely that we will see many more new Dreames being supported by Valetudo. So what is this then? Well... did you spot the two modifiers in there? "many more" and "new". While I am an ideological hardliner on principles, I'm not one on purity for the sake of purity. I do not need to shoot myself into the foot to "make a point" (usually unsuccessfully). Truth be told, the method is the same for these bots. The research does carry over. These are just low-hanging fruit we shall pick, because why wouldn't you. ###### Dreame L20 (MR813) I do not like this robot. It offends me. This definitely is in part due to residual anger and memories of people pestering me, telling me how great it is and how it is of utmost importance to be supported. _[Truncated at 4000 characters — full notes: https://github.com/Hypfer/Valetudo/releases/tag/2026.02.0]_ ### 2026.01.0 — Valetudo 2026.01.0 - Date: 2025-12-29 - Version: 2026.01.0 - Original notes: https://github.com/Hypfer/Valetudo/releases/tag/2026.01.0 - Permalink: https://whatsnew.fyi/product/valetudo/releases/2026.01.0 - **changed** — Replace default Roboto font with IBM Plex Sans for improved visual identity - **changed** — Redesign map view icons with multiple visual elements and subtle gradients instead of flat single-color circles - **changed** — Implement automatic mipmap generation and raster graphics rendering for SVG icons to improve performance - **changed** — Adjust red and purple colors of virtual restrictions to better fit the map visual language - **changed** — Display text on map within pill-shaped containers for improved visual consistency - **changed** — Improve zoom level handling so text and icons scale more sensibly at different zoom levels - **added** — Support for floor materials visualization on the map
valetudo

2026.01.0

Starting fresh into the next demi-decade #### Valetudo 2026.01.0 Kicking off 2026, Valetudo now comes with improved visuals. Don't worry, it's not YouTube. You can stop screaming. The soul is still here. I'm just iterating. ##### A new font Most central to this is the new choice of font. Replacing the default material Roboto, Valetudo now uses IBM Plex Sans. I really like that font. It is mostly Helvetica but IBM and with some twists and interesting visual features. Compared to Roboto, which is engineered to be in the background, IBM Plex Sans tells you that it exists and has something to show to you. Beside the merits of the font itself, I think out of all corps, IBM is probably the most aligned with what Valetudo is. When I think IBM, I think massive Mainframes, sturdy Thinkpads and lasting substance. Serious business that didn't bother with petty nonsense like rebranding or new logos since the early 70s. They are a corp and have skeletons in their basement for sure, but for the most part, they just do their thing, building their **I**nternational **B**usiness **M**achines and keeping the world running. A refreshing contrast to the rest of big tech, currently at the forefront of dismantling democracy, turning everything into dysfunctional gambling, just being evil and generally setting things on fire. Of course, I'm also writing this to invoke Cunningham's law and get someone to tell me about all the evil stuff IBM does, so that I can return to my cynical baseline. Anyway. I think this gives Valetudo a more distinct visual identity, which fits the maturity and spirit of the project. ##### Improved icons Being stuck sick at home and not attending 39C3, I still wanted to do something that isn't hacking vacuum robots for a change. Fortunately, I have this whole project that comes with many different hats I can wear, so I've decided to wear the design hat and take a vacation from Valetudo by working on Valetudo. The map view always felt a bit like it was built by an engineer; possibly because it was built by an engineer. Therefore, I stared at it for a while and pondered _why_ that is. 🔮 After investigating at what the vendors do and what makes their visual language tick, I noticed that my icons were just.. bland and flat. A unicolor gray circle on a gray background. So the first thing I changed was to add more visual detail. Three circles are more interesting than one circle. Additionally, I've noticed that the vendors use slight gradients to give the icons presence in the space instead of appearing like someone layered cardboard cutouts on top of something. So I did that too, and indeed it suddenly starts feeling much better. Just by looking at the comparisons, I could not tell you that there is a gradient now. It just feels.. better. So that is neat. As it should turn out however, Firefox got _very unhappy_ rendering all those gradient-filled SVGs at 60fps. I suppose that makes sense. Filling a simple shape with a single color is much less computationally expensive than calculating the color to fill with for each single pixel. It also doesn't help that the map renderer architecture is not at all following best practices on how to build performant 2d graphics. So that came with a technical detour, adding automatic mipmap generation and letting the renderer use raster graphics instead, while still keeping the visual clarity of the SVGs. While I was at it, I've also cleaned up some other performance issues. For example, also caused by the architecture, usi _[Truncated at 4000 characters — full notes: https://github.com/Hypfer/Valetudo/releases/tag/2026.01.0]_