Skip to content
WM KeyboardWM Keyboard
Accessibility

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.

Screenshot pending
A repository's catalogue, with an Update chip on a card that has a newer version available.

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.

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.

Screenshot pending
An addon's detail page: Update, Uninstall, and a button to jump to where it's used.

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

TypeWhat’s removedExtra cleanup
ThemeRemoved from your custom themes; falls back to the default theme if it was activeBackground images copied into app storage when the theme was installed are not deleted (a harmless leftover file)
LayoutRemoved from your custom layouts; turned off in your enabled layouts, and unset as the active layout if it was active
Dictionary, Emoji keyword packThe word list or keyword file is deleted directlyThe running keyboard is told to reload, so it stops using it right away
SnippetsEvery snippet the pack installed is removed from your snippet listIf you’d already deleted one snippet from the pack by hand, only the remaining ones are removed now
Sticker packRemoved from your sticker packs
Icon packRemoved from your icon packsAny per-icon override sourced from this pack is cleared, and the active icon pack falls back if this was it
FontRemoved from your installed fonts
Emoji fontRemoved from your installed fontsFalls back to the system emoji font if this was selected
Key soundRemoved from your custom soundsFalls back to the default click sound if this was selected, and the decoded copy is dropped from the live sound player
PluginThe plugin’s whole folder (script, stored data, and log) is deleted
WM KeyboardAddons

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

LimitTypes
1 MBPlugin
4 MBTheme, Layout, Snippets, Key sound
8 MBEmoji keyword pack, Icon pack
32 MBDictionary, Font, Emoji font
64 MBSticker 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. 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.