Skip to content

RPCortex β9 - Pulsar

Latest

Choose a tag to compare

@dash1101 dash1101 released this 14 Jun 07:05

RPCortex Pulsar — v0.9.1

v0.9.1 | Codenamed Pulsar | β9

The β8 "Nebula" line graduates to Pulsar — a massive stability, polish, and feature release. The shell grows up: it's now faster, safer with large files, self-updating over the air, and introduces real pipes, conditional chaining, a scripting language, and task automation — RPCortex can now do things on its own, with no host computer attached.

Full feature reference: RPCortex Docs


Status

Beta. Runs on the Raspberry Pi Pico series (RP2040 / RP2350) and the ESP32 / ESP32-S2 / ESP32-S3. This is the first public release since v0.8.1 and supersedes it directly — everything staged internally as v0.9.0 is included here. Recommended upgrade for everyone on v0.8.x.


What's New in v0.9.1

Shell — pipes, chaining & scripting

  • Pipescmd1 | cmd2 | cmd3. The left command's output feeds the right one. grep, wc, sort, uniq, cat, head, and tail all read piped input when given no file: cat /Pulsar/Logs/latest.log | grep ERROR | wc.
  • && / || chainingwifi connect && pkg update runs the second command only if the first succeeded; ping host || echo offline runs it only if the first failed. Mixes freely with ; and |.
  • Scripting (.rps) — Write scripts with variables (set name value, $name), if/else/end, and while/end, then run them with script myjob.rps. Conditions are built-ins (eq, ne, exists, empty) or any shell command. Scripts run through the live shell, so pipes and chaining work inside them too.

Shell — quality of life

  • Persistent aliasesalias ll=ls -l now survives reboots (stored in /Pulsar/Registry/aliases.cfg). unalias removes; bare alias lists. Critical built-ins can never be shadowed.
  • watch [-n <secs>] <command> — re-run any command on a timer until Ctrl+C, e.g. watch -n 5 sysinfo or watch meminfo. Clears the screen between runs.
  • read / cat multiple filescat boot.cfg notes.txt prints each with a ==> name <== header.
  • Configurable prompt hostname — the user@host part of your prompt is now yours: reg set System.Device_ID mypicoroot@mypico:~>. Fresh installs default to pulsar.

Automation — the device runs itself

  • Startup tasksstartup add <command> runs commands automatically after login, before the prompt. startup list / remove / clear / run.
  • Scheduled taskstask add <secs> <command> repeats a command on a timer (counted from uptime — no RTC needed). task run starts the scheduler (press q / Ctrl+C to stop).
  • Headless modestartup add task run makes the device boot straight into its scheduler: an unattended controller with no terminal required.

Filesystem — safer & friendlier

  • Large-file cp / mv no longer run out of memory — copies now stream in 1 KB chunks instead of loading the whole file into RAM. mv uses an instant same-filesystem rename when it can, and only falls back to copy-then-delete across filesystems.
  • Relative paths everywherecp, mv, and rename accept relative paths now (cp notes.txt backup/), not just absolute ones. Identical source/destination is caught before any work happens.
  • du [path] — total size of a file or an entire directory tree.

