fieldmesh

Licensing#

Decided 2026-10-07 (open-questions.md Q2). Three licenses, because the three kinds of artifact here have three different jobs.

What License File Why this one
The specification and all prose in docs/ CC-BY-4.0 LICENSE-CC-BY-4.0 A contract nobody may implement is not a contract. Anyone — including a competitor — may implement this, with attribution.
sdk/, sim/, tools/, deploy/ — the SDK, the wire format, the conformance suite and the service units Apache-2.0 LICENSE-APACHE-2.0 A sensor manufacturer must be able to put this in firmware without consulting a lawyer, and the explicit patent grant matters in agriculture. This is the part we most want adopted, so it carries the fewest conditions.
server/ — the reference implementation AGPL-3.0-or-later LICENSE-AGPL-3.0 The project's premise is that the farmer owns the data. A hosting vendor running this as a closed service, with the farmer's data inside it, would defeat that premise specifically. The network clause is the only license term that reaches that case.
modules/rules/ — rules and alerts, layer 1 AGPL-3.0-or-later modules/rules/LICENSE The reference server's reasoning: run as a service, its improvements stay open. Depends on cel-python and starlark-pyo3 (both Apache-2.0)
modules/notify/ — alerts to people, layer 1 AGPL-3.0-or-later modules/notify/LICENSE The same. It talks to ntfy (Apache-2.0 / GPL-2.0) over HTTP and to ModemManager (GPL-2.0) through mmcli, linking neither
modules/board/ — the farm's page, layer 4 AGPL-3.0-or-later modules/board/LICENSE The same
modules/water/ — livestock water monitor, layer 2 AGPL-3.0-or-later modules/water/LICENSE The same, and it is built on modules/rules/
modules/soilwater/ — soil-moisture advisory, layer 2 AGPL-3.0-or-later modules/soilwater/LICENSE The same
modules/twin/ — the hoop-house twin, layer 3 AGPL-3.0-or-later; its saved runs and weather CC BY 4.0 with NASA POWER's attribution modules/twin/LICENSE The same. It installs GreenLight (BSD-3-Clause-Clear) in its own environment rather than copying it
modules/advise/ — the advisor, a layer-3 module AGPL-3.0-or-later for code; each data file its source's licence modules/advise/LICENSE, data/MANIFEST.csv Decided 2026-10-09: an advisor is the piece most likely to be run as a hosted service, so the server's reasoning applies to it too.

Every file carries an SPDX-License-Identifier line. The file is authoritative; this table explains it.

Third-party data#

The advisor's data — USDA PLANTS (CC0), GloBI (CC BY 4.0), DSSAT genotype files (BSD-3-Clause, with DSSAT's notice), and the chill-requirement tables re-keyed from three CC BY 4.0 articles — is listed file by file, with source, licence, retrieval date and checksum, in modules/advise/data/MANIFEST.csv. A test fails if a file changes without its line.

Test fixtures: sim/data/mcallister-2007-spring.csv and sim/data/mcallister-2013-summer.csv, NASA POWER daily weather (CC-BY-4.0, credited in their headers), and tools/fixtures/nws-gridpoint-HUN-62-57.json and nws-gridpoint-HUN-62-57-pop.json, trimmed National Weather Service forecasts (public domain, a US government work), and tools/fixtures/uscrn-crossville-2024-solar.csv.gz, a year of hourly solar radiation from NOAA's Climate Reference Network station at Crossville, Tennessee (public domain, credited in its header).

Figures quoted in notes from NASA POWER (CC-BY-4.0), ISMN (CC-BY-4.0) and the USDA soil survey (public domain) are attributed where they appear. FAO's ECOCROP is not used yet. FAO's data catalog lists it under CC BY 4.0 (its entry, created 2025-03-18), not the non-commercial licence of FAO's publications that was assumed here before; a note asking FAO to confirm that this covers the crop parameters, and for a bulk file, has been drafted. Nor is CITA Aragón's dataset of fruit-tree chill requirements (CC BY-NC-ND). The chill tables come from the 2020 review as MDPI published it under CC BY 4.0; CITA's repository files its copy of the same article as CC BY-NC-ND 3.0 ES, but a CC BY grant cannot be withdrawn, and the version of record is what is cited.

Why not one license#

A single permissive license would let a vendor take the farmer-owned stack and make it not farmer-owned. A single copyleft license would keep the SDK out of firmware, which harms the one component whose whole purpose is to be embedded. The split is not fence-sitting — each boundary is placed where a real failure would otherwise occur.

How the parts combine#

server/ (AGPL-3.0-or-later) imports sdk/ (Apache-2.0). That direction is fine: Apache-2.0 is one-way compatible with GPLv3-family licenses, so Apache code may be combined into an AGPL work. The reverse is not true — nothing in sdk/, sim/ or tools/ may import from server/, or the SDK's Apache-2.0 promise is broken for everyone who embeds it. That constraint is architectural, not merely legal: the SDK has no business depending on a server. The same holds for modules: modules/advise/ (AGPL) imports layer zero, and nothing in layer zero imports it — tools/test_layering.py checks.

-or-later on the AGPL is deliberate. farmOS sits on Drupal, which is GPLv2-or-later; the "or later" on both sides is what keeps a future combination possible at v3. Under v0.1 §7.1 the question is moot today, because nothing links — the integration speaks HTTP.

Contributions#

Decided before the first outside contribution, which was the point: relicensing afterwards needs every contributor's agreement. There is no CLA. Contributions are taken under the license of the directory they land in, and a contributor keeps their copyright.

Dependencies#

Four third-party libraries, all installed rather than vendored:

library licence used by file
cbor2 MIT sdk/wire.py — the CBOR wire format (Q5) requirements.txt
cryptography Apache-2.0 OR BSD-3-Clause sdk/erasure.py only — sealing personal text so it can be erased by destroying a key (Q17) requirements.txt
protobuf BSD-3-Clause tools/q5_encoding.py only — the measurement that sized Protocol Buffers against CBOR requirements-tools.txt
markdown-it-py MIT tools/pages.py only — renders the project site requirements-tools.txt

All combine with Apache-2.0 and AGPL-3.0 without condition beyond keeping their notices. Nothing in sdk/, sim/ or server/ needs protobuf or markdown-it-py.

Inherited code#

Some files in sdk/ derive from campus_twin, by the same author, dual-licensed Apache-2.0 OR GPL-3.0-or-later at its origin. They exercise the Apache-2.0 option. See sdk/PROVENANCE.md for which files and what changed, and NOTICE.