Skip to content

Licensing cleanup: accurate licence statements, DeMoD LLC as holder, REUSE in CI - #6

Merged
ALH477 merged 7 commits into
mainfrom
ccr-08f057a2-l4wyo1
Oct 3, 2026
Merged

ALH477 merged 7 commits into
mainfrom
ccr-08f057a2-l4wyo1

Conversation

@ALH477

@ALH477 ALH477 commented Oct 3, 2026 •

Copy link
Copy Markdown
Owner

What & why

A licensing cleanup under the current licences. No licence grants anything different after this PR. What changes is that the statements now say what the licences actually grant, every file's holder and licence is declared, and CI keeps it that way.

Licence statements corrected

  • Dual licence (audio-stack/, quanta/). The text offered GPLv3 "for non-commercial use". GPLv3 cannot be restricted that way: anyone who takes the code under GPLv3 may use it commercially if they meet its terms. The DEMOD DUAL LICENSE now reads as ordinary dual licensing: GPLv3 for anyone who accepts its obligations, or the commercial licence ($249 per developer plus 3% of hardware revenue) for anyone who doesn't. References to files that don't exist (HARDWARE_LICENSING.md, the build and verify scripts, a plugin/vendor/ tree) are removed. LICENSES/LicenseRef-DeMoD-Commercial.txt describes the commercial option for SPDX tags.
  • TERMINUS is PolyForm Shield 1.0.0. The documents that called it noncommercial, or attached a 3% fee to it, are corrected. Shield permits any use except competing with the stated line of business.
  • TERMINUS patches. Four .dsp patches carried "Proprietary and Confidential" in a public tree. They now carry the Shield copyright/SPDX header like the other TERMINUS files. Faust declare author tags naming "Gemini" or "DeMoD + Grok" now say DeMoD LLC. Comments and metadata only; no DSP code changed.
  • custos. web/bridge/custos/PROVENANCE.md and LICENSING.md justified LGPL-3.0-only for custos.gen.c by Exsecutor's Exception A alone. That exception covers the compiler's part, not the compiled program's. The text now rests on Exception A plus Exsecutor's new LICENSE.GRANTS, which additionally licenses the three input files under LGPL-3.0-only. That grant is in ALH477/exsecutor on branch ccr-08f057a2-l4wyo1; merge it alongside this one. custos.gen.c itself is untouched.

Duck Dance: DeMoD's own sprite

  • The duck frames came from a third-party meme GIF; the render script still named its frame folder 8bit-shuba.
  • apps/terminus/patches/gen-duck-anim.py now draws the duck from shapes: a yellow pixel-art duck in turquoise-and-violet headphones that hops, sways, waves and quacks on the beat. It is standard-library Python, deterministic, and writes both copies of duck-anim-frames.{bin,lua}.
  • 144 frame slots at 16 fps (exactly 9.0 s) map onto 48 stored frames, so each .bin drops from 4.5 MB to 1.77 MB.
  • The melody is Asher LeRoy's and is unchanged. It is kept in patches/duck-dance-melody.tsv, and the generated midi_notes block is byte-identical to the one it replaces.
  • duck-anim.lua, the home shell's travelling duck, drew 96×96 frames into a 48×48 blit, which dm.draw.blit does not scale, and its frame clock never wrapped. It now resamples per size (cached) and loops.

Holder and notices

  • Holder variants (ALH477, Asher LeRoy, DeMoD Labs, DeMoD Audio Systems and others) become DeMoD LLC. The contact is standardised on alh477@proton.me.
  • unifont_all.hex is removed. Nothing used it; Unifont is fetched by make font.
  • THIRD_PARTY_LICENSES.md now records Monocypher's holders, the stray GPL-3.0 comment in the vendored demod_frame.h (left byte-identical with its pin), and the Faust-generated C++ in demod-lofi-keys-mk2.

