Release Notes

v0.9.1  •  Codenamed Pulsar  •  β9  •  Succeeds v0.8.1 directly

Status

In developer testing. Runs on RP2040, RP2350, and ESP32 / ESP32-S2 / ESP32-S3. This is the first public release since v0.8.1 and supersedes it directly. Recommended upgrade for everyone on v0.8.x.

These notes cover everything new since v0.8.1. For the full feature reference, see the docs. For what’s coming next, see the roadmap.

What’s New in Pulsar

The β8 “Nebula” line graduates to Pulsar — a major step that ships stability improvements, large-file safety, OTA updates, and the shell-power features (pipes, scripting, automation) all in one release. The data directory is now /Pulsar/; updating devices migrate automatically.

Shell — Quality of Life

Persistent aliases

alias ll=ls -l now survives reboots. Aliases are stored in /Pulsar/Registry/aliases.cfg, loaded at shell start, and saved immediately on every alias or unalias. Critical built-ins can never be shadowed by an alias.

watch

Re-run any command on a timer until Ctrl+C:

watch -n 5 sysinfo
watch meminfo

Clears the screen between runs. Default interval is 2 seconds.

Multi-file cat

cat a.txt b.txt c.txt prints each file with a ==> name <== header, the same as GNU cat. Single-file behaviour is unchanged.

Configurable prompt hostname

The user@host part of your prompt now reads from the registry:

reg set System.Device_ID mypico
# prompt becomes:  root@mypico:~>

Fresh installs default to pulsar. Existing devices upgrading from v0.8.x keep their old nebula default until changed.

date set

Set the real-time clock from the shell so session-log timestamps are correct:

date set 2026-06-10 14:30:00

Bare date still prints the current time. The RTC is not battery-backed on a bare Pico — it resets on power loss.

Filesystem — Safer & Friendlier

Large-file cp / mv no longer OOM

Copies now stream in 1 KB chunks instead of loading the entire file into RAM at once. On a 264 KB Pico 1 this was the difference between success and a MemoryError on files larger than ~100 KB. mv uses an instant same-filesystem rename when possible and only falls back to streamed copy-then-delete across filesystems.

Relative paths for cp / mv / rename

cp notes.txt backup/ now works. All three commands accept relative paths (resolved against the current directory) in addition to absolute paths. Identical source and destination is caught before any work is done.

du

Report the total size of a file or an entire directory tree:

du /Core
du notes.txt

Pipes, Scripts & Automation

Shell pipes

Commands can now be piped together using |:

cat /Pulsar/Logs/latest.log | grep ERROR | wc
ls /Core | sort | head -10

Pipe consumers (grep, wc, sort, uniq, cat, head, tail) read stdin when given no file argument. Output is captured per-stage with zero extra RAM overhead. Status helpers (error(), warn()) always print to the terminal, not into the pipe.

&& and || chaining

Conditional sequencing now works as expected:

wifi connect && pkg update
update online || echo "Update failed"
ntp sync -s && startup add task run

Exit status is derived from whether a command called RPCortex.error() or fatal() — no per-command changes needed; every existing built-in participates automatically.

.rps scripting

Write and run scripts from the shell:

script myscript.rps

Supported constructs: set, $var expansion, inc/dec, prompt (read input), capture (store a command’s output), if/else/end, while/end, break/continue, and stop. Conditions: eq, ne, gt, lt, ge, le, contains, exists, empty, and not — or any shell command (non-zero exit = false). Scripts execute through the live shell engine, so all commands, pipes, and aliases work. See the scripting reference for examples.

Startup tasks

Commands run automatically after login from /Pulsar/Registry/startup.cfg:

startup add ntp sync -s      # sync clock silently at login
startup add wifi autoconnect # connect to strongest saved network
startup list
startup remove 1

Scheduled tasks

Repeat commands on a software-uptime timer:

task add 300 fetch           # run fetch every 5 minutes
task run                     # foreground scheduler (q / Ctrl+C to stop)
startup add task run         # make device headless/autonomous

The scheduler stays responsive via select() — keyboard input is checked between ticks.

Packages & Updates

Over-the-air updates

RPCortex can check for and install updates entirely from the shell over WiFi:

New built-in: NTP

The NTP package ships built-in and syncs the hardware RTC over UDP:

ntp sync              # sync and print result
ntp sync -s           # silent — no output unless error (ideal for startup tasks)

Handles the MicroPython year-2000 epoch offset automatically.

New packages

fetch and bench are packages

fetch (PicoFetch) and bench (RPCMark — now its permanent name, formerly NebulaMark/PulseMark) have moved from Core/ into proper packages under /Packages/. They are now updatable independently with pkg upgrade PicoFetch — no full OS flash needed.

One-click install state on the web

The Packages page now reads what’s already installed on a connected device and labels each card accordingly — Install, Update (when the repo has a newer version), or Re-install. The check works whether the device is at the shell prompt or the login screen, so it never assumes a logged-in session.

Web installer works on a running device

