halkyon/apps/meditate/AGENTS.md

13 lines
11 KiB
Markdown
Raw Permalink Normal View History

feat(meditate): the app: Today, Explore, Profile, the sitting and its bells halkyon_meditate_flutter on halkyon_app and halkyon_ui (ADR 0038): the first start, sign-in and account as every Halkyon app's, a bar below medium windows and a rail with the icon from medium on, fern washes, Settings in cards (Sync, the operator's, Sitting, Practice, the account, What's new, About, the version), English and German. - Today: a greeting by the hour, Sit now at 5, 10, 20 minutes and the timer's own length, the practice of the day, the week with the days in a row, favourites, recently sat (D9). - Explore: six practices of Halkyon's own, written for the app, found by a search without case or accents, by goal and by kind; each page with how it goes, its lengths, its heart and Start (D4, D10). - The sitting, over the tabs: its time from the clock, a ring counting down, the cue of the moment, Pause and End, the bells at the start, between and at the end, the screen kept on; ended early, kept from a minute on where the person says so (D5, D6). - Profile: every Halkyon app's, then the person's practice: minutes, sittings, days, the week and every sitting kept, to delete (D8). - Settings and sittings sealed with the person's key and synced (D7). The bells are synthesised by apps/meditate/tool/bells.py, the icon is Lucide's sprout from cobalt through pacific into fern (tool/app_icons.py). Releases and the deploy are a later step. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-03 09:25:30 +01:00
# Halkyon Meditate
refactor!: packages, paths and app IDs under Halkyon Days' names (ADR 0045, step 3) Learn's folder is apps/halkyon, Todo's apps/myrmex; every package of ours takes the prefix halkyone_ (halkyone_halkyon_*, halkyone_myrmex_*, halkyone_train_*, halkyone_meditate_*, halkyone_app, halkyone_base_* and the other shared ones; halkyon_oidc_* keeps its name, D11). Halkyon and Myrmex take the app IDs one.halky.halkyon and one.halky.myrmex (D10); Train and Meditate keep theirs, while every app's Android namespace, Kotlin package and method channels move to one.halky. The snaps are halkyon and myrmex (D17), each built in a clone with its recipe in place of snap/, as Train's and Todo's were. Serverpod finds a database's migrations by its module's name, which changed with the packages': - each server's new, empty migration ("rename") records itself under the new names and deletes the rows under the old ones; - deploy/redeploy.sh copies each database's record to the new name before the migrations (carry_module), so the renamed servers find their databases migrated; a copy, never a move, so a deploy failing before the migration commits leaves the old rows in place; - Train and Meditate keep their devices' databases: halkyone_app's carryMigrationRecord copies their record before the sync engine opens them (openPersonDatabase); - the client migrations' generated moduleName getters, one line each, say the new names: Serverpod's client asserts in debug builds that every migration names the module, and create-migration never writes a migration's files again. Train's WorkManager work is enqueued under new names, the former ones cancelled: the work kept names the workers' former classes. The release tool: an app's tags of its earlier names count as its history (legacyTagPrefixes), the shared packages' former paths count for its version, and every snap is built in a clone (atRoot gone). The databases, Docker images and Compose project keep their names until step 5. BREAKING CHANGE: Halkyon (Learn) and Myrmex (Todo) are new apps to Android and the Snap Store: installs of app.halkyon.learn and app.halkyon.todo don't update to them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-12 23:21:45 +01:00
What holds for every app and package of this repository is in the [root AGENTS.md](../../AGENTS.md); it applies here in full, and Learn's patterns (`apps/halkyon/AGENTS.md`) wherever Meditate needs the same thing. What Meditate is and why: [ADR 0038](../../docs/adr/0038-halkyon-meditate.md) (proposed 3 Nov 2026, built by an agent without the developer's interjection; its decisions await their reading).
feat(meditate): the app: Today, Explore, Profile, the sitting and its bells halkyon_meditate_flutter on halkyon_app and halkyon_ui (ADR 0038): the first start, sign-in and account as every Halkyon app's, a bar below medium windows and a rail with the icon from medium on, fern washes, Settings in cards (Sync, the operator's, Sitting, Practice, the account, What's new, About, the version), English and German. - Today: a greeting by the hour, Sit now at 5, 10, 20 minutes and the timer's own length, the practice of the day, the week with the days in a row, favourites, recently sat (D9). - Explore: six practices of Halkyon's own, written for the app, found by a search without case or accents, by goal and by kind; each page with how it goes, its lengths, its heart and Start (D4, D10). - The sitting, over the tabs: its time from the clock, a ring counting down, the cue of the moment, Pause and End, the bells at the start, between and at the end, the screen kept on; ended early, kept from a minute on where the person says so (D5, D6). - Profile: every Halkyon app's, then the person's practice: minutes, sittings, days, the week and every sitting kept, to delete (D8). - Settings and sittings sealed with the person's key and synced (D7). The bells are synthesised by apps/meditate/tool/bells.py, the icon is Lucide's sprout from cobalt through pacific into fern (tool/app_icons.py). Releases and the deploy are a later step. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-03 09:25:30 +01:00
refactor!: packages, paths and app IDs under Halkyon Days' names (ADR 0045, step 3) Learn's folder is apps/halkyon, Todo's apps/myrmex; every package of ours takes the prefix halkyone_ (halkyone_halkyon_*, halkyone_myrmex_*, halkyone_train_*, halkyone_meditate_*, halkyone_app, halkyone_base_* and the other shared ones; halkyon_oidc_* keeps its name, D11). Halkyon and Myrmex take the app IDs one.halky.halkyon and one.halky.myrmex (D10); Train and Meditate keep theirs, while every app's Android namespace, Kotlin package and method channels move to one.halky. The snaps are halkyon and myrmex (D17), each built in a clone with its recipe in place of snap/, as Train's and Todo's were. Serverpod finds a database's migrations by its module's name, which changed with the packages': - each server's new, empty migration ("rename") records itself under the new names and deletes the rows under the old ones; - deploy/redeploy.sh copies each database's record to the new name before the migrations (carry_module), so the renamed servers find their databases migrated; a copy, never a move, so a deploy failing before the migration commits leaves the old rows in place; - Train and Meditate keep their devices' databases: halkyone_app's carryMigrationRecord copies their record before the sync engine opens them (openPersonDatabase); - the client migrations' generated moduleName getters, one line each, say the new names: Serverpod's client asserts in debug builds that every migration names the module, and create-migration never writes a migration's files again. Train's WorkManager work is enqueued under new names, the former ones cancelled: the work kept names the workers' former classes. The release tool: an app's tags of its earlier names count as its history (legacyTagPrefixes), the shared packages' former paths count for its version, and every snap is built in a clone (atRoot gone). The databases, Docker images and Compose project keep their names until step 5. BREAKING CHANGE: Halkyon (Learn) and Myrmex (Todo) are new apps to Android and the Snap Store: installs of app.halkyon.learn and app.halkyon.todo don't update to them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-12 23:21:45 +01:00
- **Packages**: `halkyone_meditate_server`, `halkyone_meditate_client` (generated, never edited), `halkyone_meditate_flutter`; app ID `app.halkyon.meditate` on every platform; no web build. Licences as Learn's (server SSPL, client and app AGPL; `LICENSE.md`). Copied from Todo's tree on 3 Nov 2026 and stripped to the shell, so its frame, keys and sealed rows are Todo's and Train's.
feat(halkyon,myrmex,train,meditate)!: a register for each app, at halkyon.li and myrmex.li (ADR 0045, step 5) halkyon.li's deploy under Halkyon Days' names (D13, D23): the compose files compose.halkyon.yaml, compose.myrmex.yaml and compose.myrmex-search.yaml, the service myrmex-server, the images halkyon-halkyon-server, halkyon-halkyon-dictionaries and halkyon-myrmex-server, the databases halkyon_halkyon and halkyon_myrmex and the superuser halkyon_halkyon, and every variable under its service's name (LEARN_ is HALKYON_, TODO_ MYRMEX_). The Compose project and its network keep halkyon-learn, as the volumes are named after it. Every server is a register of its own (D7, D9, D20): no ACCOUNT_REGISTER_URL, INSTANCE_SECRET or INSTANCE_MEMBER_ any more; each reads its sign-in settings as <APP>_SIGN_UP, <APP>_SIMPLELOGIN_…, and so on (the mail server alone is shared), signs in with a SimpleLogin app of its own, and serves its register's pages itself: Myrmex's, Train's and Meditate's servers add the SimpleLogin callback, the privacy page and the profile pages, and their Caddy sites forward them. Halkyon answers at halkyon.li and Myrmex at myrmex.li (D22): learn.halkyon.li and todo.halkyon.li leave ramiel's HAProxy and Caddy; Halkyon's and Myrmex's builds, snaps and F-Droid listings connect to the new addresses, and Halkyon's App Links name halkyon.li. The switch is a script run once by hand (D24), as the deployed redeploy.sh can't carry the migration records nor rename an open database: deploy/host/switch-0045.sh rewrites .env (env-0045.sh: every secret kept, a decoy key made for each new register), dumps every database, renames them and the superuser through a temporary superuser in one transaction, fast-forwards, carries the migration records to the modules' new names, migrates, copies the developer's account (its keys and its operator's scope, D21) into the other registers, and starts everything. deploy/host/link-simplelogin.sh then links each register's new SimpleLogin identity to that account, found by the four words of its wait screen. Their SQL was run against PostgreSQL 16 on the databases the migrations define. redeploy.sh no longer carries records. BREAKING CHANGE: learn.halkyon.li and todo.halkyon.li no longer answer; the apps connect to halkyon.li and myrmex.li, and each app's accounts are its own. Whats-New: Each app now keeps its own accounts; Halkyon is at halkyon.li and Myrmex at myrmex.li. Whats-New-De: Jede App führt jetzt ihre eigenen Konten; Halkyon ist unter halkyon.li erreichbar und Myrmex unter myrmex.li. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-13 02:04:48 +01:00
- **The server** includes `halkyone_base` (ADR 0014) and configures it in `server.dart` (`meditateBase()`, `lib/src/meditate_base.dart`): its basics say it serves `meditate` (never change it once apps use it), sign-in mails name Halkyon Meditate, the source is this repository, `minimumAppBuild` 1, a person's space deleted with them (`deletePersonData: [deleteMeditateData]`, `lib/src/meditate_data.dart`). **Accounts** (ADR 0016): Meditate holds its own register when it runs alone, and is a member of the instance's register where the operator sets `ACCOUNT_REGISTER_URL` (`AccountsMode.fromEnvironment()`) with the instance's shared `INSTANCE_SECRET`; on halkyon.li it holds its own since Halkyon Days (ADR 0045, D9), with its own SimpleLogin app and `MEDITATE_…` settings. `schedulePruning` (`lib/src/pruning.dart`) keeps the module's pruning scheduled once each. Synced tables (ADR 0038, D7; `database: sync`, every row sealed): `content_key`, `meditate_settings` (one row a person, under an ID keyed by the account), `sitting`, `dream` (D14) and `lesson_done` (D16), each indexing `spaceId`. Migrations: `initial` (Serverpod's, the auth modules', the module's and the sync engine's tables), `sittings` (the three tables), `dreams` (`dream`) and `library` (`lesson_done`). Tests: `test/integration/meditate_server_test.dart` (the module's endpoints through the server's own dispatch, `halkyone_base.<endpoint>`, and the sync engine's connector refusing calls without a session), `test/integration/sitting/person_deletion_test.dart`, the library's in `test/unit/library/` (the manifest, the files over HTTP) and `test/integration/library/` (the endpoint).
refactor!: packages, paths and app IDs under Halkyon Days' names (ADR 0045, step 3) Learn's folder is apps/halkyon, Todo's apps/myrmex; every package of ours takes the prefix halkyone_ (halkyone_halkyon_*, halkyone_myrmex_*, halkyone_train_*, halkyone_meditate_*, halkyone_app, halkyone_base_* and the other shared ones; halkyon_oidc_* keeps its name, D11). Halkyon and Myrmex take the app IDs one.halky.halkyon and one.halky.myrmex (D10); Train and Meditate keep theirs, while every app's Android namespace, Kotlin package and method channels move to one.halky. The snaps are halkyon and myrmex (D17), each built in a clone with its recipe in place of snap/, as Train's and Todo's were. Serverpod finds a database's migrations by its module's name, which changed with the packages': - each server's new, empty migration ("rename") records itself under the new names and deletes the rows under the old ones; - deploy/redeploy.sh copies each database's record to the new name before the migrations (carry_module), so the renamed servers find their databases migrated; a copy, never a move, so a deploy failing before the migration commits leaves the old rows in place; - Train and Meditate keep their devices' databases: halkyone_app's carryMigrationRecord copies their record before the sync engine opens them (openPersonDatabase); - the client migrations' generated moduleName getters, one line each, say the new names: Serverpod's client asserts in debug builds that every migration names the module, and create-migration never writes a migration's files again. Train's WorkManager work is enqueued under new names, the former ones cancelled: the work kept names the workers' former classes. The release tool: an app's tags of its earlier names count as its history (legacyTagPrefixes), the shared packages' former paths count for its version, and every snap is built in a clone (atRoot gone). The databases, Docker images and Compose project keep their names until step 5. BREAKING CHANGE: Halkyon (Learn) and Myrmex (Todo) are new apps to Android and the Snap Store: installs of app.halkyon.learn and app.halkyon.todo don't update to them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-12 23:21:45 +01:00
- **The app** is halkyone_app's `InstanceGate` and `SessionGate` with Meditate's frame (`meditateFrame`) and `ServerpodInstanceChecker(app: 'meditate')`; `MeditateDependencies` per instance, `MeditatePerson` per person (their sync, `SettingsRepository`, `SittingRepository`, `DreamRepository`, `LibraryRepository`, `LessonRepository`, and the device's `BellPlayer`, `GuidePlayer` and `ScreenAwake`); SimpleLogin's way back on `app.halkyon.meditate://` and the loopback port 43826. The person's app (`MeditatePersonApp`) washes in fern (`ScreenColor`, D3) and holds `PracticeCubit` (settings and sittings, read again on every change), `JournalCubit` (the dreams) and `LibraryCubit` (the instance's library, lessons done, recordings kept) for every screen. go_router (`buildMeditateRouter`, `MeditatePaths`): halkyone_ui's `NavigationFrame` (`MeditateShell`) with Today, Explore, Journal and Profile (D2, D14; a bar below medium windows, a rail with the icon from medium on), a practice's page in Explore's branch (`PracticeScreen`) with a library item's and course's (`/explore/library/:id`, `?course=` for a lesson, `/explore/courses/:id`), and over the tabs the sitting (`SittingScreen`, handed its `SittingPlan` as `extra`), a recording playing (`ListeningScreen`, its `ListeningPlan` as `extra`), the library's credits (`/library-credits`), a dream (`DreamScreen`, `/dream` new, `/dream/:id` kept) and Settings. **Today** (`TodayTab`, D9): greeting by the hour, from 4 to 12 o'clock a card to write down last night's dream while it has none (`dreamPromptDue`, D14), Sit now (5, 10, 20 and the timer's own length), the practice of the day (`practiceOfDay`), the week and the days in a row (`WeekCard`), favourites, recently sat. **Explore** (`ExploreTab`, D10): search folded without case or accents (`matchesSearch`), four goal tiles, kind chips, practice cards. **The Journal** (`JournalTab`, D14; `lib/src/feature/journal/`): dreams by month, the newest first (`dreamsByMonth`), searched over title, text and labels and filtered by marks (`findDreams`), *+* to write one; a dream's night is the date of the morning after it (`defaultNight`: today's date at any hour); its screen writes with the text first and focused, the rest folded, and reads a kept one with Edit and Delete; a microphone under the text dictates where the device recognises speech (D15: halkyone_app's `Dictation` on `MeditatePerson.speech`, `DeviceSpeechInput`: on Android the voice input app first where one is installed, D18, opened once a tap and its text put where the cursor stood, else Android's recogniser, on the device where it can, listening again after each pause until stopped or three silent listens; none on Linux, `NoSpeechInput` in tests that don't say), and Today's card offers *Speak it* (`/dream?speak=1`). The platforms declare the microphone as Learn's do (Android's `RECORD_AUDIO`, the recognition service's and `RECOGNIZE_SPEECH`'s queries, `VoiceInput.kt` answering `one.halky/voice_input` from `MainActivity`, iOS's and macOS's usage texts, macOS's `audio-input`), and the privacy page's points are `meditate_base.dart`'s. **Profile** (D2, D8): halkyone_app's `HalkyonProfile` with a *Practice* tab (minutes, sittings, days, the week, the journal's dreams this month and lucid ones once it holds one, every sitting with Delete). **The practices** are `practices` in `lib/src/feature/practice/model/practice.dart` (IDs never change once released), their words in the ARBs by ID (`practiceTexts`), their cues spread evenly over the length (`Practice.cueAt`). **A sitting** (`SittingCubit`, D6): its time from `clock.now()`, the ticks only showing it; the bell at the start (where on), between every interval and at the end; the screen kept on while it runs (where on); kept whole at its end, and ended early kept from a minute on where the person says so. **The figures** (`practiceFigures`, D8) on the device: a sitting's day by the wall clock it was sat by (`Sitting.offsetMinutes`), the streak up to today or yesterday, the week from the language's first day. **Settings** (D11): Sync, the ope
- **The operator's library** (D16; `lib/src/library/` on the server, `lib/src/feature/library/` in the app): a folder named by `MEDITATE_LIBRARY_DIR` with recordings, pictures and `library.yaml` (commented sample: the server's `library.example.yaml`), read by `readLibrary` (every check and refusal, with the reason), held in memory by `MeditateLibrary` and reread every ten minutes (`LibraryReloadFutureCall`, `startLibrary`); checked before deploying with `dart run bin/check_library.dart <folder>` in the server package. `LibraryEndpoint.catalogue` for signed-in people alone, with an access (`LibraryFileAccess`: the hour begun plus 12 hours, signed with a key made at start); the web server's `/library/<served name>?access=…` serves the files by ranges (`serveLibraryFile`), never by a path. In the app: Explore's section (none without a library), the item's page (recordings, Play, favourite as `library/<id>` in the settings, keep on the device, a sound under a silent sitting, its credit), the course's (lessons ticked), the player (a finished item is a sitting `library/<id>` and its lesson done), Settings' *Library credits*; the last catalogue in the person's folder (`library.json`), recordings kept in `library/` beside it. Tests: `test/feature/library/library_test.dart` and the app test's group, on `test/support/fake_library.dart` (made-up entries only: nothing of 7Mind's, whose structure alone D16 follows).
feat(meditate): the app: Today, Explore, Profile, the sitting and its bells halkyon_meditate_flutter on halkyon_app and halkyon_ui (ADR 0038): the first start, sign-in and account as every Halkyon app's, a bar below medium windows and a rail with the icon from medium on, fern washes, Settings in cards (Sync, the operator's, Sitting, Practice, the account, What's new, About, the version), English and German. - Today: a greeting by the hour, Sit now at 5, 10, 20 minutes and the timer's own length, the practice of the day, the week with the days in a row, favourites, recently sat (D9). - Explore: six practices of Halkyon's own, written for the app, found by a search without case or accents, by goal and by kind; each page with how it goes, its lengths, its heart and Start (D4, D10). - The sitting, over the tabs: its time from the clock, a ring counting down, the cue of the moment, Pause and End, the bells at the start, between and at the end, the screen kept on; ended early, kept from a minute on where the person says so (D5, D6). - Profile: every Halkyon app's, then the person's practice: minutes, sittings, days, the week and every sitting kept, to delete (D8). - Settings and sittings sealed with the person's key and synced (D7). The bells are synthesised by apps/meditate/tool/bells.py, the icon is Lucide's sprout from cobalt through pacific into fern (tool/app_icons.py). Releases and the deploy are a later step. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-03 09:25:30 +01:00
- **The bells** (D5) are `assets/bells/*.wav`, synthesised by `apps/meditate/tool/bells.py` (Python's standard library, run from `apps/meditate`; the same bytes every run) and played with `audioplayers` (`AudioplayersBellPlayer`). Only while the app runs: bells with the screen off are for later.
- **The icon** is Lucide's `sprout` from cobalt through pacific into fern (ADR 0031, D5, D7), drawn by the repository's `tool/app_icons.py` (`python3 -I tool/app_icons.py meditate` from the root): `assets/icon/halkyon_meditate_icon.png`, Lucide's licence beside it, every platform's launcher icon. Its launch screen shows Halkyon's kingfisher in its colours instead (ADR 0031, D11: `assets/icon/halkyon_meditate_kingfisher.png`, `meditateKingfisher`), drawn by the same tool.
refactor!: packages, paths and app IDs under Halkyon Days' names (ADR 0045, step 3) Learn's folder is apps/halkyon, Todo's apps/myrmex; every package of ours takes the prefix halkyone_ (halkyone_halkyon_*, halkyone_myrmex_*, halkyone_train_*, halkyone_meditate_*, halkyone_app, halkyone_base_* and the other shared ones; halkyon_oidc_* keeps its name, D11). Halkyon and Myrmex take the app IDs one.halky.halkyon and one.halky.myrmex (D10); Train and Meditate keep theirs, while every app's Android namespace, Kotlin package and method channels move to one.halky. The snaps are halkyon and myrmex (D17), each built in a clone with its recipe in place of snap/, as Train's and Todo's were. Serverpod finds a database's migrations by its module's name, which changed with the packages': - each server's new, empty migration ("rename") records itself under the new names and deletes the rows under the old ones; - deploy/redeploy.sh copies each database's record to the new name before the migrations (carry_module), so the renamed servers find their databases migrated; a copy, never a move, so a deploy failing before the migration commits leaves the old rows in place; - Train and Meditate keep their devices' databases: halkyone_app's carryMigrationRecord copies their record before the sync engine opens them (openPersonDatabase); - the client migrations' generated moduleName getters, one line each, say the new names: Serverpod's client asserts in debug builds that every migration names the module, and create-migration never writes a migration's files again. Train's WorkManager work is enqueued under new names, the former ones cancelled: the work kept names the workers' former classes. The release tool: an app's tags of its earlier names count as its history (legacyTagPrefixes), the shared packages' former paths count for its version, and every snap is built in a clone (atRoot gone). The databases, Docker images and Compose project keep their names until step 5. BREAKING CHANGE: Halkyon (Learn) and Myrmex (Todo) are new apps to Android and the Snap Store: installs of app.halkyon.learn and app.halkyon.todo don't update to them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-12 23:21:45 +01:00
- **`serverpod start`** runs in `apps/meditate/halkyone_meditate_server` on ports of its own (8280 to 8282, PostgreSQL 8290), so it can run beside Learn's (8080…) and Train's (8180…); its tests need throwaway passwords in its git-ignored `config/passwords.yaml` (`database`, `serviceSecret`, `serverSideSessionKeyHashPepper`, `emailSignInPepper`) or from the environment, as CI gives them.
feat(halkyon,myrmex,train,meditate)!: a register for each app, at halkyon.li and myrmex.li (ADR 0045, step 5) halkyon.li's deploy under Halkyon Days' names (D13, D23): the compose files compose.halkyon.yaml, compose.myrmex.yaml and compose.myrmex-search.yaml, the service myrmex-server, the images halkyon-halkyon-server, halkyon-halkyon-dictionaries and halkyon-myrmex-server, the databases halkyon_halkyon and halkyon_myrmex and the superuser halkyon_halkyon, and every variable under its service's name (LEARN_ is HALKYON_, TODO_ MYRMEX_). The Compose project and its network keep halkyon-learn, as the volumes are named after it. Every server is a register of its own (D7, D9, D20): no ACCOUNT_REGISTER_URL, INSTANCE_SECRET or INSTANCE_MEMBER_ any more; each reads its sign-in settings as <APP>_SIGN_UP, <APP>_SIMPLELOGIN_…, and so on (the mail server alone is shared), signs in with a SimpleLogin app of its own, and serves its register's pages itself: Myrmex's, Train's and Meditate's servers add the SimpleLogin callback, the privacy page and the profile pages, and their Caddy sites forward them. Halkyon answers at halkyon.li and Myrmex at myrmex.li (D22): learn.halkyon.li and todo.halkyon.li leave ramiel's HAProxy and Caddy; Halkyon's and Myrmex's builds, snaps and F-Droid listings connect to the new addresses, and Halkyon's App Links name halkyon.li. The switch is a script run once by hand (D24), as the deployed redeploy.sh can't carry the migration records nor rename an open database: deploy/host/switch-0045.sh rewrites .env (env-0045.sh: every secret kept, a decoy key made for each new register), dumps every database, renames them and the superuser through a temporary superuser in one transaction, fast-forwards, carries the migration records to the modules' new names, migrates, copies the developer's account (its keys and its operator's scope, D21) into the other registers, and starts everything. deploy/host/link-simplelogin.sh then links each register's new SimpleLogin identity to that account, found by the four words of its wait screen. Their SQL was run against PostgreSQL 16 on the databases the migrations define. redeploy.sh no longer carries records. BREAKING CHANGE: learn.halkyon.li and todo.halkyon.li no longer answer; the apps connect to halkyon.li and myrmex.li, and each app's accounts are its own. Whats-New: Each app now keeps its own accounts; Halkyon is at halkyon.li and Myrmex at myrmex.li. Whats-New-De: Jede App führt jetzt ihre eigenen Konten; Halkyon ist unter halkyon.li erreichbar und Myrmex unter myrmex.li. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-13 02:04:48 +01:00
- **The deploy** (ADR 0038, step 7; ADR 0039, D14, 8 Nov 2026): the server's `Dockerfile` (as Todo's, with `bin/check_library` compiled beside the server) and `config/production.yaml` (its database `halkyon_meditate` as its own role; the public host from `.env`, `MEDITATE_DOMAIN`), `deploy/compose.meditate.yaml` (a register of its own) with `sidecars/meditate.caddy` (`/library/*` to the web server, the rest to the API server), the library in `deploy/compose.meditate-library.yaml` (`MEDITATE_LIBRARY`, read-only), `redeploy.sh` and `backup.sh` taking it in; `test/deploy/meditate_deploy_test.dart`; the steps in `deploy/sidecars/README.md`, *Meditate*. Not deployed yet: halkyon.li is its first instance.
- **Not yet**: releases (`apps/meditate/release.dart`, its key, F-Droid listing, snap), and what ADR 0038 lists under *Later*.