Highlights
We encourage you to use our official Docker images:
- backend: https://hub.docker.com/r/themomentum/open-wearables-backend
- frontend: https://hub.docker.com/r/themomentum/open-wearables-frontend
Changes to HTTP logs
As HTTP logs usually account for more than 80% of all logs, we have disabled them by default for production deployments and added a new variable to control their flow (ACCESS_LOG_LEVEL). How it works:
ACCESS_LOG_LEVEL=all-> All HTTP logs are available, as beforeACCESS_LOG_LEVEL=errors-> only 4xx & 5xx log entries are availableACCESS_LOG_LEVEL=off-> no HTTP logs- no
ACCESS_LOG_LEVEL(None value):- if
ENVIRONMENT=production->errorslevel is set automatically - else
alllevel is set automatically
- if
We have also changed the structure of the HTTP logs:
- before:
[2026-07-15 11:41:55,669 - uvicorn.access] (INFO) HOSTNAME:PORT - "GET /api/v1/users?page=1&limit=9&sort_by=created_at&sort_order=desc HTTP/1.1" 200
- after:
{"timestamp": "2026-07-15T13:31:03.742767+00:00", "level": "info", "message": "http_request", "provider": null, "method": "OPTIONS", "path": "/api/v1/users?limit=5&sort_by=created_at&sort_order=desc", "status": 200, "duration_ms": 3.5}
Warning
By default, ACCESS_LOG_LEVEL is set to None, so if you have the ENVIRONMENT variable set to production, you will stop logging most messages. If you wish to retain the current behaviour, you must add the ACCESS_LOG_LEVEL variable and set it to all.
Note
For the time being, this change only affects HTTP logs from uvicorn. The new variable does not alter the behaviour of logs from Open Wearables.
Nap detection for Apple & Oura
We have added support for naps based on data provided by Apple and Oura. For the time being, this feature works correctly only for these two providers, but we will endeavour to develop our own algorithms to detect naps for providers that do not themselves flag which sleep sessions are naps.
Flag to enable/disable outgoing webhooks
We have added a new variable, OUTGOING_WEBHOOKS_ENABLED, which allows you to enable or disable outgoing webhooks. By default, it is set to false, so you need to add it and set it to true for the webhooks to start working.
Note
Please note that this has nothing to do with incoming webhooks from providers. It only concerns events that Open Wearables sends to client backends.
Strava workout samples
Once the INGEST_WORKOUT_SAMPLES variable is set to true (it was added in previous versions whilst working on Garmin workout samples and is set to false by default), Strava will start logging workout data at a high frequency. You can find out more about this mechanism in the entry “Ingest workout samples” for Garmin in the 0.6.0 release note: https://github.com/the-momentum/open-wearables/releases#release-0.6.0
Redis switched from RDF to AOF mode
We have changed the way Redis works to avoid errors in certain edge cases. You can read the details here: #1188. We have, of course, ensured that the data stored in Redis is preserved during the update.
The Docker Dev image has been reduced in size by around 40%
We achieved this by sealing the .dockerignore file and removing old and unused layers from the Dockerfile. This, of course, only applies to the local development version; nothing changes in the production build.
What's Changed
Outgoing webhooks
- fix(backend): add event emission after reconnection by @itsnotashtonkutcher & @KaliszS in #1262
- feat(backend): silence svix logs at startup by @KaliszS in #1289
- feat(backend): outgoing webhooks enable flag + manual disconnect event by @KaliszS in #1293
Apple
- fix(backend): convert Health Connect blood glucose from mmol/L to mg/dL by @knowald in #1123
- feat: Add nap detection for Oura, Apple by @czajkub in #1149
Oura
- fix(backend): persist daily resting heart rate from sleep data by @andrewle21 & @KaliszS in #1176
- feat: Add nap detection for Oura, Apple by @czajkub in #1149
Suunto
- fix(integrations): accept float totalDistance in Suunto workout schema by @thecodearrow in #1253
Garmin
Strava
- feat(backend): Strava workout samples by @Ri087 in #1093
- fix: Strava samples coverage by @czajkub in #1283
Fitbit
API improvements & optimisation
- refactor(backend): update get method to accept string as object_id by @curiousmoonnadin & @KaliszS in #1265
- fix(backend): accept summary_start_time/summary_end_time in provider load_data by @haoyu-haoyu & @KaliszS in #777
- fix(backend): n+1 in sleep summary by @itsnotashtonkutcher & @KaliszS in #1259
- fix: update sleep summary endpoint by @czajkub in #1257
- feat: added Women's Health to Data Coverage tab by @KaliszS in #1285
Observability & deployments
- fix(backend): enable Redis AOF persistence so the svix queue survives restarts by @knowald & KaliszS in #1188
- fix(frontend): remove redundant layers & add .output to .dockerignore by @KaliszS in #1296
- feat(backend): middleware for uvicorn logs by @KaliszS in #1297
- feat(backend): timestamp for HTTP middleware logs by @KaliszS in #1301
MCP
Docs & chores
- feat: automatic update for coverage docs by @KaliszS in #1286
- docs: remove custom deployment note from Garmin warning by @bartmichalak in #1254
- chore: update frontend dependencies by @KaliszS in #1270
- chore: update backend dependencies by @KaliszS in #1271
- docs: sync .env.example with config.py + CodeRabbit drift check by @aks129 in #1264
- docs: remove custom deployment note from Garmin warning by @bartmichalak in #1272
- docs: remove Garmin API integration page from nav menu by @bartmichalak in #1273
- chore(frontend): update ts & prettier by @KaliszS in #1284
- docs: clear out roadmap page, coming back soon by @bartmichalak in #1294
- chore: update Open Wearables to 0.6.3 by @KaliszS in #1302
New Contributors
- @aks129 made their first contribution in #1264
- @curiousmoonnadin made their first contribution in #1265
- @itsnotashtonkutcher made their first contribution in #1262
- @thecodearrow made their first contribution in #1253
- @andrewle21 made their first contribution in #1176
- @Ri087 made their first contribution in #1093
Full Changelog: 0.6.2...0.6.3