尚未检测到更新。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.