Skip to content

yves-a/sift

Repository files navigation

Sift — Swipe-to-Discover Gift Recommender (React Native + Expo)

Expo Platforms Backend

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.


✨ Features

  • 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.


🧱 Tech Stack

  • Mobile: React Native with Expo
  • Data/Backend: Firebase (Firestore for data; Authentication optional)
  • Tooling: EAS/Expo CLI, Node.js, npm

🚀 Getting Started

1) Prerequisites

  • 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)

2) Clone & install

git clone https://github.com/yves-a/sift
cd sift
npm install

3) Firebase config

Create 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.

4) Run (development)

npx expo start

Open with:

  • iOS: press i (simulator)
  • Android: press a (emulator)
  • Device: scan the QR code with the Expo Go app

🗺️ Project Structure

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

🔎 How Recommendations Work (high level)

  • 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.


🧪 Sample Data & Seeding (optional)

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.


🧭 Roadmap

  • 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

🤝 Contributing

PRs welcome for:

  • UI polish & accessibility fixes
  • Improved recs (feature engineering, ranking)
  • Firestore rules hardening & test data scripts

📄 License

MIT


👤 Maintainer

Yves AlikalficLinkedInGitHub

About

Swipe-to-Discover Gift Recommender

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors