Skip to content

Contributing

sputlab edited this page Nov 13, 2026 · 1 revision

Contributing

Contributions are welcome. Read this page and Architecture first.

Ground rules

  • Language: 100% Kotlin, with the Codec2 C library as the only exception. No other native code.
  • UI: 100% Jetpack Compose (Material 3). Forbidden: XML layouts, Fragments, AppCompat.
  • SDK: minSdk 29, targetSdk 35.
  • Zero proprietary dependencies: no Google Play Services, no Nearby Connections. Libraries must be AGPL-3.0-compatible open source.
  • Layering: radio APIs only behind MeshTransport; protocol and crypto stay free of Android/BLE APIs so they are JVM-testable.
  • Cryptography: standard JCA/JCE only, no custom primitives, no third-party crypto libraries. Keep docs/SECURITY.md truthful, limitations included.
  • Radio rules: BLE callbacks through callbackFlow or Dispatchers.IO; strict timeouts on every GATT connection and write; log every radio state transition, error and permission check with the tag MESH_RADIO.
  • Permissions: follow the API 29-30 vs 31+ rules in Permissions.
  • Tests: new behaviour needs tests; see Testing.

License headers

Every source file (.kt, our .c, Gradle scripts) starts with:

// SPDX-License-Identifier: AGPL-3.0-or-later

Workflow

  1. Open an issue for anything non-trivial.
  2. Fork, branch, make the change, run ./gradlew testDebugUnitTest.
  3. Update CHANGELOG.md (Keep a Changelog format, SemVer) and, if behaviour or security changes, docs/SECURITY.md and README.md.
  4. Open a pull request describing the change and how it was tested.

Security issues

Do not post exploitable details publicly; contact the maintainers privately.

Name and logo

The name NodeWave and the NW logo are trademarks of the author; see License and Trademark.

Clone this wiki locally