Search This Blog
HexRoast is a craft coffee brand and journal built by a small team of developers and designers who got tired of drinking bad coffee while shipping good software. https://hexroast.com
Featured
- Get link
- X
- Other Apps
I Treated My Morning Coffee Routine Like a System Design Problem. It Worked.
Every system I've built at work has the same design goals: low latency, predictable output, minimal failure modes, no manual intervention. I finally applied those same constraints to my morning coffee. It's been running in production for eight months without a missed cup.
Before I got deliberate about this, my morning coffee situation had a reliability problem. Some days it was excellent. More often it was fine. Occasionally I'd skip it entirely because it felt like too much effort before I was awake enough to make it. The output was inconsistent. The process had too many decision points. I was making it up fresh every morning.
When I started thinking about it as a system — with the same vocabulary I'd use to review architecture at work — the problems became obvious and the fixes became boring and effective.
Diagnosis: where the system was failing
Too many runtime decisions. Every morning I was deciding: which beans, which recipe, how much water, grind this fine or finer than yesterday? These aren't hard decisions. But they're decisions that require a brain that isn't awake yet. The cognitive load of a dozen small choices in sequence was making the whole process feel heavier than it was.
Undefined state at startup. I never knew if I had beans until I checked the bag. I never knew if I had filters until I opened the drawer. I'd sometimes start the process and have to abort partway through because something was missing. Every partial failure burned more time and frustration than just making instant would have.
No monitoring or recovery plan. If I had a bad cup, I couldn't tell you why. I hadn't been consistent enough to isolate variables. I'd changed too many things at once — different beans, different grind, different amount of water — and had no baseline to return to.
None of these are coffee problems. They're systems problems. Same issues I'd flag in any poorly designed service.
The redesign
Pin the recipe. Don't iterate at 7am.
I have one recipe. It doesn't change unless I'm deliberately testing something, and I only test on weekends when I have the cognitive bandwidth to actually evaluate what I'm tasting. On weekday mornings, the recipe is fixed: 17g coffee, 250g water at 92°C, 90-second steep, 30-second press. That's it. No decisions. No variations.
This felt like giving something up when I first committed to it. In practice, it freed up mental space I didn't realize I was spending. The ritual became automatic — like deploying from a script rather than typing commands from memory each time. Fast, reliable, no surprises.
Maintain known state at all times.
I reorder beans when the bag hits roughly 150g — about a week before I run out. I do this immediately, not when I notice I'm almost empty. I keep one spare set of Aeropress filters. My storage container lives on the counter, not in a cabinet. Everything required to make coffee is visible and accessible in under five seconds.
This is the same principle as keeping dependencies pinned and documented. You don't want to discover a missing library when you're trying to ship. You don't want to discover you're out of beans when you're trying to start your workday.
Eliminate decision points through hardware.
A gooseneck kettle with a temperature setting handles water temperature without me thinking about it. I set it to 92°C and press the button. It reaches temperature and holds. I don't wait by the kettle, I don't check, I don't estimate. It tells me when it's ready.
A scale handles ratio without me thinking about it. I zero the scale, add beans until the reading says 17, zero again, add water until it says 250. No measuring cups, no scoops, no estimation. The numbers are the same every time.
The goal is to make the correct action the default action — no willpower required, no memory required. Hardware does the work that brains are bad at before coffee.
Build in observability.
When I have a bad cup now, I can usually tell you why — I know what the correct output looks and tastes like because I've made the same recipe hundreds of times. A flat cup means water temperature was too low or grind was too coarse. A harsh cup means I over-extracted: grind too fine or water too hot. I have a baseline. I can debug.
This wasn't possible when my recipe changed every day. Consistency in process is a prerequisite for meaningful feedback. This is true in brewing and in code.
The setup cost vs the operational cost
Getting to a stable morning coffee system had a one-time setup cost: choosing a recipe, buying the right gear, organizing the kitchen space, deciding on a reorder threshold for beans. This took maybe an afternoon of deliberate thought spread over two weeks.
The operational cost — what it takes to run the system each morning — is now close to zero. Four minutes of physical activity, zero cognitive overhead, zero decisions, zero failures in eight months. The routine runs the same way a cron job runs: triggered by a time, executes a defined script, produces a known output, requires no human attention.
Most people approach their morning coffee as a daily improvisation. They wonder why it's inconsistent and why they sometimes skip it. The problem isn't motivation — it's system design. A well-designed routine doesn't require motivation. It runs because the environment makes running it easier than not running it.
The three constraints that make or break a daily routine
Duration. If the total time from start to first sip exceeds six or seven minutes, you'll start skipping it on busy days. Busy days are exactly when you most need the ritual. Keep the process short enough that "I don't have time" is never true.
Friction. Every step that requires more than one action is a potential abort point. If your equipment is stored in three different cabinets, that's friction. If your grinder requires assembly, that's friction. If your recipe requires looking something up, that's friction. Identify and eliminate every unnecessary step.
Reversibility. The system should be easy to recover from a miss. If you're out of beans, what's the fallback? (Mine is a stash of good-quality instant in the back of the drawer — no shame, just pragmatism.) If your brewer breaks, what's the backup? Designing for failure modes in advance means a miss doesn't become a spiral.
Eight months later
I have not skipped my morning coffee because of setup friction in eight months. I have had bad cups — three or four times when I was distracted and got the temperature wrong, once when I let beans go genuinely stale by miscounting the days. Each failure was diagnosable and correctable. None of them repeated.
The coffee is better than before, which is partly better technique and mostly consistency. The mornings are better than before, which is entirely the result of one fewer thing to decide before I'm fully awake. A solved problem stays solved. That's the point of good system design — you do the thinking once so you don't have to keep doing it.
Apply this to your morning coffee. Then apply it to everything else.
The complete morning stack is on the main site
This was the systems thinking overview. The full guide on HexRoast breaks down the entire developer morning coffee stack — gear, recipes, reorder schedules, and how to build a routine from scratch in under a week:
→ Coffee for Developers: The Full Brew Stack · hexroast.comSubscribe to the roastlog newsletter → hexroast.com/#waitlist
- Get link
- X
- Other Apps
Popular Posts
First Time Buying Ethiopian Beans: 3 Mistakes I Made
- Get link
- X
- Other Apps
Water is 98% of Your Coffee. You're Probably Getting It Wrong.
- Get link
- X
- Other Apps
Comments
Post a Comment