// PROJECT_

Savora-App

Expo SDK 54

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

Home — Today's picks
Home — Today's picks
What to cook? — local + Spoonacular results
What to cook? — local + Spoonacular results
Recipe detail — Spoonacular
Recipe detail — Spoonacular
Shopping list
Shopping list

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.