const BREWS = [ { id: 'v60', index: '01', name: 'V60', subtitle: 'Pour Over', ratio: '1 : 15', temp: '93°C', grind: 'Medium-Fine', time: '3:00', yield: '225ml', bean: 'WANOJA', beanSub: 'Jasmine notes unfurl under a gentle spiral pour.', steps: [ { time: '0:00', act: 'Rinse filter, preheat dripper and vessel. Discard rinse water.' }, { time: '0:00', act: 'Dose 15g of freshly ground coffee. Level the bed.' }, { time: '0:30', act: 'Bloom — pour 45ml in a slow centre spiral. Wait 30 seconds for outgassing.' }, { time: '1:00', act: 'First pour — bring total to 150ml in a steady outward spiral over 20 seconds.' }, { time: '1:45', act: 'Second pour — bring total to 225ml. Do not agitate.' }, { time: '3:00', act: 'Full drawdown. Remove dripper. Serve immediately.' }, ], }, { id: 'frenchpress', index: '02', name: 'French Press', subtitle: 'Full Immersion', ratio: '1 : 12', temp: '96°C', grind: 'Coarse', time: '4:30', yield: '300ml', bean: 'GOWA', beanSub: 'The natural process rewards immersion — dark chocolate amplified, texture thick.', steps: [ { time: '0:00', act: 'Dose 25g of coarsely ground coffee into a preheated press.' }, { time: '0:00', act: 'Bloom — pour 50ml, stir once to saturate all grounds.' }, { time: '0:30', act: 'Pour remaining water to 300ml. Place lid, plunger up. Do not press.' }, { time: '4:00', act: 'After 4 minutes, skim the surface crust with a spoon. Do not press yet.' }, { time: '4:15', act: 'Press the plunger slowly and deliberately over 15 seconds.' }, { time: '4:30', act: 'Pour immediately. Never let it sit — bitterness compounds fast.' }, ], }, { id: 'aeropress', index: '03', name: 'AeroPress', subtitle: 'Inverted Method', ratio: '1 : 13', temp: '88°C', grind: 'Medium', time: '2:00', yield: '220ml', bean: 'KENYA AA', beanSub: 'Lower temperature tames acidity. Blackcurrant arrives clean and precise.', steps: [ { time: '0:00', act: 'Assemble inverted. Rinse paper filter. Dose 17g of coffee.' }, { time: '0:15', act: 'Pour to 220ml in one steady fill. Ensure all grounds are saturated.' }, { time: '0:30', act: 'Stir 10 times with paddle. Replace filter cap — do not flip yet.' }, { time: '1:00', act: 'Flip carefully onto your cup. Begin pressing slowly.' }, { time: '1:30', act: 'Stop pressing when you hear the first hiss of air. Do not force.' }, { time: '2:00', act: 'Dilute to taste if desired. Serve immediately.' }, ], }, { id: 'coldbrew', index: '04', name: 'Cold Brew', subtitle: '12–18 Hour Steep', ratio: '1 : 8', temp: '4°C', grind: 'Extra Coarse', time: '15h', yield: '400ml', bean: 'PANAMA GEISHA', beanSub: 'Time replaces heat. Elderflower and white peach emerge unhurried over fifteen hours.', steps: [ { time: '0:00', act: 'Dose 50g of extra-coarse ground coffee into a clean jar or pitcher.' }, { time: '0:00', act: 'Pour 400ml of cold, filtered water. Stir thoroughly to saturate all grounds.' }, { time: '0:05', act: 'Cover tightly. Place in refrigerator.' }, { time: '12h+', act: 'Steep for 12–18 hours. Longer steep = heavier body, less brightness.' }, { time: 'After', act: 'Strain through a fine-mesh sieve, then once more through a paper filter.' }, { time: 'Ready', act: 'Serve over ice. Dilute 1:1 with cold water if drinking straight. Keeps 10 days.' }, ], }, ]; function BrewCard({ brew, index, coffees }) { const [open, setOpen] = React.useState(false); const recBean = coffees.find(c => c.name === brew.bean); return (
{/* Header row — click to expand */}
setOpen(o => !o)} style={{ padding: '40px 48px', cursor: 'crosshair', display: 'grid', gridTemplateColumns: '56px 1fr auto', alignItems: 'center', gap: 32, transition: 'background 0.18s', background: open ? 'rgba(255,255,255,0.04)' : 'transparent', }} onMouseEnter={e => { if (!open) e.currentTarget.style.background = 'rgba(255,255,255,0.025)'; }} onMouseLeave={e => { if (!open) e.currentTarget.style.background = 'transparent'; }} > {brew.index}

{brew.name}

{brew.subtitle}
{/* Stats row */}
{[['Ratio', brew.ratio], ['Temp', brew.temp], ['Time', brew.time]].map(([k, v]) => (
{v}
{k}
))}
{/* Expanded content */}
{/* Steps */}
Steps
{brew.steps.map((s, i) => (
{s.time}
{String(i + 1).padStart(2, '0')}. {s.act}
))}
{/* Specs + Bean rec */}
Specs
{/* Big stats */}
{[['Dose', '15–25g'], ['Yield', brew.yield], ['Grind', brew.grind], ['Vessel', brew.subtitle]].map(([k, v]) => (
{k}
{v}
))}
{/* Bean recommendation */}
Recommended Origin
{brew.bean}
{recBean && (
{recBean.notes.join(' · ')}
)}
"{brew.beanSub}"
); } function RitualPage({ coffees }) { return (
{/* Header */}
Brewing Ritual

The Ritual

Brewing is not a convenience. It is a conversation between water, heat, and the memory of altitude. Below are four methods — each one tuned to a specific origin in our catalog. Follow them precisely once, then adapt them to your own silence.

{/* Brew cards */}
{BREWS.map((brew, i) => ( ))}
{/* Footer note */}

It is better to consume our roasted coffee 10–28 days after the roast date. This allows CO₂ to dissipate and the flavour to settle into itself. Grinding immediately before brewing is not optional — it is the whole point.

); } Object.assign(window, { RitualPage });