agentleFS
vargHQvargHQ/skills/gpt-image-sticker-pack/SKILL.md

gpt-image-sticker-pack

Skill23 starsChanged 8 months agoMITView on GitHub

Turn a photo or a character into an animated sticker pack with GPT Image 2.6 on varg: one approved chibi or mascot still, 6-8 emotions with one short word each, one looping GIF per emotion, then exported and checked against each messenger's animated-sticker spec (Telegram video stickers, WhatsApp animated WebP, LINE APNG, WeChat GIF, Discord, Slack) by scripts/export.sh. The specs were checked on the official docs on 2026-11-05 and are cited with links. Use when someone asks for a sticker pack, animated stickers, emoji or 表情包 from their photo, pet or mascot, LINE stamps, WeChat stickers, Telegram or WhatsApp stickers, or wants to sell or share a sticker set. Not for one GIF without a pack (gpt-image-gif), game sprites (gpt-image-sprite-sheet) or static images (gpt-image-2-6).

  • Reads credentials

The file

We split this skill into the rules it gives an agent

3 rules. About 0 are common, 3 are distinctive, and 0 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈3

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 0

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Use a photo only of someone who agreed to it.

    line 87
  2. Distinctive:

    Telegram, WhatsApp, LINE, Slack: read on the linked page with WebFetch on 2026-11-05.

    line 182
  3. Distinctive:

    Every output is re-read and checked (size, pixels, length, frames, fps, audio).

    line 214

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Animated sticker packs with GPT Image 2.6

On launch day people turned their own photos and characters into animated sticker sets: six chibi stickers from a profile photo (@goan999999), a character eating rice with one caption (@Gorden_Sun), "GIFs of this character's four emotions" for LINE (@tetumemo), custom sets sold on Xiaohongshu (@Leviwoyun), and a how-to for publishing sets with tips on WeChat's sticker platform, from an author who says AI stickers earned them over 1,000 RMB (@ama_huangama, 635 bookmarks).

The GIF mechanics (pixel budget, loop lock, failure modes) are in gpt-image-gif. This skill adds the pack plan, the per-platform specs and the export.

Our example pack, made on varg with gpt_image_2_6 (2026-11-04/05), from the mascot still Pip: LOL and THANKS! (6 frames of 768×768, 160 ms, transparent) and one failure, ON MY WAY! (three words garble between frames).

1. Plan the pack

  • 6-8 emotions. LINE sets have 8, 16 or 24 stickers; WhatsApp packs 3-30; WeChat albums 8-24 (section 4). Eight covers every platform's minimum.
  • One short word per sticker. One word held in every frame ("LOL", "THANKS!"); three words broke (measured). @goan999999's captions were 1-3 Chinese characters.
  • One simple motion per emotion, one that reads at 160 px: a wave, a nod, a bow, a jump, a shake.
  • The first frame is the whole sticker. WhatsApp "ends the animation on the first frame after looping", and LINE shows the first frame as the store image (section 4).

A starter set (word, motion):

WordMotion
HIwaves one hand twice
OKnods once and gives a thumbs up
LOVEmakes a heart with both hands, a small heart pops up
LOLlaughs, shoulders bounce
THANKS!bows with palms together
GO!pumps a fist
SORRYbows the head, ears or shoulders drop
BYEwaves and steps aside

@goan999999's set, for comparison: 嗨 "hi" (waves), 收到 "got it" (nods, thumbs up), 爱你 "love you" (finger heart), 哈哈哈 "hahaha" (laughs to tears), 加油 "you got this" (fist), 谢谢 "thanks" (palms together, bow).

2. Make it

  1. The character still. From a photo: an edit with the photo in files, e.g. "A chibi sticker character of the person in the photo: big head, small body, same hairstyle, face shape, glasses and clothes. Full body, front view, neutral happy face, thick clean outline, flat colours. Transparent background." Settings: aspect_ratio: "1:1", background: "transparent", output_format: "png". Use a photo only of someone who agreed to it. Approve this still before anything else. 6-7 credits.
  2. Upload the still (create_upload or POST /v2/files) to get its https://s3.varg.ai/… URL.
  3. One GIF per emotion, always from the same still:
