Licensing
Everything tracked here is either the project's own work under the licences below, or someone else's work under a licence that allows redistributing it. Anything else stays out of the repository. Builders who need it get it themselves, and this file says how. LICENSE is the formal scope; this file explains it.
Licences by path
| Paths | Licence | Why |
|---|---|---|
firmware/, tools/, lx, Cargo, CI, container and editor configuration, .gitignore, .gitattributes, REUSE.toml | GPL-3.0-or-later, plus the additional permission below | Improvements to the firmware and its tools stay open. |
electronics/, mechanical/, LYNXware.toml, build.toml | CERN-OHL-S-2.0 | The hardware counterpart of the GPL: modified boards and enclosures stay open. |
Every Markdown file, .claude/ and .mcp.json, every image | CC-BY-SA-4.0 | Prose and pictures under a documentation licence, share-alike like the rest. |
REUSE.toml states this table per path, machine-readably; the website labels
each file it publishes from it. python3 tools/lx/licences.py --check keeps REUSE.toml,
LICENSE and the texts here naming the same licences, and every tracked file
covered. The Rust crates carry license = "GPL-3.0-or-later" from the workspace. The full texts are
beside this file, named by their SPDX id as the REUSE specification
lays them out; LICENSE stays at the root, where GitHub and licence scanners look for it.
Additional permission: Espressif's radio libraries
The firmware links Espressif's binary-only Wi-Fi, ESP-NOW, PHY and coexistence libraries
through esp-radio and esp-phy. There is no source for them, and GPLv3's system-library
exception does not clearly cover a peripheral's radio stack. LICENSE therefore
grants a section 7 additional permission. It allows conveying the firmware linked with those
libraries without their source; everything else stays under the GPL.
Used from others
| What | Where | Licence |
|---|---|---|
| Rust crates (esp-hal, esp-radio, Embassy, RMK, postcard, …) | fetched by Cargo, pinned in Cargo.lock | their own, MIT/Apache-2.0 and similar; checked at release (below) |
| PMW3610 register sequence and timing | firmware/cat/src/drivers/mouse/pmw3610/, ported from RMK 0.8.2 src/input_device/pmw3610.rs, itself from Zephyr's input_pmw3610.c | RMK: MIT OR Apache-2.0; Zephyr: Apache-2.0; credited in the driver's header |
| Purchased modules: the BPI-Leaf-S3 and T-Dongle-S3 boards, the PMW3389 and PMW3610 breakouts, switches, LEDs, headers, battery | referenced by name and dimensions only | CERN-OHL-S "Available Components"; their designs are not in this repository. The PMW3610 breakout is siderakb's open design (CERN-OHL-P-2.0), made by randware. |
| The licence texts | LICENSES/ | verbatim, as each allows: the GPL's and CERN-OHL's own terms; Creative Commons dedicates its legal code to the public domain (CC0) |
| Register values, timings and dimensions from datasheets | code comments, electronics/lib/footprints.toml, tools/blender/tower_ref.py and main_board_ref.py (the T-Dongle-S3's and BPI-Leaf-S3's outlines) | facts; the datasheets and drawings are linked, never copied |
| InteractiveHtmlBom's page code | the interactive BOM pages the website's boards area carries, made by tools/electronics/ibom.py; the tool itself is installed outside the repository | MIT; its notice stays in each page |
| The firmware's Rust crates, as compiled into a flash image | the website's firmware area | their own; notices.html next to the images carries every crate's licence text (tools/lx/notices.py) |
Not in this repository
| What | Why | How a builder gets it |
|---|---|---|
| The PMW3389 SROM, PixArt's sensor firmware | PixArt grants no redistribution licence. QMK removed its copy in 2024 as undistributable; ZMK and RMK never shipped it. | Their own copy, which lx flashes into its own partition: firmware/cat/srom. No firmware image contains it. The PMW3610 needs none. |
| Supplier library data: EasyEDA/LCSC symbols, footprints and 3D models | Their terms grant no redistribution. | Not needed: the project draws its own library (electronics/lib), with the copper unchanged. |
| The EasyEDA source archives of the boards | They embed LCSC library records and the maintainer's EasyEDA account. | Not needed to build: electronics/baseline/ holds the facts derived from them. The maintainer keeps the archives privately. |
| Historical wiring diagrams | They contain Banana Pi board artwork and probably Fritzing part art. | Superseded by wiring-harness.toml and the generated pinout. |
| Datasheets | Manufacturers' copyright. | Linked from electronics/lib/parts.toml and the drivers. |
| Vendor 3D models of the purchased boards (T-Dongle-S3, BPI-Leaf-S3) | No licence to redistribute them. | Not needed: the project draws both from their published dimensions and photos (tools/blender/main_board_ref.py, tower_ref.py). |
| Device identity and secrets | Provisioning sets and .board-config.toml are personal. | Each builder provisions their own set (provisioning); both are git-ignored. |
Adding someone else's work
Add third-party material only under a licence that allows redistributing it, and record it in "Used from others" in the same change, with an annotation of its own in REUSE.toml when its licence is not the path's. Otherwise link to it and add a row to "Not in this repository" saying how a builder gets it. Code ported from elsewhere keeps its credit in the file's header. A generator whose output lands in the repository (KiCad libraries, 3D models, website exports) draws only from sources that meet this rule.
Before the repository goes public
- Publish a fresh history: a new root commit of the cleaned tree. Never push this
repository's history. Its
mainstill holds the ESP-NOW keys compiled in before 2026-09-20 and the security analyses of that design. Its history also holds the SROM, the EasyEDA models and archives, and the removed images. - Choose the commit identity for the public repository.
- USB IDs. Apply for a pid.codes VID/PID, which it grants to
open-source hardware. Use it in
firmware/input-engine/src/usb.rsandfirmware/input-engine/vial.json. Today's0x4653is not assigned to LYNX. - Check the dependency licences.
./lx container imageslists every licence expression of the linked crates that is not a known permissive one (none on 2026-09-26);cargo deny check licenseswould add policy checks, but the pinned image has no cargo-deny. - Decide which project-process files go public:
.claude/,CLAUDE.md,ToDo.md,docs/website.md. The licence table covers them if they do. - Set
[project] sourceintools/site/public.tomlto the public repository: the website then links it and offers the firmware images and the browser flasher.