Using AI to design an indoor bike workout

Screenshot from intervals.icu of a bike workout

Today I planned to do a 2hr indoor workout. The previous day rode in ERG mode for 2 hrs at a fixed power of 181 W. It was pretty boring. To alleviate the boredom, I thought I could do with a workout that had variable levels of intensity and duration. I had a quick look in my workout library in Training Peaks and couldn’t immediately find anything that fit my requirements. Then I wondered whether I could use AI to design a workout for me 🤔

When I prescribe myself workouts, I use intervals.icu. Their workout builder works perfectly for my software engineer mind. Conveniently, workouts are automatically synced to Garmin. There’s no GUI; workout creation is driven by lines of text. This is what a basic 3-step workout might look like:

- 10m 50-60%
- 20m 70%
- 10m 40-60%

The format is - <duration> <intensity>, duration almost explains itself. Intensity can be a percentage of FTP or zones or ranges thereof e.g., Z1-Z2 or 60-70%

My next step was to find some AI to create my workout. I use Kagi and it comes with an AI assistant. Perfect. The default AI was Claude 3.5 Sonnet. Not sure how GPT 4o would have fared.

The first step is to give the AI some basic background info about how to create an Intervals.icu work:

You are a workout creator for indoor bike workouts. Bike workouts are specified using bullit points, using time in the format of duration followed by h for hours, m for minutes or s for seconds, the second value is percentage of FTP e.g., - 10m 65-75%.

The AI response was:

Claude 3.5 Sonnet I'll help you create indoor bike workouts. I understand you want the format to be: - Duration (using h/m/s) - Intensity (as % of FTP)

Would you like me to create a specific type of workout (endurance, intervals, threshold, etc.) or would you like me to specify the intended duration of the workout? This will help me create a more appropriate training session.

For reference, typical intensity zones for cycling are:

  • Recovery: 45-55% FTP
  • Endurance: 56-75% FTP
  • Tempo: 76-87% FTP
  • Threshold: 88-95% FTP
  • VO2 Max: 96-105% FTP
  • Anaerobic: 106%+ FTP

Please let me know your preferences and I’ll create a structured workout accordingly.

Now to tell it what sort of workout I want:

I want a 2hr workout at an endurance level. My FTP is 272. Total TSS should be no more than 100. Intervals should be of variable length, and variable intensity.

The response was:

Claude 3.5 Sonnet I'll create a 2-hour endurance workout with variable intervals while keeping the TSS under 100. Since your FTP is 272W, I'll focus on the endurance zone (56-75% FTP) with some tempo work mixed in to add variety while maintaining the TSS target.

Workout Structure:

  • 10m 55-65% (Warm-up)
  • 15m 65-70%
  • 8m 75%
  • 12m 65%
  • 20m 70-75%
  • 5m 60% (Recovery)
  • 15m 75%
  • 10m 65%
  • 12m 72%
  • 8m 60% (Recovery)
  • 10m 75%
  • 5m 65%
  • 5m 60% (Cool-down)

Total time: 2 hours (120 minutes) Primary intensity: Endurance zone (56-75% FTP) Power ranges:

  • 55% = 150W
  • 75% = 204W

This workout maintains a predominantly endurance-focused structure with varying intervals to keep engagement while preventing monotony. The intensity changes are gradual to maintain aerobic development, and recovery periods are strategically placed. The TSS should fall between 85-95 depending on how closely you stick to the prescribed power ranges.

That looks pretty good but when I pasted it into intervals.icu I noticed the intensity was slightly higher than I wanted:

Can you reduce the overall intensity from 68% to 65%?

