No description
  • C++ 69.2%
  • QML 21.9%
  • JavaScript 5.1%
  • CMake 1.2%
  • C 1.1%
  • Other 1.3%
Find a file
Dennis 2eab82e0f8
Some checks failed
/ release (push) Has been cancelled
(c) Cloud release 1.0.0
2026-11-04 21:04:37 +00:00
.forgejo/workflows (c) unified release setup in commons 2026-11-03 07:11:45 +01:00
.vscode (c) unified release setup in commons 2026-11-03 07:11:45 +01:00
3rdparty (c) common update 2026-11-04 21:38:52 +01:00
containers (+) deployment 2026-10-26 20:49:53 +00:00
docs (c) common update 2026-11-04 21:38:52 +01:00
icons (+) map gestures, readable texts on light theme cover 2026-10-31 16:54:43 +01:00
legal (c) login alerts by device token instead of IP 2026-11-04 20:30:00 +00:00
qml (f) contrast on light themes 2026-11-01 10:10:15 +01:00
rpm (+) licenses 2026-10-25 09:13:58 +01:00
scripts (c) unified release setup in commons 2026-11-03 07:11:45 +01:00
server (c) Cloud release 1.0.0 2026-11-04 21:04:37 +00:00
src (c) login alerts by device token instead of IP 2026-11-04 20:30:00 +00:00
tests (c) login alerts by device token instead of IP 2026-11-04 20:30:00 +00:00
tools (c) LICENSE headers, back to mise, updated README 2026-10-25 07:06:16 +00:00
translations (+) map gestures, readable texts on light theme cover 2026-10-31 16:54:43 +01:00
.env.template (c) LICENSE headers, back to mise, updated README 2026-10-25 07:06:16 +00:00
.gitattributes (c) LICENSE headers, back to mise, updated README 2026-10-25 07:06:16 +00:00
.gitignore (c) unified release management 2026-11-03 06:47:14 +01:00
.gitmodules (c) LICENSE headers, back to mise, updated README 2026-10-25 07:06:16 +00:00
CHANGELOG.md (c) login alerts by device token instead of IP 2026-11-04 20:30:00 +00:00
CLAUDE.md (c) login alerts by device token instead of IP 2026-11-04 20:30:00 +00:00
CMakeLists.txt (c) unified release setup in commons 2026-11-03 07:11:45 +01:00
flake.lock (+) map gestures, readable texts on light theme cover 2026-10-31 16:54:43 +01:00
flake.nix (c) LICENSE headers, back to mise, updated README 2026-10-25 07:06:16 +00:00
harbour-fitfish.desktop (c) LICENSE headers, back to mise, updated README 2026-10-25 07:06:16 +00:00
LICENSE (c) LICENSE headers, back to mise, updated README 2026-10-25 07:06:16 +00:00
mise.toml (c) common update 2026-11-04 21:38:52 +01:00
README.md (c) unified release setup in commons 2026-11-03 07:11:45 +01:00
renovate.json (+) deployment 2026-10-26 20:49:53 +00:00
renovate.json.license (+) deployment 2026-10-26 20:49:53 +00:00

FitFish (harbour-fitfish)

FitFish is a fitness companion and watch synchronization application for Sailfish OS. It connects to sports watches (primarily Garmin Forerunner series) over Bluetooth Low Energy (BLE), downloads FIT files, and provides on-device tracking and analysis.

Features

  • Direct BLE synchronization with Garmin sports watches (no Garmin Connect account required)
  • Workout details: GPS route (rendered locally or via OpenStreetMap), pace, heart rate, elevation, cadence
  • Daily wellness tracking: steps, resting heart rate, sleep duration and sleep stages, HRV status
  • Training status calculation: training load, fitness, fatigue, and form
  • Optional end-to-end encrypted backup to a self-hosted PocketBase server (encrypted client-side with BLAKE3 and ChaCha20-Poly1305)
  • Fully offline and private: zero ads, zero analytics, zero proprietary clouds

Screenshots

Screenshots of the app running on the Sailfish OS test emulator with synthetic workout and health data. Click a thumbnail to view the full-resolution image.

Dashboard Health data Fitness and training status
Dashboard with recovery, HRV, sleep and daily activity Daily view with steps, heart rate, Body Battery and stress Training status with fitness, fatigue and form over time
Workout list Workout and route Synchronized charts
Workout list with running, cycling, strength training and swimming Run details with pace, heart rate, power and route Shared selection on the route, heart rate and pace charts

The short tour shows the dashboard, health data, fitness history and navigation from the workout list to a workout. Tapping the heart rate or pace chart selects the same moment in the other charts and on the route.

Animated app tour showing synchronized selections across workout charts

MP4 for website use · All original screenshots and reuse notes

Build

Requires mise and the Sailfish OS SDK. The SDK build engine and emulator run on the host. See build setup for prerequisites. For releases, configure the local publisher details.

git submodule update --init --recursive
cp .env.template .env                   # Set your SDK path and target
mise trust
mise install
mise run dev:build                     # Build the RPM, including Rust
mise run test                          # Qt unit tests
mise run dev:deploy                    # Install on the emulator

Optional: mise run vm starts the development MicroVM using nix-dev-sandbox. See VM setup. The SDK stays on the host.

Common Tasks

# Clone with submodules
git clone --recurse-submodules https://github.com/denclade/harbour-fitfish.git
cd harbour-fitfish

# Unit tests against the SDK target (Qt 5.6.3)
mise run test

# Run a specific unit test
mise run test:one -- test_garmindevice

# Build RPM package
mise run dev:build

# Deploy and run on the Sailfish OS emulator
mise run dev:deploy
mise run dev:run
mise run dev:screenshot

# Validate package intake rules
mise run check

Documentation

  • Architecture: Code structure and device driver abstraction
  • Concept: Application domain and data model
  • Testing: Emulator, fixtures, and on-device testing
  • App media guide: Shared screenshot and README conventions for Sailfish apps
  • Backup: Encrypted cloud backup architecture
  • Deployment: Backup server as a container bundle for d0b
  • Development VM: MicroVM setup with nix-dev-sandbox

Operation

The backup server (PocketBase) runs as service fitfishcloud on d0b. It has its own versions (server/VERSION) and tags cloud-v<version>, separate from the app's v<version> tags. Every cloud-v* tag attaches the bundle fitfishcloud-<tag>.tar.zst to the release on zumcode.de; on the server, app deploy fitfishcloud <tag> builds and starts it.

mise run cloud:release:prepare -- 1.1.0         # server/VERSION, commit, tag cloud-v1.1.0
mise run cloud:release:deploy -- cloud-v1.1.0   # checks, deploy/ and dist/
mise run cloud:test:containers                  # needs Podman
git push origin main && git push origin cloud-v1.1.0

Setup, rules and first-run steps: docs/deploy.md.

License

GNU General Public License v3.0 or later (GPL-3.0-or-later).