Skip to content
BobbyESPPublic

About

Scan, organize and read your documents. All of it on your device. Android app with full-text search, text recognition (OCR) and no watermark. Built with Jetpack Compose, Material 3 Expressive and MVI.

Topics

Resources

Stars

42 stars

Watchers

1 watching

Forks

Latest commit

 

History

351 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Docucraft logo

Docucraft

Scan, organize and read your documents. All of it on your device.

A document scanner, a searchable library and a PDF reader in one Android app.
No account, no cloud, no watermarks.

Open beta on Google Play

Kotlin 2.4 Jetpack Compose, Material 3 Expressive ML Kit, on device Android 7.0 or later License GitHub stars

Features · Privacy · Under the hood · Build it · Contributing


Docucraft: scan it once, find it anytime. No watermark, no account, no cloud.

Features

📷 Scan

  • Automatic edge detection, cropping and cleanup, with a model that runs on the phone.
  • Many pages, one PDF, from the camera or from photos you already have. Crop, rotate, filter or retake any page before saving.
  • Review as you save: name the scan, describe it, file it in a folder and tag it. Or skip, and it is saved as it came.
  • Home-screen widgets: one goes straight to the scanner, one lists your recent documents.

🗂️ Organize

  • Folders inside folders, each with its own color and icon. Pin the ones you use to Home.
  • Tags, as many per document as you like, and a Home section for the ones you choose.
  • Favorites, and Recents for what you opened last.
  • A bin: a deleted document can be restored for 30 days.

🔎 Find

  • Search inside your documents, not only their names: results are ranked by relevance and show the page and the words around the match.
  • Case and accents do not matter: cancion finds Canción.
  • Text recognition (OCR) on the device, for scans and image-only PDFs. It is your choice, per document.
  • Filter by favorites and tags, sort each folder its own way.

📖 Read

  • A PDF viewer built for the app, with smooth zoom, four fit modes, night mode and a fast scroller.
  • Opens any PDF from your file manager, mail or chat, and can keep a copy in your library.
  • Select and copy text, across pages, even on a scanned page once its text is recognized.
  • Picks up where you left off, on the same line.
  • Safe links: you see where a link really leads before anything opens.

📤 Share

  • Share, print, export or open with another app.
  • The file another app receives carries the name you gave the document.
  • No watermarks, ever.

🎨 Make it yours

  • Material 3 Expressive, with dynamic color from your wallpaper or a color you pick.
  • Light, dark and high-contrast themes, palette styles and fonts.
  • Adapts to tablets and foldables: the document opens beside the list.
  • 13 languages, and TalkBack support in the viewer.
Languages

English, Arabic, Chinese, Dutch, French, German, Hindi, Italian, Japanese, Korean, Portuguese, Russian and Spanish.

Privacy

Docucraft is local-first: your documents never leave your device unless you share them.

  • Scanning and text recognition run on the device, through Google's ML Kit. Nothing is uploaded to be processed.
  • No account and no cloud. Documents are kept in the app's private storage, and the library and its search index in a local database.
  • Other apps' PDFs are opened, not copied. Docucraft keeps a reference to them and nothing else, until you choose Save to Docucraft.
  • Links are checked before they open. Only web, email and phone links are followed, and a web link is shown by the address a browser would really open, so a look-alike does not pass for the real one.
  • What is collected: usage events and crash reports, through Firebase Analytics and Crashlytics. Never your documents, nor their text.

Under the hood

Tech stack

Area Technology
Language Kotlin, with coroutines and Flow
UI Jetpack Compose, Material 3 Expressive, Material 3 Adaptive, platform RemoteViews for the widgets
Navigation Navigation 3: one back stack, typed keys, sheets and dialogs as destinations
Architecture Clean architecture by feature, MVI ViewModels, ports and sealed results
Dependency injection Koin
Storage Room with FTS4 full-text search, DataStore
Background work WorkManager
On-device ML ML Kit Document Scanner and Text Recognition
PDF An in-house Compose engine over the platform's PdfRenderer
Theming MaterialKolor, Haze
Files FileKit

