Trace captures serial byte streams in real time and turns them into structured, readable messages — RS232, RS485, USB serial, CAN. Define your own protocols declaratively in TrIML — without writing a single line of code.
One click, no sign-up: start with demo data or your own USB adapter (Chrome/Edge) – nothing to install. Guest access lasts two hours. What is stored
Trace takes the raw byte stream off the wire and delivers fully interpreted messages — with fields, enums, checksums and hierarchical descriptions. Live, persisted and searchable.
Four short clips of the TraceUI at work: a fleet of drones sends MAVLink telemetry, Trace decodes every frame on arrival — and finding the one that matters takes a keystroke.
Recorded in the browser against a running Trace server. The drone telemetry is simulated with the public MAVLink protocol and decoded by the MAVLink interpreter from the protocol library.
Capture, decode, search, trigger, record — and do it all remotely through the hub. All in a single interface.
Fields, branches, checksums and enums in XML — the engine evaluates them at runtime; every new version is ready for the next session.
Lock-free SPSC ring buffer in the hot path. Every byte gets a millisecond timestamp taken in one atomic call — no errors at second boundaries.
Full-text search across all messages with O(log n) navigation, combinable port filters and live matches — directly in the live stream.
Declarative predicates evaluate every frame — with its own hit list per trigger.
Every recording lives entirely in a single .msf file — including the finished interpretation. No interpreter needed to open it.
Secure access to probes and nodes behind NAT and firewalls — Ed25519-signed, no inbound port forwarding, with a live dashboard.
A complete TrIML definition — and the frame the engine builds from it at runtime. Safe to try out via POST /api/interpreters/dryrun.
<?xml version="1.0" encoding="utf-8"?> <Trace-Interpreter-Definition> <interpreter name="My-Interpreter" type="FrameOriented" /> <definition> <!-- Value table (enum) --> <valuedescriptor type="byte" name="type-desc"> <descriptor value="0x01" label="Status" /> <descriptor value="0x02" label="Command" /> </valuedescriptor> <!-- The message --> <message> <const type="byte" value="0x02" name="STX" /> <byte name="Type" valuedescriptor="type-desc" /> <byte name="Length" /> <array sizeRef="Length" name="Payload" /> <const type="byte" value="0x03" name="ETX" /> <match label="Frame" /> </message> </definition> </Trace-Interpreter-Definition>
Native C99 capture engine, .NET 10 server with interpreters, real-time push via SignalR — all the way into the WASM interface.
Physical interfaces deliver the raw byte stream.
Plugins, SPSC pipes, timestamps, per-port buffer files.
TrIML engine, 14 REST controllers, SignalR hub, sessions.
Canvas-rendered WASM interface in the browser, delivered by the hub.
Measure where the wire is. Compute where the machine is. Manage everything in one place: probes at the measurement sites deliver bytes, nodes run the workers, and the hub sits above both and ties them together.
The probe dials the hub, never the other way around. Both its connections, control and bytes, are outbound — so no port has to be opened behind NAT or firewalls.
The node also opens its tunnel outbound. The hub uses it in the opposite direction: it starts one worker per session there and passes the bytes through.
The interface never talks to a worker directly. Every request goes through the hub's proxy paths, which check ownership and the session token.
A standalone process right at the hardware. It keeps the native capture engine running, gives every byte a gap-free index and timestamp, and pushes the stream outbound. Several probes at different sites can feed one session at the same time — the common time base comes from the hub.
A node is the machine the workers run on — a dedicated process per session that detects frames, writes them to the session file and serves them. With Bring Your Own Node this machine belongs to the customer: compute and recordings stay in-house — without opening a single inbound port.
The layer above everything: accounts and tenants, probe and node pairing, the start and end of every session, routing from the browser into exactly the right worker. It never processes trace data itself — it only brokers it. And it is the single clock source, so timestamps stay comparable across all measurement sites.
The TrIML reference takes you from your first message to the complete element reference — with patterns, examples and live testing.