From brew
Use when the user wants a Fellow Aiden coffee profile for a bag they name (roaster, origin, roast) or photograph. Also triggers on `/brew`.
How this skill is triggered — by the user, by Claude, or both
Slash command
/brew:brewThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Turn a coffee bag into a well-tuned Fellow Aiden profile, then stop. You pick the
/brew — Fellow Aiden profile factoryTurn a coffee bag into a well-tuned Fellow Aiden profile, then stop. You pick the
volume, read the grams, and grind at the machine — the profile carries everything
needed for that. Brewing and scheduling are not this skill's job: they live in
the MCP (brew_now, create_schedule) and you reach them by saying "brew now".
/brew.Just the bean — from text or a photo. Ask only if roast or origin is genuinely
ambiguous; never guess them. Do not ask for a target volume — the profile is
volume-agnostic (a profile_type=0 profile carries both single-serve and batch
settings, and the device shows the dose once you pick millilitres).
coffee://profiles for an existing match — roaster + coffee-name
substring (e.g. "Intermission" + "Spring Bloom"). User profiles live in the
Custom folder. If one matches, reuse it and say so; skip the rest. Only
create fresh if there's no match or the user asks for a new one.coffee://profiles via the decision tree in
references/profile-heuristics.md.query_palate(varietal, process, roast_level, origin, altitude_masl) for the user's tasting history of similar beans (see below).create_profile with profile_type=0, °C temps, and the grind-span title.query_palate returns {tendency, confidence, n, neighbours} — tendency is the
similarity-weighted mean of the signed tasting axes (−2…+2) across the user's similar
past brews. If n ≥ 2 and confidence is meaningful, translate the tendency into a
template nudge via the fault→lever mapping and say why:
"Your last 3 Geisha naturals averaged sour (+1.5 acidity) — starting one grind finer and ratio 16.0 instead of the template's 16.5."
Lever directions: acidity + (trends sour) → grind finer / ratio tighter; bitterness +
(trends bitter) → grind coarser; strength +/− → ratio looser/tighter. If n = 0 or
confidence is low, proceed from the template silently — never invent history.
These are the traps a fresh agent falls into. Always use these.
| Param | Value | Why |
|---|---|---|
profile_type | 0 (int) | 0 = universal (accepts both batch and ss pulse fields). 1 is Cold Brew only; the Fellow cloud rejects all pulse fields when type ≠ 0. |
| Temperatures | °C | Celsius only. Range 50.0–99.0 in 0.5 steps. No Fahrenheit. Never. |
ratio | water:coffee | Allowed: 14.0, 14.5, …, 20.0 (0.5 steps). |
bloom_ratio | bloom-water:coffee | Allowed: 1.0, 1.5, 2.0, 2.5, 3.0. |
bloom_duration | seconds, 1–120 | Real profiles use 30–45. Stay in that range. |
ss_pulse_temperatures / batch_pulse_temperatures | list of °C floats, length == corresponding *_pulses_number | e.g. ss_pulses_number=3 → ss_pulse_temperatures=[93.0, 93.0, 93.0]. |
ss_pulses_interval / batch_pulses_interval | seconds, 5–60 | Use 23 for ss, 30 for batch (matches existing "drops" profiles). |
A profile_type=0 profile sets both ss and batch pulse fields — that's why one
profile serves any volume, and why you never ask which mode up front.
Fellow's Fellow/ folder has three roast baselines (plocal0-2) and drops/ has
~10 curated real-world recipes. Always clone one as the starting point rather than
inventing params. Full decision tree + template table: references/profile-heuristics.md.
Quick overview:
| Bean profile | Template |
|---|---|
| Processing = fermented / anaerobic / natural-with-funk | d103 Black & White (light funk) or d102 Brandywine (deep funk) |
| Origin = East African washed (Kenya, Ethiopia w.) | d24 Regalia, Kenya Gitare AB |
| Origin = Latin America, light-medium | d67 Broadsheet, Jorge Rojas La Roca |
| Origin = Latin America, standard medium (Peru, Mexico) | d105 Olympia / d108 Paloma |
| Origin = Brazil (chocolatey, natural) | d110 Square Mile, Sitio da Torre |
| Origin = Indonesia / earthy / low-acid | d106 Andytown, Indonesia Mt Ijen |
| Dark blend or espresso-leaning roast | d111 Square Mile, Red Brick / d112 K Brew Scruffy City |
| Unknown origin, standard roast | plocal0 (light) / plocal1 (medium) / plocal2 (dark) |
Fetch params at invocation via coffee://profiles — don't hardcode them; IDs change.
Roast-delta adjust vs the template:
| Delta | Nudge |
|---|---|
| Bean lighter than template | ratio +0.5, bloom_temperature +0.5 °C |
| Bean darker than template | ratio -0.5, each pulse temperature -1 to -2 °C |
Keep the template's pulse pattern (flat vs descending) and count.
These over-extract and shed florals easily, and the drop-clone defaults lean the wrong way for them. For a Geisha or fruity light natural, override toward:
The profile is volume-agnostic, but the right Ode Gen 2 grind isn't: single-serve grinds finer than batch (larger dose → deeper bed → coarser to avoid over-extraction). So derive both, and put both in the title. Scale 1.0–11.2, lower = finer.
| Roast | Single-serve (≤450 ml) | Batch (451 ml+, climbs with size) |
|---|---|---|
| Light | 5 | 7 |
| Medium | 6 | 7 |
| Dark | 7 | 8 |
4-8.These are native Gen 2 numbers — do NOT translate from Gen 1. Prefer Fellow's first-party per-coffee call when the user has it.
Leo's brew water is BWT magnesium-mineralised — calcium stripped, magnesium added, soft, near-neutral pH.
The first token of the title is the grind span <SS>-<batch>, so you can read
the grind straight off the device's profile list:
4-8 Intermission Geisha Colombia
│ └── batch grind (climb from here as the carafe fills)
└──── single-serve grind
fellow_aiden library validates with
TITLE_REGEX = [A-Za-z0-9 !@#$%&*\-+?/.,:)(]+ and fullmatch — so ~, →, –,
·, _, [], {}, ", ' are all rejected before the request leaves the
machine. Of the range glyphs, only -, /, : are legal; use -.<SS>-<batch> <Roaster> <Origin> or … <Coffee Name>.After create_profile, print this and stop (no checklist, no brew-now nudge —
those happen at the machine):
Created: 4-8 Intermission Geisha Colombia
Grind (Ode 2): 4 single-serve · 6-9 batch (climb with size)
Ratio: 1 : 16.5
Bloom: 45 s @ 96 °C (2.5×)
Pulses: 3 flat @ 94 °C
Template: d110 Square Mile (Brazil natural) + Geisha overrides
Synced to Fellow cloud. Pick ml at the machine.
Fellow's basket split is single-serve 0–450 ml, batch 451 ml+. The single-serve basket physically changes to the flat batch basket at that line — that's the step in the grind, and the only reason the boundary matters here. (You still never ask the volume.)
| Case | Handling |
|---|---|
| Bean info ambiguous | Ask. Don't guess origin/roast. |
| Existing profile matches the bag | Reuse it; report the title + id. Don't duplicate. |
| Fellow cloud 400 | Surface the upstream message array verbatim. Common cause: profile_type ≠ 0 with pulse fields set, or an out-of-charset title. |
This skill creates the profile and stops. Handled elsewhere:
brew_now and create_schedule tools. Reach
them by saying "brew now"; the server does duration, timezone and READY-time math.journal context.profile_type=1 with pulse fields → stop, use 0.coffee://device, render a checklist, estimate duration, or call
brew_now as part of /brew → stop, all out of scope; this skill ends at the
recipe card.coffee://profiles dedup check → stop, reuse before creating.query_palate for a bean whose dimensions
you know → stop, check palate history first and pre-correct (step 4).~, →, ·, en-dash) → stop, lead with <SS>-<batch> using a plain hyphen.Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub leolebleis/brew --plugin brew