Local kitchen assistant service for OpenClaw. The service manages household inventory, recipe selection, alert generation, and grocery planning while OpenClaw owns messaging, scheduling, and online search.
python3 -m venv .venv
source .venv/bin/activate
pip install -e .[dev]chef-clawOr directly:
uvicorn chef_claw.api:create_app --factory --reloadHelper scripts:
./scripts/start-local.sh
./scripts/healthcheck-local.shTo keep Chef Claw running under your user account via systemd:
./scripts/install-user-service.shThen manage it with:
systemctl --user status chef-claw
systemctl --user restart chef-claw
systemctl --user stop chef-clawGET /healthPOST /checkinGET /inventoryGET /inventory/queryPOST /inventory/consumePATCH /inventory/batches/{id}DELETE /inventory/batches/{id}POST /plan/dayPOST /plan/weekendPOST /alerts/expiryPOST /alerts/restockGET /recipesPOST /recipesPOST /recipes/reloadPOST /recipes/fallback-search-request
- Responses include both
localeand backward-compatiblelanguage. localeis the preferred request field.languageremains supported for compatibility.GET /inventoryreturns both aggregateddata.itemsand batch-leveldata.batches. Use thebatch_idvalues indata.batchesordata.items[*].batch_idswhen calling batch mutation APIs.POST /inventory/consumeconsumes confirmed stock only. It will not partially consume if the confirmed quantity is insufficient, and it surfaces uncertain batches in the response for OpenClaw follow-up.PATCH /inventory/batches/{id}corrects an existing batch in place. If the updated item is packaged,expiration_dateis required.DELETE /inventory/batches/{id}removes a single inventory batch.GET /recipessupports eithertagorcategoryas a filter. Values likemeal prep,meal-prep, andmeal_prepare normalized tomeal-prep.POST /recipeswrites a newrecipes/*.jsonfile and refreshes the in-memory recipe index.POST /recipes/reloadrescans the recipe directory and returns any localization warnings for the selected locale.- Recipe listing, planning, and reload responses may include
localization_warningswhen a recipe is incomplete for a locale.
Consume confirmed stock:
{
"locale": "en",
"household_id": "default",
"item_name": "egg",
"quantity": 2,
"unit": "piece"
}Patch a batch:
{
"locale": "en",
"household_id": "default",
"quantity": 8,
"expiration_date": "2026-03-30"
}Delete a batch:
curl -X DELETE 'http://127.0.0.1:8000/inventory/batches/12?locale=en&household_id=default'POST /recipes expects curated bilingual content. English and Simplified Chinese titles and every step translation are required.
Example:
{
"locale": "en",
"recipe_id": "lemon-chicken-prep",
"title_translations": {
"en": "Lemon Chicken Prep",
"zh": "柠檬鸡肉备餐"
},
"tags": ["meal prep", "personal"],
"proficiency": "established",
"source_type": "personal",
"ingredients": [
{"name": "chicken breast", "quantity": 1, "unit": "piece"},
{"name": "broccoli", "quantity": 1, "unit": "piece"}
],
"condiments": ["soy sauce", "salt"],
"steps": [
{"en": "Season and sear the chicken.", "zh": "调味后煎鸡肉。"},
{"en": "Cook broccoli and portion for the week.", "zh": "炒西兰花并分装。"}
],
"macro_summary": {
"protein": "high",
"fiber": "medium",
"fats": "low"
},
"search_hints": ["meal prep"]
}Validation rules:
title_translations.enandtitle_translations.zh/zh-Hansare required.- At least one ingredient is required.
- At least one step is required.
- Every step must include both English and Simplified Chinese text.
macro_summaryis required.- If
recipe_idis omitted, it is generated from the English title.
- SQLite database:
data/chef_claw.db - Recipe files:
recipes/*.json - Pantry thresholds:
data/pantry_thresholds.json
- Responses are concise and mobile-oriented.
- Language is mirrored from the
languagefield supplied by OpenClaw. - Web search is not performed in-process. The service returns structured search requests when local recipes are insufficient.
- Recipe familiarity is represented by
source_type: "personal"andproficiency: "established". meal-prepis supported as a tag/category filter for listing, but planning does not yet filter or rank recipes by tag.
MIT. See LICENSE.