Skip to content

This website

← projects

meta · web

Can a fixed-viewport, no-scroll shell stay usable for real content?

Agent island JS

2.9 KB gz

gzip of the dist engine + readout bundles at launch, 2026-07-06 (budget ≤12 KB)

Steering maths tests

29

vitest run at launch — behaviours.test.ts (wander, align, flee, clamps, determinism)

Lighthouse score

100 · 100 · 100 · 100

home, production, real throttled Chrome — PHI-45 audit + launch re-run (hero case study: 99–100 perf across runs)

Astro 6 · TypeScript · Tailwind v4 · Cloudflare Pages · 2026

Problem

Portfolio sites collapse into templates: a scrolling page, a wall of cards, numbers nobody can check. The brief for this one was different — a fixed viewport where panels slide instead of scrolling, a live simulation of steering agents as the signature element, and a standing rule that no metric appears anywhere without a source.

Approach

Content is data: every project, note, and build-log entry is a markdown file with a schema-checked frontmatter, so adding one is a commit, never a code change. The shell is Astro with view transitions; the agents are a vanilla-TypeScript canvas island ported from my COS30002 steering coursework. The honest-numbers rule is enforced mechanically — a metric without a source field fails the build.

Architecture

A 200px rail and a 100dvh stage; five panel routes joined by directional slide transitions. One island owns the canvas: pure steering maths over an injected seeded RNG, an engine for the loop and DPR-aware sizing, and a readout that displays only live-measured values. CI runs type-check, build, and the steering tests on every push, then deploys to Cloudflare Pages.

Results

The metrics above are the build’s own receipts: the island’s gzipped size, the test count, and a Lighthouse card that stayed an em-dash until the M4 audit actually ran — and was re-measured, on the production domain, the day the site launched.

Reflection

The constraint is the design. No-scroll forces every panel to fit the viewport, which forces editing; the source-required schema forces every claim to carry its receipt. The build log on this site records the decisions as they happened, commit by commit.