Background
Two weeks before the race, Katy and I went to a neutral site baseball game at Bristol Motor Speedway between the Braves and the Reds. Just as the game was set to begin, it started raining across east Tennessee and it just wouldn’t stop.
After hours of waiting out the endless rain delay, I was soaked head to toe. While temperatures were in the 60s, I had begun shivering. The longer we waited in the rain for baseball, the more I shivered. It got to a point where not only did Katy notice, she started to get worried about me.
She said this is the downfall of the triathlon era of my life. The larger Colin from a few years ago didn’t get cold very often. Now? My wife is insisting that I wear her jacket because she was alarmed by how much I was shivering.


I know I say this often, but Katy’s a very patient and tolerant woman who I don’t deserve to be married to. She came prepared for the rain, while I did not.
I tell this moderately embarrassing story because while it’s true I get cold easily, the inverse is also true. Heat doesn’t bother me as much compared to most, even when biking or running. That’d be a key for racing well in Louisville!
Race Week
I’ve gotten better about obsessively checking the weather in the week or two leading up to races. I actually didn’t even look at it for the first time until Wednesday of race week. (Growth!) When I finally did peruse the hourly forecast, I saw a sweltering day was on tap for us.

There was (understandably) a lot of concern in the 70.3 Louisville Facebook group about the heat. Ironman sent us an email that they would be doing more than usual at the aid stations. The one that jumped out at me the most? They were chartering cooling buses that would be set up along the course. We could stop to go inside and take a seat in some air conditioning. Whoa.
Packet pickup on Thursday was fast! After racing the always sold out and huge Ironman 70.3 Chattanooga in May, it was nice to be at a smaller race.

While packet pickup was a quick process, holy crap was it hot that afternoon. I was starting to wonder if I was overly confident in my belief that my body would handle the heat without too many issues.
It goes without saying, but there would be no wetsuits on the swim in this kind of heat.
I bought a swimskin back in 2023. But remarkably, I had yet to need it in a race. Every 70.3 I’ve done since getting it, the water temperature was cool enough that we were in wetsuits. In the spirit of nothing new on race day, I wanted to get a swim in somewhere just to make sure the swimskin still fit.
So we went to a very crowded YMCA in downtown Louisville. I only did 300 yards before stopping because the other swimmer in my lane kept bumping into me. It was hardly anything resembling a real workout, but I’d done enough strokes to feel comfortable in the swimskin and that’s all I needed.

Katy wouldn’t be getting to Louisville until Friday afternoon. We wanted our Sherpa to know that we were miserable without her by sending her pictures like this one. 😆

The day before the race, Caitlin and I did a shakeout run. Normally I wouldn’t mention that in a race report. But earlier in the week when we were running, Caitlin had accidentally knocked her arm into a recycling bin. Not to be outmatched, a few minutes later, I tripped over a lawn bag and went tumbling onto the grass. Thankfully, this run had no klutzy drama.
That afternoon, we dropped off our bikes in transition and were race ready for the morning!

I slept well. The last time I had a poor night’s sleep leading into race morning was 70.3 Worlds in Finland. Since then, I’ve gotten better at quieting the pre-race jitters and getting some rest. One thing that hasn’t changed? I have never actually slept all the way to my alarm. Inevitably I wake up early. I had set the alarm at 4am and by 3:45, I was wide awake and itching to get this thing going.
Race Morning
Parking on race morning is one of the things I always worry about with every race. Thankfully, it’s pretty easy in Louisville. Since the race is in downtown and all the street parking is free on Sundays, we didn’t have to pay anything and were only about a 5-minute walk to transition.
Caitlin and I had spots right next to each other in transition. Setting up our bikes went smoothly, and we were ready for the ~1 mile walk over to the swim start.

Not only was the transition setup stress-free, so was the port-a-potty visit! These are two things never to take for granted when they go well!
We said our goodbyes to Katy and Tiffany and then had to wait in a sea of humanity that was the narrow swim corral.

If I had one piece of constructive feedback on the race, it’s that the swim start leaves a bit to be desired. It’s a long and narrow line with barriers on either side. If you are a faster swimmer, it’s almost impossible to get to your starting group because everyone is so packed together. The spectators actually have more freedom to move around than we do.

If you’re coming to this race in future years, get to the start line early and grab a spot on the railing. Caitlin and I were stuck in the middle, shoulder to shoulder with other athletes, and it got very warm as we waited to jump into the Ohio River.
Swim
- Time 35:08
- Distance 1.2 miles
- Pace 1:42/100 yd
- AG 34/92
- Men 234/670
- Overall 338/958
- Weather: Mostly Clear
- Water Temperature: 86°F 🔥
- Air Temperature: 75°F
- Current: Slight downstream
- Wetsuit: No

