Oura Ring

approved

by kinabalu

Import Oura Ring data into a note.

50 stars5,926 downloadsUpdated 1y agoMIT

Oura Ring Plugin for Obsidian

Add your oura ring stats to an Obsidian note for any dates. The documentation for the Oura Ring API is available at API Documentation.

Features

  • Connect to Oura using OAuth, with automatic access-token refresh
  • Insert the data in a page which is formatted YYYY-MM-DD
  • Or insert into any page and it will use whatever today's date is

Connect to Oura

  1. Create a personal application in Oura My Applications.
  2. Register obsidian://oura-oauth as its redirect URI. If Oura's application form requires HTTPS, register an HTTPS URL you control and enter that exact URL in the plugin instead. The destination must preserve the query string so you can copy the callback URL.
  3. Open Settings → Oura Ring and enter your application's client ID and client secret. These must be your own application's credentials, not a shared secret distributed with the plugin.
  4. Select Connect to Oura, sign in through your browser, and allow daily data access.
  5. Allow the browser to open Obsidian. If it does not return to the correct vault, copy the complete redirected URL into Complete sign-in manually and submit within 10 minutes. Keep the plugin loaded during sign-in.

Sleep, readiness, and activity imports request only the daily scope. Expiring tokens refresh automatically on import. If authorization expires or is revoked, reconnect in settings. Existing personal access tokens and templates are preserved on upgrade. When no OAuth connection exists, imports continue to use the saved personal token and show a migration notice. A successful OAuth exchange removes the legacy token; disconnect also clears it. Legacy token acceptance remains controlled by Oura.

OAuth credentials and tokens are stored without encryption in .obsidian/plugins/obsidian-oura-plugin/data.json. Keep this file out of source control and sharing. Avoid syncing it between devices: Oura refresh tokens are single-use and each plugin instance maintains its own connection. Disconnect clears local tokens and cancels pending sign-in; revoke the application's access in your Oura account to remove the server-side grant.

This uses Oura's documented authorization-code flow, which requires a client secret. No shared application secret is bundled. A public one-click connection would require a separately operated OAuth backend. The custom-scheme callback's acceptance by Oura and desktop/mobile browser handoff still require live verification; the manual HTTPS callback is available when a custom scheme cannot be registered.

Development

Use npm and the tracked package-lock.json for reproducible installs. Run npm ci, npm test, npm run typecheck, and npm run build. The production bundle is main.js. See OAuth verification and next steps for validation scope and remaining device checks.

Oura API Variables

Sleep

NameField
Sleep Daysleep_day
Sleep Scoresleep_score
Sleep Timestampsleep_timestamp
Deep Sleepsleep_contributors_deep_sleep
Efficiencysleep_contributors_efficiency
Latencysleep_contributors_latency
REM Sleepsleep_contributors_rem_sleep
Restfulnesssleep_contributors_restfulness
Timingsleep_contributors_timing
Total Sleepsleep_contributors_total_sleep

Readiness

NameField
Readiness Dayreadiness_day
Readiness Scorereadiness_score
Temperature Deviationreadiness_temperature_deviation
Temperature Trend Deviationreadiness_temperature_trend_deviation
Readiness Timestampreadiness_timestamp
Activity Balancereadiness_contributors_activity_balance
Body Temperaturereadiness_contributors_body_temperature
HRV Balancereadiness_contributors_hrv_balance
Previous Day Activityreadiness_contributors_previous_day_activity
Previous Nightreadiness_contributors_previous_night
Recovery Indexreadiness_contributors_recovery_index
Resting Heart Ratereadiness_contributors_resting_heart_rate
Sleep Balancereadiness_contributors_sleep_balance

Activities

NameField
Class (5 min)activities_class_5_min
Scoreactivities_score
Active Caloriesactivities_active_calories
Average MET Minutesactivities_average_met_minutes
Equivalent Walking Distanceactivities_equivalent_walking_distance
High Activity MET Minutesactivities_high_activity_met_minutes
High Activity Timeactivities_high_activity_time
Inactivity Alertsactivities_inactivity_alerts
Low Activity MET Minutesactivities_low_activity_met_minutes
Low Activity Timeactivities_low_activity_time
Medium Activity MET Minutesactivities_medium_activity_met_minutes
Medium Activity Timeactivities_medium_activity_time
Meters to Targetactivities_meters_to_target
Non-Wear Timeactivities_non_wear_time
Resting Timeactivities_resting_time
Sedentary MET Minutesactivities_sedentary_met_minutes
Sedentary Timeactivities_sedentary_time
Stepsactivities_steps
Target Caloriesactivities_target_calories
Target Metersactivities_target_meters
Total Caloriesactivities_total_calories
Dayactivities_day
Timestampactivities_timestamp
MET Intervalactivities_met_interval
MET Itemsactivities_met_items
MET Timestampactivities_met_timestamp
Meet Daily Targetsactivities_contributors_meet_daily_targets
Move Every Houractivities_contributors_move_every_hour
Recovery Timeactivities_contributors_recovery_time
Stay Activeactivities_contributors_stay_active
Training Frequencyactivities_contributors_training_frequency
Training Volumeactivities_contributors_training_volume

Installation

The Oura Plugin for Obsidian release is pending review.

Manual Installation

Two methods and the first one is easier:

Method 1

  • Enable community plugins and install Obsidian42 - BRAT
  • Go to settings and under Beta Plugin List click "Add Beta plugin" and type kinabalu/obsidian-oura-plugin

Method 2

  • Create an obsidian-oura-plugin folder under .obsidian/plugins in your vault. Add the main.js, manifest.json, and the styles.css files from the latest release to the folder.

Usage

Open the command palette (⌃+P or ⌘+P) and type Oura Ring. Execute the Oura Ring: Insert Oura Ring Stats action and your data will be written to your current cursor location.

Say Thanks 🙏

If you like this plugin and would like to buy me a coffee, you can!

BuyMeACoffee

For plugin developers

Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.