Versioning. Single monorepo SemVer, currently 0.x (pre-1.0). 1.0.0 is reserved for when
the full advertised language set is green in CI. The per-component manifests (codec/Cargo.toml,
rust/Cargo.toml, client/src-tauri/Cargo.toml, flake.nix, and the per-binding manifests)
track the same umbrella version.
- Ensure
wire-certify.ymlis green onmain(allcertify-*jobs). - Update
CHANGELOG.md: move the[Unreleased]items under a new## [X.Y.Z] - YYYY-MM-DDheading, and refresh the compare/tag links at the bottom. - Bump the version string in
codec/Cargo.toml,rust/Cargo.toml,client/src-tauri/Cargo.toml,flake.nix,python/pyproject.toml, and the per-binding manifests (JS/nodejs/package.json,haskell/dcf-wire.cabal,perl/lib/DCF/Frame.pm,kotlin/build.gradle.kts, …). - Tag and push:
git tag -a vX.Y.Z -m "DCF vX.Y.Z" git push origin vX.Y.Z - Create the GitHub release from the tag, pasting the
CHANGELOG.mdsection as the notes.
These push to public registries (irreversible) and need credentials — they are not
run by CI. Publish from a green main at the tagged version; verify each package
installs and runs before uploading.
cd python
python3 -m build # dist/demod_dcf-<ver>-py3-none-any.whl + sdist
python3 -m twine check dist/*
python3 -m venv /tmp/v && /tmp/v/bin/pip install dist/demod_dcf-*.whl
/tmp/v/bin/dcf-sdr tx --text "DCF!" --mod gfsk --iq /tmp/d.cf32
/tmp/v/bin/dcf-sdr rx --iq /tmp/d.cf32 --mod gfsk # must recover "DCF!"
python3 -m twine upload dist/* # needs a PyPI tokenThe SDR modem + reference codecs ship under the dcf package (dcf.modem,
dcf.MCP) so their sibling-relative sys.path resolution works the same from a source
checkout and an installed wheel — don't flatten them to top-level.
cd JS/nodejs
npm test # certify frame + superpack + fec vs the golden vectors
npm pack --dry-run # confirm the tarball = src/{frame,superpack,fec}.js
npm publish --access public # scoped pkg must be public; needs `npm login`When you add a new certified module, add it to the files allow-list in
package.json (this is how fec.js was once shipped missing).
codec/ is intentionally publish = false (carries committed Faust-generated C,
consumed by path). rust/ (dcf-rust-sdk) has crates.io-ready metadata but a path dep
on codec, so publishing the SDK needs codec published or vendored first. Dry-run:
cd rust && cargo package --allow-dirty --no-verify.
v0.3.0 — every advertised language has a certified-or-CI-gated DeModFrame wire codec, and
the critical bugs C1–C9 are closed. See CHANGELOG.md.