- Dart 78.6%
- PLpgSQL 19.3%
- Kotlin 1.1%
- C++ 0.4%
- CMake 0.2%
- Other 0.2%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
Share opens one sheet (Halkyon's ADR 0044, D29): the people first, then the community. A studyset of the person's own offers Share with people, which says what it does, moves it into a space of its own with its progress told and Abort, and opens it there (StudysetSharingCubit). A shared one lists its members (SpaceMembersCubit): the Owner invites by handle as Editor or Viewer, changes roles, hands on and removes, and deletes it for everyone; anyone leaves, the Owner naming who takes it on; each refusal is said. A member's row opens their safety code (twelve groups of five digits) to mark compared, and changed keys are flagged, trusted only after comparing (D32). The community row leads to the privacy dialog or publishing as Share did, and is off for a shared studyset (D27). A studyset knows its space and whether the person only views it (Studyset.sharedIn, viewOnly, from the sync engine's grants). Its mark is Lucide's users icon, "Shared · private" (D31). A Viewer's studyset screen, its options, its topics and the move sheet offer nothing that writes, and say they can view and study it (D30); the engine refuses their writes on the device in any case. A shared top isn't moved, archived or deleted from its options, and nothing moves in or out of its space. Whats-New: Share a studyset with people: invite them by their handle as editors or viewers, and compare safety codes to know nobody stands between you. Whats-New-De: Teile ein Lernset mit Personen: Lade sie über ihr Handle als Bearbeiter:innen oder Betrachter:innen ein und vergleicht Sicherheitscodes, damit niemand zwischen euch steht. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me> |
||
| .forgejo/workflows | ||
| .vscode | ||
| apps | ||
| deploy | ||
| docs/adr | ||
| packages | ||
| snap | ||
| test | ||
| third_party | ||
| tool | ||
| .dockerignore | ||
| .gitignore | ||
| AGENTS.md | ||
| analysis_options.yaml | ||
| CLAUDE.md | ||
| CONTRIBUTING.md | ||
| LICENSE.md | ||
| pubspec.lock | ||
| pubspec.yaml | ||
| README.md | ||
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 clienthalkyon_base_client: signing in, the account and its deletion, the pruning, the instance's basics),halkyon_editor(rich text: the editor, its view and the document they keep),halkyon_core(low-level primitives) andhalkyon_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_VERSIONin.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-analyticsto every call; otherwise it reports the commands run to Serverpod. - A C++ compiler, for
flutter testtoo: 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.