The adjusted workout was perfect. Loaded it into [intervals.icu](https://intervals.icu), it sync’d to Garmin and I used my Garmin Edge 840 to control my trainer.

Claude 3.5 Sonnet I'll adjust the workout to average around 65% FTP instead of 68%, which means working primarily in the 60-70% range with fewer periods at 75%.

Workout Structure:

  • 10m 55-65% (Warm-up)
  • 15m 60-65%
  • 8m 70%
  • 12m 65%
  • 20m 65-70%
  • 5m 60% (Recovery)
  • 15m 70%
  • 10m 65%
  • 12m 65%
  • 8m 60% (Recovery)
  • 10m 70%
  • 5m 65%
  • 5m 60% (Cool-down)

Total time: 2 hours (120 minutes) Primary intensity: Lower endurance zone (60-70% FTP) Power ranges:

  • 55% = 150W
  • 70% = 190W

This revised version maintains the same structure but reduces the overall intensity by:

  • Lowering the 75% intervals to 70%
  • Reducing some of the 65-70% ranges to 60-65%
  • Keeping recovery intervals the same for adequate rest

The TSS will now be lower, approximately 75-85, making it a more moderate endurance-building session.


Faster web searches with Spotlight

I’ve discovered a faster way to search the web on macOS. It removes the step of opening the default browser.

  1. CMD+Space to open Spotlight
  2. Enter search keywords in Spotlight
  3. Press CMD+B to search in your default browser

I’m not sure there’s a quicker way to perform a search.


Setting heart rate zones on your Garmin watch or device

I see lots of people struggling to set their HR zones on their Garmin watches and this leads to all manner of weird issues. Setting zones should be simple.

First off, what not to do? I would caution against using 220-age to find your max HR. I think that formula may work well for studying large groups of individuals but I suspect doesn’t work well for individuals. Much like BMI.

Max HR or Lactate threshold HR? I think finding max HR is problematic. Max HR will change depending on your training status. If you’re at the end of a heavy block of training, you may not be able to achieve max HR. Finding your max HR isn’t pleasant either. I think it’s better to use LTHR, in my experience, it doesn’t vary much. Most importantly, I think LTHR is more useful, it’s the threshold beyond which your rate of fatigue increases.

Step 1 — determine your LTHR

Joel Friel provides good advice for establishing your LTHR.

To find your LTHR do a 30-minute time trial all by yourself (no training partners and not in a race). Again, it should be done as if it were a race for the entire 30 minutes.

at 10 minutes into the test, click the lap button on your heart rate monitor. When done, look to see what your average heart rate was for the last 20 minutes. That number is an approximation of your LTHR.

This weekend I ran the Leeds Half-Marathon. My average HR for the 85 minutes was 161bpm. I could use that as my LTHR or I could let intervals.icu tell me, which it did. I think either value would work fine.

Screenshot of Weather Up’s widget

Step 2 — personalise your zones

Then I use Garmin Connect to set my zones in my device’s user profile.

My zones happen to be:

  • Z1 -73%
  • Z2 74-86%
  • Z3 87-97%
  • Z4 98-100%
  • Z5 101-

Zone 2 is where I spend most of my training time and is the most important one for me. I did tweak my Z2 range from the defaults. 74-86% of 163 is 120-140bpm and I know I’m still able to breathe easily and have a conversation in this zone.

That’s all there is to it when setting heart rate zones.


Weather Up 3.0 review

I’ve been a long time Carrot user but decided to give Weather Up 3.0 a try after hearing the developer on The Talk Show podcast and reading about Weather Up on Daring Fireball.

The widget is information rich and I prefer it over any of Carrot’s widgets. The app isn’t as feature-rich as Carrot’s and it has a few things that are jarring.

Screenshot of Weather Up’s widget

If you’re not from the US you might be wondering if this app is for me. On the first opening, you will notice that the default cities are all US cities. Time formatting is hardcoded to 12h (you can’t change it, you’re stuck with it) and temperature defaults to Fº. The app does provide its own setting to switch from Fº to Cº but I don’t understand why the developer couldn’t the temperature units defined in iOS’s regional settings. Even the search skews towards US cities.

Count the US flags. Screenshot of the search screen from Weather Up 3.0
Helpful for discovering if your city exists in the US.

I sent feedback regarding the time issue to the developer and it took a month to receive a response. Since the app’s release 3 months ago there have been 2 minor updates.

It’s a good app. It would be great if the issues above could be addressed. It’s a shame I can’t tell if the app is still in active development.

For now I’m going to stick with Carrot. I really liked Weather Up’s widget. It did provide value but not sufficient enough to justify £40 pa. or £4 pcm.


Curve stopped working

I previously mentioned how to setup Garmin Pay with any UK bank card using Curve.

I setup both a debit card and my credit card with Curve and about a week ago Curve started blocking all transactions. The other issue is that I can’t add Curve to anymore of my Apple Pay—supporting devices either.

Looking at the recents reviews in the App Store, I’m not the only one who has experienced this problem.

In addition to the card not functioning as a card, the support is non-existant.

I paid £6 for a week of using Curve. I’m kinda glad that’s the extent of my loss.

On the basis of the lack of support, I would recommend no one use Curve. Stay away.


Setting up Garmin Pay with any UK bank or credit card

UPDATE Monzo is now supported by Garmin Pay.

UPDATE Don’t use Curve.

Garmin Pay, unlike Apple Pay, is not widely supported in the UK. Apple Pay in the UK is supported by over 150 financial institutions. Garmin Pay is supported by 12. Apple Pay is one of my favourite features on Apple Watch.

I wanted to make the switch to my new Garmin Epix Gen2 Pro as smooth as possible and I was worried that I was going to miss out on the ability to pay for goods with my watch.

There’s a way around Garmin Pay’s poor support. Curve. Curve is a service that acts as a proxy for your various credit and debit cards. You add your cards to Curve. Add Curve to your Garmin watch. Then pay for goods with your Garmin Watch. Curve then works out which card to use.

Setting up Curve was simple with their iOS app. You have an account set up in about 5mins and then all that’s left to do is to add Curve to Garmin Pay.

Paying with an Apple Watch is a case of double-clicking the side button. It’s a shame that Garmin’s default isn’t as slick. You have to hold the light button, enter the controls menu, and press up/down multiple times to find the wallet icon. Garmin lists 7 separate steps in the Epix manual. There is an easier way. I configured a Hot Key so that a long press on START opens Garmin Pay. That’s one step instead of 7.

Curve has a couple of interesting features that I want to explore further. The first one is Smart Rules. You can configure one or two rules (you have to pay for more) to determine which cards will be used for payment. The second is Anti-Embarrassment Mode, where you can use a backup card if your Monzo account is empty.

Over the past week I’ve been using Garmin Pay with the Garmin Epix and the experience has been on a par with Apple Pay, which is all I would have wanted.


Travelling in Argentina Pt. 3 — Hiking in Patagonia

Whilst in El Chalten and Bariloche I knew we wanted to do hikes. Over the 4 days of hiking, I used a combination of apps to help us enjoy our hikes. I’ve listed the 3 below and described what I liked about each of them.

My requirements were:

  • Trail discovery. I wanted to find the best trails and maximise our time.
  • Downloadable maps. I wasn’t sure I’d have any network coverage
  • Works on both iPadOS and iOS. I wasn’t going to take my laptop with me. Planning on the iPad is easier than on the phone.

My requirements didn’t include navigation or recording since my Garmin Instinct series 2 would cover this.

Gaia GPS

App Store link

Gaia Screenshot

Gaia has the prettiest maps out of the three apps I tried. I downloaded maps for El Chalten, El Calafate, and Bariloche. Whilst the UI for downloading was clunky, it worked. Gaia offered an iPadOS version and a web version for its maps.

I found Gaia easy to use and reliable during hikes. It was easy to figure out which turns to take, and how much of our hike was left.

I ended up paying £51.90 for 12 months of access to their mapping.

All Trails

App Store link

All Trails Screenshot

Whilst Gaia had beautiful maps, All Trails helped us decide where we wanted to go. They have lots of trail reviews and pictures.

Unfortunately, All Trails doesn’t offer an iPadOS version and for that reason chose Gaia GPS over All Trails for downloading maps.

All Trails is an App Store Award-winning app, winner of the iPhone App of the Year. I can see why, the app has a great UX.

Garmin Explore

App Store Link

Garmin Explore Screenshot

I wish I had discovered this app before our vacation. The maps themselves don’t look as good as either All Trails or Gaia, but the necessary detail is there. And it’s free.

Its killer feature is the tight integration with my Garmin Instinct. During an active hike activity on the watch, I could open Garmin Explore, find a destination on a trail, Garmin Explore would create the course, sync it to the watch and start navigating. Seamlessly. Then I could see ETA, estimated time remaining, and ascent remaining on my watch without having to take my phone out of my pocket. It worked great.

Garmin Explore has an iOS and iPadOS version. It’s available on the web via explore.garmin.com The maps are downloadable by region, so it’s easy to download everything you need before hitting the trails.