{"id":47703894,"url":"https://github.com/zsiddique/bean-whisperer","last_synced_at":"2026-04-04T21:01:04.292Z","repository":{"id":347694882,"uuid":"1194870000","full_name":"zsiddique/bean-whisperer","owner":"zsiddique","description":"AI-powered espresso profile generator for GaggiMate Pro. Snap a photo, get a dialed-in profile, push to your machine.","archived":false,"fork":false,"pushed_at":"2026-03-29T16:15:54.000Z","size":72,"stargazers_count":7,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-03T20:48:23.592Z","etag":null,"topics":["coffee","espresso","gaggimate","lance-hedrick","openclaw","pressure-profiling","rancilio-silvia"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zsiddique.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-28T23:15:48.000Z","updated_at":"2026-04-01T18:14:31.000Z","dependencies_parsed_at":null,"dependency_job_id":"cb87fefa-e2c4-4b80-bc34-5efc00645d1a","html_url":"https://github.com/zsiddique/bean-whisperer","commit_stats":null,"previous_names":["zsiddique/bean-whisperer"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/zsiddique/bean-whisperer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zsiddique%2Fbean-whisperer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zsiddique%2Fbean-whisperer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zsiddique%2Fbean-whisperer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zsiddique%2Fbean-whisperer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zsiddique","download_url":"https://codeload.github.com/zsiddique/bean-whisperer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zsiddique%2Fbean-whisperer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31413945,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T20:09:54.854Z","status":"ssl_error","status_checked_at":"2026-04-04T20:09:44.350Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["coffee","espresso","gaggimate","lance-hedrick","openclaw","pressure-profiling","rancilio-silvia"],"created_at":"2026-04-02T17:48:48.432Z","updated_at":"2026-04-04T21:01:04.259Z","avatar_url":"https://github.com/zsiddique.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ch1 align=\"center\"\u003eBeanWhisperer\u003c/h1\u003e\n  \u003cp align=\"center\"\u003e\n    \u003cem\u003eYour AI barista that speaks fluent GaggiMate.\u003c/em\u003e\n  \u003c/p\u003e\n  \u003cp align=\"center\"\u003e\n    \u003ca href=\"https://github.com/zsiddique/bean-whisperer/actions/workflows/ci.yml\"\u003e\u003cimg src=\"https://github.com/zsiddique/bean-whisperer/actions/workflows/ci.yml/badge.svg\" alt=\"CI\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/zsiddique/bean-whisperer/actions/workflows/semgrep.yml\"\u003e\u003cimg src=\"https://img.shields.io/badge/security-semgrep-blue\" alt=\"Semgrep\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/zsiddique/bean-whisperer/actions/workflows/validate-skill.yml\"\u003e\u003cimg src=\"https://github.com/zsiddique/bean-whisperer/actions/workflows/validate-skill.yml/badge.svg\" alt=\"SKILL.md\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://clawhub.ai/zsiddique/bean-whisperer\"\u003e\u003cimg src=\"https://img.shields.io/badge/ClawHub-bean--whisperer-orange\" alt=\"ClawHub\"\u003e\u003c/a\u003e\n    \u003ca href=\"LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-MIT-green\" alt=\"License: MIT\"\u003e\u003c/a\u003e\n  \u003c/p\u003e\n\u003c/p\u003e\n\n---\n\n\u003e **Snap a photo of your beans. Get a dialed-in pressure profile. Push it to your machine. Sip.**\n\u003e\n\u003e BeanWhisperer is an AI-powered espresso profile generator for [GaggiMate](https://gaggimate.eu/) Pro machines. It encodes [Lance Hedrick's](https://www.youtube.com/@LanceHedrick) espresso methodology into a tool that reasons about your coffee, generates optimized pressure profiles, and deploys them over WebSocket — all from a single conversation.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/zsiddique/bean-whisperer/releases/download/v0.2.0/demo.gif\" alt=\"BeanWhisperer demo\" width=\"700\"\u003e\n\u003c/p\u003e\n\n---\n\n## How It Works\n\n```\n  Bean Photo / Name\n        |\n        v\n  [Identify Bean] -----\u003e roast, origin, process, freshness\n        |\n        v\n  [Generate Profile] --\u003e strategy, temp, ratio, dose, phases\n        |\n        v\n  [Push to Machine] ---\u003e ws://gaggimate.local/ws\n        |\n        v\n  [Taste Feedback] ----\u003e \"too sour\" / \"bitter\" / \"thin\"\n        |\n        v\n  [Adjust \u0026 Re-push] --\u003e iterate until dialed in\n```\n\n## Quick Install\n\n### ClawHub (Recommended)\n\n```bash\nclawhub install bean-whisperer\n```\n\n### OpenClaw Workspace\n\n```bash\ncd ~/.openclaw/workspace/skills\ngit clone git@github.com:zsiddique/bean-whisperer.git\n```\n\n### Standalone\n\n```bash\npip install websockets aiohttp\n```\n\n## Talk to It\n\nOnce installed as an OpenClaw or ClawHub skill, just talk naturally:\n\n| You say | BeanWhisperer does |\n|---------|-------------------|\n| *Send a photo of a bean bag* | Identifies the bean, generates a profile, explains why |\n| \"New bean: Onyx Tropical Weather\" | Researches it, picks strategy, creates profile |\n| \"Find me a lever profile for dark roast\" | Searches Discord community profiles |\n| \"Push it to my machine\" | Deploys via WebSocket in one command |\n| \"It was a bit sour\" | Extends ratio (not finer!), re-pushes adjusted profile |\n| \"Make it an allonge\" | Switches to low-contact strategy, 1:3.5 ratio |\n\nThe agent adopts a Lance Hedrick-style barista persona — it explains *why* every parameter was chosen using the sour-sweet-bitter framework.\n\n## Profile Strategies\n\nSix pressure profile strategies, auto-selected based on your bean:\n\n| Strategy | Best For | Pressure | Time |\n|----------|----------|----------|------|\n| **bloom** | Light washed, African | 6-7 bar | 25-30s |\n| **turbo** | Ultra light, processed, aged | 2-6 bar | 15-20s |\n| **lever** | Medium, balanced | 8-9 bar declining | 30-40s |\n| **declining** | Medium-dark, dark | 9 to 5.5 bar | 25-35s |\n| **flat** | Any (safe starting point) | 9 bar sustained | 25-35s |\n| **low-contact** | Ultra light geisha | 1-3 bar | 15-20s |\n\n### Auto-Selection\n\n| Roast | Process | Strategy |\n|-------|---------|----------|\n| Light | Washed | bloom |\n| Light | Natural | turbo |\n| Medium-light | Washed (African) | bloom |\n| Medium-light | Washed (other) | lever |\n| Medium | Any | lever |\n| Medium-dark / Dark | Any | declining |\n| Any | Anaerobic / Co-ferment | turbo |\n| Any (aged \u003e8 weeks) | Any | turbo |\n\n## Lance Hedrick's Methodology\n\n\u003e *\"Pressure is a red herring.\"*\n\n1. **Pressure is a red herring** — balance \u003e 9 bar. World-class espresso at 2-4 bar.\n2. **Ratio is #1** — extend ratio before going finer.\n3. **Coarser is default** — more even flow, less channeling.\n4. **Temperature: lower than you think** — default 90C, rarely above 93-94.\n5. **Processed coffees need gentleness** — low temp, coarser, moderate ratio.\n6. **Aged coffee: accept low pressure** — don't go finer to compensate.\n7. **Crema does not equal quality** — a balanced thin shot beats a thick channeled mess.\n\nSee [`references/lance-hedrick-methodology.md`](references/lance-hedrick-methodology.md) for the full framework.\n\n## CLI Usage\n\n### Generate a Profile\n\n```bash\npython3 scripts/generate-profile.py \\\n  --label \"Ethiopian Yirgacheffe\" \\\n  --roast light --origin ethiopia --process washed \\\n  --output my-profile.json\n```\n\nAll parameters auto-select based on the bean. Override any of them:\n\n```bash\npython3 scripts/generate-profile.py \\\n  --label \"My Custom Profile\" \\\n  --roast medium --origin colombia --process natural \\\n  --dose 18 --ratio 2.2 --temp 91 --strategy lever \\\n  --style espresso --freshness fresh --output custom.json\n```\n\n### Push to Machine\n\n```bash\npython3 scripts/gaggimate-ws.py push my-profile.json    # save + favorite + select\npython3 scripts/gaggimate-ws.py list                     # show all profiles\npython3 scripts/gaggimate-ws.py get \u003cid\u003e                 # export profile JSON\npython3 scripts/gaggimate-ws.py delete \u003cid\u003e              # remove a profile\n```\n\n### Browse Discord Community Profiles\n\n```bash\npython3 scripts/discord-profiles.py list                 # recent profiles\npython3 scripts/discord-profiles.py search \"lever\"       # search by name\npython3 scripts/discord-profiles.py recommend light kenya # AI recommendations\npython3 scripts/discord-profiles.py download \u003cthread-id\u003e  # download profile\n```\n\n## Environment Variables\n\n```bash\n# Override GaggiMate hostname (default: gaggimate.local)\nexport GAGGIMATE_HOST=192.168.1.100\n\n# Discord community profiles (store in ~/.config/gaggimate/discord-token)\nexport DISCORD_TOKEN=\"your-token\"\n```\n\n## Parameters Reference\n\n| Parameter | Values | Default | Notes |\n|-----------|--------|---------|-------|\n| `--label` | string | *(required)* | Profile name on machine |\n| `--roast` | light, medium-light, medium, medium-dark, dark | *(required)* | Drives strategy/temp/ratio |\n| `--origin` | ethiopia, colombia, brazil, kenya, sumatra, guatemala, costarica, blend, other | other | Affects strategy for certain roasts |\n| `--process` | washed, natural, honey, anaerobic, co-ferment, unknown | washed | Anaerobic/co-ferment = gentle |\n| `--dose` | 17-20 | auto | 20g light, 18g darker |\n| `--ratio` | 1.5-3.5 | auto | Lance's ratio rules |\n| `--temp` | 85-96 | auto | Roast + process based |\n| `--strategy` | auto, bloom, turbo, lever, declining, flat, low-contact | auto | Override auto-selection |\n| `--style` | espresso, ristretto, lungo, milk, allonge | espresso | Adjusts ratio target |\n| `--freshness` | fresh, rested, aged | fresh | Aged = turbo strategy |\n\n## Machine Compatibility\n\nBuilt for **Rancilio Silvia + GaggiMate Pro**, works on any GaggiMate machine:\n\n- Gaggia Classic / Classic Pro / Evo\n- Rancilio Silvia (all versions)\n- Any machine with GaggiMate Pro (pressure transducer + flow profiling)\n- GaggiMate Standard (basic `\"type\": \"standard\"` profiles)\n\n## Examples\n\nPre-generated profiles in [`examples/`](examples/):\n\n| File | Bean | Strategy |\n|------|------|----------|\n| `light-washed-bloom.json` | Light Ethiopian | bloom |\n| `medium-lever.json` | Medium Colombian | lever |\n| `dark-declining.json` | Dark Italian blend | declining |\n| `anaerobic-turbo.json` | Anaerobic natural | turbo |\n| `geisha-allonge.json` | Light Geisha | low-contact |\n| `sir-lancelots-lever.json` | Community (Lance's) | lever |\n\n## Community\n\n- [GaggiMate Discord](https://discord.gg/APw7rgPGPf) — `#profiles` channel\n- [GaggiMate Docs](https://docs.gaggimate.eu/docs/profiles/) — Official profile docs\n- [GaggiMate Firmware](https://github.com/jniebuhr/gaggimate) — Source code\n\n## Credits\n\n- **[GaggiMate](https://gaggimate.eu/)** by Jokim Niebuhr — the firmware making this possible\n- **[Lance Hedrick](https://www.youtube.com/@LanceHedrick)** — espresso methodology and philosophy\n- **GaggiMate Discord community** — profile strategies and testing\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzsiddique%2Fbean-whisperer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzsiddique%2Fbean-whisperer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzsiddique%2Fbean-whisperer/lists"}