Longshift.Design study · Agent avatars · Oct 2026 · Internal draft
Design study · v2 creatures

Every agent is
a little space blob.

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.

1 · Style brief

Colour first, then a creature.

Colour is the core

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.

Shapes

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.

Line and weight

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.

Eyes stay readable

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.

Space-age, lightly psychedelic

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).

Page vs avatar

The UI stays in Inter, calm and mostly empty. The creatures are the one place where colour gets loud.

Named palettes

Sapphire Lounge#1B2A6B · #3D7BFF · #FF5FA2 · #0B1230 · #F4F1FF
Ruby Orbit#5A0F2E · #E8335A · #FFC23D · #22050F · #FFF2E8
Emerald Lab#0E4A3F · #1FBF8F · #C6F24E · #03201A · #EFFFF8
Amethyst Haze#3A1663 · #9B5CFF · #FF8FD1 · #170830 · #F7EEFF
Tangerine Dream#3B1A0A · #FF6800 · #2FD3D3 · #1A0B03 · #FFF4EA
Teal Chrome#0D3B4A · #2EC4D6 · #FF7A59 · #04181F · #EFFBFD

Order: background · body · accent · ink · light

Palette-only test

Every palette has to be recognisable as a plain blob before eyes or details are added.

Sapphire Lounge
Ruby Orbit
Emerald Lab
Amethyst Haze
Tangerine Dream
Teal Chrome

Avoid

2 · Twenty creature proposals

Six blob families, six palettes, twenty crew.

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.

32 px
01 · Mochimochi · Sapphire Lounge · pair eyes · antenna
32 px
02 · Dripdroplet · Ruby Orbit · visor eyes · nubs
32 px
03 · Beanbean · Emerald Lab · sparkle eyes · arms
32 px
04 · Amoamoeba · Amethyst Haze · sleepy eyes · halo-ring
32 px
05 · Puffpuff · Tangerine Dream · three eyes · sparkle
32 px
06 · Twinlumpy-twin · Teal Chrome · cyclops eyes · antenna
32 px
07 · Gloopmochi · Emerald Lab · pair eyes · nubs
32 px
08 · Pipdroplet · Amethyst Haze · visor eyes · arms
32 px
09 · Kidneybean · Tangerine Dream · sparkle eyes · halo-ring
32 px
10 · Wispamoeba · Teal Chrome · sleepy eyes · sparkle
32 px
11 · Nimbuspuff · Sapphire Lounge · three eyes · antenna
32 px
12 · Duolumpy-twin · Ruby Orbit · cyclops eyes · nubs
32 px
13 · Squishmochi · Tangerine Dream · pair eyes · arms
32 px
14 · Dewydroplet · Teal Chrome · visor eyes · halo-ring
32 px
15 · Limabean · Sapphire Lounge · sparkle eyes · sparkle
32 px
16 · Zapamoeba · Ruby Orbit · sleepy eyes · antenna
32 px
17 · Fluffpuff · Emerald Lab · three eyes · nubs
32 px
18 · Bubbleslumpy-twin · Amethyst Haze · cyclops eyes · nubs
32 px
19 · Momomochi · Sapphire Lounge · pair eyes · halo-ring
32 px
20 · Tadpoledroplet · Ruby Orbit · visor eyes · sparkle

Family × palette matrix (proposal numbers)

Sapphire LoungeRuby OrbitEmerald LabAmethyst HazeTangerine DreamTeal Chrome
mochi190713
droplet200814
bean150309
amoeba160410
puff111705
lumpy-twin121806
3 · Creature trait system

Palette first. Then body, eyes, mouth, accent, texture.

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 · paletteSapphire Lounge, Ruby Orbit, Emerald Lab, Amethyst Haze, Tangerine Dream, Teal Chrome
2 · bodymochi, droplet, bean, amoeba, puff, lumpy-twin
3 · eyespair, cyclops, three, sleepy, sparkle, visor
4 · mouthnone, smile, o, wavy
5 · appendageantenna, nubs, arms, halo-ring, sparkle
6 · texturesheen, spots, op-swirl, drip, matte
7 · framecircle, squircle

Compatibility and contrast rules

1Eye whites use the palette's light colour and pupils use ink; their contrast against the body must be at least 3:1.
2Three eyes get no mouth, and visor eyes swap a wavy mouth for a smile, to keep the face uncluttered.
3Lumpy-twin bodies swap arms for nubs, because arms collide with the second lump.
4The op-swirl texture doesn't combine with three or sparkle eyes, so it falls back to sheen.
5One accent and one texture at most; the accent colour appears in at most three places.

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.

4 · Examples

Five agents, seeded from their IDs.

AtlasRuby Orbit · amoeba body · cyclops eyes · mouth none · halo-ring · drip
NovaRuby Orbit · mochi body · visor eyes · mouth smile · sparkle · matte
RelaySapphire Lounge · amoeba body · cyclops eyes · mouth o · antenna · sheen
QuillTangerine Dream · puff body · cyclops eyes · mouth smile · halo-ring · matte
SableRuby Orbit · bean body · sleepy eyes · mouth wavy · nubs · sheen

24 seeded variants

The seeds are agent:0001 to agent:0024, and none of them were hand-picked.

seed 0001
seed 0002
seed 0003
seed 0004
seed 0005
seed 0006
seed 0007
seed 0008
seed 0009
seed 0010
seed 0011
seed 0012
seed 0013
seed 0014
seed 0015
seed 0016
seed 0017
seed 0018
seed 0019
seed 0020
seed 0021
seed 0022
seed 0023
seed 0024

Small sizes in context

Shown at 24, 32 and 48 px, plus a chat chip at 24 px.

243248AtlasAtlas · Draft ready for review
243248NovaNova · Draft ready for review
243248RelayRelay · Draft ready for review
243248QuillQuill · Draft ready for review
5 · Builder note

Same ID, same creature, forever.

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)

Blob 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.

Layer order

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.

Palette constraints

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.

Accessibility

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.

Caching

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.

Overrides and versioning

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.