halkyon/apps/train
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Tizian 「ティツィアーン」 b72cea1fe0
feat(base,app,keys): keys of shared spaces, sealed to each member
Step 3 of ADR 0044 (D3, D18, D19). A shared space's data keys are
sealed on a device to each member's public keys; the instance keeps
what devices sealed and never opens it.

- halkyon_keys: the safety code of two accounts' public keys
  (`safetyCode`), 60 digits, the same on both sides.
- halkyon_base: the register hands out accounts' public keys
  (`public-keys-of`, local and remote); the table `shared_space_key`
  and the endpoint `sharedSpaceKeys` (memberKeys, keysNeeded, seal,
  mine). Only the Owner and Editors seal, the first key sealed to a
  member stays, and a member's keys go with their membership. Every
  host's migration creates the table.
- halkyon_app: `ContentCipher` seals a key to another account and
  opens one sealed by another; `SharedKeys` shares a space's key with
  its members, seals keys to newcomers and opens the person's own,
  holding each member to the public keys `KeyPins` pinned on first
  sight (`key_pins.json` in the person's folder), a change refused
  until trusted anew.

Learn takes them into its `Privacy` in step 4.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-11 11:35:42 +01:00
..
brouter feat(train): routes planned through the instance's BRouter (ADR 0030, D44) 2026-10-30 15:53:01 +01:00
halkyon_train_client feat(base,app,keys): keys of shared spaces, sealed to each member 2026-11-11 11:35:42 +01:00
halkyon_train_flutter feat(app,ui): sync waits on mobile data and asks first 2026-11-10 23:46:29 +01:00
halkyon_train_server feat(base,app,keys): keys of shared spaces, sealed to each member 2026-11-11 11:35:42 +01:00
snap feat(learn,train,todo,meditate): the icons on a white tile again, coloured by the system's theme on Android and iOS (ADR 0031, D9, D10) 2026-11-10 14:22:49 +01:00
.gitignore feat(train): Halkyon Train's shell, Todo's copied and renamed (ADR 0030, D12) 2026-10-30 15:52:45 +01:00
AGENTS.md feat(learn,todo,train,meditate,ui): the navigation bar flush with the foot, a fade above it 2026-11-08 11:48:37 +01:00
CLAUDE.md feat(train): Halkyon Train's shell, Todo's copied and renamed (ADR 0030, D12) 2026-10-30 15:52:45 +01:00
README.md feat(train): setting up and keeping the Polar Loop (ADR 0030, D34–D36) 2026-10-30 15:52:55 +01:00
release.dart build(train): Train on the desktop as a snap, to the Store's edge channel with each release (ADR 0030, D62) 2026-11-03 12:16:05 +01:00

Halkyon Train

Running, cycling and rowing, as a Halkyon app (what it is to do: ADR 0030). For now a shell on the shared packages: people choose an instance, sign in (with SimpleLogin or a password), switch between the accounts on their devices, sign out and delete their account; the home is empty until Train's first model.

Package What it is
halkyon_train_server The server: Serverpod with the halkyon_base module
halkyon_train_client Its client, generated by Serverpod
halkyon_train_flutter The app, on halkyon_app and halkyon_ui (Android, iOS, Linux, macOS, Windows)

Run it with serverpod start in halkyon_train_server, which starts the server (and its embedded PostgreSQL) on ports of its own, 8180 to 8190, and the app; or the app alone against an instance with flutter run --dart-define=SERVER_URL=https://…/ in halkyon_train_flutter. Tests: dart run melos run test:dart --scope=halkyon_train_server and dart run melos run test:flutter --scope=halkyon_train_flutter at the repository's root, or dart run tool/check.dart for everything.

The app's icon is Lucide's bike (ISC licence, ADR 0031), drawn by the repository's tool/app_icons.py. Licences: the server under the SSPL, the client and the app under the AGPL, the app's with a permission for linking Polar's BLE SDK, which isn't free software, for the Polar Loop (ADR 0030, D36; LICENSE.md).