wasi-master/wmkeyboard
A modern, privacy-first Android keyboard: offline intelligence, 600+ languages, themes, tools and an addon ecosystem.
About wasi-master/wmkeyboard
wasi-master/wmkeyboard is an open-source project on GitHub, mainly written in Kotlin. A modern, privacy-first Android keyboard: offline intelligence, 600+ languages, themes, tools and an addon ecosystem. It currently holds 893 stars and 53 forks with 36 open issues, and was last pushed on 2026-11-10 (repository created 2026-08-10).
Project Overview
Git Homed tracks it on the Today's Trending board, currently at rank #52 with 85 new stars today.
GitHub Repository Details
README
Private. Offline. Yours.
An open source multilingual Android keyboard with prediction, glide typing, transliteration, emoji search and an 89-tool toolbox that all run on the phone and never phone home.
Install · Tour · Languages · Privacy · Builds · FAQ · Build · Read the docs
https://github.com/user-attachments/assets/3bd063a9-6701-4ccd-82ef-edd40a42b8e0
Why I built this
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.
A few screenshots
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
It starts by understanding how you spell
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 |
| aap kaise ho | آپ کیسے ہو | Urdu phonetic, folding to the consonant skeleton the script itself spells with |
| vanakkam, nenu, 3arabi | Tamil, Telugu, Arabic script | Phonetic layouts for eleven more languages, Arabizi digits included |
| 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 tour
The features the keyboard has
Typing
- Prediction that learns, locally. A trie-lattice beam decoder shared by tapping and glide,
- Autocorrect you can argue with. Corrections are gated by a likelihood ratio rather than a
- Glide typing in any language with a word list, no proprietary library. English and Bangla
- Gestures everywhere. Spacebar as a trackpad, swipe backspace to delete words, swipe space
- Modes. One-handed, split, floating, and per-app modes that swap the whole keyboard, toolbar
- Spell checking with Harper built in, plus Hunspell dictionaries, GiellaLT spellers and
- Field awareness. Enter, the number row, suggestions and learning all adapt to the field:
- Hardware keyboards get a hotkey layer, hint overlays and tool shortcuts.
Languages
- 1,555 languages, 3,724 layouts from one data-driven registry: native scripts, InScript
- Bangla, done properly. Avro phonetic, Probhat with aspirates on shift, Jatiya, Khipro Classic and Dark,
- CJK input with composers for pinyin, jyutping, kana and hangul, plus Vietnamese Telex.
- Layouts you can edit, build from JSON, or import from FlorisBoard, HeliBoard, FUTO, and Keyman.
- Odd ones too: musical notation, braille chording, Morse, fancy-text alphabets, and a
Languages overview · Bengali · CJK · Custom layouts
Emoji, GIFs and stickers
- Semantic emoji search in 126 languages.
partyfinds 🎉 🥳 🍾 🎂, and so does the word
- Emoji 18.0, per-person skin tones, kaomoji, and long-press to send Google's animated emoji.
- Sticker packs you make from your own photos, with a background cutout that runs on device.
- GIF search when you want it, off when you don't.
The toolbox
89 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. Notes. |
| Numbers | A calculator in the suggestion strip. Unit and currency conversion. Calendars, with events you can add and edit. |
| Words | Dictionary, Wikipedia and Look up cards. Translate on device with ML Kit, Firefox Translations or NLLB-200. Grammar check with Harper, fully offline. Vocabulary practice. |
| Camera | Text scan with ML Kit, Tesseract for 100+ languages, or PaddleOCR. QR and barcode with ML Kit or zxing-cpp. Document scanner, Google's or the keyboard's own. |
| Phone | Media controls. An app launcher. KDE Connect. Smart home controls. Sending files. Flashlight. One-time codes caught from notifications. |
| Voice | Android's recogniser with a continuous mode, or offline engines: Whisper on whisper.cpp, Whistle, Asr4All, Parakeet, Moonshine, Sherpa and Omnilingual. A transcription server of your own works too. |
| Writing | AI rewrite, summarise, translate and fix. On-device with LiteRT-LM or GGUF models on llama.cpp, 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
Themes
- A full theme editor: palettes, fonts per script, key shapes, textures, decals, particles,
- Material You, AMOLED, and 32 built-in themes, among them frosted glass and ports of Dracula,
- Icon packs, sound packs, and themes that export as files you can share.
Privacy
The typing engine has no network code in it. Prediction, autocorrect, glide, layouts and learning behave identically with the radio off.
- No analytics SDK, no crash reporting, no account, and no server of mine for the app to reach.
- Learned words, clipboard history and typing stats live in app storage and wipe in one tap.
- Password and secure fields turn off learning, suggestions and clipboard capture on their own.
- Every tool that touches the network says so on its own settings page and stays off until you
- Backups can be encrypted with a passphrase and written wherever you point them.
- The one exception worth naming: in the standard build, handwriting and the scanners run on
Privacy at a glance · Network policy · Your data on device
Extend it
- Addon repositories serve 14 kinds of addon: themes, layouts, dictionaries, icon packs,
- Lua plugins run sandboxed inside the keyboard and can add whole new tools, with a
- Automation intents let Tasker and friends switch layouts, modes and languages.
The full inventory, if you want numbers
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 | 220 | | Languages, scripts, layouts, transliteration | 11 | 65 | 220 | | Themes and appearance | 14 | 73 | 183 | | Emoji, GIFs, stickers, kaomoji | 16 | 96 | 94 | | Toolbar and the tool set | 10 | 88 | 364 | | Clipboard, snippets, text expansion | 7 | 37 | 191 | | AI, voice, handwriting, scanning | 12 | 81 | 168 | | Privacy, backup, storage, statistics | 14 | 70 | 180 | | 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 | 134 | 830 | 2,288 |
Entries marked RARE there are things few or no mainstream keyboards ship. There are over 500.
Builds
One app, three builds. Everything about typing, prediction, themes, languages and privacy is identical. Up to 0.6.2 there were two editions, Full and Lite; from 0.6.3 there is no Lite, and the optional feature libraries download the first time a feature needs them instead.
| | Standard | F-Droid | Offline | |---|:---:|:---:|:---:| | Where | Google Play, GitHub | F-Droid | GitHub | | Handwriting | ML Kit, 126 languages | zinnia for Chinese and Japanese, PaddleOCR for nine other scripts | ML Kit, 126 languages | | Text scan | ML Kit, Tesseract, PaddleOCR | PaddleOCR | ML Kit, Tesseract, PaddleOCR | | QR and barcode | ML Kit or zxing-cpp | zxing-cpp | ML Kit or zxing-cpp | | Document scanner | Google's or the built-in one | built-in | Google's or the built-in one | | Grammar check (Harper) | ✓ | ✓ | ✓ | | Offline Whisper (whisper.cpp), Asr4All, Parakeet, Moonshine, Sherpa, Omnilingual | ✓ | ✓ | ✓ | | Whisper on LiteRT, Whistle | ✓ | | ✓ | | On-device AI | LiteRT-LM and GGUF | GGUF | LiteRT-LM and GGUF | | On-device translate | ML Kit, Firefox Translations, NLLB-200 | Firefox Translations, NLLB-200 | ML Kit, Firefox Translations, NLLB-200 | | Google libraries on the compile classpath | ML Kit, LiteRT | none | ML Kit, LiteRT | | Feature libraries | downloaded on first use | downloaded once you allow it | in the APK | | Internet permission | ✓ | ✓ | |
The UI-language choice only affects the words the settings app shows you. Every layout and dictionary is in every build.
Install
- Google Play carries the standard build. Play delivers the heavier on-device parts (the AI
- F-Droid carries its own build, without Google's libraries, built from source as one APK
-fdroid.apk on the
GitHub release.
- GitHub releases carry the standard build for
arm64-v8a,armeabi-v7a,x86_64and a
arm64-v8a and universal. Almost every phone made since 2017
wants arm64-v8a. GitHub lists each file's SHA-256 beside it.
- Obtainium tracks the GitHub releases and updates you automatically. The release APKs also
Install it, 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. Google Play signs its copy with its own key, so moving between Play and the other two takes a backup, an uninstall and a restore.
Needs Android 7.0 or newer.
Installation · Setup · A two-minute tour
FAQ
Is anything sent to the cloud?
Not by typing, ever. Prediction, autocorrect, glide and the dictionaries all run on the device, and there is no analytics SDK in the app. What needs the internet is a handful of tools that are online services by nature: weather, translate (unless you download the on-device languages), currency rates, Wikipedia, GIF search, web search, and any AI provider you set up with your own key. Each one makes a request only while you are using it. Link previews are the one opt-in background fetch, and it is off by default. Network policy lists every request, tool by tool.
Which build?
The standard one, from Play or GitHub, unless you want F-Droid's (no Google library at all, at the cost of handwriting outside Chinese and Japanese, ML Kit's readers in the scanners, and the LiteRT models for Whisper and on-device AI) or the offline one (no internet permission, everything inside a much larger APK). The GitHub and F-Droid builds share a signing key, so installing one over the other keeps all your data.
Why doesn't glide typing work in my language?
It has no word list installed yet. A swipe is decoded against the active language's dictionary. English and Bangla ship with one. Every other language downloads its list from the language's own settings page, and the suggestion strip offers the download the first time you need it.
Android says "install unknown apps" or Play Protect complains.
Standard behaviour for any APK from outside Google Play. Grant the install permission to whichever app you opened the file with. If you would rather not, F-Droid installs it for you.
Does it use much battery or memory?
Very little. Nothing runs in the background out of the box. The heaviest things it can hold are a Whisper model and a local LLM, and both are released the moment Android signals memory pressure. A dedicated power-saving mode trims per-keystroke work further and can follow Android's battery saver.
Where are my learned words, and how do I wipe them?
In a plain JSON file in the app's private storage. The Personal dictionary screen lets you delete them one at a time. Privacy → Your data → Learned words wipes all 13 learning files in one pass, and a running keyboard drops its in-memory copies the moment you close it.
I installed from F-Droid before 0.5.12 and it won't update.
Those builds were signed with F-Droid's own key, and Android will not update across keys. Export a backup, uninstall, reinstall from F-Droid, import the backup. Every update after that is ordinary.
The docs have a longer FAQ and a troubleshooting page.
Documentation
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.
| Start here | Go deeper | |---|---| | Install and set up | Architecture | | A two-minute tour | Building from source | | Languages and layouts | Dictionary formats | | The toolbar | Plugin API | | Privacy | Hosting an addon repository | | Settings reference | File formats |
The source lives in docs/ and runs on Astro Starlight. npm run dev in that folder
gives you a local preview.
Community
- Bugs and feature requests: [GitHub issues](http











