An Android keyboard that keeps its brain on the device.
843 languages, Avro-style Bangla phonetic typing, a toolbox that goes well past emoji, and a prediction stack that never phones home.
WM.Keyboard.-.Private.Offline.Android.Keyboard.Official.Trailer.mp4
Every keyboard I tried made me pick two out of three: types Bangla well, has the features I actually use, and doesn't ship my keystrokes to somebody's analytics pipeline. So I built one that does all three.
The whole intelligence layer runs on device. Dictionaries, transliteration, autocorrect, glide typing, emoji search, grammar checking and dictation are bundled, or downloaded once and then run locally. Network access exists only where it has to, like translation or GIF search. Each of those is a tool you open yourself.
It is written in Kotlin with Jetpack Compose, keyboard surface included. The code splits across 22 Gradle modules, which keeps the engines testable and free of Android dependencies.
| Languages | 843 languages and 1,274 layouts from a data-driven registry: native scripts, InScript variants, romanized entries, CJK, even constructed ones. A fresh install picks up whatever your phone is already set to. |
| Bangla, done right | Avro-compatible phonetic typing for the Bengali script, with a lenient index, so asi, achi and achhi all land on আছি. Probhat layout too, with aspirates on shift, plus conjunct-aware backspace. |
| Prediction | Trie-lattice beam decoder shared by tapping and glide, n-gram context ranking, likelihood-gated autocorrect, and on-device learning of your words, bigrams and trigrams. |
| Emoji and friends | Emoji 17.0 catalog with semantic search in 125 languages, per-person skin tones, kaomoji, GIFs, stickers, and long-press to send Google's animated emoji. |
| The toolbox | Clipboard with history and pinning, snippets, translate, calculator, unit and currency conversion, camera, OCR and QR scanning, media controls, an app launcher, text editing, and more. |
| Themes | A real theme editor: palettes, fonts, key shapes, textures, decals, particles, photo backgrounds, plus Material You and AMOLED. Themes export and import as files. |
| AI, voice, handwriting | Speech recognition with a continuous mode, offline Whisper dictation, ML Kit handwriting, Harper grammar checking through a Rust JNI bridge, and an optional local LLM. |
| Extensibility | Addon repositories serve 12 kinds of addon. Lua plugins run sandboxed. Layouts and themes import from other keyboards, including Florisboard and HeliBoard. |
The full inventory, if you want numbers
FEATURES.md tracks the surface across 12 areas:
| Area | Families | Features | Capabilities |
|---|---|---|---|
| Typing core: prediction, autocorrect, learning, spell check | 9 | 49 | 172 |
| Input behaviour: glide, gestures, cursor, editing, keys | 11 | 72 | 128 |
| Languages, scripts, layouts, transliteration | 11 | 59 | 186 |
| Themes and appearance | 14 | 73 | 179 |
| Emoji, GIFs, stickers, kaomoji | 16 | 88 | 93 |
| Toolbar and the tool set | 10 | 77 | 282 |
| Clipboard, snippets, text expansion | 7 | 36 | 179 |
| AI, voice, handwriting, scanning | 11 | 70 | 162 |
| Privacy, backup, storage, statistics | 12 | 54 | 136 |
| Accessibility, form factors, platform integration | 12 | 56 | 105 |
| Extensibility: addons, plugins, imports, formats | 5 | 35 | 164 |
| Modes, rows, field adaptation, runtime | 12 | 97 | 200 |
| Total | 130 | 766 | 1986 |
Entries marked RARE there are things few or no mainstream keyboards ship. There are over 400 of them.
- No analytics SDK, no crash reporting, no server of this project's to phone home to. (One exception: Google's ML Kit sits under handwriting and the scanners in the full edition, and it reports its own diagnostics to Google. The privacy policy spells that out.)
- Learned words, clipboard history and typing stats stay in app storage and can be wiped in one tap.
- Password and secure fields turn off learning, suggestions and clipboard capture on their own.
- Incognito mode does the same on demand.
- Network tools are opt-in per tool, and the offline build never links them at all.
- Backups are AES-GCM encrypted and written wherever you point them through the storage picker.
Signed APKs live on the releases page.
Each release carries eight of them: full and lite, each built for arm64-v8a,
armeabi-v7a, x86_64, and a universal APK that covers all three. Almost every phone made
since 2017 wants arm64-v8a. Check your download against the SHA256SUMS.txt in the same
release. Not on Google Play or F-Droid yet.
Install JDK 17 or newer to launch Gradle. Gradle then provisions its own JDK 21 toolchain
through Foojay on the first build. Install the Android SDK with compileSdk 36.1 available.
Android Studio's bundled JBR works well as JAVA_HOME.
./gradlew assembleFullDebug./gradlew testFullDebugUnitTest./gradlew staticAnalysisTwo flavors ship. full is everything. lite swaps the ML Kit and on-device model paths for
stubs, which matters on storage-constrained devices. The build channel (Play versus direct
download) is a flag in local.properties. It decides whether ML Kit models and the LLM runtime
ship inside the APK or download on demand.
Install the APK. Open the app and follow the setup card. Turn on WM Keyboard in system settings, then select it as your input method.
Modules are layered bottom-up. Every dependency points downward, and each module declares its
own in build.gradle.kts.
app/ Settings app, manifest, resources, bundled assets, most unit tests
feature/
├── ime/ WMKeyboardService and the Compose keyboard UI (the keyboard itself)
├── addons/ Addon install, reconcile, download
├── tools/ Network tool clients: AI, GIF and sticker, search, link preview
└── llm/ On-demand LiteRT-LM runtime (Play channel only)
core/
├── settings/ SettingsRepository (DataStore), KeyboardSettings, modes, power saving
├── intelligence/ Grammar (Harper JNI), local LLM, handwriting, spell checker service
├── feedback/ Key sounds and haptics
├── voice/ SpeechRecognizer plus offline Whisper dictation
├── plugins/ Lua plugin sandbox
├── addons/ Addon store and repository data layer
├── content/ Clipboard, snippets, fonts, media, stickers
├── tools/ Offline tool engines: calc, units, currency, symbols, calendars
├── icons/ Icon packs and the SVG parser
├── theme/ ThemeSpec, palettes, rendering
├── emoji/ Catalog loader, semantic search, usage tracking
├── prediction/ Trie, SuggestionEngine, UserLexicon, dictionaries, gestures
├── input/ Composers (CJK, cluster scripts) and the input pipeline
├── language/ Scripts, layouts, transliteration
├── common/ Utilities, direct boot, debug log, shared contracts
└── config/ Build flags and API keys
tools/dictc/ Host-side dictionary compiler, shares :core:prediction sources
native/ Rust sources for the Harper grammar engine
The full documentation site is at wmkeyboard.pages.dev. Its source
lives in docs/ and runs on Astro Starlight. Run npm run dev inside that folder for a
local preview.
| Architecture | How the pieces fit and why |
| Building | Toolchain, flavors, channels |
| Dictionaries | The .wmdict and .wmng binary formats |
| Plugin API | Writing a .wmplugin |
| Addon repos | Hosting themes, layouts, packs |
| Privacy | What touches the network and when |
The engines under core/ are plain Kotlin with no Android dependencies, so they are easy to
test and easy to extend. Dictionaries and the emoji catalog are plain text assets meant for hand
editing, and a new language mostly comes down to a word list and a layout definition.
Good places to start: a dictionary for a language that has none, emoji keywords in your language, a theme, or a layout you miss from another keyboard. Open an issue first for anything larger so we can agree on the shape of it.
MIT. See LICENSE.