Admin dashboard polish and then some
Heavy infrastructure day. Mostly admin dashboard improvements and setting up Alimenta for early access.
Subscriber Management
The subscriber admin page needed more than a list. Added colored status badges—green for active, yellow for pending, red for unsubscribed. Visual scanning is faster than reading status text.
Built a delete flow with a confirmation modal requiring "DELETE!" to be typed. Destructive actions should have friction. Also added the ability to resend confirmation emails to pending subscribers with optional custom notes. Useful when someone says they never got the first email.
Email Tracking
Created an email_logs table to track every email sent. Each subscriber row now expands to show their email history. Click any logged email to see the rendered HTML in a modal.
This is debugging infrastructure. When someone claims they didn't get an email, I can check if it was sent, when, and what it contained. The resubscribe flow for previously unsubscribed users was broken—fixed that while building the logging system.
Growth Visualization
Added a subscriber growth chart using Recharts. Time range filters: day, week, month, 12 months, year-to-date. A time series API endpoint aggregates subscriber counts over time.
I don't have enough subscribers for this to matter yet. But it'll be useful later, and building it now was cheap.
Alimenta Early Access
Restructured the project for early access:
- Created a
/projectspage with card layout - Moved the Alimenta app to
/projects/alimenta/appwith password protection - Built an early access landing page at
/projects/alimentawith waitlist signup - Added a waitlist admin interface to view signups and feedback
The waitlist captures email and optional feedback. Password protection is simple—check against an env var, set a cookie. Nothing fancy.
Hooks Bug
Fixed a React hooks order violation. Had useMemo and useCallback calls after early returns, which violates the Rules of Hooks. Moved them to the top of the component. The kind of bug that works in development but could break in production.