Skip to content

Changelog

All notable changes to Lapilli are documented here. Format follows Keep a Changelog.


  • Site: three content pages (installation, quickstart, virtual-devices) used MDX import syntax and Starlight JSX components (<Tabs>, <Steps>, <Card>) but were stored as .md files. Astro’s content layer processed them as plain Markdown and rendered the import statement as visible text in the page. Renamed to .mdx and cleared the stale build data-store (node_modules/.astro/data-store.json), which held a cached digest for the old .md entries and caused the glob loader to skip MDX promotion even after the rename.

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 root CHANGELOG.md and logo/banner assets — no manual duplication.
  • .gitea/workflows/docs.yml: builds and deploys the site on every push to main.
  • Self-hosted runner upgraded to Node.js 22 (required by Astro 6.4).

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.md and CONTRIBUTING.md.

  • Full E2E Playwright suite now runs in CI (124 tests, Chromium headless on the self-hosted runner).

  • 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.

  • 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.

  • Pause / resume firmware at runtime via SIGSTOP / SIGCONT (button in the header, keyboard shortcut P).
  • 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.

  • 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.

  • 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.

  • 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) and i2c_sht31 (SHT31).

  • Multi-node dashboard — run multiple firmware instances simultaneously; each gets its own MCU card, UART tab, and event stream.
  • Process manager in the bridge — --firmware flag 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.

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.