0.5.0 — preliminary live-mode testing
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.jsonships 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
.nfrwith 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_windowRPC (DOUBLE PRECISION bucket). - Default bucket auto-picked from session duration; sub-second granularity supported (50 ms floor).
- New
get_session_signal_idsloose-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/portsenumerates likely USB-serial devices). POST /api/configtriggers a parser restart forserialPort/replayFile/replaySpeed/dbcPathchanges.- 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_readingsin 200-row batches, best-effort.
Database
- Local: 12 migrations through
0012_lazy_replay_fetch.signal_idpromoted SMALLINT → INTEGER to fix sequence overflow. - Cloud: 1 migration dropped
sd_readings(and 1.5M-row partitions) and addedsession_blobs+ cloud-bookkeeping columns. Old data preserved inbackups/supabase-pre-parquet/as gzipped NDJSON.
Known limitations
- Basestation firmware needs the
processIncomingPacketsexplicit-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: falseskips native rebuild. Upload/pull paths require duckdb at runtime; install fails gracefully with a clear message if missing.