Thanks for considering a contribution. This is a small, privacy-first FOSS project — issues and PRs of any size are welcome.
See the README's "Getting started" section for running the app. Skim the code comments for the reasoning behind a few non-obvious decisions before making non-trivial changes.
flutter pub get
flutter analyze
flutter testDocker is also available if you don't want the Flutter/Android SDKs installed locally — see the README's "Running with Docker" section.
This repo's versioning and CHANGELOG.md are generated automatically by
Release Please from commit
messages on main, following Conventional
Commits. Please prefix commits (or
at minimum, squash-merged PR titles) accordingly:
| Prefix | Effect |
|---|---|
fix: ... |
Patch release (bug fixes) |
feat: ... |
Minor release (new features) |
feat!: ... or a BREAKING CHANGE: footer |
Major release |
docs:, chore:, refactor:, test:, ci: |
No version bump, but recorded |
A commit that doesn't follow this format still merges fine — it just won't show up correctly in the next automated changelog entry.
Commits should be attributed to their actual human author. Please don't
add Co-Authored-By trailers for AI coding assistants.
- Keep PRs focused — one logical change per PR is easier to review and
keeps
git bisectuseful. - CI (
flutter analyze+flutter test) must pass before merge. - For anything touching
document_processor_native.dartor the OpenCV bindings, please test on a real device or emulator —flutter_test's fake-time test binding doesn't reliably exercise the native image pipeline.
Use the issue templates — they ask for the platform (Android/web) and Flutter version, which is usually the first thing needed to reproduce anything in this codebase given how much of it is native-only.
See SECURITY.md for how to report a vulnerability privately instead of opening a public issue.