call_tool({
  "tool": "image",
  "input": {
    "model": "gpt_image_2_6",
    "prompt": "Animated sticker of the character from the reference image. Emotion: thankful. Motion: bows with palms together, then comes back up. 6 frames; the first and last frame show the same pose, so the loop has no jump. Same size and position in every frame, fixed camera. Caption above the head in bold rounded letters with a white outline: \"THANKS!\" The caption does not move or change. Transparent background. Flat colours, thick clean outline.",
    "files": [{"url": "https://s3.varg.ai/files/194b94d0-58ff-4e8b-91de-4f1959d04013/file_5ed17708b8d2.png"}],
    "provider_options": {"fal": {
      "output_format": "gif",
      "frame_count": 6,
      "image_size": {"width": 768, "height": 768},
      "frame_duration_ms": 160,
      "background": "transparent",
      "quality": "high"
    }}
  },
  "wait": true
})

6-7 credits each (measured 2026-11-05). For 2-8 frames fal always draws an eight-cell sheet (gpt-image-gif section 1), so 6-8 frames cost no more than 4. 4. Check every sticker: magick sticker.gif -coalesce +append strip.png. Reject a sticker whose caption changes letters, whose face changes, or whose last frame jumps to the first. 5. Export: bash scripts/export.sh sticker.gif all (section 5).

@goan999999's prompt (ChatGPT, published in the reply), original:

用我上传的照片做一组 Q 版微信表情包,保留本人的发型、脸型、眼镜和服装特点,所有表情都要像同一个人

做6款:嗨(挥手)、收到(点头点赞)、爱你(比心)、哈哈哈(笑到流泪)、加油(握拳)、谢谢(合掌鞠躬)

每款单独画一张2×2的连续动作图,共4帧,按左上、右上、左下、右下播放。固定人物大小和位置,字幕不要移动,白色背景,不要边框和序号。动作要有变化,最后一帧能接回第一帧

画好后,分别合成320×320的GIF,每帧200毫秒,无限循环。给我6个独立文件,再打一个压缩包。

English translation:

Use the photo I uploaded to make a set of chibi WeChat stickers. Keep my hairstyle, face shape,
glasses and clothes; every sticker must look like the same person.

Make 6: 嗨 "hi" (waving), 收到 "got it" (nod and thumbs up), 爱你 "love you" (finger heart),
哈哈哈 "hahaha" (laughing to tears), 加油 "you got this" (clenched fist), 谢谢 "thanks" (palms
together, bow).

Draw each one as its own 2×2 sheet of consecutive poses, 4 frames, played top-left, top-right,
bottom-left, bottom-right. Keep the figure's size and position fixed, don't move the caption, white
background, no borders or numbers. The motion should change, and the last frame should lead back to
the first.

When they are drawn, combine each into a 320×320 GIF, 200 ms per frame, looping forever. Give me 6
separate files, and also a zip.

On varg you skip the hand-made 2×2 sheet: output_format: "gif" draws and assembles the frames. Keep the rest: same person, fixed size and position, a caption that does not move, last frame back to the first. The author's warning: in ChatGPT, asking for "a GIF" sometimes returned one still with motion lines, and in their set "the hair and the text jump a little".

@Gorden_Sun's one-line version: 「使用这个角色,生成一张GIF图,内容是她吃大白米饭,图片里有文字:真香!」 "Use this character and make a GIF of her eating a big bowl of white rice, with the text in the picture: 真香!" ("so good!").

3. Failure → fix

What you seeFix
Caption letters change between frames ("ON MY WAY!")One word, or no caption in the GIF and the word added later as a fixed layer
Hair and caption jitter (@goan999999)"The caption does not move or change"; smaller motion; regenerate that one sticker
The character drifts across the packEvery GIF from the same approved still in files; same prompt skeleton, change only emotion, motion and word
A white fringe around the character on a dark chatGIF transparency is on/off per pixel. Thick dark outline in the prompt; for LINE and Discord the script writes APNG, which keeps the edges as they are in the GIF
LINE check fails "needs a transparent background"Regenerate with background: "transparent"
WhatsApp shows a mid-motion pose when the loop stopsMake frame 1 the full resting pose (loop-lock lines)

4. Platform specs (checked 2026-11-05 on the official docs)

PlatformFormatSizeMax fileMax lengthFrames, fpsPackSource
Telegram (video sticker)WEBM, VP9, no audioone side exactly 512 px, the other ≤ 512256 KB3 s≤ 30 fps; "should be looped"—core.telegram.org/stickers
WhatsApp (animated)WebPexactly 512×512500 KB10 sframes ≥ 8 ms; ends on frame 13-30 stickers, all animated or all static; tray icon 96×96 PNG ≤ 50 KB; up to 3 emoji per stickerWhatsApp/stickers Android README
LINE (animation stickers)APNG (.png)≤ 320×270, width or height ≥ 2701 MB per image4 s per sticker, all loops included5-20 frames, 1-4 loops8, 16 or 24; main image 240×240 APNG; chat tab 96×74 PNG; transparent background, RGBcreator.line.me animation sticker guidelines
WeChat (表情开放平台)GIF240×240500 KBnot stated"循环播放,节奏流畅不卡顿" (loop, smooth)8-24 per album, all animated or all static; cover 240×240 PNG ≤ 500 KB, transparent; chat icon 50×50 PNG ≤ 100 KB, transparent; banner 750×400sticker.weixin.qq.com making specifications
Discord (server sticker)PNG, APNG, GIF (Lottie only on verified or partnered servers)320×320512 KiB5 s——Discord developer docs, Sticker
Slack (custom emoji)GIF, PNG, JPGsquare; no pixel size given"under 128KB … work best"not statedup to 50 frames—Slack help: custom emoji

