Skip to content

Releases: MartenH/blobly_net

Blobly Net v2026.09.01

Choose a tag to compare

@github-actions github-actions released this 13 Sep 16:59
333ac4a

What this version's claims rest on. The protocol engine and the virtual paths
(simulation, the in-process bus, DoIP, replay) are unit-tested and run in CI on every push.
SocketCAN I/O is exercised on the maintainer's bench (vcan and real adapters), not in
CI — the CI environment has no vcan. The Windows vendor CAN backends (Vector, PCAN,
Kvaser) and the CANsub backend (a USB network adapter, both platforms) are hand-verified
on real hardware
— Vector on a VN1630A at bus saturation — see
windows_can_hardware.md.
Vendor DLLs (vxlapi64.dll, PCANBasic.dll, canlib32.dll) are not bundled — they
come with the vendor's driver install, and the Vector XL terms forbid redistributing theirs.

The Linux tar.gz needs the distro runtime: sudo apt install libglfw3 libfreetype6 libgl1.
The Windows zip is self-contained.

What's Changed

  • vgui: the GCC runtime does travel, and the comment said otherwise by @MartenH in #321
  • release: an AppImage, so a Linux user does not have to apt-install anything first (#322) by @MartenH in #323
  • release: v.mod 2026.09.01 by @MartenH in #324

Full Changelog: v2026.09.00...v2026.09.01

Blobly Net v2026.09.00

Choose a tag to compare

@github-actions github-actions released this 13 Sep 12:42
07c7e20

What this version's claims rest on. The protocol engine and the virtual paths
(simulation, the in-process bus, DoIP, replay) are unit-tested and run in CI on every push.
SocketCAN I/O is exercised on the maintainer's bench (vcan and real adapters), not in
CI — the CI environment has no vcan. The Windows vendor CAN backends (Vector, PCAN,
Kvaser) and the CANsub backend (a USB network adapter, both platforms) are hand-verified
on real hardware
— Vector on a VN1630A at bus saturation — see
windows_can_hardware.md.
Vendor DLLs (vxlapi64.dll, PCANBasic.dll, canlib32.dll) are not bundled — they
come with the vendor's driver install, and the Vector XL terms forbid redistributing theirs.

The Linux tar.gz needs the distro runtime: sudo apt install libglfw3 libfreetype6 libgl1.
The Windows zip is self-contained.

What's Changed

  • A spawned open hands its bus over by value, not by the address of its own stack by @MartenH in #244
  • A CANsub monitor is judged by its receive counter, and the device name is resolved once per process by @MartenH in #243
  • The Buses tick is a project edit, and a CANsub name is looked up when the project loads, not at Start by @MartenH in #249
  • The CANsub connection stays open: one TLS connection per device, a reader that stops at the end of the reply by @MartenH in #248
  • One Save: Ctrl+S from anywhere, the menu, and a "saved" the eye can see by @MartenH in #250
  • A CANsub write is bounded, so a Stop behind a hung send is too by @MartenH in #251
  • Normal is the default: listen-only is a tick, off is the row tick, monitor is normal, and the Log follows by @MartenH in #253
  • Kvaser echoes its own sends to its sibling handles, so wiretap claims them by @MartenH in #255
  • Quick send has a Send and one field per line; the Log has a clock and a Clear; every row says it is open by @MartenH in #256
  • Start opens the transmit taps on a worker, so a slow CANsub open no longer freezes the window by @MartenH in #257
  • A session log file: every Log line, everything that went to stderr, and the facts a bug report needs by @MartenH in #259
  • The transmit-tap lifecycle is four tested rules, and the GUI calls them by @MartenH in #261
  • A CANsub name is asked of the device by mDNS, and the Log says how it was found by @MartenH in #262
  • Bus load: a strip and a number per wire, and the busiest wire on the toolbar by @MartenH in #263
  • gui: narrate "bus ok" when the wire first answers, not a second later by @MartenH in #265
  • transport(cansub): survive a TLS handshake a signal interrupted by @MartenH in #264
  • gui(trace): the cycle window restarts at a Start and at a dropout by @MartenH in #266
  • gui(config): point an existing bus at a detected interface by @MartenH in #267
  • gui(config): don't let a Buses-tab Save silently drop .blobnet comments (#80) by @MartenH in #268
  • docs(roadmap): the "kept last" line goes last by @MartenH in #274
  • project(test): the unreadable-rows test holds on a Windows bench with a Vector driver (#252) by @MartenH in #276
  • script(doip): doip.listen honours from — the channel's own port, refusing a contradiction (#233) by @MartenH in #275
  • gui(gen): generator signals can sweep — share the value source with the simulator by @MartenH in #269
  • gui: a late rx_loop write checks that the row is still its own, not only the run (#140) by @MartenH in #277
  • replay: a classic channel says how many CAN-FD frames it is about to refuse (#184) by @MartenH in #279
  • vectorcheck: a failed channel restore fails the command, exit 3, naming the way back (#197) by @MartenH in #278
  • ci: pin V to the last master commit a green run built (master is V3-only now) by @MartenH in #282
  • codex watcher: identify a body-only review by its /blob/ link when it carries no marker by @MartenH in #281
  • candb: read AUTOSAR ARXML as a database; arxml2dbc export (#272) by @MartenH in #273
  • candb(arxml): the leaf table — one schema-like check over every leaf the reader depends on (#280) by @MartenH in #283
  • ci: pin the V bootstrap (.vc-version), because pinning .v-version alone never was a pin by @MartenH in #285
  • restbus: the transmit loop gets its own frame, and why -prod is not on yet by @MartenH in #284
  • stop() waits for its workers, and a run restores which buses the project enables (#107, #125) by @MartenH in #286
  • isotp: honour Flow Control — CTS/WAIT/OVERFLOW, block size and STmin (#226) by @MartenH in #290
  • isotp(test): stop two flow-control tests depending on seventeen timed reads by @MartenH in #291
  • Say when a verify: entry describes traffic we send ourselves (#95) by @MartenH in #289
  • Settle line endings: .gitattributes, and one renormalising commit (#207) by @MartenH in #292
  • gui: bus topology is fixed at Start; the workload stays live (#120) by @MartenH in #294
  • chore: .git-blame-ignore-revs for the renormalising commit (#207 follow-up) by @MartenH in #293
  • project: a generator's bus: is a channel NAME (#97) by @MartenH in #295
  • test(isotp, transport): a deadline on an event that MUST happen is a hang-breaker by @MartenH in #298
  • telem: TraceRsp cause 3 (full) — a oneshot that completed on its own by @MartenH in #301
  • wiretap: evict in place — the ring rebuilt itself on every emitted frame, and replay stuttered by @MartenH in #299
  • replay: the hot paths stop allocating, the worker stops spinning, and the trace draws from buffers it keeps by @MartenH in #300
  • replay: the arena — a loaded recording as pointer-free rows the collector never walks, played through views by @MartenH in #303
  • gui: the picker's grammar and drives, content-sized tables, the Script panel's Browse/Edit/output (#270) by @MartenH in #305
  • gui: dialogs that do not dock, a drive row with WSL, Preferences with an external editor, the Script panel's divider and discard (#306) by @MartenH in #307
  • gui: the settings file is last-writer-wins, like the layout file beside it (#309) by @MartenH in #310
  • gui: the app writes the layout file, so a half-written one is not what the next start reads (#308) by @MartenH in #311
  • test(transport): scheduling and the wake-up are two events, so they get two deadlines (#304) by @MartenH in #312
  • isotp(software): the dirty window ends at a successful recv, and a skipped orphan explains the silence (#296) by @MartenH in #314
  • probe: the group-failure count loaded, and the interval that crosses the endpoint kept (#302) by @MartenH in #313
  • test(isotp): measure a 60 ms pacing claim with a clock finer than 15.6 ms by @MartenH in #316
  • ci: keep the Linux binary this job already builds by @MartenH in #317
  • packaging: stop statically absorbing GLib, and ship the licence texts (#318) by @MartenH in #319
  • release: audit, and v.mod 2026.09.00 by @MartenH in #320

Full Changelog: v2026.08.01...v2026.09.00

Blobly Net v2026.08.01

Choose a tag to compare

@github-actions github-actions released this 28 Aug 18:13
f768e2e

What this version's claims rest on. The protocol engine and the virtual paths
(simulation, the in-process bus, DoIP, replay) are unit-tested and run in CI on every push.
SocketCAN I/O is exercised on the maintainer's bench (vcan and real adapters), not in
CI — the CI environment has no vcan. The Windows vendor CAN backends (Vector, PCAN,
Kvaser) and the CANsub backend (a USB network adapter, both platforms) are hand-verified
on real hardware
— Vector on a VN1630A at bus saturation — see
windows_can_hardware.md.
Vendor DLLs (vxlapi64.dll, PCANBasic.dll, canlib32.dll) are not bundled — they
come with the vendor's driver install, and the Vector XL terms forbid redistributing theirs.

The Linux tar.gz needs the distro runtime: sudo apt install libglfw3 libfreetype6 libgl1.
The Windows zip is self-contained.

What's Changed

Full Changelog: v2026.08.00...v2026.08.01

Highlights

  • CANsub devices appear in the Discover dialog (#235, #236). A CANsub is a USB network adapter, so no interface listing ever saw it; the dialog now browses mDNS for _cansub._tcp on every IPv4 interface (about 0.7 s, off the render thread) and offers a row per channel. "Could not look" — port 5353 refused, no interface, a query that could not be sent — is said in the dialog rather than shown as an empty list. Bench-verified from Linux/WSL against a CANsub.4; the Windows half is type-checked only, so if the device does not appear there, check that Windows Firewall allows blobly_net.exe inbound UDP 5353.

Blobly Net v2026.08.00

Choose a tag to compare

@github-actions github-actions released this 28 Aug 15:47
d7c3a82

What this version's claims rest on. The protocol engine and the virtual paths
(simulation, the in-process bus, DoIP, replay) are unit-tested and run in CI on every push.
SocketCAN I/O is exercised on the maintainer's bench (vcan and real adapters), not in
CI — the CI environment has no vcan. The Windows vendor CAN backends (Vector, PCAN,
Kvaser) and the CANsub backend (a USB network adapter, both platforms) are hand-verified
on real hardware
— Vector on a VN1630A at bus saturation — see
windows_can_hardware.md.
Vendor DLLs (vxlapi64.dll, PCANBasic.dll, canlib32.dll) are not bundled — they
come with the vendor's driver install, and the Vector XL terms forbid redistributing theirs.

The Linux tar.gz needs the distro runtime: sudo apt install libglfw3 libfreetype6 libgl1.
The Windows zip is self-contained.

Highlights

  • CSS Electronics CANsub — a fourth hardware backend, and the first that is neither a vendor DLL nor platform-gated: a USB network adapter reached over REST + WebSocket, the same cansub:<device-id>/<channel> string on Linux and Windows, no driver. Hand-verified on a CANsub.4: classic, extended, 64-byte CAN-FD with BRS at a 2 Mbit/s data phase, listen-only reaching the controller (#204, #223).
  • Rest bus from a real recording — replay an .mf4 or candump capture onto live buses with the ECU under test subtracted by DBC sender, several recorded buses mapped onto several live channels from one clock, and a Scan dialog that picks both from the file; cmd/restbus headless (#98).
  • Bus.diagnostics() — dropped, controller-error and undecodable records on every backend, beside health: a chip on the Buses row, narrated by the Log, printed by the headless runner (#213).
  • One reader per shared wire — a second open of a PCAN or CANsub wire is a subscriber, not a competitor for frames (#212); the first open reserves the wire and runs its factory outside the process-wide lock, so a stalled device stalls only its own openers (#211).
  • CAN-FD everywhere — PCAN completes the set; framing is declared per wire and stamped once, replay reproduces what was recorded (#217, #185).
  • Numbering is calendar-based from this release — YYYY.MM.PATCH, so v2026.08.00; see docs/releasing.md. Formats and the .blobnet schema are still not a compatibility promise.

What's Changed

  • A channel that fails to open says so in the Log, on every platform by @MartenH in #141
  • Bus-off can reach the screen, and the trace never claims a send that did not happen by @MartenH in #143
  • A logo for the README, keyed for both GitHub themes by @MartenH in #144
  • One build recipe, and nothing to fetch: the Windows build works from a clone by @MartenH in #145
  • One wire, one handle: PCAN opens share a refcounted bus by @MartenH in #148
  • The grouped trace reads in milliseconds, the unit CAN is specified in by @MartenH in #151
  • Loop is a control, not a setting, and the position is drawn once by @MartenH in #160
  • A bus warning degrades a wire; it must not remove it by @MartenH in #162
  • Four panels of output you can finally get out of the app by @MartenH in #163
  • listen-only is a promise the wire keeps, not one each emitter remembers by @MartenH in #164
  • A channel's configuration belongs to its open ports, so ask them before enabling a row by @MartenH in #166
  • A wire that goes quiet says so, where the operator is looking by @MartenH in #159
  • A focused window says so, and a tab admits it can be dragged by @MartenH in #169
  • The review tooling could not run on Windows at all by @MartenH in #168
  • Two application channels on one transceiver is a configuration, and it is refused by @MartenH in #173
  • Vector hands our own frames back, so stop filing them as the ECU's by @MartenH in #174
  • The module suite could not pass on Windows, and said so twice by @MartenH in #176
  • An mf4 remote frame is a frame, not a group to skip by @MartenH in #175
  • No test may own a port that another run might want by @MartenH in #178
  • A test says which project it needs, instead of CI remembering by @MartenH in #180
  • CAN-FD on Vector: the data rate in the address is what asks for it by @MartenH in #182
  • CAN-FD in the app: a data-rate field, and a row that says what its adapter cannot do by @MartenH in #183
  • Say which Vector channels can carry CAN-FD, because the driver knows by @MartenH in #189
  • Assign Vector hardware from the Discover dialog, and say when the application is missing by @MartenH in #192
  • How a Vector bench is set up, and where the CAN-FD data rate actually lives by @MartenH in #188
  • An unreadable Vector channel is not an unused one, and vectorcheck reports a rate the wire could produce by @MartenH in #199
  • CAN-FD on Kvaser, proved on the bench rather than in a comment by @MartenH in #200
  • The channel's format reaches the frames we build, not just the ones we replay by @MartenH in #202
  • A Kvaser remote frame arrives as a remote frame, not as data by @MartenH in #205
  • The Replay panel command protocol moves to where a test can reach it by @MartenH in #209
  • A remote frame asks for a message; it does not send one by @MartenH in #210
  • A CANsub is a Bus, and a bitrate means the same thing to two vendors by @MartenH in #204
  • Remote frames: drop transmit support, keep decoding by @MartenH in #216
  • CAN-FD on PCAN, and a parity table to say what finished means by @MartenH in #217
  • A listen-only PCAN or Kvaser was still acknowledging every frame it saw by @MartenH in #219
  • Give every shared-wire handle its own receive cursor (#212) by @MartenH in #221
  • A CANsub cannot change listen-only mid-run, and had been failing to in silence by @MartenH in #223
  • An idle PCAN wire cost a thousand driver reads a second; now it costs none by @MartenH in #224
  • isotp.open exists on every platform, and CI type-checks every cmd/ tool for both by @MartenH in #225
  • A failed raw write keeps its pending TX ack entry for a grace, and the hub-test fakes are per instance (#227) by @MartenH in #228
  • The in-process diagnostics test's server runs until told to stop, not for 3000 ms (#191) by @MartenH in #229
  • The first open of a shared wire runs its factory outside the registry lock, behind a reservation (#211) by @MartenH in #230
  • Bus.diagnostics(): what a backend knows that is neither a frame nor a health rung (#213) by @MartenH in #231
  • CI skips V's experimental V3 compiler, which was building every test program twice and phoning home by @MartenH in #232
  • Release 2026.08.00: the documentation audited against the code, CalVer adopted, v.mod bumped by @MartenH in #234

Full Changelog: v0.1.0...v2026.08.00

Blobly Net v0.1.0

Choose a tag to compare

@github-actions github-actions released this 21 Aug 12:11
2f2b70f

What this version's claims rest on. The protocol engine and the virtual paths
(simulation, the in-process bus, DoIP, replay) are unit-tested and run in CI on every push.
SocketCAN I/O is exercised on the maintainer's bench (vcan and real adapters), not in
CI — the CI environment has no vcan. The Windows vendor CAN backends (Vector, PCAN,
Kvaser) are hand-verified on real hardware
— Vector on a VN1630A at bus saturation — see
windows_can_hardware.md.
Vendor DLLs (vxlapi64.dll, PCANBasic.dll, canlib32.dll) are not bundled — they
come with the vendor's driver install, and the Vector XL terms forbid redistributing theirs.

The Linux tar.gz needs the distro runtime: sudo apt install libglfw3 libfreetype6 libgl1.
The Windows zip is self-contained.

First release — every PR in this history

  • A version the binary answers with, and a tag that publishes it (#137)
  • The stopped Replay panel shows the fan-out: one recording, one clock, its wires beneath it (#136)
  • Scan the recording: bus: and exclude: picked from facts, not typed from memory (#135)
  • Add codex review watcher scripts (#134)
  • Replay panel: transport controls for running replay channels (#133)
  • DBC Editor: floats by default, and its panes finally slide (#132)
  • A remote frame is its own trace row, and a trimmed import keeps the file's frame numbers (#130)
  • A bigger fixed window, not a maximized one — and Reset Layout (#129)
  • Every capture control lives with the capture, and the trace says what it shows (#128)
  • Trace: idx, µs timestamps, len, flags and fps columns; start maximized (#127)
  • Closes #123: split main.v into per-concern files — move code, change nothing (#126)
  • Read the current CLAUDE.md, not the one the checkout happens to hold (#124)
  • One script to get a virtual bus back: setup_vcan.sh (#122)
  • Docs: describe the current state, and say what "verified" means (#118)
  • Say what to do when review findings repeat in one path (#116)
  • Vector XL backend: a VN channel is a bus like any other (#114)
  • Closes #98: a replay channel plays, and every channel of one recording shares its clock (#113)
  • Replay several recorded buses at once, on one clock (#111)
  • The codex verdict is a review, not an issue comment (#110)
  • CAN-FD: carry the frame the recording actually captured (#109)
  • Read the CAN-FD captures whose payloads live in an SD block (#108)
  • Closes #105: TX 3 · TX-S 1376 — the header counts what we sent, split by origin (#106)
  • The overview screenshot shows what origin is for (#104)
  • perf(wiretap): stop rebuilding the pending ring on every claim (#103)
  • Closes #90: read the one piece of provenance a recording can carry (#102)
  • Closes #96: one injective key, tested where it can be (#101)
  • Anchor the replay work (#98) where people meet it (#100)
  • The origin column speaks CAN: TX, TX-S, RX (and REP) (#99)
  • An imported recording keeps its buses apart (#94)
  • Clean up what the announcement-trigger removal left behind (#93)
  • The trace says whose frame it is: TST / SIM / REP / BUS (#92)
  • The DoIP entity announces itself at Start (#89)
  • check-runs are descending, and a force-push answers for the old sha (#88)
  • A failing gh must not read as "nothing waiting" (#87)
  • The clean verdict is a reaction — polling docs, part 2 (#86)
  • Start hosts the DoIP entity the projects have been promising (#84)
  • A DoIP ECU can have its own identity, and sim-demo has one (#83)
  • Reach DoIP entities from Lua, and actually host one headless (#81)
  • feat(gui): edit the .blobnet in the app, and make Cfg open the editor that edits (#79)
  • feat(sim): verify counter and checksum on received frames (#77)
  • feat(sim): fault injection — drop, corrupt, freeze and range-violate on purpose (#76)
  • fix: headless runner resolves DBC paths and bitrates like the GUI (#75)
  • feat(sim): a UDS server per simulated ECU, with its own addresses and content (#74)
  • docs: a simulation user manual (folds in restbus) (#73)
  • feat(sim): end-to-end protection — alive counter and checksum for rest-bus frames (#72)
  • docs: record the commit-identity review artifact as a known non-finding (#71)
  • docs: a DoIP user manual, and point Help at it (#70)
  • fix(dbc-editor): apply bit-endpoint edits on commit, not on every keystroke (#69)
  • docs(roadmap): plan the cmd/blobly_net/main.v split (#67)
  • guard: reject email addresses in commit messages, not just identities (#66)
  • cockpit: system_full launch UX + multi-monitor fix + System panel ECU master-detail (#65)
  • telem: place multi-core trace lanes on one timeline (emb REQ-TRACE-011) (#61)

V toolchain (de365a1) for Windows CI

Choose a tag to compare

@MartenH MartenH released this 09 Jun 10:48

Prebuilt V de365a1 (has vlib/yaml) for the Windows CI; built locally via makev.bat. Consumed by .github/workflows/windows.yml.