A privacy-first, free and open-source document scanner.
Scan documents with your camera, auto-crop and dewarp them, and export a PDF — all on-device. No accounts, no cloud, no tracking.
Grab app-arm64-v8a-release.apk from the release's assets — that's the
right build for virtually every phone from the last ~7 years. Prefer a
32-bit or x86 device? Use armeabi-v7a or x86_64 instead.
Captured from the web build, which skips straight to the raw photo (web has no OpenCV support, see below) — native builds additionally show the edge-detection/corner-adjustment and filter screens in between capture and this page list.
- Real document scanning, not just a photo: automatic edge detection with a draggable corner overlay to fine-tune it, then perspective correction (dewarping) into a flat, upright page
- Scan filters — Original, Auto-Enhance, Grayscale, and Black & White — with live thumbnail previews before you confirm
- Re-edit any page after the fact (corners, filter, rotation, brightness, and contrast) without re-scanning
- Capture multiple pages in sequence and reorder them with drag-and-drop
- Import existing photos from your gallery instead of (or alongside) capturing new ones
- Combine captured pages into a single PDF
- Share the PDF via the OS share sheet (or download it directly on web)
- Material 3 UI that follows the system's light/dark theme
- No accounts, no cloud storage, no tracking
- An in-app About screen (the ⓘ icon) shows the exact running version and links straight to this source repo
Edge detection, perspective correction, and filters run on real OpenCV
(opencv_dart) on Android/iOS/desktop. Desktop builds support importing
images, but image_picker has no built-in desktop camera UI, so camera capture
is only offered where the platform plugin reports it as supported. The web
build doesn't support OpenCV (the bindings are native/FFI-only) — web is a
quick preview/testing target, not the primary one; the raw captured photo is
used as-is there.
- All image processing and PDF generation happens on-device.
- Imported gallery originals are never modified or deleted. App-owned camera temp files are removed after the app attempts to copy their bytes into memory (including failed reads), and in-progress pages remain only in memory until the app is closed.
- PDF sharing starts from in-memory bytes. Depending on the platform,
share_plusmay materialize a copy in the app/OS cache for the receiving app; that cache is OS-managed and is not guaranteed to disappear immediately after the share sheet closes. - The app makes no network requests of its own. (The web build's rendering engine, CanvasKit, is fetched from Google's CDN by the Flutter web framework itself — this doesn't apply to the native Android/iOS builds.)
Requires Flutter >=3.44.0 with Dart >=3.12.0 <4.0.0 (matching the
locked dependency resolution and pubspec.yaml).
flutter pub get
flutter run| Command | Purpose |
|---|---|
flutter analyze |
Static analysis / lint |
flutter test |
Run the test suite |
flutter build apk --split-per-abi |
Build signed, per-ABI release APKs |
flutter build web |
Build a release web bundle |
docker-compose.yml provides two services that build against
ghcr.io/cirruslabs/flutter:stable, so you don't need the Flutter/Android
SDKs installed locally. The APK service uses the image's x86_64 Android
SDK/NDK toolchain; Docker Desktop uses emulation automatically on Apple
Silicon, so that build is slower there. Native arm64 Linux Docker engines need
amd64 emulation (for example, binfmt/QEMU) for the APK service:
# Web preview, served on http://localhost:8080
docker compose up flutter-web
# Release Android APKs (one per ABI), output to build/app/outputs/flutter-apk/
docker compose run --rm build-apkIssues and pull requests are welcome — see CONTRIBUTING.md for the dev workflow and commit message conventions.
FOSScanner is licensed under the GNU General Public License v3.0.

