wmkeyboard

Introduction: A modern, privacy-first Android keyboard: offline intelligence, 350+ languages, themes, tools and an addon ecosystem.
More: Author   ReportBugs   OfficialWebsite   
Tags:
WM Keyboard. Type anything. Share nothing.

Private. Offline. Yours.

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

Latest release F-Droid Downloads CI Docs MIT license

Install · Tour · Languages · Privacy · Editions · 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

A keyboard that does so much more: feature chips around the keyboard Type it how it sounds: ami valo achi becomes আমি ভালো আছি Everything here runs on your phone: voice typing and AI in airplane mode Rewrite, translate, fix, right on your phone: the AI panel with on-device models A clipboard with superpowers: history, pins, one-time codes Stop switching apps: calculator, dictionary and the toolbox Make it unmistakably yours: emoji search and themes It does that, too: a wall of feature chips

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
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, n-gram context ranking, and on-device learning of your words, bigrams and trigrams. One tap clears all of it.
  • Autocorrect you can argue with. Corrections are gated by a likelihood ratio rather than a blunt threshold, an undo chip appears after each one, and a word you fix by hand is learned.
  • Glide typing in any language with a word list, no proprietary library. English and Bangla ship with lists built in. Downloads cover 330+ more.
  • Gestures everywhere. Spacebar as a trackpad, swipe backspace to delete words, swipe space to switch language, drag a modifier for chords, peek a layer by dragging off shift, and much more!
  • Modes. One-handed, split, floating, and per-app modes that swap the whole keyboard, toolbar included, when a particular app opens.
  • Field awareness. Enter, the number row, suggestions and learning all adapt to the field: passwords, code editors, terminals, URL bars, one-time-code fields.
  • Hardware keyboards get a hotkey layer, hint overlays and tool shortcuts.

Typing basics · Glide · Gestures · Modes · Autocorrect

Languages

  • 845 languages, 1,500+ layouts from one data-driven registry: native scripts, InScript variants, romanised entries, CJK, minority Cyrillic alphabets, and a dozen constructed ones. A fresh install starts in whatever your phone is already set to.
  • Bangla, done properly. Avro phonetic, Probhat with aspirates on shift, Jatiya, Khipro, conjunct-aware backspace, and Bangla-English mixing in one field.
  • 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 T9 keypad for languages that had one.

Languages overview · Bengali · CJK · Custom layouts

Emoji, GIFs and stickers

  • Semantic emoji search in 126 languages. party finds 🎉 🥳 🍾 🎂, and so does the word for party in other languages.
  • Emoji 17.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. WhatsApp and Signal packs import directly.
  • GIF search when you want it, off when you don't.

Emoji picker · Stickers

The toolbox

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

Themes

  • A full theme editor: palettes, fonts per script, key shapes, textures, decals, particles, photo backgrounds, per-key styles, with a live preview while you edit.
  • Material You, AMOLED, and 29 built-in themes across 11 families, including Dracula, Nord, Solarized, Catppuccin and Tokyo Night.
  • Icon packs, sound packs, and themes that export as files you can share.

Themes · The editor

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. Incognito mode does the same on demand, and follows private browsing automatically.
  • Every tool that touches the network says so on its own settings page and stays off until you open it. A network activity log shows every request the keyboard has made.
  • Backups can be encrypted with a passphrase and written wherever you point them.
  • The one exception worth naming: handwriting and the scanners in the Full edition are built on Google's ML Kit, which reports its own diagnostics to Google. The Lite edition carries no Google library at all, and a build flag can remove the internet permission entirely.

Privacy at a glance · Network policy · Your data on device

Extend it

  • Addon repositories serve 14 kinds of addon: themes, layouts, dictionaries, icon packs, sound packs, sticker packs and more. Host your own with a static JSON file.
  • Lua plugins run sandboxed inside the keyboard and can add whole new tools, with a permission model and an in-app IDE.
  • Automation intents let Tasker and friends switch layouts, modes and languages.

Addons · Plugins · Repository format

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

Editions

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.

Full vs Lite

Install

Get it on F-Droid Get the APK from GitHub Get it on Obtainium

  • F-Droid carries the Lite edition, built from source and checked byte-for-byte against the -fdroid.apk on the matching GitHub release.
  • GitHub releases carry both editions, each in English-only and all-languages builds, for 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.
  • Obtainium tracks the GitHub releases and updates you automatically. The release APKs also carry their own update check, which asks GitHub and shows a card on the Home screen.
  • Google Play is coming.

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

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.
Full or Lite?
Lite if you are short on storage or do not need handwriting, scanning, grammar check, offline Whisper or the local LLM. Full for everything. They share a package name and 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

Build it yourself

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.

Project layout

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

Contributing

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:

  • A word list for a language that has none, or a better one for a language that does.
  • Emoji keywords in your language.
  • A theme, a layout you miss from another keyboard, an icon pack.

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.

Contributing guide

Credits

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.

  • Harper for offline grammar checking, bridged from Rust.
  • whisper.cpp and whisper-android for offline dictation.
  • Google ML Kit and LiteRT for handwriting, scanning, on-device translation and the local LLM runtime, in the Full edition.
  • Tesseract and Leptonica for OCR beyond the languages ML Kit covers.
  • Gemoji, KEmoji and Unicode CLDR for emoji names and keywords. Noto for fonts and animated emoji.
  • Keyman for the keyboard import format, and Khipro for the Bangla layout of the same name.
  • LuaJ for the plugin sandbox. Bouncy Castle for backup encryption.
  • Dracula, Nord, Solarized, Catppuccin and Tokyo Night for the palettes behind five built-in themes.
  • The word-frequency lists, offensive-word lists and jyutping tables listed in wordlist-sources.txt, redistributed under their own licences.

How this was made

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.

License

MIT. See LICENSE.

Apps
About Me
GitHub: Trinea
Facebook: Dev Tools
AI Daily Digest