Skip to main content


pack sticker images into .wastickers nun for WhatsApp
easily recover stickers when moving phones into installable packs

Python 3.8+ License: MIT PyPI PyPI Downloads GitHub Stars Tests Platform


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 — --report flag generates a mobile-friendly index page
  • Works on Windows, macOS, Linux

Table of Contents


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

MIT

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)

Source distribution for wastickers-packer 0.1.2
File Size Uploaded
wastickers_packer-0.1.2.tar.gz 18.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for wastickers-packer 0.1.2
File Interpreter ABI Platform
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 log

Release 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

Release history Release notifications | RSS feed

This release

0.1.2 This release

2 release files

0.1.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page