Mallorca by UTMB: a race plan made with AI

In July, I managed to run my first ultra from start to finish. For Mallorca, at the end of October, I wanted to go further and plan the race to get the most out of it. In Bucovina, I had a plan, with heart rate ceilings not to exceed, but no idea how long it would take me. This time, I had a target time: 16:10 for 104 kilometers and 3740 m of elevation gain, with a split time at every aid station.

I finished in 16:33.

Counterintuitively, the plan was right. While moving, I ran 15:39, for 15:40 planned: one minute off over more than fifteen hours of racing. The 23 minutes I was behind, I lost all of them standing still. The plan knew how I run, but it didn't know how long I would stop.

So I'm not going to tell the race kilometer by kilometer, but how I planned it with AI: how we found that target time, what was in the plan, and how each of its four parts held up against the race. Deep down, that's what all these posts are about: how I get better.

On the dry stone, at the end of the day

Before the race

Why Mallorca

I explained the direction in the Bucovina post: improve on races that fit in a single day before going back to 100 miles. Mallorca was the next step: Bucovina was about 120 km-effort, Mallorca is 140.

And there's a reason I hadn't told yet: what a 100-miler costs after the race. Between Corsica and Slovenia, there were three months. But in Corsica, I had gone all the way to the end of the effort: it took me a month to recover, a month to build volume back up, and it was already time to taper. Every time, the same story: starting over with 30-40 kilometer weeks before I could get back to 70-80+. I felt like I was improving in training, I'd get to the race, burn myself out, and my fitness would drop again. A sawtooth progression, when what I want is to keep improving, linearly if possible.

Between Bucovina and Mallorca, there were also three months, and this time, they were enough. Two days after the finish, I was already running again, and by the third week, I was back to 60 kilometers a week.

Between the olive tree and the boulder, in the Barranc de Biniaraix

Finding a target time

For a marathon, setting a goal is simple. You ran 3:15, next time you aim for 3:10, or even 3:05. You know that 3:15 means 4'37 per kilometer, and 3:05 means 4'23: you can picture what it means, and you know whether you believe in it. In trail running, a pace means nothing, the terrain changes everything. For me, the right yardstick is the UTMB index: it measures performance, and on a given race, it converts into a time.

In Bucovina, I scored 508. I was improving well, and above all, I still had a lot of energy at the end: I had some margin left. With a real plan, I could surely go for something more. So I pulled an index goal of 550 out of my hat. Looking back, it was maybe a bit ambitious.

Valldemossa, km 25

That's when AI really started to be useful. On the UTMB website, I got the results of the 2025 edition: 527 finishers and 116 DNFs, with everyone's index. First finding, quite elegant: on this race, the index multiplied by the time always gives the same number. So an index is a finish time. In 2025, 550 meant 15:47, 525 meant 16:32, and matching my Bucovina index meant 17:01.

To fine-tune the goal, I asked the question differently: what time could I have run in Bucovina if I had optimized my race? I wanted to hit 550 and finish in fifteen hours and change, but not burn myself out on an unrealistic goal. And that's where the analysis got interesting.

An optimized Bucovina was between 13:05 and 13:20 instead of 13:47: about ten minutes lost on the Pietrosul, between the queues and an unplanned stop, a few minutes too many at the aid stations, and a second section held back too much, at 136 bpm on average for a 155 ceiling. That's an index between 527 and 538. My actual Bucovina pace, carried over as is to Mallorca, gave 16:20. And above all, the 2025 splits showed that everything is decided in Alaró, at kilometer 60.

The 2025 finishers: their Alaró split and their finish time

Among the finishers who reached Alaró between 8:15 and 8:45 into the race, 27 out of 70 finished under 15:47. Between 8:45 and 9:00, only one out of 27. After 9:00, none. Conclusion: aim for 16:10, an index of about 537, with Alaró at around 8:55 into the race and the end, from Alaró to the finish, in 7:15. It's ambitious, because it requires a second half among the best of those who reach Alaró at the same time. But finishing strong is exactly what I had done in Bucovina. The 550 was the perfect-day scenario, not the plan.

And I was happy with it. I was thinking more in index than in time, but 16:10 is almost 9 km-effort per hour. What speaks to me is reaching 10 one day; I'm still far from it, but I'm getting closer. And there was a bonus: start at 6:00, finish around 22:10. I go back to the hotel and get a roughly normal night's sleep. A long day at the office in the mountains.

The plan

At the end of September, I did a lab stress test, on a treadmill, with the mask. I came out of it with my thresholds, and in particular my first ventilatory threshold, VT1: 154 bpm. VT1 is the intensity at which your breathing clearly speeds up. Below it, I can still say a full sentence without catching my breath, and hold the effort for hours; above it, every minute gets paid back later. I thought my easy endurance zone stopped around 140. In fact, I can go up to 150 and hold it for a very long time. In a race, knowing that changes everything.

