Goose: Đọc dữ liệu WHOOP 5.0 offline bằng Swift + Rust
Goose là proof-of-concept iOS app kết nối WHOOP 5.0 qua Bluetooth, xử lý data local bằng Rust core - không cần cloud, không phụ thuộc WHOOP API.
Nguyễn Nhật Long
@nguyennhatlong1303
Mình để ý thấy một repo khá thú vị trên GitHub gần đây: b-nnett/goose. Tác giả đang build một iOS app để đọc dữ liệu sức khỏe từ vòng đeo tay WHOOP 5.0 - hoàn toàn local, không đi qua server của WHOOP, và dùng Rust làm core xử lý data. Nghe có vẻ điên, nhưng mình thấy cái approach này cực kỳ đáng để mổ xẻ.
Local-first với WHOOP - tại sao lại cần?
Nếu bạn đã dùng WHOOP, bạn biết app chính thức của họ hoạt động tốt, nhưng toàn bộ data của bạn nằm trên cloud của WHOOP. Muốn export? Khó. Muốn tích hợp với tool khác? Gần như không có API public nào decent. Đây là pain point mà khá nhiều người dùng WHOOP than phiền.
Goose giải quyết bài toán này theo hướng khác hẳn: thay vì đi qua API, app kết nối thẳng với thiết bị WHOOP 5.0 qua Bluetooth, đọc raw packet data từ device, rồi parse và lưu local. Không cần account WHOOP, không cần internet, data của bạn ở ngay trên máy bạn.
Theo kinh nghiệm của mình khi làm các dự án health tracking, đây là một trong những vấn đề khó nhất - vì các hãng thiết bị thường không document Bluetooth protocol, nên dev phải reverse engineer từ packet capture. Tác giả Goose rõ ràng đã bỏ ra khá nhiều công sức để làm được điều này với WHOOP 5.0.
Architecture: Tại sao lại dùng Rust cho iOS app?
Đây là phần mình thấy thú vị nhất về mặt kỹ thuật. Thay vì viết toàn bộ logic trong Swift, tác giả tách phần xử lý data ra thành một Rust core, compile thành iOS static library, rồi gọi qua C bridge từ Swift.
Project layout trông như thế này:
1GooseSwift/ → SwiftUI app2GooseWorkoutLiveActivityExtension/ → Live Activity widget3Rust/ → iOS static library + headers4Scripts/build_ios_rust.sh → Xcode build phase script5docs/goose-swift-mvp/ → MVP plans và data contracts
Flow data đi theo hướng:
GooseBLEClient.swift- scan, connect, sync với WHOOP 5.0 qua CoreBluetooth- Raw packet data được đẩy sang
GooseRustBridge.swift - Bridge gọi vào Rust core qua C FFI
- Rust parse, process, trả kết quả về
GooseAppModel.swiftnhận data, update app state- SwiftUI views render
Tại sao Rust thay vì viết thẳng trong Swift? Mình đoán có vài lý do:
Mình thấy cái này hay ở chỗ: nếu tác giả muốn làm thêm Android version sau này, họ chỉ cần viết UI layer mới, còn Rust core giữ nguyên. Đây là pattern khá phổ biến trong các app cross-platform nghiêm túc.
| Lý do | Giải thích |
|---|---|
| Performance | Rust xử lý binary parsing nhanh hơn Swift đáng kể |
| Portability | Rust core có thể reuse cho Android, CLI, hay web assembly sau này |
| Safety | Memory safety của Rust quan trọng khi xử lý raw binary data |
| Testing | Business logic trong Rust dễ unit test hơn, tách khỏi UI layer |
Những gì app đang làm được
Dù tác giả nhấn mạnh đây là alpha proof-of-concept, scope của nó không nhỏ. App có đủ các tab:
- Health - dashboard với các metric: recovery, sleep, strain, stress, cardio, energy
- Coach - UI chat support cho coaching
- More - debug/settings/operational surfaces
- Live Activity - widget extension hiển thị workout realtime trên Dynamic Island
Các file Swift chính:
1GooseSwiftApp.swift → app lifecycle, deep-link handling2RootView.swift → onboarding gate, global sync toast3AppShellView.swift → tab shell, health store wiring4GooseAppModel.swift → app state, BLE ownership, lifecycle5GooseBLEClient.swift → Bluetooth scan/connect/sync6GooseRustBridge.swift → Swift wrapper cho Rust C bridge7HealthView.swift → health dashboards, metric pages, trends8CoachView.swift → coach UI9MoreView.swift → debug/settings
Anh em lưu ý: tác giả thẳng thắn nói app đang lag "very considerably" vì chưa optimize performance. Đây là prototype để validate xem approach này có viable không, không phải production app. Performance PRs đang được welcome.
Build được không? Prerequisites khá cao
Tác giả nói thẳng luôn trong README: nếu bạn không biết Xcode là gì, hoặc không biết build Rust core, thì repo này chưa dành cho bạn. Public beta trên TestFlight sẽ ra ngày 13/6/2026.
Để tự build, bạn cần:
- macOS với Xcode
- Rust toolchain với iOS targets (
aarch64-apple-ios, etc.) - Chạy
Scripts/build_ios_rust.shnhư một Xcode build phase - Thiết bị WHOOP 5.0 thật (không support các đời cũ hơn)
Mình thử nhìn qua cấu trúc project, khả năng cao bạn cần add Rust targets:
1rustup target add aarch64-apple-ios2rustup target add aarch64-apple-ios-sim
Rồi script build sẽ compile Rust thành .a static lib, Xcode link vào app. Đây là pattern chuẩn cho Rust-on-iOS, không có gì quá exotic.
Điểm thú vị về tính độc lập và design credit
Tác giả rất rõ ràng về hai điều:
Về independence: Goose không affiliated với WHOOP, không dùng bất kỳ code nào của WHOOP. App giao tiếp với device qua Bluetooth sử dụng các services mà device tự expose ra - đây là điểm pháp lý quan trọng. Về cơ bản giống như bạn viết app đọc data từ một Bluetooth device bất kỳ.
Về design: Tác giả credit thẳng Bevel - một health tracking app khác - là visual reference chính cho UI của các màn Health, Sleep, Recovery, Strain, Stress. Mình thấy sự transparent này rất đáng trân trọng. Trong cộng đồng open source, credit đúng người đúng chỗ là điều quan trọng.
Tại sao repo này đáng để follow
Goose đang ở giai đoạn rất sớm - 10 commits, ~1.7k stars, 455 forks. Nhưng nó đang giải quyết một bài toán thật: data sovereignty cho người dùng thiết bị health tracking.
Về mặt kỹ thuật, đây là một case study hay về:
- Rust + Swift interop qua C FFI trên iOS
- BLE reverse engineering cho proprietary devices
- Local-first architecture cho health data
- Swift + Rust monorepo structure
Nếu bạn đang làm bất cứ thứ gì liên quan đến Bluetooth devices, health data, hoặc Rust-on-mobile, repo này có khá nhiều thứ để học hỏi - dù code còn thô và performance chưa ổn.
Mình sẽ tiếp tục theo dõi project này đến tháng 6/2026 khi public beta ra. Nếu tác giả deliver được một app stable với đúng những gì đang hứa hẹn, đây có thể là một trong những WHOOP companion app thú vị nhất trên market - chính xác vì nó làm điều mà app chính thức của WHOOP không bao giờ làm: để data ở local, trong tay người dùng.
Nguyễn Nhật Long
@nguyennhatlong1303Nguyễn Nhật Long is a Senior Frontend Engineer and Frontend Team Leader with 7 years of experience building real-time fintech platforms. Specializing in React, Next.js, TypeScript, and React Native, shipping 10+ products across Web, Mobile, Telegram Mini-Apps, and Web3.
Thấy hay? Chia sẻ cho bạn bè!