<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="/feeds/rss-style.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Tom Diekmann</title>
        <link>https://tom.gg</link>
        <description>Digital garden of Tom Diekmann</description>
        <lastBuildDate>Wed, 01 Apr 2026 19:11:18 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>Astro Chiri Feed Generator</generator>
        <language>en-US</language>
        <copyright>Copyright © 2026 Tom Diekmann</copyright>
        <atom:link href="https://tom.gg/rss.xml" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Claude Code Is My Triathlon Coach Now]]></title>
            <link>https://tom.gg/claude-code-triathlon-coach</link>
            <guid isPermaLink="false">https://tom.gg/claude-code-triathlon-coach</guid>
            <pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[import ConversationReplay from ‘…/…/components/examples/ConversationReplay.astro’ import SpotBadAdvice from ‘…/…/components/examples/SpotBadAdvice.astro’ I’m training for a triathlon and I was tired o...]]></description>
            <content:encoded><![CDATA[<p>import ConversationReplay from ‘…/…/components/examples/ConversationReplay.astro’
import SpotBadAdvice from ‘…/…/components/examples/SpotBadAdvice.astro’</p>
<p>I’m training for a triathlon and I was tired of staring at dashboards trying to make sense of my own data. So I built a CLI that wraps the intervals.icu API. Now I just tell Claude Code what I need, it queries the data, and we figure out the week together.</p>
<h2>The setup</h2>
<p><a href="https://intervals.icu">intervals.icu</a> is where all my training data lives — activities auto-sync from my devices, I log wellness daily, and I can see fitness and fatigue trends over time. Most of it is accessible via API.</p>
<p>The architecture is simple: intervals.icu holds the data → <code>icu</code> CLI wraps the API → Claude Code calls the CLI → I have a conversation. The key insight is that Claude Code already knows how to invoke shell commands. If you give it a CLI that returns structured JSON, it becomes a capable analyst in any domain. No MCP server, no custom integration — just a binary that prints clean JSON when piped.</p>
<p>The CLI auto-detects context. Run it in a terminal and you get a rich TUI with charts, sparklines, and interactive tables. Pipe it or pass <code>--output json</code> and you get structured data Claude can parse. That dual-mode behavior is what makes it work well for both human and AI workflows.</p>
<h2>What a session looks like</h2>
<p>Three real examples. Use the send button to to start the conversation — the commands Claude ran are visible inside each response.</p>

<p>A few things to notice across these examples. Claude Code is pulling from three different commands in the weekly planning scenario: fitness data for CTL/ATL/TSB, wellness trends for HRV context, and the activity list for what I actually did. It reasons across all three before suggesting anything. And when I ask it to reschedule, it writes directly to the calendar via <code>icu events create</code> — no copy-pasting, no manual entry.</p>
<p>The post-workout scenario is the one I use most. Pull up the activity, look at zone distribution, compare against intent. Ten seconds versus clicking through five pages in the app.</p>
<h2>What it gets right, and where it breaks</h2>
<p>This is the part that matters for deciding whether to trust any of it.</p>
<p><strong>It’s genuinely good at:</strong></p>
<ul>
<li>Balancing load across three disciplines. It considers the full week — if I’ve done a long ride with high TSS, it naturally suggests lighter run days without me having to think about it.</li>
<li>Spotting patterns I’d miss. Across several weeks of data, it can see things like “your swim sessions are consistently shorter on weeks with high bike volume” that I’d never notice in the moment.</li>
<li>Remembering context within a session. If I mention my knee is sore at the start of a conversation, it factors that into every subsequent suggestion without me repeating it.</li>
</ul>
<p><strong>Where it breaks:</strong></p>
<ul>
<li>Conservative bias. Any HRV dip and it wants to pull the plug on the day. It doesn’t know I was just dehydrated.</li>
<li>No feel data. It can see my HR zones but it can’t know that the three-hour ride felt easy because it was 8°C outside. Perceived effort is invisible to it.</li>
<li>Occasional physiological nonsense. It will sometimes suggest “threshold power at zone 2 HR” which isn’t a thing. It doesn’t deeply understand how zone targets interact across metrics.</li>
</ul>
<p>Here are four recommendations it made recently. See if you can spot which ones I overrode:</p>

<p>The pattern: trust it on load management, override it on intensity and feel.</p>
<h2>What’s next</h2>
<p>I want to add a <code>icu wellness update</code> workflow that feeds subjective RPE and notes back into the calendar automatically, so there’s less re-establishing context at the start of each session. I’m also looking at persisting a short training context file that Claude can read at the start of each conversation — something like a structured summary of the current training block, goals, and any flags.</p>
<hr />
<p>The broader pattern is simple: wrap a domain API in a CLI that returns JSON, and Claude Code becomes useful in that domain. It works for training data. It would work for anything where the data is structured and accessible.</p>
<p>The <code>icu</code> CLI is available on my GitHub if you train with intervals.icu and want to try it:</p>
<p>::github{repo=“tomdiekmann/icu”}</p>
]]></content:encoded>
        </item>
    </channel>
</rss>