Like for Bucovina, I asked AI for a race plan split into sections, each with its heart rate ceiling, its paces on the flat and downhill, and its climbing speed. Restraint until Bunyola, patience until Alaró, a push on the big climb to Cúber, then release: after Cúber, the race begins. At every section change, a checkpoint with a target time, to know where I stand.

The plan: four sections, their rules, and three checkpoints

On nutrition, I changed two things compared to Bucovina, and I'm the one who pushed for them. First, no more isotonic powder: I drink the Näak drink served at the aid stations. Preparing all those sachets takes time, the powder gets sticky, and pouring it at every aid station is handling that costs me minutes. Second, a 45-gram gel every 60 minutes instead of 80. In Bucovina, I was at about 80 grams of carbs per hour, without the slightest stomach issue; the new plan went up to 87. I wanted to improve, and I figured it was the right time to increase.

Training, that's Matthis

The headlamp in the lens

All of that is race strategy. Training is Matthis, my coach. He builds my whole program, and it's a real comfort: I train without overthinking it, trusting him. Before Bucovina, I was running around 40 kilometers a week, and I had to skip some sessions. This time, I averaged 75 kilometers a week over the last two months, with a peak at 113, one 38-kilometer run in four hours and one 63-kilometer weekend over two days. Not to mention the GR58 in the Queyras at the end of August: 131 kilometers and 8900 m of elevation gain in three days. I came into this ultra strong.

On the Thursday before the race, Matthis asks me how I feel. I reply:

Hi Matthis, well, really good. I feel strong after this training block. Now, with the lower volume, I really want to get going again. My stuff is ready, all I have left is to take the plane tomorrow and run on Saturday morning. [...]

Otherwise, I think we're looking at 17 or 16 hours of racing. If it's a really good day, just under 16 hours. [...] We'll see how it goes. I can't wait.

The wallpaper

The night before the race, at the hotel, I had an idea: ask AI to condense everything we had prepared into a cheat sheet in my phone's format, to set it as my wallpaper. The split time at every aid station, the rules for the four sections, what to do at each checkpoint depending on the time, and the gel times.

My race wallpaper (in French)

The race, section by section

Restraint, to Bunyola (km 0 to 38)

The rule: 145 bpm on the flat, 150 on the climbs, and never faster than the plan's paces.

At kilometer 7, a nature break: 7 minutes. In Esporles, the first aid station, I look at the wallpaper for the first time. It says 07:47, I arrive at 07:59: twelve minutes behind, almost a quarter of an hour when I leave. I tell myself I need to speed up a little. That's when I decide to run by feel, with 150 bpm as the target and 155 as a limit never to cross. For the whole first half, as soon as I see 155, I ease off.

Yet on that same wallpaper, it said: "Esporles: leave before 08:05". In the moment, I didn't read it, or at least I didn't understand it: my eyes went straight to the split time, written bigger. I leave at 08:03, within my own plan without knowing it, and I speed up anyway. At the second aid station, I'm convinced I've made up five minutes. The data will say less than one.

My heart rate from the start to Bunyola

After Esporles, my average heart rate goes from 147 to 151, then to 155: between Valldemossa and Bunyola, I spend 58% of the time above my VT1.

Actually, the problem was elsewhere. The early split times came from the 2025 runners, the ceilings came from my lab test, and nobody had checked that the two went together. Followed to the letter, my ceilings would have put me even further behind, and would probably have pushed me onto plan B in Alaró, with a finish around 23:00. By pushing, I avoided losing another 7 to 12 minutes, and I go through Bunyola at 11:28, inside the planned window, just barely. But it surely came at a price, and I think I paid it on the last climbs.

After that, I look at the wallpaper much less. I run by feel, at 150 bpm, knowing I'm at the limit of my effort. I mostly check it for the gels, and to anticipate the profile until the next aid station.

Patience, to Alaró (km 38 to 61)

The rule: 150 bpm max, and still no faster than the paces.

Those paces, I almost never stuck to them. On the flat, I was supposed to run between 6'30 and 7'15 per kilometer, downhill between 6'00 and 6'45: I was never there. I was more like 7, even 8 minutes per kilometer. Very rarely at 6, and only at the very end of the race.

The terrain has a lot to do with it. First the climbs: the elevation gain per kilometer is lower than what I'm used to, with grades often at 6 or 8%, sometimes 12%. On those slopes, walking, the effort is too easy; as soon as I jog, my heart rate shoots up. There's no middle ground, so I keep switching between walking and running. On a steep alpine section, it's simpler: you climb step by step, faster or slower, always with the same motion. Here, that back-and-forth between walking and running breaks the rhythm.

