- Bump the version to 1.0.0 in package.json, Cargo.toml, tauri.conf.json and the Void template. Fingerprint goldens are unchanged. - Rewrite the README: features, data paths on Linux and Windows, backup and restore (backups contain the ERPNext API secret), bundled fonts and licences, font overrides, the ERPNext recipe, build and packaging commands, gates and known limitations. - Add docs/RELEASE.md with the release steps and a manual first-run checklist. - Void template: use a plain npm ci (the optional-dependency omit breaks vite and tsc), and note vendoring and that no OpenSSL is needed. Verified: build-xbps.sh builds voiced-1.0.0_1; it installs and removes cleanly in a clean void-glibc container with fonts, licences and fc-cache handling in place. The cross-compiled NSIS installer is 11.45 MiB and has not been run on Windows.
4.7 KiB
Release checklist
Run from the repository root on a quiet machine, on a branch cut from main.
1. Version
Keep these in step: package.json and the root entry of package-lock.json, src-tauri/Cargo.toml and
src-tauri/Cargo.lock (cargo update --offline -p voiced), src-tauri/tauri.conf.json, and version= plus
revision= in packaging/void/template. The PDF Creator string follows package.json (src/lib/pdf.tsx); layout
fingerprints do not include it, so goldens stay unchanged.
2. Gates
npm run build
npm test # about 7 minutes
npm run fonts:verify
cargo test --manifest-path src-tauri/Cargo.toml
cargo tree -i aws-lc-sys --manifest-path src-tauri/Cargo.toml # must not match
cargo tree -i aws-lc-sys --manifest-path src-tauri/Cargo.toml --target x86_64-pc-windows-msvc # must not match
Real-webview self-test on the debug build:
npm run tauri -- build --debug --no-bundle --features custom-protocol
VOICED_SELFTEST_OUT=/tmp/voiced-e2e/report.json XDG_DATA_HOME=/tmp/voiced-e2e/data \
XDG_CONFIG_HOME=/tmp/voiced-e2e/config timeout 180 src-tauri/target/debug/voiced
/tmp/voiced-e2e/report.json must contain "ok": true. Repeat the same check on each installed build with
Settings, Diagnostics.
3. Void package
./packaging/void/build-xbps.sh
tar --zstd -tf build/void/repo/voiced-<version>_1.x86_64.xbps | less
Expect ./usr/bin/voiced, the desktop file, hicolor icons, usr/share/fonts/voiced/<family>/*.ttf,
usr/share/licenses/voiced/*-OFL.txt, ./INSTALL and ./REMOVE. Then install it into a clean container:
podman run --rm -v "$PWD/build/void/repo:/repo:Z" ghcr.io/void-linux/void-glibc-full sh -c '
xbps-install -Syu xbps && xbps-install -y -R /repo voiced &&
fc-list | grep -iE "montserrat|poppins|lustria|dm sans|inter|jost|open sans|ibm plex" &&
ls /usr/share/licenses/voiced && ldd /usr/bin/voiced | grep "not found"; xbps-remove -y voiced'
ldd must print no not found line, and xbps-remove must finish without errors. Optionally build with
xbps-src in a void-packages checkout (see the README).
4. Windows installer
npm run app:build:windows # standard installer
npm run app:build:windows:offline # only for machines without internet
Needs cargo-xwin, makensis and the NSIS plugin cache (README, "Building for Windows"). Check the size of
src-tauri/target/x86_64-pc-windows-msvc/release/bundle/nsis/*-setup.exe against the budget of about 25 MB. Optional:
sign it with osslsigncode. Never commit build outputs (build/, dist/, src-tauri/target/).
5. Manual first-run checklist (on a real machine, installed build, not app:dev)
Linux and Windows. Windows has never been run on real hardware, so treat it as untested until this passes.
- Onboarding and Branding. Complete first-run setup; upload a wide and a square logo, check the dark-theme wordmark and the signature.
- Template picker. Open all 14 templates; switch A4 and Letter and the margin presets; check the logo slots.
- Export. Issue an invoice; export searchable and flattened; change settings and re-export; "Original as issued"
must be byte-identical to the archived PDF. On Windows, check file names with
/,:and reserved names. - Fonts. Settings, Fonts: import a TTF for Now, Gotham or Open Sauce One (if a licensed file is at hand), confirm a template that uses it changes, remove it again.
- Clients. Create a client with structured address and GST category; use it on an invoice.
- Settings tabs. Business, Branding, Bank and payments, Invoice defaults, Numbering, Templates and export, Fonts, Data, Integrations: open each and save a change.
- History, detail and payments. Filter the list; open an invoice; record a payment with TDS; cancel one; export
CSV, JSON and
voiced.invoice.v1. - Data. Backup now, change something, restore the backup, restart, confirm the data returned and that
backups/pre-restore-*exists. Confirm the archive and fonts directories (Windows: under%LOCALAPPDATA%). - Integrations. Test connection and push an invoice to a test ERPNext (README, "ERPNext integration").
- Single instance. Launch a second copy: the first window must come to the front.
6. Canva licence
The 13 Canva-derived templates are re-creations of Canva designs. Canva's content licence may restrict that. Until it
is confirmed in writing, distribute builds containing those templates only to this vendor. If the answer is no,
remove the templates from src/pdf/templates/registry.ts and catalog.ts (Classic stays) and rebuild. Also still
open: a chartered accountant's sign-off on the SAC code and the signature rule.