Clock, NTP & logs

  • ntp sync — sets the clock from an internet time server over WiFi — so timestamps and date are correct even on boards with no battery-backed RTC. ntp status shows the clock and server; ntp server <host> changes the default. Ships built-in; add startup add ntp sync to re-sync on every boot. (Correctly handles MicroPython's 2000-01-01 epoch.)
  • date set YYYY-MM-DD HH:MM:SS — manually set the real-time clock from the shell.
  • Session-log timestamps are now correct instead of counting from the boot epoch.

Over-the-air updates

  • update check — asks the update server whether a newer release exists and shows the changelog.
  • update online — downloads and installs the latest release over WiFi, then reboots. update online --force reinstalls even if you're current.
  • update from-file <path.rpc> — apply a local archive (unchanged from before, still preserves all user data).
  • After any update the OS reports the running version on your next login, and the registry version/codename can never drift out of sync with the running code again.

Packages

  • fetch / neofetch and bench are now real packages (PicoFetch and RPCMark). That means they update independently with pkg upgrade — no full OS flash to get a newer fetch.
  • pkg upgrade handles built-in packages correctly and preserves their registry keys across the upgrade.
  • New packages (install with pkg install <name>):
    • Calc — offline calculator: calc 3 * (4 + 2), plus calc hex 255 / bin / oct / dec.
    • Gpio — drive pins from the shell: gpio read|set|toggle|pwm|stop|adc <pin>.
    • I2CScani2cscan [scl] [sda] finds I²C devices and names common parts (SSD1306, MPU6050, BME280, …).

Performance

  • No more typing lag at 115200 baud — inline ghost-text completion now does a zero-I/O command-name lookup per keystroke; the filesystem is only touched when you actually press Tab.
  • No more output lag — log writes are batched (flushed every 8 lines, or immediately on a warning/error), so rapid command output no longer stalls on flash writes.

Recovery & diagnostics

  • New tools, available in the normal shell and in recovery mode (loaded from their own registry so they survive a damaged command table): fscheck (verify core files), diag (RAM/flash/registry snapshot), logdump [n] (print the session log), regreset (rebuild a corrupt registry, keeping accounts + WiFi), pkgdisable/pkgenable (quarantine a package without removing it).

Networking & personalisation

  • Download progress barswget shows [####----] 47% using the server's Content-Length.
  • Extended curl-X, -d, -H, -o, -s, -I, --timeout (the default GET-to-stdout behaviour is unchanged).
  • Owner & timezonereg set System.Owner <name> (shown in sysinfo, asked at first-run setup) and reg set System.TZ_Offset <hours> (applied to date).

Branding

  • Rebranded throughout from β8 Nebula to β9 Pulsar — boot banner, version strings, and registry codename. The name nods to the pulse CPU-clock subsystem. Stale "Nebula" branding has also been cleared from the help banner, sysinfo, and the HTTP User-Agent.

Setup, packages & tooling (added during Beta)

  • Guided first-run setup — the wizard now walks through root password, owner, device name, WiFi (scan → connect → save → autoconnect), timezone, and an optional NTP clock sync, so a fresh device is online and on-time before you reach the prompt. Every step is skippable; WiFi/clock steps self-skip on boards with no WiFi.
  • pkg reinstall <name> + force-removepkg reinstall removes the old copy first (clean repair), and pkg remove <name> --force can remove even a protected built-in for repair. The browser package installer re-installs cleanly too (it removes the existing copy first).
  • FileExp — a new TUI file explorer package (pkg install FileExp, commands files / fm / explorer): arrow-key navigation, view files, make folders, delete with confirm.
  • The Web Installer preserves your data by default — installing/updating from the browser now keeps your accounts, settings, WiFi, and packages (it removes only the old OS code, /Core). A Clean install checkbox is there if you want a full factory wipe.
  • Copy files from the browser — the Install page can push any file straight to a connected device over USB (non-destructive, no REPL needed).
  • RPCortex Communicator (tools/rpc_comm.py) — a PC-side serial companion: change registry values, sync the clock, move files both ways, install local/online packages, and update/reinstall the OS from your computer. pip install pyserial.

Under the hood

  • A new per-command exit-code + output-capture convention in RPCortex.py is what makes pipes, &&/||, and script conditionals possible — multi() is the captured data channel, while status messages stay visible like stderr. Commands signal failure simply by reporting an error, so the whole feature needed zero per-command rewrites.
  • The shell's command dispatch is now a single code path (_run_line_exec_pipeline_dispatch_line) shared by the interactive prompt, recovery mode, startup tasks, scripts, and watch.
  • Everything compiles cleanly with mpy-cross (the MicroPython compiler) and is unit-tested on CPython.

Bug fixes (since v0.8.1)

  • Saved WiFi passwords actually workwifi connect <ssid> was still reading the old removed 2-slot registry keys and never found saved passwords; it now reads networks.cfg and connects without re-prompting. Docs corrected: saved WiFi networks are unlimited (not "up to 2").
  • No more false "previous session ended unexpectedly" on every boot — the startup banner was reading the session-active sentinel that POST had just armed. It now reads the pre-POST value, so the warning only appears after a real crash (and the update-success / safe-mode banners finally appear when they should).
  • Built-in packages show in pkg list again on fresh installs — the Launchpad and Editor package stubs were missing from the image.
  • Every password prompt is masked — account creation, removal, password change, and wifi add now echo like login always did.
  • compile.bat ships the full OS — it now includes the PicoFetch and RPCMark packages in compiled builds (they were silently left out before).

Not in this release (deliberately)

  • True background tasks alongside an interactive prompt. Scheduled tasks run in their own foreground loop (task run) or headless at boot; running them concurrently with a live prompt needs cooperative multitasking (uasyncio), which is the v1.0 milestone. The shell's input read is blocking by design.
  • Lazy / ephemeral module imports — a memory optimisation carried to a later v0.9.x.

Installation

Fresh install / reinstall: Web Installer — flash from your browser over USB, no software needed (Chrome/Edge). It now preserves your data by default (accounts, settings, WiFi, packages) and only replaces the OS code; tick Clean install for a full factory wipe.

Update 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/os.rpc. User accounts, WiFi, settings, and installed packages are all preserved.

Manual: Flash MicroPython v1.25+ (v1.28 recommended), copy the image files, connect at 115200 baud, reboot. A compiled (.mpy) image is also available — it's ~44% smaller and imports faster; one architecture-neutral build runs on RP2040, RP2350, and ESP32. See BUILDING.md. Deploy it with mpremote.


Using rawrepl for a fresh install

If RPCortex is already installed and you want a completely fresh flash:

  1. At the shell prompt, run rawrepl
  2. The MicroPython REPL (>>>) becomes active in your terminal
  3. Open rpc.novalabs.app/install in Chrome or Edge
  4. Click Connect Device and flash as normal

No reinstall or full wipe needed — rawrepl just hands control back to MicroPython.


Known Limitations

  • MemoryError after heavy use — run freeup; reboot clears it completely. (Usually heap fragmentation, not low memory.)
  • The real-time clock is not battery-backed on a bare Pico — set it with ntp sync (or date set) after boot; it resets on power loss.
  • ESP32-S3 temperature reads ~300–450 °C — a hardware calibration quirk, not a bug.
  • HTTPS on Pico 1 W needs ~9.5 KB contiguous heap — run freeup first if a TLS request fails.
  • WiFi passwords are stored in plaintext (networks.cfg) — this hardware has no secure enclave.
  • The text editor needs a real serial terminal (PuTTY) — Thonny's REPL won't render it.

Author: dash1101. Issues and PRs welcome.