// PROJECT_
Savora-App
01. PROJECT_OVERVIEW
A mobile recipe app born from the simple question: what can I cook with what I have? Nicy Kitchen lets you type in the ingredients on hand, pick a diet filter (All / Vegan / Vegetarian / With meat) and get ranked recipe suggestions instantly. The matching engine scores local recipes by the matched/total ingredient ratio, enforces a proper diet hierarchy (vegan recipes satisfy vegetarian searches too) and resolves synonyms — all in pure TypeScript, no external service needed. When the ingredient list is long enough, Spoonacular results fill the gaps. Saved recipes and a food-news home screen round out the core experience. Currently in active development. The next feature is a real-time collaborative ingredient checklist: a friend joins your recipe session and both of you can tick off ingredients as you shop or cook — if one person marks 'butter', it disappears from the other's list instantly. No double-buying, no overlap. Powered by Socket.IO.
Status
Active Development
Scope
Full-Stack Architecture
Primary Stack
Expo SDK 54
Repo
Public
02. SCREENSHOTS




03. TECH_STACK & ARCHITECTURE
//In active development — real-time collaborative ingredient checklist (Socket.IO) is the next feature
//Expo SDK 54 with expo-router file-based tabs: Home (news), Cook (suggest by ingredients + diet filter), Shopping (local checklist)
//Ingredient matching engine (matching.ts): scored by matched/total ratio, diet hierarchy (vegan ⊂ vegetarian), synonym resolution — pure TypeScript, no external call
//Spoonacular integration: local matches returned first, external results enrich the list when ingredient count is sufficient
//better-sqlite3 (embedded SQLite): user recipes persist on the API server, no user accounts required for core features
//Planned Socket.IO session: friend joins recipe, shared checklist, ticking an ingredient syncs live to all participants
Expo SDK 54 + expo-router
Frontend — Mobile Framework
File-based routing via expo-router — three tab screens: Home (food news), Cook (recipe suggestion), Shopping (checklist). TypeScript throughout from screen components to API call types.
react-native-reanimated ~4.1.1
Frontend — Animations
FadeInDown animations on recipe cards and news items. Gesture-ready infrastructure for the upcoming collaborative checklist interactions.
expo-image
Frontend — Image Handling
Drop-in Image replacement with built-in memory cache and blurhash placeholder support — fast, non-blocking recipe and news thumbnails.
Ingredient Matching Engine
Backend — Core Algorithm
Pure TypeScript scoring engine (matching.ts): ranks recipes by matched/total ingredient ratio, enforces diet hierarchy (vegan ⊂ vegetarian ⊂ with-meat), and resolves ingredient synonyms. Runs in-process — no external service, no network latency.
Express 5 + TypeScript
Backend — API Server
Minimal HTTP API: POST /api/suggestions (local matching + optional Spoonacular enrichment), GET /api/recipes, GET /api/external/:id, GET /api/news. tsx watch for instant reload in dev.
better-sqlite3
Backend — Database
Embedded SQLite via better-sqlite3. Stores user-created recipes with ingredients, steps and diet tags. Zero-config for development — no database server needed.
Spoonacular API
Backend — External Recipes
When a user's ingredient list is long enough, POST /api/suggestions enriches local results with Spoonacular matches. External recipe detail (instructions, nutrition) available via GET /api/external/:id.
Socket.IO (planned)
Planned — Real-Time Collaboration
In development: a friend joins your recipe session and both users share a live ingredient checklist. Ticking off an ingredient syncs instantly to all participants — preventing duplicate purchases when cooking or shopping together.
jest-expo + supertest
Testing
jest-expo for React Native component and hook tests. supertest mounts the Express 5 app without binding a port — integration tests run against the full middleware chain and real SQLite DB.