Then, the rocks. Even without altitude, it's extremely rocky: hand-built trails, paved with big, very irregular stones, where your foot often lands on a single stone. Every step needs attention, and on the descents, there's no way to let yourself go without wrecking your feet. In Corsica, the big boulders leave lines to find; on gravel, the stones are small and it goes fast. Here, neither. It's a runnable race, you run more than in high mountains, but it hammers your feet with every step.

The rocks of the Serra de Tramuntana

Next time, I'll need a different metric than pace on the flat. Maybe grade-adjusted pace, I don't know yet.

I reach Alaró at 15:12, still inside the planned window. The life base takes me 19 minutes instead of the planned 15. I had prepared a full change of clothes in my bag: T-shirt, socks, NOK cream. In the end, I don't change anything, I leave the way I arrived. I feel good, and I don't want to lose more time. Maybe that was a mistake: by taking those few minutes, I might have been even faster at the end.

Arriving at the Alaró life base, km 61

Push, to Cúber (km 61 to 77)

The rule flips: 155 bpm max, and paces as a floor, never slower.

On the climb to Cúber, I give everything I can. Early in a race, I can push my heart rate on the climbs without any problem; in the second half, that's where I'm limited, and by my legs, not my heart: I want to speed up, they don't follow. From Alaró to Tossals Verds, I even gain five and a half minutes on the plan while moving, without realizing it.

At night, in the tall grass

That's also when my stomach starts acting up. Because I was behind, three of my aid station arrivals fell right before the gel alarm: Esporles, Orient, and Tossals Verds, two minutes before the caffeinated gel. Each time, gel, biscuit and cola all at once. The stomach ache starts around 17:00.

The plan's gels against my aid station arrival times

Looking back, I increased the dose a bit fast: one stretch of the plan even went above 100 grams per hour. On a marathon, I had already taken that much, or nearly, but never for 16 hours, and that, apart from in a race, I don't really see how to test it.

I reach Cúber at 18:13, as night falls. Switching to night mode, I stay there almost 7 minutes instead of 2. That's where I stop the gels, except the 19:00 caffeinated gel, which I take anyway. From then on, at every aid station, I fill one flask with water and one with diluted cola, three quarters cola, one quarter water.

Cúber, km 77, as night falls

Release, to the finish (km 77 to 104)

The rule: 165 bpm, and everything I have left.

Just after Cúber, headlamp on

Ahead of me, the descent I was dreading: the Barranc de Biniaraix, 800 m of descent in one go. If it was more construction rubble, it was going to be tricky. Two days before the race, I had actually asked AI whether I could bomb the descent or whether I still had to hold back. The plan estimated it at 10'30 per kilometer, and I had replied: "If I have good legs and I'm able to go down faster, why wouldn't I?"

In the end, it's a paved trail, but much more regular, and I let go. Of my whole plan, that's mostly what I had kept in mind: until Alaró, save energy; until Cúber, a push if I have it; after Cúber, everything I have left. So I enjoy myself: 8'18 per kilometer on average, at night, on a 13% grade. Ahead of me, all those little headlamps that I'm going to pick off one by one. Descents are my strength: where most runners hold back, I let go, and it's the other way around on the climbs. Twenty places gained between Cúber and Fornalutx.

Toward the end of the descent, my head starts to hurt, and as I reach Fornalutx (km 89), my stomach gets worse. I wonder what's happening to me, so I take it slow. At the aid station, I eat very little; there are pickles, which change the taste in my mouth, and that feels good.

For the headache, I have a theory. I have medium-length hair, and since the morning, I've been wearing a small elastic Nike headband to hold it, with my cap on top. At nightfall, I added the headlamp, set too tight. It feels like my head is being squeezed. The gels might also have something to do with it, I don't know, but I think that setup didn't help.

Fornalutx, km 89: the headlamp over the headband

I leave feeling like throwing up. I loosen my Wise vest: it holds the flasks well and spreads the pressure, so my ribs and back hurt less, but it squeezes more. I have 15 kilometers left. It's the moment when, usually, I still have the juice to chase the last places and push hard, and right now, I feel like throwing up. Do I make myself throw up, or do I wait? I decide to keep what's in my stomach as energy. I don't know if it was the right strategy, but that's what I did.

Instinctively, I slow down. The climb, I take it easy: it's not my strength anyway, and it lets me recover a bit. It takes me half an hour for two and a half kilometers. I could run this false flat, but not that night. Lots of runners pass me, and it's not a nice feeling. On the way, I take off the headband, and the pressure eases. My headlamp, on the other hand, I don't take the time to loosen it: when you're chasing a time in an ultra, stopping for every little discomfort ends up costing too much time. This time, I probably should have. The cola, for its part, eases the headache a little.

Fornalutx, a frame from the official video, cleaned up by AI

At the top, I decide to push again. I close my vest and attack the descent to Sóller. I look at the wallpaper one last time: I have an hour and a quarter left to cover the last 12 kilometers and make 16:10. It's possible, but it's going to be very tight. 6'23 at kilometer 98, 6'16 at kilometer 99: when you see that on your watch at kilometer 99 of an ultra, you tell yourself something was done right. And everyone who passed me on the climb, I catch them on the descent. It's one of my best memories of the race: still having the juice to catch people.

In Sóller, I don't even stop. The plan gave me one minute, I take zero: I still have a full flask, so I keep going. I loved that moment too.

After Sóller, same pattern: the climb taken easy, vest open to release the pressure, then a descent slower than the previous one, down to the road. It's on that climb that 16:10 slipped away: I didn't have the quads left to go faster.

The last kilometers run along the port to the finish arch. It's flat, it's road, it's not technical, but running 6 minutes per kilometer at kilometer 106, you have to dig for it. And then, runners behind me start putting on the pressure, they try to pass me. No way. I speed up, I drop under 5'30, then under 5 minutes per kilometer, and I don't let go. On the watch, the distance ticks down: 800 meters, 600, 400. I think of my track sessions: it's just one lap of the track, and I'm there.

The last kilometer, along the port of Sóller

They didn't catch me. One of them comes up to me: "You passed me on every descent, you drove me crazy." I reply: "Don't worry, you got me back on every climb." By defending my place against him, since he was faster than the others, I passed a few runners in that last kilometer.

You can see it in the results, by the way: from one checkpoint to the next, I always gained places, without exception. 446th in Esporles, 167th at the finish: 279 places gained.

My ranking at each checkpoint

After the race

At the finish

Happy, at the finish

Honestly, at the finish, I was happy. I finished 20 minutes off my plan, and I knew that plan was ambitious: I had aimed beyond my index. With the stomach and the head at the end, in the moment, I even thought I'd finish in 17 hours, or even 18.

And then, I had just run 104 kilometers. That's no small thing, and not everyone can do it. It's only the third time I've finished a race over 100 kilometers, after my two "100-mile" races. With less elevation this time, sure, but a much better-managed race. A 100+ km race is still something to be proud of.

A few days later, my UTMB index goes from 508 to 515. I'm happy to have improved, and I had issues I had never had in an ultra. If I fix them, I still have plenty of room to improve.

Where did the 23 minutes go

In the moment, I thought I knew where the delay came from. The data confirmed it.

My gap to the plan, in total and while moving

While moving, the blue line hovers around zero all day. From Alaró to the finish, I took 7:20, for 7:15 planned, with a wrecked stomach over the last 15 kilometers. The whole gap is in the red area: the stops.

My stops, planned and actual

In total, I spent 54 minutes stopped, for 30 planned. The plan gave two minutes per aid station, a quarter of an hour in Alaró, and no unplanned stop. Except that in two minutes, you don't have time to eat a banana or drink a cola: you fill your flasks and you leave, and that wasn't the idea. The uneventful aid stations took me 2 to 3 minutes. The rest is the unexpected: the stop at kilometer 7, nightfall in Cúber, the stomach in Fornalutx.

What the AI did, and what it didn't

Looking back, what helped me the most was splitting the race into four: restraint, patience, push and release. The heart rate ceilings too, even if it's mostly my lab test that gave them to me. And it's very useful to let AI fetch the UTMB indexes, to know what an index is worth on a given race, then analyze previous editions to know what you can go for.

What didn't help were the paces. What it got wrong: the stopping times, and nutrition. It can help me estimate how many gels to take, not whether my stomach will handle them. As for the checkpoints and the wallpaper, those were two of my own ideas.

But a hard limit, I don't really believe in it. With good instructions, it could work: a written method that the AI rereads before every race, with the lessons from the previous ones. We've actually started: there is now a file with the lessons from Mallorca, to reread before planning the next race.

Tossals Verds, km 70, poles in hand

And if you want to prepare your race this way, just one piece of advice: connect the AI to your training data, Garmin or Strava, for example with an MCP connector. Without that, it only knows about you what you tell it.

What I'm changing

The last meters, under the arch

For next time, I already have the list:

  • realistic stops: 3 minutes per aid station, 5 minutes of margin for the unexpected, 17 to 20 minutes at the life base;
  • early split times that match my ceilings, and on the wallpaper, the tolerated delay written next to the times, so that the time doesn't become the goal;
  • rethink nutrition, and above all decide in advance what to do when a gel falls right on an aid station: cola and solid food replace the gel, they don't add to it;
  • and the headlamp loosened before the start.

What's next? A bit of recovery, then a real marathon block, for Barcelona in March. After that will come the return to the long formats, and this time, with a plan, a target time, and a list of lessons. See you in Barcelona.