MyActivityLog

Self-hosted fitness dashboard for Apple Health data.
Own your workouts, routes, and metrics - on your own infrastructure.

Open Source Self-Hosted FOSS

All your activities at a glance

Every workout with type, distance, duration, calories, and location - organized in a filterable overview.

Workout list showing activity cards with type, distance, duration, calories and location

Every workout, fully analyzed

GPS route with pace-colored splits on the map, heart rate curve, elevation profile, and kilometer splits - all on a single page.

GPS Route Heart Rate Pace Splits Elevation VO2max
Workout detail view showing GPS route map with pace-colored splits, heart rate chart, elevation profile, and kilometer split times

Understand your training

Statistics dashboard with monthly distance chart and activity type breakdown

Statistics

Distance, duration, calories - broken down by month and activity type.

Pace progress chart with linear trendline over three months

Progress

Track your pace and VO2max over time. Linear trendlines show where you are headed.

Fitness model showing CTL, ATL, and TSB curves with TRIMP bars

Fitness

Training load modeled with Banister TRIMP. Chronic load, acute fatigue, and form at a glance.

Energy balance showing daily calorie burn and BMR calculation

Energy Balance

Daily energy expenditure based on Mifflin-St Jeor BMR plus workout calories from Apple Health.

Every GPS track on a single map

GPS heatmap showing all workout tracks overlaid on a topographic map

What it does

Interactive Maps

GPS routes with pace-colored kilometer splits rendered on MapLibre vector maps.

Workout Profiles

Combined elevation, pace, and heart rate charts for every workout. Toggle each metric independently.

Segment Comparison

Automatically detects repeated route segments across workouts and compares your pace on them.

Sharing

Public share links with granular permissions per workout. Choose which data to expose.

Bulk Import

Upload large JSON exports from the iOS app. Background processing with progress tracking.

i18n

German and English out of the box. Extensible to additional languages.

From Apple Health to your server

The companion iOS app bridges Apple Health and your self-hosted backend. It reads workouts, GPS routes, heart rate samples, and VO2max from HealthKit and exports them as JSON - ready for upload or automatic sync.

HealthKit GPS Routes Heart Rate Bulk Export
Download on the App Store
iOS app showing activity log with synced workouts
iOS app showing upload and JSON export options
iOS app export screen with date range selection

Up and running in minutes

Three containers, one command. All you need is a Linux server with Docker.

0

Prerequisites

Make sure the following is available on your server before you begin.

Linux Server
Docker + Compose
Python 3
1

Clone & Configure

Clone the repository and run the setup script. It generates all required secrets (database credentials, API key, session key) in a .env file.

# Clone the repository git clone https://codeberg.org/klnlrchr/MyActivityLog-Web.git cd MyActivityLog-Web # Generate .env with secrets python3 scripts/setup.py
2

Build & Start

Build the containers and start the stack. PostgreSQL + PostGIS, the FastAPI backend, and the Nginx frontend will come up automatically.

docker compose up -d --build
3

Set Admin Password

Set your dashboard login password. The dashboard is then available at http://your-server.

docker compose exec backend python set_password.py

The setup script asks whether you use HTTPS. If you run without TLS, answer n - otherwise the session cookie won't be sent and login will fail.

Updating

Pull the latest changes and rebuild. Your data (database, uploads, .env) is preserved - only the application code is updated. Database migrations run automatically on startup.

cd MyActivityLog-Web git pull docker compose up -d --build

Built with

FastAPI PostgreSQL + PostGIS Vue 3 + TypeScript MapLibre GL JS ApexCharts Swift / HealthKit Docker Compose

Free and open source

MyActivityLog is free and open source software. Self-hosting requires a Linux server with Docker.

Privacy Policy

MyActivityLog iOS App · Last updated: April 26, 2026

Short version: MyActivityLog reads workout data from Apple Health and lets you export it as files or transfer it to your own self-hosted server. No data is sent to the developer, Apple, or any third party. Your data stays under your control at all times.

1. Who is responsible

Clemens Kleinlercher
mrxn.at · kleinlercher.me

If you have any privacy-related questions, please reach out via the contact details on those websites.

2. What data is read

The app reads the following data from Apple HealthKit:

  • Workouts — activity type, start/end time, duration, distance, calories
  • Heart rate samples associated with workouts
  • GPS route data (latitude, longitude, altitude) associated with workouts
  • VO2max values
  • Device and source app metadata

The app does not collect, store, or process any personal data beyond what is read from Apple Health for the purpose of export.

3. Data we do NOT collect

MyActivityLog does not use analytics, crash-reporting SDKs, advertising networks, or any other third-party services that collect data. We do not receive:

  • Your name, email address, or any account credentials
  • Device identifiers, IP addresses, or location data
  • Usage statistics or behavioral analytics
  • Any health or fitness data from your device

4. Where your data goes

Your health data is only transmitted to the server URL that you configure in the app settings. This is intended to be your own self-hosted MyActivityLog server instance.

  • No data is sent to Clemens Kleinlercher, Apple, or any third party
  • No analytics, crash reporting, or telemetry is included in this app
  • No advertising SDKs or tracking frameworks are used
  • The app makes no network requests other than to the server URL you configure

5. Data stored locally on your device

The app stores the following data locally on your device:

  • Server URL — stored in app preferences (UserDefaults)
  • API token — stored securely in the iOS Keychain
  • List of exported workout IDs — stored in app preferences
  • Onboarding and consent status — stored in app preferences

No health data is cached or stored persistently on the device by this app. Health data is read from HealthKit on demand and either exported to a file or transmitted to your server.

6. JSON file export

When using the JSON export feature, workout data is written to a temporary file and shared via the iOS share sheet. The destination of that file (AirDrop, Files, email, etc.) is controlled entirely by you. The app does not track or log file exports.

7. Apple HealthKit usage

This app uses Apple HealthKit solely to read workout and fitness data for the purpose of providing you with a personal data export and visualization tool on your own infrastructure. The app does not write any data to HealthKit.

In accordance with Apple's HealthKit guidelines, health data read by this app is not used for advertising, marketing, or data mining purposes, and is not shared with third parties.

8. Data deletion

Uninstalling the app removes all locally stored data (preferences, Keychain entries). Data already transmitted to your server must be deleted on the server directly. Health data in Apple Health is not affected by uninstalling this app.

9. Self-hosted web application

MyActivityLog includes a self-hosted web application (dashboard and REST API) that you deploy on your own infrastructure. The source code is reviewed for security vulnerabilities before every release to Codeberg, including automated scans for dependency vulnerabilities, SAST, and secret detection.

However, you are solely responsible for the secure operation of your own instance. This includes, but is not limited to, keeping the software up to date, configuring TLS/HTTPS, restricting network access (e.g. via VPN or firewall), managing credentials, and applying any additional hardening measures appropriate for your environment. We strongly recommend taking all reasonable steps to minimize your attack surface.

10. Children's privacy

This app is not directed at children under the age of 13. It does not knowingly collect personal information from children.

11. Changes to this policy

If the privacy practices of MyActivityLog change in the future, this page will be updated and the "Last updated" date at the top will reflect the revision. The current version is always accessible within the app under Settings → Privacy Policy.

12. Contact

For any questions or concerns regarding this privacy policy, please contact:
Clemens Kleinlercher · dev@kleinlercher.me
myactivitylog.kleinlercher.me