Skip to content
THOMMO.AI
AI & agentsApp developmentProduct / ChatGPT App2026

Performance Signal

A live ChatGPT app for understanding your running. Connect Garmin for new runs, import Strava history, then ask about pace, effort and progress.

What it shows: Trusted data and real tools put in front of a model ChatGPT users already have, instead of building another chat window.

ChatGPT AppMCPGarminStravaSupabase

Live as a native ChatGPT app, with sign-up at performancesignal.ai

01
The finished product

Your running history, in conversation

Performance Signal brings a runner’s recorded activities into ChatGPT, so questions about a run, a race or a training pattern start with the data already available.

The website handles account setup and data connections. In ChatGPT, the runner can explore their history in plain language and follow a useful answer with another question.

It’s now live. Connect Garmin for automatic delivery of new supported runs, upload a Strava export ZIP for earlier runs, or use both. Then ask ChatGPT to compare efforts, explore pace and heart-rate patterns or put a training goal in context.

You

What was my last run like?

Tool:get_runs
Args:limit: 1
Status:ok
ChatGPT

Your last run was 8.2 km yesterday morning, averaging 4:52/km with heart rate settling around 152 bpm and cadence steady at 174 spm.

Want the full detail, or how it compares to your recent average?

An illustrative Performance Signal conversation. get_runs is a real, implemented tool; the numbers are for demonstration, not a captured screenshot.
02
The manual workflow

Eight or nine screenshots, every run

I run regularly, not really training for anything in particular. I just wanted to actually understand what happened out there and make better decisions about the next one.

After a run I’d open Garmin, screenshot the stats, eight or nine of them, pace, heart rate, cadence, and upload the lot into ChatGPT. Once it had the numbers, the conversation was genuinely useful: what happened, where effort dropped off, what recovery should look like, what the next run or week should be. It felt a bit like having an AI running coach.

The AI part worked. Getting the data in front of it didn’t.

  1. Garmin
  2. 8-9 screenshots
  3. ChatGPT
  4. Analysis
  5. Next run
03
Why build it inside ChatGPT?

Not another AI chat window

The obvious approach was to build a standalone app, add a chat interface and wire it up to a model API. I looked at that seriously, and it raised a problem I’d seen before in other software: usage-based AI costs are hard to predict. Different customers use wildly different amounts of tokens, and that makes pricing genuinely difficult to get right.

That led to a more basic question. Why build another chat interface at all when ChatGPT already provides one, and the user is often already paying for it? The interesting engineering problem wasn’t the conversation. It was getting trusted, structured running data in front of a conversation that already exists.

So Performance Signal isn’t an app with a chat bolted on. It’s a native ChatGPT app: structured running data and a set of tools ChatGPT calls directly. The account website handles connections and imports; the analysis happens in the conversation the runner already uses.

04
How it works

Your runs, ready for the conversation

Garmin supplies new supported activities after connection and authorisation. It does not backfill earlier runs. A Strava export ZIP supplies historical runs without requiring a live Strava connection, and either source can be used on its own. Existing eligible Strava connections remain supported, while new live connections are currently limited.

ChatGPT connects to Performance Signal as a native app over MCP, the Model Context Protocol, an open standard for exposing tools a model can call directly. Once connected, ChatGPT can call tools that list recent runs, pull the detail or full data for one run, search training history, or pull mileage and trend stats. The available detail depends on what was recorded: some runs have summaries only, while others include the streams needed to look closely at pacing or effort.

  1. Garmin / Strava import
  2. Structured running history
  3. MCP tools
  4. ChatGPT
You

How did my marathon go overall?

Tool:get_run_detail
Args:run_id: marathon_2026_03
Status:ok
ChatGPT

42.2 km in 3:41:12, averaging 5:14/km with heart rate around 161 bpm and cadence at 172 spm.

Pace held even through the first half and drifted out in the back third. Want me to pull the stream data and see exactly where that happened?

An illustrative Performance Signal conversation. get_run_detail is a real, implemented tool; the numbers are for demonstration, not a captured screenshot.
05

From the summary to the actual run

A normal activity summary gives you the averages. When the source includes detailed samples, Performance Signal also stores how pace, heart rate and cadence moved throughout the run. That lets the conversation go beyond the finishing numbers.

That’s the difference between “here’s your average pace” and “here’s roughly where you actually faded.” Performance Signal stores that stream data so ChatGPT can be asked about a specific part of a run, not just the summary.

You

Show me where I actually faded.

Tool:get_run_streams
Args:run_id: marathon_2026_03
Status:ok
ChatGPT

Breaking the stream into phases: a strong first wind out to about 28 km, a mini wall through 28–33 km where pace slipped and heart rate held high, then a second wind for the final stretch as cadence recovered.

That middle patch is usually where a better pacing or fuelling plan pays off most.

An illustrative Performance Signal conversation. get_run_streams is a real, implemented tool; the phases and numbers are for demonstration, not a captured screenshot.
06

Under the hood

The interesting part isn’t another AI interface. It’s giving ChatGPT trusted, structured running data and the tools to work with it.

Build snapshot

ChatGPT app
Native ChatGPT app using MCP (StreamableHTTP), not a Custom GPT
Data
Garmin runs and Strava imports, with summaries and available streams in Supabase
Backend
TypeScript / Node.js API exposing structured MCP tools
Connections
Garmin authorisation and delivery, Strava ZIP imports, Auth0; eligible existing Strava connections
Infrastructure
Render backend, Supabase data, Vercel website, Cloudflare DNS
Availability
Live in ChatGPT, with sign-up and membership at performancesignal.ai
07
What I learned

The workflow was the product

If you find yourself doing the same manual steps around AI over and over, there’s a reasonable chance the workflow itself is the product, not whatever you were originally trying to build.

Not every AI product needs its own AI interface. ChatGPT already has the model and the conversation. What was actually missing was trusted data and the right tools in front of it, which turned out to be a much more focused problem to solve than building a second chat app.

That’s also made MCP click for me in a way reading about it never did. It’s not really AI infrastructure. It’s a fairly ordinary API, with permissions, structured so a model can call it directly.

Usage-based AI economics were part of that decision too, not an afterthought. Unpredictable per-customer cost is a product problem as much as an infrastructure one.