System

From provider telemetry to explainable traffic state

Colorado Traffic Tracker turns live road speeds and CDOT reports into a clear view of current and past conditions on I-25 and I-70. It keeps history, handles imperfect source data, and explains when information may be delayed.

131 miof monitored highway
0.5 mistable road sections
2 → 1live feeds, one coordinated view
One timelinecurrent and archived data

How it works

Collect, organize, explain

  1. 01
    Collect

    Read current speeds from TomTom and road reports from CDOT.

  2. 02
    Organize

    Keep the tracked miles, place speeds on precise road markers, and follow incidents over time.

  3. 03
    Explain

    Show off current conditions alongside historical averages and offer truthful answers if data is delayed.

A closer look

How outside data becomes the dashboard

Each stage has one job. Follow either traffic speeds or road incidents from its source to the screen.

Data movement Control and coordination
Routes ServiceCorridor & Geometry Authority

Defines the tracked parts of I-25 and I-70 instead of depending on a provider to describe the roads.

  • Road and directional geometry
  • Mile-marker ranges and anchors
  • Checked configuration at startup
TomTomTraffic Flow

Shows how traffic is moving now, alongside the speed drivers could expect in clear conditions.

CDOT / COtripIncidents & Planned Events

Turns detailed reports about crashes, closures, construction, and planned events into the updates drivers can use.

Ingest Service

Clean, place and protect incoming data

Source feeds can be limited, late or incomplete, so each update is checked before it changes public data.

Pipeline 01

Traffic speeds

  1. Request data within the TomTom source budget
  2. Decode provider road data
  3. Keep only the tracked corridors
  4. Project speeds onto the monitored roadway
  5. Store and update stable 0.5-mile road sections

Each successful collection refreshes the current corridor picture while retained snapshots build history.

Pipeline 02

Road incidents

  1. Read the latest CDOT report
  2. Keep reports on tracked mile markers
  3. Use clear categories, status and locations
  4. Match the same incident across updates
  5. Publish only a complete checked snapshot

An incident keeps its history across updates.

A failed or incomplete update does not replace the last complete report.

PostgreSQL / TimescaleDBCurrent, historical and control state

History is a long-term asset.

Current

Corridor speeds
Half-mile road state
Current incidents

History

Traffic and speed zones
Hourly road sections
Incident changes

Control

Provider health
Request budgets
Scheduled work

Queries

Live and archived views
Summary calculations
Time-series support

Older rows move into queryable archive tables instead of being deleted.

API ServiceQueries, comparisons and dashboard data

The dashboard and public API share one service but use separate routes.

Live

Corridor summaries
Incidents
Half-mile road state
System health

History

Traffic samples
Speed zones
Replay windows
Hourly map data

Patterns

Historical baselines
Trends and hotspots
Unusual slowdowns
Short local trends

Delivery

Dashboard responses
Map geometry
Bounded public reads
Cache and rate limits

Web DashboardPrimary Product Surface

Current conditions, historical comparisons, speed zones, incidents, replay, corridor maps, and clear system health.

Fast answers, backed by retained history
Spatial projection

Scattered road data becomes stable half-mile sections.

This makes locations consistent even when the source geometry changes.

Incident lifecycle

Incidents keep a useful history.

First-seen time, last-seen time, and status persist across provider updates to build an extended historical reference.

Historical continuity

Older traffic remains available.

Live and archived rows share one read path, so long-range views keep growing over time.

Production runtime

A small, deliberate deployment

InternetPublic visitors
CaddyTLS + routing
Hetzner VPSUbuntu host
Docker Compose Inside the VPS
RoutesGeometry IngestCollection APIDelivery PostgreSQLHistory

Four isolated containers with explicit health checks. The dashboard is served by the API container.

Operations & recovery

Checked beyond “is it running?”

Recurring safeguardsStart · Detect · Preserve · Restore
LifecycleAutomatic startup and controlled updates
HealthContainer and data-freshness checks
BackupsDatabase snapshots and weekly off-site copies
RecoveryTested restores and local recovery drills
What gets checked
  • Traffic age
  • I-25 flow
  • I-70 flow
  • CDOT age
  • Quota
  • Site access
  • Backup age
  • Disk space

Engineering verification

Checked before release

Every change travels the same visible path. Independent gates check the application, browser, recovery tools, and backup client.

01 · Change Focused branch

One clear scope

02 · Automate GitHub Actions

Pinned toolchain

03 · Verify Required gates

Results collected

04 · Review Reviewable build

Evidence attached

Required checks Six ways to catch a bad release.

Each gate covers a different failure mode. A release is ready only when the applicable set is clear.

  • ApplicationUnit + integration
  • CoverageJaCoCo
  • MutationPIT
  • RecoveryResilience scripts
  • DashboardBrowser regression
  • BackupWindows client

Current operational state

Is the traffic data current?

Health is based on when data was successfully observed and comparatively verified, not whether traffic speeds changed.

Reading dashboard health…
Checking

Reading operational status…

The application is checking flow freshness, CDOT snapshot freshness, and TomTom provider state.

Technical health details Waiting for checks

Waiting for the status response…

What the states mean

Healthy
Both corridors have recent usable speeds, CDOT reports are fresh, and the traffic source is reporting normally.
Degraded
The site can still show traffic, but at least one named check is late or unavailable.
Out of service
No monitored corridor has recent usable speeds. One unavailable TomTom account is not an outage while another can continue.

Background monitoring

The server reports externally twice daily. It allows one hour for traffic and CDOT freshness, warns after eight days without an off-site backup, and warns at 10 GB of available disk space.

Every warning includes what happened and a next action.