| Field | Target / Notes | Copy |
|---|---|---|
| {{ row.field }} |
{{ row.value }}
{{ row.hint }}
|
| # | Timestamp | Dose | Yield | Time | Ratio | Notes | Copy |
|---|---|---|---|---|---|---|---|
| Log a shot to start tracking adjustments. | |||||||
| #{{ entry.seq }} | {{ entry.timestamp }} | {{ entry.doseDisplay }} | {{ entry.yieldDisplay }} | {{ entry.timeDisplay }} |
{{ entry.ratioDisplay }}
{{ entry.deltaRatio }}
|
{{ entry.notes }}
{{ entry.flowNote }}
{{ entry.taste }}
{{ entry.adjustment }}
|
|
Espresso shots are concentrated coffee drinks made by pushing hot water through a compact puck of ground coffee at high pressure. Tiny changes in dose, yield, time, temperature, and pressure can shift a shot from sweet and lively to sharp or bitter.
A simple espresso shot recipe planner turns those variables into a repeatable target, so you can change one thing at a time and see how grind and workflow affect the cup. It is a practical way to keep experiments comparable when you switch beans, baskets, or pressure profiles.
Choose a style that matches your goal, like a syrupy ristretto or a fast turbo style, and start with the dry coffee weight in the basket. The planner uses that dose and your target beverage weight to express the brew ratio and a time window you can aim to land inside.
As you pull shots, record what actually happened by logging the dose, beverage weight, and total time, plus a short note about flow, pressure, or taste. The log turns each entry into an actual ratio, an average flow rate, and a suggested next adjustment when results drift outside your target window.
A plan that looks perfect on paper can still taste off when puck prep, grind retention, or water temperature changes, so treat targets as guardrails and let taste confirm the final move. Weigh carefully, time consistently, and keep notes short and specific.
If you prefer measuring by volume or relying on automatic programs, a basic shot timer may be enough, but this planner is most useful when you want weight based repeatability and a written trail. After a few entries, watch for shots that miss both time and ratio, then fix flow first and taste again.
The planner centers on a few measurable quantities: dry coffee mass in the portafilter, beverage mass in the cup, total shot time from pump on to final weight, and optional temperature and pressure targets. Together, these describe how much coffee you extracted and how quickly it moved through the puck.
From those measurements it computes brew ratio as beverage out per unit coffee in, and average flow rate as beverage out per unit time. It also builds a target time window around your chosen time, then translates that window into a flow range you can use as a quick reality check.
Results are interpreted with tolerance bands rather than a single perfect number. Ratio tolerance and time flex define what counts as close enough, and when a logged shot crosses a boundary the planner suggests a small adjustment using the same wording every time.
Comparisons are most meaningful when dose, basket, coffee, and timing method stay consistent. Treat the numbers as a structured way to learn your setup, not as a guarantee of flavor.
| Symbol | Meaning | Unit or datatype | Source |
|---|---|---|---|
| D | Dose, dry coffee mass in the basket | g | Input |
| Y | Yield, beverage mass in the cup | g | Input |
| T | Shot time from pump on to final weight | s | Input |
| R | Brew ratio, yield per unit dose | unitless | Derived |
| W | Time flex, half width of the target time window | s | Input |
| Favg | Average flow rate over the whole shot | g/s | Derived |
| Fmin, Fmax | Flow range implied by the time window | g/s | Derived |
| Rtol | Ratio tolerance used for target banding and suggestions | unitless | Input |
| P | Pressure targets during preinfusion, peak, and finish | bar | Input |
| TC | Water temperature expressed in Celsius | °C | Derived |
Worked example
Using the default balanced plan with a dose of 18 g, a target ratio of 1:2.00, a 29 s target time, and 3 s time flex.
With a ratio tolerance of 0.20, the target band is 1:1.80 to 1:2.20, and values near the edges may flip the suggested adjustment on repeat shots.
| Threshold band | Lower bound | Upper bound | Interpretation | Action cue |
|---|---|---|---|---|
| Ratio above target | +Rtol | ∞ | More beverage per coffee than planned, often thinner body | Tighten grind or lower yield to thicken body. |
| Ratio within tolerance | -Rtol | +Rtol | Close to target ratio, prioritize taste and repeatability | In range; consider small taste-driven tweaks only. |
| Ratio below target | -∞ | -Rtol | Less beverage per coffee than planned, often heavier body | Loosen grind or raise yield to open sweetness. |
| Time slower than window | +W | ∞ | Shot ran longer than expected for the target | Speed up: finer puck prep or slightly coarser grind. |
| Time faster than window | -∞ | -W | Shot finished sooner than expected for the target | Slow down: finer grind or longer preinfusion. |
| Average flow above range | Fmax | ∞ | Flow suggests a faster puck than the planned window allows | Flow too high: reduce preinfusion pressure or grind finer. |
| Average flow below range | 0 | Fmin | Flow suggests a slower puck than the planned window allows | Flow low: shorten preinfusion or grind coarser. |
A single logged shot can trigger multiple cues, and the planner concatenates them in a consistent order: ratio, time, then flow.
| Preset | Target ratio | Time range | Preinfuse | Peak→finish | Finish flow | Water temp |
|---|---|---|---|---|---|---|
| Balanced double | 1:2.00 | 26–32 s | 6 s @ 2.5 bar | 9.0→6.0 bar | 1.60 g/s | 93 °C |
| Syrupy ristretto | 1:1.80 | 24–30 s | 8 s @ 3.0 bar | 9.5→7.0 bar | 1.40 g/s | 94 °C |
| Turbo shot | 1:2.40 | 18–24 s | 4 s @ 2.0 bar | 7.5→6.0 bar | 2.10 g/s | 92 °C |
| Allongé | 1:3.00 | 30–38 s | 5 s @ 2.5 bar | 8.5→6.0 bar | 2.30 g/s | 93 °C |
| Competition sweet | 1:2.20 | 25–31 s | 7 s @ 2.5 bar | 9.0→6.5 bar | 1.70 g/s | 93 °C |
Selecting a preset also sets a default target time in the middle of the range, and the time flex is derived as half the range width.
The plan displays both Celsius and Fahrenheit, while the exported JSON includes water_temp_c as the normalized value.
| Field | Type | Min | Max | Step or pattern | Error text | Placeholder |
|---|---|---|---|---|---|---|
| Style preset | Select | — | — | Balanced, Syrupy, Turbo, Allongé, Competition | — | — |
| Dose | Number | 12 | — | 0.5 | — | — |
| Target ratio | Number | 1 | — | 0.05 | — | — |
| Target yield | Number | 10 | — | 0.5 | — | — |
| Shot time target | Number | 10 | — | 1 | — | — |
| Water temperature | Number | 80 | — | 0.5 | — | — |
| Temperature unit | Select | — | — | °C or °F | — | — |
| Grinder note | Text | — | — | Any text | — | e.g., 6.5 on Niche or SSP HU |
| Time flex | Range | 1 | 12 | 1 | — | — |
| Ratio tolerance | Range | 0.05 | 0.60 | 0.05 | — | — |
| Preinfusion seconds | Number | 0 | — | 0.5 | — | — |
| Preinfusion pressure | Number | 0 | — | 0.1 | — | — |
| Peak pressure | Number | 3 | — | 0.5 | — | — |
| Finish pressure | Number | 0 | — | 0.5 | — | — |
| Finish flow target | Number | 0.5 | — | 0.1 | — | — |
| Log dose used | Number | 10 | — | 0.1 | Enter dose, yield, and time to log a shot. | — |
| Log yield | Number | 0 | — | 0.5 | Enter dose, yield, and time to log a shot. | — |
| Log time | Number | 0 | — | 0.1 | Enter dose, yield, and time to log a shot. | — |
| Flow or pressure note | Text | — | — | Any text | — | e.g., 2 s preinfuse, gentle ramp, held 8.5 bar |
| Taste note | Text | — | — | Any text | — | e.g., sweet, light acidity, slightly hollow finish |
The planner also checks that plan values are positive before showing the plan summary, and that log dose, yield, and time are greater than zero before recording a shot.
| Output | What it includes | Format | Notes |
|---|---|---|---|
| Shot plan table | Dose, target yield and ratio, time window, flow range, pressure plan, profile note, temperature | CSV, DOCX | CSV headers are Field, Target, Notes. |
| Shot log table | Timestamp, dose, yield, time, actual ratio, notes, taste, adjustment suggestions | CSV, DOCX | Rows are newest first and include a running sequence number. |
| Trend chart | Scatter of ratio versus time with a shaded target band | PNG, WebP, JPEG, CSV | CSV columns include time, ratio, flow, deltas, and the suggestion text. |
| Combined state | Plan values plus the full log entries, including raw numeric fields | JSON | Copy and download remove any syntax highlighting markup. |
To validate your targets, cross-check them against your espresso machine manufacturer guidance, your coffee roaster brew recipes, and your own logged tasting notes. Consistency across these sources is often more useful than chasing a single perfect number.
Shot data and notes can be personal preference data; avoid entering sensitive personal information. The provided code performs calculations locally and does not transmit your entries to a server.
Plan an espresso recipe by setting targets you can measure, then log real pulls to see how close you land and what to change next.
Quick example
Set 18 g dose, target ratio 1:2.00, and a 29 s target time with 3 s flex. Pull a 36 g shot in 27 s, log it, then follow the suggestion and repeat.
When your points cluster inside the shaded band on the trend chart, your process is getting more repeatable.
Pro tip: Stop the shot by weight, not by time, and use the time and flow readings as feedback instead of a hard stop.
In the provided code, plan settings and log entries live in memory while the page is open, and exports are created when you copy or download. Refreshing clears the log.
The calculations are simple ratios and divisions, so accuracy mainly depends on your scale, timing consistency, and whether you measure from pump on to final weight. Expect small variation shot to shot.
Taste can change even when the numbers match due to puck prep and grinder drift.Dose and yield are in grams, time is in seconds, and pressure targets are in bar. Water temperature can be entered as Celsius or Fahrenheit and is displayed in both.
Planning and logging work once the page assets are loaded. If the charting component is available in your environment, the trend view and chart downloads work without additional requests.
If the chart view is blank, try reloading with a network connection so required assets can load.This package contains no account system, payments, or licensing text. If you need usage rights or attribution requirements, follow the host site guidance.
Pick the Turbo preset, pull a few shots without changing dose, and log each result. If shots land outside the ratio tolerance or time window, apply one small change and re-log to see if points move toward the shaded band.
Borderline means the logged shot landed close to your tolerance edges for ratio or time. Small measurement noise or puck variation can flip the suggestion, so repeat the shot and confirm with taste before making a big change.
Blocking issue: If the trend chart stays empty even with logged shots, reload the page with a network connection so required chart assets can load, then try again.