Native Android App for Paperless-ngx with AI-Powered Document Processing
Features β’ Screenshots β’ Installation β’ Setup β’ FAQ β’ Contributing
Paperless Scanner is a modern, native Android client for Paperless-ngx that transforms your phone into a powerful document scanner with optional AI-powered metadata suggestions.
- π± Native Android App - Fast, smooth, Material 3 design
- π€ AI-Powered - Optional AI suggestions for tags, titles, and metadata (Premium)
- π Privacy-First - No data collection, full control over your data
- β‘ Lightning Fast - Scan, tag, and upload in seconds
- π Beautiful UI - Dark mode support with Material 3 design
- π΄ Offline-Capable - Queue uploads when offline, sync automatically
- π° Affordable & Open Source - Full app for just CHF 1.-, optional Premium AI
| Feature | Description |
|---|---|
| πΈ Smart Scanner | MLKit-powered document scanner with automatic edge detection |
| β¬οΈ Direct Upload | Upload directly to your Paperless-ngx instance |
| π Document Browser | Browse, search, and manage all documents with infinite scroll |
| π·οΈ Label Management | Manage tags, correspondents, and document types |
| π Multi-Page Docs | Combine multiple scans into a single PDF document |
| π Per-Page Metadata | Assign individual metadata (tags, title, type) to each scanned page |
| π― Smart Grouping | Pages with identical metadata are automatically merged into single uploads |
| π Batch Import | Upload multiple documents in one go |
| π Upload Queue | Persistent upload queue with retry logic and progress tracking |
| ποΈ Trash Management | Soft delete with restore functionality |
| π App Lock | Biometric/PIN protection with automatic lock |
| π± Home Widget | Quick scan access from home screen |
| π Dark Mode | Automatic dark/light theme following system settings |
| π΄ Offline Mode | Queue uploads when offline, auto-sync when connected |
| π Secure | Credentials stored securely with Android Keystore |
β¬4.99/month or β¬49.99/year (save 2 months)
| Feature | Description |
|---|---|
| π€ AI Tag Suggestions | Gemini 2.0 Flash analyzes your documents and suggests relevant tags |
| β¨ Smart Metadata | Automatic title extraction, date recognition, correspondent matching |
| π― Intelligent Matching | AI matches against your existing tags for consistency |
| π‘ New Tag Proposals | AI suggests new tags when existing ones don't fit |
| β‘ Time Saver | Save 30-60 seconds per document |
| π Unlimited Usage | Fair use policy - scan as much as you need |
| π Priority Support | Get help faster |
For advanced users who want to run their own AI:
- π οΈ Paperless-GPT Integration - Connect your own AI instance
- π Self-Hosted - Full control over your AI infrastructure
- π° Free Alternative - No subscription needed if you host your own
- π Open API - Use any OpenAI-compatible endpoint
Coming Soon! The app is currently in internal testing.
Download the latest APK from our Releases page.
Note: APKs from GitHub are signed with a development certificate. For production use, wait for the Play Store release.
# Clone the repository
git clone https://github.com/napoleonmm83/paperless-scanner.git
cd "paperless client"
# Build debug APK
./gradlew assembleDebug
# APK location:
# app/build/outputs/apk/debug/app-debug.apk- Install the app on your Android device (Android 8.0+)
- Open the app and tap "Login"
- Enter your Paperless-ngx details:
- Server URL (e.g.,
https://paperless.example.com) - Username
- Password
- Server URL (e.g.,
- Start scanning! πΈ
The app supports:
- β HTTPS (recommended for remote access)
- β
HTTP for local networks only:
10.x.x.x(Class A private)172.16.x.x - 172.31.x.x(Class B private)192.168.x.x(Class C private)localhost/127.0.0.1
Self-Signed Certificates: Install your CA certificate in Android's trusted certificates.
Your Paperless-ngx instance must support these API endpoints:
POST /api/token/- AuthenticationGET /api/tags/- Fetch tagsGET /api/correspondents/- Fetch correspondentsGET /api/document_types/- Fetch document typesPOST /api/documents/post_document/- Upload documents
Minimum Version: Paperless-ngx v1.10.0 or later recommended.
- Tap the settings icon in the app
- Navigate to "Subscription"
- Choose your plan:
- Monthly: β¬4.99/month
- Yearly: β¬49.99/year (save 17%)
- Complete purchase via Google Play Billing
- AI features activate automatically β¨
AI suggestions will now appear when you scan documents!
| Component | Technology |
|---|---|
| Language | Kotlin 2.1.10 |
| UI | Jetpack Compose + Material 3 |
| Dependency Injection | Hilt |
| Networking | Retrofit + OkHttp |
| Document Scanner | MLKit Document Scanner |
| AI Processing | Firebase AI (Gemini 2.0 Flash) |
| Database | Room (offline caching + upload queue) |
| Background Tasks | WorkManager (queue-only uploads) |
| Analytics | Firebase Analytics (opt-in) |
| Storage | DataStore Preferences |
| Image Loading | Coil 3.x |
| PDF Generation | iText 9.x |
| Pagination | Paging 3 (infinite scroll) |
| Billing | Google Play Billing Library 8.3.0 |
app/src/main/java/com/paperless/scanner/
βββ di/ # Dependency Injection (Hilt)
β βββ AppModule.kt
βββ data/
β βββ api/ # Retrofit API
β β βββ PaperlessApi.kt
β β βββ models/ # DTOs & API Models
β βββ repository/ # Business Logic Layer
β β βββ AuthRepository.kt
β β βββ DocumentRepository.kt
β β βββ TagRepository.kt
β β βββ CorrespondentRepository.kt
β β βββ DocumentTypeRepository.kt
β β βββ UploadQueueRepository.kt
β β βββ AiRepository.kt
β βββ datastore/ # Preferences & Settings
β β βββ TokenManager.kt
β βββ database/ # Room Database (Offline-First)
β β βββ dao/
β β β βββ CachedDocumentDao.kt
β β β βββ CachedTagDao.kt
β β β βββ CachedCorrespondentDao.kt
β β β βββ CachedDocumentTypeDao.kt
β β β βββ PendingUploadDao.kt
β β βββ entities/ # Room Entities
β βββ sync/ # Bidirectional Sync
β βββ SyncManager.kt
βββ ui/
β βββ theme/ # Material 3 Theme
β βββ navigation/ # Navigation Graph
β βββ screens/
β βββ login/ # Login Screen + ViewModel
β βββ home/ # Home Screen (Document List)
β βββ scan/ # Scan Screen + ViewModel
β βββ upload/ # Upload Screen + ViewModel
β βββ documents/ # Document Details + Editor
β βββ labels/ # Tags, Correspondents, Types
β βββ queue/ # Upload Queue Management
β βββ settings/ # Settings Screen + ViewModel
β βββ subscription/ # Subscription Screen + ViewModel
βββ util/ # Utilities & Helpers
βββ MainActivity.kt
βββ PaperlessApp.kt
Architecture Patterns:
- MVVM + Repository Pattern + Clean Architecture
- Offline-First with Room cache as single source of truth
- Queue-Only Upload via WorkManager (survives process death)
- Reactive Kotlin Flows for automatic UI updates
The base app sends your documents ONLY to your own Paperless-ngx instance.
| Component | Where data goes |
|---|---|
| Scanned documents | β YOUR Paperless server |
| Credentials | β Android Keystore (local) |
| Analytics | β Nowhere (zero tracking) |
| Crash reports | β Nowhere |
No cloud. No LLM. No third parties.
If you subscribe to Premium (β¬4.99/month):
- Document images are sent to Gemini 2.5 Flash Lite for tag suggestions
- You review and confirm all suggestions before upload
- Not stored permanently (per Google's API terms)
If you don't subscribe: The app works 100% self-hosted. Zero external services involved.
- π Credentials encrypted with Android Keystore
- π HTTPS enforced for remote connections
- π‘οΈ Certificate pinning support
- π Token-based authentication (no password storage)
- π Open source - audit the code yourself
Read our full Privacy Policy | Terms of Service
How much does the app cost?
The app costs CHF 1.- (one-time purchase) via Google Play. This includes all core features: scanning, uploading, document management, offline mode, and more. Optional Premium AI features are available as a subscription for power users.
Do I need a subscription?
No, you don't need a subscription to use the app. The one-time purchase (CHF 1.-) gives you full access to all core features. The optional Premium subscription (β¬4.99/month) adds AI-powered suggestions to save you time.
What is Paperless-ngx?
Paperless-ngx is a community-supported, open-source document management system that helps you scan, index, and archive all your physical documents. You need to host your own instance (or use a hosted solution) to use this app.
Can I use my own AI instead of the Premium subscription?
Yes! If you're technically savvy, you can set up Paperless-GPT or any OpenAI-compatible endpoint and configure it in the app settings. This is the "Power-User" option mentioned in our features.
Why does the scanner require Google Play Services?
The app uses MLKit Document Scanner, which is distributed via Google Play Services. This provides the best scanning experience with automatic edge detection and perspective correction. If you're on a device without Play Services, the app won't work (yet - we're considering alternatives).
Does the app work offline?
Yes! You can scan documents offline, and they'll be queued for upload. Once you're back online, the app will automatically sync them to your Paperless instance.
Can I scan multi-page documents?
Absolutely! After the first scan, tap "Add Page" to scan additional pages. The app will combine them into a single PDF before uploading.
What data does the AI see?
If you subscribe to Premium, the app sends the scanned document image to Google's Gemini AI for analysis. The AI returns suggestions for tags, title, date, and correspondent. Google doesn't permanently store your documents after processing. Read more in our Privacy Policy.
Where can I report bugs or request features?
Open an issue on our GitHub Issues page. We appreciate detailed bug reports with steps to reproduce!
Can I use this with Paperless (old version) instead of Paperless-ngx?
No, this app is designed specifically for Paperless-ngx. The original Paperless project is deprecated. We recommend migrating to Paperless-ngx.
Problem: "Unable to connect to server"
- β
Check your server URL (must include
http://orhttps://) - β Verify your Paperless-ngx instance is running
- β
Test the connection in a browser:
https://yourserver.com/api/ - β Check firewall rules if using local network
- β For HTTPS with self-signed certs, install the CA certificate on your device
Problem: "Invalid credentials"
- β Double-check username and password
- β Try logging in via web interface to verify credentials
- β Check for extra spaces in username/password fields
Problem: "Scanner not available"
- β Make sure your device has Google Play Services installed
- β Update Google Play Services to the latest version
- β Check device compatibility (Android 8.0+ required)
Problem: "Poor scan quality"
- β Use good lighting conditions
- β Place document on contrasting background
- β Hold device steady and parallel to document
- β Use the manual crop option if auto-detect fails
Problem: "Upload failed"
- β Check your internet connection
- β Verify you're still logged in (token might have expired)
- β Check Paperless-ngx server logs for errors
- β Try uploading a small test document first
Problem: "AI suggestions not appearing"
- β Verify your Premium subscription is active
- β Check internet connection (AI requires online access)
- β Check if you've exceeded the fair use limit (see Settings β Subscription)
Problem: "App is slow or crashing"
- β Clear app cache: Settings β Apps β Paperless Scanner β Clear Cache
- β Check available storage space
- β Update to the latest version
- β Restart your device
We welcome contributions! Here's how you can help:
- Check existing issues first
- Use our Bug Report template
- Include:
- Android version
- Device model
- App version
- Steps to reproduce
- Expected vs actual behavior
- Screenshots if applicable
- Check existing feature requests
- Use our Feature Request template
- Explain:
- What problem does it solve?
- How should it work?
- Why is it useful for other users?
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature
- Follow our coding standards:
- Use Kotlin idioms and best practices
- Follow Material 3 design guidelines
- Write unit tests for new features
- Document public APIs
- Run local CI checks:
./scripts/validate-ci.sh
- Commit your changes:
git commit -m "feat: add amazing feature" - Push to your fork:
git push origin feature/amazing-feature
- Open a Pull Request
Coding Standards:
- Use
data objectfor sealed class singletons - Prefer
StateFlowoverLiveData - All async operations use
suspendfunctions orFlow - Repository methods return
Result<T> - Stateless Composables with state hoisting
- Follow MVVM + Repository pattern
See docs/BEST_PRACTICES.md for detailed guidelines.
| Document | Description |
|---|---|
| PRIVACY_POLICY.md | Privacy policy (DE/EN) |
| TERMS_OF_SERVICE.md | Terms of service (DE/EN) |
| TECHNICAL.md | Technical documentation & architecture |
| API_REFERENCE.md | Paperless-ngx API reference |
| QUEUE_ONLY_ARCHITECTURE.md | Upload queue architecture |
| BEST_PRACTICES.md | Coding standards & best practices |
| LOCAL_CI_TESTING.md | Local CI validation guide |
| ROADMAP.md | Feature roadmap & future plans |
This project is licensed under the MIT License - see the LICENSE file for details.
MIT License
Copyright (c) 2024-2025 Paperless Scanner
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
...
- π Documentation: docs/
- π Bug Reports: GitHub Issues
- π‘ Feature Requests: GitHub Issues
- π¬ Community: r/paperless or r/paperlessngx
- π§ Email: Contact via GitHub
- Paperless-ngx - The amazing document management system this app connects to
- MLKit - Google's ML Kit for document scanning
- Jetpack Compose - Modern Android UI toolkit
- Firebase AI - Gemini AI integration
- All contributors and users who help improve this app!
If you find this project useful, please consider giving it a star β
Made with β€οΈ for the Paperless-ngx community




