Batch-pack sticker images into .wastickers files for WhatsApp — auto-resize, split, pad, and generate installable packs
Project description
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
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file wastickers_packer-0.1.2.tar.gz.
File metadata
- Download URL: wastickers_packer-0.1.2.tar.gz
- Upload date:
- Size: 18.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e7b711025b43afa7ead6750836b23af71a1e3ef2ca525abfc5cf332f21461822
|
|
| MD5 |
d3ba819ee508209dc91bd55601e12f05
|
|
| BLAKE2b-256 |
790278a8fe2939d95d10d3e1e89a7922e466c83acb9812cb928bac2ebae35ae2
|
Provenance
The following attestation bundles were made for wastickers_packer-0.1.2.tar.gz:
Publisher:
release.yml on Yuxni/wastickers-packer
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
wastickers_packer-0.1.2.tar.gz -
Subject digest:
e7b711025b43afa7ead6750836b23af71a1e3ef2ca525abfc5cf332f21461822 - Sigstore transparency entry: 1780288940
- Sigstore integration time:
-
Permalink:
Yuxni/wastickers-packer@3311d527fc84edd3b9eb496919c4e47010e05650 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/Yuxni
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@3311d527fc84edd3b9eb496919c4e47010e05650 -
Trigger Event:
push
-
Statement type:
File details
Details for the file wastickers_packer-0.1.2-py3-none-any.whl.
File metadata
- Download URL: wastickers_packer-0.1.2-py3-none-any.whl
- Upload date:
- Size: 12.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
529db3bfcbb9cf3a1e39f9ebda6dd1f73f3d743da61a30f31f6b182cfe4ce340
|
|
| MD5 |
7e8d696c897d00efb2de04d599ecbbcf
|
|
| BLAKE2b-256 |
9ffb11342d219f68ffa7e946f692eed7018f9cc9d587094313b1d6b02ce32ebe
|
Provenance
The following attestation bundles were made for wastickers_packer-0.1.2-py3-none-any.whl:
Publisher:
release.yml on Yuxni/wastickers-packer
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
wastickers_packer-0.1.2-py3-none-any.whl -
Subject digest:
529db3bfcbb9cf3a1e39f9ebda6dd1f73f3d743da61a30f31f6b182cfe4ce340 - Sigstore transparency entry: 1780289166
- Sigstore integration time:
-
Permalink:
Yuxni/wastickers-packer@3311d527fc84edd3b9eb496919c4e47010e05650 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/Yuxni
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@3311d527fc84edd3b9eb496919c4e47010e05650 -
Trigger Event:
push
-
Statement type: