← All work

Character & Motion / Bad Plot, a daily movie game for iPhone and web, 2026

Kernel: a mascot who reacts to every guess

How Kernel, the mascot of my daily movie-guessing game Bad Plot, was designed and animated: five moods tied to five moments in the game, drawn as vector shapes and animated in code.

Client Bad Plot

Kernel: a mascot who reacts to every guess

Bad Plot is a daily movie-guessing game I designed and built. You get one movie a day, described as badly as possible, and five guesses. Each wrong guess reveals the next line, which is still bad, just a little less bad. It's a game my friends and I already played out loud; the app makes it a daily habit.

A game like this is mostly a text box. Kernel is the part that isn't: a single piece of popcorn who sits in the front row, eats while you think, and has an opinion about every guess you make.

One round, start to finish. A wrong guess gets a flat look for about a second and a half before he goes back to chewing. The right one turns the whole screen green and sets him rocking.

Before Kernel there was a clapperboard

The first version of Bad Plot had no character at all. It was a dark movie-marquee theme: near-black surfaces, a gold accent, a serif wordmark, and a brief that called for the voice of a bored film critic. It was handsome and a little cold. A second pass went the other way, red on white and very graphic. Neither gave the player anyone to play against.

The earlier dark marquee theme of Bad Plot: a trophy list on near-black cards with gold accents and a serif wordmark
The marquee theme. Everything works, and nothing on the screen is alive.

Kernel arrived in a single day of rework, and the app icon tells the story of that day better than I can. The clapperboard monogram became his face within hours of him existing.

Five versions of the Bad Plot app icon in order: two dark clapperboard monograms, a bright yellow first Kernel with a popcorn bucket, a rebuilt Kernel, and the final muted Kernel face with open eyes
Five icons, pulled from the project history. The first Kernel was candy-bright and read as an emoji. I redrew him from clean vector shapes, then pulled the colors down to something calmer and opened his eyes, so the game reads as grown-up and he reads as someone watching you.

Five moods, one for each moment in the game

Kernel doesn't have a library of animations to show off. He has exactly as many moods as the game has moments: curious when the puzzle is fresh, thinking once you've guessed or taken a hint, unimpressed right after a wrong guess, delighted when you win, and asleep when you run out of guesses. Nothing plays unless something in the game caused it.

The five moods, and the popcorn box. His box empties as your guesses run out, so he doubles as the game's guess counter without a single number on him.

The small motions carry him

Most of what makes him feel alive is always running, whatever his mood. He bobs on a slow 2.4-second breath with a little squash and stretch. He blinks, twice in quick succession, every few seconds. While you're playing he lifts a piece of popcorn to his mouth and chews it. When his mood changes he compresses slightly and springs back, which is enough to make a change of face feel like a reaction and not a swap.

He's drawn as a handful of vector shapes (a body, a shadow, a highlight, a face) and animated in code with React Native Reanimated, so the same character runs on the iPhone app and the web version with no video files or sprite sheets.

Two bugs that taught me the most

The first: his popcorn box bobbed, rocked, and squashed along with him, which made him look like he was painted on a sticker. Separating the box so it sits still on the ground while he moves behind it was a small change that made him a body in a space.

The second: his win-screen rock had a hitch. Once per cycle the loop snapped back to its start and he twitched. The fix was to drive the rock from a phase that climbs steadily and feed it through a sine wave, so the jump back lands exactly where the wave already is. He now rocks for as long as you leave the screen open, and the seam is gone.

Color does the rest

Each screen is one flat field of color with a card floating on it, and the color is the game's state: a win screen is the green screen, a loss is the terracotta one. Kernel's mood and the color always change together, so the result lands before you've read a word. Dark mode keeps the same idea with deeper fields, and Kernel himself doesn't change at all.

Light to dark. The fields deepen and the card inverts; the butter, mint, and Kernel stay exactly as they are.

Where he lives now

Once he existed, he took over. He's the app icon and the launch screen. He heads the privacy policy and support pages. He's on the card that appears when someone shares their score. And he has his own page, where you can try each mood and empty his popcorn box yourself.

The Bad Plot privacy policy page, with Kernel beside the headline on a blue field
Even the privacy policy. If a page belongs to Bad Plot, he's on it.
Next The trust layer for an agentic sales system →

Building something complicated? Let's make it clear.

Get in touch