All work
Glint screenshot built by Vector9
Glint app icon

Glint

Event photo collection

Live in Production

Every guest's camera roll, in the host's own Drive before the night ends.

Role
Designed, built and shipped end to end
Timeline
2026
Type
Event photo collection SaaS
Platforms
Web

Stack

Next.js 16React 19TypeScriptTailwind CSSSupabaseGoogle Drive APIStripeUpstash RedisVercel

The best photos of any wedding are taken by the guests, and they die on the guests' phones. Hosts spend the following weeks begging in group chats, collecting compressed re-sends of a night they already paid a photographer for. Glint exists to collect everything, from everyone, while the event is still happening.

Nobody installs an app at a wedding, and nobody creates an account between courses. That set the bar: an upload flow that works in any browser on any phone, including the in-app browsers QR scans open into, over venue Wi-Fi that drops mid-transfer. And the host should own the result outright, in their own storage, not rent access to a silo.

No app, no account

Guests scan a QR code and land on a branded upload page in the browser. That is the whole flow: no install, no sign-in, no permission maze. The page detects in-app browsers, decodes iPhone HEIC shots so previews render, and accepts a whole camera roll in one drop with live per-file progress. Friction that costs a normal product a signup costs this one the photos, so the guest path stays ruthlessly bare.

The guest upload page: event cover, a drop zone, nothing to install or sign into
The guest upload page: event cover, a drop zone, nothing to install or sign into

An uploader that refuses to fail

Serverless routes cap request bodies at about 4.5 MB, which is smaller than almost every video a phone shoots. Small files go up in a single request; anything larger switches to a resumable path that streams 4 MB chunks. Each phase gets its own failure budget: a 30 second stall timeout while bytes are moving, a 90 second grace once a chunk's bytes are sent and Drive is committing them, a hard 120 second ceiling per request, and backoff that honors the server's retry hints. Progress persists to IndexedDB, so a page reload or iOS backgrounding resumes the upload instead of losing the guest.

A whole camera roll going up in one session, with live per-file progress

The host owns the storage

Media streams directly into the host's own Google Drive through a connected account; Glint's database keeps metadata only. That one decision removed storage costs, retention policy and the hardest privacy questions in a single move, and it means the host keeps every original even if the product disappears. Around it sit the guardrails a public upload link needs: per-event size ceilings, rate limiting, an admin console, and a scheduled job that mails the host a morning-after summary.

The host's gallery: every guest's photos and videos, gathered into one event
The host's gallery: every guest's photos and videos, gathered into one event

Glint is live at glint.pics, with paid event passes running through Stripe. The first working build, from uploads to billing, came together in a week. The full loop works today: create an event, print the QR, collect the night, keep the originals in your own Drive.

It stays deliberately small and grows only when reality demands it: the uploader's hardening came from real failures at real events, not a roadmap.

Want something like this?

Tell us what you're building and we'll give you an honest assessment of scope, timeline, and cost.

Book a Call