A federated fitness tracking platform for sharing activities with the Fediverse.
  • Java 76.9%
  • HTML 17.3%
  • JavaScript 3.6%
  • CSS 1.4%
  • PLpgSQL 0.8%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-07-11 20:53:18 +02:00
.forgejo/workflows deps: use JDK 25 LTS for building and deploying closes #189 (#211) 2026-06-04 20:50:17 +02:00
.mvn/wrapper deps: use JDK 25 LTS for building and deploying closes #189 (#211) 2026-06-04 20:50:17 +02:00
docker refactor: improve docker image layering and size (#336, #340) 2026-06-20 09:37:30 +02:00
docs feat(admin): add federation outbox diagnostics 2026-07-09 12:30:44 +02:00
src feat(profile): add canonical handle profile URLs 2026-07-11 14:22:52 +02:00
.env.full.example refactor: simplify weather enrichment scheduling config 2026-07-06 19:06:06 +02:00
.env.minimal.example fix(container): complete environment variable wiring #408 2026-07-03 19:38:01 +02:00
.gitignore add .env to gitignore 2026-07-11 20:53:18 +02:00
.sdkmanrc deps: use JDK 25 LTS for building and deploying closes #189 (#211) 2026-06-04 20:50:17 +02:00
CHANGELOG.md docs: update changelog for bugfix release 1.1.1 2026-06-19 09:40:53 +02:00
cliff.toml chore(changelog): add git-cliff configuration 2026-06-04 12:24:55 +02:00
CONTAINERS.md docs(logging): document production log persistence behavior 2026-07-07 13:29:27 +02:00
CONTRIBUTING.md docs: add contributing table of contents 2026-07-06 08:04:25 +02:00
docker-compose.federation-test.yml fix(container): complete environment variable wiring #408 2026-07-03 19:38:01 +02:00
docker-compose.yml docs(logging): document production log persistence behavior 2026-07-07 13:29:27 +02:00
Dockerfile fix(security): require explicit actuator password 2026-07-04 13:11:13 +02:00
LICENSE Create LICENSE 2026-05-05 18:14:39 +02:00
mvnw build: add Maven Wrapper (#27) 2026-04-29 09:18:03 +02:00
mvnw.cmd build: add Maven Wrapper (#27) 2026-04-29 09:18:03 +02:00
pom.xml feat(profile): linkify plain text bio URLs 2026-07-08 14:03:33 +02:00
README.md docs: update README project stack and layout 2026-07-03 20:15:50 +02:00

FitPub

FitPub is a self-hosted fitness tracking platform for the Fediverse. It lets people upload workout files, review their activities with maps and metrics, and share them through ActivityPub instead of locking them into a closed social network.

The project is built for people who want to keep control of their training data while still participating in a social graph that reaches Mastodon-compatible platforms and other ActivityPub servers.

What FitPub does

  • Imports activity files from GPS devices and training apps
  • Supports FIT and GPX uploads
  • Publishes activities to followers over ActivityPub
  • Provides public, followers-only, and private visibility modes
  • Applies privacy zones to protect sensitive start and end locations
  • Shows maps, metrics, timelines, and profile pages in a server-rendered web UI
  • Includes analytics such as summaries, personal records, achievements, training load, and heatmaps
  • Supports batch imports from ZIP archives

Why this project exists

Most fitness platforms combine activity storage, analysis, and social distribution inside one vendor-controlled product. FitPub separates those concerns. You can run your own instance, keep your own data, and still share workouts with people on the wider Fediverse.

Stack

FitPub is built with:

  • Java 25
  • Spring Boot 4
  • Thymeleaf
  • PostgreSQL with PostGIS
  • jOOQ
  • Flyway
  • ActivityPub-compatible federation

Project layout

  • src/main/java/ - application code
  • src/main/resources/templates/ - server-rendered views
  • src/main/resources/static/ - frontend assets
  • src/main/resources/db/migration/ - Flyway database migrations
  • src/test/ - automated tests
  • docs/ - project documentation and operational notes
  • CONTAINERS.md - container deployment notes for Docker- or Podman-based setups

Deployment

You do not need to run your own FitPub instance to use FitPub. If registration is open on an existing instance, you can create an account there; for example, the official instance is available for free at fitpub.social.

You are also invited to run your own instance for yourself, your friends, a club, or another community. Different FitPub instances can interact with each other through the ActivityPub protocol.

For container-based deployment, see CONTAINERS.md.

Verified signup

Local account signup uses a two-step email verification flow:

  1. The user submits username, email address, password, and profile details.
  2. FitPub sends a numeric verification code by email.
  3. The user enters that code on the registration page.
  4. Only after successful verification is the real user account created and signed in.

Pending registrations are stored separately from real accounts until verification succeeds.

Local development

For local development, a disposable SMTP sink such as MailPit works well. The dev profile already uses localhost:1025 for SMTP, so the default MailPit container setup works without additional mail configuration. Only set the mail environment variables if you want to override that default.

docker run --rm -p 1025:1025 -p 8025:8025 axllent/mailpit
podman run --rm -p 1025:1025 -p 8025:8025 docker.io/axllent/mailpit

For automated tests, GreenMail is a good fit when end-to-end mail assertions are needed.

Current scope

The repository already includes:

  • local accounts and authentication
  • activity upload and post-processing
  • federation endpoints and delivery logic
  • social features such as follows, comments, likes, notifications, and timelines
  • analytics and heatmap views
  • privacy-zone filtering for track data

Status

FitPub is an actively developed public project. The feature set is already substantial, but the codebase is still evolving and interface details may change as the platform matures.

Contributing

Issues and pull requests are welcome.

For contributor workflow, local setup, build steps, and test execution, see CONTRIBUTING.md.

License

No license file is currently present in this repository. Until one is added, reuse terms are not explicitly defined.