Colophon
How this site is built
A working reference for the stack, the typography, and the decisions behind them. Source lives at github.com/fraserporter.
Stack
- Shell
- Astro with static pre-rendering. The pages you're looking at right now.
- Case study
- Observable Framework,
mounted at
/projects/f1. Publishes the F1 analyses, reads Parquet files the pipeline drops on disk at build time. - Warehouse
- DuckDB, a single embedded file checked into my machine and rebuilt from Parquet on every pipeline run.
- Modelling
- dbt-core with the
dbt-duckdbadapter. Staging, intermediate, and mart layers, withdbt-expectationsfor the harder tests. - Ingestion & analysis
-
Python managed by uv.
httpx,pyarrow,pandas,duckdb,scipy— nothing exotic. - Orchestration
- just for the task runner locally, GitHub Actions for the scheduled refresh and the deploy.
- Hosting
- Cloudflare Pages.
fraserporter.co.uk301-redirects tofraserporter.com.
Design
- Typography
- Fraunces
for display,
Inter
for body,
JetBrains Mono
for code. All variable, served from Google Fonts with
font-display: swap. - Palette
- A warm off-white with a single burnished terracotta accent. Multi-series charts use a neutral ramp instead — the accent stays scarce on purpose.
- Scale
-
1.25 (major third). Generous but not showy. Two reading
widths:
68chfor prose,88chfor pages with charts.
Provenance
Design tokens live in a shared design/ folder
both apps import, so there's a single source of truth for
typography, colour, and spacing. The F1 case study draws on
Jolpica-F1
for historical results and
FastF1 for modern
lap-level telemetry. Both are open and freely licensed.