No description
  • Dart 50.9%
  • PHP 30.2%
  • Python 8.4%
  • Shell 4.9%
  • Vue 4%
  • Other 1.6%
Find a file
Max Fiedler a84c9222fc
All checks were successful
CI / check (push) Successful in 1m8s
Nextcloud app CI / app (push) Successful in 35s
Nextcloud compatibility matrix / matrix (push) Successful in 3m56s
Commit the app-store signing certificate
cairn.crt is the counter-signed public half of the release keypair. It
carries nothing secret, and keeping it here means anyone can verify a
release signature against the same certificate the store used. `dev package`
finds it by default now, so the private key — which the pre-commit hook
refuses — is the only secret the release path needs.

tests/validate_certificate.php checks it on every `dev check`, for two
failures that stay quiet until they are expensive: a certificate naming a
different app id produces signatures the store rejects at upload, and expiry
is a time bomb that goes off years later with a confusing error. It warns 90
days out, and refuses the file outright if a private key ever appears in it.
All three were verified by planting each mistake in turn.

Also fixes a defect in the seam tests added last commit: they read the wall
clock through QueryFactory's own SystemClock, so a controller test asserting
today's step total passed on the 20th and failed on the 22nd. QueryFactory
now takes an injectable clock, for the same reason the query service already
did, and the seam tests pin the date.

DESIGN.md records Phase 7's exit criteria as met: the app is published.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 23:58:21 +02:00
.forgejo/workflows Run the same gate on release as on every branch push 2026-08-22 23:31:47 +02:00
.githooks Package the app for the store, and test the artefact 2026-08-20 15:31:32 +02:00
android Require Android 14, and stop hiding failures from the user 2026-08-22 11:13:41 +02:00
assets/icon Add Cairn app icon and capitalize the app name 2026-06-17 13:09:24 +02:00
docs Commit the app-store signing certificate 2026-08-22 23:58:21 +02:00
fastlane/metadata Require Android 14, and stop hiding failures from the user 2026-08-22 11:13:41 +02:00
fdroid Restore the recipe's wrapped binary: fields 2026-08-22 23:47:34 +02:00
ios Fix iOS HealthKit entitlement; pin iOS deployment target 14.0 2026-06-24 08:36:22 +02:00
lib Require Android 14, and stop hiding failures from the user 2026-08-22 11:13:41 +02:00
nextcloud_app Commit the app-store signing certificate 2026-08-22 23:58:21 +02:00
test Require Android 14, and stop hiding failures from the user 2026-08-22 11:13:41 +02:00
tool Add the Nextcloud web app subtree and its dev environment 2026-08-20 13:06:29 +02:00
.flake8 Add the Nextcloud web app subtree and its dev environment 2026-08-20 13:06:29 +02:00
.fvmrc Bootstrap Cairn: Flutter scaffold, architecture, docs, licensing 2026-06-14 23:19:01 +02:00
.gitattributes Hold both readers to shared golden fixtures 2026-08-20 13:39:35 +02:00
.gitignore Add the dashboard: a read-only JSON API and a Vue frontend 2026-08-20 14:09:21 +02:00
.metadata Bootstrap Cairn: Flutter scaffold, architecture, docs, licensing 2026-06-14 23:19:01 +02:00
analysis_options.yaml Add internationalization (English + German) 2026-06-17 11:56:46 +02:00
CHANGELOG.md Commit the app-store signing certificate 2026-08-22 23:58:21 +02:00
CLAUDE.md Compact re-reported cumulative totals on ingest 2026-07-01 15:19:48 +02:00
dart_test.yaml Hold both readers to shared golden fixtures 2026-08-20 13:39:35 +02:00
flutter_launcher_icons.yaml Add Cairn app icon and capitalize the app name 2026-06-17 13:09:24 +02:00
l10n.yaml Add internationalization (English + German) 2026-06-17 11:56:46 +02:00
LICENSE Bootstrap Cairn: Flutter scaffold, architecture, docs, licensing 2026-06-14 23:19:01 +02:00
pubspec.lock Add opportunistic background sync (Phase 5) 2026-06-17 13:57:31 +02:00
pubspec.yaml Require Android 14, and stop hiding failures from the user 2026-08-22 11:13:41 +02:00
README.md Add the Nextcloud web app subtree and its dev environment 2026-08-20 13:06:29 +02:00

Cairn

A personal health-data aggregator that you own end to end.

Cairn reads your wearable and phone health data from the platform's own health store (Apple HealthKit / Android Health Connect), normalizes it into an open, documented file format (Open mHealth / IEEE 1752.1, as sharded JSON Lines), and syncs it into a Nextcloud you control. No central server, no proprietary database, no vendor lock-in — the files in your Nextcloud are the single source of truth.

It is deliberately aimed at privacy-conscious people and self-hosters who run (or will happily run) their own Nextcloud. "Bring your own Nextcloud" is the feature, not a barrier.

Components

  • Mobile app (Flutter, iOS + Android) — reads the health store, writes OMH files, syncs over WebDAV. The only writer. (MIT)
  • Nextcloud web app (nextcloud_app/, PHP + Vue) — an optional, read-only second frontend over the same files, installed onto your own Nextcloud. (AGPL-3.0-or-later)

Status

Early development. The mobile app is through its dashboard and sync phases and into release hardening. The Nextcloud web app has just started: its development environment and file-reading skeleton exist, and the read-path semantics and Vue dashboard are next. See the phased plan in docs/DESIGN.md §15.

Documentation

License

The mobile app and the OMH file format are released under the MIT License. The Nextcloud web app ships from its own subtree under AGPL-3.0-or-later, because it bundles the AGPL/GPL @nextcloud/* frontend packages into the JavaScript it distributes; see docs/DEVELOPMENT.md §5.

Not a medical device

Cairn aggregates and visualizes data. It makes no diagnostic, treatment, or clinical claims.