How each was checked, and what we could not verify:

  • Telegram, WhatsApp, LINE, Slack: read on the linked page with WebFetch on 2026-11-05. Telegram "animated stickers" (.TGS) are Lottie vectors, a different format a GIF cannot become; this skill makes video stickers.
  • WeChat: the guide page is built by JavaScript and returned empty to WebFetch, so we read the specification text out of the page's own script bundle on sticker.weixin.qq.com (2026-11-05). The same page says single stickers (表情单品) "暂不支持包含推广形象、推广信息,或人物肖像(如人像照片、肖像画等)" ("do not yet support promotional figures, promotional information, or portraits of people, such as photos or painted portraits"). A chibi drawn from your photo may count as a portrait; we could not verify how reviewers treat it.
  • Discord: the help-center sticker FAQ returned HTTP 403, so the numbers come from the developer docs' "Create Guild Sticker" section. How many sticker slots a server has was not verified.
  • Slack names no pixel size; the script uses 128×128.
  • KB: the script treats 1 KB as 1,000 bytes, so files pass under either reading.

5. Export: scripts/export.sh

bash scripts/export.sh thanks.gif all            # every platform -> thanks_stickers/
bash scripts/export.sh thanks.gif line out/      # one platform, chosen folder

What it writes per platform, and what it does to fit:

PlatformFilesHow it fits the limits
telegramNAME.telegram.webmVP9 with alpha, 30 fps, cut at 3 s, CRF raised step by step until ≤ 256 KB
whatsappNAME.whatsapp.webp, NAME.whatsapp_tray.png (96×96)512×512 canvas, WebP quality lowered step by step until ≤ 500 KB
lineNAME.line.png (APNG), NAME.line_main.png (240×240 APNG), NAME.line_tab.png (96×74)fits 320×270; more than 20 frames → every 2nd (3rd…) frame; fewer than 5 → the loop repeated inside the file; plays = as many as fit in 4 s (max 4), sped up if one loop is longer than 4 s; palette APNG if over 1 MB
wechatNAME.wechat.gif, NAME.wechat_cover.png (240×240), NAME.wechat_icon.png (50×50)240×240, fewer colours (256 → 32) until ≤ 500 KB
discordNAME.discord.png (APNG)320×320; palette APNG, then a GIF, if over 512 KiB; sped up if longer than 5 s
slackNAME.slack.gif128×128, fewer colours until < 128 KB

Every output is re-read and checked (size, pixels, length, frames, fps, audio); the script prints PASS or FAIL per line and exits 1 if anything fails. It strips metadata, so the C2PA content credentials the model embeds are not carried over.

Tested 2026-11-05 on the LOL sticker (768×768, 6 frames, 960 ms loop, 444 KB), all six platforms passed:

PlatformResult
telegram512×512 WEBM, 133 KB, 0.97 s, 30 fps, no audio, alpha kept
whatsapp512×512 WebP, 130 KB; tray 14 KB
line270×270 APNG, 6 frames, 4 plays = 3.84 s, 398 KB
wechat240×240 GIF, 87 KB; cover 54 KB, icon 5 KB
discord320×320 APNG, 505 KB
slack128×128 GIF, 37 KB

The LINE frame rules were also tested on made-up GIFs: 32 frames → 16, 3 frames → 6, an 8 s loop → 4 s. The mascot wave GIF (white background) fails the LINE check as it should.

Then upload with each platform's own tool: Telegram's @Stickers bot (named on core.telegram.org/stickers), an app built on the WhatsApp/stickers sample, LINE Creators Market, sticker.weixin.qq.com, the Discord server's sticker settings, Slack's custom emoji page.

Related skills

gpt-image-gif (GIF rules, loop lock, WebP/MP4 for the web), gpt-image-2-6 (model guide, prices), gpt-image-markup-edit (fix the base still before you animate it), varg-character-design (designing the character itself).

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.