Apa yang bisa saya masak dari bahan yang sudah ada?
Masukkan bahan yang ada di kulkas, dapatkan ide masakan yang benar-benar bisa kamu buat hari ini.
Mulai dari bahan yang ada
Masukkan minimal satu bahan, lalu kami tunjukkan masakan yang paling mungkin kamu buat.
Untuk developer
Di balik layar
Frontend ini hanya salah satu client dari Smart Living API.
Contoh Request
POST /api/v1/recommendations
Content-Type: application/json
{
"ingredients": [
"telur",
"ayam",
"wortel"
],
"limit": 5
}Contoh Response
{
"query": {
"raw": [
"telur",
"ayam",
"wortel"
],
"ingredients": [
"egg",
"chicken",
"carrot"
]
},
"unknownIngredients": [],
"results": [
{
"id": "recipe_001",
"name": "Omelet Ayam Wortel",
"description": "Omelet berisi ayam dan wortel, cukup satu wajan untuk sarapan yang mengenyangkan.",
"matchPercentage": 100,
"availableIngredients": [
"egg",
"chicken",
"carrot"
],
"missingIngredients": [],
"cookingTimeMinutes": 15,
"difficulty": "easy",
"servings": 2,
"ingredients": [
"egg",
"chicken",
"carrot",
"shallot",
"salt",
"pepper",
"cooking_oil"
],
"steps": [
"Potong ayam dan wortel menjadi dadu kecil agar cepat matang.",
"Kocok telur dalam wadah, bumbui dengan garam dan lada."
],
"tags": [
"sarapan",
"praktis",
"indonesian"
]
}
],
"meta": {
"count": 1,
"limit": 5,
"threshold": 30
}
}Arsitektur
- BrowserInput bahan dari pengguna
- Next.js (Web)Client API, bukan tempat business logic
- Smart Living API (FastAPI)Validasi request dan response
- Ingredient NormalizerTeks bebas menjadi nama kanonik
- Matching EngineHitung persentase kecocokan
- RankingUrutkan deterministik dengan tie-breaker
- Recipe RepositoryBaca recipes.json sekali saat startup
Tech Stack
- Frontend
- Next.js, TypeScript, Tailwind CSS
- Backend
- Python 3.12, FastAPI, Pydantic v2
- Data
- JSON (version-controlled), PostgreSQL-ready
- Testing
- pytest, Vitest, Playwright
- Tooling
- uv, pnpm, ruff, Docker, GitHub Actions
Keputusan Teknis
Kenapa deterministik, bukan LLM?
Ranking resep harus konsisten, murah, dan bisa dijelaskan. Input yang sama selalu menghasilkan urutan yang sama. AI ditempatkan sebagai lapisan enhancement, bukan fondasi. Trade-off-nya: input bahasa natural yang rumit belum bisa dipahami.
Kenapa garam dan minyak tidak dihitung?
Bahan pokok dapur dianggap selalu tersedia, sehingga persentase kecocokan mencerminkan bahan yang benar-benar menentukan. Trade-off-nya: asumsi ini bisa salah untuk dapur yang benar-benar kosong.
Kenapa JSON, bukan database?
Untuk 60 resep, JSON version-controlled lebih cepat di-review dan tidak butuh setup. Repository abstraction membuat migrasi ke PostgreSQL tidak mengubah business logic. Trade-off-nya: query kompleks dan filter dinamis belum bisa.