Skip to content
Marko Ivanovski

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
  • Drizzle ORM
  • Next.js
  • PostgreSQL
  • Tailwind CSS
  • TypeScript
  • Vercel
Screenshot of the home page on desktop, from Personal portfolio and blog.
Screenshot of the experience timeline on the home page, from Personal portfolio and blog.
Screenshot of the projects page with the filter drawer open, from Personal portfolio and blog.

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

  1. 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.
  2. 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.
  3. 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.