Release Preview

MicroPython v1.29

A new PSOC Edge port, machine.CAN comes to MIMXRT, and a major Unicode overhaul.

Expected any day now — milestone due August 3, 2026, has passed with only clean-up items left open

⚠️
This page previews an unreleased version. As of August 6, 2026, the v1.29.0 milestone has 56 closed items and 22 still open, and very few of those remaining open items look likely to make the cut. Everything below reflects closed, merged milestone items — those are locked in — with one exception: the USB Networking (NCM) section covers a still-open PR that's expected to land before the tag is cut. We'll update this page once the release actually ships.
🧩
PSOC Edge
Brand new Infineon port
🚌
machine.CAN
MIMXRT joins the bus
🔤
Unicode
decode(), center() fixes
🔗
USB Networking
NCM network-over-USB
💾
mem_backup()
Persistent memory, 7 ports
🔊
ESP32-H2
Wi-Fi-less BLE + 802.15.4
0 Contributors (prelim.)
0 New Boards
0 New Port
New Port

PSOC Edge — Infineon Joins the Fold

The first new port since alif debuted in v1.25: Infineon's PSOC™ Edge (PSE84) family, contributed by Infineon's own jaenrig-ifx. The toolchain is entirely vendor-SDK-free — just arm-none-eabi-gcc, Infineon's edgeprotecttools, and Infineon OpenOCD.

Source: PR #18910

Boot Chain — Secure Boot to MicroPython
Board: KIT_PSE84_AI
secboot (secure world) MicroPython (non-secure world)

A minimal secure-boot application starts the non-secure MicroPython image — the same pattern used across Infineon's PSOC Edge security model.

Modules available at launch

time
VFS
machine.Pin
machine.RTC
machine.UART
psoc_edge_example.py
from machine import Pin, RTC

led = Pin(0, Pin.OUT)
led.value(1)

rtc = RTC()
print(rtc.datetime())
Improved

machine.CAN — MIMXRT Joins the Bus

v1.28 introduced the standardized machine.CAN API with stm32 as the only implementation, and an explicit "Node C — Coming Soon" placeholder in its bus diagram. v1.29 fills that gap: MIMXRT is now a real, tested second implementation, verified across MIMXRT1021, 1052, 1062 and 1176 at bit rates from 50 kbit/s to 1 Mbit/s in NORMAL, LOOPBACK and SILENT modes.

Source: PR #19095

Interactive Demo — CAN Bus Network
CAN Bus (500 kbit/s) Node A STM32 (bxCAN) Node B STM32 (FD-CAN) Node C MIMXRT — NEW 120Ω 120Ω
› Ready. Click Send to transmit a CAN frame.
can_example.py
from machine import CAN

# Now available on MIMXRT too
can = CAN(1, CAN.NORMAL, baudrate=500_000)

# Send a message
can.send(b'\x01\x02\x03', id=0x123)

# Receive a message
msg = can.recv()
print(f"ID: {msg[0]:#x}, Data: {msg[1]}")
bxCAN (stm32) FD-CAN (stm32) MIMXRT — NEW esp32 — Coming Soon rp2 — Coming Soon
Improved

Unicode Support Overhaul

A cross-cutting fix to how MicroPython handles Unicode, contributed by Josverl, who built a 127-language test corpus to find and verify the fixes. Framed around PEP 3131 and CPython compatibility, for roughly 0.05% extra memory cost (progressively enabled via MICROPY_CONFIG_ROM_LEVEL).

Source: PR #18854 · PR #18853 (mpremote)

Live Demo — Two Real MicroPython Builds, Side by Side

