Contributing
How radiusward is built and tested, the rules every change follows, and how to contribute a change.
On this page
radiusward is developed in the open on GitHub ↗ under the Apache-2.0 licence. The repository holds the code, the design decisions as ADRs, the tests and their results. Issues and pull requests are welcome; by contributing you agree that your contribution is licensed under Apache-2.0.
Build
- JDK 25. The EAP key material needs the TLS exporter API that arrived in Java 25.
- No Docker needed for the build and the unit, integration and end-to-end tests. Docker is needed only for the image, the Compose stack and the fault-injection tests.
./mvnw verify # build, unit and integration tests, coverage floors, format check
./mvnw spotless:apply # format and licence headers
./mvnw -Pe2e verify # end-to-end tests against separate processes
./mvnw -Pinterop verify # also against another RADIUS server installed locally
scripts/run-local.sh start # three members and two gateways on loopback, with a kill -9 demo
The rules every change follows
The project has a small number of rules that keep its guarantees true. They are enforced by tests where a test can:
- No allocation on the hot path. Receiving, checking, extracting and answering a packet allocates nothing; a test sends a million packets through the path and fails above 4 KB in total.
- Status codes, not exceptions, for bad input. Malformed packets are dropped silently, as RADIUS requires.
- The cluster service is deterministic. No wall clock, no I/O, no randomness, no iteration over hash-ordered collections that affects the result — every member computes the same state.
- State-machine rule changes are versioned, and the cluster activates a new version only once every member runs it, so a rolling upgrade can never split the state.
- An Accounting-Response only after the commit. There is no Accounting-Reject; on failure, silence.
- Sinks contain no RADIUS logic and write idempotently.
- Plain JDBC and plain NIO: no ORM, no network framework; the build refuses both.
- Tests and docs are part of every change. Coverage floors per module are raised when a module gains tests and never lowered; new decisions get an ADR.
Where to start
- An interoperability report from a real NAS, access point or supplicant is the most valuable contribution today: the project has tests against software implementations, not devices. A packet capture of an accounting session from a device, anonymised, becomes a vendor fixture.
- The failure matrix and the test reports show what is covered; a scenario that is missing is a good issue.
- Documentation that was unclear to you as a reader: say so, or fix it in the same place the code lives.
The full guide — module map, conventions, how fixtures and dictionaries are maintained — is CONTRIBUTING.md ↗. The website itself is a separate repository, radiusward.github.io ↗; its text is under CC BY 4.0, and every page has an “Edit this page” link.