{
  "added_at": "2026-11-02",
  "additional_evidence_urls": [
    "https://github.com/Th0rgal/open_oura/blob/e57c43ce5fe0cf9a646afa790bda3731be767507/crates/README.md",
    "https://github.com/Th0rgal/open_oura/blob/e57c43ce5fe0cf9a646afa790bda3731be767507/docs/architecture.md",
    "https://github.com/Th0rgal/open_oura/blob/e57c43ce5fe0cf9a646afa790bda3731be767507/docs/horizon-ring3-protocol-cheatsheet.md",
    "https://github.com/Th0rgal/open_oura/blob/e57c43ce5fe0cf9a646afa790bda3731be767507/docs/native-decoder.md",
    "https://github.com/Th0rgal/open_oura/blob/e57c43ce5fe0cf9a646afa790bda3731be767507/docs/algorithms/README.md",
    "https://github.com/Th0rgal/open_oura/blob/e57c43ce5fe0cf9a646afa790bda3731be767507/docs/data-recovery-map.md",
    "https://github.com/Th0rgal/open_oura/blob/e57c43ce5fe0cf9a646afa790bda3731be767507/docs/security-observations.md",
    "https://github.com/Th0rgal/open_oura/blob/e57c43ce5fe0cf9a646afa790bda3731be767507/crates/oura-protocol/src/events.rs",
    "https://github.com/Th0rgal/open_oura/blob/e57c43ce5fe0cf9a646afa790bda3731be767507/crates/oura-protocol/src/auth.rs",
    "https://github.com/Th0rgal/open_oura/blob/e57c43ce5fe0cf9a646afa790bda3731be767507/crates/oura-link/Cargo.toml",
    "https://github.com/Th0rgal/open_oura/blob/e57c43ce5fe0cf9a646afa790bda3731be767507/Cargo.toml",
    "https://github.com/Th0rgal/open_oura/blob/e57c43ce5fe0cf9a646afa790bda3731be767507/CLAUDE.md",
    "https://github.com/Th0rgal/open_oura/blob/e57c43ce5fe0cf9a646afa790bda3731be767507/LICENSE"
  ],
  "category": "reconstruction-cases",
  "description_en": "Reimplements the Bluetooth Low Energy protocol of the Oura Ring Gen 3/4/5 in Rust crates and an oura command-line client that pairs with, authenticates to and syncs a ring directly, with no Oura account or cloud service. The author reports recovering the GATT layout, packet framing and AES app-auth flow from the decompiled Android app, and porting history-event decoders and several on-device metrics, such as HRV, sleep debt and nightly temperature baselines, from Ghidra decompilations of the app's native libraries. Event bodies are stored raw in SQLite so they can be re-decoded as decoders improve.",
  "description_zh": "用一组 Rust crate 和 oura 命令行客户端重新实现 Oura Ring 第 3/4/5 代的低功耗蓝牙协议，可直接与戒指配对、认证并同步数据，无需 Oura 账户或云服务。作者称从反编译的 Android 应用中恢复了 GATT 布局、数据包帧格式和基于 AES 的应用认证流程，并依据 Ghidra 对应用原生库的反编译结果，移植了历史事件解码器以及 HRV、睡眠负债、夜间体温基线等若干设备端指标算法。事件内容以原始形式存入 SQLite，解码器改进后可重新解码。",
  "entry_url": "https://awesomerea.org/resources/open-oura-ring-protocol-case/",
  "entry_url_zh": "https://awesomerea.org/zh/resources/open-oura-ring-protocol-case/",
  "evidence_url": "https://github.com/Th0rgal/open_oura/blob/e57c43ce5fe0cf9a646afa790bda3731be767507/README.md",
  "group": "cases",
  "id": "open-oura-ring-protocol-case",
  "json_url": "https://awesomerea.org/resources/open-oura-ring-protocol-case/record.json",
  "kind": "case-study",
  "markdown_url": "https://awesomerea.org/resources/open-oura-ring-protocol-case/index.md",
  "markdown_url_zh": "https://awesomerea.org/zh/resources/open-oura-ring-protocol-case/index.md",
  "name": "open_oura: a cloud-free Oura Ring client built on its reverse-engineered BLE protocol",
  "name_zh": "open_oura：基于逆向 BLE 协议、无需云端的 Oura Ring 客户端",
  "record_type": "resource",
  "relationship": "independent-reconstruction",
  "requirements": [
    "Reviewed at the 2026-10-07 main head; there are no releases or tags, and the workspace version is 0.1.0. The README reports live pairing, authentication and event sync on a Ring 3 Horizon and a Ring 5, and says the client is designed for Ring 3/4/5, which share one GATT layout, packet framing and auth flow. Several event layouts are marked inferred or partly unresolved, and the algorithm status table lists the sleep, readiness and activity scores as only partly recovered. The iOS app and web dashboard built on these crates live in the separate open_health repository.",
    "Requires the user's own ring and a host Bluetooth adapter. Auth-gated reads need the ring's 16-byte app-auth key in a key file: the pair command installs a new key on a factory-reset ring, while an app-onboarded ring's key sits in the official app's local database, and the bundled helper for exporting it needs a rooted Android phone. Sleep staging and some scores depend on Oura's proprietary on-device models, which the README says are not included and must be supplied by the user; factory-reset and other state-changing commands sit behind explicit flags.",
    "Builds with Cargo as a Rust 2021 workspace. The oura-link crate uses btleplug for BLE by default and can be built without it so that an iOS host supplies its own CoreBluetooth transport; on macOS the terminal needs Bluetooth permission. A separate Python research bench in tools/ uses bleak and pycryptodome.",
    "cargo test runs 88 Rust unit tests at review, covering captured-packet decoding, an AES auth known-answer vector, mock-transport authentication and sync and the ported metric functions; no CI workflow is committed. Physiological figures in the documentation, such as overnight heart rate, RMSSD and SpO2 ratios, come from the author's own rings.",
    "MIT (LICENSE and Cargo metadata). Oura's apps, native libraries, models, firmware, decompiled output, captures and keys are kept out of the repository. A CLAUDE.md guide for coding agents is committed."
  ],
  "requirements_zh": [
    "审阅的是 main 分支 2026-10-07 的最新提交；仓库没有发布版本或标签，工作区版本为 0.1.0。README 称已在 Ring 3 Horizon 和 Ring 5 上实测配对、认证和事件同步，并说明客户端面向共用同一 GATT 布局、数据包帧格式和认证流程的 Ring 3/4/5 设计。若干事件布局标注为推断或部分未解析；算法状态表显示睡眠、准备度和活动评分仅部分恢复。基于这些 crate 的 iOS 应用和网页仪表盘位于独立的 open_health 仓库。",
    "需要使用者自己的戒指和主机蓝牙适配器。需认证的读取要求把戒指的 16 字节应用认证密钥写入密钥文件：pair 命令会在恢复出厂设置的戒指上安装新密钥；已由官方应用完成初始化的戒指，其密钥保存在官方应用的本地数据库中，仓库附带的导出辅助脚本需要已 root 的 Android 手机。睡眠分期和部分评分依赖 Oura 专有的设备端模型，README 说明这些模型不包含在仓库中，需由使用者自行提供；恢复出厂设置等会改变状态的命令须显式加参数才能执行。",
    "使用 Cargo 构建，为 Rust 2021 工作区。oura-link crate 默认使用 btleplug 实现 BLE，也可去掉该依赖构建，由 iOS 宿主提供自己的 CoreBluetooth 传输层；在 macOS 上需为终端授予蓝牙权限。tools/ 下另有使用 bleak 和 pycryptodome 的 Python 研究工具集。",
    "审阅时 cargo test 包含 88 个 Rust 单元测试，涵盖已捕获数据包的解码、AES 认证已知答案向量、基于模拟传输层的认证与同步以及移植的指标函数；仓库未提交 CI 工作流。文档中的夜间心率、RMSSD 和 SpO2 比值等生理数据来自作者自己的戒指。",
    "采用 MIT 许可（见 LICENSE 和 Cargo 元数据）。Oura 的应用、原生库、模型、固件、反编译输出、抓包数据和密钥均未纳入仓库。仓库提交了面向编程智能体的 CLAUDE.md 指南。"
  ],
  "targets": [
    "app",
    "protocol"
  ],
  "url": "https://github.com/Th0rgal/open_oura",
  "verification": "source-reviewed",
  "verified_at": "2026-10-20"
}
