# Menugen

> Visualize a restaurant menu — read a menu photo, extract every dish, generate an AI food photo for each one. Use when the user uploads or references a menu photo, wants to see what dishes look like, or asks to visualize a restaurant menu.

- Skill: `akegaviar/menugen` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add akegaviar/menugen`
- Raw SKILL.md: https://api.skillmd.com/api/skills/akegaviar/menugen/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: akegaviar (https://skillmd.com/u/akegaviar)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/akegaviar/menugen

---


# MenuGen

Menu photo in → AI food photos out.

## Credentials

```
cloudflare_account_id: <not configured>
cloudflare_api_token: <not configured>
```

**Before running the workflow**, check the credentials above.

- If both values are filled in (not `<not configured>`), use them and proceed to the workflow.
- If not configured, this is the user's first time. Guide them through one-time setup:
  1. Go to [cloudflare.com](https://cloudflare.com) and sign up (free, no credit card)
  2. In the dashboard, click **AI** in the left sidebar → **Workers AI**
  3. Click the **{ } REST API** button (top-right corner)
  4. Copy the **Account ID** shown on the page
  5. Click **Create a Workers AI API Token** → **Create API Token** → copy the token (shown once)
  6. Now save the credentials permanently so you never have to do this again:
     - **Claude.ai**: Go to **Settings → Skills → menugen** → click the **`•••` menu** → **Edit with Claude** → tell it: "Set my Cloudflare credentials to account_id=PASTE_ID token=PASTE_TOKEN"
     - **Claude Code**: Say: "Set my menugen Cloudflare credentials to account_id=PASTE_ID token=PASTE_TOKEN" — it will edit the SKILL.md for you
  7. Start a new chat and try again — credentials will be there automatically.

## Workflow

1. Read the menu image with the Read tool (uses your built-in vision).
2. Extract every dish into a JSON array:
   ```json
   [{"name": "Pâté", "description": "Country-style pork with cornichons", "search": "rustic pork pate terrine with cornichons on a small plate"}, ...]
   ```
   - `name`: exactly as printed on the menu (displayed in the output)
   - `description`: only if the menu provides one
   - `search`: **required** — a detailed English prompt describing what this dish looks like for AI image generation. Be vivid and specific about ingredients, plating, and appearance (e.g. "pan-fried sole fillet in brown butter sauce with capers and lemon on a white plate" not "Limande-Sole meunière"). Omit prices, section headers, and non-food items.
3. Pipe the JSON to the script, passing credentials as inline env vars:
   ```bash
   CLOUDFLARE_ACCOUNT_ID=<id> CLOUDFLARE_API_TOKEN=<token> uv run ${CLAUDE_PLUGIN_ROOT}/scripts/generate.py <<'MENU'
   [{"name": "...", "description": "...", "search": "..."}, ...]
   MENU
   ```
   If `uv` is not available, fall back to: `pip install requests && python ${CLAUDE_PLUGIN_ROOT}/scripts/generate.py`
4. The script prints the path to the generated HTML file. Open it automatically:
   ```bash
   open menugen_output/menu.html
   ```

## Output

`menugen_output/menu.html` — a self-contained HTML page with AI-generated food photos embedded as base64 (works anywhere — local browser, Claude.ai, email). Individual images also saved to `menugen_output/images/`.

## Notes

- AI-generated food photography via FLUX.1-schnell on Cloudflare Workers AI (free tier)
- 8 parallel requests; generation takes ~15-60s depending on menu size
- Free — ~230 images/day at default settings (Cloudflare free tier, 10K neurons/day)

