The interface holds no content. Everything you have read came from one JSON file, validated on load and resolved into a graph. Replace the file and this becomes your portfolio.
Content
portfolio.json in this repository
Schema
Version 1.0, validated with Zod on every load
Rendering
Next.js App Router. Entity pages are statically generated; only search, editing and media controls run on the client
Type
Newsreader for display and reading, IBM Plex Sans for the interface, IBM Plex Mono for data
Colour
Two values: oklch(0.12 0.005 260) and oklch(0.98 0.002 260). Everything else is derived from them
Motion
One page-load sequence on the map. Everything else responds to an action, and all of it respects reduced-motion