Portfolio Website

Website & Dashboard

Portfolio Website

My personal site and the private control center behind it: a blog, projects, a live Last.fm music page, API keys and threat detection, all managed from one dashboard.

Technologies Used

Next.jsReactTailwind CSSMotionRechartsBunPostgreSQLDrizzle ORMBetter AuthZodResend

This is the site you're on right now, rebuilt from the ground up. The public side is where I introduce myself, show my work and write about how I build things. Behind it is a private control center where I run all of it, so nothing on the site is hard-coded: every word, image, link and icon lives in the database and can be changed without a redeploy.

The public site

  • Blog posts and project pages written in Markdown and stored in PostgreSQL, with a table of contents, linkable headings and related posts matched by tags
  • Generated Open Graph images, so every post has a proper preview when shared
  • A music page with what I'm listening to right now, listening stats, a 14-day chart and my top albums, artists and tracks from Last.fm, plus a live listening badge on the home page
  • A contact form that confirms the sender's email with a 6-digit code before a message is delivered
  • Private analytics with no cookies and no stored IP addresses, which honor Global Privacy Control and Do Not Track
  • Light and dark themes, subtle motion that respects reduced-motion settings, and a layout that works from phone to desktop

The control center

  • A Markdown editor with a live preview, image uploads, scheduled publishing and SEO fields, where saving updates the public site straight away
  • Site-wide editing for my profile, menu, authors, media and every piece of text on the public pages, with a searchable library of nearly 10,000 icons
  • Website and API analytics, with requests broken down by endpoint, key, status code and country
  • Two-factor sign-in with an authenticator app and backup codes

The API and security

  • A REST API with scoped keys, rate limits, daily quotas and IP and origin restrictions, where keys are shown once and stored only as a keyed hash
  • Twelve configurable detection rules for credential abuse, request spikes, invalid keys and scanning, with deduplicated incidents and email alerts
  • Honest labels: an unusual country is an anomaly, and only I can mark something a confirmed threat

How it's built

It runs on Next.js 16 and React 19, with Bun for tooling, Drizzle on PostgreSQL, Better Auth for sign-in and Zod validating every input. PostgreSQL also handles the rate limits, the job queue and image storage, so there's no Redis or object storage to run. Public pages are prerendered and revalidated, and monitoring happens after the response so it adds no latency to API calls.

Role & Responsibilities

I designed and built the whole site: the public pages and components, the dashboard, the database schema, the API gateway and the detection rules.