Personal portfolio and blog
The site you are reading. A static Next.js build with a Postgres-backed project catalogue, delivered one tracked story at a time.
- category
- personal
- year
- 2026
- status
- completed
- role
- Sole developer



What it is
This site. Next.js 16 with TypeScript and Tailwind, fully static. Projects live in Postgres and are read while the site builds. Blog posts and the experience timeline are Markdown and JSON validated at build time, so a bad field fails the build instead of the live page.
It is also a record of how it was made. Every change is a Jira story, one branch and one reviewed pull request, with content validation, type checks, tests, lint, formatting and a production build gating each merge.
- Fully static. Postgres is read at build time only, so no visitor ever waits on a database waking up.
- One design token set drives colour, spacing and radius, with a self-hosted type scale and a single accent reserved for links and live state.
- Metadata, JSON-LD and Open Graph images are generated per route from one module, and the build fails if a navigable route is missing from the sitemap.
- Full GitFlow with a tracked story behind every branch, and six CI gates on every pull request.
What I learnt
- The first attempt failed because code was written faster than it could be reviewed. The rebuild puts one story, one branch and one reviewed pull request behind every change.
- A green build proves the types line up, not that the right text reached the page. Several defects were only caught by reading the generated HTML.
- A syntax theme is text too. The code block colours were chosen by measuring contrast against this site's own background, not by eye.
What I would do next
Result figures on the other case studies, then the first blog posts after launch.
Performance and accessibility checks that run automatically instead of by hand.