DataTikTok LiveDesign

A Sticker That Keeps Evolving

Some creators design fan-club stickers for individual viewers — one person each. What if the sticker kept evolving after it was made? A prototype for activity-driven sticker evolution, measured at the size chat actually shows it.

A fan-club sticker pack on TikTok LIVE is mostly for the room — a W, an MVP, a LEVEL UP, a WELCOME TO THE TEAM. But some creators make a different kind: a sticker designed for a single viewer, with their name on it. I have three. Three rooms, three stickers with my handle on them, in three house styles — fire and gold, tiger stripe, violet ghosts.

That is the most personal thing a creator can hand a viewer, and it is also why a room has ten of them and not a thousand. Designing one is the expensive part. A template can’t replace it — but it can replace everything after: the sticker could keep evolving once it’s made, as the person behind it keeps showing up.

My own chat history is full of the frustration with how stickers are handed out today: “These stickers are so random”, “Aren’t the stickers supposed to be back”. The stickers are loved. Their logic is opaque.

What everyone else does

Loyalty badges are not new. What’s striking about the prior art is not how these systems encode several things at once — it’s that none of them try.

new1 mo2 mo6 mo1 yr2 yr

YouTube loyalty badges

one axis

The creator uploads art per duration slot — new, 1, 2, 6 months, then 1–5 years. Tenure is the only axis; paying more doesn't change the badge. Renders at 14–16px.

1236912

Twitch sub badges

one axis + a finish

Creator-authored base plus milestone slots at 2, 3, 6, 9 and 12 months. Higher tiers get a glow over the same art — the one place a platform composites rather than swaps.

first award2nd awardoak leaf cluster

Military ribbon devices

sparse, fixed vocabulary

One ribbon, then devices pinned on: a star per repeat award, an oak leaf cluster, in fixed positions. Most ribbons carry zero or one. The grammar is tiny and the marks are rare, which is why it reads.

the armseldest son: a label

Heraldry

describable in one sentence

A coat of arms is valid only if it can be blazoned in a sentence; a family's arms stay fixed and small marks of cadency say which son bears them. Clutter isn't a matter of taste there — it is a rule violation.

Apple Fitness rings

three, identical geometry

Three independent goals as concentric arcs, legible instantly without numbers — and they are three measures of the same kind in the same shape, not six different things.

one badge each

Merit badges

collect, do not composite

Many achievements, one badge each, arranged on a sash. The alternative to compositing is simply not compositing.

YouTube and Twitch encode one axis: tenure. Twitch adds a glow for a higher tier, which is the single place a platform composites onto a badge rather than swapping it for another image. The genuinely compositional precedents are older and not from streaming at all. Military ribbon devices pin a star onto a fixed ribbon for a repeat award, and most ribbons carry zero or one. Heraldry keeps a family’s arms fixed and adds a small mark of cadency; a coat of arms that can’t be described in one sentence is invalid. Apple’s rings show three things, but three measures of the same kind in the same shape.

The lesson is restraint, and it set the ceiling for everything below: a badge can carry a level and maybe one more thing. Sixteen pixels square is about two bits of signal, and anything that spends it on six achievements spends it on none of them.

The format decides the design

The stickers come back from the API as opaque, edge-to-edge squares — 876 to 1254 pixels, no transparent margin — and anything sent back has to be the same thing. That one fact rules out the two obvious approaches.

A frame around the art — a ring, a plaque, a rim — ships a square that’s 20–50% sticker and the rest transparent, which in chat renders as a shrunken sticker. Marks over full-bleed art keep the space but lose the signal: on bright, high-contrast artwork a 4px edge mark has neither area nor contrast.

Rendered at 896 × 896 — the exact size the API holds this sticker at. Opaque, square, nothing empty.

The resolution is a band. The art sits at 84% inside a solid frame, and the frame is what the system paints. The output is still a full-bleed square; nothing is empty; the name is never touched; and a mark on a dark matte has the area and contrast a mark over artwork never will. Stage zero is a plain dark border — which is what most creator-designed stickers already carry.

Two ways to climb it

Whatever the band paints has to survive a simple test: render the layers without the artwork (the art is identical for every viewer, so it carries no information), rasterise at 16 and 32 pixels, and measure how far apart the pixels land across six steps from level 0 to level 50. The measurement is a floor, not a verdict — it rewards ink, and a grammar that covers more of the square scores higher whether or not anything is legible — but it reliably catches anything that doesn’t move.

Two grammars clear it. Metals climbs the tier ladder gaming has taught everyone — bronze, silver, gold, platinum, diamond — each a different hue, with the team’s colour kept as the inner edge. Fill paints the band clockwise from the top in the team’s own colour, a fifth every ten levels: extent, not tone. Both change the whole band at every step. Anything mark-based — a segment, a dot, a corner glyph — is too small to carry a step at 32 pixels, and one colour split by brightness blurs at the top of the ladder.

The band takes exactly one thing from the creator: a colour. The default is derived from the emoji in their display name — the site already maps every emoji to a curated pair, so 🐦‍🔥 opens in fire orange, 🐅 in amber, 👻 in violet — and the artwork does the rest of the theming.

What climbs it, and what sits on it

The band has one driver: team level. TikTok already defines it, already caps it at 50, and already celebrates it at round numbers, so the ladder is a stage every ten levels and nobody needs it explained. It never goes down, it never needs a threshold set, and it’s the same in every room.

