- **Builds on:** ADR 0015 (one repository), ADR 0016 (one account across an instance),
ADR 0017 (a password and an authenticator), ADR 0020 (SimpleLogin), ADR 0031 (the
apps' icons), ADR 0039 (halkyon.li at home).
- **Amends:** ADR 0039, whose halkyon.li was the family's instance alone (D6); ADR
0016, for Halkyon and Myrmex (D7); ADR 0020, whose SimpleLogin goes out of use (D8);
ADR 0031, D3, D6 and D11, for Halkyon's icon (D14).
## Context
Halkyon began as one learning app, then grew a family under its name: Halkyon Learn,
Todo, Train and Meditate, sharing an account on an instance (ADR 0016). Of them, Learn
is the one the developer means to open to the public, Todo the next; Train, Meditate
and Shop depend on content the operator owns and serves, and stay personal. A family
named after one app runs into Todoist's trouble: its maker was named after its first
product and had to rename itself Doist once there was a second. And the apps' names,
"Halkyon Learn", "Halkyon Todo", describe rather than name.
The developer's names (11 and 12 Nov 2026) follow one myth and one theme. Halcyon, the
kingfisher, is Alcyone (Ἀλκυόνη), who with her husband Ceyx (Κῆυξ) was turned into a
kingfisher (Ovid, *Metamorphoses* XI); every winter Aeolus, her father, calms the winds
for the days she nests on the sea, the *halcyon days*. Myrmex (μύρμηξ, "ant") was a
girl of Attica whom Athena turned into an ant (Servius on the *Aeneid*, 4.402); the
ants of Aegina became the Myrmidons (Ovid, *Metamorphoses* VII). Mortals turned into
animals, and the calm the halcyon days bring, are the family's thread: software that
gives people calm from prying, surveillance-capitalist eyes.
## Decisions
- **D1 The project is Halkyon Days** (the developer's): the umbrella, not an app; with a
K, as the apps and halkyon.app have it ("Halcyon Days" is a British enamel-box brand
and an album). It names what the apps give, and keeps apart from any one of them, so
it never has to change as Todoist's maker had to. People see it on the project's
site, in the apps' About ("part of Halkyon Days") and at the foot of the instances'
pages.
- **D2 Halkyon is the learning app** (the developer's), "Halkyon Learn" until now: the
kingfisher, the project's first app and the one that gave it its name, as Proton
Mail is Proton's. Its icon becomes the kingfisher (D14).
- **D3 Myrmex is the task app** (the developer's), "Halkyon Todo" until now: the ant, an
image of tasks carried together. Said "MUR-mex" in English, "Mürmex" or "Mirmex" in
German. Its icon keeps Lucide's `list-todo` until an ant is drawn for it, as the
kingfisher was commissioned. Before the name is published: a trademark search
(EUIPO, the app stores); none was found by the agent's quick search (11 Nov), but for
an ant-keeping hobby project, *Agora Myrmex*.
- **D4 Keyx is the voice assistant, later** (the developer's): Ceyx, Alcyone's husband,
with a K as Halkyon has one. Nothing of it is built.
- **D5 The domains** (the developer's, 12 Nov 2026):
| Domain | What | Holds people's data |
|---|---|---|
| `halky.one` | the project's site: `/` Halkyon Days, `/halkyon`, `/myrmex`, `/keyx` (later), and the F-Droid repository, `/fdroid/repo` | no |
| `index.halky.one` | the index of published studysets across instances (the hybrid distribution model), a running service of its own, kept apart from the static site | its own records alone |
| `halkyon.li` | the public Halkyon instance | yes |
| `myrmex.li` | the public Myrmex instance (registered by the developer, 12 Nov) | yes |
| `halkyon.app` | redirects to `halky.one`, so old links keep working | no |
*halky.one* reads as *Halkyone*, Alcyone's Greek name; *.li* is Lindau's common
abbreviation, the developer's home on Lake Constance, where kingfishers fish. The
project's domain knows nobody; only an instance holds people's data, which is a
privacy story of its own. The pages are paths, not subdomains: one static site.
`index.halky.one` takes the place of the earlier thought of `halky.one` itself for
the distribution model. Moving the F-Droid repository now costs its one user re-adding
it; later it would cost everyone.
- **D6 halkyon.li is Halkyon's public instance** (the developer's), where ADR 0039 made
it the family's alone; it stays on the host at home behind ramiel (ADR 0039's
network, sandbox and backups hold). Who may sign up there is open (below).
- **D7 Halkyon and Myrmex keep their accounts apart** (the developer's): each server
holds a register of its own (ADR 0016's `AccountsMode.fromEnvironment()` without
`ACCOUNT_REGISTER_URL`), with its own handles, account domain (`halkyon.li`,
`myrmex.li`), operators, secrets and privacy page. Nothing passes between them, so
neither instance learns who uses the other. ADR 0016's register stays for an operator
who wants one account across their services; Halkyon Days' public instances don't.
Agents (ADR 0044) are Halkyon's.
- **D8 People sign up and in with an email address, a password and an authenticator**
(the developer's): ADR 0017's way alone, SimpleLogin out of use (`SIGN_IN_WAYS=
password` on both instances), switched off by configuration first and its code
removed once no account depends on it (the developer's choice, on the agent's
recommendation): ADR 0020's sign-in, the callback page, and the OpenID Connect module
`halkyon_oidc` (server, client, Flutter), written to be published for others and
kept in git's history should it be wanted again. An account signing in with
SimpleLogin alone (the developer's own) sets a password from its Profile first,
through a code mailed to its address (ADR 0017's fourth reading).
- **D9 Train and Meditate stay personal, on registers of their own** (the agent's
recommendation, which the developer chose): today they are members of Learn's register, so on
a public halkyon.li every Halkyon account could sign in to them. Each holds its own,
with `SIGN_UP=closed` once the family's accounts exist; `INSTANCE_SECRET` and
`INSTANCE_MEMBERS` go out of use. Over keeping them members, which would need a
per-service approval the module doesn't have.
- **D10 The app IDs follow halky.one** (the agent's recommendation, which the
developer chose):
`one.halky.halkyon` and `one.halky.myrmex`, Android's and iOS's IDs being domains
reversed. The developer is the apps' only user, so the change costs a reinstall of
each on their devices (their data comes back with the first sync) and new F-Droid
entries; later it would cost everyone. The signing keys stay.
- **D11 In the code, `halkyone_` is the project's prefix, the apps' names below it**
(the developer's, over the agent's recommendation to keep `halkyon_` for the shared
packages and `halkyon_learn_*` for Halkyon's): *Halkyone* as halky.one spells it.
The shared packages become `halkyone_ui`, `halkyone_app`, `halkyone_base_server` and