Coach Poulpy · brand book

One octopus, two moods.

Poulpy is a reversible plush: blue and smiling on one side, grumpy on the other. In the app his grumpy side turns ember, from burnt orange to red, and both sides shift shade with how he feels.

Tap Poulpy to flip him.

Blue side: you trained, Poulpy is happy.
2 · Colour

Blue when it goes well, ember when it doesn't

The grumpy side is a warm ember: burnt orange (#D9622B) for everyday grumpiness, deepening into red when Poulpy gets really cross.

The mood spectrum

Poulpy's colour follows his emotion, not just his side. The blue side stays close to the plush: a touch richer when proud, lighter and fresher while recovering. Missed sessions heat the ember up toward red. Tap a shade.

Light theme roles

Dark theme roles

With a red-leaning mascot, error messages move to a crimson (#C8264A) and always come with an icon and text, so a cross Poulpy is never mistaken for an error. The plush ember (#D9622B) is too light for white text, so buttons use the deeper ember 600.

3 · Poses

Poulpy in action

A sticker sheet for the big moments: end of session screens, records, rest days, notifications. The apps draw these same poses, generated from this page's drawing code by design/build-poulpy.mjs.

CockyNew personal record. Smug wink, one eyebrow up, a golden glow.Yeah. I did that.
StrainingMid-session and during heavy sets. Eyes squeezed, teeth gritted, a dumbbell nearby.Hnnngh… one more!
ChampionAll eight tentacles lit: a full octopus, or a plan block finished.Gold for the octopus!
Standing tallStretched up a little on his tentacles. A new goal set, a level reached.Look how big I am now.
ExhaustedRight after a hard session. Sweatband, panting, dripping.Worth it. Probably.
Side glanceTurned a little to the side. Tired between sets, or quietly waiting. The pose can carry other faces too.Just… give me a sec.
SleepingPlanned rest day. Nightcap on.Rest is training too.
Patched upPain logged or a rehab day. A plaster, a soft look, never grumpy.Easy today. I'm right here.
ShyEyes squeezed shut, big blush. Embarrassed, or welcoming you back after a break.Oh… you're back!
ThinkingPuzzled look and a thought bubble. Picking a plan, an unknown exercise.Hmm, which one…
SpinningHe spins on the spot, shown comic-style with motion lines. The loading indicator, with the front arc running in a loop.Wheee…
PoutingA session is overdue. Frowning and looking away.Hmph. We had a date.
FumingTwo sessions missed. Steam, shaking, deep red.EIGHT tentacles and none of them trained!

Poulpy never lifts his tentacles: every pose keeps the plush's shape and tells the mood with his face, his shade, props and little effects. More ideas for later: stretching, a tiny treadmill, sipping from a water bottle, dancing when the eighth tentacle lights.

4 · Typography

Round like the plush, readable mid-set

Both faces are free (SIL Open Font License), so they can ship inside the Android and iOS apps and load from Google Fonts on the web.

display 40/44Leg day, Poulpy approves
title 28/32Lower body strength
headline 21/25Back squat · 4 × 8 @ 60 kg
body 16/24Rest 90 s between sets. Keep the bar over mid-foot and stop one rep before form breaks.
label 12.5Next up · Romanian deadlift
timer 6401:27
Baloo 2Display and titlesHeavy, rounded, friendly. Used for headings, Poulpy's speech and big moments only.
NunitoBody, labels and numbersRounded terminals that match Baloo, with tabular figures so timers and rep counts don't jitter while they tick.
5 · Design tokens

One file, three platforms

A single design/tokens.json is the source of truth, generated into a Compose theme, SwiftUI colour assets and CSS variables. The mood shades are tokens too, so every platform paints Poulpy the same way.

{
  "color": {
    "poulpy": { "blue": "#3AA6E0", "ember": "#D9622B", "ink": "#141A26" },
    "lagoon": { "50": "#EAF6FD", "100": "#CDEBFA", "300": "#7FCBF0", "400": "#3AA6E0",
                "600": "#1574B0", "800": "#0C4A73", "900": "#082F4A" },
    "ember":  { "50": "#FFF1E8", "100": "#FFDCC7", "300": "#F4A473", "400": "#E8873F",
                "500": "#D9622B", "600": "#B4471C", "800": "#7A2C12" }
  },
  "mood": {
    "proud":   "#2C9CE0", "happy":  "#3AA6E0", "recovering": "#5DB4E6",
    "annoyed": "#E8873F", "grumpy": "#D9622B", "fuming":     "#C0352B"
  },
  "role": {
    "light": { "primary": "{color.lagoon.600}", "onPrimary": "#FFFFFF",
               "grumpy": "{color.ember.600}", "error": "#C8264A",
               "background": "#F4F9FC", "surface": "#FFFFFF" },
    "dark":  { "primary": "#5BBEF0", "onPrimary": "#06202F",
               "grumpy": "#FF9A66", "error": "#FF6B85",
               "background": "#0A1520", "surface": "#112230" }
  },
  "font":   { "display": "Baloo 2", "body": "Nunito" },
  "space":  { "xs": 4, "sm": 8, "md": 12, "lg": 16, "xl": 24, "2xl": 32, "3xl": 48 },
  "radius": { "sm": 10, "md": 16, "lg": 24, "pill": 999 },
  "motion": { "flip": { "duration": 700, "easing": [0.5, -0.35, 0.35, 1.4] } }
}

Spacing

Radius

Soft like stitched fabric. No sharp corners anywhere.

10
16
24
pill

Motion

One signature move: the flip, 700 ms with a small overshoot, like turning the plush inside out. Mood shade changes fade over 300 ms. Everything else stays quick (150 to 250 ms) and plain.

6 · In the app

The Today screen, on both sides

Poulpy sits in the middle of the tentacle ring. Only Poulpy and the header tint change with his mood; the rest of the screen stays calm so the app never feels like it's shouting at you.

Saturday 24 Oct Nice streak, 9 days
6 of 8 tentacles lit. One more session and I'm doing a little dance.
This week3 sessions · 2 h 10
Next session Lower body strength 45 min · Back squat, Romanian deadlift, split squat

Happy side. On track with the week, streak alive.

Saturday 24 Oct Poulpy is grumpy
Thursday's run is still waiting. 20 minutes and I flip back, promise.
This week1 session · 35 min
Catch up Easy treadmill run 20 min · Zone 2, 8.5 km/h, 1% incline

Grumpy side. A planned session was missed; the fix is offered right away and kept short.

7 · Poulpy's behaviour

The side is the status, the shade is the feeling

Which side shows says whether you're keeping your plan. The shade and the face on that side react to what just happened.

What happensMoodPoseRule
8 · Gamification

Ideas built from real octopus facts

Core ideas come first; the others can join later.

The flip

Core

Poulpy's side follows the mood rules above. Coming back is always one session away, and the flip animation plus a haptic tap is the reward for it.

Inspired by the plush itself.

Eight tentacles

Core

The ring has eight tentacles. Each finished session lights one, and a lit tentacle never goes dark: there is no weekly reset. The eighth gives the Champion pose and a "full octopus", and the next session starts a new ring.

Octopuses have eight tentacles, and Poulpy never grows more.

Mood shades

Core

Poulpy's colour moves along the spectrum with each emotion: a touch richer after a record, lighter while recovering, hotter ember the longer a session waits.

Octopuses change colour with their mood.

Shells in the den

Later

Achievements are shells Poulpy collects in his den: first 5 km on the treadmill, 10 sessions, a squat record, a full rehab block finished.

Octopuses decorate their dens with shells and stones.

Colourways

Maybe

Unlock seasonal skins for Poulpy after milestones (a coral reef edition, a deep-sea night edition). Purely cosmetic.

Octopuses can camouflage in a fraction of a second.

Flip the real one

Maybe

A home-screen widget and an optional morning nudge that says which side the real plush on your desk should show today.

Only works because the real Poulpy exists.

Ground rules for Poulpy

  • Grumpy is comic, never guilt. No "you failed", no streak-loss alarms. Even Fuming is a cartoon tantrum.
  • Pain and rehab always win: a hurt user gets the Patched up pose, never the ember side.
  • One way back, always short: the catch-up session offered while ember is the easiest one in the plan.
  • Notifications speak in Poulpy's voice at most once a day, and can be turned off without losing the mascot.
  • All of Poulpy's lines are written in French and English from the start.