Generate and deploy espresso profiles for GaggiMate Pro on a Rancilio Silvia. Based on Lance Hedrick's espresso methodology.
gaggimate.local — WebSocket at ws://gaggimate.local/ws (override with GAGGIMATE_HOST env var)Read references/lance-hedrick-methodology.md for the full framework. Key principles:
Photo: Extract bean name, roaster, origin, roast level, processing method, tasting notes.
Name: Search web for origin, roast, process, flavor notes.
Always check the community first. A battle-tested profile tweaked for this bean is the best starting point.
python3 scripts/discord-profiles.py recommend <roast> [<origin>]
python3 scripts/discord-profiles.py search "<strategy or keyword>"
Download the best candidate and evaluate it against the bean's characteristics. Then decide:
If tweaking a community profile (from step 2):
Modify the downloaded JSON directly — adjust temperature, phases[].pump.pressure, phases[].pump.flow, ratio (volumetric target values), or dose. Use the Lance Hedrick methodology to decide what to change for this specific bean. Save the modified profile to /tmp/profile.json.
If generating fresh (no good Discord match):
Static mode (default — fast, deterministic, schema-compliant):
python3 scripts/generate-profile.py \
--label "Bean Name" \
--roast <level> --origin <origin> --process <method> \
--dose <g> --ratio <ratio> --temp <temp> \
--strategy <auto|flat|declining|bloom|lever|turbo|low-contact> \
--style <espresso|ristretto|lungo|milk|allonge> \
--freshness <fresh|rested|aged> \
--output /tmp/profile.json
LLM mode (for edge cases, unusual beans, taste-based iteration):
Read references/barista-persona.md and adopt the Lance Hedrick persona defined in the system prompt section. Reason about the bean as that persona, decide parameters, then pass to the static generator for valid JSON. Always explain the "why" behind every choice using the sour-sweet-bitter framework. For post-shot iteration, stay in persona and adjust based on taste feedback.
Present: strategy, phases, temperature, dose/ratio, expected shot time, expected pressure. Explain WHY this strategy suits their bean using the sour-sweet-bitter framework. Be honest about trade-offs. If based on a community profile, credit the original author.
python3 scripts/gaggimate-ws.py push /tmp/profile.json
Saves + favorites + selects in one step. Requires pip3 install websockets.
If user reports taste feedback ("it was sour", "bitter finish", "too thin"):
| Roast | Process | Freshness | Strategy | Pressure | Time |
|---|---|---|---|---|---|
| ------- | --------- | ----------- | ---------- | ---------- | ------ |
| Light | Washed | Fresh | Bloom | 6-7 bar | 25-30s |
| Light | Natural | Fresh | Turbo | 2-6 bar | 15-20s |
| Light | Any | Aged | Turbo | 2-4 bar | 15-20s |
| Med-Light | Washed (African) | Fresh | Bloom | 6-7 bar | 25-30s |
| Med-Light | Washed (other) | Fresh | Lever | 8-9→6 bar | 30-40s |
| Medium | Any | Fresh | Lever | 9→6 bar | 30-40s |
| Med-Dark | Any | Fresh | Declining | 9→5.5 bar | 25-35s |
| Dark | Any | Fresh | Declining | 9→5.5 bar | 20-25s |
| Any | Anaerobic/Co-ferment | Any | Turbo | 3-6 bar | 15-20s |
python3 scripts/gaggimate-ws.py list # Show all profiles
python3 scripts/gaggimate-ws.py get <id> # Export profile JSON
python3 scripts/gaggimate-ws.py save profile.json # Upload without selecting
python3 scripts/gaggimate-ws.py delete <id> # Remove a profile
python3 scripts/gaggimate-ws.py push profile.json # Save + favorite + select
gaggimate-ws.py fails with a connection error, tell the user to check that GaggiMate is powered on and reachable at the configured host. Suggest saving the profile JSON locally and pushing later.targets.type: "volumetric") require a scale. If the user has no scale, switch to time-based stops by removing volumetric targets and relying on phase duration values instead."type": "standard" profiles with only temperature and time — no pressure/flow phases.references/lance-hedrick-methodology.md — full framework with temp/ratio/pressure rulesreferences/barista-persona.md — system prompt for LLM-driven profile generationreferences/espresso-knowledge.md — origin/process/strategy detailsreferences/profile-schema.jsonreferences/websocket-api.mdThe GaggiMate Discord has a #profiles channel where users share JSON profiles (like the Sir Lancelot's Lever profile Lance imported in his video). Use discord-profiles.py to search, browse, and download community profiles.
Requires: DISCORD_TOKEN env var (bot token with access to GaggiMate Discord guild 951416527721230336).
# Browse recent community profiles
python3 scripts/discord-profiles.py list --limit 30
# Search for profiles matching a style
python3 scripts/discord-profiles.py search "lever"
python3 scripts/discord-profiles.py search "light roast"
# Get AI recommendations based on bean characteristics
python3 scripts/discord-profiles.py recommend light kenya
python3 scripts/discord-profiles.py recommend dark
# Download a specific profile by Discord message ID
python3 scripts/discord-profiles.py download 1380352847387820082
# Bulk download all recent profiles
python3 scripts/discord-profiles.py download-all --limit 50
gaggimate-ws.py pushDiscord search (step 2) is always the first action. Only generate from scratch when:
共 1 个版本