Repository navigation
Rights and Shipping
ship is a provenance record, not legal advice. Licence wording changes; the rights reference says when it was last checked.
library --licence accepts exactly these:
$ python sfx.py library found.wav --licence whatever
{"ok": false, "error": "licence must be one of: cc-by, cc-by-nc, cc-by-nc-nd, cc-by-nc-sa, cc-by-nd, cc-by-sa, cc-sampling+, cc0, commercial-library, elevenlabs-free, elevenlabs-paid, own, procedural, research-only, sonniss-gdc, stability-community, unknown"}
$ echo $?
1
Licences that need credit refuse a missing author. Each licence's note prints when you record it:
$ python sfx.py library found.wav --licence cc0 --library Freesound --title "Crate" --url https://example.com/1
{"ok": true, "files": ["found.wav"], "note": ""}
$ echo $?
0
$ python sfx.py library by.wav --licence cc-by --author "A. Person" --title "Door"
{"ok": true, "files": ["by.wav"], "note": "credit the author"}
$ echo $?
0
$ python sfx.py library sa.wav --licence stability-community --type generated --ai yes --title "Crate take"
{"ok": true, "files": ["sa.wav"], "note": "register with Stability for business use; ends above USD 1M yearly revenue with affiliates"}
$ echo $?
0
$ python sfx.py library nd.wav --licence cc-by-nd --author "B. Person" --title "No edits"
{"ok": true, "files": ["nd.wav"], "note": "no derivatives: use unaltered"}
$ echo $?
0
$ python sfx.py edit nd.wav nd2.wav --op gain --value -3
{"ok": false, "error": "nd.wav: licence cc-by-nd forbids derivatives; use it unaltered or pass --override-licence with a reason"}
$ echo $?
1
--override-licence lets the edit through. The script has no field for the reason: tell the user.
ship always exits 0, so read answer.
CLEAR, one procedural file in a commercial project:
$ python sfx.py ship clear.json
{"ok": true, "answer": "CLEAR", "files": 1, "commercial": true, "blockers": [], "warnings": [], "attribution_owed": [], "ai_models": [], "note": "a provenance record, not legal advice; store and licence wording changes, see references/rights.md"}
$ echo $?
0
CLEAR says only that the records raise no objection. It does not say the sounds are good or the licences were read correctly.
CHECK, a sound with no file yet:
$ python sfx.py ship sounds.json
{"ok": true, "answer": "CHECK", "files": 1, "commercial": true, "blockers": [], "warnings": ["b: no file yet", "c: no file yet", "d: no file yet", "e: no file yet"], "attribution_owed": [], "ai_models": [], "note": "a provenance record, not legal advice; store and licence wording changes, see references/rights.md"}
$ echo $?
0
BLOCKED, a non-commercial source in a commercial project, here with a Sonniss file and a Stability take as warnings and store disclosure listed:
$ python sfx.py ship mix.json
{"ok": true, "answer": "BLOCKED", "files": 3, "commercial": true, "blockers": ["nc.wav (n, cc-by-nc): not allowed in a commercial project: no commercial use"], "warnings": ["pack.wav (k, sonniss-gdc): no redistribution as sound effects; no AI training", "sa.wav (s, stability-community): register with Stability for business use; ends above USD 1M yearly revenue with affiliates"], "attribution_owed": ["\"NC\" by C. Person (cc-by-nc)"], "ai_models": [], "disclosure": {"sounds": ["s"], "steam": "Pre-Generated AI disclosure, content survey", "itch": "tag generative AI in the AI Disclosure section; a sound pack sold as a game asset must disclose too"}, "note": "a provenance record, not legal advice; store and licence wording changes, see references/rights.md"}
$ echo $?
0
-
--sell-as-packadds a blocker for each source not cleared for sale as a sound pack. In the run above it added the Sonniss file, the Stability take and the NC file. -
--picked-onlylooks only at takes markedpicked: true. A sound with no picked take still counts all its takes, so it changes nothing until picks are recorded.
A plain copy has no sidecar, so it registers as unknown, with a warning, and blocks a commercial project:
$ python sfx.py register sounds.json e mystery.wav
{"ok": true, "id": "e", "added": ["mystery.wav"], "warning": "no known licence: mystery.wav"}
$ echo $?
0
Find its source or replace it. Never guess a licence.
register stores a hash. Overwrite the file afterwards and ship says so:
$ python sfx.py ship sounds.json
{"ok": true, "answer": "BLOCKED", "files": 5, "commercial": true, "blockers": ["a: own.wav changed after it was registered; provenance no longer matches", "mystery.wav (e, unknown): no known licence; find the source or replace the file", "nc.wav (d, cc-by-nc): not allowed in a commercial project: no commercial use"], "warnings": [], "attribution_owed": ["\"Door\" by A. Person (cc-by)", "\"NC\" by C. Person (cc-by-nc)"], "ai_models": [], "note": "a provenance record, not legal advice; store and licence wording changes, see references/rights.md"}
$ echo $?
0
$ python sfx.py doc sounds.json --kind credits
# Sound credits and licences: demo
Generated from the sound list on 2026-11-07.
## Attribution owed
- "Door" by A. Person (cc-by)
- "NC" by C. Person (cc-by-nc)
## AI tools used to make shipped sound
None recorded.
## Every file
| Sound | File | Type | Source | Licence |
|---|---|---|---|---|
| a | own.wav | procedural | modal | procedural |
| b | found.wav | library | Freesound | cc0 |
| c | by.wav | library | Door | cc-by |
| d | nc.wav | library | NC | cc-by-nc |
| e | mystery.wav | unknown | ? | unknown |
$ echo $?
0
The skill declines to recreate a named film's sounds or a famous sound mark and offers an original built from acoustic traits. That rule lives in the skill's instructions. sfx.py itself does not filter prompts.
Start
Using it
- Commands
- Sound list format
- Checks and flags
- Routes and synth recipes
- Rights and shipping
- Workflows
- Errors and edge cases
The project
Elsewhere