REUSE + CI

  • REUSE.toml maps LICENSING.md's layers onto paths, and reuse lint passes on every file.
  • .github/workflows/ci.yml gains a reuse lint job.
  • CONTRIBUTING.md and the PR template state that outside pull requests wait for the contributor licence agreement.

Verified locally

  • ./dev check --fast: CHECK PASSED. That covers both builds, font/decode, example smoke, the AR and XR seams, obd2, control ops, mixer, the custos gate, the dcf-ws-bridge gate, and DCF loopback over UDP and WebSocket. The style step reports advisory diffs, as before.
  • The Duck Dance app renders headless with the new sprite.
  • A stubbed blit gets exactly 48×48×4 bytes for the home duck.
  • reuse lint: compliant.

Checklist

  • I have read CONTRIBUTING.md: DeMoD LLC holds the copyright, and pull requests from
    outside contributors are not merged until its contributor licence agreement is published.
  • Commits are signed off (git commit -s): not signed off. These are the owner's own commits; the DCO applies to outside contributions.
  • New source files carry an SPDX-License-Identifier header, or are annotated in REUSE.toml; reuse lint passes.
  • make and make test pass (./dev check --fast passed); the DCF loopbacks run clean.
  • No vendored code was relicensed; no generated artifacts committed (the duck frames are the TERMINUS assets the patches load, now reproducible from gen-duck-anim.py).

🤖 Generated with Claude Code

https://claude.ai/code/session_01YEapehGd6iN1d5vu53PEN7

claude added 7 commits October 3, 2026 03:00
unifont_all.hex (8.3 MB) arrived in 33f1ee3 as a stray `make font`
intermediate. Nothing in the tree reads the committed copy: `make font`
and `make font-subset` download the release .hex.gz, gunzip it over this
path and feed it to tools/genfont.py; no test, flake output, CMake path,
CI step or Docker build uses it. THIRD_PARTY_LICENSES.md and LICENSING.md
already say Unifont is fetched by `make font` and not committed, so this
makes the tree match them instead of shipping OFL-1.1 font data without
its licence text or notice.

.gitignore now ignores the download (and its .gz) so it cannot be
committed again; .dockerignore keeps excluding it, with an accurate
comment.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YEapehGd6iN1d5vu53PEN7
Holder variants in copyright notices now name DeMoD LLC, keeping the years:
- apps/terminus/patches/demod-vox/DeMoD_Vox.dsp: "Copyright (c) 2026 ALH477"
- demod-ks/demod_ks.dsp, demod-modal/demod_modal.dsp: "© 2025 DeMoD LLC — ALH477"
  loses the "— ALH477" suffix
- audio-stack/orchestrator Note/{Pitch,Tracker,Types}.hs: the adapted-from
  notice "(Copyright 2026, MIT)" for DeMoD-Note named no holder; it now
  names DeMoD LLC, which holds DeMoD-Note.

