Modular is a desktop app for real-time instrumentation, dashboards, and firmware workflows. It is built on Electron + Freeboard with custom widgets for serial, plotting, and device control.
Modular is built for fast feedback loops: connect hardware, stream data, visualize behavior, and iterate without leaving the dashboard.
- Own your data: local-first dashboards, no cloud dependency.
- Real-time insight: live plots, gauges, and terminals for fast iteration.
- Hands-on tooling: flash firmware, record CSVs, and build repeatable test setups.
- Community-ready: widget docs and examples ship with the app.
- Serial datasources: parse numeric streams with custom separators and end-of-line rules.
- Plotting: uPlot-based charts with UI + channel manager helpers.
- Recording: CSV capture with timestamps and ordering options.
- Flashing: mcumgr integration for supported boards.
- ThingSet over CAN: local tooling to scan and query nodes.
- Bring-up dashboards: live plots + gauges + terminal logs in one view.
- Test benches: repeatable runs with CSV recording, tagged outputs, and saved dashboards.
- Operator panels: device selectors, setpoints, and status toggles in a clear layout.
- Lab notebooks: ship examples and docs with the app so experiments are reproducible.
- Composable widgets: mix plots, gauges, terminals, and control panels in a single dashboard.
- Helper widgets: auto-spawn UI controllers and channel managers for faster setup.
- Dashboard portability: save and load dashboards as JSON and share with teammates.
- Local-first workflow: no account needed, no cloud required, no telemetry by default.
- Documentation inside the app: per-widget help tabs and examples ship with the binaries.
The dashboard supports a plot and a gauge widgets.
The plot widget can be used to trace data (here a sine wave)
The gauge widget can be used to create warnings.
Firmware upload is supported by mcuboot and Serial port.
- Install Node.js 20 or later.
- Install dependencies:
On Windows,
npm install
socketcanis optional and will be skipped. This is expected. - Launch in development:
The dashboard loads from
npm start
app/dashboard. - Build distributables:
Packages are placed in
npm run dist
dist/.
- Widget docs and examples live under
app/docs/andapp/dashboard/docs/. - Example dashboards for development live under
dev/test_dashboards/.
- Connect a serial datasource (mock or real hardware).
- Inspect with a terminal and a quick plot or gauge.
- Control using setpoints or actions in dedicated widgets.
- Record a CSV for analysis and share the dashboard JSON with your team.
JavaScript implementation lives in app/js/:
app/js/ts_can_utils.js– CAN ID builder and ISO-TP response reassembly.app/js/thingset_bin.js– ISO-TP TX/RX and ThingSet client (ThingSetCAN).app/js/scan.js– scans the bus, writesthingset/nodes.json.app/js/query_nodes.js– explores a node tree, writesthingset/node_<addr>_tree.json.app/js/can_adapter.js– CAN bus wrapper (SocketCAN on Linux,ffi-napivendor driver on Windows).
Dependencies:
socketcan(Linux) andcbor(inpackage.json)- Windows optional:
ffi-napi+ref-napiwith vendor DLL
Commands:
- Scan the bus:
npm run scan:can - Build node trees:
npm run ts:query - Basic client test:
npm run ts:test
- Script:
app/scripts/setup_can_linux.shconfigurescan0at 500000 bps. - IPC:
ipcRenderer.invoke('can-setup-linux')usespkexecfor GUI auth. - Linux-only; ensure a PolicyKit agent is running.
- CAN via SocketCAN is Linux-only.
- Windows CAN requires a vendor driver and
ffi-napibinding (seeapp/js/can_adapter.js). - If native modules need to build, install MSVC Build Tools and Python.
app/main.js– Electron main process for serial and IPC.app/flasher.js– mcumgr firmware flashing helper.app/dashboard/– bundled Freeboard + custom plugins.dev/test_dashboards/– dev/test dashboards.
MIT License. See app/dashboard/LICENSE for Freeboard components bundled with the app.




