Avatars for Longshift agents: soft, squishy colour blobs with readable eyes and small space-age details like antennae, halo rings, visor glints and a psychedelic swirl. They're inspired by 1968 retro-futurism, cute but not childish, and generated deterministically from each agent's ID. This is inspired-by work only, with no film characters, likenesses, stills or logos, and no copies of known mascots.
Each creature uses exactly one named palette with five roles: background, body, accent, ink (pupils, mouth) and light (eye whites, sheen). Background plus body cover at least 70% of the area, so the colour identifies the agent before the eyes do. Orange #FF6800 lives only in Tangerine Dream.
Bodies are organic: wobbly superellipses and metaball-like outlines built from smooth closed curves, never polygons. There are six body families: mochi, droplet, bean, amoeba, puff and lumpy-twin. Drips and lumps are allowed; hard corners aren't.
Fills only, with no outlines on the body. The only strokes are features: sleepy lids, mouth and antenna, at 2.4–3.8 units on a 100-unit grid, so they stay at least 0.8 px at 24 px. Ends are round.
Eye whites have a radius of at least 6.8 units (about 4.4 px across at 32 px), pupils are in ink, and there's one white glint per eye. Sleepy and visor eyes use thick strokes or high-contrast bands. Eyes always sit in the upper middle of the body.
One retro-futuristic detail per creature (antenna, nubs, tiny arms, a halo ring or a sparkle) and at most one texture (sheen, spots, an op-art swirl clipped to the body, or a drip).
The UI stays in Inter, calm and mostly empty. The creatures are the one place where colour gets loud.
#1B2A6B · #3D7BFF · #FF5FA2 · #0B1230 · #F4F1FF#5A0F2E · #E8335A · #FFC23D · #22050F · #FFF2E8#0E4A3F · #1FBF8F · #C6F24E · #03201A · #EFFFF8#3A1663 · #9B5CFF · #FF8FD1 · #170830 · #F7EEFF#3B1A0A · #FF6800 · #2FD3D3 · #1A0B03 · #FFF4EA#0D3B4A · #2EC4D6 · #FF7A59 · #04181F · #EFFBFDOrder: background · body · accent · ink · light
Every palette has to be recognisable as a plain blob before eyes or details are added.
Each proposal combines one body family, one named palette, one eye type and one space-age accent, spread across a family × palette matrix. Each is shown large and at 32 px (top right of each card) to check the eyes.
| Sapphire Lounge | Ruby Orbit | Emerald Lab | Amethyst Haze | Tangerine Dream | Teal Chrome | |
|---|---|---|---|---|---|---|
| mochi | 19 | 07 | 13 | |||
| droplet | 20 | 08 | 14 | |||
| bean | 15 | 03 | 09 | |||
| amoeba | 16 | 04 | 10 | |||
| puff | 11 | 17 | 05 | |||
| lumpy-twin | 12 | 18 | 06 |
The palette is always drawn first from the seed, so re-rolling any other trait never changes an agent's colour. One extra number from the seed sets the exact wobble of the outline, which is why no two mochis are identical.
| 1 · palette | Sapphire Lounge, Ruby Orbit, Emerald Lab, Amethyst Haze, Tangerine Dream, Teal Chrome |
| 2 · body | mochi, droplet, bean, amoeba, puff, lumpy-twin |
| 3 · eyes | pair, cyclops, three, sleepy, sparkle, visor |
| 4 · mouth | none, smile, o, wavy |
| 5 · appendage | antenna, nubs, arms, halo-ring, sparkle |
| 6 · texture | sheen, spots, op-swirl, drip, matte |
| 7 · frame | circle, squircle |
That's 6 palettes × 6 bodies × 6 eyes × 4 mouths × 5 accents × 5 textures × 2 frames, or 43,200 combinations, each multiplied by a continuous wobble seed.
The seeds are agent:0001 to agent:0024, and none of them were hand-picked.
Shown at 24, 32 and 48 px, plus a chat chip at 24 px.
id = "agent:" + agentId // stable ID, never the display name
seed = fnv1a32(id) // 32-bit hash
rand = mulberry32(seed) // tiny deterministic PRNG
palette = PALETTES[floor(rand()*6)] // ALWAYS the first draw
for trait in [body, eyes, mouth, appendage, texture, frame]:
t[trait] = OPTIONS[trait][floor(rand()*len)] // fixed order, never reorder
t.wobble = floor(rand()*1e6) // sub-seed for the outline
t = applyRules(t) // rules 1–5
outline = blob(t.body, mulberry32(t.wobble)) // 28 polar points → Catmull-Rom → cubic Béziers
svg = compose(t, palette, outline)
Each family is a polar function: a superellipse for mochi, a pointed top for droplet, a kidney shift for bean, 3rd and 5th harmonics for amoeba, abs-sine bumps for puff, and two blobs for lumpy-twin. Phases come from the wobble seed, and 28 points are smoothed into a closed cubic path.
Clip to the frame, then background, soft aura, appendage (behind the body), body, drip, texture and belly shade clipped to the body, sheen, the front half of the halo ring, sparkle, eyes, then mouth.
Palettes are curated, never random hex values. Eyes always use light and ink from the same palette. Reserve Tangerine Dream (#FF6800) for a share of agents, or for the main agent.
Each avatar carries role="img" and an aria-label with the agent's name, and it's never the only cue. Eyes meet the minimum size and 3:1 contrast. Creatures don't animate by default; a gentle squish on hover is optional and respects reduced-motion settings.
Cache the SVG string by key hash(id)+traitVersion. Rasterise 24/32/48/96 px PNGs at build time or on first use. Append new options at the end and bump traitVersion.
Users can lock or re-roll a single trait, and the colour stays because the palette is drawn first. The hash, the PRNG, the order of picks and the outline maths are part of the spec.