So here’s what’s funny about that 86ºF water temperature. It actually felt refreshing when I jumped into the river! I’d spent the last 20 or 30 minutes in the cramped swim corral. It got hot! And that 86º river felt cool by comparison!
This is a pretty straightforward swim. You just swim straight down the river for 1.2 miles, keeping the buoys on your left shoulder. There’s a red turning buoy at the very end of the course that marks where we get out.
The Ohio River is huge in size. At no point did it ever feel crowded. I know in past years there has been some drama here about water quality, but nothing seemed out of the ordinary today. It was murky, but nothing that had an impact on being able to swim.

If there was a current, it was minimal at best. The day before the race, I watched a floating log for about a minute to get an idea of what kind of current was out there for us. It was meandering downstream, but nothing like what everyone has come to expect in places like Chattanooga or Augusta. We were almost entirely on our own here today.
As to my swim personally, I’m thrilled with how things went. Normally, I’m finishing these in the 41-43 minute range and in the bottom half of my age group. Today I finished in 35:50 and 35/90 my AG.

About a month ago, I started taking swimming lessons. I’ve literally never had a swim lesson in my life, even as a kid. When I got into triathlon, my swimming probably could be more accurately described as just splashing around in the water.
I still have much work to do as we deconstruct everything about my stroke and rebuild it. But the early returns are exciting. When I glanced at my watch as I ran for T1, I was surprised to see 35:50.
Transition 1
- Time 4:35
There’s a good bit of running in the transitions in Louisville. Thankfully, there are no steep hills like the one in Chattanooga, but it was a bit of a run from the river up to where my bike was waiting.
My watch said I ran about a quarter of a mile in total in T1. As if 70.3 miles wasn’t enough?! 😆
Bike
- Time 2:36:03
- Distance 56 miles
- Pace 21.8 mph
- AG 15/92
- Men 129/670
- Overall 155/958
- Weather: Clear skies, little wind
- Temperature: 75°F, warming into the mid-80s
- Course Conditions: Much of the course had fresh pavement!
- Terrain: Flat for the first 10 and final 10 miles, endless rollers in between
- Elevation Gain: 2267 feet

This course is pretty simple. It’s what is called a lollipop because…well…that’s what it looks like on the map. The stick begins along the river, and the first 10 miles are nearly pancake flat. Then we had a loop that was endless rolling hills before returning the way we came.
Today’s ride was my 3rd fastest bike leg of a 70.3 ever. Considering the rolling hills and the heat, I am thrilled with that result.
You’re going to shift a lot on this course. Once you get into the rolling hills after around mile 10, it isn’t really ever flat again until you are returning to town and hit mile 45. You're always going uphill or downhill.

I’ve spent the 2025 season trying to be more aggressive on the bike. I used to always hold back a bit on the ride, worrying that there was still a run looming. But I’ve found that I can really feel like I’ve emptied the tank on the bike ride and still have the legs for that half marathon.
So I tried to pay particular attention to attacking each of the rollers. The temptation is always there to coast the downhills and rest. But I was pedaling all the way through each one to take that momentum into each of the uphills that always awaited on the other side.
While it’s nearly constant rollers throughout the loop, there are only 3 moderate climbs. It’s easy to remember where they are. The biggest hills are around mile 11, mile 22, and mile 33. Once you get to mile 33, you’ve made the final turn and it’s net downhill the rest of the way.
That said, miles 35-45 felt like they took forever. Maybe it was that the sun was out and we were now officially baking on the asphalt. But for me, it was more just impatience than the heat. I knew once I got to mile 45, I’d be done with the rollers and I was so eager to get back to the flat (and freshly paved!) River Road.
Those final 10 miles weren’t quite an all out effort, but they were rather close. I had stuck to my nutrition plan pretty well and kept the faith that when I put my running shoes on, I’d still be ready to run even with lighting a match on the way back into town.
I finished 15/92 in my age group and 155/958. Proud of this ride!
Transition 2
- Time 4:25
Minor complaint: I wish the city of Louisville would mow the grass a bit shorter on the Great Lawn park where transition is located. I didn’t notice it when I was starting the bike, but on the return for T2? There was a lot of friction from that thick grass against my bike as I began pushing it after hitting the dismount line.
The run is my favorite discipline, so I’m always eager to rack that bike, and get out of T2.
Run
- Time 1:54:06
- Distance 13.1 miles
- Pace 8:45/mi
- AG 17/92
- Men 136/670
- Overall 167/958
- Weather: Sunny to start, clouds to finish. No breeze.
- Temperature: 85°F 🥵
- Course Conditions: Asphalt
- Terrain: Rolling hills throughout with one sharp climb around mile 4
- Elevation Gain: 1248 feet

