Build log · entries
17Changelog
CycleBridge is not in the App Store or on Google Play yet. The iPhone app was submitted to Apple on 15 September and is in open beta on TestFlight while that review runs, so you can ride with it today. The changelog is the real build log: every entry says whether it is in the beta, built but not yet in a build you can install, or still to do.
- Released
- in a public store, or live on this site
- In beta
- in the TestFlight build you can install today, not in a store yet
- Built, not released
- merged and passing CI, but not in any build you can install
- Still to do
- not done yet
The watch pages say more, and stop overlapping
Every ride page on the Garmin watch was redrawn: a heart rate zone arc around the screen, trend lines under the big numbers, icons on the labels, and columns that no longer write over each other on any watch.
- A coloured arc over the top of the main and zone pages shows the heart rate zones, with a marker where you are right now
- A trend line of the last half hour sits under the big number — speed on the main and stats pages, heart rate on the zone page
- The current heart rate is in the header of every page that had no room for it as a field
- Icons on the field labels: a gauge, a heart, a clock, a climb
- Values are sized by the height of their digits and the width of their column, which is what stopped them running across the row lines and into the next column on bigger and smaller watches
- The splits page spreads its four columns apart and draws a bar per finished kilometre against the fastest one; the climb page labels the highest and lowest point of its window
A calmer first launch
The phone app opens on a short intro instead of a stack of permission prompts, and asks for each thing only when it is used.
- An intro: what the app is, where your ride data comes from, then the ad consent — on its own page, after saying what the ad is
- Apple Health / Health Connect access is asked for at the first ride recorded with the phone, after one line saying why — and never in a watch mode
- Garmin's Bluetooth connection is only started once you choose Garmin as the data source
The Garmin watch app is on the Connect IQ store
The watch app no longer needs a USB cable: it installs from the Connect IQ store like any other Garmin app.
- Listed at apps.garmin.com, linked from the home page and the Garmin watches page
- Install it from the Connect IQ app on the phone, or from the store on the watch
Arrange a screen by hand
The screen editor became the screen itself. Tap a slot to choose what it shows and how big it is; drag it to swap with another, sit beside one, or take a row of its own.
- Drag a slot onto another to swap the two, onto its left or right edge to sit beside it, or onto the seam between two rows — or the strip below the last row — to give it a row of its own
- Tap a slot for its options: what it shows, from one dropdown; one or two across and a small, medium or large height; or taking it off the screen
- Settings and the editor sit on a dark grey rather than the readout’s black, so the screen being edited stands out from the page around it
- The + in the app bar adds a part where the built-in screens would put it, and tapping the title there renames the screen; every drag or tap saves as it happens, one write per gesture
Store release
What stands between here and production. The iPhone app went to Apple on 15 September and is still in beta while that review runs; nothing has been submitted to Google Play yet, and no ride on real hardware has happened yet.
- Apple’s review of the iPhone app, submitted on 15 September — until it passes, TestFlight is the only way to install it, and everything merged since then is built but not in the beta
- The Google Play submission, with the store privacy disclosures the ad SDK requires — the screenshots and feature graphic are rendered and committed
- A real-hardware pass over the three new Garmin watch pages — they are covered by unit tests, but no simulator run happens anywhere in this project
- The Apple Watch app back in the build: its Xcode target went in and out again on 19 September after the app crashed on its first run on a real watch, so it is not in any build and its pages are off this site until that is fixed
- The Android Garmin integration verified against an actual watch, which it has not been yet
A screen is built in two steps: the parts, then their places
The screen editor no longer asks for a widget one cell at a time. Tick the parts the screen should show, and each lands where the built-in screens would put it; then drag any of them into another slot, and set each row to one or two across.
- The catalogue is a checklist: a tick puts a widget on the screen, clearing it takes the widget off, and no picker sheet opens
- A field fills the first gap below the hero row and a panel takes a row of its own, so most screens need no arranging at all
- The places list reads the screen top to bottom, left to right; dragging a part moves it into another slot and the grid keeps its shape
- Each row is one part across or two, at a small, medium or large height — the same controls as before, one level down
The effort dial reads like a gauge
The watch app’s post-ride dials were redrawn: the face stays in the middle, the rating’s word and number sit beneath it, and the level dots run in an arc over the top of the screen that stops short of that text and fills as the rating climbs.
- UP raises the rating and DOWN lowers it on both dials — effort grows, feel improves — read from the buttons by name rather than the watch’s page gestures
- The dots up to the chosen level are lit, so the arc reads as a gauge whichever side of the screen the selection is on
- The dial’s rows and dots are pinned inside the round screen and clear of the text by unit tests, since nothing in the repository can draw it
- On this site: a feature page for the phone’s screen editor, panel captions drawn where the app now draws them, and the two Apple Watch features listed on the hub — they had a category the hub did not know
Ride screens you build yourself
Every ride screen on the phone is now the same grid, and what goes in it is yours to decide. Settings has a Ride Screens page: presets of screens, each screen two to five rows of one or two widgets, with the built-in set kept read-only to come back to.
- One grid for every screen — two to five rows, one or two cells each, each row small, medium or large; no screen is one widget alone, so the map and the split list now sit over a row of numbers
- Every widget the old screens were made of can go in any cell: the metric fields, the zone hero and bars, average and peak heart rate, the climb profile, the split list and the map
- Presets: pick the active one, make a new one as a copy of the built-in set, duplicate, rename, delete
- A live preview of the screen while you edit it; every change saved as it is made
- The built-in preset is the five screens the app has always had, at the same proportions, and cannot be edited
The data grid stopped asking to be configured
The phone readout’s first screen is now one fixed layout. Per-slot metric pickers and drag-to-swap are gone, along with the stored layout behind them — a bigger rework of the ride screens is coming, and the configuration was in its way.
- Speed full width, then distance and heart rate, then ride time and average speed — the same four fields the app shipped with as defaults
- No metric pickers in settings, no cell dragging, and nothing about the layout persisted between rides
- The live map keeps its own full screen in the pager; it can no longer take a quarter of the grid
- Max speed is no longer on the ride readout — it stays in each ride’s summary and the monthly and yearly statistics
The iPhone app is open for testing
The iPhone app was submitted to Apple on 15 September. Anyone with an iPhone can install that build now, through Apple’s TestFlight, rather than waiting for the App Store review to finish — the home page leads with the link. Everything above this entry landed after the submission and is not in the beta.
- Ride on the phone’s own GPS and a Bluetooth heart rate strap, or pair a Garmin watch running the CycleBridge watch app
- The Apple Watch app is not in this build — adding its Xcode target is still a manual step
- A TestFlight build stops working 90 days after it is uploaded, so the beta needs a fresh upload every few months
One fewer screen to swipe past
The phone readout lost its speed screen. The grid already leads with speed and can hold average and max in its own slots, so the two screens said the same thing one swipe apart.
- The phone pager is five screens now: the grid, heart rate zones, the climb profile, splits and the map
- All three speeds stay reachable — current in the grid’s fixed row, average and max as slot metrics you pick
CycleBridge on Apple Watch
A watchOS app doing the Garmin app’s job on Apple’s platform, built around the one thing that decides whether a watch survives a long ride: whether it runs its own GPS.
- A watchOS app that records a real Apple Health workout, reads wrist heart rate, and streams a live snapshot to the phone once a second
- The same pages as the Garmin app — hero, all-data, zones, splits — laid out for a rectangular screen, with settings that live on the watch and apply immediately
- The app asks at the start of every ride whether the watch or the phone owns GPS; choosing the phone means watch location services are never started at all
- The readout slows to once a minute when the screen dims, stops transmitting snapshots that have not meaningfully changed, and drops payloads rather than queueing them behind a stalled link
- Every one of those power decisions sits in a single pure, unit-tested type rather than scattered through the app
- The phone gained a third data source alongside Garmin and phone sensors; neither watch mode writes a second workout from the phone, since the watch already saved one
- Store imagery for App Store (iPhone and Apple Watch), Google Play and the Connect IQ store, rendered from one HTML source at each store’s exact pixel sizes
Ride screens for zones, elevation and splits
The readout became a stack of purpose-built screens you swipe between, on the phone and on the watch, instead of one grid trying to say everything.
- Phone: heart rate zones, a 30-minute climb profile, per-kilometre splits, a dedicated speed screen and a full-screen map, all reached by swiping
- Watch: a dense six-value page, plus climb and splits pages behind their own settings
- Heart rate zones now mean the same thing on both apps — five zones from your Garmin profile on the watch, from a max heart rate you set on the phone
- Watch layout geometry became unit-tested: every field is proven to sit inside the round screen’s usable circle
Honest attribution and ad disclosure
The privacy policy names Y-A-S ApS as the party responsible, and the site stopped implying there were no ads.
- Both copies of the privacy policy name the company behind the apps
- The landing page names the idle-screen ad and its one limit instead of omitting it
Continuous integration and signed releases
Every change now runs the phone tests, the watch tests on a headless simulator, and a site build before it can land.
- CI for the Flutter app, the Connect IQ watch app and this website
- Tag-triggered release workflows for both apps, with the watch package signed at build time
Watch rework and ride statistics
The watch app moved to hero-metric pages with circular effort and feel dials, and finished rides started adding themselves up.
- Hero-metric watch pages, distance alerts and settings edited from Garmin Connect Mobile
- Circular perceived-effort and perceived-feel dials, recorded into the FIT activity
- Monthly and yearly ride statistics on the phone
- A three.js hero and scroll-driven scenes on this site
First working build
The phone app, the Garmin watch app and the Bluetooth link between them, end to end.
- Live snapshots from the watch to the phone, once a second
- Phone-sensor mode with GPS and a Bluetooth heart rate strap
- GPX import and export, and the route library
- This site