Thank you for your interest in ZeroDDS. This guide describes how to file issues, submit pull requests, and align with the project's quality bar.
ZeroDDS is licensed Apache-2.0 and welcomes external contributions
beginning with the 1.0.0-rc.1 release.
This project follows the Contributor Covenant 2.1.
By participating you agree to uphold its standards. Report unacceptable
behavior to conduct@zerodds.org.
Every commit must be signed off with a DCO line:
Signed-off-by: Your Name <you@example.org>
Add automatically with git commit -s. By signing off, you certify the
DCO 1.1 terms (https://developercertificate.org/) — that you have the
right to submit the contribution under the project's Apache-2.0 license.
- Bugs — include reproduction steps, expected vs. actual, ZeroDDS
version, OS + architecture, and a minimal
Cargo.tomlif applicable. - Feature requests — describe the use case, the problem you're solving, and (if known) the relevant OMG spec section.
- Security vulnerabilities — see SECURITY.md and do not open a public issue.
-
Fork the repository and create a topic branch:
feat/<area>-<short-description>orfix/<area>-<short-description>. -
Make focused commits with Conventional Commits syntax:
<type>(<scope>): <description> [optional body] [optional footer]Types:
feat,fix,docs,style,refactor,perf,test,build,ci,chore. Scopes are crate names or layer references. -
Add tests for the change. New features require unit tests; bug fixes require regression tests.
-
Run the local pre-flight checks (see "Pre-Push Checks" below).
-
Open a PR against
main. Fill in the PR template.
- One required reviewer for non-safety changes.
- Two required reviewers for changes touching
dds-security,bridge-security,crypto, or any Safety classification >STANDARD. - Spec changes (anything under
docs/specs/) require sign-off from the spec maintainer. - All CI jobs must be green; failing jobs are not bypassable.
- Pull requests are squashed into a single commit on merge.
Each crate carries a layer assignment (0–8) in its lib.rs header.
Cross-layer dependencies must follow the layering rules:
- A layer-N crate may depend on layers 0 through N-1.
- Reverse or peer dependencies require an ADR documenting the rationale.
- The dependency DAG is enforced by
cargo run -p dds-lint -- check.
A workspace build links the system libduckdb (the zerodds-durability-store-lakehouse
cold adapter, ADR 0009). The bundled feature — which compiles the full DuckDB C++
amalgamation from source — was dropped because it OOM-killed CI and added ~1h per build,
so cargo build --workspace now requires libduckdb to be installed locally.
Use the version that matches the duckdb crate's ABI (currently v1.5.3); a mismatch
fails to link. Releases: https://github.com/duckdb/duckdb/releases.
Linux (x86_64):
curl -fsSL -o /tmp/libduckdb.zip \
https://github.com/duckdb/duckdb/releases/download/v1.5.3/libduckdb-linux-amd64.zip
unzip -o /tmp/libduckdb.zip -d /tmp/duckdb
sudo install -m644 /tmp/duckdb/libduckdb.so /usr/local/lib/
sudo install -m644 /tmp/duckdb/duckdb.h /usr/local/include/
sudo ldconfigmacOS (Apple Silicon):
curl -fsSL -o /tmp/libduckdb.zip \
https://github.com/duckdb/duckdb/releases/download/v1.5.3/libduckdb-osx-universal.zip
unzip -o /tmp/libduckdb.zip -d /tmp/duckdb
install -m644 /tmp/duckdb/libduckdb.dylib /opt/homebrew/lib/
install -m644 /tmp/duckdb/duckdb.h /opt/homebrew/include/Then point the duckdb crate at the install via Cargo's global ~/.cargo/config.toml
(shell-independent — applies to every cargo invocation):
[env]
# Linux:
DUCKDB_LIB_DIR = "/usr/local/lib"
DUCKDB_INCLUDE_DIR = "/usr/local/include"
# macOS (Apple Silicon): "/opt/homebrew/lib" and "/opt/homebrew/include"CI installs libduckdb the same way in ci/Dockerfile.rust.
Run locally before opening a PR:
cargo fmt --all
cargo clippy --workspace --all-targets -- -D warnings
cargo test --workspace
cargo run -p dds-lint -- checkThese four commands run in roughly two minutes and catch ~95% of CI failures.
- MSRV — Rust 1.88.0, Edition 2024 (
rust-toolchain.tomlpins it). unsafe— everyunsafeblock needs a// SAFETY:comment that states the invariants you rely on.dds-lintenforces this.- Panics — production code should not panic. Use
Resulteverywhere in the hot path. Test code may panic. - Allocations — hot paths should be allocation-free; lint-enforced
via
dds_no_realloc_in_hot_path. - Doc comments — every
pubitem needs a doc comment. - Tests — prefer integration-style tests in
tests/over heavy mocking. Unit tests live in#[cfg(test)] mod testsnext to source.
Protocol crates use spec annotations to make traceability explicit:
#[spec(rtps = "2.5", section = "8.3.7.3")]
pub struct Heartbeat { ... }The annotation references the OMG spec name + section. The
spec-coverage-Doc for the corresponding spec links back to the
annotated item.
Each crate in crates/ and tools/ carries its own README.md.
Most are auto-generated from Cargo.toml metadata via
scripts/gen-crate-readmes.sh (idempotent — only touches missing
files). Hand-written READMEs (e.g. crates/cdr/, crates/rtps/,
crates/idl/) are recognized by the absence of the auto-generation
marker and left untouched.
Non-trivial design decisions go under docs/adr/ as numbered ADRs
following the Nygard format.
Larger technical proposals live as RFCs under internal/rfcs/.
make -C documentation pdfs # all stations + vendor specs as PDF
make -C documentation api # API reference per languagePrerequisites: tectonic + pandoc (PDFs); doxygen, javadoc, etc.
(API reference) — see documentation/api/README.md.
| Path | Contents |
|---|---|
crates/ |
Library crates — Rust source organized by layer |
tools/ |
Binary crates — idlc, admin, xmlc, dashboard, etc. |
docs/ |
Internal docs (German + English): architecture, ADRs, spec coverage |
documentation/ |
External user-facing docs (English): user/dev/operator guides |
examples/ |
Tutorials and demos |
packaging/ |
Linux/macOS/Windows native packages |
tests/ |
Workspace-level cross-crate and interop tests |
xtests/ |
Workspace-level integration harnesses |
.github/workflows/ |
CI pipelines |
- GitHub Discussions — for questions, ideas, and general help.
- Issues — for bug reports and feature requests.
security@zerodds.org— for vulnerabilities (private).conduct@zerodds.org— for Code of Conduct concerns (private).