Changelog
Changelog
Section titled “Changelog”All notable changes to Lapilli are documented here. Format follows Keep a Changelog.
[Unreleased]
Section titled “[Unreleased]”[0.9.1] — 2026-06-02
Section titled “[0.9.1] — 2026-06-02”- Site: three content pages (
installation,quickstart,virtual-devices) used MDXimportsyntax and Starlight JSX components (<Tabs>,<Steps>,<Card>) but were stored as.mdfiles. Astro’s content layer processed them as plain Markdown and rendered the import statement as visible text in the page. Renamed to.mdxand cleared the stale build data-store (node_modules/.astro/data-store.json), which held a cached digest for the old.mdentries and caused the glob loader to skip MDX promotion even after the rename.
[0.9.0] — 2026-06-02
Section titled “[0.9.0] — 2026-06-02”Documentation site release.
- Static documentation site (
site/) built with Astro 6 + Starlight 0.39, published on the VPS via Gitea Actions + Caddy. - 8 content pages in English: Installation, Quick Start, Dashboard, Virtual Devices, Hardware Porting, HAL API Reference, Architecture, Simulation Bus.
- Custom theme: logo-extracted palette (terracotta + cream + warm black), JetBrains Mono, dark/light mode.
site/scripts/sync.mjs: build-time reuse of rootCHANGELOG.mdand logo/banner assets — no manual duplication..gitea/workflows/docs.yml: builds and deploys the site on every push tomain.- Self-hosted runner upgraded to Node.js 22 (required by Astro 6.4).
[0.8.2] — 2026-06-01
Section titled “[0.8.2] — 2026-06-01”Documentation and presentation release (no changes to HAL, bridge, or UI).
- Screenshots of the dashboard in the README.
- Status and maturity note for new visitors.
- This public
CHANGELOG.mdandCONTRIBUTING.md.
[0.8.1] — 2026-06-01
Section titled “[0.8.1] — 2026-06-01”- Full E2E Playwright suite now runs in CI (124 tests, Chromium headless on the self-hosted runner).
[0.8.0] — 2026-05-31
Section titled “[0.8.0] — 2026-05-31”- Logic analyzer — GPIO events (direction changes, writes, toggles) rendered as a step-plot trace on a Canvas 2D scope.
- Oscilloscope — ADC readings rendered as a continuous line trace on the same scope.
- Detachable scope window — the scope panel can be floated as a resizable, draggable overlay and re-attached to the bottom dock.
- Bridge-authoritative timestamps injected on every WebSocket message.
[0.7.3] — 2026-05-30
Section titled “[0.7.3] — 2026-05-30”- Continuous integration via Gitea Actions on a self-hosted runner: HAL C tests and bridge pytest suite run automatically on every push and pull request.
[0.7.2] — 2026-05-30
Section titled “[0.7.2] — 2026-05-30”- Pause / resume firmware at runtime via
SIGSTOP/SIGCONT(button in the header, keyboard shortcutP). - Keyboard shortcuts for all common actions — tool selection (
W/S/P), zoom (+/-/0), rotate (R), flip (F), delete (Del), wire cancel (Esc). Press?for the overlay.
[0.7.1] — 2026-05-29
Section titled “[0.7.1] — 2026-05-29”- Component rotation and flip — user components (LED, button, pot) can be rotated in 90° steps and mirrored.
- GND / VDD structural rails — dedicated rail components with explicit power gating: a LED wired but without a GND rail shows an amber “floating” state instead of silently misbehaving.
[0.7.0] — 2026-05-29
Section titled “[0.7.0] — 2026-05-29”- Interactive canvas with pan, zoom, and snap-to-grid.
- Wire-based component binding — drag a wire from an MCU pin to a component pin to connect them; the connection is functional, not cosmetic.
- Scene persistence — save the current canvas to a JSON file and reload it with
run.py --scene path.json. - Stop firmware button — cleanly terminates a running firmware without restarting the bridge.
[0.6.0] — 2026-05-28
Section titled “[0.6.0] — 2026-05-28”- SPI peripheral in the HAL (
lpl_spi_init,lpl_spi_transfer, …) with POSIX simulation via the sim bus. - I2C peripheral in the HAL (
lpl_i2c_init,lpl_i2c_write,lpl_i2c_read, …) with POSIX simulation. - Virtual device framework — Python classes that simulate real sensors and respond to bus transactions. Included devices: MAX31855 (SPI thermocouple), SHT31 (I2C temperature + humidity).
- Bus panel in the UI — tabbed SPI / I2C transaction log with manual reply injection.
- Examples:
spi_thermo(MAX31855) andi2c_sht31(SHT31).
[0.5.0] — 2026-05-27
Section titled “[0.5.0] — 2026-05-27”- Multi-node dashboard — run multiple firmware instances simultaneously; each gets its own MCU card, UART tab, and event stream.
- Process manager in the bridge —
--firmwareflag repeatable; firmware processes are spawned, supervised, and torn down cleanly. - E2E test framework — Playwright test suite with a mock bridge; no real firmware required for UI tests.
[0.1.0 – 0.4.0] — 2026-05
Section titled “[0.1.0 – 0.4.0] — 2026-05”Foundation releases.
- HAL public interface (
hal/hal.h) covering GPIO, UART, timer, and ADC. - POSIX port — full simulation on Linux / macOS via Unix sockets and pthreads.
- STM32L4 port — GPIO, UART, and timer implemented; ADC, SPI, I2C are compilable stubs pending hardware testing.
- Simulation bus — Unix socket protocol between firmware and bridge; multi-client broadcast.
- Web dashboard — Python asyncio bridge + Svelte 5 frontend served by Vite; real-time event log, sensor injection panel, UART console.