Faust `declare author` values crediting AI tools rather than the author
("Gemini (DeMoD Reference)" in demod-abyssal/AbyssalSynth.dsp, "DeMoD +
Grok" in demod-sierpinski-fx) now read "DeMoD LLC". Metadata only; no DSP
code changed.

The three DEMOD DUAL LICENSE files still sent buyers to
licensing@demod.dev and https://demod.dev/license. d8f4f9e standardised
the contact on alh477@proton.me everywhere else; these were the
stragglers.

Author credits that name a person or a brand rather than a holder
(CITATION.cff, the cabal file's author/maintainer, `declare author
"DeMoD Audio Systems"`, manifest "author": "DeMoD Labs") are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YEapehGd6iN1d5vu53PEN7
DEMOD DUAL LICENSE (audio-stack/, audio-stack/orchestrator/, quanta/):
the three LICENSE files, LICENSING.md, README.md, AGENTS.md,
audio-stack/README.md, quanta/ docs and docs/automotive-compliance.md
offered the GPLv3 option "for open-source, personal, educational, and
non-commercial use". GPLv3 cannot be limited that way: anyone who takes the
code under GPLv3 may use and sell it commercially if they meet GPLv3's
terms. The texts now describe ordinary dual licensing: GPLv3 for anyone who
accepts its obligations (license what you distribute under GPLv3 and provide
its corresponding source), or a commercial licence from DeMoD LLC for anyone
who does not. The grant itself (GPL version 3 only; the commercial option
and its terms) is unchanged.

The commercial terms now read the same everywhere, from the most specific
statement in the LICENSE files: $249 one-time per developer (perpetual),
plus 3% of hardware device sales revenue; software and plugin revenue is not
shared. Variants replaced: "3% hardware-revenue share", "3% hardware share",
"hardware revenue share", "paid commercial license (DCSL)" and "email for
terms" with no price.

References to files that do not exist are dropped: HARDWARE_LICENSING.md,
scripts/demod_hw_license.zig, scripts/verify_hardware_revenue.py,
dsp/effects/, dsp/lib/demod_skill.lib, FAUST-LICENSE and the plugin/vendor/
list (CPLUG, PUGL, CLAP, VST3), none of which is in this tree and none of
whose intended content is fixed by it. "DCSL" was never defined anywhere: as
a licence name it becomes LicenseRef-DeMoD-Commercial (quanta/, docker/
docs, README), and as SPDX tags it was corrected (below). The GPLv3-hardware
note said "hardware source must be published"; GPLv3 asks for the
corresponding source (and section 6 installation information) of the
software, which it now says.

LICENSING.md counted "four layers" while describing five (framework, audio
stack, quanta, TERMINUS, DCF); it now says five, under four licences, and
lists the exceptions it missed: nixos/modules/snake-*.nix (dual), the
LGPL demod-jam framework files and the MIT DeMoD_Vox.dsp inside TERMINUS,
demod-dcf-audiocast.c inside the LGPL bridge.

TERMINUS (PolyForm Shield 1.0.0): every document called it non-commercial
and attached a paid licence plus a 3% hardware fee. Shield permits any use,
commercial included, except providing a product that competes with the
software or with a product the licensor provides using it (with DeMoD's
stated line of business). The fee is gone from README, LICENSING.md,
AGENTS.md, DEVELOPING.md, WHY.md, CHANGELOG.md and apps/terminus/README.md.
In apps/terminus, files published under Shield said otherwise:
- demod-{gate,delay,exciter,limiter}: "Proprietary and Confidential ...
  Unauthorized use, reproduction, or distribution is strictly prohibited"
  becomes the SPDX + copyright form, keeping the line count.
- 75 Lua files: "Private" / "Private — not for public distribution" is
  dropped from the copyright line.
- demod_ks.dsp, demod_modal.dsp: SPDX "DCSL" (not an SPDX id, not a defined
  licence) becomes LicenseRef-PolyForm-Shield-1.0.0; demod_amphead.dsp's
  `declare license "DeMoD Commercial Source License"` likewise.
Comments and metadata only; no DSP code changed. Patch .dsp files whose
Faust metadata declares GPL-3.0, MIT or BSD-3 are left as they are and
recorded in LICENSING.md: those declarations shipped with the files.

custos: web/bridge/custos/PROVENANCE.md and LICENSING.md justified
custos.gen.c's LGPL-3.0-only by Exsecutor's Exception A alone. Exception A
keeps the compiler's licence out of compiler output; it does not release
the output from the licence of the program compiled (three
GPL-3.0-or-later Exsecutor files). Both passages now rest on Exception A
plus Exsecutor's LICENSE.GRANTS, in which DeMoD LLC additionally licenses
those files and every earlier version under LGPL-3.0-only; the sentences
saying no grant was needed are deleted. Commit, command and sha256 are
unchanged; custos.gen.c is untouched.

Smaller: SPDX "GPL-3.0-only OR Commercial" (snake_ipc.h, six NixOS
modules) uses the defined LicenseRef-DeMoD-Commercial; nine LGPL files said
"see LICENSE", which is the MPL text, and now point at the LGPL text.

LICENSES/ gains the texts these statements cite: GPL-3.0-only,
LGPL-3.0-only, LGPL-2.1-or-later, MPL-2.0, MIT, BSD-2-Clause, BSD-3-Clause,
CC0-1.0 (from the SPDX list via `reuse download`), PolyForm Shield 1.0.0
(identical to the official text) and LicenseRef-DeMoD-Commercial (a pointer
to Option 2 of the dual licence; it grants nothing by itself).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YEapehGd6iN1d5vu53PEN7
CONTRIBUTING.md and README.md said contributions came in under MPL-2.0
inbound = outbound, with "no CLA, no copyright assignment". The owner's
policy is now: DeMoD LLC holds the copyright in the project; outside
contributions will require a contributor licence agreement with DeMoD LLC,
which is being prepared; until it is published, pull requests from outside
contributors are not merged. CONTRIBUTING.md gets that section in place of
the inbound = outbound one and keeps the rest, including the DCO sign-off;
the per-layer section no longer promises inbound = outbound, and the SPDX
guidance lists the dual tag quanta/ uses and the LGPL audio-stack/bridge/.
README.md's Contributing paragraph, LICENSING.md and the pull-request
template say the same.

quanta/LICENSING.md promised "commercial-side grants via DCSL CLA". No
DCSL agreement exists anywhere; the line now points at CONTRIBUTING.md.

The agreement itself is not written here.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YEapehGd6iN1d5vu53PEN7
…pancy, Faust output, the duck animation

Monocypher's three holders and its OR choice; Unifont is fetched by make font,
not committed; the vendored HydraMesh headers stay byte-identical with their
pinned upstream, so the stray GPL-3.0 comment in demod_frame.h is recorded here
rather than edited; the Faust-generated C++ in demod-lofi-keys-mk2 keeps the
library notices it carries; and the duck animation's source GIF and MIDI are not
in the tree and their origin is unrecorded.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YEapehGd6iN1d5vu53PEN7
REUSE.toml maps LICENSING.md's layers onto paths: the MPL-2.0 framework as the
catch-all, the dual-licensed audio stack, quanta and Snake modules, the
LGPL-3.0-only DCF transport (including custos.gen.c, which is never edited),
TERMINUS under PolyForm Shield with the patches whose Faust metadata declares
another licence offered under either, Monocypher's note, and the files that
quote licence text rather than carry it. reuse lint: 555/555 files.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YEapehGd6iN1d5vu53PEN7
…eRoy's melody

The duck frames came from a third-party meme GIF (the render script still named
its frame folder 8bit-shuba). patches/gen-duck-anim.py now draws the duck from
shapes: a yellow pixel-art duck in turquoise-and-violet headphones that hops,
sways, waves and quacks on the beat. It writes both copies of
duck-anim-frames.{bin,lua}: 144 frame slots at 16 fps (exactly 9.0 s, six frames
a beat at 160 BPM) mapped onto 48 stored frames, so each .bin is 1.77 MB, down
from 4.5 MB. The script is standard-library Python and deterministic.

The Duck Dance melody is Asher LeRoy's and is unchanged: it now lives in
patches/duck-dance-melody.tsv, and the generated midi_notes block is
byte-identical to the one it replaces. gen-duck-anim.py --midi writes it as a
MIDI file and --png the frames, for the demod-ad render in duck-dance.lua,
whose frame constants now point at them.

duck-anim.lua (the home shell's travelling duck) drew 96x96 frames into a 48x48
blit, which dm.draw.blit does not scale, and its frame clock never wrapped. It
now resamples per size (cached) and loops on the index's duration.

Checked: the Duck Dance app renders headless with the new sprite; a stubbed
blit gets 48*48*4 bytes for the home duck; reuse lint passes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YEapehGd6iN1d5vu53PEN7
@ALH477
ALH477 merged commit afc3a91 into main Oct 3, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants