VeloMetric
An iOS prototype for tracking wear on bike components such as chains, tyres and brake pads, built with SwiftUI and an MVVM architecture.
- Role
- Author
- When
- August 2026 to present
- Stack
- Swift, SwiftUI, Firebase
Context
Every component on a road bike wears out at its own pace. A chain is usually replaced after a few thousand kilometres, tyres and brake pads depend on conditions, and a worn chain left on too long wears the cassette with it. Most riders keep track of this in their head or not at all. VeloMetric is my attempt at a small iOS app that does it for you.
What I built
The app is organised around a garage of bikes (road, gravel, commuting), each with a list of components. Every component has a maximum lifespan in kilometres, and the app tracks how much of it has been used. The core rule is deliberately simple:
var wearPercentage: Double {
return min((currentMileage / maxLifespanMileage), 1.0)
}
var needsReplacement: Bool {
return wearPercentage >= 0.9
}A dashboard shows each component as a progress ring, so it is obvious at a glance which part needs attention.
The code follows the MVVM pattern that fits SwiftUI naturally: models for bikes, components and rides, a GarageViewModel that publishes state, and views that observe it. The project is a Swift package, so opening the folder in Xcode is enough to build it. Firebase (Firestore for sync, Auth and Crashlytics) is wired in as the planned backend.
Status
This is a prototype. The current build uses mock data and a simulated network delay inside the view model, so the interface can be developed without a live backend. Connecting real ride data (for example from a bike computer export) to update mileage automatically would be the natural next step.