Admin CMS & Navigation Polish
Three areas of work today: an admin CMS for managing content, floating navigation elements, and connecting post publishing directly to the newsletter.
Admin CMS
Managing content through GitHub commits was fine for a while, but friction adds up. Built a proper admin system.
NextAuth with Google OAuth handles authentication. A single whitelisted email can access /admin. Middleware protects the routes. Simple.
The admin dashboard lists writing posts and log entries. Click to edit, or create new. The form is bare-bones: title, date, optional description, markdown content. That's all I need.
The tricky part was Vercel's read-only filesystem. The CMS can't write files directly in production — they'd vanish on the next deploy anyway. Switched to committing via GitHub's API. Post saves trigger commits. Content stays in git where it belongs.
Floating navigation
Navigation was buried at the bottom of pages. Getting home meant scrolling down and clicking back repeatedly.
Added a floating home button — the coin logo, fixed bottom-left. Appears after scrolling 100px on any page except the homepage. On desktop it's subtle: 60% opacity until you hover. On mobile it becomes a pill with a "Home" label, but only while actively scrolling. After two seconds of no scroll activity, it fades out. Same treatment for the theme toggle.
The goal: available when you need it, invisible when you don't. Mobile screens are precious real estate.
Newsletter integration
Publishing a post meant three steps: save it on the site, copy the content, paste into Buttondown, send. Tedious.
Now there's a checkbox: "Send to newsletter subscribers." Check it when creating a writing post and it goes to Buttondown's API after the GitHub commit. One action publishes everywhere.
The admin dashboard shows a "Sent Newsletters" section — a list of what's gone out, pulled from Buttondown's API. Confirmation that the integration actually worked.
Small touches: the footer subscribe form got a loading spinner. Subtle, but it acknowledges that something is happening when you hit enter.