Contributing
How to work in the Dusk codebase.
Setup
Get the toolchain, build dependencies, and pre-commit hooks in place first - see Setup and Installation.
Conventions
A few rules are enforced more strictly than usual:
- No abbreviations. Identifiers are spelled out -
request, notreq;address, notaddr. This holds even for short-lived locals. - Respect the
no_std/stdsplit. Server-side code staysno_std-clean; std-only code belongs behind theclientfeature. A quick check:grep -rn "std::\|use std" base/ --include="*.rs"should only turn up hits inclient.rsfiles or#[cfg(feature = "client")]modules. See Architecture. - Trace every task. Each Embassy task opens a
tracingspan that declares the task id under__new_task_id__(the logs subscriber surfaces it astask_id), with the domain fields (namespace_id,pid,program_id,program_name) alongside. Lifecycle events, dropped errors, and boundary calls are logged so a node is diagnosable after the fact.
Pre-commit and CI
The pre-commit hooks (installed with uv run pre-commit install) run formatting
and lint checks on every commit. Run them before pushing so CI stays green.
Tests
The suite runs under nextest:
Integration tests live under tests/.
License and the contributor agreement
Dusk is licensed under the GNU Affero General Public License, version 3 only. Every contribution is accepted under the project's Contributor Assignment Agreement, signed once per GitHub account by replying to the check on your first pull request. The process, from fork to merge, is in CONTRIBUTING.md, and how the project is run is in GOVERNANCE.md.