Modules

The app is a shell over feature modules, which share the library's domain and UI and open each other only by navigation keys, kept in :core:navigation. Domains are plain Kotlin modules, and every SDK sits behind a contract, so the scanner and the text recognizer can each be replaced by changing one line of dependency injection, and no ML Kit type ever reaches a feature.

graph TD
    app[":app<br/><i>shell: activities, back stack, engine bindings</i>"]
    features[":feature:*<br/><i>home, search, organization, bin, scan,<br/>document-actions, pdfviewer, settings, widgets</i>"]
    library[":library:domain · :library:ui<br/><i>the catalogue's rules and shared UI</i>"]
    libraryData[":library:data<br/><i>Room, files, search, indexing</i>"]
    core[":core:domain · :designsystem · :navigation · :ui"]
    coreData[":core:data<br/><i>preferences, analytics</i>"]
    composepdf[":composepdf<br/><i>PDF engine</i>"]
    apis[":scanner:api · :content:api<br/><i>the engines' contracts</i>"]
    engines[":scanner:mlkit · :content:platform · :content:mlkit<br/><i>the engines, named only by the app</i>"]

    app --> features
    app --> libraryData
    app --> coreData
    app --> engines
    engines --> apis
    features --> apis
    features --> library
    features --> core
    features --> composepdf
    libraryData --> library
    library --> core
Loading

Documentation

How each part works, and why it was built that way, is written down in docs/:

Document Covers
Architecture Modules, layers, ports, ViewModels, theme and blur
Navigation One back stack, scenes, modal destinations
Scanning The scanning contract, saving, search, reading the text of pages
Database The catalogue's tables and rules, migrations, the bin
Organization Folders, tags and favorites
PDF engine Rendering, layout, gestures, extension points
PDF viewer The viewer's screen, settings and the viewer for other apps' PDFs
Text and links Page content, text selection, safe links
Testing What is tested where, fixtures, checking by hand

Build it

You need a recent Android Studio, JDK 17, and a device or emulator on Android 7.0 (API 24) or later with Google Play services, which provide the scanner and the recognition model.

git clone https://github.com/BobbyESP/Docucraft.git
cd Docucraft

Firebase is part of the build and its configuration is not in the repository. Create a Firebase project, register the Android apps com.bobbyesp.docucraft and com.bobbyesp.docucraft.debug, and place its google-services.json in app/.

Then open the project in Android Studio and run it, or from a terminal (on Windows, .\gradlew.bat):

Task Command
Debug APK ./gradlew :app:assembleDebug
Unit tests ./gradlew testDebugUnitTest
Instrumented tests ./gradlew connectedDebugAndroidTest
Format ./gradlew spotlessApply

Note

Instrumented tests run on every attached device. Set ANDROID_SERIAL to target one.

Good to know

  • Google Play services are required for scanning and for text recognition.
  • Selecting a PDF's own text needs Android 15 or later. On earlier versions, text recognition covers it for documents in your library.
  • Search finds whole words and their beginnings, and does not yet split Chinese, Japanese or Korean text into words.
  • PDFs are opened from the device. One behind a web address is not downloaded yet.

Contributing

Issues and pull requests are welcome. Before changing a subsystem, read its document in docs/ and the rules in AGENTS.md.

  • Commits follow type(scope): summary, and the body says why.
  • Run ./gradlew spotlessApply before committing.
  • A new string needs its translation in every language of app/src/main/res/values-*.

License

Docucraft is free software, distributed under the GNU General Public License v3.0. See LICENSE.


Built with ❤️ by Bobby

If Docucraft is useful to you, a star helps others find it. ⭐

About

Scan, organize and read your documents. All of it on your device. Android app with full-text search, text recognition (OCR) and no watermark. Built with Jetpack Compose, Material 3 Expressive and MVI.

Topics

Resources

Stars

42 stars

Watchers

1 watching

Forks

Used by

Contributors

Languages