Skip to content
oowaisPublic

About

Offline screen translator for Android: swipe from a corner and German text is replaced in place by English. On-device OCR and translation, photo mode. No account, no cloud, no Google services.

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

Veil icon

Veil

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.

Latest release Android 11+, arm64 Apache-2.0


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.

A German web page (bonn.de) in Chrome The same page with Veil: English boxes over the blurred German, toolbar in the middle Photo mode: a German sign with the English drawn in
Any German page
Here bonn.de in Chrome
One swipe later
English in place, even text in the photo
Photo mode
Signs, letters, menus
Home: setup checklist, all done, and the swipe mode History: translations with the German, app and time
Set up in four steps
Home shows what's left
History
Copy or delete, or turn saving off

1 Swipe, 2 read the screen, 3 translate on the phone, 4 English in place

Status: early (0.x). Built and used on a Pixel 9. Other phones should work but are less tested; please report what you see.

Features

  • 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://translate from 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.

Get it

Requires Android 11+ on a 64-bit ARM phone (almost every phone from the last years).

  1. Download veil.apk and install it (allow "install unknown apps" for your browser or file manager). Later versions install from inside the app: Settings → Updates.
  2. 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.
  3. 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.

How it works

  1. 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://translate go through the same path.
  2. 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.
  3. Pick. A quick check keeps only German text, so English and numbers stay as they are.
  4. 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.
  5. 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/.

Privacy

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.

Build from source

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.apk

Debug 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).

License

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).

About

Offline screen translator for Android: swipe from a corner and German text is replaced in place by English. On-device OCR and translation, photo mode. No account, no cloud, no Google services.

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages