Trending
5 phút đọc4 tháng 6, 2026277

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.

N

Nguyễn Nhật Long

@nguyennhatlong1303

Goose: Đọc dữ liệu WHOOP 5.0 offline bằng Swift + Rust

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:

TEXT
1GooseSwift/ → SwiftUI app
2GooseWorkoutLiveActivityExtension/ → Live Activity widget
3Rust/ → iOS static library + headers
4Scripts/build_ios_rust.sh → Xcode build phase script
5docs/goose-swift-mvp/ → MVP plans và data contracts

Flow data đi theo hướng:

  1. GooseBLEClient.swift - scan, connect, sync với WHOOP 5.0 qua CoreBluetooth
  2. Raw packet data được đẩy sang GooseRustBridge.swift
  3. Bridge gọi vào Rust core qua C FFI
  4. Rust parse, process, trả kết quả về
  5. GooseAppModel.swift nhận data, update app state
  6. 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ý doGiải thích
PerformanceRust xử lý binary parsing nhanh hơn Swift đáng kể
PortabilityRust core có thể reuse cho Android, CLI, hay web assembly sau này
SafetyMemory safety của Rust quan trọng khi xử lý raw binary data
TestingBusiness 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:

TEXT
1GooseSwiftApp.swift → app lifecycle, deep-link handling
2RootView.swift → onboarding gate, global sync toast
3AppShellView.swift → tab shell, health store wiring
4GooseAppModel.swift → app state, BLE ownership, lifecycle
5GooseBLEClient.swift → Bluetooth scan/connect/sync
6GooseRustBridge.swift → Swift wrapper cho Rust C bridge
7HealthView.swift → health dashboards, metric pages, trends
8CoachView.swift → coach UI
9MoreView.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.sh như 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:

Terminal
1rustup target add aarch64-apple-ios
2rustup 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.

NN

Nguyễn Nhật Long

@nguyennhatlong1303

Nguyễ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è!