Photos arrive on the guest's phone the moment the shutter clicks
Server-Sent Events stream new photos straight to the gallery and to lobby kiosk TVs. Guests see a pulsing LIVE indicator, hear a shutter sound, and watch their photos appear without refreshing — perfect for theme-park rides, water-park slides, and arrival archways.




Photos stream into the gallery the moment they upload
Connected gallery viewers subscribe to /api/gallery/[token]/stream. When the photographer's upload completes, the server publishes a new_photos event on the in-memory bus and every connected client receives it instantly. The gallery animates the new photos in, plays an optional shutter-click sound, and shows a toast naming the photographer.
- /api/gallery/[token]/stream — guest-side SSE endpoint
- Pulsing 'LIVE' indicator with heartbeat ping
- Optional shutter-click sound (mute toggle)
- Toast notification — 'Photographer Alex sent 3 photos'
- New photos animate in without page refresh
- Heartbeat events keep the connection alive across proxies

Kiosk TV display detects nearby customers and streams their photos
Set a TV running /kiosk/tv-display in the lobby or by the photo desk. It cycles attract-mode photos until a guest steps close — face recognition matches them, and the TV switches to streaming THEIR photos as they're shot. Friends gather, photographers cross-sell on the spot, the upsell almost prints itself.
- Kiosk TV display at /kiosk/tv-display
- Attract-mode photo carousel between matches
- Face recognition scan triggers a switch to matched guest
- Server-Sent Events push every new shot to the TV in real time
- Live session count + total photos today displayed
- Moving watermark on the TV breaks phone-camera capture

Single in-memory event bus — works on a single Vercel instance
The lib/live-stream.ts singleton holds an in-memory event bus that fans events out to gallery viewers, kiosk TVs, and admin dashboards. It's deliberately simple — process-level only — so it works perfectly on a single Vercel serverless instance. For multi-region scale, swap the bus for Redis pub/sub without changing any callers.
- lib/live-stream.ts — process-level event bus
- notifyGallery / notifyLocation — typed publish helpers
- Subscribe API for any new SSE consumer (admin notifications, etc.)
- Single-instance ready, multi-instance with Redis pub/sub swap
- Events typed: new_photos, connected, heartbeat
- Per-gallery and per-location channel scoping

Feature-flagged on or off — no code change to enable or disable
FEATURE_REALTIME_STREAMING gates every notify call. When off, calls silently no-op so the upload path stays fast — Subscribe calls still accept listeners so the SSE endpoint doesn't 500, they just never receive new-photos events. Toggle via env var without touching code, ideal for staging vs production rollout.
- FEATURE_REALTIME_STREAMING env-var gate
- Off-state: notify* no-ops, gallery falls back to polling
- On-state: every upload publishes immediately
- No async/await on the env check — zero hot-path latency
- Per-environment rollout (off in staging, on in prod, etc.)
- Per-org plan-guard available for SaaS tier gating

Everything included
No feature gates. No hidden upgrades. Get the full experience from day one.
Guest-side SSE
/api/gallery/[token]/stream pushes new_photos events to the gallery.
Kiosk TV SSE
/api/location/[id]/stream pushes location-scoped events to lobby TVs.
LIVE indicator
Pulsing red badge confirms the stream is connected.
Shutter-click sound
Optional audio cue when new photos arrive (mute toggle).
Toast notifications
'Photographer Alex sent 3 photos' — toast names the photographer.
Heartbeat events
Periodic heartbeat keeps connection alive across CDN proxies.
TV face-match streaming
Lobby TV detects a guest, switches to streaming their photos.
Attract mode
TV cycles featured photos between matches.
Moving watermark on TV
Pulsing brightness defeats phone-camera capture.
In-memory event bus
Process-level singleton; swap to Redis pub/sub for multi-instance.
Feature-flag gate
FEATURE_REALTIME_STREAMING env var toggles streaming on/off.
Zero hot-path latency
Env check uses sync read, no async overhead on uploads.
Who it's for
Theme park rides
Speed camera fires as the rollercoaster crosses the loop. By the time the guest unbuckles, their photo is on their phone with a pulsing LIVE badge. They share it before they reach the next ride.
Water park slides
Wristband-tagged customer hits the splash pool. Photographer's burst of 5 shots lands in their gallery with a shutter sound. The guest dries off at the kiosk TV which is already showing those exact photos at full size.
Wedding venues
Couple's gallery shows photos arriving live during the reception. Family members back home open the gallery link and watch the wedding photos populate in real time as the photographer shoots.
Resort arrival archways
Welcome archway camera fires when the family steps under it. By the time they're at the front desk, the receptionist hands them a card and their gallery is already loading on their phone with the arrival photos.
Full feature list
Pomvom and DEI charge premium tiers for real-time mobile streaming. Most photographer platforms ship gallery-after-the-fact and call it 'instant.' Fotiqo's pipeline pushes every shutter click to the gallery and the lobby TV the moment the upload completes — and the same event bus powers admin notifications and the kiosk order toast.
Compare plans“Fotiqo has everything I need in one place. I stopped paying for four separate tools and my workflow is so much simpler now.”
Ready to get started?
Free to start. No credit card. No monthly fees on the Starter plan.
See live streaming in action