0.17.3
Board Support:
- WebAssembly: expose WebExpander (= simulated Fri3d expander) through mpos.io_expander like on fri3d_2026 board by @DrSkunk
Builtin Apps:
- AppStore: apply dropdown filter when adding to list so apps don't show up unnecessarily (less glitchy)
Frameworks:
- View: fix two LVGL memory leaks in activity navigation by @fdb
What's Changed
- dj_addon: remove version check by @bertouttier in #252
- Appstore improve loading by @ThomasFarstrike in #253
- Add mpos module import and initialize io_expander in linux.py by @DrSkunk in #250
- Fix two LVGL memory leaks in activity navigation by @fdb in #247
Full Changelog: 0.17.2...0.17.3
0.17.2
Builtin Apps:
- AppStore: fix "Update N Apps" button and "Updates (0)" dropdown behavior when opened before the background update check has run
Full Changelog: 0.17.1...0.17.2
0.17.1
Builtin Apps:
- AppStore: fix 'Update' button in app detail activity
- AppStore: improve 'Update N Apps' button behavior
Frameworks:
- View: fix crash when navigating back from an app launched via notification drawer
0.17.0
Board Support:
- Fri3d 2026: update CH32 firmware to 2.0.3 which fixes issue with 2 consecutive i2c register writes (fixes #224)
- Adapt freenove_esp32s3_display, fri3d_2024, fri3d_2026, lilygo_t4, lilygo_t_hmi, matouch_esp32_s3_spi_ips_2_8_with_camera_ov3660 and squixl to SDCardManager API changes
Builtin Apps:
- AppStore: add new 'Installed' category and show it by default (or 'All' if there are no apps installed)
- AppStore: fix double update check (when network established + some time after boot)
- OSUpdate: fix double update check (when network established + some time after boot)
- OSUpdate: randomly select between update mirrors (updates.micropythonos.com and updates.micropythonos.org) for redundancy
- OSUpdate: if wifi is connected but update check fails (due to server error, for example) don't go into 'Waiting for WiFi' state
Frameworks:
- AudioManager: fix buzzer buzzing along when PWM instance is created and fix clicking sound on PWM init (#233) by @cheops
- DownloadManager: resumption offset after connection loss that could prevent over-the-air update (ESP_ERR_OTA_VALIDATE_FAILED) if wifi was lost during update download
- InputManager: add back screen and drawer menu disable/enable APIs so apps receive those keys as regular lv.KEY.ESC / lv.KEY.HOME press
- InfiniteList: add new
mpos.ui.InfiniteListvirtual-scrolling list widget that only renders visible items, keeping memory and render cost bounded even with thousands of entries - SDCardManager: integrate 'sdcard' module functionality and cleanup legacy module
- Focus: add_focus_highlight with mode='bg' now defaults to 100% background opacity, was 30%
- Focus: bg-mode focus handler now scrolls the focused widget into view (matching the border-mode handler)
OS:
- Optimize status bar clock to reduce allocations from ~4.5 KB/s to ~224 B/s (#244) by @fdb
- SPI: expose Device.lock()/unlock() for shared-bus arbitration between multiple drivers
- SPI: fix MicroPython's ESP32 SPI driver DMA failures due to incorrect txdata/rxdata flags
- WiFi: set default country code to Japan instead of World to support channel 12, 13 and 14 (including active scan, meaning hidden SSIDs)
What's Changed
- Audiomanager pwm by @cheops in #233
- scripts/mpos_controller: give the serial port to mpremote by @fdb in #226
- Sdcard api rework by @ThomasFarstrike in #232
- DJ Addon: LED's herstellen en bundle_apps.sh robuuster maken by @lepirlouit in #243
- Status bar clock: stop allocating kilobytes per second by @fdb in #244
- mpos_controller: accept CRLF sentinel endings in read_until by @fdb in #227
New Contributors
- @cheops made their first contribution in #233
- @fdb made their first contribution in #226
- @lepirlouit made their first contribution in #243
Full Changelog: 0.16.1...0.17.0
0.16.1
Board Support:
- Linux and WebAssembly: initialize mock IMU sensor if no real IMU sensor is present
- Fri3d 2026: increase LoRa SPI frequency from 500 kHz to 16 Mhz to speed up transfers and reduce bus collisions
Builtin Apps:
- AppStore: add special 'Updates' category, opened by default when update notification is pressed
- AppStore: add app ratings support
- AppStore: make app version and description focusable so they can be scrolled using arrow keys
- OSUpdate: improve update progress UI
OS:
- Add simple way to force DeviceInfo.hardware_id, skip board detection, and customize hardware board initialization #215
- App class: support multiple categories in MANIFEST.JSON (
'categories'array), normalize to title-caseself.categorieslist withcategoryproperty for backward compatibility - Fix WiFi network switch not actually changing network — disconnect from current network before connecting to new one #220
- Focus restoration fix: navigating back now correctly restores the previously focused widget
- sdl_keyboard: fix CTRL-C and CTRL-V on textarea
- aiowebsocket: reduce reconnect frequency to reduce performance impact
- Tweak TaskHandler's period from 1ms to 2ms to improve asyncio performance at the cost of slightly increased callback latency
- micropython-nostr: log background relay connection failures at INFO instead of ERROR to avoid REPL pollution breaking file transfers
Development:
- Add Python-level line coverage via sys.settrace (mpcov build variant)
- Add
--coverageflag to test_runner.py for collecting per-file line coverage - Add
make build-mpos-unix-coveragetarget - Add HTML coverage report with expandable inline source (scripts/coverage_report.py)
- Add scripts/coverage.sh for automated coverage runs with clustered/partial test support
- Add scripts/cyclonatic_complexity.sh for per-function cyclomatic complexity reports
- build_mpos.sh: restore @micropython.native/@micropython.viper decorators after desktop/web builds (via EXIT trap) so local builds no longer leave the working tree modified
- WAVStream: refactor play() to reduce cyclomatic complexity (69→42) by extracting read_decode_chunk() and play_desktop()
Merged pull requests
- Add web and desktop audio support by @DrSkunk in #212
- Add caching to ci/cd by @DrSkunk in #218
- build_mpos.sh: restore native/viper decorators after desktop builds by @bitcoin3us in #219
- Bundle sample data in web builds by @DrSkunk in #217
- lora/sx1262: fix intermittent false negatives and hangs on shared SPI bus by @steemandavid in #222
- Add Sensor mocking for web build by @DrSkunk in #228
New Contributors
- @steemandavid made their first contribution in #222
Full Changelog: 0.16.0...0.16.1
0.16.0
Builtin Apps:
- AppStore: add category filter
- AppStore: add 'Work in Progress' filter
- AppStore: hide work_in_progress apps by default (toggle with setting)
- AppStore: ignore punctuation when alphabetically sorting apps
- AppStore: report app install to BadgeHub report/install API for statistics
- AppStore: optimize icon display and add blurhash support
- AppStore: show 'Loading details...' instead of 'Unknown' while loading app details
- OSUpdate: make long changelog scrollable with arrow keys
Frameworks:
- App: don't search for local icons if app isn't installed locally to reduce storage access time
- AppManager: cleanup /prefs/appfullname and /cache/appfullname when uninstalling app
- DownloadManager: add post_url() for HTTP POST requests (needed for BadgeHub report/install API call)
- DownloadManager: reduce log level of missing Content-Length from warning to info to avoid polluting REPL
OS:
- aiowebsocket: add exponential reconnect backoff so unreachable relays stop exhausting the thread pool (#191) by @jnuyens
- async_dns: resolve .local domains synchronously on desktop because mDNS is not thread safe
Merged pull requests
- mirror led index by @DrSkunk in #200
- fix(nostr): exponential reconnect backoff so unreachable relays stop exhausting the thread pool (#191) by @jnuyens in #201
- LightsManager fix for Freenove ESP32-S3 by @scott-macg in #204
- Appstore blurhash by @ThomasFarstrike in #203
- Appstore badgehub report install by @ThomasFarstrike in #205
- AppStore: prioritize visible icons and simplify lazy icon queue by @ThomasFarstrike in #206
- Appstore filter by @ThomasFarstrike in #208
New Contributors
- @scott-macg made their first contribution in #204
- @ThomasFarstrike made their first contribution in #203
Full Changelog: 0.15.1...0.16.0
0.15.1
Frameworks:
- LightsManager: simplify API to 'from mpos import LightsManager'
Merged pull requests
Full Changelog: 0.15.0...0.15.1
0.15.0
Board Support:
- WebAssembly: fix mobile touch input by properly converting SDL's normalized touch coordinates to actual window pixel coordinates by @DrSkunk
- WebAssembly: Add fake machine.Pin and machine peripherals for WebAssembly build by @DrSkunk
Builtin Apps:
- About: show correct netmask (thanks @lebeno !)
- About, HowTo, Launcher, WiFi Settings: migrate to add_focus_highlight()
Frameworks:
- Focus: rename add_focus_border() to add_focus_highlight(), add mode='bg' so widgets with borders can show focus via background tint instead; keep old name as compatibility wrapper
- Focus: don't clear borders when focus-nav was never active
- App: change 'no icon' log level from warning to info
- AudioManager: add find_input_by_kind() and find_output_by_kind()
- AudioManager: add find_input_by_name() and find_input_by_kind()
- InputManager: add has_haptic_feedback() class method
- Lights: re-export mpos.lights from the top-level mpos package by @tjorim
- WifiService: fix get_ipv4_netmask to get the netmask (not the address) by @lebeno
OS:
- Settings: add 'Startup sound' to mute bootup buzzer by @DrSkunk
- Settings: gate 'Startup sound' by AudioManager having a 'buzzer' output
- Settings: gate 'Haptic feedback' by InputManager having haptic feedback support
Merged pull requests
- Add setting to mute bootup sound by @DrSkunk in #187
- feat(net): cache async DNS resolutions to reuse across requests by @jnuyens in #189
- feat(tfl): run on WASM via async networking, and stream via an SD cache by @jnuyens in #190
- fix dead _webterm stdout mirror by @DrSkunk in #193
- fix get_ipv4_netmask to get the netmask (not the address) by @lebeno in #192
- Add MENU/START buttons and reset device button to web. by @DrSkunk in #194
- Re-export mpos.lights from the top-level mpos package by @tjorim in #197
- Add fake machine.Pin and machine peripherals for WebAssembly build by @DrSkunk in #198
New Contributors
Full Changelog: 0.14.2...0.15.0
0.14.2
Builtin Apps:
- AppStore: use one backend list call to check for updates instead of per-app detail fetches
Frameworks:
- NotificationManager: support emojis in notifications
- Topmenu: close notification bar when launching app from notification drawer
Full Changelog: 0.14.1...0.14.2
0.14.1
Builtin Apps:
- AppStore: improve responsiveness by skipping download of icons in list view (generate image based on SHA1 hash)
- AppStore: use new version field in BadgeHub.eu's /project-summaries
- Appstore, OSUpdate, Settings: remove redundant assets/ folder
- New MPOS-AppLogos icons by @QuasiKili
Frameworks:
- MposKeyboard: don't show NEWLINE button when the linked textarea is set_one_line(True)
- Code cleanups
OS:
- Reduce max concurrent DNS resolving threads from 4 to 2 to be on the safe side
What to do:
- To update, open the OSUpdate app and click "Update OS"
- To do a fresh install, use the webinstaller at install.MicroPythonOS.com
- As the API isn't frozen yet, if an app has an issue after the upgrade, then just update it using the AppStore