Public data · Working application

CivicAtlas

Where is Maryland’s private-sector employment concentrated, and how do two jurisdictions compare?

Open CivicAtlas · Inspect the source code

A comparison you can check

CivicAtlas brings together employment, establishments, average annual pay and industry composition for Maryland’s 24 county-equivalent jurisdictions. Baltimore city and Baltimore County remain distinct. A county map and equivalent selectors let you compare two jurisdictions; the source inspector explains the numbers behind the view.

The application uses a 2024 private-sector employment snapshot from the Bureau of Labor Statistics Quarterly Census of Employment and Wages. These are covered workplace jobs, not a count of residents who work. The display preserves suppressed and missing observations as unavailable, and computes sector shares against the matching county private-sector total.

From published data to a working API

Python acquires official county CSVs and records their hashes. DuckDB validates identifiers and observations, then produces Parquet and a D1 import artifact. Census boundary geometry supplies the map. The production application queries Cloudflare D1 through a Worker API; React and TypeScript present the comparison and source evidence.

The snapshot is deliberately fixed. Source URLs, retrieval dates, definitions and transformation details make it possible to reproduce a displayed figure. Application deployments retain the data revision; importing a new snapshot is a separate checked action.

LayerResponsibility
Python + DuckDBAcquisition, validation and reproducible data artifacts
Cloudflare D1Published county totals, sector observations and provenance
Cloudflare WorkerParameterized public queries and explicit errors
React + TypeScriptCounty comparison, map and source inspector
GitHub ActionsValidation and deployment automation

Engineering choices that matter

  • FIPS identifiers stay strings, preserving leading zeros and jurisdiction identity.
  • Suppression is represented explicitly. An encoded zero in a withheld observation is not reported as a measured zero.
  • The public API supports specific queries; visitors cannot submit arbitrary SQL.
  • A service failure produces an error and a retry action. It does not substitute invented results.
  • Aggregate engagement events measure interactions without storing persistent visitor identifiers.

Check the sources

The BLS CSV data slices documentation explains the annual fields and disclosure conventions. Map geometry comes from the Census cartographic boundary files.

The repository contains acquisition and validation commands, the API, the application and the data manifest. The Sentinel demonstration shows a bounded static check attached to this pipeline.

A useful next conversation

Give me 30 minutes.
Let’s talk engineering.

I’m looking for an individual contributor role in data, AI or cloud engineering. Tell me what your team needs to build.

Email Pauline