A Flutter app for browsing, searching, and rating the beers, ciders, perries, meads, and wines on offer at the Cambridge Beer Festival β on Android, iOS, and the web.
Built for real festival conditions: the drinks list is cached so it keeps working when the venue network drops, and every screen is built with screen-reader semantics and keyboard/touch accessibility in mind.
Production: cambeerfestival.app Staging: staging.cambeerfestival.app Android: Google Play API docs: richardthe3rd.github.io/cambridge-beer-festival-app
- πΊ Browse all drinks from the festival (beer, cider, perry, mead, wine, and more)
- π Search by name, brewery, or style
- π·οΈ Filter by drink category and style
βοΈ Sort by name, ABV, brewery, or style- ποΈ Hide unavailable drinks (sold out or not yet available)
- π Build your My Festival list β mark drinks "Want to try", then "Tasted"
- β Rate drinks (1β5 stars) and jot personal tasting notes
- π View brewery details and all their drinks
- βΏ Accessibility-first: screen-reader semantics on every interactive element
- πΆ Cached data keeps browsing usable when the festival network is patchy
- π± Works on Android, iOS, and Web
Screenshots coming soon β try the live app at cambeerfestival.app.
- Flutter SDK 3.44.0 β pinned and installed for you by
./bin/mise(the repo ships this wrapper, so a global mise install is optional) - Android Studio, Xcode, or VS Code with Flutter extensions
# Clone the repository
git clone https://github.com/richardthe3rd/cambridge-beer-festival-app.git
cd cambridge-beer-festival-app
# Install tools (Flutter 3.44.0, Node, etc.) β ./bin/mise self-bootstraps,
# so you don't need mise installed globally
./bin/mise install
# Install Dart dependencies and verify setup
./bin/mise run check
# Run the app on web
MISE_ENV=dev ./bin/mise run dev./bin/mise run test # Run all tests
./bin/mise run coverage # Run tests with coverage report
./bin/mise run analyze # Analyze code for issues
./bin/mise run check # Full pre-commit gate (generate β analyze β test)
MISE_ENV=dev ./bin/mise run dev # Run app on web (localhost:8080)# Build for web
MISE_ENV=dev ./bin/mise run build:web:prod
# Build for Android
./bin/mise exec flutter -- flutter build apk
# Build for iOS
./bin/mise exec flutter -- flutter build ioslib/
βββ main.dart # App entry point
βββ models/ # Data models (Drink, Producer, Festival)
βββ providers/ # State management (BeerProvider)
βββ screens/ # UI screens
β βββ drinks_screen.dart # Main drinks list
β βββ drink_detail_screen.dart # Drink details
β βββ brewery_screen.dart # Brewery page with drinks
βββ services/ # API and storage services
βββ widgets/ # Reusable UI components
This project uses multiple testing approaches:
Flutter's built-in testing framework with comprehensive test coverage:
./bin/mise run test # Run all tests
./bin/mise run coverage # Run tests with coverage reportCoverage is collected in CI and reported in two places:
- PR comments and job summaries β file-by-file breakdown via
github-actions-report-lcov - Codecov β trend tracking and the badge above
Coverage fails CI if it drops below 70%.
- Web E2E Tests: Playwright tests for URL routing and accessibility smoke tests - Testing Flutter Web Guide
See ADR 0005 for the rationale behind this approach.
This app uses the Cambridge Beer Festival data API via a Cloudflare Worker proxy:
- Base URL:
https://data.cambeerfestival.app - Example:
https://data.cambeerfestival.app/cbf2025/beer.json
API documentation and JSON schemas are available in the docs/code/api directory:
- API Overview - Quick reference and schema usage
- Data API Reference - Complete API documentation
- Beer List Schema - JSON Schema for beverage data
- Festival Registry Schema - JSON Schema for festival configuration
Technical documentation is available in the docs directory - see docs/README.md for a complete overview.
- Development Guide - Complete development setup and workflows
- Release Guide - Version bumping, branching, and tagging for releases
- Firebase Setup - Firebase integration for Crashlytics and Analytics
- GitHub Secrets - Required secrets for CI/CD
- Testing Flutter Web - E2E testing with Playwright
- URL Routing - Path-based routing implementation
- Cloudflare Pages Setup - Deployment configuration
- CI/CD - Complete CI/CD workflow documentation
- Accessibility - Accessibility features and guidelines
- Android Debug Build - Building debug APKs
- Play Store Metadata - App store listing information
| Trigger | Lands on |
|---|---|
Push to main |
Staging β staging.cambeerfestival.app |
| Open a pull request | A unique per-PR preview (<branch>.staging-cambeerfestival.pages.dev), posted as a comment on the PR |
Push a version tag (e.g. v2025.12.0) |
Production β cambeerfestival.app |
The app is hosted on Cloudflare Pages, with the API served by a Cloudflare Worker. For the full detail β every workflow, the Pages projects, and the release train:
- CI/CD β each workflow and deploy job
- Cloudflare Pages Setup β deployment configuration
- Release Guide β version bumping, branching, and tagging
Contributions are welcome! Before opening a pull request, please read:
- Development Guide β setup, workflows, and conventions
- AGENTS.md β architecture, code style, testing, and accessibility standards (written for AI agents, but the rules apply to everyone)
Run ./bin/mise run check (generate β analyze β test) before every commit, and follow Conventional Commits for commit and PR titles.
This project is licensed under the MIT License - see the LICENSE file for details.
- BeerFestApp - Original Android app (Java)