Skip to content

Releases: sixfathoms/lplex

v0.6.0

14 Jun 04:50
Immutable release. Only release title and notes can be modified.
v0.6.0
5850f47

Choose a tag to compare

Changelog

  • d55e9e7 Decode WS500 RV-C and J1939 PGNs (#164)
  • 279019f Make lplex dump accept positional journal files (#163)
  • b2b22c4 NMEA 2000 alarm decoding + lplex alarms (#166)
  • 006af83 On-demand NMEA 2000 data: Garmin route decoding + declarative request rules (#167)
  • 8e9fa6e Support ?decode=true on buffered client SSE (#173)
  • 547ed3b chore(website): migrate docs site from npm to pnpm with 72h release cooldown (#165)
  • bea7be4 fix(website): patch transitive CVE deps under pnpm (#168)
  • 5850f47 go: bump golang.org/x/crypto from 0.51.0 to 0.53.0 in the golang group (#174)
  • a8a3d9a go: bump the golang group with 11 updates (#171)

v0.5.0

07 May 15:34
Immutable release. Only release title and notes can be modified.
v0.5.0
b4b6841

Choose a tag to compare

Changelog

  • f214a31 Add --cloud flag to force cloud endpoint over mDNS (#160)
  • b4b6841 Add --mdns flag to disable built-in mDNS responder (#162)
  • 687a71a Bump go.opentelemetry.io/otel/sdk (#159)
  • 1bbb0bb Bump path-to-regexp (#158)
  • cd52bd0 Make all integer and enum PGN fields nullable with omitempty (#157)

v0.4.1

25 Mar 22:23
Immutable release. Only release title and notes can be modified.
v0.4.1
5622b98

Choose a tag to compare

Changelog

  • 39fa078 Add PGN 127245 Rudder decoding and make enum fields nullable (#154)
  • 6f4172a Add config file documentation to CLI root help text (#153)
  • 94f69d4 Add default-boat config setting and LPLEX_BOAT env var (#156)
  • 5622b98 Fix data race in ValueStore snapshot methods (#155)

v0.4.0

24 Mar 12:04
Immutable release. Only release title and notes can be modified.
v0.4.0
a0a108f

Choose a tag to compare

Changelog

  • d82ccf0 Add /livez and /readyz endpoints for Kubernetes probes (#104)
  • 1801ac3 Add ?decode=true for inline PGN decoding on /events, /ws, and /history (#115) (#115)
  • d08d1d9 Add API key authentication for HTTP endpoints (#41) (#137)
  • c3092e1 Add CANBus interface for swappable CAN I/O (#30) (#126)
  • a0a108f Add Docker simulation, directory replay, and pre-configured client slots (#152)
  • 79a91d8 Add GET /history endpoint for querying journal files (#113) (#113)
  • 5097ebb Add Grafana dashboard template for lplex monitoring (#55) (#150)
  • 8742a12 Add Helm chart for lplex-cloud Kubernetes deployment (#45) (#141)
  • 4b8598c Add MQTT bridge for publishing CAN frames (#111)
  • 922c6d7 Add OpenAPI 3.1 spec for the HTTP API (#51) (#147)
  • 444e5d6 Add OpenTelemetry distributed tracing infrastructure (#107) (#107)
  • bb05313 Add WebSocket transport for bidirectional client communication (#110) (#110)
  • 8555f6f Add architecture decision records (ADRs) (#52) (#148)
  • 7925559 Add audit logging for /send and /query requests (#44) (#140)
  • b1fdc7f Add automatic APT repository via GitHub Pages (#47) (#143)
  • a511636 Add benchmark regression detection to CI (#98)
  • d0b20ef Add benchmarking documentation to website (#97)
  • 9adab8b Add benchmarks for hot path components (#96)
  • a6e953a Add binary switch control via lplex switches set (PGN 127502) (#82)
  • c1c20de Add block-based binary journal spec
  • 1c4e255 Add boat server provisioning scripts (#46) (#142)
  • ce31f6a Add bytes field type with cross-PGN pair decoding to DSL (#76)
  • 65ab1df Add chaos testing for replication recovery (#37) (#133)
  • 7daf0ee Add configurable ring buffer size (-ring-size flag) (#99)
  • 47ea2ee Add context propagation to Broker.Run and VirtualDeviceManager (#34) (#130)
  • abca025 Add device registry NAME dedup and idle expiry (#78)
  • ccee679 Add device sub-accessors to --where display filter (src.manufacturer, dst.manufacturer) (#83)
  • 8c26c25 Add example S3 archive script and server config (#124)
  • 76a6c74 Add fuzz testing for parsers and decoders (#31) (#127)
  • 1c0b7af Add golden file tests for CLI output (#39) (#135)
  • 33ebf4f Add gzip compression for non-streaming HTTP responses (#101)
  • cef33f2 Add journal block prefetch for faster Consumer backfill (#105) (#105)
  • 8b829cd Add logrotate config to .deb package (#48) (#144)
  • 8f8b1e1 Add lplex completion for shell completion scripts (#26) (#121)
  • ac5a723 Add lplex dashboard for interactive TUI with live boat data (#120)
  • 727222d Add lplex doctor for system and server diagnostics (#118)
  • ed82b89 Add lplex loadtest command for stress testing (#38) (#134)
  • 1f56ce3 Add lplex simulate for offline journal replay through HTTP server (#117)
  • a41d514 Add lplex tail for simple live frame following (#119)
  • 755dcd5 Add lplex verify subcommand for journal integrity verification (#109) (#109)
  • 3b6945d Add lplex-server -validate-config for config validation (#27) (#122)
  • 1c8897a Add multi-bus support for reading from multiple CAN interfaces (#20) (#116)
  • 7768027 Add operations runbook (#53) (#149)
  • 982a63e Add periodic heartbeat broadcasts for virtual NMEA 2000 devices (#86)
  • cdda3e1 Add property-based testing for PGN encode/decode round-trips (#32) (#128)
  • ce713a0 Add proto tool checks, tools.go, and docs
  • 81c3067 Add rate limiting for /send and /query endpoints (#42) (#138)
  • f8a3078 Add read-only mode to disable /send and /query (#43) (#139)
  • 3683685 Add release notes for v0.1.0, v0.1.2, and v0.2.0 to docs site
  • 5037350 Add server-side downsampling for GET /history (#114) (#114)
  • 60441e0 Add systemd watchdog integration (#49) (#145)
  • d87c310 Add test coverage reporting to CI (#40) (#136)
  • f94b786 Add typed errors for diagnostic context (#35) (#131)
  • fb6a709 Add vcan integration tests for end-to-end SocketCAN verification (#36) (#132)
  • 33bab80 Add virtual NMEA 2000 device for legitimate bus participation (#85) (#85)
  • 6155be9 Add webhook alerting for bus silence, device removal, and replication (#108)
  • b1a92d1 Apply suggested fix to lplexc/client.go from Copilot Autofix (#91)
  • 67f2798 Bump google.golang.org/grpc in the go_modules group across 1 directory (#94)
  • 83f2859 Bump undici in /website in the npm_and_yarn group across 1 directory (#89)
  • 87c3338 Document bytes, string_lau, and struct field types in DSL syntax reference (#77)
  • 08aef66 Eliminate fmt.Fprintf copy in SSE streaming hot path (#100)
  • 571fcff Expand Prometheus metrics coverage (#106) (#106)
  • 6fce50e Extract broker state into brokerState struct (#29) (#125)
  • 2a68e81 Extract sendpolicy, changetracker, keeper sub-packages (#33) (#129)
  • 4173602 Filter reserved NMEA 2000 source addresses from device registry (#79)
  • e6b17eb Include server error body in client Send() error messages (#84)
  • cf7d2fd Potential fixes for 2 code quality findings (#93)
  • b93d3b0 Remove benchmark CI job from PR workflow (#123)
  • 7b415b0 Remove injectLocal to fix duplicate frames in lplex dump (#87)
  • e93462d Rename binaries: lplex→lplex-server, lplexcli→lplex (#81) (#81)
  • c671ee6 Retry product info requests and pace CAN TX to avoid bus flooding (#80)
  • aa437b4 Skip protoc plugin install when already available (#102)
  • da427f2 Speed up CI benchmark comparisons (#103)
  • 61e8339 Support SIGHUP config reload without restart (#50) (#146)
  • 1432893 Switch control via PGN 126208 and nullable scaled PGN fields (#95)
  • 0502773 Update release notes to v0.3.1
  • 0746739 Use PGN 126208 Command for switch control instead of PGN 127502 (#88)
  • ee7cfdb Use bytes.NewReader in Client.Send for efficiency

v0.3.1

10 Mar 11:46
Immutable release. Only release title and notes can be modified.
v0.3.1
481dd90

Choose a tag to compare

What's New

PGN Code Generator & Decoder Library

A complete NMEA 2000 PGN code generation system (pgngen) that reads .pgn DSL definitions and generates Go structs, decoders, encoders, Protobuf definitions, and JSON Schema. The DSL supports enums, lookup tables, value-based dispatch for proprietary PGNs, repeated fields (repeat=), struct definitions, STRING_LAU, dynamic repeats, string trimming (trim=), name-only PGNs, unknown field markers, and draft annotations.

New PGN definitions:

  • AIS: 129038 (Class A Position), 129039 (Class B Position), 129041 (AtoN), 129793 (UTC/Date), 129794 (Static/Voyage), 129809 (Static Part A), 129810 (Static Part B)
  • Navigation: 129285 (Route WP Information), 129026 (COG/SOG with change-tracking tolerances)
  • GNSS: 129540 (Sats in View), Distance Log, Magnetic Variation, GNSS DOPs
  • Engine/Electrical: 127489 (Engine Parameters Dynamic), 127506 (DC Source Status), 127509 (Inverter Status), 127513 (Battery Config), 127750 (Converter Status)
  • AC Power: 65010-65016 (Utility Power Monitoring)
  • Misc: 126993 (Heartbeat), Binary Switch Bank

Change Tracking

New ChangeTracker with field-level tolerance-aware diffing. Detects meaningful data changes while ignoring noise within configured tolerances. Available in lplexdump via the -changes flag. Tolerances are defined per-field in the PGN DSL using the tolerance= attribute.

Display Filter Expressions

BPF-inspired display filter expressions for lplexdump via the -where flag. Supports header fields (pgn, src, dst, prio), decoded struct fields by JSON tag, and lookup sub-accessors (register.name). Examples: -where "pgn == 129025", -where "sog > 5.0".

Send Policy & On-Demand Queries

Gated /send and /query endpoints with configurable send policies. The /query endpoint issues ISO Request (PGN 59904) to solicit on-demand PGN responses from devices. Rules support PGN values, ranges, comma-separated lists, and name-based filtering with deny/allow semantics.

Smart Boat Discovery

New -boat flag in lplexdump for automatic server discovery: tries mDNS on the local network first, falls back to cloud if available. No more manually specifying -server URLs.

Auto-Reconnecting Subscriptions

Watch API in the Go client library with exponential backoff for automatic reconnection on connection loss.

Monitoring & Health

  • Prometheus metrics endpoint (GET /metrics)
  • Health check endpoint (GET /healthz)
  • Bus silence alerting to detect CAN bus disconnection

Decoded Values Endpoint

GET /values now returns field-level decoded PGN values, not just raw bytes.

Exclusion Filters

  • exclude-pgn and exclude-name filters across HTTP API, sessions, and lplexdump
  • Client-side PGN filtering in lplexdump and lplexdump.conf

Replication Improvements

  • Configurable resource protections (limits on per-instance memory and goroutines)
  • End-to-end integration test: boat lplex -> cloud lplex-cloud -> SSE

Output Improvements

  • Enum values serialized as JSON strings for known labels, numbers for unknown
  • Lookup fields displayed as {id, name} objects in decoded output
  • Decode errors shown in red, decoded data on same line in lplexdump

Documentation

  • Documentation site moved into website/ (Docusaurus, deployed to GitHub Pages)

Bug Fixes

  • Fix cloud journal archival to S3
  • Fix exclude-pgn filter dropped in buffered session creation
  • Fix incorrect padding in PGN 130310 and 130311 definitions
  • Fix WaterDepth PGN definition
  • Fix proprietary PGN registry description for dispatched PGNs
  • Fix broken doc links
  • Fix Docker build for multi-platform images
  • Pad short PGN data with 0xFF instead of erroring
  • Return (nil, nil) for unknown proprietary PGN discriminator values

Security

  • Fix CVE in serialize-javascript dependency
  • Fix uncontrolled slice allocation in EventLog.Recent (multiple rounds of hardening)
  • Break CodeQL taint chain for slice allocation

Full Changelog

v0.2.0...v0.3.1

v0.1.2

01 Mar 01:48
Immutable release. Only release title and notes can be modified.
v0.1.2
18d9e49

Choose a tag to compare

Changelog

  • e0d9f37 Fix Homebrew formula directory: place under Formula/
  • 18d9e49 Split releases: server is Linux-only, Homebrew ships lplexdump only

v0.1.1

01 Mar 01:35
Immutable release. Only release title and notes can be modified.
v0.1.1
b32b837

Choose a tag to compare

Changelog

  • b32b837 Add Homebrew tap support via sixfathoms/homebrew-tap
  • a18db76 Remove Homebrew tap, fix GoReleaser deprecations

v0.1.0

01 Mar 01:11
Immutable release. Only release title and notes can be modified.
v0.1.0
2c30526

Choose a tag to compare

lplex v0.1.0

First stable release of lplex, a CAN bus HTTP bridge for NMEA 2000.

lplex reads raw CAN frames from a SocketCAN interface, reassembles fast-packets, tracks device discovery, and streams frames to clients over Server-Sent Events (SSE) with session management, filtering, and replay.

Highlights

  • Ephemeral and buffered streaming with per-client filtering by PGN, manufacturer, device instance, or CAN NAME
  • Automatic device discovery via ISO Request (PGN 60928 / 126996)
  • Buffered sessions with cursor-based replay on reconnect
  • CAN TX support with automatic fast-packet fragmentation
  • mDNS service advertisement for zero-config client discovery
  • Go client library (lplexc) for building integrations

Installation

See the README for installation options (source, Docker, .deb) and usage examples.

Downloads

Pre-built binaries for Linux, macOS, and Windows (amd64/arm64) are attached below. The .deb packages include a systemd service unit.

Docker images are available at ghcr.io/sixfathoms/lplex:0.1.0.