Privacy and Data
How TrainStack handles your data.
TrainStack is open source, so you can verify exactly how your data is handled. This page covers what data is collected, where it's stored, and how you can export or delete it.
What Data We Collect
TrainStack stores three layers of data for every synced activity and health metric:
1. Raw Source Data
The verbatim response from each provider (Apple Health, Garmin, Strava, etc.) is stored exactly as received and never modified after ingest. This is your escape hatch -- if we improve our parsing or you want to see exactly what a provider reported, the original is always there.
2. Normalized Display Values
We convert provider-specific formats into a consistent canonical format: meters for distance, seconds for duration, bpm for heart rate, kcal for calories. These are what you see in the UI. Different providers may report the same metric differently (e.g., Whoop reports energy in kilojoules, everyone else uses kilocalories), and we normalize so you see consistent values.
3. Computed Values
When we have raw time-series data (heart rate samples, GPS coordinates), we can compute our own metrics: training load, time in zones, elevation gain from GPS. These are clearly labeled with a ts_ prefix so you always know whether a value came from the source device or from our calculations.
Open source transparency
Every line of code that touches your data is open source. The normalization layer, the sync logic, the storage schema -- it's all in the repo. You don't have to trust our claims about data handling; you can read the code.
Where Your Data Lives
Hosted Version
On the hosted version at trainstack.app:
- Activity metadata and health metrics are stored in PostgreSQL
- Time-series data (heart rate streams, GPS tracks, sleep stages) is stored as compressed Parquet files on object storage (Cloudflare R2)
- Original files (FIT, GPX, TCX uploads) are stored on object storage alongside their derived data
- No third-party analytics -- we don't send your fitness data to any analytics service. We use minimal, privacy-respecting analytics for page views only.
Self-Hosted
TrainStack is designed for self-hosting. Run the entire stack on your own infrastructure:
- PostgreSQL for structured data
- MinIO (S3-compatible) for time-series and file storage
- Docker Compose for simple deployment
Self-hosting means your data never leaves your network. No accounts to create, no third-party services, no data sharing.
Self-hosting guide
See the developer docs for self-hosting instructions. The entire stack runs in Docker Compose with a single .env file for configuration.
Exporting and Deleting Your Data
Full Export
You can export all of your data at any time:
- Activities -- complete activity records with all metadata, statistics, and sport-specific data (climbing logs, exercise sets)
- Time-series -- heart rate, GPS, power, and other streams in their original Parquet format
- Health data -- sleep sessions, daily metrics, HRV history
- Equipment -- gear records with usage history
- Original files -- any FIT/GPX/TCX files that were uploaded
The export includes everything -- raw source data, normalized values, and computed metrics.
Account Deletion
You can delete your account and all associated data at any time from Settings > Account > Delete Account. This permanently removes:
- Your user account and authentication credentials
- Your athlete profile
- All activities, health data, and time-series streams
- All equipment records
- All original uploaded files
- All sync state and provider connections
Deletion is irreversible. We recommend exporting your data first.
Deletion is permanent
Account deletion removes all data from both PostgreSQL and object storage. There is no recovery period. Export your data before deleting your account.