Nobody in a match-day group chat types “goal.” They type GOOOOOAAAL. Footy Friend takes that literally: the more you stretch a word, the louder it lands.
The thinking
A lot gets lost in text. Expression, emphasis and excitement flatten out, and what's left is mostly sterile. "pass the crisps" and a 50th-minute goal arrive as the same gray bubble at the same size.
Watching a match with friends in the same room is the opposite. Everyone's up off the couch at once, someone is shouting before the ball crosses the line, and the room gets loud and then settles. So the question behind this project: what would it look like to bring that room into a chat?
I started by asking what match-day chat already does on its own. People stretch letters when something big happens. Nobody teaches that; it's how typing shouts. So the habit becomes the volume knob, instead of adding a new one. No reaction picker, no "big" button, no guessing the mood from the words. The stretch turns into size, color and motion.
Three ideas carry the rest of the design:
- The text is the input. How loud a message lands depends only on how it was typed, and you see your volume before you send.
- Loud has to be rare. The base thread stays quiet, so a sticker means something when it shows up.
- The room shares the volume. When everyone screams at once, it should read as one moment, like voices on top of each other, not twelve messages taking turns.
Four tiers, one rule
Scaling is tiered rather than continuous. Each tier changes enough to read at a glance, and nothing jumps from normal to full takeover in one keystroke. Tiers apply live in the composer, so you see how loud you are before you send, not after.
| Tier | Example |
|---|---|
| NormalStandard gray bubble · Score under 2 | goal |
| WarmBigger and bolder, still a bubble · Score 2–5 | goooal |
| LoudThe bubble drops away. The words become a sticker in the sender’s color · Score 6–12 | goooooaal |
| ScreamingAn even bigger sticker. The screen shakes and everyone’s phone buzzes · Score 13+ | GOOOOOOAAAL |
Why stickers
The thread is a neutral iOS chat. Your own messages have no bubble, friends get light gray bubbles, and every message lands on a small tilt.
Because the base is so quiet, loudness is the only thing that gets color. At Loud the bubble drops away and the words become a die-cut sticker in the sender's color, with a white border and a drop shadow.
At Screaming the sticker grows, picks up the sender's avatar, slaps down with a spring, and the screen shakes. You can tell who yelled without reading a name.
Sticker blast
When several friends scream at once, their stickers pile onto each other instead of fighting for the screen. A sticker that lands within a few seconds of the last one slaps partly over it, and the avatar keeps every sender visible. Scroll back and the goal is one pile, not a run of separate messages.
How the score works
Each word is scored on its own, then the words add up. Repeated chunks count too, so laughter like "hahahaha" gets loud even though no single letter repeats.
for each word (letters only):
longest = longest run of one letter // "OOOOOOO" → 7
repeats = letters that repeat the previous // every extra letter
score = max(longest − 2, 0) + repeats
if a 2–3 letter chunk repeats 3+ times: // "hahaha", "lololol"
score += floor(chunk run length / 2)
if the word is ALL CAPS: score × 1.3
total → Normal < 2 · Warm 2–5 · Loud 6–12 · Screaming > 12Try it. Type a message, stretch a word and send it. The readout under the composer shows how it scores as you type.
Stretch a word and send it
Guardrails
The first two are decided. The last three are still open.
- Cooldown. Three screams inside 30 seconds drop your next message one tier. The bubble tries to grow and bounces back, so you can see why.
- Reduce Motion. Size and color stay, because they carry the meaning. Shake and confetti are skipped.
- Dynamic Type (open). Screaming is 150–200% of base size. On top of a large accessibility text size that breaks layout, so the scale needs a cap that respects the user's setting.
- Spoilers (open). Friends watch on streams that run 10–40 seconds apart. A screaming GOAL with haptics can arrive before someone sees the goal. Options include syncing per viewer, holding loud messages until a viewer's stream catches up, or a manual "I'm behind" mode.
- Haptics on other people's phones (open). Screams buzz the whole room. That needs a per-person opt-out, and a plan for friends whose app is in the background, since iOS only plays haptics in the foreground.