Skip to main content

When Cameras Go Dark

Wildfire cameras live on mountain tops, on solar power, behind sketchy backhaul. They go quiet — for a minute, for an hour, sometimes for a season. The UI's job is to be honest about how quiet without alarming anyone unnecessarily, and it does that with an escalating tier system.

Before the theory, read the wall the way a dispatcher does — each tile below is rendered by the exact tier rules this page explains:

🧯 Triage the Wall

Six tiles, six silence tiers. Find the one the dispatcher asks for.

The tiers

OfflineTier measures silence in minutes since the last image: OFFLINE_1M (1), OFFLINE_10M (10), OFFLINE_60M (60), OFFLINE_24H (1440), and the terminal tier — OFFLINE_7D (10080). From one minute to seven days, tiles keep showing the last image under a 75%-black overlay with the camera name, an offline badge, and a "Click to see last image" dismiss — the picture is stale, but it might still be useful.

At seven days everything changes, for a concrete backend reason: images that old aren't stored, so imageUrl is null. There's nothing to fetch and nothing to dim. Instead of a loading skeleton that would spin forever, the tile renders a solid #353535 panel with the camera name, a white badge, and "Offline (7+ Days)" — and no dismiss button, because there's no image behind it to see.

No timestamp at all also means 7+ days

getOfflineBadge.tsx treats a camera with no lastImageTimeStr as OFFLINE_7D — the opposite polarity from the map, where a missing timestamp means "online". Same missing data, two deliberate defaults: the map assumes the best to avoid crying wolf; the tile assumes the worst because it must decide whether to attempt a fetch.

Where the overlay renders

Three surfaces make the same decision independently: the tile grid (CameraDetails — skips mounting the image component entirely at tier 7D, rendering the static background instead), and both Location View images — the 60° view (CameraImageWrapper) and the 360° pano (PanoImage), each swapping in the flat panel + OfflineWrapper when imageUrl is missing.

OfflineWrapper itself is a small component with two CSS personalities — .oneHour (75%-black, dismissible) and .sevenDays (solid, permanent) — chosen by tier. It also adapts to cramped tiles with a ResizeObserver: under 316 px wide it shrinks fonts and the badge and drops the "Click to see last image" button.

Wrapping up

Silence escalates: badge → dimmed last image → solid panel, with the seven-day cliff driven by the backend's own retention. And remember the polarity trap — missing timestamps read as online on the map and offline for 7+ days on the tile, both on purpose.

That's the tile grid chapter. Next feature: AI alerts — what happens when a camera thinks it sees smoke.