Improving Waku documentation

Introduction

We want to build a tribe around Waku, but we can’t do that without clear and accessible documentation. At the moment, the Waku documentation is too difficult for beginner developers. Personally, I’ve been struggling lately just running Waku, let alone contributing to it.

The nwaku documentation has been confusing for me, and I want to help improve it — both for myself and for others who come after me. I had the chance to speak with Chen and Fabio of Status in Split — many thanks to them — about the documentation for Status. There’s a lot we can learn from the Status Help pages, which are really well done.

Even though Waku targets a more advanced audience, I believe that makes clarity and structure even more important. The more cognitive load we can remove by making the docs clear and consistent, the more brainpower remains for actually understanding Waku.

We can’t build a tribe if someone like me — a full-time core contributor — struggles to build a node from source by following the instructions. That’s not a great contributor experience, and I believe there’s a lot of low-hanging fruit that would make a big difference.

Goal of this post

The goal of this post is to share my ideas and collect feedback. If there’s broad agreement, I’d be happy to help lead the effort to improve things.

At minimum, we should improve the instructions for running a node at docs.waku.org and across the nwaku repos. At maximum, we could aim to improve how we present Waku to external contributors overall — including the website, specifications, README files, and documentation.

Issues with Waku documentation

I’ve noticed several recurring issues in the current documentation:

  • Curse of knowledge: The docs assume prior knowledge that readers may not have.
  • Lack of structure: It often feels like I’m going in circles without a clear path.
  • Inconsistent terminology: Some terms are used for close but not exactly same meanings, which is confusing.
  • Too many ways to do the same thing: It’s hard to pick one path and stick to it.
  • Out-of-date content: For example, the RLN smart contract address is outdated here, while the up-to-date address is here. How would a new contributor know which is correct?

Proposed steps to improve the docs

Without diving into implementation details yet, here are some high-level principles I believe we should follow when improving the documentation.

Define target audience

Our documentation should not assume that all readers are developers. We’re also writing for curious novices, node runners, and academics — people whose contributions we’d be happy to have. But they’ll only contribute if onboarding is smooth. What’s obvious to developers may not be obvious to others. A single extra sentence explaining something “obvious” could save hours of frustration.

We can think in terms of user personas:

  • Alice got interested in Waku and wants to run a node.
  • Bob is a new core contributor who wants to run tests.
  • Charlie is an external developer who integrated Waku into his app, found a bug, and wants to submit a PR.

No matter the persona, most contributors need to understand what Waku is made of and how to run a node. That’s a universal prerequisite.

Define the goal of the docs

As a new user or potential contributor, I want two things from the documentation:

  • A definition of all the moving parts of Waku and how they relate to each other.
  • Instructions on how to use the software — specifically, how to run a node.

Separate political pitch from technical instructions

If I’m reading the docs, I’m already convinced decentralization is good. I don’t need reminders like “decentralized, permissionless system where anyone can run a node.” What I want are direct, technical explanations of how Waku works and how to use it.

Maintain one central entry point

There should be one clear starting point — docs.waku.org — that links to everything else. Currently we have multiple sources:

  • docs.waku.org;
  • READMEs in repos like nwaku and nwaku-compose;
  • Operator docs in the nwaku repo — which I only discovered by accident while drafting this post. There’s no way to get there from the main nwaku README or from waku.org.

If these pages are updated, they could form a solid “Intro to Waku” section.

Provide background knowledge

It’s okay if 20% of a doc page covers things that seem “obvious.” Better to over-explain than to leave out something mundane but crucial. If we’re worried about clutter, we can hide background info under collapsible sections.

Examples of useful background knowledge:

  • Config files: where they live, how overrides work
  • Logging: levels, where to find logs (binary and Docker), how to read them
  • How to talk to a node via REST API
  • Docker basics: what it is, how to use it, what port mapping means

Waku background section

I’d love to see an introductory section — or even a separate resource — that explains what Waku consists of and how the pieces fit together. The specs are too low-level and scattered, and some are outdated or incomplete. Reading the code is too tedious. The current docs often mix “what is X” with “how to do Y.”

Possible structure for this “Waku 101” section:

  • High-level overview with diagrams, like the one at https://docs.waku.org, but more detailed and technical.
  • How Waku relates to blockchains; how Waku nodes compare to blockchain nodes.
  • Terminology: service vs edge nodes; requests, messages, publish/push/send; connect/dial/etc.
  • What currently works in practice, including RLN, memberships, etc.
  • Quick start: minimal example (e.g. connect to TWN).
  • “What next?”: pointers to running a node, contributing code, and so on.

This could be an MDBook like the IFT Contributors Guide, or live within docs.waku.org to avoid creating more repos.

Make expectations clear

As a reader, I want to know at each step:

  • What am I doing?
  • What should I expect as output or result?
  • How can I verify success?
  • What should I do if it doesn’t work?

The docs should clearly separate concepts (e.g. “What is RLN?”) from procedures (e.g. “How to register an RLN membership?”). Choices should be clearly presented up front, and once I’ve picked one, the docs should stick to it.

