- Dart 50.9%
- PHP 30.2%
- Python 8.4%
- Shell 4.9%
- Vue 4%
- Other 1.6%
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> |
||
|---|---|---|
| .forgejo/workflows | ||
| .githooks | ||
| android | ||
| assets/icon | ||
| docs | ||
| fastlane/metadata | ||
| fdroid | ||
| ios | ||
| lib | ||
| nextcloud_app | ||
| test | ||
| tool | ||
| .flake8 | ||
| .fvmrc | ||
| .gitattributes | ||
| .gitignore | ||
| .metadata | ||
| analysis_options.yaml | ||
| CHANGELOG.md | ||
| CLAUDE.md | ||
| dart_test.yaml | ||
| flutter_launcher_icons.yaml | ||
| l10n.yaml | ||
| LICENSE | ||
| pubspec.lock | ||
| pubspec.yaml | ||
| README.md | ||
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
- docs/DESIGN.md — full design and rationale (source of truth).
- docs/DEVELOPMENT.md — set up a dev environment from scratch, for the Flutter app and the Nextcloud app alike.
- nextcloud_app/README.md — the web app, and its
one-command dev environment (
nextcloud_app/dev up). - CHANGELOG.md — notable changes.
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.