Skip to content

0.5.0 — preliminary live-mode testing

Choose a tag to compare

@github-actions github-actions released this 25 May 22:31
· 87 commits to main since this release

First end-to-end build of the cloud rework + lazy-replay refactor.

Cloud architecture

  • Bulk session data lives in DigitalOcean Spaces as Parquet (one file per CAN message source, per session).
  • Supabase Postgres holds metadata only: sessions, signal_definitions, session_blobs.
  • Bundled cloud-defaults.json ships in the .app, so reads work on first launch with no credentials. Spaces write credentials remain user-supplied.

Sync model (README "Syncing data with the cloud")

  • Push (Upload selected / Upload all): local → cloud, local wins.
  • Pull (Pull selected): cloud → local, cloud wins. Wipes local rows for that session and re-imports.
  • Live frames optionally mirrored to Supabase rt_readings (truncated nightly via pg_cron).

Storage UX

  • New Settings → Storage tab with Local / Cloud sub-tabs.
  • Local: per-day grouping, multi-select, Upload selected, Delete local copy, Upload all for first-time migration.
  • Cloud: grouped by day with size estimate, multi-select pull with confirm modal, alreadyLocal flag prevents redundant re-downloads.

CSV

  • Long-form CSV export (timestamp,source,signal_name,value) on desktop and web.
  • Long-form CSV import on desktop. Re-importing the same .nfr with a different DBC overwrites the previous parse.

Replay graphs — lazy per-window fetch

  • Old bulk-overview preload is gone. Replay fetches per-signal per-visible-window via the new get_signals_window RPC (DOUBLE PRECISION bucket).
  • Default bucket auto-picked from session duration; sub-second granularity supported (50 ms floor).
  • New get_session_signal_ids loose-index-scan RPC.
  • Graph widgets render translucent min/max bands behind the average line.
  • Shared zoom across all graphs with correct compose semantics. Double-click any graph to reset.

Live mode

  • Serial port picker in Settings (/api/serial/ports enumerates likely USB-serial devices).
  • POST /api/config triggers a parser restart for serialPort/replayFile/replaySpeed/dbcPath changes.
  • Parser wire format: [rssi i16][snr f32][len u8][payload]. Basestation firmware patch pending to make end-to-end frames decode.
  • Optional live-stream toggle: parser frames → Supabase rt_readings in 200-row batches, best-effort.

Database

  • Local: 12 migrations through 0012_lazy_replay_fetch. signal_id promoted SMALLINT → INTEGER to fix sequence overflow.
  • Cloud: 1 migration dropped sd_readings (and 1.5M-row partitions) and added session_blobs + cloud-bookkeeping columns. Old data preserved in backups/supabase-pre-parquet/ as gzipped NDJSON.

Known limitations

  • Basestation firmware needs the processIncomingPackets explicit-serialization patch before end-to-end live frames decode. Desktop side is correct; downstream byte stream is not yet in the expected format.
  • Web app (Vercel) still calls dropped Supabase RPCs — separate plan tracks the DuckDB-wasm migration. Use the desktop until that lands.
  • DuckDB ships as optionalDependency; npmRebuild: false skips native rebuild. Upload/pull paths require duckdb at runtime; install fails gracefully with a clear message if missing.