2026
Portfolio + CMS
A personal portfolio site and the admin CMS that fills it. Every word on the public site — copy, projects, skills, notes, section order, even the accent colour — is a row in a database I edit through a CMS I also built. Two Next.js apps on Cloudflare Workers, over D1 and R2.
Two apps in one pnpm monorepo. apps/web is the public site; apps/admin is the CMS that fills it. They share a repository layer, a set of Zod schemas and a design-token package, and they run on the same Cloudflare Worker platform against one D1 database and one R2 bucket.
The rule the whole thing is built around is that content is data. There is no string of portfolio copy hardcoded in a component — the hero's headline, the robot's dialogue, the lines the console prints, which sections appear and in what order, the accent colour of an individual note: all of it is editable, and the public site is a rendering of whatever the database currently says.
The CMS has 19 areas and its own authentication: a password, then a six-digit code by email, with rate limiting in the database, a forgotten-password flow and a change-password page. It replaced Cloudflare Access, which had been guarding the app until the new login was built and verified.