2026Record
Back to work

Portfolio Frontend

The site you are reading. One server-rendered page — no client-side router, no state library — and every project on it comes from the C# API in the same repository.

  • TypeScript
  • Next.js 16
  • React 19
  • Tailwind v4
  • Vercel
Decisions

01Server rendering with a 60 second cache

Why
The project list changes a few times a year. Rendering it on the server keeps the page fast and indexable without shipping a data-fetching layer to the browser.
Cost
A newly published project can take up to a minute to appear, and nothing on the page can be personalised per visitor.

02Retry the project list for 54 seconds

Why
The API sleeps on a free tier and takes about a minute to wake. A single 8 second attempt failed during that window, and the page rendered as if there were no projects at all.
Cost
With the API genuinely down, the first render blocks for the better part of a minute before falling back to the empty state.

03No admin area

Why
An authenticated CRUD would be the largest part of this codebase, used a handful of times a year by one person.
Cost
Publishing a project means writing the document by hand in the Firebase console.

04The home is a showcase, the reasoning is one click away

Why
An earlier version put every trade-off on the home page. The first screen became long, and a visitor had to read three of them before learning which projects even existed.
Cost
The strongest argument on the site now costs a click. Each card carries its decision count to make that click worth taking.

05Container width and reading width are separate

Why
The layout pinned everything to 64rem centred, which on a large monitor is a narrow column with empty space either side. Two classes now own it: one for the page container, one capping prose at 65 characters.
Cost
Two global classes in a codebase that otherwise uses inline utilities only. In exchange, width stopped being decided in eight different files.