A phone-friendly pour-over coffee timer with classic recipes, custom recipes, and shareable codes. Built as a PWA (Vite + React + TypeScript + Tailwind).
Install Node.js 18+ from https://nodejs.org (LTS .msi on Windows).
npm install
npm run devVite prints a Network: URL — open it on your phone (same Wi-Fi) to test on a real device.
npm run build
npm run previewnpm i -g vercel
vercel # first time, walks you through linking
vercel --prod # deployvercel.json is already configured for SPA rewrites.
Every step stores a percent of total water, not absolute grams. The Brew screen computes
pour_g = (pour_pct / 100) * dose * ratio at render time, so changing dose or ratio rescales
the whole plan linearly. See src/lib/scale.ts.
drip1: followed by URL-safe base64 of a compact JSON payload. Implemented in src/lib/share.ts.
Deep links use the bare base64 in ?r= so the URL doesn't contain a literal :.
- Vibration cues (Vibration API is unreliable on iOS Safari)
- Cloud sync / accounts (sharing is via codes)
- Espresso / AeroPress recipe shapes
- Multi-language UI
- Brew history / journal
The PWA manifest currently references /icons/icon.svg. iOS prefers PNG. To add proper PNGs:
- Open
public/icons/icon.svgin any vector editor (or usenpx @resvg/resvg-cli). - Export 192×192 and 512×512 PNGs to
public/icons/. - Update
vite.config.tsto add those entries to the manifest'siconsarray.