No description
  • Dart 78.6%
  • PLpgSQL 19.3%
  • Kotlin 1.1%
  • C++ 0.4%
  • CMake 0.2%
  • Other 0.2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Tizian 「ティツィアーン」 aac7d106aa
feat(todo): quick add's last button dictates the title while it is empty (ADR 0033, D29)
As Todoist's bar and Learn's assistant field (ADR 0021, D69): while the
title is empty its last button is the microphone, filled as the send
button is, dictating where the cursor stands and listening again after
each pause through halkyon_app's Dictation; what is said is read as if
typed. It shows a stop button while listening and the send button once
there is text, or alone where nothing recognises speech (Linux). A
phone without a recogniser is told how to get one.

Todo gets the device's speech input in its dependencies, and declares
the microphone and the recognition service on Android, the usage texts
on iOS and macOS and the audio input entitlement on macOS, as Learn
does.

Whats-New: Add task's last button is a microphone while the task has no name yet: say the task, dates included.
Whats-New-De: Der letzte Knopf von „Aufgabe hinzufügen“ ist ein Mikrofon, solange die Aufgabe noch keinen Namen hat: Sprich die Aufgabe, Daten eingeschlossen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-05 08:58:42 +01:00
.forgejo/workflows build(ci): the deploy step is named for the instance, which it deploys whole, not learn.halkyon.eu alone 2026-11-03 00:28:38 +01:00
.vscode build: Melos, a Dart check and every path for the single repository 2026-10-22 18:11:04 +02:00
apps feat(todo): quick add's last button dictates the title while it is empty (ADR 0033, D29) 2026-11-05 08:58:42 +01:00
deploy feat(train): OpenFreeMap's dark style in a dark theme, and MAP_DARK_STYLE_URL for a provider's 2026-11-05 08:58:33 +01:00
docs/adr feat(todo): quick add's last button dictates the title while it is empty (ADR 0033, D29) 2026-11-05 08:58:42 +01:00
packages feat(app,learn): the device's appearance and language, halkyon_app's, as Learn's Settings show them 2026-11-05 08:58:40 +01:00
snap feat(icons): every icon fades from cobalt into its app's backdrop; Learn shows its own inside the app; Train's dumbbell (ADR 0031, D5 to D7) 2026-11-02 23:12:20 +01:00
test feat(learn): voice mode goes, as a spoken conversation isn't wanted (ADR 0021, D68 withdrawn) 2026-11-05 08:58:36 +01:00
third_party feat(learn): voice mode goes, as a spoken conversation isn't wanted (ADR 0021, D68 withdrawn) 2026-11-05 08:58:36 +01:00
tool build(todo): listed in F-Droid as Task and Calendar & Agenda 2026-11-05 08:58:35 +01:00
.dockerignore build(todo): Todo deployable beside Learn's server, and released as an APK, on F-Droid and as a snap (ADR 0033, step 5) 2026-11-02 16:04:00 +01:00
.gitignore feat(deploy): Jellyfin at home, published through WireGuard (ADR 0032) 2026-10-30 23:17:57 +01:00
AGENTS.md feat(app,learn): the device's appearance and language, halkyon_app's, as Learn's Settings show them 2026-11-05 08:58:40 +01:00
analysis_options.yaml build: Android's built-in Kotlin, the three plugins applying KGP themselves patched in third_party/ 2026-11-04 09:32:13 +01:00
CLAUDE.md chore: scaffold the Serverpod 4 build 2026-09-24 15:32:29 +02:00
CONTRIBUTING.md docs: one repository for every app and shared package (ADR 0015) 2026-10-22 18:11:04 +02:00
LICENSE.md feat(train): setting up and keeping the Polar Loop (ADR 0030, D34–D36) 2026-10-30 15:52:55 +01:00
pubspec.lock feat(learn): voice mode goes, as a spoken conversation isn't wanted (ADR 0021, D68 withdrawn) 2026-11-05 08:58:36 +01:00
pubspec.yaml feat(learn): voice mode goes, as a spoken conversation isn't wanted (ADR 0021, D68 withdrawn) 2026-11-05 08:58:36 +01:00
README.md build: CI and the snap build with Flutter v3.47.8, as the laptop does 2026-10-30 17:43:24 +01:00

Halkyon

Halkyon's apps and the packages they share, in one repository. Each app is a Flutter app for Linux, Windows, macOS, Android and iOS with a Serverpod server of its own, offline-first, and anyone may run an instance of it: the apps, the servers and everything needed to host an instance are published.

App What it is Where
Halkyon Learn Creating, sharing and studying study material, flashcards scheduled with FSRS apps/learn/, at learn.halkyon.eu
Halkyon Todo To-dos; for now a shell on the shared packages: sign-in, instances, the account apps/todo/
Halkyon Train Running, cycling and rowing (ADR 0030); for now a shell on the shared packages apps/train/

Halkyon Meditate is to follow.

Layout

  • apps/<app>/: each app's server, generated client and Flutter app.
  • packages/: what the apps share, taken by path: halkyon_ui (the look: theme, bundled Noto Sans, layout, shared widgets), halkyon_app (instances, signing in, each person's data and its sync), halkyon_base (what every server has, as a Serverpod module with its generated client halkyon_base_client: signing in, the account and its deletion, the pruning, the instance's basics), halkyon_core (low-level primitives) and halkyon_interop (contracts between apps).
  • deploy/: what runs an instance (Docker Compose: Caddy, the server, PostgreSQL), learn.halkyon.eu's today.
  • tool/: the checks, the pre-push hook and the release scripts. docs/adr/: the decisions and their reasons.

One pub workspace holds every package: one pubspec.lock, one version of each dependency. Melos runs scripts across them.

Getting started

  • Flutter v3.47.8, the version CI uses (FLUTTER_VERSION in .forgejo/workflows/ci.yaml), with each platform you build for set up by Flutter's own guides; what an app needs beyond that is in its README.
  • The Serverpod CLI v4.0.4: dart install serverpod_cli@4.0.4. Pass --no-analytics to every call; otherwise it reports the commands run to Serverpod.
  • A C++ compiler, for flutter test too: a dependency of Learn's compiles MeCab as it builds.
flutter pub get                               # every package of the workspace
dart run melos list                           # the packages
ln -s ../../tool/pre-push .git/hooks/pre-push # the checks before every push
dart run tool/check.dart                      # format, analysis, every package's tests

dart run tool/check.dart --changed-since=origin/main tests only what changed since main and what depends on it; dart run melos run test:flutter --scope=<package> one package's Flutter tests. Each server's tests start an embedded PostgreSQL (no Docker) and need test passwords in the server's git-ignored config/passwords.yaml (the module's README and each app's say which). How the code is organised and the rules it follows are in AGENTS.md and each app's own.

Licences

The servers and the server module are under the Server Side Public License 1.0, the apps, the client packages and the other shared packages under the GNU Affero General Public License 3.0 or later. LICENSE.md says which covers what, CONTRIBUTING.md how to contribute.