In my 2024 season wrap up I mentioned that I picked up COVID-19 a week before Ironman Canada, raced anyway and ended up walking 40km of the run. I finished that post with “just have to take it easy and hope time fixes it up”. Well, it’s been over two years and time hasn’t fixed it up. Rides that used to feel easy feel like work, my training fell apart and I’ve never really felt like myself since.
It wasn’t just the training either. For the first three months I had stabbing chest pains. I also started losing hair and developed an intolerance to alcohol. None of that shows up on a Garmin, so the rest of this post sticks to what does. I had endless medical diagnostic tests and every response was “you’re perfectly healthy”. Going from running half-marathons, unaffected, before work, to not being able to run more than 2km, overnight, is not “perfectly healthy”. The healthcare professionals I was seeing didn’t seem to blink at that information.
The frustrating thing about long covid is how invisible it is. You know something is wrong, but it’s hard to point at. The one thing I do have is three years of data sitting in Garmin Connect. Every ride, every run, every night of sleep and every morning heart rate. So I pulled it all out and asked a simple question: can you actually see long covid in the numbers?
Turns out you can.
I used the open-source garminconnect Python library to export about 1,440 activities and 1,200 days of health metrics, July 2023 to October 2026. Then I split everything at 20 August 2024, around when I got sick, which gives roughly one year before and two years after. Everything was analysed in Python with pandas, scipy and matplotlib. To be clear, this is one person’s data and not a medical finding, but it’s my data and it tells a pretty consistent story.
The first number is the one that stopped me. On the bike, power is an objective measure of work. 200 watts is 200 watts whether you’re fresh or otherwise. So heart rate divided by power tells you what it costs your body to produce that work. Before covid I averaged about 0.68 beats per watt across every ride, outdoor and Zwift. Since then the average is 0.80. That’s 17% more heartbeats for the same output. Running shows the same thing, with heart rate per unit of grade-adjusted pace up 13%.
The monthly line starts creeping up through summer 2024, jumps after August and sat up around 0.8 to 0.85 for all of 2025. Early this year it dropped back to about 0.73 and I thought I was finally turning the corner, but over the summer it went straight back up above 0.8 and that’s where it’s been since.
Next I looked at where the power loss actually landed. I pulled my best power for every duration from a 5 second sprint up to a 30 minute effort, before and after. Normally when you lose fitness you lose it everywhere. This was different. My sprint and 1 to 2 minute power are fine, about 5% up even. Five minutes is flat. Past that it all goes the other way, down 7% at 10 minutes, 5% at 20 minutes and 7% at 30 minutes. Top end intact, aerobic engine taking the hit. That points at oxygen delivery and the aerobic system, which is exactly what the heart rate per watt number was hinting at.
Then there’s durability. Aerobic decoupling is a metric endurance athletes use to see how well you hold up over a long steady effort. You split the session in half and compare the power to heart rate ratio between the two halves. If heart rate drifts up while power holds, you’re decoupling, basically running out of aerobic road. Under 5% is considered durable. I pulled the second-by-second data for 375 long rides and runs (45 minutes or more) and calculated it for each one.
Before covid my cycling decoupling averaged 1.5%, rock solid. After, it’s 4.2%, more than double. The share of long rides that stayed under the 5% line dropped from 76% to 54%. So not only is there less fitness to begin with, I’m burning through it faster within each ride. The nice thing about this one is that it compares me against myself inside the same ride, so it can’t be blamed on weight, weather or a new watch.
There’s a well known trio of long covid signatures in wearable data: resting heart rate up, HRV down and VO2max down. I’ve got all three. Resting HR is up a couple of percent (it was already very low, around 44), HRV dropped 13% from 48 to 42 ms and VO2max dropped from 51 to 48.
The obvious argument is that I’m just comparing a good summer to a bad winter. So I reran it month matched, comparing each calendar month only with the same month on the other side of August 2024. It barely changed anything, HRV still down 12% and VO2max down 7%. It’s not the season. Garmin’s own race predictions agree too, they have me 15 to 22% slower across every distance from 5km to the marathon, and my endurance score is down 18%.
Swimming didn’t seem too affected but it’s hard to tell with a wrist-based heart rate monitor in the pool. What did change is everything around the swimming.
Garmin also estimates my lactate threshold from my runs. At my best in 2024, before I got sick, my threshold pace was 4:35/km. At its worst in 2025 it was 5:13/km, about 14% slower. The weird part is my threshold heart rate actually went up, from 165 to 169. So I’m hitting threshold at a higher heart rate while running slower, which is the running version of the heartbeats per watt problem.
My training volume roughly halved, from about 50 hours a month to about 30. Garmin’s chronic training load says the same thing, down 55%. My body changed with it. My weight went from around 91kg to a peak of 102kg in early 2025. It’s a bit of a spiral. I trained less because I was exhausted and trying to not push things too hard so that I could recover, the extra weight made everything harder, and around it goes. It was also hard mentally, going out for an easy run and having my body stop me after 2km, knowing the fitness level I had come from, and it really took a toll. I’ve dropped about 6kg since the spring and I’m sitting around 96kg now. I don’t think the weight explains the running though. Before covid I was putting down some fast runs at around 93kg, and back then my heart rate for a given pace was about 12% lower than it is now. Dropping from 100kg to 96kg this year hasn’t moved that number at all.
So am I getting better? It’s not a straight line. I indexed a few metrics to their pre-covid baseline and tracked them in 6 month blocks. Between 18 and 24 months after getting sick, my 20 minute power was back to 98% of where it was and cycling efficiency was up to 94%. I genuinely thought I was nearly there. Then the last couple of months slipped backwards, with 20 minute power back down to 94% and efficiency stuck at 94%. VO2max has barely moved at 93% and HRV has kept sliding, now down to 85%. October has been my lowest HRV month in the whole three years. Decoupling has crept up this year too, so the durability side isn’t fixed either.
There were also a few things the data couldn’t tell me. Overnight blood oxygen looked like it improved after covid, but my watch didn’t log SpO2 at all in 2024 and started again on newer hardware in 2025, so that result is really just old watch vs new watch. Respiration rate has the same problem, so I threw both out. I also tried to find post-exertional malaise by checking whether hard days hurt my next morning HRV more after covid than before. It didn’t show up cleanly, mostly because I was training so much easier that a “hard” day doesn’t mean what it used to.
On the stats side, I compared before and after with Welch’s t-tests and Cohen’s d effect sizes. Daily wearable data is correlated day to day, which makes p-values look more certain than they really are, so I leaned on the effect sizes and the trends you can see in the charts rather than the p-values alone.
The most validating part of all this wasn’t any one number. It was seeing a bunch of metrics from completely different systems all point the same way and all turn at the same point in August 2024. Heart working harder, aerobic ceiling lower, durability fading, HRV down and weight up. That’s not a bad month of training, that’s something that happened to me with a date attached to it.
The good stretch earlier this year gives me some hope that it can come back, and the slide since keeps me honest. Now that I’ve got the baseline mapped out, I’ll be able to see it in the data when I do properly turn the corner.
I am now also able to run more than 2km without stopping. Currently at about 8km, but things really do get tough at anything more than 5km. If you’re dealing with long covid and have a Garmin, I’m happy to share the scripts. Drop a comment below!
I’ve been trading for a while now and figured a machine could pick stocks better than I can (admittedly a low bar). I tried my hand at options day trading and paid the price, as most people do. Barber et al. 2014 found that less than 1% of day traders reliably make money after fees. I thought I could beat those odds. Thought.
I did a tonne of research on this topic, and there’s a lot out there. There are also a lot of people posting their ‘winning’ strategies online, most of which are not winning at all. A lot of them may work for a small window of time, but fall apart during certain market conditions. I wanted something that could be resilient across less ideal times, while performing vs SPY as well as possible. As a retail trader, you can’t compete with the big firms on cost or speed; they have effectively $0 commissions, servers next to the exchange and near 0% margin interest. All of this had to be taken into account. On a small book, day trading could easily chew up any gains in commission costs alone.
So, back in March I decided to build an automated system to handle a bunch of my trading for me and to keep my emotions out of it. It started as a weekend experiment and turned into one of the most involved projects I’ve built so far. It’s a fully automated swing trading bot that picks S&P 500 stocks using machine learning, places its own orders through IBKR, and has been trading real money since the end of June.
Every trading day it pulls the current S&P 500 list and daily price history, then calculates a set of technical indicators for each stock. Those feed a machine learning model that scores every stock in the index on how likely it is to outperform over the next little while. Getting the question the model answers right turned out to matter a lot more than which model I used; my first version was barely better than a coin flip, and reframing the problem is what made it actually useful. I went through a lot of iteration to get this right.
On a regular schedule the bot buys the stocks the model is most confident in and sells whatever dropped off the list. In between, it watches the portfolio during market hours with stop losses, puts that cash back to work in the next best pick, and has a kill switch that stops new buying if the account takes a big enough hit. The model also retrains itself every month so it keeps up with the market. Tuning of all these parameters took a lot of time and endless backtesting.
The whole thing runs in Docker on my home server, the same box that hosts this website. There are actually two copies running side by side, one on an IBKR paper account where I test changes, and one on the live account, each with its own IB Gateway container. Everything feeds into Prometheus and a Grafana dashboard, and it sends me Discord messages for every trade, a daily P&L summary against the S&P, and a weekly report. Keeping IB Gateway logged in unattended turned out to be one of the more annoying parts, between IBKR’s daily reset and two factor authentication.
The live Grafana dashboard. The dollar figures and tickers have been changed for privacy, but the percentages are real.
The most interesting part has been the backtesting, mostly because of how wrong my early numbers were. My first walk-forward backtests showed returns in the thousands of percent. A big chunk of that turned out to be survivorship bias; if you backtest on today’s S&P 500 list, you’re only ever testing companies that did well enough to still be in the index. Once I rebuilt the backtest to use the index as it actually was on each date, the honest number came down to somewhere in the mid 20s percent per year, with a drawdown of 40% or more being something I should expect at some point. Still good, but a very different picture!
One test I’m really glad I ran was swapping the model’s picks for random ones while keeping everything else identical. Random picks actually lost to the market, while the real model beat it comfortably. So the stock selection is doing the real work, and all the risk management on its own just amplifies whatever you feed it, good or bad.
Since then I’ve tested over 20 ideas to squeeze out additional performance, from extra data sources to fancier models (including a deep learning model trained on my GPU). Not a single one made it in. Most looked great on the first run and fell apart once I checked them across different samples of the data.
Following insider buying (company executives buying their own stock) looked like the best signal I’d ever found, until I realised almost half of the signals came from a single company and the gains were mostly rebounds after market crashes. In other words it was really a market timing bet, and that turned out to be a pattern. Every idea that tried to time the market, whether that was cutting back when things looked shaky or reacting to news like earnings and analyst downgrades, did worse than just sticking with the stock picks. The edge is in choosing which stocks to own, not when to be in the market. Adding Canadian stocks as a second portfolio looked great too, but the entire edge turned out to be the same survivorship bias problem again. The deep learning model actually did worse than picking stocks at random. Kind of humbling, but it also tells me the simple version is pretty well tuned.
The other big lesson is how much of a real trading system is plumbing rather than strategy. Things like making sure a retry can never accidentally turn a sell into a short position, not trading on market holidays (it happily queued up 18 orders on Labour Day before I caught that one), and recording the price an order actually filled at rather than the price the bot expected. Thankfully nothing has cost me much yet, and these days it mostly runs itself.
Live account return vs the S&P 500
Cumulative % return on the current strategy, updated every trading day
Trading botS&P 500
The live account since the current version of the strategy went in at the end of July. This chart updates itself every trading day, good days and bad. A few months is nowhere near long enough to mean anything yet!
I’ve also set myself a rule ahead of time for when to pull the plug. If it falls far enough behind the S&P over a rolling two years, it gets cut back and goes back to paper trading. Apparently two bad years in a row can be completely normal for a strategy like this, so I’m going to give it some time. Obviously none of this is financial advice! I’ll post an update once there’s enough of a track record to say whether it’s actually working.
I got tired of manually checking prices on things I was watching. There are price tracking services out there, but they only work with specific retailers, don’t let you define your own alert rules and you have no control over your data. As per usual, I decided to build my own.
What started as a simple script to scrape a few prices and send me an email turned into a full blown application, with a web dashboard, multi-currency support, product grouping and purchase tracking.
The way it works is pretty simple. A background process checks each product page on a schedule, pulls out the price and stores it in a SQLite database. Prices are found using either a CSS selector that you provide, or auto-detection, which has built-in selectors for 60+ of the major retailer platforms (Amazon, Best Buy, Shopify, WooCommerce, etc.). Everything gets converted to a base currency, so products from stores in different countries can be compared directly.
Each product can have any combination of alert rules; a target price, a percentage drop, any price drop at all, or price falling below the 30-day average. When a rule triggers, a notification is sent via email, Discord, or Slack. Each product also has its own notification cooldown, so I don’t get spammed when prices bounce around.
The dashboard is where most of the interaction happens. Products are shown in a table or card view with live pricing and trend indicators, and each product has its own page with an interactive price history chart and stats. If the same item is sold by multiple retailers, the products are automatically grouped using identifiers pulled from the page (MPN, SKU, GTIN), so pricing can be compared across vendors. I also added purchase tracking, so I can see how much I’ve actually saved by waiting for a deal.
The app is written in Python (Flask), with the frontend in Jinja2 templates, Tailwind and Chart.js. The whole thing runs in a Docker container, self-hosted on my home server.
The most interesting challenge was the price auto-detection. Every retailer structures their pricing differently and even sites on the same platform have variations, so I settled on a priority chain; try the custom selector first, then the platform specific selectors, then generic fallbacks. Product grouping also needed more thought than I expected. Matching products across retailers by name is unreliable, but the standardized identifiers sitting in the page’s structured data work well.
So far it’s doing exactly what I wanted. Set it, forget it and wait for the deal notifications to roll in!
This project was a machine vision proof of concept that I delivered to a large multinational commodity distribution company in Western Canada. The company had recently implemented an automated railcar unloading system and wanted to see whether machine learning could improve how the system identifies capstan sockets on incoming train cars, including their location and orientation.
The existing vision system struggled with the variability between railcars; different geometry, capstan designs, lighting conditions, debris and other environmental factors. Acquisition times were over 1 second and the success rate was below 80%. The goal of the POC was to show that a well trained model could outperform the legacy methods, while providing a clean, structured data stream that could be integrated into the existing control system in real-time.
I captured still images and video of multiple capstan types, labelled them and used them to train a custom model. The model successfully detected capstans on 100% of the validation set, with confidence levels consistently above 85%, and was able to infer both location and rotation. When run on live video, it achieved acquisition times under 25 ms, with zero false positives on the surrounding train structures.
I frequent a local cold plunge therapy venue with my girlfriend and wanted a way to effectively time each phase of the process. The solutions on the market didn’t fit my requirements, nor did using a basing timer, or no timer, so I decided to make my own.
I thought it’d be a nice weekend project, but I was quick to learn that it was going to involve learning a new platform, language and a very finicky UI design to be effective across multiple devices/resolutions, etc. Garmin uses their own language “Monkey C”, which is an object-oriented language, most similar to JavaScript. It ended up taking a couple months to get together, including testing.
The initial design consists of 3 timers, one for each phase – hot, cold and rest. Each is customisable for your desired duration and level of suffering. The app also tracks the users heart rate, temperature and saves the activity for later review in Garmin Connect.
There are additoinal features to be added to the app over time, given user feedback and from my own experience using the app. So far, it is exactly what I would’ve wanted in a cold plunge app, but let’s see what the community says.
After selling on Etsy for a while (tables have been selling like hot-cakes!) I had received some good feedback from customers, friends and from my own use. I have since integrated several modifications to improve the table and released a new version.
The table is now 22% larger and features a phone holding slot. See below for pics! I also now offer the table with different configurations including a power outlet on the left and no power outlet at all, for a slightly lower cost.
Well 2024 was a very disappointing triathlon season. I had big hopes and dreams coming off a decent 2023 and winter training block. I had engaged with a swim coach and my swim was starting to get where I wanted it to be. All was looking good, but had a long string of illness and injury which led to some very disappointing results.
I seemed to have come down with COVID-19 a week before Ironman Canada. I still went ahead with the race, but ended up walking 40km of the run. 3 months later and I still haven’t recovered – even struggling to get through a 5km run. Just have to take it easy and hope time fixes it up!
I was fortunate enough to represent Canada at the Sprint Age Group would championships in Malaga, Spain. Result was disappointing given above, but it was still a great experience.
I was on the search for a table to use when training indoors, but found that all tables on the market weren’t only expensive, but also didn’t meet all my requirements.
I wanted something that could support either iPad or laptop, would be able charge either device, featured a towel and drink holder.
Given this, I decided to design and manufacture my own!
The table is made from 3D printed PLA and the legs from birch. The table is fully modular and features tool-less assembly.
It was the beginning of COVID lockdowns, I was heartbroken and all my sports had been taken away. I was previously pretty competitive in the beach volleyball world, was also playing ice hockey and soccer at that time. With all of these gone, I was at a loss. I needed to do something… So, one evening, I went for a run and hated it. I had no idea how to run long distance, it’s not something I’ve ever been good at. As an example, I entered a cross-country race in high school and finished second last out of a couple hundred kids. Naturally, I’m a handy sprinter, jumper – explosive stuff. I thought distance running was just going out and running as hard as you absolutely could. So, that’s what I did and I absolutely suffered. I thought it’d be a good idea to run 10km, off the bat. My heart rate was in the 180s and I barely held 6min/km pace. I didn’t make 10km, nor could I walk for days afterward. It absolutely sucked. After a couple days, the pain had subsided and I went for another run, determined to make 10km. I had to walk half of it, but I made the distance. Who would’ve ever thought this situation would lead to where I am now?
Around a similar time to this, a friend was trying to sell his old road bike and decided to gift it to me instead. I didn’t want the thing, “I’m never going to ride this, I don’t want to be one of those spandex wearing guys”. He pressured me to go get some gear and to go for a ride with him that weekend. I had never ridden clip-in pedals, nor did I know how far a ride would be. Was thinking 10km? They took me on a beautiful ride up to the Seymour demonstration forest, which ended up being around 70km by the time we got home, with a significant amount of climbing. My legs weren’t happy and I was gassed but the time it was all said and done, but cycling now had my interest. In the months that would follow, I’d get out on that bike and ride like an absolute animal, a couple nights per week. Again, I had no idea how endurance sports worked, so I’d go and push as hard as I could, for as long as I could. The chain on the bike had to be at MAX tension at all times, all while I yelled expletives at myself to push harder and harder.
I kept running sporadically, but running hurt more than biking and I never really improved. As the months went on, I gained some fitness and it became evident that I was good at sprinting and short max efforts on the bike. I looked at getting into track (velodrome) cycling, but it wasn’t available due to COVID, so I kept with the longer distance stuff just to see how far I could push myself. One hot afternoon, I decided to go for a ride out to horseshoe bay in West Vancouver, with the goal of trying to maintain 24km/h, which I thought was unbelievably fast at the time. When I returned to Vancouver, I felt I wasn’t ready to go home and decided to ride out around UBC. Still not being ready to go home, I extended the ride with the goal of trying to hit 100km. I had one (empty) water bottle with me and no nutrition. By the time I got to 90km, my body stopped. I was miles away from home and had to figure out how to get back. This was the first time I had bonked. It was another 26km home, it was hot and I had no food or water. I absolutely suffered, just trying to turn the pedals over one at a time. I eventually made it home, 116km later and it was my first 100+ km ride.
For many years I had thought “I’d love to do a triathlon”, but when I looked up the distances involved and saw that a sprint tri involved a 750m swim, I was immediately turned off – “why is the swim so far!?”. Like many people, the swim was the main barrier to signing up for a tri. At the time, I felt I could’ve mustered up a 5km run after a 20km ride, but there was no way I could’ve done a 750m swim. I swam a little in school, but nothing really more than 50m at a time. One evening, I went down the pool and told myself “doesn’t matter how you do it, just swim 1000m”. I bought some goggles, was wearing board shorts, swam 25m at a time and somehow managed to get the job done; it took me hours and I was absolutely spent. If I got one drop of water in my mouth, that was it, I stood up and walked the remainder of the lap. I continued this process for a couple weeks and could never really swim more than 50m. I’d try to come back for 75m and would always have to walk the last 10m. I would sink like a rock, my body position sucked and I’d consume all the oxygen that I was taking in with a kick that would in-fact, propel me backwards.
I could bike, I could kind of run, I could barely swim. I immediately signed up for the Vancouver triathlon, Olympic distance – 1.5km swim, 40km bike and 10km run. I had 9 months to figure out how to swim and to run off the bike. I went down the pool 2-3 times per week and I swam my ass off, but didn’t really get any better. I studied YouTube videos every day, I read books, I went to clinics, but nothing really helped. I could not get good at swimming. A couple months out from the Vancouver tri, I had discovered a very basic, fundamental, drill that you’d teach a kid if they were learning to swim. If I was going to figure this out, I had to go back to the start and unlearn all my bad habits. I performed this drill for approximately 30 minutes one night, went and swam laps immediately after and managed to swim 200m consecutively. The first time I had swam more than 50m without stopping. EUREKA! I was on to something. The drill was literally blowing bubbles with my face in the water, on the edge of the pool. This was surprisingly all I needed to do to correct my balance and ease out my kick, it helped immensely.
I continued to swim and was ~1 week out from the Vancouver tri… I had battled a bit of a heart condition over the spring and summer, probably due to COVID and had lost a bunch of fitness. I had also picked up a hamstring injury that I managed to carry for 1 year. Neither of these stopped me from training however. I didn’t have the confidence that I could swim the tri race distance, so I went to the pool one morning and told myself “no excuses, no stopping… 1500m continuous” and I did it. 1 week out and I knew I could do the race. Race day came, the swim went well, I happened to get a flat on the bike, but still beat my goal time and managed to get my first triathlon under my belt. I couldn’t believe it. “I’m not good at endurance sports” and I just happened to complete an Olympic triathlon.
At the age of 17, I enlisted into the Australian Army. I served for 6 years and is something I am grateful for having undertaken. As a digger in the Army, you’re often presented with challenges, but rarely with a finish line. You’re forced to keep pushing until you’re told to stop – “one foot in front of the other”. As much as it sucked at the time, including many thoughts of “why am I doing this?”, these were some of the most valuable experiences I have been through in my life. Although I didn’t realize this at the time, the Army gave me infinite confidence, there was nothing I couldn’t achieve. If I put one foot in front of the other, I’d eventually get there, no matter how ambitious the goal. I’ve applied this to not only my physical endeavors, but throughout my education and career.
Ironman lead-up and training
During the months leading up to the Vancouver tri, the idea of Ironman had been in my head, but as per the thought of triathlon, and swimming, the distance in an Ironman race seemed insurmountable. There was no way I could complete the distance in one of the sports, let alone all three, consecutively. Ironman consumed my thoughts… I HAD to do one and like that I signed up and committed to racing in Ironman Canada the following August. I had 10 months to figure out how to survive and make it through the race. I began training and working on building up my endurance, solely with the goal on just “completing” the Ironman, without having to suffer too much. After the Vancouver tri, I stopped running due to my hamstring injury and just focussed on the bike and swim. My swim still sucked and I had a lot of work to do there. I became a student of Ironman, I read, I researched, I learned how my body worked. Like in many areas of my life, I was determined to succeed. I trained pretty loosely through the winter of 2022/23, but still couldn’t run due to injury and 6 months out from race day I had all but given up, knowing I wouldn’t be able to gain enough run fitness with the limited time left. With that thought, I went for a run that evening. Surprisingly, my hamstring held up ok. I continued to run and the more I ran, the better my hamstring felt. I also had a knee injury that was looking like it was going to need surgery. I kept training and the more I trained, the better my knee became too.
When I made the decision to do an Ironman, it was with the thought that the run volume may ruin my body indefinitely, which was something I was happy to accept – I had to complete an Ironman. Interestingly, the more I trained, the better my injuries, aches and pains felt. After a couple months of increased run volume, I was totally pain free. I no longer needed surgery and my body never felt better. This is still true to this day.
One of the books that I was reading regarding long-course triathlon came with a training plan. I reviewed the plan and it looked more intense and structured that I was planning to execute myself, so I took on the plan approximately 4-5 months out from race day. The plan involved 12-20 hours of training per week, with 2x workouts on most days. Mondays were my rest day, which always involved a recovery spin, or run. The first couple weeks were tough. I was tired and my body constantly fatigued. There’s three things I really hate – early mornings, cold water and swimming. 2-3 times a week, I had all three at once. I still got up every morning before work, I trained my ass off, I got in that damn pool, I swallowed gallons of that water, I never missed one swim workout – I HAD to complete this Ironman. I also seem to have an allergy/sensitivity to pool water. Every swim results in 24 hours of an extremely snotty face, which definitely does not make getting in the pool any easier. I had a saying that I’ve lived by for years and have communicated to many people – never miss a workout. Doesn’t matter if you only have time to squeeze 5 minutes in, get something done. Something is always better than nothing.
Many people have commented on the process and what I was putting myself through, “wow that must be really tough”. To be honest, yes it was, but not in the way that most people think. Most of my training was pretty low intensity and aimed at building my base fitness and efficiency. This had amazing effects on my overall performance. The speed and strength that I gained has been unbelievable. The ease at which long distances quickly became was impressive. It wasn’t before long that the distances in an Ironman length race were no longer scary. The hardest part of the process was the impact to social life. Training 2x per day, working a pretty demanding job and trying to get adequate rest, doesn’t leave much time for things like a healthy social life. I am fortunate and grateful to have such an amazing, flexible job with supportive colleagues. I am thankful every day and it definitely helped along with the process. However, teetering on the edge of over-training and the isolation that came with it made for some grumpy days, which was noticed and commented on by colleagues. The periods of over-training often came with poor sleep with exacerbated the situation. The thought of having to dial back training to get back on top of sleep was a hard decision to make – “but I’m going to lose fitness”. Employing this strategy always paid dividends.
A friend, and colleague of mine, Adrianne, was competing in a sprint-distance tri in Oliver BC and asked if I could come support her. I agreed and thought that I might as well do the race to get another triathlon under my belt. I managed to get a 2nd place (age group) finish in the race which landed me a qualification for the triathlon world championships in Malaga, Spain, next year. I wanted to focus on Ironman, but to go represent Team Canada would be an amazing experience.
1 week out from Ironman Canada race day, race organizers called off the race due to fires in the Penticton area. Bummed. Ironman was generous enough to offer full refunds, a transfer into next year’s race, or a transfer into another North American race in 2023. I chose the latter and signed up for Ironman California which was happening 2 months after the scheduled Penticton date. It was going to be another 2 months of limited social life, but I wasn’t too upset about more training, fitness and building confidence. I continued to train, but given I was confident with my fitness levels, I opened the door to more social activities, including social rides and runs, which was amazing. 1 week out from race day in California, a certain airline (ahem Air Canada) told me that they couldn’t fit my bike on the plane and that there was no other option to get my bike down there. I ended up having to make the decision to drive down to Sacramento, from Vancouver. It wasn’t ideal, but such is life.
Training numbers
Although I commenced training 12 months out from race day, the first 6 months was pretty loose, I only really stepped it up in the final 6 months:
Running – 906km – Didn’t run for 6 months due to injury
Bike – 6,300km
Swim – 215km
Gym sessions – 148
Yoga – 74 – Only started a little over 6 months ago
Weight loss – 9kg, 20lbs
Goals
My initial and main goal was just to finish the damn race, to finish it strong and not be hanging on to life by a thread with wobbly legs and loss of control of other bodily functions, like some of the horror stories you hear about and see. I’m an extremely competitive person, so a goal time was always going to be in the back of my mind. I tried to initially ignore this, which was futile. I got fitter, stronger and very quickly the race distances became less scary. The goal times got shorter and I become more determined to do the best that I could.
My initial goals were simply:
Finish strong
Don’t make yourself suffer too much
Sub 13 hours….
Over the months that followed, these goals transformed into:
Finish before dark
Finish strong
Sub 11 hours, which soon became sub 10 hours
Sub 5:30h bike
Top 10 age group
Run full marathon, except aid stations – no walking
I was ready to suffer… I had to perform. I had signed up for a half-ironman after the cancelled race and exceeded my expectations on the day, which further bolstered my confidence. I knew I could achieve the goals I had set out, no matter how ambitious they were.
IM California – Race Day
The event was amazing. The way it took over the city and how much support both the event, and competitors, had was really good to see. As a “first timer” I was required to wear a pink tag and whenever I walked past volunteers, they would scream “FIRST TIMER” and all start ringing cowbells. This made me smile on many occasions. Race morning was hectic; 2000 bikes in transition, multiple places that we were required to drop our gear bags at made things a little confusing, all before being ushered onto buses to drive us to the swim start.
The swim was relatively uneventful. Not too much commotion, definitely the easiest 3.8km I’ve swam and was out of the water after 49 minutes. I met a nice guy at the swim start who happened to have the same wetsuit and goggles as I, he also lived in Vancouver, went through the same debacle as I regarding IM Canada cancellation and bike/flight issues. Not only did we happen to finish the swim at the exact same time, but were within minutes of finishing the race together. I also found out he has the same bike as I… uncanny. Got myself a new training buddy back home.
T1 was definitely the most chaotic transition that I’ve seen, but made it through unscathed. I got out on to the bike course, somehow got a little bit wobbly and almost came off my bike within the first 50m, not ideal. I recovered and continued on the 180km ride. I came out of the water mid-pack and given the bike is my strength, I approximately made up around 700 places. Definitely a lot of “on your left calls” and it felt damn satisfying ripping past people on $20k bikes in full aero gear. I kept my power a little lower than I was anticipating and hit the half way turnaround right on 2.5 hours. I was on par for a 5 hour bike split! The wind picked up on the second lap, as did the rain. It got damn wet which led to some interesting chafe, etc. but didn’t affect me too much. I backed off the power for the last 1/4 of the ride and my heart rate came down nicely. I knew I had time in my back pocket and I wanted to save my legs for the run. I ended up finishing with a 5:13 bike split, average of 34.5km/h – happy with that.
I racked my bike in T2 and my running shoes were filled to the top with water, not ideal but I emptied them and got on with the run. I as I got out of T2, I took a look at my cumulative time and saw that I had ~3:45 hours to run the 42km marathon. I knew I could run a pretty comfortable 3:30 hour marathon and immediately started celebrating in my head. I knew I could break 10 hours… I ran the first 5-10km at ~5:05 min/km pace to build a bit of a buffer in my back pocket and then dropped my pace to 5:15 min/km to cruise it in on home. As I ran through 10-15km, I noticed that I started to leak some pace, which I initially thought was an error on my watch. I looked at my watch sometime later and my pace continued to drop… what is happening? I put in a little more effort to get my pace where it needed to be, but my legs didn’t respond. I couldn’t maintain the required pace. Jay, what is happening? The harder I pushed, the more they said no. At this point, I figured I’d continue on at this pace and step it up for the last 10km to make up any deficit in time. I hit the 24-25km mark at which point I got hit with a massive stitch in my right side and I couldn’t control it.
At that point I had conceded to the fact that I was going to need to walk more than the aid stations. This hurt my ego a little bit as it was going to eliminate one of my goals, but no matter how much I could make myself suffer, I wasn’t going to be able to push through this. The remaining 17km was a balance between run and walking. I walked to ease the stitch and a ran up until the pain got great enough for me to have to walk once again. I was heart broken. I felt like I was in one of the “celebrating to early” videos where someone in a sprint throws their hands up to celebrate their imminent victory, only to trip over before the line and not win at all. I knew wasn’t going to make 10 hours. With the heartbreak came a slight sense of relief and now my only goal was to finish before dark and to try to enjoy the rest of the race. The kms ticked over very slowly after this point as I ran/walked my way to the line. I finished right on sunset with a time of 10:39 and had lost approximately 1 hour. Don’t get me wrong, going sub-11 in my first Ironman is a damn good time, but I knew I could’ve done a whole lot better.
In my training leading up to the Ironman, I had two similar incidents where my legs stopped working and I got crazy stitches. I put it down to accumulated fatigue and ignored it. For it to happen again on race day proves that something else was going on. Did I over-bike? Did I under/over nutrition? Did I not taper well enough? I don’t really know. I have been thinking about it endlessly over the past couple days and it’s something I really want to figure out. The fact that I didn’t crush the run and was forced to walk sections has been bothering me endlessly also. I’m feeling a great sense of needed redemption. I want to crush that run…
As I turned around the last corner on to the carpet, a giant wave of emotion hit me as I thought about everything that had lead up to that day. The reasons I got into triathlon, not being an “endurance athlete”, all the hard work training my ass off and to finally make it to that line, I knew I was going to hear the sweet words “Jay Alcock, you are an Ironman!”. I fought hard to remain composed, crossed the line to where one of my mates was waiting for me and went out for a well earned beer. It was done. I was expecting my body to not be in a very good place, however, it wasn’t too bad and I recovered pretty quickly. Even though I didn’t achieve a couple of my goals, my mind was in a good place. I had still achieved something massive, and I was (mostly) happy.
As I sit here and type out how disappointed I am in my performance, I cannot help but think of all the people who undertake an Ironman with the intent on merely completing the event and manage to make it over the line in 17 hours or so. In my opinion, these people are the real warriors. To be out there, in the elements, on your feet, grinding away for 17 hours is something I could not even imagine. Yes, the pros may have more stress on their body given their power output, etc. but it’s over in 7-9 hours… 17 hours is insane! In addition, there were many athletes with disabilities. I saw many people in wheelchairs, a couple blind athletes and an amputee, or two. To do the whole race with your arms… incredible. Hats off to these people.
Goals achieved 3/6:
Finish before dark – Crossed the line right on sunset
Finish strong – Although I had to run/walk for 17km, I still ran over the line and wasn’t clinging on to life
Sub 11 hours, which soon became sub 10 hours – 10:39, did not achieve
Sub 5:30h bike – 5:13, even after backing it off for the last 1/4
Top 10 age group – Nowhere near
Run full marathon, except aid stations, no walking – Did not achieve
Conclusion
Overall, this process has been amazing and I have learned so much. I’ve learned about human endurance, nutrition, all three sports, recovery… the list could go on. What I have learned the most about however, is myself. Learning how my body works, what training it responds to, how to recover, what recovery looks like from a scientific standpoint, how much lactate I produce at a given power output, how to fuel myself, etc. etc. It has been amazing! In addition, I have more knowledge I can share with people through my learnings – something else I truly value. The fitness gains that I managed to achieve has been absolutely addictive. I’m an engineer; I live in numbers. This has been a science project, with my body as the test subject. The technology that’s available around triathlon is a paradise for a nerd like myself. The minute any workout ended, I was in the numbers analyzing. “What did I do right? What did I do wrong? Where do I need to improve? How am I tracking?” I absolutely love it. I’ve always been terribly stiff. Given this, I started a stretching routine, which I perform every night before bed. As a result, I’ve also never been more flexible, in addition to being the most fit I’ve ever been. The change in my body, both inside and out – as an example, my resting heart rate is now approximately 41 bpm (down from ~50s). The change in my daily routine – I have never been a morning person, now I have no issues getting up and getting some training in before work.
Why did I get into triathlon and pursue an Ironman? Maybe a small part was ego driven, but ultimately I did it because I sucked at it. I knew it was hard, didn’t come naturally to me and it was something that I wanted to achieve. I’m not naturally gifted at endurance sports. I have no problem working hard and putting the hours in to achieve whatever I put my mind to and this is something I am extremely grateful for. I feel that I have only scratched the surface of my true potential. Although I trained for a long period, most of my gains only really came during the last couple months and I am keen to see how much faster, stronger and more efficient I can get. I still have so much to learn. I need to find out why my body failed me on the Ironman run; this is constantly on my mind.
I’m currently taking a month off training to be social, get back to some of my old hobbies and to decide what I want to do next year. I’m not making a decision until the end of the month, but what I’m thinking is:
Ironman Victoria 70.3 – sub 5 hours
Ironman Canada – Match, or better, IM California time (much harder course)
Represent Team Canada at the ITU World Championships in Malaga, Spain – Sprint distance
I recently needed to travel internationally with my bike to an Ironman event and figured it’d be a good idea to fit by bike with an AirTag so that I could track it, in case there was any logistics issues and for a little bit of added security.
I designed and 3D printed a holder to fit within the seat post of the bike, which slides into the bike seat tube and remains concealed. There was an option of fixing the tag to the inside of the frame using an adhesive, however the tag requires its batteries to be replaced every ~12 months, so the requirement to be able to remove (easily enough) had to be inherent in the design.
There are a number of commercially available AirTag holders that fit below the seat, or under bottle cages, but given my bike geometry and decreased security, I decided to design my own. The AirTag is still able to tx/rx through the carbon frame and works well!