This isn't a mockup — it's two real MicroPython interpreters, each compiled to WebAssembly and running independently in your browser right now: the official v1.28.0 release, and a v1.29 preview built from commit 06bcfd5b7 (2026-07-28, the milestone's current state). Edit the code and hit Run to see both outputs.

Loading two MicroPython interpreters…

v1.28.0 (released)


        

v1.29 preview (06bcfd5b7)


        
How this demo works
This page's other live demos run on PyScript, which loads a single hosted MicroPython build from pyscript.net — fine for a released version, but useless for comparing two versions at once, and pyscript.net won't have this preview build until v1.29 actually ships. So this section self-hosts two separate webassembly-port builds (built with mpbuild, no manual toolchain setup) and runs them side by side with plain JavaScript, bypassing PyScript entirely for just this one comparison.

Also includes a companion mpremote fix: Unicode-safe Windows console output, safer path quoting for filenames with Unicode/quotes/backslashes, and UTF-8-safe transport writes.

Expected to Land

USB Networking — NCM Network Driver

A new USB network driver that turns the board's existing USB connection into a real network interface, wired straight into MicroPython's existing lwIP stack. The regular USB serial port stays available for mpremote alongside it, and the board hands out an IP address to the host via its own DHCP server — no Wi-Fi required. Any TinyUSB-based port with lwIP enabled can use it, provided the chip has enough RAM to spare (lwIP needs roughly 20 KB).

Not yet merged, but very likely to land
PR #16459 is still open as of this page's last update, but it's actively maintained and expected to make it into v1.29. Unlike the rest of this page, treat this section as "should land" rather than "definitely landed" until the release is tagged.
stm32
rp2
mimxrt
build: enable NCM
# rp2, e.g. RPI_PICO2_W
make -j -C ports/rp2 BOARD=RPI_PICO2_W \
    MICROPY_PY_LWIP=1 \
    CFLAGS_EXTRA="-DMICROPY_PY_NETWORK_NCM=1"

Disabled by default — opt in with MICROPY_PY_NETWORK_NCM=1 at build time. Once enabled, plugging the board in gives the host a normal network interface, so existing servers and services (HTTP, MQTT, WebREPL) work over the same USB cable used for the REPL.

New

machine.mem_backup() — Persistent Memory, Almost Everywhere

A small feature with an outsized payoff: machine.mem_backup() returns a writable memoryview onto whatever persistent hardware memory a port has — backup RAM, RTC registers, watchdog scratch registers — with zero copying. Data survives at least a soft_reset() everywhere it's available; on battery-backed ports it survives power-off too. It's already available on 7 of MicroPython's ports — about as close to universal as a hardware-dependent feature gets. Closes a 2+ year old feature request (#18960).

Source: PR #19084

PortBacking storageSizeBattery-backed
alifBackup SRAM4096 bytesYes
esp32RTC slow memory2048 bytesNo
mimxrtSNVS LPGPR registers12–16 bytesYes
nrfPOWER GPREGRET registers1–2 bytesNo
rp2Watchdog scratch registers28–60 bytesNo
samdBackup RAM (SAMD51 only)8192 bytesYes
stm32Backup SRAM + BKP registers20–8192 bytesYes
boot_counter.py
import machine, uctypes

mem = machine.mem_backup()
layout = {"boot_count": (0, uctypes.UINT32)}
regs = uctypes.struct(uctypes.addressof(mem), layout)

regs.boot_count += 1
print("Boots since power-on:", regs.boot_count)
# survives soft_reset() and deepsleep() on every port above;
# survives power-off too on alif, mimxrt, samd, stm32
esp32 gotcha
esp32 already had a separate, older RTC.memory() API. It shares the same underlying buffer as machine.mem_backup() but tracks its length independently — mixing the two in the same application can produce surprising results. Pick one and stick with it.
New

ESP32-H2 — A Wi-Fi-less ESP32

Two new boards (PR #19317) bring up Espressif's ESP32-H2: a low-cost, single-core RISC-V chip built specifically for Bluetooth LE and 802.15.4 mesh networking (Zigbee/Thread/Matter) — and notably, the first ESP32 variant in the port with no Wi-Fi radio at all. MICROPY_PY_NETWORK_WLAN and MICROPY_PY_ESPNOW are both compiled out for this board, since the hardware simply isn't there.

BLE — supported 802.15.4 / Zigbee — not yet wired up Wi-Fi — no radio on this chip
Zigbee-capable hardware, BLE-only software (for now)
The ESP32-H2 silicon has an 802.15.4 radio for Zigbee/Thread/Matter, but this MicroPython board config explicitly disables it (CONFIG_IEEE802154_ENABLED=n) since MicroPython doesn't have 802.15.4 support yet — it's a deliberate binary-size trade-off, not a hardware limitation. BLE works today; treat Zigbee/Thread as a "maybe later."

Boards

M5STACK_NANOH2 adds an RGB LED, USB-C and a JST-PH connector on top of the generic board — both were tested on hardware (GPIO, ADC, I2C, SPI, and a live BLE packet scan).

ble_scan.py
import bluetooth

ble = bluetooth.BLE()
ble.active(True)
print("BLE active on ESP32-H2:", ble.active())
# no machine.WLAN() here -- this chip doesn't have Wi-Fi

Highlights

Other notable improvements already merged into the milestone.

🔋

machine.wake_pins

New cross-port API returning which pin(s) triggered a deep-sleep wake-up, when multiple wake pins are configured.

PR #17542
📡

Wi-Fi CSI Module

network.WLAN gains csi_enable()/csi_read() for Channel State Information — motion detection, indoor localization, gesture recognition.

esp32
PR #18460
📡

espnow v2.0

Max message size jumps from 250 to 1490 bytes on ESP-IDF v5.4+, while keeping v1.0 support for older IDF builds.

esp32
PR #16737
🔌

High-Speed USB

TinyUSB gains proper HS RHPORT support for PYBD_SF6, STM32F429DISC, OLIMEX_H407 and ULPI-based boards, plus CDC/VBUS fixes.

stm32
PR #18933
🌐

Ethernet Improvements

Background PHY link/hot-plug detection, static IP configuration before active(True), and non-blocking DHCP restart on cable replug.

stm32
PR #17613
🔒

TLS PSK Support

Pre-shared-key authentication added to the ssl module, for use cases that don't want full certificate-based TLS.

extmodesp32
PR #17074

RP2 DMA Timers

New DMATimer class paces DMA channel transfers by ratio or target frequency.

rp2
PR #18622
⚙️

machine.Timer Rework

Moved to ESP-IDF's higher-level GPTimer abstraction, and adds virtual timers backed by ESP Timer.

esp32
PR #19163
🛠

SDK 2.3.0 + Upstream PSRAM

Include-based linker scripts, a silent ROMFS-overflow fix, and PSRAM bring-up now fully deferred to the Pico SDK itself.

rp2
PR #19415 PR #19418
🔢

int.to_bytes(signed=...)

Closes a long-standing CPython incompatibility, plus common overflow checks for buffer conversions — ported from CircuitPython.

PR #16311
🔍

bytes.find(int)

CPython-compatible single-byte search — no more manually wrapping a byte value in bytes([n]) first.

PR #11631
🧩

c_module() Manifest Function

User C modules no longer need to live inside one flat USER_C_MODULES directory — declare them directly in manifest.py, wherever they live.

PR #18229
🛡️

Security: mbedtls 3.6.6

Resolves 10 CVEs in the bundled mbedtls (CVE-2025-49087, -52496, -52497, -54764, -59438, -66442, CVE-2026-25833, -25834, -25835, -34871). Recommended update for anything TLS-facing.

PR #19083
💾

Block Device errno Returns

Python-level block-device read/write now returns an integer errno instead of a bool, fixing real SD-card failure handling on PYBV11 and ESP32-P4.

PR #16223
📄

help('modules') Formatting

Column count and width are now configurable via mpconfigport.h, for boards with small displays.

PR #18734
📦

Dependency Bumps

TinyUSB updated to 0.21.0 and CMSIS to v6.3.0 (now vendored as proper submodules across alif, mimxrt, nrf, renesas-ra, samd and stm32).

PR #19359 PR #19104

New Boards

8 new board definitions across 2 ports — confirmed from closed milestone items only.

By the Numbers

Based on the 56 closed milestone items only — final numbers will shift slightly once the release is tagged.

0 Contributors
preliminary — milestone PR authors only
0 New Boards
0 New Port
psoc-edge — first since alif in v1.25

Code-size deltas aren't available yet — there's no tagged v1.29 build to diff against v1.28. We'll add a chart once the release build lands.