Thanks for the interest. This project is small and pragmatic. Here is what helps a PR land quickly.
mainis the release branch. Every merge tomaintriggers release builds for macOS, Windows, and Linux on the GitHub Releases page.devis the working branch. New features and fixes go ondevfirst (or on a feature branch intodev).- Pull requests target
mainonly when the change is ready to ship. Direct pushes tomainare not allowed; the branch is protected.
In short: work on dev, ship from main.
Open an issue with:
- OS and version (macOS, Windows, or Linux build; for Linux include the distro and whether the install came from the
.deb,.rpm, or AppImage artifact). - App version (from the title bar or
package.json). - Steps to reproduce.
- A redacted JAR or its signatures, if relevant.
For security issues, follow SECURITY.md instead. Do not file a public issue.
- Keep changes focused. Smaller PRs review faster.
- Run the checks below before pushing.
- Match the existing style. No new dependencies without a short reason in the PR description.
- For UI changes, attach a screenshot or short clip.
The CI workflow runs these on every PR. Run them locally too:
npm run check # TypeScript
cargo fmt --manifest-path src-tauri/Cargo.toml -- --check # Rust format
cargo clippy --manifest-path src-tauri/Cargo.toml -- -D warnings
cargo check --manifest-path src-tauri/Cargo.toml # Rust type-checkThe CI also runs gitleaks detect to catch accidental secret commits, and a tauri build --debug smoke job on macOS, Windows, and Linux (Ubuntu 24.04) so config breakage shows up before release.
npm install
npm run tauri devThe frontend lives in src/. The Rust shell lives in src-tauri/src/. The Tauri commands are defined in src-tauri/src/api.rs and registered in src-tauri/src/lib.rs.
Releases are continuous. The version-gate runs on every push to main:
- CI reads the version from
src-tauri/tauri.conf.json. - If a tag
v<version>already exists, the release job is skipped (no duplicates). - Otherwise, CI builds macOS (universal), Windows (NSIS + MSI), and Linux (
.deb,.rpm, AppImage), creates thev<version>git tag, and publishes a GitHub Release with all bundles attached. There is no signed updater manifest today; updates are manual via the GitHub Release page on every platform.
To cut a new release:
- On
dev, bump the version in all three files:package.json("version")src-tauri/Cargo.toml([package] version)src-tauri/tauri.conf.json("version")
- Update
CHANGELOG.md. Move items fromUnreleasedinto a new section for the new version with today's date. - Open a PR from
devtomain. - Merge after CI is green. The release workflow tags and publishes automatically.
If the three versions disagree, the version-gate fails the build before doing any work. This is intentional.
Short, lowercase, present tense, no punctuation at the end. Examples:
add updater plugin and signing key wiring
fix off-by-one in scan progress elapsed counter
update tauri to 2.0.6
Reference an issue with #123 if relevant.
By contributing, you agree your work is dual-licensed under MIT OR Apache-2.0.