For example, when choosing how to run a node — from binary, Docker, or nwaku-compose — the pros and cons should be presented, and once I choose an option, the instructions should guide me through that path only. I shouldn’t later get nudged with comments like “oh, but the easiest way is to use nwaku-compose.”

The docs should not mix up unrelated decisions. If a certain feature isn’t available in some configuration, that should be stated clearly and early. Examples of such decisions:

  • Run from binary / build from source / Docker / nwaku-compose;
  • Run on a custom network / TWN;
  • Run with or without RLN membership (note: without membership means relaying only, no publishing).

The docs should also distinguish between alternative options and consecutive steps. A sub-optimal example from here:

# Run the Docker Compose
docker-compose up -d`

# Run the standalone binary
./build/wakunode2

This makes it unclear that you should choose one or the other, not both.

Another example from the nwaku README that was confusing to me:

# The first `make` invocation will update all Git submodules.
# You'll run `make update` after each `git pull` in the future to keep those submodules updated.
make wakunode2

# Build with custom compilation flags. Do not use NIM_PARAMS unless you know what you are doing.
# Replace with your own flags
make wakunode2 NIMFLAGS="-d:chronicles_colors:none -d:disableMarchNative"

# Run with DNS bootstrapping
./build/wakunode2 --dns-discovery --dns-discovery-url=DNS_BOOTSTRAP_NODE_URL

# See available command line options
./build/wakunode2 --help

It’s not clear what steps are optional, which ones depend on previous ones, or which ones are mutually exclusive.

Maintain intuitive structure of each page

Every page should have a clear type and structure. There are three main types:

  • Procedures: numbered lists describing how to do something — each step may link to another page;
  • References: tables of options, arguments, etc;
  • Concepts: definitions and explanations of key ideas.

“Every Page is Page One”

Readers often land on a page from a search result without seeing the rest of the docs. Therefore, each page should be self-contained:

  • It should either contain all necessary steps or link clearly to them.
  • It should offer enough context to understand what’s going on.
  • It should have a consistent, predictable structure.

This approach assumes that users:

  • Rarely read docs top-to-bottom;
  • Want immediate answers;
  • Need each page to provide the required context.

Ensure terminology consistency across code, documentation, argument naming etc.

Terminology should be consistent. One thing should have one name, and different things should have different names. Ideally, terms should come from the specs and be reflected in code, comments, CLI arguments, etc.

We should improve terminology especially around Lightpush. For example, consider this log line:

NTC 2025-04-23 11:36:32.135+02:00 Lightpush request has not been published to any peers tid=15601 file=callbacks.nim:56 msg_hash=0xd9d5c61e0d1ec5af9cd8e9411bbe673ba03fe6848155bd12ee33f857acbabd3b reason=NoPeersToPublish
ERR 2025-04-23 11:36:32.135+02:00 failed to push message  

A “Lightpush request” is not published — the message is what’s published. We should clarify terms like “push vs publish” and “request vs message.” The server receives a request to publish a message, and then publishes that message. Is “push” even necessary as a term here? That needs clarification.

CLI arguments and their descriptions should also reflect consistent terminology.

Keep documentation up-to-date

Some recent developments are not reflected in the documentation. We need to think about how to maintain the docs more reliably — maybe automate part of the doc generation?

At the very least, each doc page should clearly state the version it refers to — e.g. “These docs are valid as of vX.Y.Z, released on YYYY-MM-DD.”

Preliminary conclusion

There’s a lot of room to improve how we present Waku to potential contributors — or “tribe members” — without too much effort. This post is already a bit long, so I’ll save the more concrete definitions and explanations I wish I had seen for a future post. I’ve taken quite a few notes that could feed into a glossary or other resource.

Call to action

I’d like to invite everyone to give feedback and share ideas on how we can improve the documentation and make onboarding easier for new code contributors, node operators, or simply curious readers.

  • What difficulties have you faced while working with Waku, nwaku, or related documentation?

  • What do you wish had been explained but wasn’t?

Any feedback or suggestions would be very welcome.

Thanks for that @sergei-tikhomirov.

I agree that there is a switch of focus towards our developer and contributor community now, and hence it makes sense to give some TLC to our docs.

Documentation Location

Totally agree. This is a difficult one and a pre-requisite to everything else. In my opinion we need to decide:

  1. What locations we want to maintain
  2. Which location is for succinct docs, and which is for exhaustive docs (can’t have several “exhaustive” locations)

I think it makes sense to have both docs.waku.org and GitHub READMEs as location for several reasons:

  • Waku is a complex project that encompass many artefacts, libraries and protocols. It needs a central starting point. docs.waku.org can be that
  • Yet, because of the modularity of the libraries, and how much development is ongoing, it makes sense for each repo to have a README to get started

In terms of succinct vs exhaustive. I would say (but open to debate):

  • docs.waku.org as the exhaustive location.
    • Research | Waku Documentation is a good example that we can bring more information in the one website
    • As you mentioned, there needs to be some high level explanations that may be easier to find and browser in a common location
    • md files of website are available in github repo, making it easy for anyone to load it in their favour AI to study Waku; having a https://llmstxt.org/ file that include both code examples and Waku overview would be useful.

Which means GitHub repos should be succinct docs. Hence I would recommend the following:

  • only README.md file contains documentation in GitHub Repos
    • Unless this documentation is pulled into docs.waku.org as done for waku-org/research
    • a CONTRIBUTING.md file is also likely needed
    • Any other documentation (md files) should be moved to docs.waku.org or more appropriate space
  • The README.md should contain:
    • one quick start to use the content of this repo
    • A link to the relevant section in docs.waku.org

Above is my recommendation, open for debate. It is imperative that once a decision is made, the whole teams follow it (it can become one of the instruction of our CONTRIBUTING guides).

Note that the CONTRIBUTING.md of each repo should also probably refer to a global docs.waku.org contribute guide with local instructions:

  • to compile code
  • run tests

Waku 101

This is high effort and hence we need to be crystal clear on the value that each item would bring.
A quick win would be to refer to the explanation series for the high-level overview, terminology, blockchain usage, etc.

The “what works in practice” should be inferred by the available guides.

Absolutely re quick start.
And I agree regarding the user journey.

I would actually suggest that we remove the “protocol” section. And focus more on what Waku gives you, especially once the messaging API is delivered.
If someone is keen to better understand the underlying protocols, they can learn from the specs (another interesting idea is to have a llm.txt file in the specs repo or website).

Clearer expectations

I think indeed we should stick to nwaku-compose in the docs.waku.org. Compiling a nwaku node can be part of the CONTRIBUTING.md file of nwaku repo as we don’t expect it to be the main way to consume a wakunode2.

Today, the JavaScript SDK is the main entry point. The current doc can be updated but I don’t think we need major change.

Keep documentation up-to-date

With the shift of focusing, we can re-introduce the expectation that a “delivered” FURPS implies:

  • specs
  • code
  • dogfood
  • doc

Conclusion

Thank you for kicking off this thread. My action items here:

  • I will propose to plan explicit work to revamp docs with specific output
    • Decide on one location and move docs
    • Set criteria on README and CONTRIBUTING repo md files
    • Trim the fat, especially around node running
    • introduce https://llmstxt.org/ for both docs and specs
  • Will add docs to completion criteria for the work we tackle
  • Will discuss with IFT/Vac on how we can get support regarding producing docs
2 Likes

From this discussion, and reviewing one of the takeaway of the Waku MVP work done by BD/eco dev: working examples over documentation. I suggest to add the following point to the Waku methodology:

Working Examples over Comprehensive Documentation: Build PoC applications applications that demonstrate library usage, over extended and outdated documentations and guides.

Heavily inspired from the Agile Manifesto. It means that ultimately, we want to keep our documentation succinct, and focus on getting a developer going (quick start, compilation instructions, etc).

And let examples and demo apps be the source of information for more complex usage.

Thanks for starting this discussion @sergei-tikhomirov.

Some thoughts I have specifically regarding another “audience” type for the documentation:

Some developer wants to implement a peer 2 peer communication application (for whatever reason).
They start by searching for key terms e.g. “peer 2 peer communication tools/library/implementation”

  1. How do we get waku at the top results for searches like this?

Then, let’s say the developer somehow gets to the waku webpage (https://waku.org).
They are interested in implementation, where do they start, the “Get involved” button is ambiguous.
They mainly want to know how to install and how to get started.
Ideally that would mean something like an npm install command and then example code. Neither of which is obvious to navigate to from the homepage.

By comparison, the https://libp2p.io/ website is much more intuitive.
It could also help to explain why you would use waku instead of libp2p (or other similar tools).

3 Likes

Thanks for this post. Fully agree with the diagnosis.

A couple of thoughts:

  • In retrospect, I’m not convinced about the split between waku.org and docs.waku.org. I think it would be more intuitive if “docs” were a tab in waku.org (of course, with docs.waku.org redirecting to that tab).
  • docs.waku.org navigation should probably not have a confusing top-level tab index and left-hand drop down index that almost overlaps (but not fully). Having a landing page with clickable cards to guide different user stories (similar to Help — Status) seems more intuitive to me.
  • I think there might only be two major groups of audiences for docs.waku.org: those “Getting started with Waku” as operator or Waku-backed application; those who want to “Learn more about Waku”. I’d simplify the structure into these two user stories. Things like Research log, Specs, etc. can either be separate tabs on the waku.org site or well-structured subsections under the “Learn” section.
  • Contributor docs should IMO indeed be maintained by devs in the respective repos. I do think that it might in some cases be more complex than a single CONTRIBUTE.md

I have some more ideas which I’ll articulate later or in another forum, but TL;DR: I think we can simplify things a lot by collapsing waku.org and docs.waku.org :slight_smile: