Prerequisites: Go 1.24+
git clone https://github.com/alcxyz/paperflow.git
cd paperflow
go build ./cmd/paperflowgo test -race ./...CI runs golangci-lint. Install it locally to catch issues before pushing:
golangci-lint runcmd/paperflow/-- entry point, CLI parsing, subcommandsinternal/config/-- config loading (TOML, XDG paths)internal/watcher/-- filesystem watching (fsnotify)internal/organizer/-- file sorting by type and dateinternal/ingest/-- Paperless-ngx ingestion (API and directory)internal/notify/-- batched desktop notificationsinternal/bucket/-- extension-to-bucket mapping
- Fork the repo and create a branch from
dev - Make your changes
- Add or update tests as needed
- Run
go test -race ./...andgolangci-lint run - Open a pull request against
dev
CI runs tests on both Linux and macOS, plus linting. All checks must pass before merging.
Use conventional-ish prefixes to keep history scannable:
feat:new featurefix:bug fixdocs:documentation onlychore:maintenance, CI, dependenciesrefactor:code changes that don't add features or fix bugs
Releases are automated via GoReleaser and GitHub Actions. The VERSION file is the single source of truth.
To cut a release:
- Bump the
VERSIONfile ondev - Merge
devintomain - CI automatically creates the git tag and runs GoReleaser
This builds binaries for linux/darwin x amd64/arm64, creates a GitHub release with changelog, updates the Homebrew tap, and publishes to the AUR (paperflow-bin).
The release.yml workflow also exists as a fallback for manually re-triggering a release by pushing a v*.*.* tag.
Follow semver:
- Patch (
v0.2.x): bug fixes, minor tweaks - Minor (
v0.x.0): new features, non-breaking changes - Major (
vx.0.0): breaking changes to config format, CLI flags, or behavior
By contributing, you agree that your contributions will be licensed under the MIT License.