---
name: "sticker_pack_design"
description: "Design sticker and custom emoji packs that read at small sizes: one style system across a set, expressions and poses built for 32 to 100 pixel display, exact export specs for Telegram, Discord, WhatsApp, Slack, iMessage, and LINE, plus export and validation scripts and a contact sheet review pass. Use when creating a sticker pack, custom emoji set, chat reaction pack, or character sticker series for any chat app."
---

# Sticker Pack Design

## Purpose
Build a sticker pack that works where it will actually be seen: as a 32 pixel emoji in a Discord chat line, a 100 pixel Telegram custom emoji, and a thumbnail in a picker grid. This skill covers the style system that keeps a set coherent, the expression set that covers daily chat, exact per platform export specs, scripts that export and validate the files, and the review pass that catches stickers which look fine at full size and say nothing at real size.

## Workflow

### 1. Lock the style system before drawing the set
- Fill in the one page style sheet in `references/style-system.md`: silhouette, proportions, line weight, outer stroke and shadow, palette of five to eight flat colors with hex values, face construction, hand style, text rule, prop rule.
- Draw one hero sticker first, usually the laugh or the love face, and approve it against the style sheet before drawing the rest.
- Keep masters at 1024x1024 px or larger, transparent, one file per sticker, named with a two digit number and a short slug, for example `03-laugh.png`.

### 2. Build the expression set from a manifest
- Start from `assets/manifest-12.csv`: hello, love, laugh, cry, angry, surprised, yes, no, sleepy, hungry, celebrate, thanks. It covers greetings, reactions, states, decisions, and social glue.
- Give each row one emotion, one pose, and at most one prop. If a row needs two props to make sense, split it or cut it.
- Assign each sticker its platform emoji at manifest stage, not at upload stage. Telegram and Discord both use that emoji for suggestions and search.
- Add stickers past twelve only after the twelve read cleanly at small size. WhatsApp allows 3 to 30 per pack, LINE only accepts sets of 8, 16, 24, 32, or 40, and Telegram sets can grow later, so plan the count per destination.

### 3. Draw for the smallest display first
- Push brows and mouth past natural. They carry the emotion at 32 px. Fine detail, blush, lashes, and fabric texture carry nothing at that size.
- Fill the frame with the character. Art using half the canvas reads half as large in every picker and chat.
- Keep internal lines thick, about 3 px or more at the 512 export, and check the silhouette alone: black fill, no internal lines, the pose should still read.
- Follow the text rule: no text by default, two words maximum when text is unavoidable, and the sticker must still read with the words removed.

### 4. Export per platform with the script
- Run the exporter on the masters folder. It resizes, pads to exact canvases, converts formats, reports over limit files, and writes the contact sheets:

```
python3 ~/workspace/skills/sticker-pack-design/scripts/export_pack.py masters/ exports/ --all
python3 ~/workspace/skills/sticker-pack-design/scripts/export_pack.py masters/ exports/ --platforms telegram-static,whatsapp,discord-sticker
```

- Use `references/platform-specs.md` for the full table. The load bearing specs:
  - Telegram static: one side exactly 512 px, PNG or WebP, max 512 KB. Animated: 512x512 TGS, max 64 KB, max 3 seconds, 60 FPS, looped. Video: WebM VP9 with no audio, one side 512 px, max 256 KB, max 3 seconds, up to 30 FPS. Custom emoji: 100x100 px.
  - Discord sticker: exactly 320x320 px, PNG static or APNG or GIF animated, max 512 KB. Discord custom emoji: 128x128 px upload, max 256 KB, displayed at 32x32.
  - WhatsApp: exactly 512x512 px WebP with transparency, static under 100 KB, tray icon 96x96 px under 50 KB, 3 to 30 stickers per pack, recommended 8 px white stroke and 16 px margin.
  - Slack custom emoji: square, under 128 KB, JPG or PNG or GIF, GIF up to 50 frames, 128x128 px recommended.
  - iMessage: PNG, APNG, GIF, or JPG under 500 KB, between 100x100 pt and 206x206 pt, one size class per pack in the Xcode template.
  - LINE: at most 370x320 px transparent PNG, main image 240x240 px, tab image 96x74 px, set counts of 8, 16, 24, 32, or 40 only.
- Build the tray and tab icons from the hero sticker, never from a logo or a group shot. The icon has to read at 96 px.
- For animated stickers, design the loop first and the file budget second: Telegram TGS at 64 KB and video at 256 KB punish detailed motion, so use simple vector shapes, few moving parts, and a loop point that lands cleanly.

### 5. Validate, then run the contact sheet review
- Run the validator on the export folder and fix every failure before upload:

```
python3 ~/workspace/skills/sticker-pack-design/scripts/validate_pack.py exports/
```

- Review the two sheets the exporter writes, in order: `contact-sheet.png` for style drift across the set, then `small-size-test.png` at 100, 48, and 32 px, naming each emotion out loud. A wrong name means a redraw, not a rename.
- View the pack on white, black, and patterned backgrounds. Art that vanishes on any of them gets a stronger outline or shadow, applied through the style sheet values so the whole set stays consistent.
- Order the pack with hello, love, laugh, and yes first. The first picker row is the pack for most new users.

### 6. Upload per platform
- Telegram: the Stickers bot, one sticker at a time, one main emoji per sticker, then publish the pack link.
- Discord: Server Settings, Stickers for stickers and Emoji for custom emoji. Uploading stickers needs the Manage Expressions permission. Set the associated emoji and a plain text description for screen readers on each sticker.
- WhatsApp: personal packs can be built inside the app. Packs for other people ship through a sticker app built from the WhatsApp sample apps for Android or iOS.
- Slack: emoji picker, Add Emoji, upload and name each one. Names are the search index, so use plain words teammates will type.
- iMessage: Xcode Sticker Pack App template, drag the exported files into the sticker catalog, pick the size class chosen at export, submit through App Store Connect.
- LINE: Creators Market, upload the set with its main and tab images, submit for review.

## Output Contract
Deliver: the filled style sheet, the manifest CSV with one emoji per sticker, transparent masters named by number and slug, per platform export folders that pass `validate_pack.py` with an `export-report.csv` showing no OVER_LIMIT rows, the tray or tab icons each platform needs, `contact-sheet.png` and `small-size-test.png` with a pass or redraw note per sticker, and the pack order for upload.

## Operating Rules
1. Small size is the design brief. A sticker that only reads at 512 px is not finished.
2. One style system, no exceptions mid set. Line weight, outline, shadow, palette, and head size come from the style sheet on every sticker.
3. One emotion, one pose, one prop per sticker. Crowded stickers read as noise in a picker grid.
4. Verify specs on the official platform page before a release that matters. Limits and slot counts change, and `references/platform-specs.md` carries the date it was last checked.
5. Own or license every image in the pack. Photo cutouts of other people, show characters, and brand marks do not become yours because you traced them.
6. Accessibility is part of the pack: plain text descriptions where the platform supports them, no meaning carried by color alone, and no flashing loops.
7. Never ship from the masters folder. Only validated exports go to a platform, so a wrong canvas or an over limit file never reaches users.
