Skip to content

Lab

Real Calgary data, with the whole pipeline showing.

Three small data products, built the way I’d want a team to build them: tested, documented and observable. Everything runs in your browser, and you can run each pipeline yourself against the live source.

Every lab has the same four parts

  1. 01

    Dashboard

    Charts that are SQL queries running in DuckDB in your browser. Every one shows its query.

  2. 02

    Ask the data

    Plain-English questions. Claude writes the SQL, the site checks it, your browser runs it.

  3. 03

    Tested pipeline

    Bronze, silver and gold layers with data tests and a contract. Refreshed weekly, and runnable live.

  4. 04

    Telemetry

    Every query’s latency, data downloaded, Core Web Vitals and analytics events, as they happen.

How it fits together

From public APIs to your browser. Most of it is static files, so it costs almost nothing to run.

  1. Sources

    01 · Public APIs

    • City of Calgary open data
    • NHL play-by-play
    Python extract code
  2. Weekly run

    02 · Airflow

    • dbt builds every layer
    • Tests and contracts gate the run
    • XGBoost retrains the model
    Airflow DAG
  3. Published

    03 · Static files

    • Parquet files and the model
    • A manifest of every run
    • dbt docs with lineage
    dbt docs
  4. In your browser

    04 · DuckDB-WASM

    • Loads only what a page needs
    • Runs every query locally
    • Live pipeline runs
    • Model training in Python
    Browser runner
  • Ask the data

    Your question and the schemas go to Claude. SQL comes back and runs in your browser.

  • NHL proxy

    Two allowed URL shapes, cached at the edge and rate limited.

  • Analytics

    Typed events go to Vercel Analytics. Telemetry stays in your tab.

The details, from the pipeline runner to the AI guardrails, are in how this site is built.

Telemetry

This tab only. Nothing here leaves your browser.

Core Web Vitals

LCP
…
waiting
INP
…
waiting
CLS
…
waiting
FCP
…
waiting
TTFB
…
waiting

Measured in this browser with the web-vitals library. INP appears after you interact.

Query engine

Engine
Not started
Start-up
–
Data downloaded
–
Tables loaded
–
Queries run
0
Errors
0
p50 latency
–
p95 latency
–