Lompat ke konten utama
Smart Living
API-first · Deterministic matching

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.

Pisahkan dengan koma. Boleh bahasa Indonesia atau Inggris.

Coba contoh:

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

  1. BrowserInput bahan dari pengguna
  2. Next.js (Web)Client API, bukan tempat business logic
  3. Smart Living API (FastAPI)Validasi request dan response
  4. Ingredient NormalizerTeks bebas menjadi nama kanonik
  5. Matching EngineHitung persentase kecocokan
  6. RankingUrutkan deterministik dengan tie-breaker
  7. 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.

Buka dokumentasi OpenAPI