databasedmcp

← Articles

Alternative to Strava: a running log with ChatGPT

Tell ChatGPT how far and how long you ran, or paste your watch's summary. It keeps the log and answers questions about your training.

6 min read

databasedmcp gives your AI assistant databases it keeps between conversations, so everything in this article works from the day you connect it. Free to start, no card.

Get started free

Why build it yourself

Plenty of runners use Strava as a training log first: how far, how fast, how it felt, and how this week compares to the last few. The maps, segments and kudos are lovely, but the question you ask most is "how much have I been running?"

That's one table and a few queries. Tell ChatGPT "easy 8 k round the lake, 46:30" or paste the summary your watch app shows you, and it files the run. Weekly kilometres, pace by kind of run and how worn your shoes are become questions you can ask in a sentence.

Connect ChatGPT to databasedmcp

databasedmcp is a remote MCP server that gives AI assistants private SQLite databases, with nothing to install.

ChatGPT connects to remote MCP servers as custom connectors in developer mode. That's on paid plans, on the web. Turn on developer mode in ChatGPT's settings, then create a connector: give it a name, enter https://databasedmcp.com/mcp as the URL and choose OAuth. When ChatGPT opens a databasedmcp page, sign in and select Allow. In a new chat, turn the connector on from the tools menu.

ChatGPT moves these menus between releases. If yours look different, search its settings for developer mode and custom connectors.

Any other MCP client works the same way; the docs have the details.

Copy this prompt to build it

Paste this into ChatGPT to set up the database, its tables and its guide in one go. The rest of this article walks through what it makes and how you use it.

prompt
Set up a running log for me in databasedmcp, in one go.

1. Create a database called running_log, described as "Running log: every run, with distance, time and how it felt".
2. Create two tables:
   - shoes: id, name (required), started_on (date), retired_on (NULL while I still run in them).
   - runs: id, ran_on (date, defaults to today), kind (easy, long, tempo, intervals or race), distance_km (required), duration_s (required, total time in seconds), avg_hr, elevation_m, route, shoe_id (references shoes), felt (a few words on how it went), notes.
3. Write the database a guide that says what each table is for, that pace is worked out from duration_s and distance_km rather than stored, and the queries for "km per week for the last 8 weeks", "average pace by kind of run" and "km on each pair of shoes".

From then on: when I tell you about a run, or paste a summary from my watch app, add it to runs with the shoes I'm wearing. When I get new shoes, add them; when I retire a pair, set retired_on. Show me the tables when you're finished.

Ask for the database

You don't write the schema. Describe what you want:

Set up a running log in databasedmcp: each run's distance, time, kind of run, heart rate if I have it, route, shoes and how it felt. When I tell you about a run or paste my watch summary, log it.

ChatGPT creates a database called running_log and its tables:

schema
CREATE TABLE shoes (
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  started_on TEXT,
  retired_on TEXT
);

CREATE TABLE runs (
  id INTEGER PRIMARY KEY,
  ran_on TEXT NOT NULL DEFAULT (date('now')),
  kind TEXT CHECK (kind IN ('easy', 'long', 'tempo', 'intervals', 'race')),
  distance_km REAL NOT NULL,
  duration_s INTEGER NOT NULL,
  avg_hr INTEGER,
  elevation_m INTEGER,
  route TEXT,
  shoe_id INTEGER REFERENCES shoes(id),
  felt TEXT,
  notes TEXT
);

It also writes the database a guide on how the tables are meant to be used. The guide comes back with the schema whenever an assistant looks the database up. ChatGPT files things the same way next week as today, and so does any other assistant you connect.

guide
# running_log: runs and shoes

- **runs**: one row per run. `duration_s` is total time in seconds. kind: easy, long, tempo, intervals or race. `felt` is a few words in my words.
- **shoes**: pairs I run in. `retired_on` stays NULL while I still use them.

Pace isn't stored: it's `duration_s / distance_km` seconds per km. Show it as min:sec.

Per week: `SELECT date(ran_on, '-6 days', 'weekday 1') AS week, count(*) AS runs, round(sum(distance_km), 1) AS km FROM runs WHERE ran_on >= date('now', '-56 days') GROUP BY week ORDER BY week`

Shoe mileage: `SELECT s.name, round(coalesce(sum(r.distance_km), 0), 1) AS km FROM shoes s LEFT JOIN runs r ON r.shoe_id = s.id WHERE s.retired_on IS NULL GROUP BY s.id ORDER BY km DESC`

Use it

From here on you talk, and ChatGPT writes the rows. Each request below is one statement:

I run in a pair of Trailfox 3s, since the start of September.
execute
INSERT INTO shoes (name, started_on) VALUES (?, ?) RETURNING id
-- params: ["Trailfox 3","2026-09-01"]
Easy 8.2 km round the lake this morning, 46:30. Legs felt fresh.
execute
INSERT INTO runs (kind, distance_km, duration_s, route, shoe_id, felt) VALUES (?, ?, ?, ?, ?, ?)
-- params: ["easy",8.2,2790,"Lake loop",1,"Legs felt fresh"]
Here's Sunday's summary from my watch app: Long run · 18.04 km · 1:42:15 · avg HR 148 · elevation gain 210 m.
execute
INSERT INTO runs (ran_on, kind, distance_km, duration_s, avg_hr, elevation_m, shoe_id, felt) VALUES (date('now', 'weekday 0', '-7 days'), ?, ?, ?, ?, ?, ?, ?)
-- params: ["long",18.04,6135,148,210,1,"Heavy in the last 3 km"]

ChatGPT reads the pasted text and turns 1:42:15 into seconds. Nothing syncs from the watch; you paste what you want kept.

Tempo on Thursday: 10 km in 52:10, with 5 km at tempo in the middle.
execute
INSERT INTO runs (ran_on, kind, distance_km, duration_s, shoe_id, notes) VALUES (date('now', 'weekday 4', '-7 days'), ?, ?, ?, ?, ?)
-- params: ["tempo",10,3130,1,"2 km warm-up, 5 km at tempo in 22:40, 3 km cool-down"]

Ask it questions

Once there's data, each report you'd pay for is a single query:

How many kilometres a week have I run lately?
query
SELECT date(ran_on, '-6 days', 'weekday 1') AS week, count(*) AS runs, round(sum(distance_km), 1) AS km FROM runs WHERE ran_on >= date('now', '-56 days') GROUP BY week ORDER BY week

Each run is counted in the week that starts on the Monday on or before it.

What's my average pace for each kind of run?
query
SELECT kind, runs, km, printf('%d:%02d', pace / 60, pace % 60) AS pace_per_km FROM (SELECT kind, count(*) AS runs, round(sum(distance_km), 1) AS km, CAST(sum(duration_s) / sum(distance_km) AS INTEGER) AS pace FROM runs GROUP BY kind) ORDER BY km DESC
How many km are on my shoes?
query
SELECT s.name, round(coalesce(sum(r.distance_km), 0), 1) AS km FROM shoes s LEFT JOIN runs r ON r.shoe_id = s.id WHERE s.retired_on IS NULL GROUP BY s.id ORDER BY km DESC

You can also open the database on the website, page through its rows and run read-only SQL yourself.

What you give up

Strava records the run itself. Its app and the watches that sync with it track GPS, draw the map, split the kilometres and match you against segments. None of that happens here: nothing records, nothing syncs, and a run exists because you told ChatGPT about it or pasted its summary. Keep recording on your watch or phone as you do now. This is where the numbers you care about end up.

The feed, kudos, clubs and leaderboards stay on Strava too. Anyone on your databasedmcp account can see the log on the website, but that's sharing a spreadsheet, not a community. If the friends and the segments are why you run with Strava, keep it. Bring this log the questions Strava doesn't answer the way you'd like.

Try it

databasedmcp is free to start, with no card. Free has 100 tool calls a week, enough to set this up and try it for a week. Starter has 1,000 for everyday use.

Create an account

More articles · databasedmcp · Docs