← All projects

cyclemind_ai/

An AI cycling companion that puts a coach and a bike doctor in the same Flutter app. Photograph a bike and a vision model returns a health report. The coach reads your rides and plans the next one.

role
Sole developer. Architecture, Flutter app, Cloud Functions
stack
Flutter · Dart · Riverpod · Firebase · Cloud Functions
started
June 2026
status
Runs on mocks with zero config
The problem

Nobody reads your ride data, and nobody checks the bike

Two things stop a self-coached cyclist from improving. Nobody is reading their ride data and telling them what to do next, and nobody looks at the bike until something snaps. Both are judgement calls, and both are the sort of thing a model with the right context can help with.

Architecture

Three decisions the whole app hangs on

This is the project where I took architecture seriously. It follows Clean Architecture with a feature-first layout and the repository pattern, and three decisions drive everything else.

There is no code generation either. Hand-written immutable models and hand-written providers, instead of freezed, json_serializable and riverpod_generator. It compiles with a plain flutter pub get, with no build_runner step to go stale.

Inside lib/

Six features, each behind its own interface

On main, the branch the source link below points at:

CycleMind AI running on a phone: the weekly dashboard, the Bike Doctor scan screen, and the bike list, all on mock data.
Three screens from the published demo, running on mock data.

These are captured from the build its own GitHub Actions workflow publishes, not from a simulator. There is no Flutter SDK where I write from, so the way to see the app is to run the artefact CI produced. That is the mock-first rule paying for itself: no keys, no backend, no setup, and the app still runs.

One mismatch worth naming rather than hiding: the demo is published from a branch ahead of main, where features/coach has been replaced by features/rides. So the screenshot shows four tabs and no Coach, while the list above, and the source link, still describe main.

Takeaway

Mock-first, or the architecture is wrong

Material 3, go_router and Riverpod throughout. The rule I want to carry into every future project is the mock-first one: if somebody cannot clone the repo and see the app work in a single command, the architecture is wrong.