A lightweight mobile app that helps users discover gifts via a familiar swipe UI (à la Tinder). Sift personalizes recommendations from user preferences and behavior (K-means clustering / similarity scoring), and makes it easy to shortlist and act on ideas.
- Swipe-based discovery — keep/bounce cards to shape your personal gift space
- Personalization — cluster/similarity model from preferences & interactions
- Shortlist — save favorites to review or share
- Fast start — Expo dev server; run on device with Expo Go or simulators
Focus: clean UI/UX and an easy-to-run mobile experience. The recommendation logic is intentionally simple and transparent.
- Mobile: React Native with Expo
- Data/Backend: Firebase (Firestore for data; Authentication optional)
- Tooling: EAS/Expo CLI, Node.js, npm
- Node 18+ and npm
- Xcode (for iOS sim) or Android Studio (for Android emulator) — or the Expo Go app on your phone
- A Firebase project (Firestore enabled)
git clone https://github.com/yves-a/sift
cd sift
npm installCreate a Firebase Web App in your Firebase project and copy the web config.
Add a file at the repo root named firebaseConfig.json:
{
"apiKey": "YOUR_API_KEY",
"authDomain": "YOUR_PROJECT.firebaseapp.com",
"projectId": "YOUR_PROJECT_ID",
"storageBucket": "YOUR_PROJECT.appspot.com",
"messagingSenderId": "YOUR_SENDER_ID",
"appId": "YOUR_APP_ID"
}
⚠️ Don’t commit real keys in public forks. Consider Expo env vars (EXPO_PUBLIC_*) if you prefer not to use a JSON file.
npx expo startOpen with:
- iOS: press
i(simulator) - Android: press
a(emulator) - Device: scan the QR code with the Expo Go app
sift/
├─ assets/ # images, icons, demo media
├─ components/ # reusable UI pieces (cards, buttons, etc.)
├─ screens/ # top-level app screens (Home, Swipe, Favorites)
├─ clients/ # data/recs clients or API wrappers
├─ ios/ # prebuild iOS artifacts (if using run:ios)
├─ App.js # app entry
├─ firebase.js # Firebase init (reads firebaseConfig.json)
├─ firebaseConfig.json # (you create this; see setup)
└─ package.json
- Inputs: user-declared interests (onboarding) + interaction signals (likes, skips, time on card)
- Vectorization: convert item attributes & user prefs to numeric vectors
- Clustering/Similarity:
- Option A (classic): K-means clusters to group items; surface the user-closest cluster
- Option B (simple): cosine similarity against a running user profile vector
- Ranking: blend relevance with freshness/diversity to avoid echo chambers
Start with the simple similarity baseline; swap in K-means once you have enough item/user signal.
Add a small JSON under assets/ (e.g., assets/items.json) with gift items:
[
{ "id": "book-1", "title": "Designing Data-Intensive Apps", "tags": ["tech","books","architecture"], "price": 49 },
{ "id": "brew-1", "title": "Pour-over Coffee Kit", "tags": ["kitchen","coffee"], "price": 79 }
]Then write a tiny seeding script or a one-off screen to push items to Firestore.
- Replace similarity baseline with full K-means module + A/B toggles
- Favorites → share/export (link or screenshot)
- Basic analytics (screen views, conversions)
- Offline cache for item cards
- EAS build profiles for iOS/Android store deploys
PRs welcome for:
- UI polish & accessibility fixes
- Improved recs (feature engineering, ranking)
- Firestore rules hardening & test data scripts
MIT