German on your screen, English in its place.
Swipe from a corner in any app and the German text is replaced, right where it is, by English.
Translated on your phone: no account, no cloud, no Google services.
Veil lays a thin veil over the screen: the German underneath goes soft and blurred, the English sits on top in the same place, in the page's own colours. A letter from the Bürgeramt, a German app, a menu on a website, a sign in a photo: one swipe, and you can read it. Nothing you translate leaves the phone.
![]() |
![]() |
![]() |
| Any German page Here bonn.de in Chrome |
One swipe later English in place, even text in the photo |
Photo mode Signs, letters, menus |
![]() |
![]() |
| Set up in four steps Home shows what's left |
History Copy or delete, or turn saving off |
Status: early (0.x). Built and used on a Pixel 9. Other phones should work but are less tested; please report what you see.
- Translate in place. English boxes over the original, blurred German behind them, toolbar to show the original, copy German or English, or close. Tap a box for its German, long-press to copy.
- Any app, also text in images. Reads the text apps expose to Android, and runs text recognition (OCR) on a screenshot for text inside pictures, games and apps Android can't see into.
- Three ways to start it. The corner swipe (Veil is your digital assistant), a Quick Settings
tile, or
veil://translatefrom Tasker, Key Mapper or adb. - Selected text. Select text in any app, pick "Translate with Veil" in the menu (under ⋮): the English appears in a sheet, to copy, or, in a text field, to put in place of the German.
- Photo mode. Take a photo with the camera or pick one from the gallery: Veil draws the English into the picture. Zoom, rotate, translate only a part, tap a box for its German, then save (as taken or translated) or share.
- Three translation engines. Firefox Translations (Mozilla's Bergamot model): 37 MB, fast and accurate, the default. OPUS-MT: the earlier default, 110 MB. Hy-MT2 1.8B: the best wording, needs about 2.5 GB of memory, and follows your own glossary ("Sitzung = session").
- History (from Home). Every translation with app, time and engine, filter by app; copy, delete one or all, or turn saving off. Screens you've seen before translate instantly.
- Copy text mode. Outlines all text on screen so you can copy any of it, no translation. Switch between Translate and Copy text on Home or right on the toolbar after swiping.
- Your settings. Where text comes from (app text, images, or both), box text size and how much of the original shows through, keep short lines like buttons as separate boxes.
- Updates in the app. A daily check (can be turned off) and one-tap updates, signed by the maintainer.
Requires Android 11+ on a 64-bit ARM phone (almost every phone from the last years).
- Download
veil.apkand install it (allow "install unknown apps" for your browser or file manager). Later versions install from inside the app: Settings → Updates. - Open Veil. Home shows what's left to set up:
- make Veil the digital assistant (Android's settings open for you),
- turn on Veil's accessibility service (if Android says "Restricted setting": App info → ⋮ → Allow restricted settings),
- download a translation model on Models; text recognition (31 MB) is optional but needed for text in images and for photo mode.
- In any app, swipe up diagonally from a bottom corner. Swipe again, press Back or tap outside to close.
Something wrong? Settings → Troubleshooting → Activity log → Copy, and attach it to an issue.
- Trigger. Veil is registered as the default digital assistant, so Android's assistant gesture
(corner swipe, or long-press power on some phones) starts it, invisibly. The Quick Settings tile
and
veil://translatego through the same path. - Read. The accessibility service collects the text on screen with its position; each text is already a whole paragraph. In parallel, a screenshot goes through PP-OCRv6 (ONNX Runtime) for text in images; its lines are grouped into paragraphs, hyphenated words joined.
- Pick. A quick check keeps only German text, so English and numbers stay as they are.
- Translate. On the phone, in batches: Firefox Translations (bergamot-translator, Marian with int8 kernels), OPUS-MT (Marian, int8, ONNX Runtime), or Hy-MT2 1.8B (llama.cpp) with numbered segments, told when text came from OCR and given your glossary. Results are cached and saved to History.
- Show. An accessibility overlay draws one box per paragraph: a blurred crop of the original under a veil in the page's colour, the English sized to fit.
Design notes, decisions and status: docs/.
Veil does no analytics and sends no telemetry. Screen text, photos, translations, History and the activity log stay in the app's private storage on the phone. Veil uses the network for two things only:
- Model downloads, which you start yourself (on mobile data it asks first). Models can also be imported from files or side-loaded; see MODELS.md.
- Update check: once a day, when you open the app, Veil asks GitHub
(
api.github.com/repos/oowais/veil/releases/latest) for the latest version. GitHub sees your IP address; nothing else is sent. Turn it off in Settings → Updates; "Check now" still works by hand. Updates are only downloaded and installed when you tap Update, and Android asks you to confirm. They are signed with a key only the maintainer holds.
Veil needs the accessibility service to read and cover the screen. It skips password fields, does nothing on the lock screen, and only looks at the screen when you trigger it.
Kotlin · Jetpack Compose (app screens) · ONNX Runtime (OCR, OPUS-MT) · bergamot-translator through
JNI (Firefox Translations) · llama.cpp through JNI (Hy-MT2). Needs JDK 21, the Android SDK and NDK
29.0.14206865.
git clone --recurse-submodules https://github.com/oowais/veil
./gradlew lint testDebugUnitTest assembleDebug # → app/build/outputs/apk/debug/app-debug.apkDebug and profile builds are "Veil dev" (com.owaisahmed.veil.dev), signed with a public debug key;
they install next to the release app and don't update themselves. Releases are built and signed by
CI (.github/workflows/ci.yml).
Apache-2.0 for Veil's own code. bergamot-translator (built into the app) and the Firefox
Translations model are MPL-2.0; their source is the third_party/bergamot-translator submodule.
Model licenses are listed in MODELS.md.
Screenshots were taken in the Android emulator with OPUS-MT. The sign in the photo-mode screenshot is Hinweisschild am Kirchberg by Kpaugustin (CC0).




