Skip to the content
nullroute
Browse the docs

Project

Contributing

The rules a change is held to: a spec with the code, every invariant bound to a test, and no new dependency without asking.

This is a device that holds keys controlling real money. The normal engineering tradeoffs do not apply, and a few of the rules below will feel excessive if you have not worked on this kind of software before. They are not negotiable, and the reasoning for each one is given so you can argue with the reasoning rather than the rule.


In this chapter

  1. 01The rules everything else follows fromNever invent cryptography. Every primitive comes from an audited library listed in the dependency policy below. If you find yourself writing a modular arithmetic loop, a hash...
  2. 02Before you startmake check must pass on a clean checkout before you change anything. If it does not, that is a bug and worth an issue on its own.
  3. 03The workflowWrite what changed and why, in the imperative, with the reasoning in the body where it is not obvious. Reference spec ids where applicable.
  4. 04Dependency policyA new runtime dependency in packages/ requires an issue, explicit sign-off, and an entry in the pull request explaining.
  5. 05TestingA change to packages/core needs, at minimum.
  6. 06Code styleTypeScript strict, ESM, no default exports.
  7. 07The website is not the deviceapps/web builds nullroute.diy. It is a Next.js site, it obviously uses the network, and it is fenced off from the device build the same way packages/bridge is.
  8. 08Documentationdocs/ is the product as much as the code is. A change to behaviour that contradicts a document is not done until the document is updated.
  9. 09Reporting security issuesDo not open a public issue. See SECURITY.md.
  10. 10LicenceBy contributing you agree that your contributions are licensed under the MIT Licence, the same terms as the rest of the project. See LICENSE.

Rendered from CONTRIBUTING.md, the same bytes that ship with the code. SHA-256 80ae67da20b1d79a061ae1ffe5ac6af62ad6b80566961c8d27c3a1b5fb0e265d