an invite-only, camera-first photo app where small packs of friends capture and reveal moments together.
no likes. no followers. no watermarks.
flash. is a private, invite-only photo app built around packs — small groups
of friends who capture and reveal moments together. there's no public feed to
perform for, no like counts, no follower race. you get in with a code from a
friend, you shoot, and your pack's photos reveal together as a mosaic.
- invite gate — join only with a
FLASH·XXX·XXcode; every user gets their own code + limited invite slots - camera-first — live viewfinder, rule-of-thirds grid, focus ring, vibe filters, animated shutter
- pack reveal — an animated 2×2 mosaic with a chemistry / vibe-match score
- one-comment moment — a single gated comment per pack, so it stays intentional
- reactions — a small, capped set of ghost emoji reactions per pack
- streaks — daily posting streaks with escalating colour tiers
- flash.live — short silent video clips (Pro)
- screenshot detection — the pack is told when someone screenshots
- invite lineage — see who invited whom, as a browsable family tree
- Pro tier — exclusive film LUTs, custom tile borders, +2 invite slots, streak insurance, silent mode
both photos and comments are moderated server-side before anything is stored.
images and text run through OpenAI omni-moderation-latest; text also has a
local word-list heuristic. rejected uploads return 422 and never persist.
- client — Expo (SDK 54) / React Native 0.81, React 19, TypeScript; Skia LUT filters, React Navigation
- server — Express + Postgres, with Redis-backed caching (in-process fallback when
REDIS_URLis unset) - deploy — Render (
render.yaml), managed Postgres
src/— mobile app:screens/,components/,services/,state/,theme/,assets/server/— Express + Postgres backend (src/index.ts,src/moderation.ts,src/cache.ts,schema.sql)