About ActivityMaxxer
ActivityMaxxer runs entirely in your browser. Your files are never sent to a server — they stay on your machine, so your data never leaves your device. There are no cookies, no tracking, and no analytics. This is a non-profit project: nothing is recorded, collected, or sold.
What happens when you open a file
Dropping a file on this site does not upload it. The browser hands the page a reference to the file you picked, JavaScript running in your own tab reads its bytes, parses them, and builds the charts from what it finds. Nothing in that sequence involves a request to this site's server, which holds nothing but the page itself.
The practical consequences are worth spelling out, because "we don't store your data" is a claim every competitor makes and this is a different claim. There is no upload progress bar because there is no upload. There is no file size limit imposed by a server, because no server sees the file. Closing the tab discards the activity completely — there is nothing to delete, because nothing was ever written anywhere. And once the page has loaded, the file path keeps working with the network disconnected.
What does reach the network, and when
Two things do, and only when you ask them to. Being precise about them is the point: a reader who uses one of these features should not feel that the paragraph above misled them.
- The feedback link at the bottom of the page posts what you write to GitHub as a public issue. It is guarded by a Cloudflare Turnstile challenge, which is the one third-party script on the site and loads only after you open the feedback dialog — not on page load.
- Connecting an intervals.icu account makes your browser fetch your activities from intervals.icu directly. The API key you paste and the files it downloads never pass through this app's server. The key is stored in your browser's local storage so you do not have to paste it again; one "Disconnect" removes it. This exists mainly for phones, where a watch file is not something you can browse to in a file picker.
Nothing else. No analytics script, no cookies, no accounts, no session, no server-side log of what you opened. The site's search performance is measured through Google Search Console, which reports from Google's own crawl and serving logs and puts no code on the page — so it tells the operator which search queries showed the site, and nothing at all about you.
What it reads
It reads TCX, FIT and GPX files, so anything from a training watch to a satellite messenger or a camera's location log can be charted. A GPX track carrying only position and elevation still gets speed and elevation panels — both are reconstructed from the positions themselves. Panels appear only for the channels a file actually contains: a ride recorded without a power meter simply shows no power chart rather than an empty one.
Why it exists
I built ActivityMaxxer as a mostly satisfied user of Garmin Connect and Intervals.icu who found a few features missing from both. In particular, I wanted advanced statistics — such as average, minimum, and maximum reference lines — directly on each chart, and all charts stacked vertically on a shared timeline.
That stacking is the whole idea. Understanding a run usually means correlating several signals at the same instant: heart rate drifting upward while pace holds, cadence collapsing on a climb, a pause that lines up with a road crossing. Most apps show one chart at a time, so you carry that correlation in your head between tabs. Here every available metric is its own panel, vertically aligned on one x-axis — switchable between elapsed time and distance — with a shared crosshair, so one glance down the stack tells you what every metric was doing at that moment.