VESPER / real-weather transition lab local derivative · Open-Meteo
vesper
Type a city and state to let the actual sky choose her body.
reduced motion honored — permanent stillness, by request
01 — THE READ, CONFIRMED

Five bodies, one nervous system.

The assets confirm the thesis: you never drew a mascot, you drew five metabolisms wearing the same soul — startled storm, smug snow, unfbothered rain, golden idle, leaned wind. v1 seats all five PNGs inside the displacement wrapper, crossfades them like your funnel does, and borrows the golden body for night under moonlight (hue-shifted, dimmed — honest, the way is_day was honest). No logo anywhere. On purpose.

T-01

Nervous system, not costume

The faces already carry the emotion; the engine carries the body language. Amplitude, tempo, stillness, squish — the PNGs just make the internal weather visible from the outside.

T-02

Alive reads as irregular

De-synced periods, asymmetric attack/release, 4–12s holds. The stormy asset even ships baked-in shiver lines — the jitter channel now agrees with the artwork instead of fighting it.

T-03

Unbranded is a stance

A logo would make it a product; anonymity makes it a weather spirit. The experience is the brand. This page seats that decision into the footer and never asks again.

02 — WORKING NOTES

What’s seated, what’s still a sketch.

Status tags are honest. “Seated” means running in the stage above right now.

NOTE 01 seated

Metabolism per state, crossfade between.

Parameter crossfade (~1.4s) plus a two-layer opacity crossfade for the bodies — the dip-swap-fade funnel from your weather page, upgraded to never cut. Sky dissolves via registered @property colors at the same tempo.

NOTE 02 seated

One noise field, everything drinks from it.

Character drift, rain shear, snow wobble, gust streaks and halo parallax all sample the same seeded fbm. A gust visibly passes through everything at once — most of “alive” is that single trick.

NOTE 03 seated

Stillness is a feature — budget for it.

The snowy asset arrives half-asleep; the engine now agrees. During holds, amplitude eases to zero and the halo dims a touch while weather keeps falling around a creature doing absolutely nothing. Idle ≠ broken.

NOTE 04 sketch

Telemetry as an easter egg in the app.

Long-press the logo-that-isn’t-a-logo → scope + channel readout slide in. Additive, never required, accessibility intact. Stays a sketch until the weather page wants it.

NOTE 05 seated

Voice on transition, not just on demand.

State flips earn exactly one muttered line in the subtitle strip; taps stay conversational. The difference between ambient and chat is one sentence of restraint.

NOTE 06 seated

The PNGs survive the squish.

Proven live above: feTurbulence + feDisplacementMap sits on the wrapper, so all five assets warp, breathe and settle with zero per-image authoring. Missing file? A drawn placeholder steps in via onerror — the page never breaks.

03 — MOTION SIGNATURES

Per-state metabolism, as run above.

StateX ±pxY ±pxθ ±°TempoStillnessSquish pxAtmosphere
clear762.20.85×medium2.8dust motes
rainy64.51.80.80×medium3.2sheared rain
snowy561.40.50×heavy2.6noise-driven snow
stormy1193.61.50×rare5.5rain + lightning
windy1353.01.15×low3.4gust streaks
night541.60.62×heavy2.2twinkling stars

Channel periods de-synchronized by design — X ≈ 8.7s · Y ≈ 12.1s · θ ≈ 10.5s · S ≈ 17.4s — no composite loop for minutes.

04 — ASSET SEATING

Where each body stands.

  • Five bodiesclear / rainy / snowy / stormy / windy → your five PNGs, referenced by filename in one ASSET_FILES map at the top of the script. Rename there if your filenames differ; nothing else moves.
  • NightBorrows the golden clear body under brightness(.64) · hue-rotate(168°) — moonlight, not a seventh drawing. Same honesty as is_day driving night in the weather page.
  • FallbackAny missing file triggers onerror → a drawn placeholder ghost seats itself in that layer. The stage degrades gracefully, never blank.
  • No logoReferenced nowhere, requested nowhere. An experience doesn’t wear a badge.