4.6 KiB
4.6 KiB
Tech Context — iFarted
Stack (decisions locked by user)
| Concern | Choice | Notes |
|---|---|---|
| Mobile framework | React Native via Expo (managed workflow), TypeScript | One codebase → iOS + Android |
| Build/sign/submit | EAS Build (cloud) | Linux box → iOS builds via EAS cloud (or a Mac) |
| Push (client) | expo-notifications |
Acquires ExpoPushToken; needs projectId in app.json |
| Push (server) | Bun calling the Expo Push API (exp.host/--/api/v2/push/send) |
YES, Bun is possible — Expo's push API is plain HTTPS+JSON; Bun's runtime handles it with built-in fetch. No Firebase Functions/Firestore. |
| Backend framework | Bun + Hono (or plain fetch handlers) | Runtime-agnostic TS so plain Node is a trivial fallback |
| Storage | bun:sqlite (SQLite) | Single file DB; zero external services |
| Location | expo-location |
Permission-gated, per-message opt-in |
| Maps | react-native-maps / expo-maps |
Pin sender location on recipient device |
| Ads | AdMob via react-native-google-mobile-ads (+ Expo config plugin) |
Non-personalized ads first |
| IAP | expo-iap or RevenueCat react-native-purchases |
RevenueCat favored (entitlements + restore); final TBD |
| Navigation | expo-router | File-based |
Bun question — answer recorded 2026-09-09
Yes, Bun is possible and adopted. The Expo Push API is a plain HTTPS REST endpoint; Bun (a Node-compatible JS/TS runtime) can call it with built-in fetch and run the whole relay with zero native-module risk. Bun also ships bun:sqlite for storage and starts fast. Caveats: Bun is not installed on this box yet (install via curl -fsSL https://bun.sh/install | bash → ~/.bun/bin/bun); keep the server code Node-runnable so falling back to node is trivial; avoid bun-only APIs except optional bun:sqlite (swap to better-sqlite3 if we need Node-only). Node v22 is the fallback runtime.
Development Environment (current box)
- OS: Linux. Node v22.22.1, npm 9.2.0, OpenJDK 25.0.4, Python 3.14.4, git 2.53.0. Bun not yet installed. No Flutter (not needed).
- Android SDK availability TBD — needed for local Android builds/emulator; EAS can cloud-build if absent.
- Workspace:
/opt/system/apps/VSCode-iFarted-app/VSCode.AppImage.home/iFarted(only.clinerules/,memory-bank/so far).
Accounts & Services Required (dev → release)
- Apple Developer Program ($99/yr): signing, APNs key, App Store.
- Google Play Console ($25 one-time): signing, Play Billing, releases.
- Expo account (free): EAS builds; push
projectId. - Firebase project (free) — needed for Android FCM client credentials (
google-services.json+ FCM sender id), even though the backend uses Expo's Push API (expo-notifications registers an Android FCM token with the app's Firebase project). - Google AdMob (free, approval): ad units for iOS + Android.
- App Store Connect + Play Console IAP entries:
remove_adsnon-consumable.
Push mechanics (specifics that bite later)
- Client:
expo-notifications→getExpoPushTokenAsync()→ExpoPushToken[...], send toPOST /v1/tokens. - Server:
POST https://exp.host/--/api/v2/push/sendwith{ to, title, body, sound, data }; batch ≤100 tokens; optionally pollpush/getReceiptsfor delivery status. - Custom notification sound: iOS bundles a <30s audio file referenced in the payload
sound; Android defines a notification channel with the sound. (Yo's signature was text + audio alert — we mirror with a short fart sound.) - Android FCM credentials (
google-services.json) are a secret → injected at EAS build time, never committed.
Technical Constraints & Gotchas
- Cannot build/submit iOS from this Linux machine → EAS Build cloud or a Mac is mandatory.
- Privacy/permissions: iOS
NSLocationWhenInUseUsageDescriptionvia app.json/plugin; Android location runtime permissions; push permission rationale; store privacy "nutrition labels". - Remove Ads must be store-billed IAP; entitlement restorable across reinstall/device.
- Expo config plugins over ejecting;
app.jsonis the source of truth. - No API keys/PII in client source; phone numbers hashed for contact matching.
Tooling Patterns / Conventions
- TypeScript strict; small feature folders; monorepo layout suggestion:
apps/mobile(Expo) +apps/server(Bun) + sharedpackages/contracts(API types). eas buildfor internal + store builds; development builds for push testing (Expo Go has Android push limitations).- Secrets via EAS env vars /
.env(git-ignored). - Test on real devices early — push, sound, maps, location are device-dependent.