BKPT Architecture Brief
One C recorder in the customer's firmware, probes driven natively over USB, one UI-free Rust engine, one integration surface (CLI, SDK, file formats), and thin frontends on top: ViewAlyzer for trace, BKPT Studio for the whole firmware loop. Nothing above the engine owns a parser.
Layers, and what crosses each boundary
.vadb recordings (SQLite), .vacf connection configs, .vadomain custom event domains.How an outside toolchain plugs in
- Firmware side: the recorder is plain C under Apache-2.0 with no vendored dependencies, packaged for Zephyr modules and FreeRTOS hooks; it fits an IDE-generated project or a vendor pack without modification.
- Tool side: everything the desktop apps do is reachable through the headless CLI with stable JSON, the Python SDK, or the C ABI; an IDE or a monitoring tool integrates without touching Rust.
- Data side: recordings are SQLite files with a documented schema; connection configs and custom event domains are JSON.
- Probe side: ST-LINK, J-Link and CMSIS-DAP are driven over USB directly, so nothing else has to be installed: ViewAlyzer captures over them, BKPT Studio debugs and flashes over them; parts, SVDs and flash algorithms are catalog data, so any vendor's parts are first-class without a code fork.
Licence and IP posture
- Applications, engine and probe tools are proprietary; only the recorder (Apache-2.0) and the file formats leave our hands.
- Dependencies are Apache-2.0 / MIT; MPL-2.0 (file-level) admitted for four named crates. GPL, LGPL and AGPL in the link graph fail the build (
cargo denyin CI); unknown or git-sourced crates are refused. - GPUI (Apache-2.0) is consumed from crates.io only; Zed's GPL editor crates are not used or read. The code editor comes from an Apache-2.0 component library.
- Every transcribed asset is recorded in a provenance file per repo; third-party notices ship with each product.
- A ScanCode-based SCA pass (August 2026) covered the recorder and the shipping app; findings are tracked with the notices written.
Inventory
| Component | Language | What it is |
|---|---|---|
| ViewAlyzer Recorder | C | Ships inside the customer's firmware. Zephyr, FreeRTOS and bare-metal adapters; RTT, SWO/ITM and RAM-buffer transports; example projects for 13 boards across STM32 families and ADI MAX32657. |
| Engine + CLI | Rust | 12 crates, UI-free by construction. The headless CLI is the integration surface used by both apps, the SDK and automation. |
| ViewAlyzer desktop | Rust/GPUI | Timeline, tasks and CPU, timers, comms, ETM views, Trace Tune; renders the shared engine, owns no parsing. Captures only; never programs a part. |
| BKPT Studio | Rust/GPUI | Firmware IDE: editor with clangd, terminal, project tooling; debugging and flashing over the native probe drivers (own gdbserver, CMSIS-Pack FLM runner); ViewAlyzer's views as tiles. |
| Agent harness | Python | Tools over the CLI for an AI assistant, workflows with a permission model, package and toolchain setup. |
| viewalyzer-sdk | Python | On PyPI; wraps the CLI for scripts, CI and notebooks. |
| VS Code extension | TypeScript | On the Marketplace; bundles a pinned ViewAlyzer release. |
| Device catalog | Data | Parts, CMSIS-SVD files and (for Studio) FLM flash algorithms, fetched by id into a per-machine cache; STM32 families first. |
| BKPT#1 probe + host tools | FPGA, C | ETM instruction trace, on-chip and probeless modes for ViewAlyzer; the native-USB debug chain (gdbserver, flashing) for Studio. |
What lives in your firmware
The only code that ships inside your product is the ViewAlyzer Recorder: plain C under the Apache-2.0 licence, with no third-party source inside it. It uses your tree's RTT, CMSIS, FreeRTOS or Zephyr, never a copy of them, so there is nothing to reconcile with your own licence review.
- Zephyr: added as a west module; enable it with Kconfig.
- FreeRTOS: the standard trace hooks, one include in
FreeRTOSConfig.h. - Bare metal: the core alone, you call the event functions where they matter.
The transport is a configuration choice, not a code path: RTT and SWO stream live, the RAM buffer works with nothing but a debug probe and is the recommended way to start.
What you get back
A recording is a .vadb file: SQLite, with a documented schema. Open it in ViewAlyzer, query it with sqlite3, keep it next to the build it came from, or attach it to a bug report. Connection settings live in a .vacf JSON file you can commit; custom event definitions in a .vadomain file. Nothing leaves your machine: there is no cloud component and no account required to capture.
Scriptable by design
The desktop apps are thin. Everything they do goes through the same engine the command line exposes, so a capture in CI, a nightly regression on a bench board, or an agent that reads a trace all use one interface with stable JSON output and progress lines you can parse. The Python SDK wraps it for scripts and notebooks.
In CI
Flash, capture for ten seconds, export the CPU load per task as JSON, fail the build on a threshold.
On the bench
Record a reproduction, save the .vadb, hand it to whoever owns the driver. They open it without hardware.
With agents
The same CLI is the tool an assistant calls to answer "why did the control loop stall", from the actual trace.
Your probe, your parts
ST-LINK, J-Link and CMSIS-DAP probes are driven over USB directly, with our own implementation of the ST-LINK protocol: capture and memory reads while your firmware keeps running work with nothing else installed, and BKPT Studio adds a gdb server and flashing with CMSIS-Pack algorithms on the same drivers. If you prefer the vendor tools (ST-LINK gdbserver, STM32CubeProgrammer, the J-Link software), they are supported too and located where you installed them, never hard-coded. Parts, their SVD register descriptions and flash algorithms are catalog data, so a new device is a data update, not a new release. For instruction trace, the BKPT#1 probe adds ETM capture, on-chip trace and probeless modes.
One engine, every app
ViewAlyzer, BKPT Studio and the VS Code extension do not each parse recordings. They render one shared engine: the wire decoder, the Trace Domains that give raw records their meaning, the store and the analysis. A timeline in the IDE is the same timeline as in the desktop app, reading the same store. When a domain learns a new kernel object or a detector gains a new finding, every app has it.
Licensing you can audit
| PART | LICENCE | WHAT THAT MEANS FOR YOU |
|---|---|---|
| ViewAlyzer Recorder | Apache-2.0 | Ships in your product with no obligations beyond the notice; no vendored third-party code inside. |
| File formats | Open | SQLite and JSON; readable without our software. |
| Apps, CLI, SDK, engine | Proprietary | Our code. Dependencies are Apache-2.0 and MIT; copyleft licences are excluded from the build by policy and checked on every build. Third-party notices ship with each product. |
| BKPT#1 probe | Hardware | Works with the same apps and CLI; the recorder is unchanged. |