# Introducing NoDL: the Node Definition Language (ROSCon recap)

**URL:** <https://discourse.openrobotics.org/t/introducing-nodl-the-node-definition-language-roscon-recap/58501>\
**Category:** ROS General\
**Tags:** ros2, roscon2026\
**Created:** [September 29, 2026, 10:49pm UTC](https://discourse.openrobotics.org/t/introducing-nodl-the-node-definition-language-roscon-recap/58501 "2026-09-29T22:49:47Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![alistair-english](https://sea2.discourse-cdn.com/flex022/user_avatar/discourse.openrobotics.org/alistair-english/32/19547_2.png) [@alistair-english](https://discourse.openrobotics.org/u/alistair-english)\
**Post date:** [September 29, 2026, 10:49pm UTC](https://discourse.openrobotics.org/t/introducing-nodl-the-node-definition-language-roscon-recap/58501/1 "2026-09-29T22:49:47Z")

</div>

**TLDR:** come work on [NoDL](https://nodl.readthedocs.io/en/latest/) in the [rosgraph-wg](https://docs.google.com/document/d/1xFqQECOKVCR3sZIUHGCPUi2huXw6nvgMxu6G3qBuQDU/edit?tab=t.0). Join the mailing list for automatic calendar invites to meetings: [https://groups.google.com/u/1/g/rosgraph-wg](https://groups.google.com/u/1/g/rosgraph-wg)

Hi everyone!

@emersonknapp and I presented “The Legible Node” at ROSCon last week. We talked about two things:

1. Thin nodes - your _node_ is an interface adapter, it should not contain robot logic
2. NoDL - the node definition language that allows you to statically declare your node interfaces

If you didnt catch it, [here are the slides (the\_legible\_node\_slides.pdf)](https://sea2.discourse-cdn.com/flex022/404) (5.4 MB) - go check out the recording once its up. Working example code [here](https://github.com/emersonknapp/roscon2026_the_legible_node) too.

We had a great response from everyone at the conference, and we’re really excited to keep building NoDL with the community.

# NoDL Recap

A NoDL document looks like this:

```yaml
nodl_version: 2
description: Drives a differential-base robot along a sequence of waypoints.

include:
  - ref: nodl://rclcpp/node

parameters:
  max_linear_speed:
    type: double
    default_value: 0.8
    description: Upper bound on commanded forward speed, in m/s.

publishers:
  - name: ~/status
    type: std_msgs/msg/String
    qos: {history: KEEP_LAST, depth: 1, reliability: RELIABLE}
    description: Human-readable status of the waypoint follower.

subscriptions:
  - name: odom
    type: nav_msgs/msg/Odometry
    qos: {history: KEEP_LAST, depth: 10, reliability: BEST_EFFORT}
    description: Wheel/inertial odometry used to track pose.

service_servers:
  - name: ~/cancel
    type: std_srvs/srv/Trigger
    description: Drops any queued waypoints and stops the robot.

service_clients:
  - name: /global_costmap/clear_entirely
    type: std_srvs/srv/Trigger
    description: Asks the costmap server to clear itself before a retry.

action_servers:
  - name: ~/follow_waypoints
    type: nav2_msgs/action/FollowWaypoints
    description: Follows an ordered list of waypoints to completion.

action_clients:
  - name: /navigate_to_pose
    type: nav2_msgs/action/NavigateToPose
    description: Delegates single-goal navigation to the planner stack.

```

You write this as part of your source code to declare the interface of your node (pub, sub, service, action, clients, params).

You can manually write a nodl document, or you can scrape an existing interface from a running node, using `ros2 nodl describe <node_name>`.

Once you have a nodl document you can:

- assert that a running node conforms to the spec
- generate node documentation
- generate node boilerplate
- (currently working on it) map out your application rosgraph statically

All of these concepts are covered in our documentation here: [https://nodl.readthedocs.io](https://nodl.readthedocs.io) - go read it

# Come work with us

We are building NoDL in the ROSGraph Working Group ([link](https://docs.google.com/document/d/1xFqQECOKVCR3sZIUHGCPUi2huXw6nvgMxu6G3qBuQDU/edit?tab=t.0)). Currently, its @emersonknapp, Luke Sy and myself - we would love more friends!

You can check out what we’re working on in our current [milestone](https://github.com/ros-tooling/nodl/milestone/3). Exciting ones:

- Pluggable code generator system, and more code generation features
- Library-based node extension/mixin features
- Graph analysis through launchfiles

We meet fornightly, next meeting is 2026-10-13T20:00:00Z→2026-10-13T21:00:00Z The meeting link is open to anyone: [Google Meet meeting](http://meet.google.com/veu-qkhb-iim)

## How to get involved

- Join the mailing list and you’ll automatically get a meeting calendar invite: [https://groups.google.com/u/1/g/rosgraph-wg](https://groups.google.com/u/1/g/rosgraph-wg)
- say hi in Zulip - [Public view of Open Source Robotics Foundation | Zulip team chat](https://openrobotics.zulipchat.com/#narrow/channel/546182-ROSGraph-Working-Group/)
- read the docs: [https://nodl.readthedocs.io](https://nodl.readthedocs.io)
- check out the repo: [GitHub - ros-tooling/nodl: ROS 2 Node Definition Lanaguage (NoDL) · GitHub](https://github.com/ros-tooling/nodl)
- have a look at our milestones and project board
  - [ROSGraph WG · GitHub](https://github.com/orgs/ros-tooling/projects/6/views/1)
  - [GitHub · Where software is built](https://github.com/ros-tooling/nodl/milestone/3)

# LINKS

- ROSCon Presentation materials (slides and _working examples)_
  - [GitHub - emersonknapp/roscon2026\_the\_legible\_node: Materials from ROSCon 2026 talk "The Legible Node: Patterns and tools for clearer, more declarative ROS applications" · GitHub](https://github.com/emersonknapp/roscon2026_the_legible_node)

- **NoDL**
  - docs: [NoDL: Node Definition Language](https://nodl.readthedocs.io/en/latest/)
  - repo: [GitHub - ros-tooling/nodl: ROS 2 Node Definition Lanaguage (NoDL) · GitHub](https://github.com/ros-tooling/nodl)

- **ROSGraph-wg**
  - Info page: [ROSGraph Working Group - Google Docs](https://docs.google.com/document/d/1xFqQECOKVCR3sZIUHGCPUi2huXw6nvgMxu6G3qBuQDU/edit?tab=t.0)

  - Meeting link: [Google Meet meeting](http://meet.google.com/veu-qkhb-iim)

  - Mailing list: [https://groups.google.com/u/1/g/rosgraph-wg](https://groups.google.com/u/1/g/rosgraph-wg)

  - Zulip channel: [Public view of Open Source Robotics Foundation | Zulip team chat](https://openrobotics.zulipchat.com/#narrow/channel/546182-ROSGraph-Working-Group/)

  - Project board: [ROSGraph WG · GitHub](https://github.com/orgs/ros-tooling/projects/6/views/1)

  - Current milestone: [GitHub · Where software is built](https://github.com/ros-tooling/nodl/milestone/3)

---

<div class="post-metadata">

**Author:** ![mjcarroll](https://sea2.discourse-cdn.com/flex022/user_avatar/discourse.openrobotics.org/mjcarroll/32/35469_2.png) [@mjcarroll](https://discourse.openrobotics.org/u/mjcarroll)\
**Post date:** [September 29, 2026, 11:48pm UTC](https://discourse.openrobotics.org/t/introducing-nodl-the-node-definition-language-roscon-recap/58501/2 "2026-09-29T23:48:33Z")

</div>

Thanks for the excellent presentation and write-up. I’m very excited about the topics that the working group is thinking about over this next cycle.

As a friendly reminder to all, working groups like these are an excellent venue for exploring new ideas and connecting with the PMC members who are guiding these efforts.
