GitHub

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

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.InfiniteList virtual-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

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-case self.categories list with category property 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 --coverage flag to test_runner.py for collecting per-file line coverage
  • Add make build-mpos-unix-coverage target
  • 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

New Contributors

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

New Contributors

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

Read the original on github.com ↗