---
title: "Hey you, let’s brew"
url: https://gardiner.today/past/hai-coffee
tense: past
edition: "2026.11.02"
updated: "2026-11-02"
---

# Hey you, let’s brew

Hai! Coffee

Independent. Designer and iOS developer, November 2022 to now.

A SwiftUI pour-over timer for the Hario V60 that learns from each brew and nudges the next one closer to the cup you want.

## Highlights

- [one loop](https://gardiner.today/past/hai-coffee#the-idea): Set a taste goal for each bag, rate every brew, and the app recommends what to change next.
- [about three brews](https://gardiner.today/past/hai-coffee#the-recommendation): The goal is a bag dialled in within about three brews, inside what your grinder can dial.
- [built for half awake](https://gardiner.today/past/hai-coffee#every-morning): An optional get ready, a timer that shows only what you need, and haptics to keep you on beat.
- [maintained like a product](https://gardiner.today/past/hai-coffee#engineering): Swift and SwiftUI with Acaia scale support, test plans, linting, CI and Fastlane.

## The idea

You set a taste goal for each bag of beans. After each brew you taste and rate the cup, and the app recommends what to change so the next one moves toward that goal. Over a few brews it dials the bag in.

Ask Ardo: [how does hai! coffee work?](https://gardiner.today/future?q=how%20does%20hai%21%20coffee%20work%3F)

## The 4:6 method

Hai! Coffee follows Tetsu Kasuya’s 4:6 method, which splits the water in two. The first 40% sets sweetness against acidity: bigger pours for a sweeter cup, smaller ones for a brighter one. The last 60% sets the strength. That split is what makes the feedback loop work, because a rating can point at one part of the brew and the next brew only has to change that part.

**4:6**, the split of the water: 40% for sweetness against acidity, 60% for strength

Ask Ardo: [what brewing method is hai! coffee built on?](https://gardiner.today/future?q=what%20brewing%20method%20is%20hai%21%20coffee%20built%20on%3F)

## The recommendation

After each brew you rate the first sip, and the app works out what to change next time. If the cup tastes too acidic, it might suggest a finer grind or a slower pour. It knows your grinder, whether it’s preground, stepped or stepless, so it never suggests a setting you can’t dial. The goal is a bag dialled in within about three brews.

**the call i made**: Suggest the ideal grind, or one your grinder can dial?

- Took: One your grinder can dial. Preground, stepped and stepless grinders each get advice they can follow.
- Turned down: The ideal grind. Advice you can’t act on is worse than none.

The recommendations come from H-AI, which reads your brewing history and taste ratings. It adjusts the grind, and optimises the water temperature and how the pours are spread. A dial-in sheet holds your own grind size range and a profile for each grinder. Recipes are yours to adjust, and every brew goes into a history with graphs of your ratings over time.

Ask Ardo: [what does hai! coffee suggest after a sour cup?](https://gardiner.today/future?q=what%20does%20hai%21%20coffee%20suggest%20after%20a%20sour%20cup%3F)

## Every morning

I use it every day, and it’s become part of my morning. That’s who it’s designed for: someone half awake at the kettle.

An optional get ready flow walks you through grinding, heating and rinsing one step at a time. During the pours the timer shows only what you need, with haptics to keep you on beat, and a cooldown timer holds you back from the first sip until it’s ready to taste. You can skip the cooldown for one brew, or for all of them in settings.

> That’s who it’s designed for: someone half awake at the kettle.

**the call i made**: Walk every brew through the steps, or make that optional?

- Took: Optional. It teaches a beginner and stays out of the way for everyone else.
- Turned down: Every brew. A regular would tap through the same steps every morning.

Ask Ardo: [how does he use hai! coffee himself?](https://gardiner.today/future?q=how%20does%20he%20use%20hai%21%20coffee%20himself%3F)

## The brew flow

The app has three tabs, Brew, Insights and Bags, behind a custom liquid-glass bar. Brew opens on today’s recipe, with the dose, the water at 1:15, the grind and the temperature already set. The coral brew button takes over the whole screen until the cup is done. Insights keeps every brew with its rating, so you can watch a bag get better.

Ask Ardo: [how is the hai! coffee app laid out?](https://gardiner.today/future?q=how%20is%20the%20hai%21%20coffee%20app%20laid%20out%3F)

## Design

I designed it in Figma for use first thing in the morning, so the timer shows what you need at a glance and little else. It runs on a typed design token layer covering colour, type, spacing, radius, shadow and motion, the same idea this site runs on.

Ask Ardo: [how did he design hai! coffee for the morning?](https://gardiner.today/future?q=how%20did%20he%20design%20hai%21%20coffee%20for%20the%20morning%3F)

## Engineering

It’s native Swift and SwiftUI for iOS 18 and later, with Acaia smart scale support over Bluetooth and a type-safe coordinator for routing. The code is MVVM with protocol-oriented design and dependency injection, split into models, feature modules, shared services and the design system. I maintain it like a product: unit, UI and performance tests, test plans, SwiftLint and SwiftFormat, GitHub Actions and Fastlane, accessibility and localisation. I used AI tools throughout: Roo Code, ChatGPT, Claude and Claude Code. Mostly they helped me work through SwiftUI problems and write implementation faster.

Ask Ardo: [what is hai! coffee built with?](https://gardiner.today/future?q=what%20is%20hai%21%20coffee%20built%20with%3F)

## Ask about Hai! Coffee

Ardo has read this case study and the rest of the site. Ask it what I didn’t cover, and it shows the pages its answer rests on.

Ask Ardo: [how does hai! coffee decide what to change in the next brew?](https://gardiner.today/future?q=how%20does%20hai%21%20coffee%20decide%20what%20to%20change%20in%20the%20next%20brew%3F)

## Read next

- [My standing desk, in Home Assistant](https://gardiner.today/past/ha-desky) (ha-desky): Another project of my own, built for something I use every day.
- [The product is me](https://gardiner.today/past/this-site) (gardiner.today): Where its token layer ended up, reissued every day.

[All case studies](https://gardiner.today/past#case-studies)

I live and work in Magandjin, the Jagera name for Brisbane, Australia, on the Country of the Turrbal and Jagera peoples. I pay my respects to their Elders, past, present and emerging. Sovereignty was never ceded.
