A self-hosted coffee companion that learns how you brew.
Track beans, dial in your grinder, rate every cup — and get suggestions to make the next one better.
No cloud. No accounts. Just coffee.
Features • Screenshots • Installation • Usage
- Brew tracking — Log brews with V60, Moka Pot, Espresso, or French Press recipes that scale by servings
- Bean & roaster library — Origins, varietals, processes, roast levels, and tasting notes, organized by roaster
- Grinder dial-in — See "+3 clicks coarser" instead of absolute numbers — always know which way to turn
- Brew suggestions — Rate each cup on 5 sliders, get a concrete suggestion for next time
- Freeze & thaw — Pause the aging clock on bags you're saving, with accurate days-off-roast tracking
- World map & stats — See where your coffee comes from, plus brew activity, top beans, and tasting note trends
- Offline support — Queue brews and ratings offline, sync when you're back
- Simple backups — All data in a single SQLite file
Kissa runs as two Docker containers (API + Web) on a Raspberry Pi or any Linux host.
# Clone the repo
git clone https://github.com/anner-klein/kissa.git
cd kissa
# Configure your Pi's connection details
cp .env.example .env
# Edit .env with your Pi's hostname, SSH user, and password
# Deploy
./deploy.sh --cleanThe deploy script builds ARM64 Docker images on your machine, transfers them to the Pi, and starts everything. Takes about 2 minutes.
You can also deploy individual services:
./deploy.sh --api-only --clean
./deploy.sh --web-only --cleanOr use Docker Compose directly on any host:
docker compose -f docker/docker-compose.yml up -dOnce running, open http://<your-pi>:3000 in a browser.
- Pick a method on the home screen
- Choose a bean — each card shows how far to adjust your grinder
- Brew with the scaled recipe
- Rate the cup — Kissa tells you what to change next time
Add beans with their origin, roaster, and tasting notes. Each bean can have multiple bags (purchases) with individual roast dates and freshness tracking. Grind settings are saved per bean per method, so they carry over when you buy a new bag.
Download a backup anytime:
curl -o kissa-backup.db http://<your-pi>:3001/internal/backup/db# Prerequisites: Node.js 22+, pnpm 9+
pnpm install
pnpm db:generate && pnpm db:push && pnpm --filter @kissa/api db:seed
pnpm devWeb at localhost:3000, API at localhost:3001.
TypeScript monorepo — Fastify + Prisma + SQLite API, Next.js 15 web app, Tailwind CSS, Zustand, TanStack React Query. Managed with Turborepo and pnpm workspaces.
Kissa was built as a personal, local-network companion — the kind of thing that lives on a Pi in your kitchen, not on the open internet.
There's no authentication, no user accounts, no HTTPS, and no hardening of any kind. It trusts whoever can reach it on the network, which is fine when that network is your home Wi-Fi, and very much not fine on a public server.
Please don't expose Kissa to the internet. If you do, that's on you — I built this to track my coffee, not to withstand the chaos of the world wide web. No guarantees, no liability, just good vibes and hopefully good coffee.
This project is open source. See the LICENSE file for details.



