Year-long keogram

41.2165°N · 85.8334°W · ~2M frames · 2025

Winona Lake, 2025

A year of sky, every 15 seconds.

↓ scroll


Explorable · Cloud × Elevation

Same place, different sun, different sky.

Each clip is one frame per day at a chosen sun elevation, filtered to days under a chosen cloud-cover threshold. Drag the sliders. Notice how the year fills in or thins out as you tighten the clouds.

method: filter_weather.py --max ${cloud$} → fixed_clock.py --elevation ${deg$}
0%
0%5%10%20%40%60%80%100%
−45°−30°−15°15°30°45°

Solar Locked

Stop the sun. Watch the seasons.

The sun returns to the same point in the sky on different days at different times. Pick those moments and you get a video where the world ages while the light holds still.

method: solar_locked.py finds frames matching az/el within 1° tolerance, one per valid day.
Spring & fall noon az 180° · el 30° sun pinned due south, mid-arc
Low winter sun az 180° · el 25° as low as the noon sun ever gets here
Summer zenith az 180° · el 60° only the warmest months reach it
East at dawn az 90° · el 15° sunrise locked in place
West at dusk az 270° · el 15° sunset locked in place
Late afternoon az 220° · el 25° long shadows, golden bias

Ghostless · Temporal Median

A year with the weather removed.

For each pixel, take the median across a sliding window of days. Anything that moved — clouds, rain, a passing bird, branches in the wind — gets statistically erased. What's left is a still landscape, slowly aging through the seasons.

method: cloud_removal.py with a 14-day rolling window, 1-day step.

temporal median · 14-day window · year


Sun Paths

The arc of one day, painted on one frame.

Every 15 minutes through a single day, lighten-blended into one image. The sun draws its own arc. Stand the four key dates side by side and the year's tilt is visible at a glance.

method: time_stack.py --interval 15 on solstices and equinoxes.
Winter Solstice sun path
Winter Solstice 2025-12-21
Spring Equinox sun path
Spring Equinox 2025-03-20
Summer Solstice sun path
Summer Solstice 2025-06-21
Fall Equinox sun path
Fall Equinox 2025-09-22

Star Trails

Hours of stars in a single still.

On clear nights, every frame from dusk to dawn is blended with a "lighten" mode — only the brightest pixel at each location survives. Stars become arcs, planes become dashes, the moon becomes a streak.

method: time_stack.py with lighten blend, full night, only on nights with <10% cloud cover.

Keograms

A whole month in one strip.

A vertical column of pixels from the same place in every frame, stacked horizontally. Time becomes the x-axis: morning on the left, evening on the right; for monthly keograms, day-by-day across the strip.

method: keogram_day.py — single date or date-range mode.
Keogram for 2025-03
2025-03
Keogram for 2025-04
2025-04
Keogram for 2025-05
2025-05
Keogram for 2025-06
2025-06
Keogram for 2025-07
2025-07
Keogram for 2025-08
2025-08
Keogram for 2025-09
2025-09
Keogram for 2025-10
2025-10
Keogram for 2025-11
2025-11
Keogram for 2025-12
2025-12
Keogram for 2026-01
2026-01
Keogram for 2026-02
2026-02

Storm Chaser

The year's most violent hours.

Pixel intensity has high temporal variance during storms — fast cloud motion, abrupt darkening, lightning. Score every hour, sort, take the worst.

method: storm_chaser.py — variance over 1-hour windows; top 20 stitched into a montage.

top 20 stormy hours · stitched montage

Top 5, individually

#1
#2
#3
#4
#5

By the Numbers

A year, indexed.

Pulled live from the same parquet file the renderers read.

total frames
days of data
% under 20% cloud
% over 80% cloud
longest clear streak (h)
stormy hours

Daily mean cloud cover