Claude Code · capacity contention atlas

The best hours to run
Claude Code sessions

When Anthropic's API is most likely to be under strain — full week, hourly, Amsterdam time (CEST), from real status-incident data. Lower index = quieter.

Best / quietestModerateAvoid / busiest
n=466 robust peak 14:00 UTC
Sparse window (<~5 incidents/hour-bucket) — the hourly shape is indicative, not robust. The day-of-week pattern still holds.
Visualization 01 · the matrix

Weekly heatmap — 7 days × 24 hours

Every hour of the week as one cell. A teal chevron-down marks the single quietest slot; a rose chevron-up marks the busiest. A red pin marks the current hour in Amsterdam local time. Hover any cell for details.

168 cells · Amsterdam local
Visualization 02 · the 24-hour dial

Radial clock — contention around the day

Midnight at the top, running clockwise. Each ring is a day (inner = Monday, outer = Sunday); each wedge is one hour. The quiet overnight arc opens up on the lower-left.

polar heatmap
Visualization 03 · the daily shape

Ridgeline — the rhythm of each day

Seven stacked profiles of the 24-hour curve. The twin humps — Europe-morning and the bigger Americas-afternoon — flatten dramatically on the weekend ranges at the bottom.

joyplot · x = hour 0–23
Visualization 04 · the leaderboard

Ranked slots — quietest vs. busiest

The twelve calmest windows to start a long run, and the twelve to avoid. Bars are proportional to the Contention Index.

top 12 each
Visualization 05 · the averages

Aggregates — by hour, and by day

Collapsing the grid two ways: the average shape of a day (left), and how the days themselves compare (right).

marginal means

By hour of day · averaged across the week

By day of week · averaged across 24h

Visualization 06 · the shift

How the busy hours moved

The same daily curve, three years overlaid (Amsterdam time, normalized to each year's own peak = 100). The afternoon crunch has crept earlier as US-daytime usage came to dominate.

year over year · UTC+2
Between 2023–24 and 2025–26 the afternoon peak migrated roughly 3 hours earlier — about 19:00 → 16:00 Amsterdam (17:00 → 14:00 UTC), tracking the rise of US-daytime demand. The day-of-week pattern, by contrast, barely moved (weekends stay quietest every year). Caveat: the 2023–24 line is low-sample (n=128) and hourly-noisy — read it as indicative shape only.
Behind the numbers

How we built this

A transparent, reproducible model built from real per-year incident distributions — not a live signal.

Source & method

The year-over-year shift

Caveats — read these

Raw inputs — the real per-era distributions that drive the model
2025–26 · blend · default
466 n · robust
2025
258 n · peak 13 UTC
2026
208 n · peak 14 UTC
2023–24 · sparse
128 n · peak 17 UTC

Per-hour profiles — index 0..23 = UTC 00:00..23:00, normalized to each window's own peak = 100:

HOUR_2023_2024 = [23,46,77,38,15,8,31,0,38,8,0,38,15,38,92,46,85,100,46,46,77,54,31,31] // n=128, peak 17 UTC, sparse
HOUR_2025      = [50,29,29,12,12,12,54,96,54,50,21,25,38,100,79,46,58,33,54,33,46,46,50,46] // n=258, peak 13 UTC
HOUR_2026      = [23,12,8,15,12,12,35,27,62,31,27,19,35,65,100,62,35,46,58,35,19,12,38,15] // n=208, peak 14 UTC

Per-day profiles — Mon..Sun, normalized to each window's own peak = 100:

DAY_2023_2024  = [93,89,78,100,78,19,19]
DAY_2025       = [62,100,98,80,66,29,25]
DAY_2026       = [81,100,100,42,54,44,12]
// Blend (default): MODERN[i] = renorm( (v2025[i]×258 + v2026[i]×208) / 466 )   renorm = ÷max ×100
// Grid: raw[day][H] = era.hour[(H−2+24)%24] × era.day[day]  →  index = raw / max(raw) × 100