A meme app where every meme is one tap away from being remixed.
Sprig turns browsing and creating into the same motion. See a meme, get a better idea, tap Remix, and the editor opens pre-loaded with that exact template. Every remix records where it came from, so memes branch and evolve into family trees instead of dying as one-offs.
⚠️ "Sprig" is a working name. Run a trademark search (USPTO / EUIPO) and check the App Store + Play Store before committing. Replace via find-and-replace if you choose another name.
The big meme apps treat browsing and creating as two separate worlds, so most funny ideas never get made — opening a separate editor is too much friction. Sprig collapses that gap:
- One-tap remix — any meme opens in the editor as a fresh canvas.
- Remix lineage — every post shows "remixed from @x"; a single template can spawn a whole thread of variations.
- Daily Battle (v2) — everyone gets the same blank template and the community votes a winner.
| Layer | Choice |
|---|---|
| Mobile | React Native + Expo |
| Backend | Supabase (Postgres, Auth, Storage, Realtime, Edge Functions) |
| Image rendering | react-native-skia / react-native-view-shot (client-side) |
| Media delivery | Object storage + CDN |
| Moderation | Image + text classifier (e.g. Hive / AWS Rekognition) + human review queue |
| Push | FCM + APNs via Expo |
| Analytics / crashes | PostHog + Sentry |
See docs/ARCHITECTURE.md for the full design, data model, and flows.
- Node.js 20+
- npm or pnpm
- Expo CLI (
npm install -g expo) - A Supabase project (free tier is fine to start)
- iOS Simulator (Xcode) and/or Android Emulator (Android Studio), or the Expo Go app on a physical device
# 1. Clone
git clone https://github.com/your-org/sprig.git
cd sprig
# 2. Install dependencies
cd apps/mobile
npm install
# 3. Configure environment
cp .env.example .env
# fill in the values below
# 4. Apply the database schema (from repo root)
cd ../..
supabase db push # or: supabase migration up
# 5. Run the app
cd apps/mobile
npx expo startPress i for iOS, a for Android, or scan the QR code with Expo Go.
apps/mobile/.env:
EXPO_PUBLIC_SUPABASE_URL=your-project-url
EXPO_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
Server-side secrets (moderation keys, LLM keys, service-role key) live in Supabase Edge Function secrets, never in the app bundle:
supabase secrets set MODERATION_API_KEY=...
supabase secrets set OPENAI_API_KEY=... # for v2 AI caption helpersprig/
├─ apps/mobile/ # React Native + Expo app
│ └─ src/
│ ├─ features/ # feed, editor, battle, profile, auth
│ ├─ components/ # shared UI
│ ├─ lib/ # supabase client + api wrappers
│ ├─ hooks/
│ └─ navigation/
├─ supabase/
│ ├─ migrations/ # SQL schema + RLS policies
│ └─ functions/ # edge functions
├─ packages/shared/ # shared types + constants
├─ docs/ARCHITECTURE.md
├─ AGENTS.md # instructions for AI coding agents
└─ README.md
Run from apps/mobile:
| Command | What it does |
|---|---|
npx expo start |
Start the dev server |
npm run lint |
Lint |
npm run typecheck |
TypeScript check |
npm test |
Run tests |
From repo root:
| Command | What it does |
|---|---|
supabase start |
Run Supabase locally |
supabase db push |
Apply migrations |
supabase functions deploy <name> |
Deploy an edge function |
- v1 MVP — auth, create/remix editor, Fresh feed, reactions, comments, profiles, moderation
- v1.1 — For You ranking, push notifications
- v2 — Daily Battles, AI caption helper
- v2.1 — remix-tree visualization, search, follows-based feed
Build the remix loop (create → remix → lineage) before anything else. It's the whole pitch.
Read AGENTS.md for conventions (it's written for AI coding agents but applies to humans too). PRs should pass lint, typecheck, and tests.
Sprig hosts user-generated images. Automated moderation + a human review queue + in-app reporting are required before any public launch, including a CSAM detection and reporting path. See the content-safety section of docs/ARCHITECTURE.md.
TBD — choose one before open-sourcing (MIT for permissive, AGPL if you want to keep forks open).