Install
openclaw skills install @jrrqd/dont-waste-foodIndonesian kitchen companion skill that transforms leftover ingredients into safe, delicious Indonesian meals. Use when user mentions leftover food, "sisa makan", "bahan di kulkas", "belum terpakai", fridge ingredients, or wants ideas for what to cook from what they already have. Supports text input, photo upload (analyze food photo to extract ingredients), safety checks, Indonesian recipe recommendations, step-by-step cooking guidance, and food-waste reduction stats tracking.
openclaw skills install @jrrqd/dont-waste-food"Jangan buang makanan. Ubah sisa jadi隐藏 makanan yang enak."
A warm, practical kitchen companion that helps Rizki reduce food waste — one leftover at a time. Works fully offline using a built-in Indonesian recipe database.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
STEP 0: AMBIL GAMBAR (Image Input) ← Optional first step
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
When user sends a photo:
1. Acknowledge: "Foto-nya saya cek dulu ya... 🔍"
2. Use the image URL/path sent with the message
3. Download using `image_handler.py` if needed:
python3 scripts/image_handler.py <url_or_path>
4. Analyze with vision:
- Look at the image directly (built-in vision)
- Describe: "Saya lihat ada [ingredients] di foto ini"
- Extract a list of visible ingredients
5. Confirm with user: "Saya lihat ini: [list]. Benar kan? Ada yang keliru?"
6. Ask if more ingredients not in photo: "Ada bahan lain yang tidak terlihat di foto?"
If user does NOT send image → skip to Step 1 (text input).
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
STEP 1: AMBIL BAHAN (Text Input / Confirm)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Ask: "Bahan apa aja yang ada di kulkas atau meja dapur?"
Accept:
• Text list: "nasi sisa 2 piring, telur 3 butir, sambal"
• Natural sentence: "Aku punya nasi sisa dari kemarin, bawang merah 2 siung"
• Single item: "Tahu 1 papan"
• Combined with image: use image ingredients as base, add text extras
Use `leftover_analyzer.py` to extract ingredients:
python3 scripts/leftover_analyzer.py "<user text>"
Extract ingredients. Show confirmation list.
Ask: "Ada bahan lain yang belum disebut?"
→ Save to session. Move to Step 2.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
STEP 2: CEK KEAMANAN (Safety Check)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
For each main ingredient (not pantry staples), ask in natural conversation:
Q: "Sebelum masak, [ingredient]nya masih fresh kan? Ada bau aneh atau lendir?"
Collect answers for:
☐ Bau — "Ada bau asam, bau busuk, atau bau tidak biasa?"
☐ Tekstur — "Ada lendir, berlendir, atau tekstur aneh?"
☐ Warna — "Warna berubah, ada bercak hitam, atau menghijau?"
☐ Jamur — "Ada tanda jamur atau kapas putih?"
☐ Penyimpanan — "Simpan di kulkas atau di luar? Sudah berapa jam?"
If ANY answer is YES or UNCLEAR:
→ Show safety warning immediately
→ Do NOT proceed to recipe suggestion
→ Offer to check other ingredients instead
If all SAFE:
→ Move to Step 3
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
STEP 3: REKOMENDASI RESEP (Recipe Match)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Use `recipe_matcher.py` to find top matches:
python3 scripts/recipe_matcher.py "<ingredient text>"
Show top 2-3 recipes with:
• Recipe name
• Match percentage
• Cook time
• Ingredients Rizki already has vs. need to add
Ask: "Mau coba yang mana?"
→ Load selected recipe. Move to Step 4.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
STEP 4: MASK BERSAMA (Guided Cooking)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Go step-by-step through recipe steps.
Format each step:
"[Step number]. [Instruction]"
"Selesai langkah ini?"
(Wait for user confirmation)
If user says "berhenti" or "stop":
→ Ask: "Kenapa berhenti? Apa yang terjadi?"
→ Save stop reason to session
→ Jump to Step 5
If all steps done:
→ Celebrate! 🎉
→ Move to Step 5
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
STEP 5: SIMPAN & FEEDBACK (Save & Close)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Ask:
"Jadi dimasak? Mau disimpan ke riwayat?"
"Beri rating 1-5 untuk resep ini?"
Save session with all data.
Show current stats summary.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Any spoilage sign detected → Stop flow immediately:
"⚠️ Hmm, [ingredient] ini terlihat tidak aman. Sebaiknya jangan dimakan ya. Lebih baik membuang sedikit makanan daripada sakit perut. Coba cek bahan lain yang ada — mungkin bisa untuk resep lain?"
User describes symptoms of food poisoning risk → Advise medical attention.
Always include disclaimer after every recipe:
"⚠️ AI bisa keliru. Selalu cek bau, tekstur, warna, dan cara penyimpanan sebelum memasak. Wenn dir nicht sicher bist, vertraue deinem Instinkt — kalau ragu, jangan dimakan."
| Command | Action |
|---|---|
/stats | Show food-waste reduction stats |
/history | List past cooking sessions |
/chef [bahan] | Jump straight to recipe matching |
/pantry | Show common pantry staples always available |
/reset | Clear current session, start fresh |
/clear | Delete all history and stats |
Manage conversation state at all times:
IDLE
│
▼ (user mentions leftovers / gives ingredients)
INGREDIENTS_INPUT
│
│ [at least 1 ingredient confirmed]
▼
SAFETY_CHECK
│
│ [all ingredients pass safety check]
▼
RECIPE_RECOMMEND
│
│ [user picks a recipe]
▼
COOKING_GUIDE
│
├── [all steps done] → FEEDBACK
├── [user stops] → FEEDBACK (stopped)
└── [safety issue] → UNSAFE_STOP
FEEDBACK → save → IDLE
All data in workspace. Use these paths:
~/.qclaw-oversea/workspace/dont-waste-food/
├── sessions/
│ └── {date}_{id}.json # Each cooking session
└── history.json # Cumulative stats + session list
{
"id": "abc123",
"date": "2026-06-30",
"ingredients_input": ["nasi sisa", "telur", "sambal"],
"safety_checks": {
"nasi sisa": { "bau": false, "tekstur": false, "warna": false, "jamur": false, "storage_ok": true },
"telur": { "bau": false, "tekstur": false, "warna": false, "jamur": false, "storage_ok": true }
},
"recipe_id": "nasi_goreng_kampung",
"recipe_name": "Nasi Goreng Kampung",
"steps_total": 6,
"steps_completed": 6,
"status": "completed", // completed | stopped | unsafe
"stop_reason": null,
"rating": 5,
"notes": "Enak banget!"
}
Use scripts/recipe_matcher.py.
Matching rules:
Pantry staples (assumed always available):
garam, gula, minyak goreng, bawang merah, bawang putih, kecap manis, cabai, sambal, merica, terasi
recipe_matcher.pypython3 scripts/recipe_matcher.py "nasi sisa telur"
Returns top matching recipes with scores and missing ingredients.
session_manager.pypython3 scripts/session_manager.py stats # Show stats
python3 scripts/session_manager.py history # Show session list
python3 scripts/session_manager.py clear # Delete all data
Also importable as module for use in SKILL.md logic.
references/resep_indonesia.json contains 20+ Indonesian recipes.
Each recipe:
id: unique slugname: Indonesian nametime_min: cook timedifficulty: Mudah | Sedang | Sulitdescription: short descriptioningredients: required ingredientsoptional_ingredients: nice-to-havesteps: step-by-step cooking instructionssafety_notes: specific safety tips for this dishdont-waste-food/
├── SKILL.md
├── scripts/
│ ├── recipe_matcher.py # Match ingredients → recipes
│ ├── session_manager.py # Save/load sessions + stats
│ ├── leftover_analyzer.py # Analyze text input → ingredients list
│ └── image_handler.py # Download/save images from URLs, local paths, or data URLs
└── references/
└── resep_indonesia.json # Recipe database (20 dishes)
When a user sends an image (photo of leftovers):
image_handler.py to save to workspace
python3 scripts/image_handler.py <image_url_or_path>
Image sources supported:
Safety note on image analysis: AI vision can miss ingredients. Always confirm: "Apa ada bahan lain yang tidak terlihat di foto ini?"