Skip to content
Odd Hours Labs markOdd Hours Labs
← All work
SocialLive

Emmarv

One photo a day with your friend group, ranked head-to-head instead of liked.

  • Next.js
  • Prisma
  • Supabase
  • NextAuth
  • Web Push
  • Vitest
Visit Emmarv ↗

Demo group, stock photos

Album page load after the performance fix
8–10s → 0.35s
phases shipped to production
18
automated tests by phase 15
554
The problem

Emmarv is a time-boxed photo challenge for a friend group: everyone posts exactly one photo a day, no retakes. Each week the group votes head-to-head to crown the best shot, and when the run ends the app builds a shareable recap of every photo and weekly winner.

What got built
  • 01Daily one-shot posting with reminders, daily prompts and a No-Run mode
  • 02Weekly pairwise voting processed on a schedule, plus collages and recaps
  • 03Onboarding, privacy policy and terms, and a retention pass
  • 04Email magic-link and Google sign-in, with photos in private signed storage
The hard part

A page that took ten seconds to load

Measuring before fixing found three causes. The app's servers ran in Virginia while the database lived in Oregon, so dozens of sequential queries each crossed the country; every photo URL was signed with its own network call; and the page loaded the whole album to show one day. Pinning functions to the database's region, batching the signing and loading less took it from 8–10 seconds to about 0.35.

Follow the build

Get an email when something ships

A new product, a big feature, a launch date. Nothing else, and you can ask to be taken off any time. Or read the build log (there’s an RSS feed too).

 

Next projectLast Stance →A sword-fighting game on Roblox built around the parry. Read the blade, break the stance.