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
Public JSON at https://raw.githubusercontent.com/nomi181472/portfolio-os/refs/heads/main/portfolio.json, fetched 2026-10-06T12:09:06.585Z
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