Personal Website

The website you're browsing right now.

What's included

Homepage. With an introduction of me, a photo strip that could possibly be enhanced by integrating with Instagram, a work-history "Resume" panel with a downloadable CV, and a preview of my most recent articles.

Articles. A place for me to write and share posts, listed on their own page and sorted by most recent, with each post getting its own page.

Projects. Showcase my projects (including this very page), with a short description and a link to learn more about each one.

Dark mode. The site adapts to light or dark mode automatically, matching whatever the visitor's device is set to.

Screenshots

The technology

Backend. There's no separate backend server — the site runs on Next.js's App Router, which handles rendering and routing on its own. A couple of lightweight route handlers cover the RSS feed and sitemap.

Database. None needed. Content such as articles, projects, and my resume is stored directly as MDX and TypeScript files in the codebase, rather than in a database.

API layer. No REST or GraphQL API sits between frontend and backend here — Next.js's App Router renders pages directly, and the two route handlers mentioned above (RSS feed, sitemap) are generated straight from the same content files.

Frontend. Built with React and Next.js, with articles and project write-ups authored in MDX so text and layout can live side by side. Headless UI provides accessible navigation and menu behaviour.

Style. Styled with Tailwind CSS, including its typography plugin for article formatting, with automatic light/dark mode powered by next-themes.

Deployment. Hosted on Cloudflare, using OpenNext and Wrangler to run the site as a Cloudflare Worker.