Repository navigation
Licensing cleanup: accurate licence statements, DeMoD LLC as holder, REUSE in CI - #6
Merged
Merged
Conversation
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
7 of 9 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
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, aplugin/vendor/tree) are removed.LICENSES/LicenseRef-DeMoD-Commercial.txtdescribes the commercial option for SPDX tags..dsppatches carried "Proprietary and Confidential" in a public tree. They now carry the Shield copyright/SPDX header like the other TERMINUS files. Faustdeclare authortags naming "Gemini" or "DeMoD + Grok" now say DeMoD LLC. Comments and metadata only; no DSP code changed.web/bridge/custos/PROVENANCE.mdandLICENSING.mdjustified LGPL-3.0-only forcustos.gen.cby 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 newLICENSE.GRANTS, which additionally licenses the three input files under LGPL-3.0-only. That grant is in ALH477/exsecutor on branchccr-08f057a2-l4wyo1; merge it alongside this one.custos.gen.citself is untouched.Duck Dance: DeMoD's own sprite
8bit-shuba.apps/terminus/patches/gen-duck-anim.pynow 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 ofduck-anim-frames.{bin,lua}..bindrops from 4.5 MB to 1.77 MB.patches/duck-dance-melody.tsv, and the generatedmidi_notesblock 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, whichdm.draw.blitdoes not scale, and its frame clock never wrapped. It now resamples per size (cached) and loops.Holder and notices
unifont_all.hexis removed. Nothing used it; Unifont is fetched bymake font.THIRD_PARTY_LICENSES.mdnow records Monocypher's holders, the strayGPL-3.0comment in the vendoreddemod_frame.h(left byte-identical with its pin), and the Faust-generated C++ indemod-lofi-keys-mk2.REUSE + CI
REUSE.tomlmapsLICENSING.md's layers onto paths, andreuse lintpasses on every file..github/workflows/ci.ymlgains areuse lintjob.CONTRIBUTING.mdand 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.reuse lint: compliant.Checklist
CONTRIBUTING.md: DeMoD LLC holds the copyright, and pull requests fromoutside contributors are not merged until its contributor licence agreement is published.
git commit -s): not signed off. These are the owner's own commits; the DCO applies to outside contributions.SPDX-License-Identifierheader, or are annotated inREUSE.toml;reuse lintpasses.makeandmake testpass (./dev check --fastpassed); the DCF loopbacks run clean.gen-duck-anim.py).🤖 Generated with Claude Code
https://claude.ai/code/session_01YEapehGd6iN1d5vu53PEN7