Everything else goes on a plate — a dark window let into the band, never on the art, at one of eight stations. A plate has no colour of its own: the band’s colour is the progression, and anything painted on top of it competes with it, so a plate is matte, with its label in light ink — or, if the streamer prefers no chrome at all, just the label outlined on the band. There are two kinds, and both are the streamer’s to configure.

A milestone is a count passed: a million likes, a hundred thousand diamonds, three hundred sessions. The streamer picks the signal and the numbers; the plate carries the signal’s icon and the number in short form — ♥ 1M — and stays; the face the label is set in is the streamer’s pick from a short list of free fonts the renderer ships with. One plate can hold a ladder of numbers, 100K, 500K, 1M, and shows the highest passed, so a single station tells the whole story of one stat. A rank is a top-three place held: most likes, top gifter, most comments. Only three people in a room can hold one, no amount of spending manufactures a fourth, and it’s the one thing on the sticker that can go down — so it’s a plate, not a band, reading 1st, 2nd or 3rd with crowns for first, and the same icon says which stat.

Every signal has an icon: ♥ likes, ◆ diamonds, a bubble for comments, a clock for watch time, a calendar for sessions, a flame for the longest streak. One plate per sticker here; at 32 px the icon is a blob but the plate still reads, and the band's colour still wins.
Band colour
Plate style Plate font
Metals

Bronze, silver, gold, platinum, diamond — the tier ladder gaming has taught everyone, each tier a different hue. The team colour stays as the inner edge.

start · plain  
5 sessions · bronze  
20 sessions · silver  
50 sessions · gold this viewer
100 sessions · platinum  
200 sessions · diamond  
this viewer at
1st1st 1M1M 48
1st1st 1M1M 32
1st1st 1M1M 24
1st1st 1M1M 16
all six at 32
Material

What the band is made of: matte, then wood, stone, steel, gold, crystal. Texture as well as hue, so the stages differ even in greyscale.

start · matte  
5 sessions · wood  
20 sessions · stone  
50 sessions · steel this viewer
100 sessions · gold  
200 sessions · crystal  
this viewer at
1st1st 1M1M 48
1st1st 1M1M 32
1st1st 1M1M 24
1st1st 1M1M 16
all six at 32
Fill

The team colour paints the band clockwise from the top, a fifth per stage. Extent, not tone: how far round is how far along.

start · 0/5  
5 sessions · 1/5  
20 sessions · 2/5  
50 sessions · 3/5 this viewer
100 sessions · 4/5  
200 sessions · 5/5  
this viewer at
1st1st 1M1M 48
1st1st 1M1M 32
1st1st 1M1M 24
1st1st 1M1M 16
all six at 32

What sits on it

The streamer's side. Each plate is a milestone (a count passed) or a rank (a top-three place held) on one signal, at one station of the band. Add, remove, and place them.

Rank
1st
Milestone
1M
Milestone
not yet
Viewer

Someone in the room. Load one, or type their numbers.

rank
rank
rank
rank
rank
rank
1st1st 1M1M 1st1st 1M1M
Stage 3 of 5 gold on Metals · steel on Material · 3/5 of the band on Fill. 2 of 3 plates earned.

One sticker, three rooms

My own sticker in each room, on the selected ladder. The band takes one colour from the team; the artwork does the rest.

Fire 🐦‍🔥

default colour from the emoji

1st1st 1M1M
start · plain
1st1st 1M1M
5 sessions · bronze
1st1st 1M1M
20 sessions · silver
1st1st 1M1M
50 sessions · gold
1st1st 1M1M
100 sessions · platinum
1st1st 1M1M 1M1M
200 sessions · diamond
Tiger 🐅

default colour from the emoji

1st1st 1M1M
start · plain
1st1st 1M1M
5 sessions · bronze
1st1st 1M1M
20 sessions · silver
1st1st 1M1M
50 sessions · gold
1st1st 1M1M
100 sessions · platinum
1st1st 1M1M 1M1M
200 sessions · diamond
Ghost 👻

default colour from the emoji

1st1st 1M1M
start · plain
1st1st 1M1M
5 sessions · bronze
1st1st 1M1M
20 sessions · silver
1st1st 1M1M
50 sessions · gold
1st1st 1M1M
100 sessions · platinum
1st1st 1M1M 1M1M
200 sessions · diamond

The counted signals have no ceiling, which is why they’re plates and not ladders: cutting an unbounded count into five even steps leaves nearly a whole room on step zero. A milestone is one line, drawn where the streamer wants it, and the only question it answers is yes or no.

Metals, three rooms, my sticker in each. Rows: 🐦‍🔥, 🐅, 👻. Columns: plain, then bronze at level 10 through diamond at 50, with a rank plate at the top.

Is it automatable?

Entirely. Every sticker above is one SVG string — base tile, band, plaque — and the same string drives both the page and the renderer, so a PNG is one rasterisation. The images in this post came from a loop over that renderer in headless Chromium, no hand step; in production the same string goes through resvg with no browser at all.

The two ladders at 32 px — Metals above, Fill below — which is roughly where chat shows a sticker. Every ten levels is still a different thing.

The data side is just bookkeeping. Team level is shown in the room, and every count a plate can be about — likes, gifts, comments, time in the room, sessions — is visible from inside it while it’s live, so a system that sits in the room keeps the counts itself, per viewer, and never depends on anyone exporting anything. The design is finished enough to argue with. The pipeline behind it is the next post.