The main part of the system is the ds:node class, which represents a node running some code (the code runs in its own thread). The node can connect to other nodes using the ds:connect method, which establishes a logical connection.
Nodes can communicate using messages (typically lists). At the low level, this can be done using the ds::send-message method. The message gets stored in the message-queue of the node, from where it can be obtained using the ds::pop-message method. However, these are not exported as there is a hierarchy of functions and macros to make handling messages easier.
To make a new node use the ds:node macro. If the code of the node becomes too complicated, you can create a subclass of the ds:node class and then define methods for it using the ds:defnodemethod macro. The body of the method can then use the local functions and macros mentioned earlier.
You can also use the ds:network class for better handling of the connected nodes, though it is not a requirement.