Ask Weather
Ask a weather question in plain English. Gemini writes the PostgreSQL, an MCP server runs it read-only against 9.3 million rows, and the query is displayed beside the chart.
Ask a weather or football warehouse a question in plain English, explore interactive visualizations, or query the REST API — each one running now, on data refreshed by automated pipelines.
I design, build and operate all of it end to end: the infrastructure, the two PostgreSQL warehouses, the pipelines that feed them, the AI agents and analytics on top, and four browser games.
Both warehouses follow the same design: validate data on ingest, serve it read-only, and layer a plain-English agent and an interactive explorer on top.
Hourly observations and forecasts from NOAA and Apple WeatherKit, loaded by automated AWS pipelines into PostgreSQL on EC2.
Ask a weather question in plain English. Gemini writes the PostgreSQL, an MCP server runs it read-only against 9.3 million rows, and the query is displayed beside the chart.
Apple WeatherKit forecasts loaded every four hours into a self-managed PostgreSQL database on AWS EC2, orchestrated by Lambda and EventBridge.
Hourly observations for 112 US airport stations, refreshed nightly from NOAA's GHCNh Parquet files into self-managed PostgreSQL on AWS EC2 by Lambda and EventBridge.
Historical observations and forecasts from the two PostgreSQL databases behind the visualizations, served as JSON with interactive documentation and an OpenAPI specification.
Every FBS college football and NFL play since 2014, sourced from ESPN: one row per play, with every player identified by a stable ID.
Ask about any college football or NFL play since 2014. Gemini writes the SQL, a read-only MCP server for each league runs it, and the query is displayed with the answer.
Filter every play by league, side of the ball, team, player and outcome. A Dash application on a DuckDB snapshot, with drill-down and CSV or Excel export.
Rebuilt every morning on EC2 with dbt. More than 70 data tests run for each league before new plays go live, and a failure leaves the previous day's data in place.
Smaller applications, each built on a different stack.
A typing-rhythm coach for writing AI prompts that measures burst speed, thinking pauses, corrections and spelling from the timing of every keystroke.
A recipe manager in Flask and PostgreSQL: search, print to PDF, or transcribe a recipe card from a photo with Claude or Gemini.
Interactive Bokeh applications, built in Python and served directly from the weather warehouse.
Forecasts from the Apple WeatherKit REST API, refreshed every four hours by an automated pipeline.
Explore
Historical and forecast metrics side by side, to support discovery and analysis.
Explore
SQL window functions (LAG) derive the hour-over-hour pressure metrics behind each point.
Explore
Detailed historical data presented concisely, to support pattern recognition.
ExploreReliable data for decision-makers, and the tools to act on it — including interfaces that answer questions in plain English.
Designing and operating relational and document databases — PostgreSQL, MySQL, SQLite and MongoDB — and building ETL and EtLT pipelines in Python, SQL and Bash that ingest JSON, CSV, Parquet, XML and YAML. Production pipelines run unattended on AWS Lambda and EventBridge, load into a self-managed PostgreSQL instance, back up to S3 nightly, and raise an alert when a run fails.
Explore the REST API docsBuilding robust data models in Python with Pandas, Polars, PySpark and SQLAlchemy. Answering difficult questions with advanced SQL — CTEs, window functions and CASE expressions — and applying sound statistical and aggregation methods so that the conclusions drawn from the results hold up.
Connecting language models to a data warehouse without compromising its security. An LLM agent reads the live schema and writes the PostgreSQL; a Model Context Protocol server executes it under a SELECT-only role, behind a query guard and a statement timeout. The web tier holds no database credentials and builds no SQL, and a token budget that fails closed caps what public use can cost. One tested security model now serves two warehouses, weather and sports.
Try Ask WeatherDelivering the work as production software. Flask, FastAPI, Streamlit, Dash and Bokeh applications, and plain-JavaScript games, are self-hosted on a single EC2 instance behind nginx, with TLS from Let's Encrypt renewed automatically and each application running as its own systemd service, most with a dedicated service user and a memory ceiling. An analytics pipeline captures every request into PostgreSQL for a live dashboard, and every site is measured rather than assumed: Lighthouse audits, security-header grades and Core Web Vitals from real visitors.
View the data visualizations