Growth lab — pixel-by-pixel

Diagnosis of the bumpiness: the old pulse wasn't smoothed by the compositor, so the browser re-rasterized the dot at every integer pixel size — an 8 px dot crossing 80%→100% only spans ~2 real pixels, hence visible jumps. All candidates below run on a promoted compositor layer (will-change): the GPU interpolates the rasterized texture continuously, i.e. genuine sub-pixel growth. Cycle slowed to 3.6s and the easing is near-sinusoidal so velocity never jumps. Motion range: smallish (55%) → max (100%), as requested.

1 · The mark — Helsinki & Tallinn (growth motion)

XL dot (0.28em), capitals, centred middle dot, motion = ① grow. This is the exact rendering both sites would ship.

HelsinkiLive

Elävät tapahtumat Helsingissä ENSV

TallinnLive

Elavad üritused Tallinnas ENFIRU

2 · Growth candidates — pick by feel

All grow smallish → max on the same 3.6s near-sinusoidal cycle. ④ is the old pulse kept as an honest A/B reference.

HelsinkiLive

① grow
① grow — 55%→100%→55%, pure composited scale + slight dim at minimum. The dot visibly swells and settles.

HelsinkiLive

② grow soft
② grow soft — identical motion + 0.45px edge blur. The soft edge guarantees no intermediate size can snap to the pixel grid; this is the safest "pixel-by-pixel" rendering on standard (1x) displays.

HelsinkiLive

③ bloom
③ bloom — one-directional: grows 50%→100% over ~75% of the cycle, holds, dissolves softly, grows again. Never reverses — pure "coming alive" each cycle.

HelsinkiLive

④ old pulse — reference
④ the old 2.4s pulse — unpromoted, 80% swing — kept so the difference is undeniable.

3 · The mark beyond the header

XL dot system carried to the app icon — the dot-alone at XL weight is the strongest tiny-size mark.

H
letter + dot
the dot alone · XL
Tallinn blue