I suppose it made for a memorable clip on the GoPro she was holding, but my run began on an unfortunate note by watching Tiffany trip and fall after she’d come up beside me to shout some encouragement and my current place. I was about to stop and see if she needed help, but she told me she was fine and to keep running.
As to the run itself, this course is no joke! It’s not accurate to call it hard, but it’s not easy either. It’s a one-loop course that goes out into a large park, and then we return to town. Much like the bike course, the run course has a number of rolling hills along the way. But more than anything, all I remember about the run was how hot it was. As I started, there were some thin clouds here and there, but we were all baking on that asphalt.

Whenever I get out of T2, I always do some math in my head during that first mile to see where my finish time might end up. I was surprised to find that I wasn’t that far off from my 70.3 PR time that I set last year in pancake-flat Ironman 70.3 Ohio. If I could run a 1:48 half marathon, I’d be able to break it!
It wasn’t in the cards today, though. Those first 9 miles were as hot as any triathlon I’ve ever done. Between the heat and the rollers, I was struggling to push faster than around a 9:00/mile pace. If I’m being honest, I was disappointed as the miles ticked by. But in hindsight, it’s not like I was having a bad day! It was just a bummer to see the PR drifting away with each passing mile.
Mother nature did offer me a solid around mile 9. In a matter of minutes, the sky became completely covered in gray stratus clouds. It never rained on us, but those clouds completely changed the dynamic of the run. Without the intensity of the sun, I quickly found the legs for an 8:00/mile pace and held it all the way to the finish line.

It wasn’t enough to chase down that PR. But with the benefit of hindsight and air conditioning, I have nothing to be upset about or second guess. I do think I ran a bit too conservative early on (which is nothing new for me, unfortunately), but the clouds gave me a reason to pick up the pace.
Post-Race
- Overall Time 5:14:18
- AWA Points 2702
- AG 17/92
- Men 136/670
- Overall 167/958
The finish line is the coolest part of the course. It’s a covered entertainment district named Fourth Street Live. Running down the red carpet in any race is special, but this made for an especially grand-looking finish line.

I was exhausted crossing that finish line, though. I legitimately would have had trouble reaching down to pull my timing chip off my ankle if a volunteer hadn’t done it for me.
Caitlin crossed the finish line shortly after me. I know all the gross things I did during the race. I presume she did all the same gross things during her race. But I still always give her a hug after we both finish one of these.

Any triathlon has endless metrics, but my favorite one from the day is the Tri Club Standings. Among the 91 teams racing in Louisville, Caitlin and I came in 36th overall and 14th in our division. Not too shabby for a team of just two today!

After talking to Katy and Tiffany for a few minutes, I started feeling a little bit dizzy. I’ve never had that happen after a race before. A bunch of water and some carbs quickly brought me back to life, but it was that kind of day out there.
I have never seen so many people cross the finish line and head straight for the wheelchairs to be taken to the medic tent. Seriously, the heat was no joke today.


As always, I have to thank Katy for getting up early and being out there all day. Sherpas have the same alarm as athletes, but they get no medals and no free food. Most of these photos are from her and Tiffany, who also had the same early alarm. My race day was made easier because of them. Plus, these pictures are such a better account of the day than any words I could ever muster.
Final Thoughts
I liked this course! The heat? Not so much.

I fear Ironman 70.3 Louisville won’t stick around very long. After just two years, this race has gotten quite the reputation for being oppressively hot. The number of athletes dropped significantly from year one to year two. I would expect another drop in year three. That heat is just not fun.
I hope they have an opportunity to take a look at a different date on the calendar. I know a lot of things factor into when races like these can happen. But it just doesn’t work as a mid-August race. Put this thing in October, and I’d probably be back considering it’s only 3 hours from home. But I can’t say I’m itching for another 70.3 here in the heat of August.
That said, I had a great experience. Ironman did a really good job of keeping those aid stations stocked all the way through the final athletes. That’s not easy on hot days.
This was also my first time experiencing the new process for slots to the Ironman 70.3 World Championship. Rather than rolldowns with each specific age group, we all get ranked together with age-adjusted times. The simplest way to explain it is that it’s like a handicap in golf. My actual overall time was 5:14:18; however, my age-adjusted time for Worlds became 4:51:06. While Caitlin ended up qualifying (!!!), I was 8 minutes away from a slot for France.
After rolldowns, we were off to dinner for the most delicious beer and burger I’ve had in a very long time. (Could have done with a little less head on the pour, though!)


Up next! I have 8 weeks to churn out a solid training block before my final triathlon of the season: Ironman 70.3 North Carolina. The average temperature for the start of that race? A brisk 44ºF! Odds are I’ll probably be shivering. Hopefully I won’t have to borrow Katy’s jacket.