Releases: sixfathoms/lplex
v0.6.0
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
Changelog
v0.4.1
v0.4.0
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
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-pgnandexclude-namefilters across HTTP API, sessions, andlplexdump- Client-side PGN filtering in
lplexdumpandlplexdump.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.1.2
v0.1.1
v0.1.0
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.