Updates & management
How installed addons check for updates, what happens when a repository changes, and what uninstalling actually cleans up.
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.
Checking for updates
Section titled “Checking for updates”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 is deliberately forgiving of hand-written manifests (1.2, v1.2.3, and 2026.07 all parse), and the bias is always toward caution: the worst case is that 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 over the network, once per visit.
- Tapping Refresh, the button next to Add repository on the Addons screen, refreshes all repositories at once; a single repository’s overflow menu (⋮) has its own Refresh that fetches just that one.
- Opening a repository’s catalogue or an addon’s detail page recomputes status against whatever manifest is already cached (no network round trip).
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.
Applying an update
Section titled “Applying an update”There’s no separate “update” action: installing an addon you already have is the update, downloading the newer payload and pointing 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 installed in its place. A failed or interrupted update leaves you on the working version, never 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.
When things change underneath you
Section titled “When things change underneath you”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 catalogue and detail pages fall back to a page built entirely from what was saved at install time: name, type, version, description, repository. It says plainly that there’s nothing to check for updates against without a manifest to compare to. Uninstalling still works from this fallback page; only the version comparison is unavailable.
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. 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 — the file is still on disk
- Sticker pack, Icon pack, Font, Emoji font, Key sound, Plugin — still present in that content type’s own store
- Snippets — survives as long as any one of the pack’s snippets still exists; 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
Section titled “Uninstalling”Uninstalling is best-effort and different per type: the point is always the same end state (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; falls back to the default theme if it was active | Background images copied into app storage when the theme was installed are not deleted (a harmless leftover file) |
| Layout | Removed from your custom layouts; turned off in your enabled layouts, and unset as the active layout if it was active | — |
| 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 |
| Snippets | 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 | — |
| 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 | — |
| 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 |
| Plugin | The plugin’s whole folder (script, stored data, and log) is deleted | — |
Options
Section titled “Options”The Addons screen itself holds the only addon-related settings: there’s nothing addon-specific in the main settings store, since a repository list and an installed-addons record are just files, not preferences. From here:
- Add repository adds a repository by URL, up to a limit of 30 in your list at once.
- Refresh re-fetches every added repository’s manifest.
- A sample repository is added automatically the first time you open this screen. Removing it 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), so restoring a backup elsewhere brings your repositories back but not 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, not just 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.
How big an addon can be
Section titled “How big an addon can be”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 | Theme, Layout, Snippets, Key sound |
| 8 MB | Emoji keyword pack, Icon 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.
Details and edge cases
Section titled “Details and edge cases”- Previews don’t require installing. Six addon types can be previewed straight from the catalogue before you commit to installing: snippets, dictionaries, emoji keyword packs, sounds, sticker packs, and plugins. A plugin’s preview exists for a different reason than the rest: not to judge the content, but to 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) except a plugin, which is a script the plugin sandbox runs. Installing a non-plugin addon never runs anything.
- Downloads resume. If an update or install is interrupted partway through, retrying continues from where it left off instead of starting over: the same range-request-and-partial-file approach the on-device AI model downloads use elsewhere in the app. Downloadable wordlists are the exception: a dictionary download restarts from the top instead, 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.
