Skip to content
← Apps & tools

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.

← All projects