- C++ 69.2%
- QML 21.9%
- JavaScript 5.1%
- CMake 1.2%
- C 1.1%
- Other 1.3%
|
|
||
|---|---|---|
| .forgejo/workflows | ||
| .vscode | ||
| 3rdparty | ||
| containers | ||
| docs | ||
| icons | ||
| legal | ||
| qml | ||
| rpm | ||
| scripts | ||
| server | ||
| src | ||
| tests | ||
| tools | ||
| translations | ||
| .env.template | ||
| .gitattributes | ||
| .gitignore | ||
| .gitmodules | ||
| CHANGELOG.md | ||
| CLAUDE.md | ||
| CMakeLists.txt | ||
| flake.lock | ||
| flake.nix | ||
| harbour-fitfish.desktop | ||
| LICENSE | ||
| mise.toml | ||
| README.md | ||
| renovate.json | ||
| renovate.json.license | ||
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 |
|---|---|---|
| Workout list | Workout and route | Synchronized 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.
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).
