halkyon/apps/todo/AGENTS.md
Tizian 「ティツィアーン」 707accba28
docs(todo): what Todo is now, and its licences
Todo's packages are licensed as Learn's (decided 2026-10-19): the server
under the SSPL, the client and the app under the AGPL. Its AGENTS.md
and READMEs describe the shell it is now; the root's README, lint note
and licence table follow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-22 18:11:06 +02:00

3.7 KiB

Halkyon Todo

What holds for every app and package of this repository is in the root AGENTS.md; it applies here in full, and Learn's patterns (apps/learn/AGENTS.md) wherever Todo needs the same thing.

  • A shell on the shared packages (decided 2026-10-19): signing in, the instances, the account and the look work; nothing of a person's is kept or synced yet, which waits for Todo's first model (the developer decides what it keeps and syncs). Packages: halkyon_todo_server, halkyon_todo_client (generated, never edited), halkyon_todo_flutter; app ID app.halkyon.todo on every platform; no web build. Licences as Learn's (server SSPL, client and app AGPL; LICENSE.md).
  • The server includes halkyon_base (ADR 0014) and configures it in server.dart (todoBase(), lib/src/todo_base.dart): its basics say it serves todo (never change it once apps use it), sign-in mails name Halkyon Todo, the source is this repository, minimumAppBuild 1, no data of its own to delete with a person yet (add a deletePersonData hook with Todo's first table). Authentication through the module's builders: anonymous, GitHub (with the instance's own OAuth app) and email codes, server-side sessions. schedulePruning (lib/src/pruning.dart) keeps the module's pruning scheduled, one entry each however often the server starts. Session logs are never persisted, in any run mode. One migration so far, the initial one (2026-10-19): Serverpod's tables, its auth modules' and the module's (email_identity, email_code_request), nothing of Todo's own. Tests (test/integration/todo_server_test.dart) call the module's endpoints through the server's own dispatch (halkyon_base.<endpoint>), since the generated test tools expose the project's endpoints alone.
  • The app is halkyon_app's InstanceGate and SessionGate with Todo's frame (todoFrame: "Todo" under "Halkyon", its icon, todo.example.org, its own three sentences) and ServerpodInstanceChecker(app: 'todo'); TodoDependencies (AppDependencies<TodoPerson>) on one instance, TodoPerson (empty) per person; a person's app with an empty home and the account sheet (whose account on which instance, Switch account, Sign out, which asks first for an anonymous account as it deletes it, Delete account, which asks first, and About with the source of what the instance runs and the licence list). Texts through gen-l10n in British English (the template), German (informal du), an empty en_US and en_GB (test/l10n/arb_files_test.dart keeps them in step). The look follows the system's theme mode and language until Todo has settings. Countries in where an instance keeps its data show by their codes until halkyon_app names countries itself. Widget tests start Todo's whole tree with halkyon_app's fakes (test/app/todo_app_test.dart).
  • The icon is Lucide's list-checks (lucide-static 1.50.0) in the brand's blues on white: apps/todo/tool/app_icons.py (run from apps/todo) fetches it, draws its strokes with Pillow (no SVG renderer needed; other path commands fail loudly), writes assets/icon/halkyon_todo_icon.png and Lucide's ISC licence beside it, then every platform's launcher icon through flutter_launcher_icons as Learn's tool does. registerLucideLicense puts the notice in the licence list.
  • serverpod start runs in apps/todo/halkyon_todo_server (it launches the app from lib/driver.dart); .mcp.json's --server-dir names it when a session works on Todo. Its tests need throwaway passwords in its git-ignored config/passwords.yaml (database, serviceSecret, serverSideSessionKeyHashPepper, emailSignInPepper) or from the environment, as CI gives them. Learn's and Todo's development servers use the same ports: run one at a time.