-
Notifications
You must be signed in to change notification settings - Fork 4
Updates & management
Installing an addon isn't the end of the story. Repositories publish new versions, get removed, or occasionally disappear out from under you. This page covers how WM Keyboard notices any of that, and exactly what an update or an uninstall does and doesn't touch.
An addon's version is compared to what the repository's manifest currently lists, using a lenient reading of semantic versioning: dot-separated numbers compared left to right, with anything missing read as zero. A version without a prerelease suffix (1.2.0) always beats the same version with one (1.2.0-rc1). The comparison forgives hand-written manifests, so 1.2, v1.2.3, and 2026.07 all parse. The bias is always toward caution. In the worst case an update isn't offered, never that you get talked into a downgrade.
There's no background check and no push notification for updates. Status is only ever recomputed when you're actually looking:
- Opening the Addons screen refreshes every added repository's manifest, once per visit, as long as Check when you open this screen is on (it is by default). Only on Wi-Fi under it, off by default, skips that check on a metered connection.
- Pulling the repository list down refreshes all repositories at once, on demand rather than waiting for your next visit. A single repository's overflow menu (⋮) has its own Refresh that fetches just that one. Both ignore the two settings above, because making the request is the point.
- Opening a repository's catalogue or an addon's detail page recomputes status against whatever manifest is already cached, with no network round trip. The one exception is a deep link into a repository you haven't added: there's nothing cached to read, so that page fetches the manifest to have anything to show.
If a manifest fetch fails, the previously cached copy is kept rather than cleared, so a repository that's briefly offline doesn't make its addons look uninstalled.
There's no separate "update" action. Installing an addon you already have is the update: it downloads the newer payload and points your install at it. The old version stays in place and working until the new one has finished downloading and been verified. Only then is it removed and the new one put in its place, so a failed or interrupted update leaves you on the working version rather than somewhere in between.
Because each install gets a freshly generated local ID, an update is really delete-old-then-install-new rather than a patch. If the addon you're updating was the one currently in use (your active theme, your selected icon pack, an enabled layout, and so on), the update re-applies it automatically under its new ID with no prompt, since you never asked to stop using it. If it wasn't already in use, updating doesn't prompt you to start using it either. That "installed, use it now?" prompt only ever appears the first time you install something new.
Checksums (sha256) are optional for every addon type but one. A plugin is executable code, so its manifest entry must carry a checksum or the install is refused outright. "Unverified" isn't a state code gets to be in the way a theme or a word list can.
Three different things can put an installed addon out of sync with what you last saw, and each is handled differently.
The manifest changes remotely. If a repository drops an addon, goes offline, or the publisher renames something, the addon's detail page falls back to one built entirely from what was saved at install time: name, type, version, author, description, repository. It says plainly that it can't read the repository now, so it can't check for updates. Uninstalling still works from this fallback page, and so does the button through to where the addon is used. Only the version comparison is unavailable. The repository's catalogue keeps drawing whatever manifest it last cached, and only says it can't be read when there's no cached copy to fall back on.
You remove the repository from your list. Installs survive. A theme you installed stays your theme whether or not its repository is still in your list, and only the update check goes away. The Addons screen's Installed section keeps listing everything you have, and tapping an entry still opens its detail page using the URL saved at install time, even after the repository entry itself is gone. If that URL is still reachable, update status keeps working too. If not, it degrades to the offline fallback page above.
You delete the installed thing from its own screen. Deleting a theme from the theme gallery, a font from the font picker, or a pack from the Icons screen doesn't go anywhere near the Addons screen, so nothing there would otherwise notice. Every time an Addons screen, repository catalogue, or addon detail page opens, it first sweeps every installed record and asks the subsystem that actually owns it whether the thing still exists:
- Theme, Layout: still in your custom themes or layouts
- Dictionary, Emoji keyword pack, Vocabulary pack: the file is still on disk
- Sticker pack, Icon pack, Font, Emoji font, Key sound, Sound pack, Plugin: still present in that content type's own store
- Snippets, Espanso: survives as long as any one of the pack's snippets still exists, so deleting one of five by hand doesn't drop the record for the other four
A record that fails this check is dropped, and the sweep always runs before status is recomputed, so a theme you deleted by hand from the gallery goes back to showing as available to install, rather than incorrectly claiming to still be installed.
Uninstalling is best-effort and different per type. The end state is always the same, though: gone, and no longer claiming to be installed, whether or not you'd already removed it by hand from somewhere else.
| Type | What's removed | Extra cleanup |
|---|---|---|
| Theme | Removed from your custom themes, falling back to the default theme if it was active | Background images copied into app storage when the theme was installed stay on disk. A housekeeping pass clears the ones nothing points at any more, once they have gone a day unreferenced |
| Layout | Removed from your custom layouts, turned off in your enabled layouts, and unset as the active layout if it was active | None |
| Dictionary, Emoji keyword pack | The word list or keyword file is deleted directly | The running keyboard is told to reload, so it stops using it right away |
| Vocabulary pack | The pack file and its translation sidecar files are deleted | Your review progress for its words is kept |
| Snippets, Espanso | Every snippet the pack installed is removed from your snippet list | If you'd already deleted one snippet from the pack by hand, only the remaining ones are removed now |
| Sticker pack | Removed from your sticker packs | None |
| Icon pack | Removed from your icon packs | Any per-icon override sourced from this pack is cleared, and the active icon pack falls back if this was it |
| Font | Removed from your installed fonts | Every slot that named it (the English face, the Bengali face, any per-script override) goes back to its automatic default |
| Emoji font | Removed from your installed fonts | Falls back to the system emoji font if this was selected |
| Key sound | Removed from your custom sounds | Falls back to the default click sound if this was selected, and the decoded copy is dropped from the live sound player |
| Sound pack | Removed from your sound packs | Falls back to the default click sound if this pack was selected, and its decoded samples are dropped from the live sound player |
| Plugin | The plugin's whole folder (script, stored data, and log) is deleted | None |
Advanced / Add-ons
The Addons screen holds the addon subsystem's own settings, and they live in its own files rather than in the main settings store, since a repository list and an installed-addons record are files rather than preferences. From here:
- Add repository adds a repository by URL, up to a limit of 30 in your list at once.
- Check when you open this screen (on by default) refreshes every repository's manifest each visit. Only on Wi-Fi under it (off by default) skips that check on a metered connection.
- Pulling the list down re-fetches every added repository's manifest, regardless of those two settings.
- Two repositories are added automatically the first time you open this screen: a sample one, and one carrying typing sounds. Removing either is permanent. It won't come back on a later visit.
Two related settings live elsewhere:
- Backup → Addon repositories (on by default) controls whether your list of repository URLs is included when you export your settings. It only carries the addresses. The addons you've actually installed travel inside whichever section owns that content instead: a custom theme in the Themes section, an icon pack in the Icon packs section, and so on. Restoring a backup elsewhere brings your repositories back, but never a separate "installed addons" list.
-
Tools › Plugins › Allow plugins (off by default) gates plugin addons specifically. See WM Keyboard plugins. It's the one addon type where this setting blocks the install itself rather than only using the thing afterward. A
.wmplugindownloaded while it's off is rejected, with a message pointing you to turn the setting on and try again.
Every addon type has a maximum payload size, enforced while it downloads. If the server sends more than the limit, the download is cut off and the install fails, rather than filling your storage with something the importer would refuse anyway.
| Limit | Types |
|---|---|
| 1 MB | Plugin |
| 4 MB | Layout, Snippets, Espanso, Key sound |
| 8 MB | Emoji keyword pack, Icon pack, Vocabulary pack |
| 16 MB | Theme, Sound pack |
| 32 MB | Dictionary, Font, Emoji font |
| 64 MB | Sticker pack |
Before any download starts, WM Keyboard also checks that your device has enough free space: the addon's published size plus a 32 MB margin. If there isn't enough room, the install fails immediately with a message telling you so, rather than downloading partway and running out.
- Previews don't require installing. Nine addon types can be previewed straight from the catalogue before you commit to installing: snippets, Espanso packs, dictionaries, emoji keyword packs, key sounds, sound packs, sticker packs, plugins, and vocabulary packs. A plugin's preview exists for a different reason than the rest. It isn't there to help you judge the content. It's there so you can read what the thing is allowed to do before its code runs anywhere near your keyboard.
- Count caps are shared with locally-added content, not addon-specific. The ceiling on how many fonts, icon packs, sticker packs, sounds, or plugins you can have applies to everything you've added, whether it came from an addon repository or was imported by hand. A plugin additionally has its own small cap on how much it can persist through its own storage, separate from the size of the plugin file itself.
- Repository files carry no executable code, with one exception. Everything a repository publishes is read as data: a theme's colors, a dictionary's words, a sticker's image. The exception is a plugin, which is a script the plugin sandbox runs. Installing a non-plugin addon never runs anything.
- A killed download can resume. The transfer asks the server for a byte range, so a partial file left behind when the app was killed mid-download is continued rather than refetched. It's the same range-request-and-partial-file approach the on-device AI model downloads use elsewhere in the app. An attempt that ends inside the app (finished, failed, or cancelled) deletes its partial file on the way out, so retrying after an error starts over. Downloadable wordlists never resume at all: a dictionary download restarts from the top, since it's a capped stream that's deliberately cut off early and can't be resumed midway.
See What are addons? for the full list of addon types and the trust model behind them, and Installing addons for adding a repository and installing something for the first time.
- Home
- Getting started
- Typing
- Languages
- Suggestions & correction
- Emoji & expression
-
Tools
- Clipboard manager
- Voice typing
- Offline voice (Whisper)
- Handwriting
- Scanner (OCR, QR, documents)
- Camera tool
- Translate
- Search, Wikipedia & dictionary
- Media controls
- AI chat
- AI tools
- Utility tools
- Snippets & text expansion
- Text editing & cursor tools
- Instruments
- Trackpad
- Calendar
- App launcher
- Learn from text
- Vocabulary
- Resize the keyboard
- The toolbar
- Themes & appearance
- Addons
- Plugins
- Privacy & security
- Accessibility
-
Reference
- Gesture cheat sheet
- Typing
- Hardware shortcuts
- Deep links & launcher shortcuts
- Key press
- File formats
- Dictionaries & words
- Importing from other keyboards
- Languages
- Importing from Espanso
- Appearance
- Keyboard themes
- Troubleshooting
- Glossary
- Keyboard font
- Easter eggs
- Icons
- Layout & size
- Key layouts
- Rows & bars
- Keyboard modes
- Emoji
- Phone number formats
- Tools
- Addons & plugins
- Reference - Accessibility
- Fingerprint lock
- Reference - Data saver
- Reference - Permissions
- Privacy
- Reference - Selection actions
- Servers
- Reference - Backup & restore
- About & diagnostics
- Statistics
- Settings A–Z
- Development