rclnodejs v2.0.0 (2026-05-25)
First stable release in the 2.x series. Aligned with the ROS 2 Lyrical Luth GA (Ubuntu 26.04).
This release rolls up the 2.0.0-beta.0 baseline (Lyrical support, Node.js 20.20.2 minimum, removal of legacy 1.x compatibility code, and the rosocket WebSocket gateway) and adds the headline new capability for the 2.x line: rclnodejs/web — a typed Browser SDK plus a small capability runtime that lets a web page talk to ROS 2 over a single WebSocket, with the same capabilities also reachable over plain HTTP for curl, Postman, and AI agents.
2.0.0 also folds in the full 1.9.0 feature set — ParameterEventHandler, waitForMessage, timer autostart + TimerInfo, QoS overriding options, pre/post-set parameter callbacks, ClockEvent, Observable subscriptions (RxJS), MessageIntrospector, action-client feedback content filters, and the rest. Anything you had on 1.x is still here; upgrades from 1.9.0 are additive aside from the breaking changes called out below.
📣 Important Notes
- rclnodejs 2.0.0 supports ROS 2 Lyrical Luth (Ubuntu 26.04, distro id
2605) in addition to Humble, Jazzy, Kilted, and Rolling. - Minimum Node.js raised to 20.20.2. Node.js 16.x and 18.x are no longer supported.
- Linux x64 / arm64 ship N-API prebuilds — one artifact built against Node.js 20.20.2 runs unchanged on every Node.js ≥ 20.20.2, including 24.x and 26.x. Electron prebuilds target Electron 34.x.
- Internal compatibility shims and unused utilities have been removed (#1479); downstream code depending on undocumented
lib/internals may need updates. rclnodejs/webandrosocketship side by side as siblings, not layers — they share the monorepo but serve different audiences (typed declarative SDK vs. raw resource-style WebSocket gateway).
✨ Highlights
rclnodejs/web — typed Browser SDK + capability runtime
rclnodejs/webcapability runtime over WebSocket — declarativeruntime.expose({...})allow-list (#1509)- Typed Browser SDK with single-string-generic API over auto-generated
MessagesMap/ServicesMap(#1511) - HTTP transport for
call/publish—POST /capability/call/<name>returns the JSON reply (#1512) rclnodejs-webCLI launcher — declarativeweb.jsonconfig (or--call/--publish/--subscribeflags), zero server code (#1513)- WebSocket and HTTP transports default to a shared
/capabilitypath; SDK auto-derives sibling URLs (#1515) - SDK guide (
web/README.md) plus JS-only and TypeScript + Vite demos underdemo/web/(#1514)
Distros, RMW, and runtime
- Add ROS 2 Lyrical Luth support (#1496)
- Add explicit LYRICAL distro identifier (
2605) (#1488) - Add lightweight WebSocket bridge (
rosocket) for browser access to ROS 2 (#1495) - Add
rmw_zenoh_cppas RMW vendor and update distribution metadata (#1487) - Treat unrecognized
ROS_DISTROas a future distro (#1485) - Refresh Electron prebuild target and demo apps (#1492)
🛡️ Bug Fixes and Safeguards
- Fix SIGSEGV on ROS 2 Rolling caused by rosidl sequence ABI change (#1480)
- Gate C++ standard by ROS distro (#1477)
🔧 Maintenance
- Raise Node.js minimum to 20.20.2 (#1478)
- Pump to Node 26.x (#1497)
- Remove compatibility and custom utility code carried over from 1.x (#1479)
- Consolidate all demos under
demo/and add rosocket demo (#1503) - Refine README and npmjs landing page (#1508)
- Surface ROS 2 Lyrical and the 2.0.0-beta.0 baseline in docs (#1507)
- Pump
lint-stagedandsinonto latest (#1505) - Reorganize badges on README (#1483)
🚀 CI, Packaging, and Tooling
- Run primary CI lanes on Lyrical instead of Jazzy (#1506)
- Install ROS 2 Lyrical from apt-deb repo instead of dated tarball (#1516)
- Install
test-msgsandmrpt-msgsuniformly across all ROS 2 distros (#1518) - Add Lyrical Luth lane to Linux prebuild workflows (#1498)
- Migrate Rolling build to Ubuntu 26.04 (#1493)
- Add GitHub Actions workflow to deploy JSDoc to GitHub Pages (#1490)
- Use
npm installindeploy-docsworkflow (#1491) - Trigger
npm-publishon prerelease tags (#1501)
Getting Started with rclnodejs/web
// Browser
import { connect } from 'rclnodejs/web';
const ros = await connect('ws://robot.local:9000/capability');
const reply = await ros.call<'example_interfaces/srv/AddTwoInts'>(
'/add_two_ints', { a: '2n', b: '40n' }
);
console.log(reply.sum); // '42n'# Server (no JavaScript needed)
source /opt/ros/lyrical/setup.bash
npx -p rclnodejs rclnodejs-web --port 9000 --http-port 9001 \
--call /add_two_ints=example_interfaces/srv/AddTwoIntsFull Changelog: 1.9.0...2.0.0