pack sticker images into .wastickers nun for WhatsApp
easily recover stickers when moving phones into installable packs
pip install wastickers-packer
wastickers-packer path/to/stickers -o ./packs
Transfer the .wastickers to your phone, open it with Sticker Maker Studio (iOS) or WAStickerApps (Android), and tap Add to WhatsApp.
Features
- One command converts a folder of images into WhatsApp-ready sticker packs
- Handles WhatsApp's 3–30 sticker limit — pads small packs, splits large ones
- Auto-resizes to 512×512, converts to WebP, enforces ≤100 KB (static) / ≤500 KB (animated)
- Generates 96×96 tray icon from the first sticker
- HTML preview gallery —
--reportflag generates a mobile-friendly index page - Works on Windows, macOS, Linux
Table of Contents
- Installation
- Usage
- Why and for Who?
- Why a helper app is required (iOS) & Dead End Research
- Options
- WhatsApp Limitations
- Output Structure
- License
Installation
pip install wastickers-packer
Requires Python 3.8+. The Pillow dependency is installed automatically.
Usage
Flat folder — all images become one pack
wastickers-packer stickers/ -o ./packs
Over 30 images? Packs split automatically ("My Pack 1", "My Pack 2", …).
Under 3? Stickers are duplicated to reach 3.
Subfolder mode — one pack per subfolder
stickers/
├── animals/ → "Animals" pack
│ ├── cat.webp
│ └── dog.webp
├── food/ → "Food" pack
│ ├── pizza.png
│ └── taco.jpg
└── reactions/ → "Reactions" pack
├── hug.gif
└── wave.gif
wastickers-packer stickers/ -o ./packs
Each subfolder is a named pack. Max 30 per subfolder (error if exceeded).
Below 3? Padded automatically.
HTML preview
wastickers-packer path/to/stickers -o ./packs --report
Why and for Who?
While moving from an Android device to an iOS one, I encountered this stupid issue using MoveToIOS (as the process is not annoying and error prone as is) — among other things, WhatsApp Stickers do not transfer in the move to the new phone for some reason!
On Android at least it is possible to access them via:
Internal Storage/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp Stickers/
Now hear me out, I'm a bit of sticker hoarder, and even after filtering and copying them out I was still left with 300+ stickers, not in packs nor organized of course.
So I started researching a way to just dump and install them on my new phone, and I came to the sad conclusion that there is no real way to batch up the process — and the sadder conclusion — I am the only human with that much stickers that reached this issue.
So I decided to streamline this as much as I can.
Basically just grab the WhatsApp Stickers folder from the app's files and run this tool on them to create packs out of all your stickers, send them to yourself and open them with a third-party WhatsApp Sticker app to install.
Why a helper app is required (iOS) & Dead End Research
I wanted to streamline this completely and have no dependency on third-parties — upon my research a way that looked promising and was commonly talked about was leveraging the Pasteboard + whatsapp://stickerPack
- via
file - via
url
There were conflicting views all over and no one place with an answer — so TLDR — there is no way to do this.
WhatsApp iOS only accepts sticker packs through a native Sticker Provider extension — an App Store app that registers with WhatsApp via Apple's framework. There is no supported web-based, file-based, or URL-scheme installation path.
The old whatsapp://stickerPack pasteboard API (2018) required a custom UTI type (net.whatsapp.third-party.sticker-pack) and binary NSJSONSerialization data — neither of which can be produced from a browser or file.
Even on its last working versions, the URL scheme was fragile and frequently broken by iOS updates, WhatsApp Business conflicts, and Apple's clipboard security model (blocked on file:// URLs entirely). Modern WhatsApp versions have removed support for it altogether.
Hopefully this serves someone.
Options
| Flag | Default | Description |
|---|---|---|
-o, --output |
output/ |
Output directory |
--name |
folder name (title-cased) | Pack name for flat folders |
--publisher |
WhatsApp Sticker Tool |
Publisher name in metadata |
--report |
False |
Generate HTML preview gallery |
WhatsApp Limitations (and how we handle them)
| Limitation | Our approach |
|---|---|
| 3–30 stickers per pack | Below 3 → pad. Above 30 → split (flat mode). |
| ≤100 KB per static sticker | Quality-tuned WebP export hits the target. |
| ≤500 KB per animated sticker | Same, with the higher animated limit. |
| Frame duration 10–500 ms (>8ms) | Clamped automatically; 0ms → 100ms. |
| Total animation ≤10 s | Scaled proportionally if exceeded. |
| No mixing static & animated | Says not allowed — iOS app accepts mixed packs. |
| 512×512 pixels | Auto-resized and centre-cropped. |
| 96×96 PNG tray icon | Generated from the first sticker. |
Output Structure
packs/
├── animals.wastickers ← open on phone to install
├── food.wastickers
├── reactions.wastickers
├── index.html ← preview page (with --report)
├── animals/
│ ├── tray.png
│ ├── sticker_01.webp
│ └── ...
├── food/
│ ├── tray.png
│ └── ...
└── reactions/
└── ...
License
Metadata
Release files for wastickers-packer 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| wastickers_packer-0.1.2.tar.gz | 18.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| wastickers_packer-0.1.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 30.7 kB
Release files / wastickers_packer-0.1.2.tar.gz
| Download URL | wastickers_packer-0.1.2.tar.gz |
|---|---|
| Size | 18.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e7b711025b43afa7ead6750836b23af71a1e3ef2ca525abfc5cf332f21461822
|
|
BLAKE2b-256 checksum How to use checksums |
790278a8fe2939d95d10d3e1e89a7922e466c83acb9812cb928bac2ebae35ae2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 10, 2026.
Transparency logRelease files / wastickers_packer-0.1.2-py3-none-any.whl
| Download URL | wastickers_packer-0.1.2-py3-none-any.whl |
|---|---|
| Size | 12.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
529db3bfcbb9cf3a1e39f9ebda6dd1f73f3d743da61a30f31f6b182cfe4ce340
|
|
BLAKE2b-256 checksum How to use checksums |
9ffb11342d219f68ffa7e946f692eed7018f9cc9d587094313b1d6b02ce32ebe
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 10, 2026.
Transparency log