Skip to content
WM KeyboardWM Keyboard
Accessibility

Installation

Install from F-Droid, download a release APK, or build from source, pick Full or Lite, and install it on your device.

Install it from F-Droid, or grab a signed APK from the releases page and install that like any other app. Building it yourself works too, and takes a few minutes if you already have the Android SDK. Google Play is coming.

Every release ships sixteen APKs on the GitHub releases page. There are three things to pick: the edition (Full or Lite), the languages the app’s own screens are written in (all of them or English only), and your CPU architecture. The release page puts the common answer first, so most people take the starred cell and stop reading.

  1. Open the latest release on GitHub.

  2. Pick your edition. Full carries every feature. Lite is much smaller. See Choosing an edition below.

  3. Pick your languages. all has the app’s own text in 48 languages besides English. en has English alone and is about 41 MB smaller. This is only about the words the app shows you, on its settings screens and its panels. What you can type is identical either way: every layout and every dictionary is in both. See Choosing a language build below.

  4. Pick your CPU architecture. Almost every phone made since 2017 is arm64-v8a. Older or budget devices are armeabi-v7a. Emulators and a few tablets are x86_64. The universal APK holds all three and works anywhere, at several times the download size.

  5. Download the APK to your device.

  6. Optional: verify the download against SHA256SUMS.txt from the same release. Run sha256sum <file> on a computer, or use a checksum app on the phone. Compare the result to the line for your file.

  7. Open the APK to install it.

The release page carries the real size of every file next to its link, so check there rather than here. As a rough guide on arm64-v8a, Full in English is around 67 MB and Lite in English around 12 MB, and the all-languages build of either adds about 41 MB on top.

That 41 MB does not shrink with the architecture you pick, because the translations are stored uncompressed and every APK carries them whole. It is why Lite has a language choice at all: without one, the edition built to be small would stop being small.

  1. Install a JDK 17 or newer, and the Android SDK. The dictionary-compiler build tool pins its own JDK 17 toolchain. Foojay provisions that toolchain for you if you do not already have one.

  2. Clone the repository. From the repository root, run one of these commands:

    Terminal window
    ./gradlew assembleFullIntlDebug # every feature, every language
    ./gradlew assembleFullEnDebug # every feature, English only
    ./gradlew assembleLiteIntlDebug # fewer tools, every language
    ./gradlew assembleLiteEnDebug # fewer tools, English only

    The task name is the edition, then the language build, then the build type. Intl is all 48 languages and En is English alone.

    For a release build, replace Debug with Release. A release build needs your own signing keystore. Without one the APK comes out unsigned, and Android refuses to install it. The debug builds above are signed with the local debug key and install fine on your own device.

  3. Find the APK under app/build/outputs/apk/fullIntl/debug/, or the directory matching whichever task you ran.

  4. Copy the APK to your device and install it.

The build produces one APK per CPU architecture only when wmkb.splitApks is on, which is how the release APKs above are made. With the flag off, a release build packs all three architectures into one APK, and a debug build carries arm64-v8a alone. See Building from source for the full set of build flags.

First launch after install, before the setup wizard starts.
First launch after install, before the setup wizard starts.
First launch after install, before the setup wizard starts.

Both editions are the same keyboard. Same layouts, same prediction, same themes, same tools. What differs is which on-device intelligence ships in the box:

Full edition onlyLite edition only
Handwriting, OCR text scan, QR/barcode scanner, document scannerIncludedNot included
Grammar check (Harper)IncludedNot included
Offline Whisper voice dictationIncludedNot included
On-device local LLMIncludedNot included

Lite leaves out the ML Kit and Harper native libraries those features need, so its APK is far smaller: 8.25 MB against 63.2 MB for Full on arm64-v8a. Exact numbers shift as dependencies update. Pick Lite if you’re short on storage, or if you don’t need handwriting, scanning, grammar checking, offline voice or the local LLM. It gets you everything else for a fraction of the download.

See Full vs Lite for the complete feature comparison and how to tell which edition you’re already running.

This choice is about the words the app shows you, not the ones you type.

all carries the app’s own text in 48 languages besides English: its settings screens, its panels, its button labels. It follows your phone’s language on its own, and you can give the app a language of its own under Settings, then Apps, then WM Keyboard, then Language, on Android 13 and up.

