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 「ティツィアーン」 3ca4b4308d
feat(todo,app): files attached to tasks and comments
Halkyon's ADR 0043, D1, D3, D5 and D8: any file up to 100 MB, attached to
a task's description or to a comment, sealed as everything of Todo's.

Server: the attachment table, synced and sealed as the others, with the
sealed file's hash readable for the store; todoFiles hands halkyon_base
its rows, readable by their space's members, and takes sealed files
alone; the files no attachment names go daily. Its tests hold downloads
to the row's space, refuse a readable file and prune what no live row
names. Migration attachments: CREATE TABLE "attachment" with its indexes
and the foreign key to its space, cascading as every synced table's.

App: AttachmentRepository seals each file for its row, keeps it sealed
and opened in the person's folder, uploads it after each sync and fetches
it as it shows, both held back by Without files on mobile data but for a
file tapped. Under the description and a comment's text, a row of them:
pictures as thumbnails opening full-size, other files as chips opening in
the system's app, else saved; the paperclip beside the description and in the comment's
composer adds them, the composer holding them until it is sent. A task deleted takes its files
and its comments' along, a comment its own.

halkyon_app opens a file in the system's app (FileOpener): on Android
through its plugin and a FileProvider of its own class, sharing the
cache's halkyon_opened/ folder alone; on the desktop as a file: URI.

Whats-New: Attach files to a task's description or a comment with the paperclip: pictures show as thumbnails, other files open in their app.
Whats-New-De: Hänge mit der Büroklammer Dateien an die Beschreibung einer Aufgabe oder an einen Kommentar: Bilder erscheinen als Vorschau, andere Dateien öffnen sich in ihrer App.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-11 01:19:41 +01:00
.forgejo/workflows build(ci,deploy)!: the runner at home in a nightly window, deploys by hand (ADR 0039, D6, D13, D16) 2026-11-08 19:59:40 +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,app): files attached to tasks and comments 2026-11-11 01:19:41 +01:00
deploy feat(todo): Todo's server answers a place's forecast (ADR 0033, D40) 2026-11-10 15:27:58 +01:00
docs/adr feat(todo,app): files attached to tasks and comments 2026-11-11 01:19:41 +01:00
packages feat(todo,app): files attached to tasks and comments 2026-11-11 01:19:41 +01:00
snap build(learn): the snap's icon on the white tile too (ADR 0031, D10) 2026-11-10 14:22:57 +01:00
test feat(deploy): halkyon.li's first start, its .env made on the host (ADR 0039, D21) 2026-11-08 22:07:22 +01:00
third_party refactor(learn): the editor's general parts move to halkyon_editor (ADR 0033, D37) 2026-11-07 21:49:48 +01:00
tool feat(learn,train,todo,meditate): the icons on a white tile again, coloured by the system's theme on Android and iOS (ADR 0031, D9, D10) 2026-11-10 14:22:49 +01:00
.dockerignore build(editor): halkyon_editor joins the workspace (ADR 0033, D37) 2026-11-07 21:49:47 +01:00
.gitignore feat(deploy): Jellyfin at home, published through WireGuard (ADR 0032) 2026-10-30 23:17:57 +01:00
AGENTS.md feat(todo,app): files attached to tasks and comments 2026-11-11 01:19:41 +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 refactor(learn): the editor's general parts move to halkyon_editor (ADR 0033, D37) 2026-11-07 21:49:48 +01:00
pubspec.lock feat(todo): a calendar's feed read, and linked to a project in its payload (ADR 0033, D39) 2026-11-10 14:23:03 +01:00
pubspec.yaml fix(sync): a new device's first sync of a large library goes through 2026-11-09 15:50:29 +01:00
README.md refactor(learn): the editor's general parts move to halkyon_editor (ADR 0033, D37) 2026-11-07 21:49:48 +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_editor (rich text: the editor, its view and the document they keep), 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.