Mockup generator and Alimenta waitlist

Two separate tracks today: tooling for myself and infrastructure for Alimenta.

The mockup generator

Needed a way to create iPhone screenshots for social media and blog posts. Stock mockup tools are either subscription-based or cluttered with features I don't need.

Built one at /admin/mockups. The interface is straightforward: upload a screenshot, pick a background, export as PNG.

The technical journey was messier. Started with html2canvas for URL capture, but Tailwind CSS 4's oklab() color functions broke parsing entirely. Tried several workarounds—foreignObjectRendering, CSS replacement, pre-cloning—all failed. Punted to file upload mode and documented the issue for later.

Once the foundation worked, features accumulated:

  • Backgrounds: Solid colors, custom gradients, four Pompeii-themed presets
  • Shadows: Subtle to dramatic, including a stark drop shadow for Apple-style marketing shots
  • 3D rotation: Full X/Y/Z axis controls with perspective adjustment
  • Canvas sizing: Social media presets for X, Instagram, and Threads
  • Mockup styles: Full phone frame or floating screen

Updated to iPhone 17 Pro dimensions partway through. The screen area math matters—bezels eat into the viewport, and mismatched dimensions cause white bars.

The tool exports at 2× for retina displays. Copy to clipboard works on Chrome, download works everywhere.

Alimenta waitlist

Alimenta needed a way to collect interest before launch. Built the full stack.

The landing page at /projects/alimenta has a frosted glass card over a food photography background. Email input, beta opt-in toggle, submit. A counter shows how many people are waiting—social proof without being obnoxious about it.

Backend is simple. A waitlist table in Vercel Postgres stores email, project name, beta preference, and timestamp. The /api/waitlist endpoint handles signups and deduplication. Duplicates get a friendly "you're already on the list" message rather than an error.

Two email templates for confirmation—one for regular signups, another for beta testers. Both match the Pompeii aesthetic. The beta template sets expectations: batched invites, feedback requests, what happens next. Regular signups just get acknowledgment.

Emails only fire for new signups. No "you're already subscribed" spam for duplicates.

Added an admin page at /admin/waitlist to view and manage entries. Nothing fancy—just visibility into who's signed up.

Messaging refinement

Changed Alimenta's tagline from "underrated restaurants" to "restaurants the algorithm overlooks." Subtle shift. The ML model doesn't find bad restaurants that deserve better ratings—it surfaces good restaurants that don't fit the typical success pattern. High-quality family spots in residential neighborhoods. Places without aggressive Yelp strategies.

The new framing communicates that better.

Projects page

Redesigned the projects listing to use app store-style cards. Icon, tagline, status badge, clear CTA. Small change but it makes the page feel intentional rather than placeholder.