Skip to content

Repository files navigation

Wortpaar logo

Wortpaar

An offline German–English dictionary for Android and the web.

It works entirely on your device, so you can look up words anywhere — on the train, on a plane, or with no signal at all. There are no accounts, no ads, and nothing you type is ever sent to a server.

Why I created it

Every translator app I tried had at least one problem: it either needed an Internet connection or did not behave the way I wanted. I wanted something simple that I could open anywhere, type a German or English word, and get a useful result immediately—without an account, a subscription, tracking, or a server request.

So I built Wortpaar. It is closer to a traditional bilingual dictionary than an AI translation service: it is designed for looking up words and short expressions, not for translating whole documents.

A note about vibe coding

Important

Wortpaar was vibe-coded—deliberately.

I developed it iteratively with AI assistance by describing the behavior I wanted, trying the result, identifying what felt wrong, and refining it until it became the app I wanted to use.

The goal was practical: I wanted an app, not another long-running software project. The repository therefore favors a focused feature set and straightforward implementation over an elaborate architecture. It has automated tests, strict TypeScript checking, and repeatable web and Android builds, but it has not had the breadth of review or device testing of a mature commercial application.

Features

  • Works offline – look up words anywhere, with no Internet connection
  • Both directions – type a German or an English word and get the translation
  • Fast as you type – results and suggestions appear instantly
  • Favorites and history – save words to revisit and see your recent searches
  • Private – no account, no ads, no tracking; nothing you search leaves your device

Screenshots

Wortpaar start screen showing offline readiness and recent searches    Wortpaar showing German results for an English search

Privacy and offline behavior

Android

The Android app contains a prebuilt SQLite dictionary. Searches never leave the device, and the app cannot connect to the Internet because it does not declare Android's INTERNET permission. The dictionary is updated only when a new app version is installed.

The app declares vibration access for brief interaction feedback. AndroidX also adds a private signature-level permission for its own internal receiver; this does not expose user data or produce a permission prompt.

Web app

The web version downloads the dictionary from the same website on first use, imports it into IndexedDB, and performs later searches locally. A service worker caches the application shell so it can be reopened offline.

No search query is sent to a translation service. As with any website, the hosting provider may still receive ordinary request metadata when the site and initial dictionary file are downloaded.

Limitations and trade-offs

  • Wortpaar is a dictionary, not a sentence-level machine translator. It does not understand arbitrary prose or context like an online translation model.
  • It currently supports only German and English.
  • Results depend on the coverage and quality of the bundled third-party dictionary data.
  • There is no pronunciation audio, camera translation, OCR, speech input, or automatic language detection.
  • Favorites and recent searches are local to one installation and are not synchronized or backed up by Wortpaar.
  • The web version requires a relatively large initial dictionary download (about 45 MB). Clearing browser storage removes the installed web dictionary and local history.
  • The Android APK is comparatively large (about 60 MB) because it includes the indexed dictionary and native SQLite libraries.
  • The Android app cannot fetch corrections or dictionary updates in the background; updates must arrive in a new APK.
  • Testing currently covers the core parsing, indexing, ranking, and SQLite behavior, but the app has limited testing across the full range of Android devices, browsers, accessibility tools, and unusual dictionary entries.

Installation

Android users

If a signed APK is available in the repository's Releases section:

  1. Download the newest APK to the Android device.
  2. Open the downloaded file.
  3. If Android asks, allow that browser or file manager to install apps from unknown sources.
  4. Confirm the installation, then disable that temporary installation permission again if desired.

Android may warn that the APK did not come from an app store. Only install an APK from a release you trust. If no signed release APK is available, build the app from source instead.

Web/PWA users

If a hosted version is available:

  1. Open it once while connected to the Internet.
  2. Wait until the dictionary reports Offline · ready.
  3. Use the browser's Install app or Add to Home Screen action.
  4. Reopen it later without a connection.

The first installation needs Internet access because the browser must download the site and dictionary. Android does not have this requirement because its dictionary is packaged inside the APK.

Build from source

The rest of this README is for people who want to build or modify the app themselves. If you just want to use Wortpaar, the sections above are all you need.

Requirements

  • Node.js ^20.19.0 or >=22.12.0
  • npm
  • Python 3 for generating the Android SQLite dictionary
  • JDK 21 and Android SDK 35 for Android builds

Install dependencies and verify the project:

npm ci
npm run check

Run locally

npm run dev

Build the web app

npm run build
npm run preview

The production site is written to dist/. Deploy that directory to an HTTPS static host to make the app installable as a PWA.

Build the Android app

Generate the database, build the native web bundle, and synchronize Capacitor:

npm run android:sync
cd android
./gradlew assembleDebug

The debug APK is written to android/app/build/outputs/apk/debug/app-debug.apk. It is suitable for local testing, not public distribution. A public GitHub release should contain a maintainer-signed release APK. Android Studio can be opened with:

npm run android:open

HTTPS testing on a phone

PWA installation and service-worker testing require HTTPS. Install mkcert, then generate a local certificate containing the development computer's LAN address:

npm run cert:local -- 192.168.1.42
npm run build
npm run preview:https

Replace the example address with the actual LAN address. The generated certificates remain in the ignored .certs/ directory. The phone must trust the local mkcert root certificate during the test; remove that trust when it is no longer required.

Dictionary updates

The canonical input is data/de-en.txt.

  • Web: change DICTIONARY_VERSION in src/dictionary/importer.ts when the generated dictionary changes.
  • Android: change offline_dictionary_v1 consistently in scripts/build-android-dictionary.py and src/dictionary/sqliteDictionary.ts when a new database should replace the installed one.

Generated dictionaries, copied web assets, build output, local SDK paths, signing keys, and release packages are excluded from version control.

Project structure

src/components/       Vue interface components
src/dictionary/       Parsing, ranking, and storage-independent search logic
src/history/          Local favorites and recent-search persistence
src/storage/          IndexedDB implementation for the web app
src/workers/          Streaming web dictionary importer
scripts/              Web and Android dictionary build tools
android/              Capacitor Android project
data/de-en.txt         Canonical third-party dictionary source

Licensing

Wortpaar's application source code is licensed under the GNU General Public License, version 3. Copyright © 2026 the Wortpaar authors. See the LICENSE file for the full text. In short: you may use, study, share, and modify the app freely, as long as any version you pass on stays under the same license and keeps its source code available.

The bundled dictionary data is a separate work, kept under its own terms: it is copyright © Frank Richter and licensed under the GNU General Public License, version 2 or later. See THIRD_PARTY_NOTICES.md and the header of data/de-en.txt for details.

About

Privacy-first offline German–English dictionary for Android and the web, with fast local search, favorites, and history.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages