Skip to content
WM KeyboardWM Keyboard
Accessibility

Sticker generator

Describe a sticker and the phone draws it offline, or an image service you pick does: the engines, the phone's models, prompts in any language, the safety filter, and importing your own model.

The sticker generator draws stickers from a sentence you type. By default the model runs on the phone itself, so it works offline and the picture never goes anywhere until you send it. You can also have an image service draw them instead: two free ones that need no account, the big paid ones with your own key, or a Stable Diffusion server you run. You pick a result, the background comes off, the sticker editor opens on it, and from there it goes into one of your packs and out like any other sticker.

Open it from WM Keyboard  Tools  Stickers  Your stickers  Sticker packs  Create stickers, from Create from a prompt on a pack’s page, or from the keyboard: in the sticker panel’s My stickers, the sparkle chip beside the + chip opens it, saving into the pack the panel is showing.

Who draws is a provider list, Engines, at the bottom of the generator’s screen. Each row is one engine you switch on, order, and set up with a key or an address; tap a row for its own screen, where Test checks the key with a request that draws nothing and costs nothing (fal.ai has no such request, so it has no Test). A new install lists On this phone switched on, and Pollinations and AI Horde switched off: those two send your prompt away, so they wait until you turn them on.

With more than one engine on, chips above the prompt pick the one that draws, and the line under them says where the prompt goes. Set the list to One at a time under its List settings and a tap tries the engines in order instead, moving to the next when one fails or has no answer.

EngineKeyWhat it is
On this phonenoneThe models below, downloaded or imported. Nothing leaves the phone
PollinationsoptionalFree and needs no account. Without a key it uses Pollinations’ old host, which picks the model itself (Sana, today) and puts a small pollinations.ai mark in a corner. A key from enter.pollinations.ai moves it to the newer API, where the model field takes any model it lists
AI HordeoptionalFree Stable Diffusion on volunteers’ graphics cards. Anonymous use waits in a queue, and the status line shows your place in it; a free key from aihorde.net moves you up. Asked for 512 × 512
OpenAI Imagesyours, or the AI list’sGPT Image (gpt-image-1-mini when the model field is blank). Draws on a transparent background, so no background removal is needed. Paid per picture
Gemini Imagesyours, or the AI list’sGoogle’s Nano Banana models (gemini-2.5-flash-image when blank). One picture per request
Grok Imagineyours, or the AI list’sxAI’s grok-imagine-image-2.0
Stability AIyoursStable Image Core when blank; type ultra, or an SD 3.5 model such as sd3.5-large, to use those. A picture its filter blurs is held back
Black Forest Labs (FLUX)yoursFLUX from its makers, flux-2-klein-4b when blank; any of their endpoint names works, such as flux-2-pro
RecraftyoursIllustration, icon and vector-style models, the service’s own default when blank
ReplicateyoursAny text-to-image model there, as owner/name (or owner/name:version); FLUX Schnell when blank
fal.aiyoursAny image model’s fal id, fal-ai/flux/schnell when blank
Together AIyoursFLUX and other open models, FLUX.1 Schnell when blank
Hugging FaceyoursModels on Hugging Face’s own inference servers, Stable Diffusion 3 Medium when blank. The token needs the Inference Providers permission
Cloudflare Workers AIyours, with the account idFLUX.1 Schnell when blank, or another @cf/ image model. The account id goes in its own field
Automatic1111, Forge or SD.NextoptionalYour own web UI, started with --api. A key of user:password is its --api-auth. The model field switches the checkpoint for that one request
ComfyUIoptionalYour own ComfyUI. Queues a plain text-to-image workflow with the checkpoint you name, or the first one the server lists
OpenAI-compatible imagesoptionalAnything with OpenAI’s image API, such as LocalAI, DeepInfra or Nebius: the address up to the version, and a model name

OpenAI Images, Gemini Images and Grok Imagine borrow the key you gave the same service on the AI list when their own key field is empty, so one account works for both. Every engine but the phone can be added twice, for a second key or a second server, and works on every build, F-Droid’s included: each is a plain web request, with no company’s code in the app.

An online engine gets the prompt in English with the style’s words, and the seed, the size and how many pictures you asked for; nothing else about you. Its pictures come back to the app, are shrunk to at most 1024 pixels a side and shown with the phone’s, and are deleted when you leave the screen unless you save one. Each request appears under Sticker generator in Network activity. On a metered connection, Data saver’s Cloud AI row decides: at Ask each time the screen says so and a second press of Generate is the yes; at Turn off only the phone’s model draws.

With an online engine, Pictures per tap on Auto draws one, since each may be paid for. The negative prompt goes to the engines that read one; GPT Image, Gemini and Grok Imagine leave it out. Size, steps and guidance are the phone’s model’s settings and disappear while an online engine is picked.

Models on the phone, and what each phone gets

Section titled “Models on the phone, and what each phone gets”

Two models come with the app’s catalog. Neither is in the APK: the phone downloads the one you pick, after you accept its licence.

ModelDownloadHow it drawsRuns on
SDXS Dreamshaperabout 880 MB, plus the 87 MB picture filterone step, at 384 × 384 or 512 × 512every phone, on the processor
Stable Diffusion 1.5 (NPU)about 710 MB from Qualcomm, plus the picture filter20 steps with guidance, at 512 × 512Snapdragon 8 Gen 3, 8 Elite and 8 Elite Gen 5, on the neural processor

SDXS is the default everywhere. It was distilled to draw in a single step, and it draws clean, outlined cartoon subjects on a white background, which is what a sticker wants and what the background remover lifts cleanly. Measured on a computer and scaled to phones, one picture takes roughly:

Phone384 × 384512 × 512
Recent flagship (Snapdragon 8 Gen 3 or 8 Elite, Dimensity 9300, Tensor G4)under 1.5 secondsabout 1 to 2 seconds
Mid-range (Snapdragon 7 series, Dimensity 7000 series)about 2 to 2.5 secondsabout 4 seconds
Older or low-endabout 5 to 6 secondsabout 10 seconds

The first picture after the generator opens takes longer, because the model has to load. It then stays loaded for a few minutes, so the next prompts are fast. While loaded it takes one to two gigabytes of memory, in a process of its own: if Android needs that memory back it ends the generator, never the keyboard.

Stable Diffusion 1.5 (NPU) is Qualcomm’s own build of the original Stable Diffusion for each chip’s neural processor, about 2.5 seconds a picture on an 8 Elite by Qualcomm’s figures. It is offered only on the three chips above, and it uses the same Qualcomm runtime as running AI models on the NPU. It is not better at stickers than SDXS. Choose it for what SDXS can’t do: a negative prompt, a guidance strength and a step count. Its first picture also waits for the NPU runtime to download, if nothing has fetched it yet.

The model rows show what is downloaded. The bin deletes a model; WM Keyboard  About  Storage  Sticker generator lists them too.

Describe one subject: a red panda drinking coffee, a happy avocado giving a thumbs up. The style chips under the box add the look, so you don’t have to type it. Sticker (the default) asks for a die-cut cartoon with bold outlines on white; the others are Cartoon, Kawaii, Pixel art, 3D, Line art, Emoji, and No style for a prompt that already says how it should look.

Under the box, a counter shows how many of the model’s 75 tokens the prompt and its style take. The model reads no further than that. When a prompt runs past it, the words it won’t read are named in red, so you know to shorten it, rather than finding out from a picture that ignored them.

The models understand English. A prompt in another language is translated first, and the English is shown under the box, where you can correct it before the next tap. The on-device translators are asked first (Firefox Translations, NLLB-200, Google’s), so with a model for your language downloaded nothing leaves the phone. Only if none of them can translate it does the prompt go to the online translators on your translate list. A prompt in Latin letters counts as English unless Google’s language identifier, where the phone has it, is sure it isn’t.

With an AI provider set up, Improve with AI asks it to rewrite your idea as a short, visual prompt: one subject, what it looks like and does, its colours. The rewrite replaces what you typed, so you can edit it or press Generate as is. This sends your prompt to that provider. The on-device AI model is not offered here, being too slow for a quick rewrite.

Generate draws several pictures at once, each with its own seed, and each appears as soon as it is done. Flagships draw four, mid-range phones two, small phones one, and the NPU two; Pictures per tap under Advanced changes that. Cancel stops within a fraction of a second. With the NPU model, the pictures fade in as rough previews while the steps run.

Tap a finished picture, then Cut out and edit. The background remover lifts the subject off the white, and the editor opens with it, ready to crop, erase or add a border before you save it into a pack. The sticker goes into the pack you came from; opened from elsewhere, into the last pack you used, the first pack, or a new Generated pack when there is none. The generated pictures themselves are scratch and are deleted when you leave the screen; only the ones you save are kept.

  • Size: 384 × 384 is faster and plenty for a sticker; 512 × 512 is SDXS’s own size and holds more detail.
  • Seed: the number every picture starts from. Keep the seed draws the same picture again for the same prompt, which helps when you are adjusting the wording; off, every tap tries new ones.
  • Steps, Guidance and the Negative prompt (what to leave out) appear only for a model that uses them: the NPU model, or a model you imported. SDXS draws in one step without guidance, so it has none of them.
  • Remove the background: on by default. Off, the editor opens on the picture as drawn. A picture that came back with a transparent background (GPT Image draws them that way) skips it. The F-Droid build has no background remover, so there the editor’s eraser does the job.
  • Safety filter: see below.
  • Draw on the GPU: off by default, and listed only on a phone with a GPU the generator can use: an Adreno, or another GPU with Vulkan 1.2 (Mali, Xclipse, PowerVR). On, the on-device models (not the NPU model, which has its own) run on the graphics chip through OpenCL, or Vulkan where the phone has no OpenCL, at the same full precision as on the processor, so a seed draws nearly the same picture. The first picture after switching it on waits while the GPU compiles its code, which is kept for next time. Whether it is faster depends on the phone, so compare it with a generation on the processor. If the GPU cannot load a model, the processor draws it.

Every prompt is checked before anything is drawn, as typed and in its English translation, against a list of sexual terms, and a match is refused. With Safety filter on (the default), every picture then goes through an on-device classifier (Falconsai’s NSFW detector, 87 MB, downloaded with the first model), and one it judges unsafe is never shown: its place says it was held back. Both checks run on the phone. A word list can refuse a harmless prompt that happens to contain one of its words; rephrase it.

The prompt check applies to online engines too. Their pictures are not run through the phone’s classifier; instead Safety filter turns on the service’s own filter wherever it has a switch for one (Pollinations, AI Horde, fal.ai, Together AI, Replicate and FLUX’s strictness), and a picture a service refuses or blurs is held back the same way. Every paid service also applies its own rules whatever the switch says.

The models’ weights come with their own licences, which you accept before the download: SDXS is under the CreativeML Open RAIL++-M licence, Qualcomm’s Stable Diffusion 1.5 under the CreativeML Open RAIL-M licence and its NPU runtime under Qualcomm’s. Both RAIL licences forbid using the model for illegal, harmful or deceptive content, and those restrictions carry over to whatever you make with it. SDXS comes from the project’s data repository as an MNN conversion of IDKiro/sdxs-512-dreamshaper; Qualcomm’s build comes straight from Qualcomm and is never copied by this project. See WM Keyboard  About  Licenses.

Any Stable Diffusion 1.x or 2.x checkpoint can be imported once it has been converted on a computer; the phone never converts one itself. The converter is tools/imagegen/convert_sd.py in the source repository. With Python and a few packages:

Terminal window
pip install torch diffusers transformers safetensors onnx MNN
python tools/imagegen/convert_sd.py my_model.safetensors my_model --name "My model" --steps 20 --guidance 7 --taesd

The source can be a .safetensors or .ckpt file, a diffusers folder, or a Hugging Face model id. Use --steps 4 --scheduler lcm for an LCM model, --steps 1 --timesteps 999 --guidance 0 for a one-step model like SDXS or SD-Turbo, and --taesd to swap the model’s image decoder for the much cheaper TAESD, which looks the same at sticker size. --int8 halves the files at a small cost in faithfulness. The script calls MNN’s converter library directly rather than its mnnconvert command, which reports every conversion to Alibaba Cloud.

The output folder holds five files: text_encoder.mnn, unet.mnn, vae_decoder.mnn, merges.txt and wmimage.json. Copy them to the phone, zipped or not, then Import a model and pick the zip or all five files. The generator checks that each network loads and takes the inputs wmimage.json describes before it lists the model; a model that doesn’t fit is turned away with the reason. Imported models run on the processor, like SDXS. A 4-step LCM model at 512 × 512 takes several seconds a picture on a flagship and about 20 on a mid-range phone; an ordinary 20-step model with guidance makes 40 full-size passes, which on a phone’s processor means minutes a picture.

Stable Diffusion 1.5 (NPU) can be imported the same way, from the build Qualcomm AI Hub publishes for your chip: the zip it downloads, or its text_encoder.bin, unet.bin, vae.bin and metadata.json picked together, alongside merges.txt (the same CLIP tokenizer SDXS uses, from this project’s data repository). Qualcomm’s zip doesn’t carry it; when SDXS or another imported model is already on the phone, its copy is used and the zip imports on its own. It needs no wmimage.json — it runs on the schedule above — and it must be the build for your phone’s chip, or the neural processor turns it away when it loads. This is the only route to the NPU model on the offline build, which has no network to download it with. Its runtime still has to be installed first, under WM Keyboard  Storage  Downloads. While the generator’s engine library is missing, the Engine group says so and its Get the files lists the libraries to fetch and import, the NPU’s too when that model is picked. A model on the phone whose files can’t be read says so under Generate, instead of leaving the button off.

The checkpoint’s own licence still applies to an imported model.