3.7 KiB
3.7 KiB
Project Brief — iFarted
Working Title
iFarted (matches the working directory). Branding style follows Yo! (single word = the product). Final store name/icon/copy still TBD.
One-Liner
A dead-simple cross-platform mobile app that lets a user send another user an individual push notification containing exactly the phrase "I farted." — optionally with the sender's current location attached. Modeled on the 2014 Yo! app (see memory-bank/research/yo-app.md).
Platform Targets
- iOS (iPhone) — Apple App Store
- Android — Google Play Store
Product Model (Yo! pattern — "context-based messaging")
- The user never types anything. The single fixed message is "I farted."; meaning comes from context (who sent it, when, and where).
- Recipient gets a push notification (text + custom audio sound) — the notification is the message. No inbox/history/feed (Yo-style ephemeral).
- Home = recipient list; tap a person → they get the fart. Recipient can one-tap fart back.
Core Requirements (MVP)
- Identity & discovery — ALL THREE mechanisms (user decision): a. Claim a unique @username; find others via username search + add. b. Optional phone number on profile → contacts matching (opt-in only, privacy-safe matching server-side). c. Invite code + deep link — sender generates one, friend opens it and is pre-connected.
- Compose & send — choose a recipient from your list, optionally toggle "attach my location," send the fixed phrase "I farted."
- Delivery — push notification to recipient: title = sender's display name, body = "I farted.", custom fart audio sound (mirrors Yo's text+audio alert). With location attached, tapping opens the app and shows a map pin of the sender.
- Ads — AdMob ads (default: banner on home; placement/frequency TBD).
- Remove Ads IAP — one-time non-consumable purchase that permanently removes ads, billed through StoreKit / Google Play Billing.
Backend (user decision)
- Lightweight server written in Bun (Node-compatible runtime; "yes, Bun is possible") relaying through the Expo Push API (no Firebase Functions/Firestore, no raw APNs/FCM management server-side).
- SQLite storage (Bun's
bun:sqlite). Must be trivially runnable under plain Node too.
Non-Goals (MVP)
- Message history/inbox/feed (ephemeral by design)
- Group broadcasts, scheduled/recurring farts, reactions
- Free-text chat or any content beyond the fixed phrase
- Web/desktop clients
- Accounts heavier than needed for reliable recipient targeting + push tokens
Monetization Model
- Free tier: ads.
- Paid tier: one-time Remove Ads IAP (non-consumable, permanent entitlement, restorable).
- Yo died in 2016 for lack of revenue — monetization is in from day one.
Business/Policy Constraints to Respect
- No P2P push. Delivery always routes backend → Expo Push Service → APNs (iOS) / FCM (Android).
- Push must be user-initiated and targeted at a known recipient (anti-spam + store policy).
- Location requires per-platform runtime permissions, iOS purpose strings, and store privacy disclosures.
- Android still needs a Firebase project solely for FCM client credentials (
google-services.json) even though the backend uses the Expo Push API. - iOS builds require macOS/Xcode or EAS cloud build + Apple Developer Program ($99/yr); Android requires Google Play Console ($25 one-time).
- Remove Ads must be a genuine store-billed IAP — out-of-band payment for ad removal is grounds for rejection.
- Yo was hacked (2014) exposing phone numbers + enabling Yo-spam → our API is auth'd end-to-end, PII-protected, and rate-limited (see systemPatterns).