Building Coffee Journal: A Local-First iOS Coffee Tracker

2 minute read

As a coffee enthusiast, I found myself constantly tweaking grind settings, water temperatures, and brew times—but forgetting what worked and what didn’t. After trying various tracking solutions, I decided to build my own: Coffee Journal, a minimal, local-first iOS app for tracking coffee brewing from grind to cup.

The Problem

Most coffee tracking apps either require internet connectivity, send data to external servers, or have cluttered interfaces that make quick logging tedious. I wanted something different: a privacy-focused, offline-first app with a minimal aesthetic that mirrors the focused ritual of brewing coffee itself.

The Solution

Coffee Journal captures the full brewing process—equipment, beans, parameters, and tasting notes—all stored locally on your device with optional iCloud sync.

Key Philosophy

Remember and improve your coffee brewing by tracking what works. Every cup is a learning opportunity.

Coffee Journal home screen showing brew list Coffee Journal detailed brew view with tasting notes
Coffee Journal app screenshots showing the minimalist, monochrome interface design.

Features

Equipment Management

Track your grinders and brew methods (V60, Aeropress, espresso machines) with custom configurations and settings.

Comprehensive Brew Logging

Record the complete brewing process:

  • Grind settings and dose measurements
  • Water temperature and brew time
  • Yield and extraction details
  • Photo documentation of each brew

Structured Tasting Notes

Capture both quantitative and qualitative assessments:

  • 1-5 scale ratings for acidity, body, and sweetness
  • SCA flavor wheel tags for precise descriptors
  • Custom flavor notes
  • Freeform observations

Apple Intelligence Integration

On-device machine learning extracts patterns from your brewing history and suggests optimal parameters for different coffees and methods.

Monochrome Design Philosophy

The entire interface uses a black-and-white aesthetic, making it e-ink friendly and reducing visual distractions during the brewing process.

Technical Stack

  • Language: Swift 6.0 with modern concurrency features
  • UI Framework: SwiftUI for declarative, responsive UI
  • Persistence: Core Data with SwiftData for type-safe data management
  • Cloud Sync: CloudKit for seamless cross-device synchronization
  • ML/AI: Apple Intelligence running entirely on-device
  • Platform: iOS 17+

Architecture Decisions

Local-First Approach

The app is built on a local-first architecture, ensuring all data stays on your device. iCloud sync via CloudKit provides seamless synchronization across iPhone and iPad without compromising privacy—everything stays in your personal iCloud account.

Privacy by Design

  • All data stored locally on your device
  • iCloud sync uses your personal iCloud account
  • No data sent to external servers
  • Apple Intelligence runs on-device only
  • No analytics or tracking

Offline-First

Full functionality works without an internet connection. Whether you’re brewing at home or at a cabin in the woods, your coffee tracking never stops.

Development Journey

This project has been a great opportunity to explore modern iOS development patterns:

  • SwiftData adoption: Leveraging the new SwiftData framework for cleaner Core Data management
  • CloudKit integration: Implementing container configuration and conflict resolution
  • On-device ML: Integrating Apple Intelligence for pattern recognition
  • Local-first sync: Building a robust offline-first architecture

What’s Next

Current (v1): Personal use with core logging features v2: Bean inventory management and enhanced insights v3: Bluetooth scale integration and App Store release

Try It Yourself

The project is open source and available on GitHub. The README includes detailed build instructions for anyone wanting to build from source and customize for their own use.

View the live demo or check out the source code.


Note: This app is not yet available on the App Store. To use it, you must build from source using the instructions in the repository.