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-duckdb adapter. Staging, intermediate, and mart layers, with dbt-expectations for 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.uk 301-redirects to fraserporter.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: 68ch for prose, 88ch for 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.