Sticker pack guide

Create a sticker pack

Package static or animated artwork, connect stickers to emoji, and sign one portable .stickers archive that can be shared and installed.

1. Prepare artwork

Use PNG or WebP for static stickers, GIF only when it renders safely, or Lottie JSON and Telegram-compatible TGS for animation. Video and WebM stickers are not supported.

2. Write the manifest

Give the pack a stable ID and semantic version, choose its cover sticker, list every file, and preserve complete Unicode emoji sequences exactly.

3. Validate and sign

Validate paths and file limits, then add an ASCII-armored detached OpenPGP signature. The required manifest email must match the signing key identity.

Archive layout

Create a deterministic ZIP archive and give it the .stickers extension. Keep all paths relative, unique, and inside the archive.

example-cats.stickers/
├── pack.json5
├── signature.asc
├── LICENSE
└── stickers/
    ├── cat_hello.webp
    └── cat_party.tgs

Manifest example

The splash value points to a sticker ID, not a filename. Sticker IDs must be unique, while one emoji may be associated with multiple stickers. The optional license array lists relative paths to license files included in the archive.

{
  format: 1,
  id: "com.example.cats",
  name: "Example Cats",
  version: "1.0.0",
  author: "Example Artist",
  web: "https://example.com",
  email: "artist@example.com",
  splash: "cat_hello",
  license: ["LICENSE"],
  amount: 4.99,
  currency: "USD",
  stickers: [
    {
      id: "cat_hello",
      file: "stickers/cat_hello.webp",
      emoji: ["👋", "😺"]
    },
    {
      id: "cat_party",
      file: "stickers/cat_party.tgs",
      emoji: ["🎉", "🥳"],
      paid: true
    }
  ]
}

Rules that keep packs portable

  • Identity: keep id globally stable and increase version for every update.
  • Cover: splash is required and may reference a static or animated sticker.
  • Safety: never include absolute paths, .., symlinks, duplicate paths, executable code, or video.
  • Licensing: every path in the optional license array must be relative, unique, and point to a regular text file in the archive.
  • Signing: signatures cover the canonical manifest and SHA-256 digest of every sorted sticker and license file.
  • Authenticity: publish the email-verified OpenPGP public key on keys.openpgp.org, or another configured key server.

Publish the pack

Create a GitHub Release and attach the finished .stickers archive as a release asset. Add the tone-stickers topic to the repository so the pack can be discovered.

Use the toolkit

Install stickerpack for the complete CLI and TypeScript API.

Toolkit repository
npm install --global stickerpack

stickerpack init example-cats --id com.example.cats
stickerpack validate example-cats
stickerpack keygen --name "Example Studio" --email artist@example.com
stickerpack key-check --email artist@example.com
stickerpack pack example-cats --output example-cats.stickers \
  --private-key stickerpack-private.asc
stickerpack verify example-cats.stickers

Build checklist

  1. 1. Validate the JSON5 manifest.
  2. 2. Confirm every referenced sticker and license file exists.
  3. 3. Check the splash sticker ID.
  4. 4. Reject unsafe or duplicate paths.
  5. 5. Canonicalize and hash the contents.
  6. 6. Add signature.asc and verify it.
stickerpack validate example-cats.stickers
stickerpack inspect example-cats.stickers
stickerpack verify example-cats.stickers