BikeControl (SwiftControl)
使用 Zwift Click、Zwift Play、Shimano Di2 或任何藍牙控制器,搭配 MyWhoosh、Rouvy、Zwift 等。iOS、Android、Windows、macOS 均可免費試用。
AI 翻译
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Minimal EMOM and interval timer for CrossFit and HIIT. Native on iPhone, iPad, Apple Watch, Mac and Apple TV. SwiftUI, no accounts, no ads, no subscription.
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
WODrounds — EMOM, Interval & For Time Timer for CrossFit and HIIT
Minimal SwiftUI timer for CrossFit — EMOM, Tabata, intervals and For Time — on iPhone, iPad, Apple Watch, Mac and Apple TV. No accounts, no ads, no subscription — a single-purpose tool (not social, not workout tracking).
Principles: ultra-minimal UI; large type; one-handed use; Date-based timing (reliable when backgrounded); native Apple stack; start on iPhone, follow on Watch (one workout, one synced state).查看完整 README ↗EMOM & Intervals Timer
WODrounds times EMOM, intervals and For Time, in numbers you can read from across the room. A voice calls get ready, halfway and the last ten seconds, and your Apple Watch follows the workout you started on your phone. One purchase covers iPhone, iPad, Apple Watch, Mac and Apple TV, with no account, no ads and no subscription.
The developer half: how to build and run the app, how it is put together, how to contribute, and the license.
WODrounds.xcodeproj and pick the scheme WODrounds (iOS, iPadOS, macOS, tvOS) or WODrounds Watch (watchOS). Build and run on a simulator or a device.Sentry.xcconfig.example to Sentry.xcconfig and add a DSN. The build works without it. See docs/SENTRY.md.WODroundsTests uses Swift Testing. Run them with Product → Test or ⌘U.python3 scripts/validate_docs.py before committing changes to docs/. CI runs it too (docs.yml). It checks image references, App Store URLs, JSON-LD, the sitemap and canonical URLs.release branch moves (git push origin main:release). Pushes to main never build. The runbook is docs/RELEASING.md.What each mode does, with its ranges and the in-app flow, is in docs/MODES.md.
Principles: an ultra-minimal UI, large type, one-handed use, Date-based timing (reliable when backgrounded), the native Apple stack, and start on iPhone, follow on Watch (one workout, one synced state).
effectiveWorkoutEndDate(now:) gives HealthKit the active time.TimerUIMode enum) used by every platform view..buttonStyle(.card), large type, sounds.WindowGroup { ContentView() }.The engine:
start(now:), pause(now:), resume(now:), reset(), tick(now:), finish(now:) (For Time's Stop, which freezes the final time).forTime(capSeconds: Int?). nil is uncapped (no total, never finishes on its own); otherwise it finishes at the cap.In WODroundsWatch/:
@main).ObservableObject and WCSessionDelegate that decodes the payload from didReceiveApplicationContext.iPhone to Watch sync:
WCSession.updateApplicationContext, iPhone to Watch. No App Group needed.Apple Health (iOS and iPadOS):
The app follows the IAMJARL design system through its SPM package, iamjarl-design. No hardcoded colors, spacing, radius or typography in the UI.
https://github.com/jarllyng/iamjarl-design.git, added to both the WODrounds and the Watch target.DesignTokens.swift re-exports the package with @_exported import and adds app-specific font sizes. WatchDesign.swift imports the colors from the package and defines Watch-scaled spacing and type.
The look: heavy whitespace, large monospaced numbers, a clear hierarchy, minimal color, dark first. The primary color for main actions, the error color for destructive ones (Cancel). Buttons are solid and tactile, and the timer owns the screen.
English, Danish and Spanish (es-MX). The UI is localized. The spoken cues stay English in every language, because they are recorded voice files rather than synthesized text.
A static site lives in docs/ and is served by GitHub Pages at wodrounds.iamjarl.com (Settings → Pages → Deploy from branch → main, /docs). It has the home page, a page per timer, the Apple Watch page, workout examples, a guide, privacy and support, with translated pages in their own folders.
The site counts aggregate page views with Umami. The app has no marketing analytics; iOS uses Sentry for crashes only, as PrivacyPolicy.md says. For search, the pages carry canonical URLs, Open Graph, Twitter Cards, JSON-LD and a sitemap.
Read CONTRIBUTING.md first. Bugs, feature requests and tasks are GitHub Issues on this repo; do not add task-tracking .md files. Security issues go through SECURITY.md, and the Code of Conduct applies.
The rules for code:
TimelineView(.periodic(from:by:)) with snapshot(now:) / tick(now:)).Live Activities and the Dynamic Island, an Apple Watch complication and a presets library have been considered. Do not let them drive the current architecture.
| File | What it covers |
|---|---|
| docs/MODES.md | The timer modes, their ranges and the in-app flow |
| docs/VOICE_CUES.md | The spoken cues: their lines, when they play, how they are recorded |
| docs/ARCHIVE.md | Archive destinations, platform filtering, entitlements |
| docs/APP_ICONS.md | The icon asset checklist for every platform |
| docs/APP_STORE_CONNECT.md | App Store text (subtitle, description, keywords) for iOS, Mac and tvOS |
| docs/RELEASING.md | The release runbook: Xcode Cloud, version bumps, App Store submission |
| docs/SENTRY.md | Crash reporting setup (iOS only) |
| PrivacyPolicy.md | The privacy policy for the App Store and the app. Keep it in sync with docs/privacy.html |
| Support.md | Support copy for the App Store and the app. Keep it in sync with docs/support.html |
| CHANGELOG.md |
| User-facing changes, newest first |