A modern, privacy-first Android keyboard: offline intelligence, 350+ languages, themes, tools and an addon ecosystem.
See the codeAn open source multilingual Android keyboard with prediction, glide typing, transliteration, emoji search and a 75+ tool toolbox that all run on the phone and never phone home.
Install · Tour · Languages · Privacy · Editions · FAQ · Build · Read the docs
https://github.com/user-attachments/assets/3bd063a9-6701-4ccd-82ef-edd40a42b8e0
A keyboard is the one app that sees everything you write. Your messages, your passwords, your half-typed thoughts you deleted before sending. Somewhere along the way the popular keyboards decided that was a business model. The prediction got better, and the price for that was a copy of your keystrokes getting sent to somebody else's server.
The keyboards that refused that deal were mostly forks of the same decade-old Android code. Good bones, honest intentions, but no glide typing without a proprietary blob, no real toolbox, and nothing for the language I actually type in. Bangla was an afterthought everywhere: either a phonetic engine bolted on with no prediction, or a layout with no smart features behind it.
So I wanted a keyboard that did three things at once. Type Bangla the way Avro taught a whole country to type it. Carry the features I reach for all day, clipboard, snippets, translate, calculator, scanner, without leaving the text field. And keep all of that on the phone, where it belongs. This is that keyboard. It is written from scratch in Kotlin and Jetpack Compose, keyboard surface included, and the whole intelligence layer runs offline.
![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
Type a word the way it sounds in Latin letters, and the keyboard finds the word you meant. Every one of these runs on the device, with no network and no delay.
| You type | You get | Engine |
|---|---|---|
ami valo achi | আমি ভালো আছি | Avro-compatible Bangla phonetic, with a lenient index: asi, achi and achhi all reach আছি |
namaste | नमस्ते | Hindi phonetic with a map of how people actually romanise Hindi |
nihao | 你好 | Pinyin, including a T9 nine-key variant |
konnichiwa | こんにちは | Romaji to kana with conversion candidates |
xin chaof | xin chào | Vietnamese Telex |
The same prediction engine sits behind every one of them, so glide typing, autocorrect and next-word suggestions work in Bangla exactly as they do in English.
The features the keyboard has
Typing basics · Glide · Gestures · Modes · Autocorrect
Languages overview · Bengali · CJK · Custom layouts
party finds 🎉 🥳 🍾 🎂, and so does the word
for party in other languages.77 tools sit one tap behind the toolbar, and you drag the ones you use onto it. Most of them work in airplane mode.
| Text | Clipboard with history, pins, search and screenshot capture. Snippets with {date} and {clip} variables. Text expansion. Undo and redo. Selection mode. A trackpad. Fancy text. |
| Numbers | A calculator in the suggestion strip. Unit and currency conversion. Calendars. |
| Words | Dictionary and Wikipedia lookup. Translate, on device in the Full edition. Grammar check with Harper, fully offline. Vocabulary practice. |
| Camera | Text scan (OCR, ML Kit or Tesseract for 100+ languages). QR and barcode. Document scanner. |
| Phone | Media controls. An app launcher. KDE Connect. Flashlight. One-time codes caught from notifications. |
| Voice | Android's recogniser with a continuous mode, or offline Whisper with a catalog of 29 models. |
| Writing | AI rewrite, summarise, translate and fix. On-device with a local model, or bring your own key for any provider that speaks the OpenAI shape. Nothing is enabled behind your back. |
The toolbar · Clipboard · Whisper · AI tools
The typing engine has no network code in it. Prediction, autocorrect, glide, layouts and learning behave identically with the radio off.
Privacy at a glance · Network policy · Your data on device
Addons · Plugins · Repository format
FEATURES.md tracks the surface across 12 areas, three levels deep.
| Area | Families | Features | Capabilities |
|---|---|---|---|
| Typing core: prediction, autocorrect, learning, spell check | 9 | 50 | 205 |
| Input behaviour: glide, gestures, cursor, editing, keys | 11 | 80 | 219 |
| Languages, scripts, layouts, transliteration | 11 | 64 | 213 |
| Themes and appearance | 14 | 73 | 183 |
| Emoji, GIFs, stickers, kaomoji | 16 | 88 | 94 |
| Toolbar and the tool set | 10 | 85 | 311 |
| Clipboard, snippets, text expansion | 7 | 37 | 191 |
| AI, voice, handwriting, scanning | 11 | 70 | 162 |
| Privacy, backup, storage, statistics | 14 | 69 | 173 |
| Accessibility, form factors, platform integration | 13 | 61 | 111 |
| Extensibility: addons, plugins, imports, formats | 5 | 35 | 164 |
| Modes, rows, field adaptation, runtime | 12 | 97 | 203 |
| Total | 133 | 807 | 2,229 |
Entries marked RARE there are things few or no mainstream keyboards ship. There are over 400.
One codebase, two APKs. Everything about typing, prediction, themes, languages and privacy is identical. What differs is which on-device machine learning ships in the box.
| Full | Lite | |
|---|---|---|
| Handwriting, text scan, QR and document scanner | ✓ | |
| Grammar check (Harper) | ✓ | |
| Offline Whisper dictation | ✓ | |
| On-device local LLM | ✓ | |
| Google libraries on the compile classpath | ML Kit, LiteRT | none |
APK, arm64-v8a, English UI | 85 MB | 12 MB |
APK, arm64-v8a, all 48 UI languages | 132 MB | 57 MB |
| On F-Droid | ✓ |
Sizes are from 0.5.12 and drift with dependencies. The UI-language choice only affects the words the settings app shows you. Every layout and dictionary is in both.
-fdroid.apk on the matching GitHub release.arm64-v8a, armeabi-v7a, x86_64 and a universal APK. Almost every phone made since 2017
wants arm64-v8a. A SHA256SUMS.txt sits next to them.Install the APK, open the app, follow the setup card. Android will warn you that a third-party keyboard can see what you type. It says that about every keyboard, Gboard included, because that is what a keyboard is. F-Droid and GitHub builds share a signing key from 0.5.10 on, so moving between them is an ordinary update.
Needs Android 7.0 or newer.
Installation · Setup · A two-minute tour
The docs have a longer FAQ and a troubleshooting page.
wmkeyboard.pages.dev is the full manual: pages with screenshots, a settings reference for every screen, and a "verify every claim in code" rule for the people who write it. The wiki mirrors the same pages for reading on GitHub.
The source lives in docs/ and runs on Astro Starlight. npm run dev in that folder
gives you a local preview.
You need a JDK 17 or newer to launch Gradle, and the Android SDK with compileSdk 36.1. Gradle
provisions its own toolchain through Foojay on the first build. Android Studio's bundled JBR works
well as JAVA_HOME.
./gradlew assembleFullIntlDebug # every feature, every UI language
./gradlew assembleLiteEnDebug # fewer tools, English UI, small
./gradlew unitTests # the whole suite, ~7,000+ tests
./gradlew staticAnalysis # detekt + Android Lint, 20+ minutes
The task name is the edition, then the UI-language build, then the build type. Two flags in
local.properties matter: the build channel (Play versus direct download), which decides
whether the ML models and LLM runtime ship inside the APK or download on demand, and a
no-internet switch that strips the permission entirely.
27 Gradle modules, layered bottom-up. Every dependency points downward, and the engines under
core/ keep android.* out of the files that do the real work, so they test on a plain JVM.
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)
├── translate/ On-demand ML Kit translator (Play channel only)
├── litert/ On-demand LiteRT interpreter: offline Whisper, sticker cutout
└── handwriting/ On-demand ML Kit ink recogniser
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
├── kdeconnect/ KDE Connect client
├── 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
├── keyman/ Keyman keyboard import
├── 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 bridge
docs/ The documentation site (Astro Starlight)
Building · Testing · Architecture
The easiest first contributions are testing out the app and submitting bug reports or feature requests, not code. You can also update the data which lives in a companion repository, wasi-master/wmkeyboard-data:
For code: commits follow Conventional Commits, type(scope): summary. Run unitTests and
staticAnalysis before you open a pull request, since CI runs only the first. Open an issue
first for anything larger than a fix so we can agree on the shape of it.
WM Keyboard stands on a lot of open work. The in-app About screen carries the full licence text
for each of these, and app/src/main/assets/licenses/ holds
the same files.
wordlist-sources.txt, redistributed under their own licences.This keyboard was developed entirely by me, with the assistance of Generative AI for certain planning tasks and more tedious aspects of the development process.
For most features, I write the code myself, occasionally using AI-assisted code completion within my editor. For more complex features, I use Claude Code with Anthropic’s frontier models to assist with planning and, where appropriate, generate boilerplate code. For particularly repetitive or time-consuming tasks, I may delegate the implementation to Claude Code in its entirety.
Regardless of how AI is used, I remain involved throughout the development process. I review everything it generates, make the necessary decisions and adjustments, and test the resulting implementation whenever possible. AI is an assistant in the workflow, not a replacement for my involvement or responsibility for the code.
If AI-assisted code is a boundary you are unwilling to cross, I completely respect that position. There are some quite good keyboards developed without AI assistance. However, I believe it is increasingly difficult to disregard AI as a valuable and increasingly integral part of modern software development workflows. Whether we welcome it or not, AI-assisted development is here to stay.
MIT. See LICENSE.
295 followers · starred Sep 2026
Kotlin
98.6%
A modern, privacy-first Android keyboard: offline intelligence, 350+ languages, themes, tools and an addon ecosystem.
See the codeAn open source multilingual Android keyboard with prediction, glide typing, transliteration, emoji search and a 75+ tool toolbox that all run on the phone and never phone home.
Install · Tour · Languages · Privacy · Editions · FAQ · Build · Read the docs
https://github.com/user-attachments/assets/3bd063a9-6701-4ccd-82ef-edd40a42b8e0
A keyboard is the one app that sees everything you write. Your messages, your passwords, your half-typed thoughts you deleted before sending. Somewhere along the way the popular keyboards decided that was a business model. The prediction got better, and the price for that was a copy of your keystrokes getting sent to somebody else's server.
The keyboards that refused that deal were mostly forks of the same decade-old Android code. Good bones, honest intentions, but no glide typing without a proprietary blob, no real toolbox, and nothing for the language I actually type in. Bangla was an afterthought everywhere: either a phonetic engine bolted on with no prediction, or a layout with no smart features behind it.
So I wanted a keyboard that did three things at once. Type Bangla the way Avro taught a whole country to type it. Carry the features I reach for all day, clipboard, snippets, translate, calculator, scanner, without leaving the text field. And keep all of that on the phone, where it belongs. This is that keyboard. It is written from scratch in Kotlin and Jetpack Compose, keyboard surface included, and the whole intelligence layer runs offline.
![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
Type a word the way it sounds in Latin letters, and the keyboard finds the word you meant. Every one of these runs on the device, with no network and no delay.
| You type | You get | Engine |
|---|---|---|
ami valo achi | আমি ভালো আছি | Avro-compatible Bangla phonetic, with a lenient index: asi, achi and achhi all reach আছি |
namaste | नमस्ते | Hindi phonetic with a map of how people actually romanise Hindi |
nihao | 你好 | Pinyin, including a T9 nine-key variant |
konnichiwa | こんにちは | Romaji to kana with conversion candidates |
xin chaof | xin chào | Vietnamese Telex |
The same prediction engine sits behind every one of them, so glide typing, autocorrect and next-word suggestions work in Bangla exactly as they do in English.
The features the keyboard has
Typing basics · Glide · Gestures · Modes · Autocorrect
Languages overview · Bengali · CJK · Custom layouts
party finds 🎉 🥳 🍾 🎂, and so does the word
for party in other languages.77 tools sit one tap behind the toolbar, and you drag the ones you use onto it. Most of them work in airplane mode.
| Text | Clipboard with history, pins, search and screenshot capture. Snippets with {date} and {clip} variables. Text expansion. Undo and redo. Selection mode. A trackpad. Fancy text. |
| Numbers | A calculator in the suggestion strip. Unit and currency conversion. Calendars. |
| Words | Dictionary and Wikipedia lookup. Translate, on device in the Full edition. Grammar check with Harper, fully offline. Vocabulary practice. |
| Camera | Text scan (OCR, ML Kit or Tesseract for 100+ languages). QR and barcode. Document scanner. |
| Phone | Media controls. An app launcher. KDE Connect. Flashlight. One-time codes caught from notifications. |
| Voice | Android's recogniser with a continuous mode, or offline Whisper with a catalog of 29 models. |
| Writing | AI rewrite, summarise, translate and fix. On-device with a local model, or bring your own key for any provider that speaks the OpenAI shape. Nothing is enabled behind your back. |
The toolbar · Clipboard · Whisper · AI tools
The typing engine has no network code in it. Prediction, autocorrect, glide, layouts and learning behave identically with the radio off.
Privacy at a glance · Network policy · Your data on device
Addons · Plugins · Repository format
FEATURES.md tracks the surface across 12 areas, three levels deep.
| Area | Families | Features | Capabilities |
|---|---|---|---|
| Typing core: prediction, autocorrect, learning, spell check | 9 | 50 | 205 |
| Input behaviour: glide, gestures, cursor, editing, keys | 11 | 80 | 219 |
| Languages, scripts, layouts, transliteration | 11 | 64 | 213 |
| Themes and appearance | 14 | 73 | 183 |
| Emoji, GIFs, stickers, kaomoji | 16 | 88 | 94 |
| Toolbar and the tool set | 10 | 85 | 311 |
| Clipboard, snippets, text expansion | 7 | 37 | 191 |
| AI, voice, handwriting, scanning | 11 | 70 | 162 |
| Privacy, backup, storage, statistics | 14 | 69 | 173 |
| Accessibility, form factors, platform integration | 13 | 61 | 111 |
| Extensibility: addons, plugins, imports, formats | 5 | 35 | 164 |
| Modes, rows, field adaptation, runtime | 12 | 97 | 203 |
| Total | 133 | 807 | 2,229 |
Entries marked RARE there are things few or no mainstream keyboards ship. There are over 400.
One codebase, two APKs. Everything about typing, prediction, themes, languages and privacy is identical. What differs is which on-device machine learning ships in the box.
| Full | Lite | |
|---|---|---|
| Handwriting, text scan, QR and document scanner | ✓ | |
| Grammar check (Harper) | ✓ | |
| Offline Whisper dictation | ✓ | |
| On-device local LLM | ✓ | |
| Google libraries on the compile classpath | ML Kit, LiteRT | none |
APK, arm64-v8a, English UI | 85 MB | 12 MB |
APK, arm64-v8a, all 48 UI languages | 132 MB | 57 MB |
| On F-Droid | ✓ |
Sizes are from 0.5.12 and drift with dependencies. The UI-language choice only affects the words the settings app shows you. Every layout and dictionary is in both.
-fdroid.apk on the matching GitHub release.arm64-v8a, armeabi-v7a, x86_64 and a universal APK. Almost every phone made since 2017
wants arm64-v8a. A SHA256SUMS.txt sits next to them.Install the APK, open the app, follow the setup card. Android will warn you that a third-party keyboard can see what you type. It says that about every keyboard, Gboard included, because that is what a keyboard is. F-Droid and GitHub builds share a signing key from 0.5.10 on, so moving between them is an ordinary update.
Needs Android 7.0 or newer.
Installation · Setup · A two-minute tour
The docs have a longer FAQ and a troubleshooting page.
wmkeyboard.pages.dev is the full manual: pages with screenshots, a settings reference for every screen, and a "verify every claim in code" rule for the people who write it. The wiki mirrors the same pages for reading on GitHub.
The source lives in docs/ and runs on Astro Starlight. npm run dev in that folder
gives you a local preview.
You need a JDK 17 or newer to launch Gradle, and the Android SDK with compileSdk 36.1. Gradle
provisions its own toolchain through Foojay on the first build. Android Studio's bundled JBR works
well as JAVA_HOME.
./gradlew assembleFullIntlDebug # every feature, every UI language
./gradlew assembleLiteEnDebug # fewer tools, English UI, small
./gradlew unitTests # the whole suite, ~7,000+ tests
./gradlew staticAnalysis # detekt + Android Lint, 20+ minutes
The task name is the edition, then the UI-language build, then the build type. Two flags in
local.properties matter: the build channel (Play versus direct download), which decides
whether the ML models and LLM runtime ship inside the APK or download on demand, and a
no-internet switch that strips the permission entirely.
27 Gradle modules, layered bottom-up. Every dependency points downward, and the engines under
core/ keep android.* out of the files that do the real work, so they test on a plain JVM.
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)
├── translate/ On-demand ML Kit translator (Play channel only)
├── litert/ On-demand LiteRT interpreter: offline Whisper, sticker cutout
└── handwriting/ On-demand ML Kit ink recogniser
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
├── kdeconnect/ KDE Connect client
├── 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
├── keyman/ Keyman keyboard import
├── 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 bridge
docs/ The documentation site (Astro Starlight)
Building · Testing · Architecture
The easiest first contributions are testing out the app and submitting bug reports or feature requests, not code. You can also update the data which lives in a companion repository, wasi-master/wmkeyboard-data:
For code: commits follow Conventional Commits, type(scope): summary. Run unitTests and
staticAnalysis before you open a pull request, since CI runs only the first. Open an issue
first for anything larger than a fix so we can agree on the shape of it.
WM Keyboard stands on a lot of open work. The in-app About screen carries the full licence text
for each of these, and app/src/main/assets/licenses/ holds
the same files.
wordlist-sources.txt, redistributed under their own licences.This keyboard was developed entirely by me, with the assistance of Generative AI for certain planning tasks and more tedious aspects of the development process.
For most features, I write the code myself, occasionally using AI-assisted code completion within my editor. For more complex features, I use Claude Code with Anthropic’s frontier models to assist with planning and, where appropriate, generate boilerplate code. For particularly repetitive or time-consuming tasks, I may delegate the implementation to Claude Code in its entirety.
Regardless of how AI is used, I remain involved throughout the development process. I review everything it generates, make the necessary decisions and adjustments, and test the resulting implementation whenever possible. AI is an assistant in the workflow, not a replacement for my involvement or responsibility for the code.
If AI-assisted code is a boundary you are unwilling to cross, I completely respect that position. There are some quite good keyboards developed without AI assistance. However, I believe it is increasingly difficult to disregard AI as a valuable and increasingly integral part of modern software development workflows. Whether we welcome it or not, AI-assisted development is here to stay.
MIT. See LICENSE.
295 followers · starred Sep 2026
Kotlin
98.6%