en carries English alone, and is about 41 MB smaller for it.

Every layout, every dictionary and every prediction model is in both. Switching your typing language to Bengali works exactly the same in the English build. If you read the app’s screens in English, en costs you nothing at all.

The translations are machine translations from Google Play, and nobody has read them line by line, so expect the occasional clumsy sentence. A string with no translation yet falls back to English. See Languages overview for the list and the caveats.

You can move between the two later. They share a signing key and a version, so installing one over the other is an ordinary update and no setting is lost.

Android blocks installs from outside the Play Store by default. The first time you open the APK, Android shows an “install unknown apps” prompt. Grant the permission to whichever app you opened the file with (Files, a browser download, and so on), then continue. This is standard Android behavior, not anything WM Keyboard adds.

Opening the app for the first time drops you straight into a short setup wizard rather than a home screen. See Enable the keyboard for what each step does. Once you finish the wizard, it won’t run again on later launches.

Installing a new build over an existing install (same package, same signing key) works like any Android app update. Your settings, themes, learned words, snippets and everything else stay exactly as they were, automatically.

F-Droid builds and the GitHub APKs share a key from 0.5.10 on, so you can move between them the same way. F-Droid still compiles its copy from source, and it publishes one only after checking it is identical to the -fdroid.apk on the same GitHub release.

The exception is an install from F-Droid of 0.5.9 or older. Those were signed with F-Droid’s own key, and Android will not update an app to a build signed with a different one, so F-Droid can’t update it to 0.5.10. To move over once: export a backup (see below), uninstall, install WM Keyboard from F-Droid again, and import the backup. Every update after that is ordinary.

Reinstalling from scratch or moving to a new phone is different. Nothing carries over on its own unless you set one of these up beforehand.

WM KeyboardDataBackup & restore

Export your configuration to a file, keep the file or move it to another device, then import it after reinstalling. You choose what each export includes. The defaults are:

Included by defaultOff by default
Settings, themes, snippets, custom word lists, addon repository list, emoji history, typing statisticsAPI keys inside settings, stickers, icons, learned dictionary, clipboard history

Import always shows a confirmation before it writes anything, so restoring isn’t something you discover after the fact.

WM KeyboardPrivacyAndroid backupBack up with Android

This separate toggle is off by default. It opts the keyboard into Android’s own backup and phone-to-phone transfer system, which is independent of the manual export above. Leave it off and Android carries no WM Keyboard data across a device switch on its own. Turn it on and Android’s platform-level backup includes this app the next time it runs.

  • Android 7.0 (API 24) or newer is the floor the app is built against. It targets Android 16 (API 36).
  • Supported CPU architectures: arm64-v8a, armeabi-v7a, and x86_64. Generic 32-bit x86 is not supported. Only the 64-bit x86_64 is.
  • Camera, microphone and sensor access are all optional. Every hardware-backed tool (camera scanner, voice dictation, compass) declares the hardware feature it needs as non-required in the manifest. Missing hardware disables that one tool instead of blocking the install.
  • The release APKs, and a build you make yourself with the default flags, both carry a GitHub-releases updater. It checks this project’s releases in the background and shows an “Update available” card on the Home screen. It downloads the APK itself and asks you to confirm before installing. Only a build made for the Play Store channel skips it, and that isn’t a channel you can install from yet.
  • Installing over a release APK works only if both were signed with the same key. A release APK replaces an earlier release APK cleanly. It will not install over a build you made yourself, and vice versa. Uninstall first, and export a backup before you do.
  • Build release APKs on more than one machine without sharing a signing keystore and they carry different signatures. Android then refuses to install one over the other. You have to uninstall first, which loses your data unless you exported a backup.
  • The Backup & restore export has a separate “include API keys” switch, off by default. It covers the translate, GIF, search and AI tool keys you may have entered. An export made with it on is worth treating like a password, because anyone holding the file gets those keys.
  • Some data is cheap to fetch again: downloaded (not custom) dictionaries, emoji keyword packs, Whisper and LLM model weights, and cached camera captures. Both the manual backup and Android’s own backup leave all of it out, because re-downloading beats restoring.