android-ocr runs Tesseract 5 entirely on the device
Tesseract based OCR for android
At a glance
- What is it?
- OCR is a F-Droid listed Android app that extracts text from images in over 120 languages using Tesseract 5 through the Tesseract4Android library, with everything processed offline. The rewrite moved the UI to Jetpack Compose with MVVM and Hilt, and the last push was on 2026-08-06.
- Who is it for?
- Adopt android-ocr if you want an offline, privacy-focused text extractor on Android that reads 120 plus languages, including maths, and can be installed from F-Droid without a Google account. Skip it if you need a server-side OCR pipeline, or if you need the old Java and XML interface, since that code survives only in the `:oldApp` module.
- Can I use it commercially?
- Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 78 days ago.
- What is it written in?
- Mainly Java, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 22, 2026, and from our analysis. They are not legal advice.
Editorial analysis
Offline recognition is the product decision
OCR is a modern, privacy-focused Android application for optical character recognition, and the first feature on the list is offline recognition, with images processed entirely on the device for what the README calls maximum privacy. That single design choice shapes everything else about the app. There is no upload step, no account, and no server round trip, which also means the app works on a plane or on a metered connection. The privacy claim is not merely a slogan in a badge: the repository is listed on F-Droid under the package name `io.github.subhamtyagi.ocr`, and the F-Droid badge and the foss topic both point at a distribution model built around free and open source builds rather than a store copy with tracking. The audience is anyone who needs to pull text out of a photograph on their own phone, whether that is a receipt, a label, a whiteboard or a page of printed maths.
Tesseract 5 through the Tesseract4Android wrapper
The recognition engine is Tesseract 5, reached through the Tesseract4Android library, and the README credits that choice with ensuring high accuracy and performance. This is the part of the project that is not original work, and the licences section is clear about it, listing the Tesseract engine and Tesseract4Android both under Apache 2.0. Using a wrapper rather than building a native binding from scratch means the project inherits the work of maintaining an Android port of a large C++ engine, and it inherits its model files too. The language coverage follows from the same source, with 120 or more languages available as Tesseract data files, and the app can process multiple languages within a single image rather than forcing a single-language pass. The repository itself is Apache 2.0 as well, with the licence and translation badges at the top of the README. The application is written in Java, with the primary language recorded as Java.
A Compose rewrite sitting next to the old Java and XML app
The project structure tells a migration story. There are three modules. `:app` is the main application module holding the UI and business logic. `:cropper` is a dedicated module for image cropping. And `:oldApp` is described as the old app code written in Java and XML, which is a deliberate archive rather than a deletion. So the current build is a rewrite in a different toolchain while the previous implementation remains in the tree, which is a reasonable way to stage a large migration but also means the repository carries two codebases. The modern side is described in the tech stack section. The UI is Jetpack Compose, for what the README calls a modern, declarative UI. The architecture is MVVM with Hilt handling dependency injection. Room is used for local data persistence. That combination is the current Android default stack, and choosing it means the app inherits the usual consequences: a slower cold start than a view-based UI, and the learning curve of the Compose model.
Crop and select is what makes a phone camera OCR usable
The feature list is short, and crop and select is the one that does the most work. A user can pick a precise region of the image to recognise, with what the README calls precise control over which part of the image to recognize. On a phone, that is the difference between an app that returns the whole page, including headers and footers, and one that returns the paragraph you wanted. It is also why the project has a separate `:cropper` module rather than folding the behaviour into `:app`, since cropping is a self-contained piece of UI that could be reused. The other two interaction features are the obvious ones but still worth naming, because they are the difference between a demo and something you use daily. You can share images directly from your gallery to the app, which removes the step of saving a picture to disk first, and the recognised text can be copied to the clipboard with one tap. The screenshot table shows four screens, Home, a dark theme result view, a download and manage screen, and Settings.
Maths recognition and the language download workflow
One specialised extraction feature is called out separately from ordinary text: recognizing math equations. The topics the repository carries include math-ocr alongside ocr, ocr-recognition, ocr-text-reader, image-reader and reader, so the maths path is a real part of the scope rather than a line item. There is also a dedicated screen for downloading and managing what appears to be language data, and a Languages screen referenced in the screenshot table. This follows from the engine design: Tesseract recognises text with trained data files per language, and an application claiming 120 plus languages has to obtain those data files somehow. Putting them behind a download and manage screen rather than bundling all of them is a reasonable packaging decision for an app distributed through F-Droid, since the size of a full multilingual model set would dominate the download. The consequence for a user is that the first use of a given language is not instant, and the app is not fully functional offline until the data it needs is present.
Installing the app from F-Droid and choosing a language
There is no install command in the documentation, because this is an application rather than a library, and the project points you at F-Droid. The package is published as `io.github.subhamtyagi.ocr`, and the version badge in the README links directly to its F-Droid listing, which is the distribution channel the repository topics and the foss tag both point to. On a device with F-Droid installed, that listing is where you get the build. The first run then has one step left to do, and it is the step that trips people up: the language data has to be obtained, which is what the download and manage screen and the Languages screen exist for. Pick the language or languages you need, let them download, and only then is the app fully offline-capable for that language. The repository also ships a `fastlane/` directory with the English screenshot metadata, so the same build is what gets packaged for the store listings, and the Gradle wrapper files `gradlew` and `gradlew.bat` are there if you would rather build the project yourself from a checkout.
F-Droid, Weblate and a project still in motion
The distribution and community signals are the clearest indicators of the project's character. The app is on F-Droid, with a version badge linked to the package page, and the repository topics include fdroid and foss. Translations are managed on Weblate rather than by hand, and the contributing section points contributors at that project specifically, alongside the general invitation to report bugs, suggest features or submit a pull request. The people credited are Shubham Tyagi as the author, Hannes Gehrold for the old UI design, and urlordjames as a code contributor, and the graphics credits name the app icon designer and the original icon concept. The release history shows v5.2 in March 2025, v6.0 in July 2026 and v6.1 in August 2026, and the last push to the repository was on 2026-08-06, so the v6 rewrite is recent and the project is still moving. The repository also carries a `fastlane/` directory for release metadata, a `TODO.txt`, a `parameters.md`, and Gradle build files in Kotlin DSL, `build.gradle.kts` and `settings.gradle.kts`.
Editorial conclusion
Adopt android-ocr if you want an offline, privacy-focused text extractor on Android that reads 120 plus languages, including maths, and can be installed from F-Droid without a Google account. Skip it if you need a server-side OCR pipeline, or if you need the old Java and XML interface, since that code survives only in the `:oldApp` module. Before you commit, check that the F-Droid build matches your target Android version, and note that the app is a product rather than a library, so it is not something you can embed in your own application.
Frequently asked questions
Does android-ocr send images to a server?
No. The offline recognition feature processes images entirely on the device for what the README calls maximum privacy, and the app is distributed through F-Droid as a free and open source build.
Which OCR engine does android-ocr use?
Tesseract 5, reached through the Tesseract4Android library, which is licensed under Apache 2.0 as is the Tesseract engine itself. That engine provides support for 120 or more languages, and multiple languages can be processed in a single image.
What is the current tech stack of android-ocr?
Jetpack Compose for the UI, MVVM architecture with Hilt for dependency injection, Room for local data persistence, and Tesseract 5 through Tesseract4Android for recognition. The primary language of the repository is Java.
What are the modules in the android-ocr repository?
Three: `:app` for the main application module with the UI and business logic, `:cropper` as a dedicated module for image cropping functionality, and `:oldApp` holding the old app code written in Java and XML.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/subhamtyagi-android-ocr)Was this useful?