Know which corridors have actually recovered.

SurfaceState reads pavement condition straight from 1,200+ DOT cameras — dry, wet, slush, snow, ice — and publishes it every five minutes through a storm. Observed from imagery, never modeled from a forecast.

Pre-launch. No card, no spam.Open the live map

Live feed
awaiting observations
cameras in feed
confident reads now

The read comes from a photograph, and stays traceable to it

A DOT camera already points at the pavement. SurfaceState pulls the frame, scores the road surface inside a fixed region, and publishes the result with the confidence attached — roughly 100,000 observations a day, every five minutes per camera through a storm.

Kansas DOT traffic camera looking west on US-54 at I-135 during heavy snowfall. The highway is fully snow-covered with two dark wheel tracks worn through to the pavement.
Kansas DOT camera, US-54 at I-135 westbound — an unmodified public frame. The outlined region follows the carriageway, so the median, the gore, and the falling snow itself are never scored as road surface.
Published record
route
US-54
kind
traffic
camera_id
ks_us54_i135w
observed_at
2026-02-11 07:42:15
condition
snow
confidence
0.93
status
ok

Every field traces to one frame from one camera at one timestamp. Nothing here is interpolated from a neighbouring station or a forecast model.

The frame and its source are real. The marked fields are illustrative — SurfaceState is pre-launch and publishes no classifier output for this camera yet.

When we can’t tell, we say so

Cameras ice over, go dark, and return frames too old to trust. A product that quietly renders those as clear road is worse than no product. Every ungated camera keeps its place on the map and says what went wrong.

Condition — hue
  • dryBare pavement, no film
  • moistDamp, no standing water
  • wetStanding water, spray
  • slushSnow-water mix, tracked
  • snowSnow cover over pavement
  • iceIce or compacted snow
Mark — source
  • cameraRoadside traffic video, wide framing
  • rwisSensor mast, framed on the pavement

Six classes and nothing between them. A camera reports one of these or it reports no read — there is no averaged, in-between surface.

Confidence — brightness
  • 95%
  • 75%
  • 55%
  • 40%

One hue, four confidence levels. Brightness never falls below a floor, so a marginal read stays visible on the map without ever looking like a confident one.

Not gated
  • Low confidencelow_confidenceRead exists but fell below the gate
  • StalestaleLast frame is too old to trust
  • No datano_dataCamera offline or returning nothing

These three deliberately share one mark. The map answers “is there a read here” — not which way it failed. Open the camera for that.

Condition drives hue and confidence drives brightness — never blended, so a dim correct read never looks like a bright wrong one.

Recovery is the part nobody reports

The storm leaving is public information. What it left behind is not. Plow priority, traffic volume, pavement temperature and sun angle mean two corridors forty miles apart clear hours apart — and that gap is where a held load costs money it didn’t need to.

One storm, three corridors, three different mornings

24 h · hourly
drymoistwetslushsnowiceno read
I-80 W
MP 100–140
+5 h
after storm
I-35 N
MP 70–110
+8 h
after storm
US 20 E
MP 145–180
24 h+
not clear
00:00storm exits24:00

Illustrative, reconstructed from the storm-front test dataset in this repository. SurfaceState is pre-launch and has no customer deployments to show.

A feed first, an interface second

One GeoJSON artifact, refreshed on the same cadence as the map, with the confidence and the status on every feature. Use it as a layer in the routing stack you already run, or use our map — the record is the same either way.

conditions.geojsonAPI v1
{
  "type": "Feature",
  "geometry": {
    "type": "Point",
    "coordinates": [-93.5711, 42.4093]
  },
  "properties": {
    "camera_id": "rwis_84-01",
    "kind": "rwis",
    "route": "I-35",
    "condition": "snow",
    "confidence": 0.91,
    "observed_at": "2026-02-11T02:41:07Z",
    "age_seconds": 143,
    "model_version": "sv-2026.01",
    "status": "ok"
  }
}

Tell us which corridors you run

We’re expanding corridor by corridor, and the lanes our early users actually dispatch on are the ones that get wired up first. Say which ones matter to you and you’ll get access when they go live.

Or write to hello@surfacestate.com — and the live map is open now, no account needed.