2026-08-24 · 3 min read
Rebuilding this site from scratch
This site has been through a few false starts. The most recent one paired a Strapi backend with a Next.js frontend - reasonable on paper, but it meant running and securing a CMS I didn't actually need, just to manage a portfolio and a blog. That attempt got abandoned mid-build, and the repo sat in an inconsistent state for a while: a frontend/ directory that had quietly been dropped from git history, and a backend/ directory that was deleted on disk but never committed as gone.
Starting over, the goal was narrower and more deliberate: host on AWS Amplify so I'm not managing a server myself, keep the whole stack in Next.js so the public site and a secure admin area (auth, stats, communications, post management) can live in one app, and treat security and documentation as first-class from day one instead of an afterthought.
The DNS bug
Before any of the rebuild work, brandontwilliams.info had never resolved correctly since I transferred it from GoDaddy to Route 53. Turned out to be a classic mismatch: the domain registration's name servers didn't match the hosted zone's actual NS records - almost certainly from a hosted zone getting deleted and recreated at some point (Route 53 mints a new random set of NS hostnames every time) without the registrar delegation being updated to match. Fixed it by copying the hosted zone's real NS records over to the domain registration. It also explained a second mystery: an old, abandoned Amplify app had a permanently failed custom-domain association for this exact domain, because it could never see the DNS records it needed to verify ownership.
What's actually running now
Next.js on the App Router, Tailwind, shadcn/ui components on Base UI primitives, a dark-navy-and-cyan design system sized for a security-minded IT professional's site rather than a creative agency's, and a blog (this post) running on MDX files in the repo for now, with a migration path to a database-backed admin CMS once the auth-gated admin area gets built.
More on that admin build in a future post.
Update (2026-08-27): the admin build
That "future post" teaser above turned into real work faster than expected. There's now a real, authenticated admin area - multi-factor required, no public sign-up path - for managing posts (this one, in fact), portfolio projects, contact messages, and site status, all backed by a proper database instead of the flat files I started with.
Deployment stayed simple on purpose: a push to the main branch runs the test suite and ships straight to production, no servers to patch and no deploy scripts to babysit.
The rest of the time went to hardening things the initial build didn't get to - a real Content-Security-Policy, bot protection on the contact form, and cookieless visitor analytics instead of the cookie-banner rabbit hole a typical analytics setup would have meant. Most of it wasn't a single visible feature so much as actually following through on "security first" past the initial setup - a different kind of work than building the thing in the first place.