The Web Installer no longer requires the device to be sitting at a bare MicroPython REPL. If RPCortex is already running, it automatically drops to the REPL (via the built-in rawrepl escape, which now works at the login prompt too) before flashing.

pkg upgrade handles built-in packages

pkg upgrade now correctly upgrades built-in packages (previously blocked by the builtin guard) and preserves their registry keys across the uninstall/reinstall cycle.

Networking

Download progress bars

wget now shows a live progress bar when the server sends a Content-Length header:

[########--------] 47%  (381 KB / 812 KB)

Extended curl flags

curl now accepts: -X <method>, -d <body>, -H <header>, -o <file>, -s (silent), -I (headers only), --timeout <secs>.

wifi autoconnect and silent flags

wifi autoconnect (or wifi auto) scans nearby networks and connects to the saved one with the strongest signal — no prompts, no SSID argument required. Ideal for startup tasks.

wifi connect -s and ntp sync -s suppress output unless an error occurs — designed for use in startup scripts.

Owner and timezone personalisation

reg set System.Owner "dash"
reg set System.TZ_Offset -5

Owner name appears in fetch next to the device ID. Timezone offset (whole hours from UTC) is applied to the date display. ntp sync now prints the computed local time directly, so you don’t have to run date afterwards.

Everything in the settings app

The settings panel was rebuilt to match the SysMon look and now edits the personalisation keys directly — no more reaching for reg set. Press o / t / d / i to set the owner, timezone, device ID, and idle-logout timeout. The panel also redraws efficiently: toggling a setting repaints just that row instead of clearing the whole screen.

Idle auto-logout

Set Settings.Idle_Logout (minutes, in the settings app or registry) and the shell logs out automatically after that long with no input — a small safety feature for shared or exposed devices. 0 disables it; recovery mode is never logged out.

users command

users lists every account on the device with active / admin / nopass tags, alongside its home directory.

Recovery Tools

A new set of recovery commands live in recovery.lp (loaded separately from system.lp so they work even if system commands are damaged):

Performance

No more typing lag at 115200 baud

Inline ghost-text completion (the suggestion that appears as you type) now does a zero-I/O command-name dict scan per keystroke. The filesystem is only touched when you actually press Tab for path completion. At 115200 baud, each uos.listdir() call added noticeable lag — gone.

No more output lag

Log writes are batched: flushed every 8 lines, or immediately on a WARNING or ERROR. Previously every log write flushed to LittleFS (~10 ms each), causing bursts of output to stall visibly. Warnings and errors still flush immediately for crash-log safety.

Portable compiled image

A precompiled .mpy image now ships alongside the source build. It’s architecture-neutral — one image for RP2040, RP2350, and ESP32 (RPCortex uses no @native/@viper code). About 44% smaller than source and imports faster. Deploy with mpremote or deploy.bat --compiled.

Bug Fixes (since v0.8.1)

Saved WiFi passwords actually work

wifi connect <ssid> was reading the old removed 2-slot registry keys (Networks.WiFi_SSID_1/2) and therefore never found any saved passwords, re-prompting every time. It now reads networks.cfg via the same path as autoconnect and connects silently when a saved profile exists.

No more false “previous session ended unexpectedly” on every boot

POST arms Settings.Startup to "1" at the end of its run. initialization.py was reading that key for the startup banner — so it always saw "1" (session active) and displayed the crash warning. Fixed: POST captures the pre-arm value into post.boot_startup_mode; initialization reads that instead. The OTA-update-success banner and other startup modes now appear correctly too.

Built-in packages show in pkg list on fresh installs

The Packages/Launchpad/package.cfg and Packages/Editor/package.cfg stubs were missing from the image (deleted in an old wipe commit). Fresh installs showed no built-in packages in pkg list. Restored.

Every password prompt is masked

Account creation (mkacct), password change (chpswd), account removal (rmuser), and wifi add all now echo bullets. Login always did; the rest didn’t.

compile.bat ships the full OS

The PicoFetch and NebulaMark package directories were silently omitted from compiled builds. Fixed — the compiled image now matches the source image.

Installation

Fresh install: Use the Web Installer — flash from your browser over USB, no desktop software required (Chrome or Edge).

Updating from v0.8.x: Run update check then update online from the shell, or use the OS Update page, or update from-file /path/to/RPC-Pulsar-b9-Beta.rpc. User accounts, WiFi profiles, settings, and installed packages are all preserved.

Manual: Flash MicroPython v1.25+ (v1.28 recommended), copy all files from the release to the board’s filesystem, connect a serial terminal at 115200 baud, and reboot.

Already running RPCortex and want a completely clean reflash? Run rawrepl at the shell prompt to drop back to the MicroPython REPL, then use the Web Installer as normal. No wipe needed.

Known Limitations

What’s Next

v0.9.5 is a dedicated multitasking exploration release. The goal is to prove uasyncio alongside the shell before v1.0 builds on it:

v1.0 builds on the stable multitasking foundation: TUI framework, SD card support, multiple terminals, and more. See the roadmap for the full plan.

RPCortex Pulsar β9 — v0.9.1  •  by dash1101. Issues and PRs welcome.