Put unreleased changes here!
Builtin Apps:
- Bundle as compiled bytecode .mpy files to reduce build size by 60KiB and improve performance
- About: show system uptime
- HowTo app: make import lvgl as lv explicit
Frameworks:
- AppManager: try .mpy after .py and use import instead of explicit compile
- AppManager: require explicit import lvgl for clarity
- InputManager: mark emulate_focus_obj(group,o) as deprecated in favor of lv.group_focus_obj(o)
- SharedPreferences: avoid writing default-only configs at boot and prune empty config dirs/files
OS:
- Add os.path functionality like in CPython
- c_mpos/quirc: fix compilation warnings
- Simplify focusgroup handling
- Disable unused OS facilities (FreeRTOS internals, tracing, INFO logging, broken GIF, Pinyin IME, LVGL window, BMP) to reduce build size by 109KiB
- Re-enable UART REPL again BUT add esp.uart_repl(False) functionality to disable/enable it at runtime
OS:
- Synchronize with upstream https://github.com/lvgl-micropython/lvgl_micropython 14ad6ce to bring ESP-IDF: 5.4 to 5.5.1 and MicroPython: 1.25 to 1.27
- Split lvgl_micropython customizations into topic branches for easier rebasing: topic/fonts, topic/lv-conf, topic/platform, topic/error-handling
Builtin Apps:
- About: show correct next update partition instead of always using get_next_update()
- OSUpdate: restrict OTA update flip-flop target to ota_0/ota_1 instead of all ota_N partitions (via shared partition helper)
Frameworks:
- Add mpos.partitions.get_next_update_partition() helper that alternates between ota_0 and ota_1 only
- DownloadManager: add 'redact' argument to replace sensitive info with REDACTED in log output
- SettingActivity: support slider UI for integer settings
- SettingActivity: show human-readable value instead of internally used option
Board Support:
- Fri3d 2026: access expander.analog as property instead of function
OS:
- Disable the repl on hardware uart for esp32s3 targets (USB serial still works)
- Remove big, rarely used font Montserrat 34, 40 and 48 to reduce build size by 218KiB, while apps can still upscale or load fonts at runtime
Builtin Apps:
- Optimize PNGs to reduce build size by 8KiB
Frameworks:
- WebServer: tweak webREPL UI and serve gzipped HTML to reduce total build size by 60KiB
Board Support:
- Fri3d 2026: update CH32 firmware to 1.2.2 release
- Fri3d 2026: remove workarounds for CH32 firmware 1.2.1
Board Support:
- Fri3d 2026: add CH32 LCD backlight setting
- Fri3d 2026: fix virgin CH32 coprocessor firmware installation
OS:
- Patch esp-idf for to workaround sporadic SD card slowness (espressif/esp-idf/issues/16909)
Builtin Apps:
- AppStore: fallback to .zip file if no .mpk file found in filelist
- AppStore: fetch new long_description from BadgeHub details API
- Settings - Wi-Fi: don't print password on serial port
Frameworks:
- Add new GPSManager framework
- Add new IRManager framework
- Add new LoRaManager framework
- Add new DeviceManager framework
- Add mpos.ui.change_task_handler() function for improving IR timing accuracy
- AppearanceManager: fix set_light_mode() and set_primary_color()
- AppManager: support .mpk/.zip files with compression and a redundant top-level directory
- AppManager: export 'mpos' global to apps for convenience
- Camera activity: use QR symbol for QR decoding, tweak fonts
- LightsManager: allow changing number of LEDs after initialization
- SettingActivity: add
allow_deselectoption (default False) to radiobuttons - SharedPreferences: don't print potentially sensitive values on serial port
- WebServer: add basic 'View Screen' functionality to view the device's display remotely
OS:
- aioREPL: use >>> prompt (for ViperIDE)
- Drawer menu: reload apps when Launch(er) is (re)started
- Export 'lv' and 'mpos' globals to aioREPL and apps for convenience
- Compress largest fonts to reduce build size by ~208KiB
- Rename font_montserrat_28_compressed to font_montserrat_28 for uniformity
- LilyGo T-Watch S3 Plus: add support for IR Remote app TX
- LilyGo T-Watch S3 Plus: add support for UART GPS
- Fri3d 2024: add support for IR remote app (RX only)
- Fri3d 2026: add CH32 coprocessor firmware handling (credit @bertouttier)
- Fri3d 2026: add CH32 indev driver (credit @bertouttier)
- Fri3d 2026: add calibrated battery voltage measurements using CH32
Builtin Apps:
- Settings: new Audio subsection to choose default output and input device, for boards with multiple audio devices
Frameworks:
- Activity: add appFullName property
- AudioManager: load and apply configured default_output and default_input devices
- AudioManager: fix final 1-2 seconds of WAV files not being played
- AudioManager: add support for PDM microphones
- AudioManager: fix 24 and 32 bits per sample WAV support
- SensorManager: add BMA423 IMU support
- TimeZone: set Real Time Clock if present
OS:
- Fix lvgl_micropython UI hang when lv.event_handler() throws exception from timers or callbacks
- Fix notification bar hiding after swipe up in Launcher apps
- Increase default heapsize from 8MB to 16MB on desktop to fix sporadic segfault
- Fri3d 2026: don't provide unnecessary SCLK/BCLK to CJC4334 DAC
- LilyGo T-Watch S3 Plus: fix power button sporadically becoming unresponsive
- LilyGo T-Watch S3 Plus: add battery charge level support
- LilyGo T-Watch S3 Plus: add IMU accelerometer support so IMU app works
- LilyGo T-Watch S3 Plus: enable audio input (PDM microphone) and output (I2S speaker)
- LilyGo T-Watch S3 Plus: enable Real Time Clock to keep time when powered off
- LilyGo T-Watch S3 Plus: power down/up display and touch screen upon power button press
Builtin Apps:
- AppStore: use BadgeHub.eu filter mpos_api_0 instead of device-specific hardware ID
- HowTo: add padding
- Settings: add Number Format setting
Frameworks:
- Add new NumberFormat framework for decimal and thousands separators
- DownloadManager: add connection timeout to DownloadManager session.get()
OS:
- New board support: LilyGo T-HMI
- New board support: M5Stack Core2
- LilyGo T-Watch S3 Plus: initialize Power Management Unit at startup
- LilyGo T-Watch S3 Plus: power button short press for display backlight on/off, long press for power down
- Add driver for LoRa SX1262 with lvgl_micropython-style (= split Bus/Device) hardware SPI
- Add drivers for LoRa SX126X with SoftSPI (and default MicroPython hardware SPI)
- Add esp32-component-rvswd and MicroPython bindings to flash WCH's CH32 microcontrollers
- Add glyphs to fonts: diacritics 0x7F-0xFF, Bitcoin symbol ₿ 0x20BF, italic satoshi symbol 丯 0x4E2F and regular satoshi symbol 丰 0x4E30
- Add LVGL symbols to fonts: 0xf002,0xf004,0xf005,0xf00e,0xf010,0xf029,0xf030 for search, heart, star, search-plus, search-minus, qrcode, camera
- Add LVGL symbols to fonts: 0xf15a,0xf164,0xf165,0xf1e0 for btc (without circle), thumbs-up, thumbs-down, share-alt
- Add LVGL symbols to fonts: 0xf2ea,0xf379,0xf58f for undo-alt, bitcoin (in circle), headphones-alt
- Improve handling of 'mpos.main' errors
- Fix empty black window issue on macOS desktop
- Fix macOS/unix desktop build with newer Clang (17+)
Builtin Apps:
- AppStore: update BadgeHub.eu URL
- About: show netmask separately, make labels focusable
- HowTo: new onboarding app with auto-start handling to explain controls
- Settings: add sub-groups of setings as separate apps, including WiFi app
- Settings: add Hotspot sub-group (SSID, password, security)
- Settings: add WebServer sub-group (autostart, port, password)
- Launcher: ignore launchers and MPOS settings (except WiFi)
Frameworks:
- Audio streams: WAV playback/recording improvements (duration/progress, hardware volume control)
- AudioManager: registry/session model, multi-speaker/mic routing, ADC-based mic (adc_mic)
- DownloadManager: explicit certificate handling
- InputManager: pointer detection helpers and board registrations
- SensorManager: refactor to IMU drivers with magnetometer support and desktop IIO fallback
- SharedPreferences: fix None handling
- WebServer: new framework with Linux/macOS fixes and no background thread
- WifiService: hotspot support, IP address helpers, simplified connect/auto-connect
- Websocket library: renamed to uaiowebsocket to avoid conflicts
OS:
- ESP32 boards: bundle WebREPL (not started by default) to offer remote MicroPython shell over the network, accessible through webbrowser
- New board support: LilyGo T-Display-S3 (physical and emulated by QEMU)
- New board support: LilyGo T-Watch S3 Plus
- New board support: M5Stack Fire
- New board support: ODroid Go
- New board support: unPhone 9
- Fri3d 2024/2026 updates: display reset support using CH32 microcontroller, communicator/expander drivers
- ADC microphone C module and tests
- Build system: switch to static builds for desktop systems to bundle LIBC and fix LIBC version issue
- Build system: add linux-arm64 and macos-intel GitHub workflows to support more precompiled binaries
- Add FreeRTOS module for low-level ESP32 functions
Builtin Apps:
- About: use logger framework
- AppStore: mark BadgeHub backend as 'beta'
- Launcher: improve layout on different screen width sizes
- OSUpdate: remove 'force update' checkbox not in favor of varying button labels
Frameworks:
- SDCard: add support for SDIO/SD/MMC mode
- CameraManager and CameraActivity: work fully camera-agnostic
OS:
- Add board support: Makerfabs MaTouch ESP32-S3 SPI IPS 2.8' with Camera OV3660
- Scale MicroPythonOS boot logo down if necessary
- Don't show battery icon if battery is not supported
- Move logging.py to subdirectory
Builtin Apps:
- Update icons for AppStore, Settings, and Wifi apps
Frameworks:
- Fix issue with multiple DownloadManager.download_url's on ESP32 due to SSL session sharing/corruption
Builtin Apps:
- Redesign all app icons from scratch for a more consistent style
- About app: show MicroPythonOS logo at the top
- AppStore app: fix BadgeHub backend handling
- OSUpdate app: eliminate requests library
- Settings app: make 'Cancel' button more 'ghost-y' to discourage accidental misclicks
Frameworks:
- Harmonize frameworks to use same coding patterns
- Rename AudioFlinger to AudioManager framework
- Rename PackageManager to AppManager framework
- Add new AppearanceManager framework
- Add new BatteryManager framework
- Add new DeviceInfo framework
- Add new DisplayMetrics framework
- Add new InputManager framework
- Add new TimeZone framework
- Add new VersionInfo framework
- ActivityNavigator: support pre-instantiated activities so an activity can close a child activity
- SensorManager: add support for LSM6DSO
OS:
- Show new MicroPythonOS logo at boot
- Replace all compiled binary .mpy files by source copies for transparency (they get compiled during the build, so performance won't suffer)
- Remove dependency on micropython-esp32-ota library
- Remove dependency on traceback library
- Additional board support: Fri3d Camp 2026 (untested)
- About app: make more beautiful
- AppStore app: add Settings screen to choose backend
- Camera app and QR scanning: fix aspect ratio for higher resolutions
- WiFi app: check 'hidden' in EditNetwork
- Wifi app: add support for scanning wifi QR codes to 'Add Network'
- Create new SettingsActivity and SettingActivity framework so apps can easily add settings screens with just a few lines of code
- Create CameraManager framework so apps can easily check whether there is a camera available etc.
- Simplify and unify most frameworks to make developing apps easier
- Improve robustness by catching unhandled app exceptions
- Improve robustness with custom exception that does not deinit() the TaskHandler
- Improve robustness by removing TaskHandler callback that throws an uncaught exception
- Don't rate-limit update_ui_threadsafe_if_foreground
- Make 'Power Off' button on desktop exit completely
- Fri3d Camp 2024 Board: add I2S microphone as found on the communicator add-on
- API: add TaskManager that wraps asyncio
- API: add DownloadManager that uses TaskManager
- API: use aiorepl to eliminate another thread
- AudioFlinger API: add support for I2S microphone recording to WAV
- AudioFlinger API: optimize WAV volume scaling for speed and immediately set volume
- Rearrange automated testing facilities
- About app: add mpy format info
- AppStore app: eliminate all threads by using TaskManager
- AppStore app: add experimental support for BadgeHub backend (not enabled)
- MusicPlayer app: faster volume slider action
- OSUpdate app: show download speed
- SoundRecorder app: created to test AudioFlinger's new recording feature!
- WiFi app: new 'Add network' functionality for out-of-range networks
- WiFi app: add support for hidden networks
- WiFi app: add 'Forget' button to delete networks
- Fri3d Camp 2024 Board: add startup light and sound
- Fri3d Camp 2024 Board: workaround ADC2+WiFi conflict by temporarily disable WiFi to measure battery level
- Fri3d Camp 2024 Board: improve battery monitor calibration to fix 0.1V delta
- Fri3d Camp 2024 Board: add WSEN-ISDS 6-Axis Inertial Measurement Unit (IMU) support (including temperature)
- API: improve and cleanup animations
- API: SharedPreferences: add erase_all() function
- API: add defaults handling to SharedPreferences and only save non-defaults
- API: restore sys.path after starting app
- API: add AudioFlinger for audio playback (i2s DAC and buzzer)
- API: add LightsManager for multicolor LEDs
- API: add SensorManager for generic handling of IMUs and temperature sensors
- UI: back swipe gesture closes topmenu when open (thanks, @Mark19000 !)
- About app: add free, used and total storage space info
- AppStore app: remove unnecessary scrollbar over publisher's name
- Camera app: massive overhaul!
- Lots of settings (basic, advanced, expert)
- Enable decoding of high density QR codes (like Nostr Wallet Connect) from small sizes (like mobile phone screens)
- Even dotted, logo-ridden and scratched pictures of QR codes are now decoded properly!
- ImageView app: add delete functionality
- ImageView app: add support for grayscale images
- OSUpdate app: pause download when wifi is lost, resume when reconnected
- Settings app: fix un-checking of radio button
- Settings app: add IMU calibration
- Wifi app: simplify on-screen keyboard handling, fix cancel button handling
- ESP32: one build to rule them all; instead of 2 builds per supported board, there is now one single build that identifies and initializes the board at runtime!
- MposKeyboard: fix q, Q, 1 and ~ button unclickable bug
- MposKeyboard: increase font size from 16 to 20
- MposKeyboard: use checkbox instead of newline symbol for 'OK, Ready'
- MposKeyboard: bigger space bar
- OSUpdate app: simplify by using ConnectivityManager
- OSUpdate app: adapt to new device IDs
- ImageView app: improve error handling
- Settings app: tweak font size
- Settings app: add 'format internal data partition' option
- Settings app: fix checkbox handling with buttons
- UI: pass clicks on invisible 'gesture swipe start' are to underlying widget
- UI: only show back and down gesture icons on swipe, not on tap
- UI: double size of back and down swipe gesture starting areas for easier gestures
- UI: increase navigation gesture sensitivity
- UI: prevent visual glitches in animations
- API: add facilities for instrumentation (screengrabs, mouse clicks)
- API: move WifiService to mpos.net
- API: remove fonts to reduce size
- API: replace font_montserrat_28 with font_montserrat_28_compressed to reduce size
- API: improve SD card error handling
- WifiService: connect to strongest networks first
- Add custom MposKeyboard with more than 50% bigger buttons, great for tiny touch screens!
- Apply theme changes (dark mode, color) immediately after saving
- About app: add a bit more info
- Camera app: fix one-in-two 'camera image stays blank' issue
- OSUpdate app: enable scrolling with joystick/arrow keys
- OSUpdate app: Major rework with improved reliability and user experience
- add WiFi monitoring - shows 'Waiting for WiFi...' instead of error when no connection
- add automatic pause/resume on WiFi loss during downloads using HTTP Range headers
- add user-friendly error messages with specific guidance for each error type
- add 'Check Again' button for easy retry after errors
- add state machine for better app state management
- add comprehensive test coverage (42 tests: 31 unit tests + 11 graphical tests)
- refactor code into testable components (NetworkMonitor, UpdateChecker, UpdateDownloader)
- improve download error recovery with progress preservation
- improve timeout handling (5-minute wait for WiFi with clear messaging)
- Tests: add test infrastructure with mock classes for network, HTTP, and partition operations
- Tests: add graphical test helper utilities for UI verification and screenshot capture
- API: change 'display' to mpos.ui.main_display
- API: change mpos.ui.th to mpos.ui.task_handler
- waveshare-esp32-s3-touch-lcd-2: power off camera at boot to conserve power
- waveshare-esp32-s3-touch-lcd-2: increase touch screen input clock frequency from 100kHz to 400kHz
- Settings app: add 'Auto Start App' setting
- Tweak gesture navigation to trigger back and top menu more easily
- Rollback OTA update if launcher fails to start
- Rename 'Home' to 'Launch' in top menu drawer
- Fri3d-2024 Badge: use same SPI freq as Waveshare 2 inch for uniformity
- ESP32: reduce drawing frequency by increasing task_handler duration from 1ms to 5ms
- Rework MicroPython WebSocketApp websocket-client library using uasyncio
- Rework MicroPython python-nostr library using uasyncio
- Update aiohttp_ws library to 0.0.6
- Add fragmentation support for aiohttp_ws library
Known issues:
- Fri3d-2024 Badge: joystick arrow up ticks a radio button (workaround: un-tick the radio button)
- OSUpdate app: fix typo that prevented update rollback from being cancelled
- Fix 'Home' button in top menu not stopping all apps
- Update micropython-nostr library to fix epoch time on ESP32 and NWC event kind
- OSUpdate app: now gracefully handles the user closing the app mid-update instead of freezing
- Launcher app: much faster thanks to PackageManager + UI only rebuilt when apps actually change
- AppStore app: improved stability + icons for already-installed apps are shown instantly (no download needed)
- API: Add SDCardManager for SD Card support
- API: add PackageManager to (un)install MPK packages
- API: split mpos.ui into logical components
- Remove 'long press IO0 button' to activate bootloader mode; either use the Settings app (very convenient) or keep it pressed while plugging in the USB cable (or briefly pressing the reset button)
- Increase framerate on ESP32 by lowering task_handler duration from 5ms to 1ms
- Throttle per-frame async_call() to prevent apps from overflowing memory
- Overhaul build system and docs: much simplier (single clone and script run), add MacOS support, build with GitHub Workflow, automatic tests, etc.
- Settings app: fix stray /cat in Europe/Brussels timezone
- Launcher app: fix handling of empty filesystem without apps
- Fix KeyPad focus handling for devices without touch screen like the Fri3d Camp 2024 Badge
- Use direction arrows for more intuitive navigation instead of Y/A or pageup/pagedown for previous/next
- About app: enable scrolling using arrow keys so off-screen info can be viewed
- About app: add info about freezefs compiled-in filesystem
- AppStore app: don't update UI after the user has closed the app
- Launcher app: improve error handling
- Wifi app: cleanup and improve keyboard and focus handling
- Wifi app: improve different screensize handling
- Update to MicroPython 1.25.0 and LVGL 9.3.0
- About app: add info about over-the-air partitions
- OSUpdate app: check update depending on current hardware identifier, add 'force update' option, improve user feedback
- AppStore, Camera, Launcher, Settings: adjust for compatibility with LVGL 9.3.0
- Merge official Fri3d Camp 2024 Badge support
- About app: add machine.freq, unique_id, wake_reason and reset_cause
- Reduce timezones from 400 to 150 to reduce scrolling
- Experimental Fri3d Camp 2024 Badge support
- UI: add visual cues during back/top swipe gestures
- UI: prevent menu drawer button clicks while swiping
- Settings: add Timezone configuration
- Draw: new app for simple drawing on a canvas
- IMU: new app for showing data from the Intertial Measurement Unit ('Accellerometer')
- Camera: speed up QR decoding 4x - thanks @kdmukai!
- Move wifi icon to the right-hand side
- Power off camera after boot and before deepsleep to conserve power
- Settings: add 20 common theme colors in dropdown list
- Update battery icon every 5 seconds depending on VBAT/BAT_ADC
- Add 'Power' off button in menu drawer
- Scale button size in drawer for bigger screens
- Show 'Brightness' text in drawer
- Add builtin 'Settings' app with settings for Light/Dark Theme, Theme Color, Restart to Bootloader
- Add 'Settings' button to drawer that opens settings app
- Save and restore 'Brightness' setting
- AppStore: speed up app installs
- Camera: scale camera image to fit screen on bigger displays
- Camera: show decoded result on-display if QR decoded
- Improve focus group handling while in deskop keyboard mode
- Add filesystem driver for LVGL
- Implement CTRL-V to paste on desktop
- Implement Escape key for back button on desktop
- WiFi: increase size of on-screen keyboard for easier password entry
- WiFi: prevent concurrent operation of auto-connect and Wifi app
- Add left edge swipe gesture for back screen action
- Add animations
- Add support for QR decoding by porting quirc
- Add support for Nostr by porting python-nostr
- Add support for Websockets by porting websocket-client's WebSocketApp
- Add support for secp256k1 with ecdh by porting and extending secp256k1-embedded
- Change theme from dark to light
- Improve display refresh rate
- Fix aiohttp_ws bug that caused partial websocket data reception
- Add support for on Linux desktop
- Add support for VideoForLinux2 devices (webcams etc) on Linux
- Improve builtin apps: Launcher, WiFi, AppStore and OSUpdate
- appstore: add 'update' button if a new version of an app is available
- appstore: add 'restore' button to restore updated built-in apps to their original built-in version
- launcher: don't show launcher apps and sort alphabetically
- osupdate: show info about update and 'Start OS Update' before updating
- wificonf: scan and connect to wifi in background thread so app stays responsive
- introduce MANIFEST.JSON format for apps
- improve notification bar behavior
- Handle IO0 'BOOT button' so long-press starts bootloader mode for updating firmware over USB
- Initial release