尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Open-source iPhone app that downloads your original FIT files from Wahoo and Zwift and shares them directly to HealthFit.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗Deutsch · Website · Privacy Policy
FITgap is a small, open-source iPhone app that downloads your original FIT files from Wahoo, Zwift, MyWhoosh, Hammerhead, Dropbox and intervals.icu, or imports FIT files you open in it. It saves them to Apple Health with every metric, lap and route, without duplicates, or hands them unchanged to apps like HealthFit through the native share sheet. Files are never converted or re-encoded.
/Apps in your Dropbox. Later syncs only fetch changes..fit files in FITgap from the Files app, Mail or another app, or pick several at once in the app, for example exports from Garmin, TrainerRoad, Rouvy, Bryton or Karoo, or files from iCloud Drive, Dropbox or Google Drive. Invalid files are rejected, and a file already in FITgap is not added twice. Imported activities take part in the duplicate check and the Apple Health export like any other source.FITgap.xcodeproj in Xcode and select the FITgap scheme.Run the Swift package tests with:
swift test
The iOS keychain, sync lifecycle and UI tests are part of the Xcode scheme.
fitgap://oauth/wahoo, scopes user_read workouts_read) and a public client ID, no client secret. The client ID is defined in Sources/FITgapCore/WahooOAuth.swift. If you build your own version, register your own application in the Wahoo Cloud API portal and use its client ID and redirect URI.WhooshId). No token refresh is known, so an expired session requires signing in again. FIT files are fetched through signed download links without the access token. MyWhoosh may change or restrict this interface at any time.activity:read). Hammerhead requires a client secret for every token request and offers no PKCE, so the app has to carry the secret. It never enters the repository: put it into Config/Secrets.xcconfig (copy Config/Secrets.example.xcconfig; Xcode Cloud writes it from the secret environment variable HAMMERHEAD_CLIENT_SECRET in ci_scripts/ci_post_clone.sh). At build time scripts/hammerhead-secret.sh masks it with a random key per build; masking only slows down extraction from the app. Without a secret the app builds normally and hides Hammerhead. Hammerhead only accepts http(s) redirects, so the registered redirect is the static page docs/oauth/hammerhead/ on GitHub Pages, which hands code and state to fitgap://oauth/hammerhead without loading anything else. For your own version, create an API client in the Hammerhead Dashboard, register that page (or your own copy) as redirect and change the client ID in Sources/FITgapCore/HammerheadOAuth.swift.db-<app key>://2/token, the scheme Dropbox provides for mobile apps; token_access_type=offline for a refresh token), so there is no client secret. FITgap requests only files.metadata.read and files.content.read. An App folder app would need the least access, but it can only see its own folder under /Apps, while Zwift, Wahoo, Karoo and others write into their own folders there. So FITgap needs access, kept read-only by these two scopes; it lists recursively, downloads only files and checks each against the Dropbox content hash and the FIT header before storing it. The app key is set in ; while it is empty, the app hides Dropbox. For your own version, create an app with and in the , enable the two scopes, allow public clients (PKCE) and enter its app key; the redirect follows from the key.WhenUnlockedThisDeviceOnly, no iCloud sync).Application Support/FITgap/. Nothing is sent to a server operated by the project.See the full Privacy Policy.
| Path | Contents |
|---|---|
App/ | SwiftUI app, localisation (de.lproj, en.lproj), assets |
Sources/FITgapCore/ | Provider access, keychain, storage, FIT summary reader, demo data |
Sources/FITgapProbe/, Sources/WahooProbe/ | Small macOS command-line clients for API experiments |
Tests/, AppTests/, AppUITests/ | Package, iOS and UI tests |
scripts/ | Helper scripts, e.g. generate-demo-fit.py for the synthetic demo files |
Assets/ | Brand and App Store artwork |
docs/ | Project website (GitHub Pages) |
The bundled demo FITs contain no personal data or real GPS positions; they are virtual rides on made-up loops in the open South Pacific. They were generated synthetically with Garmin's official Python FIT SDK, which is only a development tool and not an app dependency.
Issues and pull requests are welcome. By submitting a contribution you agree that it is licensed under the Apache License 2.0 (section 5 of the license). Please keep changes focused and match the existing code style.
Licensed under the Apache License 2.0. The name FITgap, the logo and the app icon are not covered by this license and may not be used to identify modified versions or derived apps; see NOTICE.
The App Store version is a convenient, paid build of this same source code. You are free to build the app yourself.
FITgap is an independent project and is not affiliated with or endorsed by Wahoo, Zwift, MyWhoosh, Hammerhead, Dropbox, intervals.icu, Garmin or HealthFit.
/Apps.fitSources/FITgapCore/DropboxOAuth.swiftAPI_KEY) and athlete ID, both found under Settings › Developer Settings. There is no app registration and no client secret. FITgap downloads only the original upload (/api/v1/activity/{id}/file, gzip-compressed) and only when it is a FIT; activities imported from Strava and GPX or TCX originals are skipped. The key does not expire; regenerating it at intervals.icu ends FITgap's access.