build(todo): Todo deployable beside Learn's server, and released as an APK, on F-Droid and as a snap (ADR 0033, step 5)
deploy/compose.todo.yaml adds Todo's server at todo.halkyon.eu, a member
of Learn's register, its database halkyon_todo in the instance's
PostgreSQL, its image built as Train's. redeploy.sh and backup.sh go over
every app server .env switches on (train, todo). Each compose file names
its server to the register in a variable of its own
(INSTANCE_MEMBER_TRAIN, INSTANCE_MEMBER_TODO), which halkyon_base adds to
INSTANCE_MEMBERS, each address once, as a second compose file's default
would have replaced Train's.
apps/todo/release.dart configures the release tool for Todo's APK and
snap: a key of its own (pinned once made; until then nothing is
released), the F-Droid listing (Time, NonFreeNet), and the snap from
apps/todo/snap/, which the tool builds in a clone of the repository at the
tag with that folder in place of snap/, as snapcraft builds one recipe a
folder and the root's is Learn's. What's new for 0.1.0 in English and
German, now shown. Android's backup and transfer are off, as Train's
(D53): the reminders scheduled keep their tasks' titles unsealed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-02 15:35:40 +01:00
|
|
|
# Halkyon Todo's Linux app as a Snap (ADR 0033, step 5), built in LXD by the release
|
|
|
|
|
# tool (`dart run tool/release.dart todo`): snapcraft builds one recipe a folder, from
|
|
|
|
|
# its snap/snapcraft.yaml, and the root's snap/ is Learn's, so the tool builds this one
|
|
|
|
|
# in a clone of the repository at the release's tag with this folder in place of the
|
|
|
|
|
# clone's snap/ (`SnapRelease.projectPath`), but for snap/local/, which the recipes
|
|
|
|
|
# share. By hand, the same: in such a clone, `snapcraft pack`.
|
|
|
|
|
#
|
|
|
|
|
# It builds what is committed (the source is the clone's HEAD, the tag), never a
|
|
|
|
|
# working tree with its build caches, and always for todo.halkyon.eu. Flutter is
|
|
|
|
|
# pinned like the local and CI one (FLUTTER_VERSION in .forgejo/workflows/ci.yaml),
|
|
|
|
|
# spelled out as in Learn's recipe, which says why.
|
|
|
|
|
name: halkyon-todo
|
|
|
|
|
title: Halkyon Todo
|
|
|
|
|
base: core24
|
|
|
|
|
adopt-info: halkyon-todo # the version, from the app's pubspec.yaml
|
|
|
|
|
summary: Tasks and projects, sealed and synced between your devices
|
|
|
|
|
description: |
|
|
|
|
|
Halkyon Todo keeps your tasks: an Inbox for what comes up, projects with
|
|
|
|
|
sections, sub-tasks and labels, Today with what is overdue, and Upcoming as
|
|
|
|
|
an agenda that opens into the month. Tasks repeat (every day, every other
|
|
|
|
|
Tuesday, the first Monday of each month), have reminders, deadlines and
|
|
|
|
|
priorities, and are typed the quick way: "Call Anna tomorrow 9am #Home p1".
|
|
|
|
|
|
|
|
|
|
Each project shows as a list, a board or a calendar, grouped, sorted and
|
|
|
|
|
filtered as you set it, the same on every device. Tasks are dragged between
|
|
|
|
|
sections, days and hours.
|
|
|
|
|
|
|
|
|
|
Everything is sealed on your device with your account's keys before it
|
|
|
|
|
reaches the instance, which can't read it. You sign in with SimpleLogin, by
|
|
|
|
|
Proton, or with an email address, a password and an authenticator app. It
|
|
|
|
|
connects to todo.halkyon.eu, the project's instance, or to any other:
|
|
|
|
|
everything an instance needs is in the repository, to run your own. The app
|
|
|
|
|
is AGPL-3.0 and the server SSPL-1.0, so all of its code is public.
|
|
|
|
|
|
|
|
|
|
Questions and reports: support@halkyon.app
|
|
|
|
|
license: AGPL-3.0-or-later
|
build: the organisation on code.halkyon.app is halkyon-days
ADR 0045, D12, step 1: project-halkyon was renamed halkyon-days, its
repositories keeping their names. Every URL naming it moves along: the
servers' source-code links, which the AGPL requires, and their tests;
the forks in the pubspecs and the lock (appflowy-editor, pure-zstd,
serverpod-offline-sync); the snaps, the F-Droid listings and the
release configurations; the docs. The curator's credit for the
alphabets names the repository by its name since ADR 0015, halkyon,
rather than halkyon_learn. Forgejo redirects the old addresses until
the name is taken again.
ADRs 0015 and 0039 keep the name they were written with, and the local
folders theirs.
halkyon_editor's gen-l10n caches under build/, committed before its
.gitignore named the folder, are no longer tracked.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-12 16:24:31 +01:00
|
|
|
source-code: https://code.halkyon.app/halkyon-days/halkyon
|
build(todo): Todo deployable beside Learn's server, and released as an APK, on F-Droid and as a snap (ADR 0033, step 5)
deploy/compose.todo.yaml adds Todo's server at todo.halkyon.eu, a member
of Learn's register, its database halkyon_todo in the instance's
PostgreSQL, its image built as Train's. redeploy.sh and backup.sh go over
every app server .env switches on (train, todo). Each compose file names
its server to the register in a variable of its own
(INSTANCE_MEMBER_TRAIN, INSTANCE_MEMBER_TODO), which halkyon_base adds to
INSTANCE_MEMBERS, each address once, as a second compose file's default
would have replaced Train's.
apps/todo/release.dart configures the release tool for Todo's APK and
snap: a key of its own (pinned once made; until then nothing is
released), the F-Droid listing (Time, NonFreeNet), and the snap from
apps/todo/snap/, which the tool builds in a clone of the repository at the
tag with that folder in place of snap/, as snapcraft builds one recipe a
folder and the root's is Learn's. What's new for 0.1.0 in English and
German, now shown. Android's backup and transfer are off, as Train's
(D53): the reminders scheduled keep their tasks' titles unsealed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-02 15:35:40 +01:00
|
|
|
# The project's, not an instance's: the app works with any instance.
|
|
|
|
|
website: https://halkyon.app/todo
|
|
|
|
|
# No contact or issues, as Learn's (its recipe says why): the address is in the
|
|
|
|
|
# description.
|
|
|
|
|
# The app's icon with rounded corners, made by the repository's tool/app_icons.py; also
|
|
|
|
|
# the desktop file's.
|
|
|
|
|
icon: snap/gui/halkyon-todo.png
|
|
|
|
|
grade: stable
|
|
|
|
|
confinement: strict
|
|
|
|
|
platforms:
|
|
|
|
|
amd64:
|
|
|
|
|
|
|
|
|
|
apps:
|
|
|
|
|
halkyon-todo:
|
|
|
|
|
command: bin/halkyon_todo_flutter
|
|
|
|
|
# How the session is kept: see snap/local/secret-backend (Learn's, kept in the
|
|
|
|
|
# clone).
|
|
|
|
|
command-chain: [bin/secret-backend]
|
feat(todo): a task done ticks on phones and chimes on desktops
The developer's request of 10 Nov 2026: completing a task should feel like
something. `CompletionFeedback`, held by `TodoDevice` and handed to each
person's `TodoPerson`, gives a light haptic tick on Android and iOS and, on
desktops, a short quiet chime of our own: two soft bell tones a fifth apart,
synthesized by `apps/todo/tool/completion_sound.dart` into
`assets/sounds/task_done.wav`, so it needs no one's licence. A task's check
and the selection's Complete call it once, however many tasks are done;
an undo is silent.
Settings' Tasks turns the chime off on a desktop, kept per device in
`<app support>/completion_feedback.json`; a phone is offered no switch. A
device that can't play loses only the sound. The player is `audioplayers`,
as Learn's sounds: on Linux it links GStreamer, so Todo's snap gains the
`audio-playback` plug and GStreamer's headers to build, as Learn's recipe has.
Whats-New: Completing a task now gives a light tap on phones and a short chime on computers, which Settings › Tasks turns off.
Whats-New-De: Eine erledigte Aufgabe gibt jetzt auf dem Handy ein leichtes Tippen und am Computer einen kurzen Klang, den du unter Einstellungen › Aufgaben ausschaltest.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-10 23:04:59 +01:00
|
|
|
# GTK, WebKitGTK (the sign-in's page), GStreamer (the chime of a task done) and
|
|
|
|
|
# libsecret come from the GNOME runtime, the reminders' notifications through the
|
|
|
|
|
# desktop's own; files and the browser go through the desktop's portals.
|
build(todo): Todo deployable beside Learn's server, and released as an APK, on F-Droid and as a snap (ADR 0033, step 5)
deploy/compose.todo.yaml adds Todo's server at todo.halkyon.eu, a member
of Learn's register, its database halkyon_todo in the instance's
PostgreSQL, its image built as Train's. redeploy.sh and backup.sh go over
every app server .env switches on (train, todo). Each compose file names
its server to the register in a variable of its own
(INSTANCE_MEMBER_TRAIN, INSTANCE_MEMBER_TODO), which halkyon_base adds to
INSTANCE_MEMBERS, each address once, as a second compose file's default
would have replaced Train's.
apps/todo/release.dart configures the release tool for Todo's APK and
snap: a key of its own (pinned once made; until then nothing is
released), the F-Droid listing (Time, NonFreeNet), and the snap from
apps/todo/snap/, which the tool builds in a clone of the repository at the
tag with that folder in place of snap/, as snapcraft builds one recipe a
folder and the root's is Learn's. What's new for 0.1.0 in English and
German, now shown. Android's backup and transfer are off, as Train's
(D53): the reminders scheduled keep their tasks' titles unsealed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-02 15:35:40 +01:00
|
|
|
extensions: [gnome]
|
|
|
|
|
plugs:
|
|
|
|
|
- network
|
|
|
|
|
# SimpleLogin's sign-in comes back on a loopback address the app listens on.
|
|
|
|
|
- network-bind
|
feat(todo): a task done ticks on phones and chimes on desktops
The developer's request of 10 Nov 2026: completing a task should feel like
something. `CompletionFeedback`, held by `TodoDevice` and handed to each
person's `TodoPerson`, gives a light haptic tick on Android and iOS and, on
desktops, a short quiet chime of our own: two soft bell tones a fifth apart,
synthesized by `apps/todo/tool/completion_sound.dart` into
`assets/sounds/task_done.wav`, so it needs no one's licence. A task's check
and the selection's Complete call it once, however many tasks are done;
an undo is silent.
Settings' Tasks turns the chime off on a desktop, kept per device in
`<app support>/completion_feedback.json`; a phone is offered no switch. A
device that can't play loses only the sound. The player is `audioplayers`,
as Learn's sounds: on Linux it links GStreamer, so Todo's snap gains the
`audio-playback` plug and GStreamer's headers to build, as Learn's recipe has.
Whats-New: Completing a task now gives a light tap on phones and a short chime on computers, which Settings › Tasks turns off.
Whats-New-De: Eine erledigte Aufgabe gibt jetzt auf dem Handy ein leichtes Tippen und am Computer einen kurzen Klang, den du unter Einstellungen › Aufgaben ausschaltest.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-10 23:04:59 +01:00
|
|
|
# The chime of a task done (decided 10 Nov 2026).
|
|
|
|
|
- audio-playback
|
build(todo): Todo deployable beside Learn's server, and released as an APK, on F-Droid and as a snap (ADR 0033, step 5)
deploy/compose.todo.yaml adds Todo's server at todo.halkyon.eu, a member
of Learn's register, its database halkyon_todo in the instance's
PostgreSQL, its image built as Train's. redeploy.sh and backup.sh go over
every app server .env switches on (train, todo). Each compose file names
its server to the register in a variable of its own
(INSTANCE_MEMBER_TRAIN, INSTANCE_MEMBER_TODO), which halkyon_base adds to
INSTANCE_MEMBERS, each address once, as a second compose file's default
would have replaced Train's.
apps/todo/release.dart configures the release tool for Todo's APK and
snap: a key of its own (pinned once made; until then nothing is
released), the F-Droid listing (Time, NonFreeNet), and the snap from
apps/todo/snap/, which the tool builds in a clone of the repository at the
tag with that folder in place of snap/, as snapcraft builds one recipe a
folder and the root's is Learn's. What's new for 0.1.0 in English and
German, now shown. Android's backup and transfer are off, as Train's
(D53): the reminders scheduled keep their tasks' titles unsealed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-02 15:35:40 +01:00
|
|
|
# Never connected by itself; whoever connects it by hand gets the keyring.
|
|
|
|
|
- password-manager-service
|
|
|
|
|
# As Learn's: the sync's connection ended at once when the network goes;
|
|
|
|
|
# not connected until the Store grants it.
|
|
|
|
|
- network-manager-observe
|
|
|
|
|
|
|
|
|
|
parts:
|
|
|
|
|
flutter:
|
|
|
|
|
plugin: nil
|
|
|
|
|
source: https://github.com/flutter/flutter.git
|
|
|
|
|
source-tag: '3.47.8'
|
|
|
|
|
source-depth: 1
|
|
|
|
|
build-packages:
|
|
|
|
|
- clang
|
|
|
|
|
- cmake
|
|
|
|
|
- curl
|
|
|
|
|
- git
|
|
|
|
|
- libgtk-3-dev
|
|
|
|
|
- lld
|
|
|
|
|
- llvm-18
|
|
|
|
|
- ninja-build
|
|
|
|
|
- pkg-config
|
|
|
|
|
- unzip
|
|
|
|
|
- xz-utils
|
|
|
|
|
- zip
|
|
|
|
|
override-build: |
|
|
|
|
|
mkdir -p "$CRAFT_PART_INSTALL/usr/libexec" "$CRAFT_PART_INSTALL/usr/bin"
|
|
|
|
|
cp -r "$CRAFT_PART_SRC" "$CRAFT_PART_INSTALL/usr/libexec/flutter"
|
|
|
|
|
ln -s ../libexec/flutter/bin/flutter "$CRAFT_PART_INSTALL/usr/bin/flutter"
|
|
|
|
|
ln -s ../libexec/flutter/bin/dart "$CRAFT_PART_INSTALL/usr/bin/dart"
|
|
|
|
|
"$CRAFT_PART_INSTALL/usr/bin/flutter" --disable-analytics
|
|
|
|
|
"$CRAFT_PART_INSTALL/usr/bin/flutter" precache --linux
|
|
|
|
|
# Needed to build, not in the Snap.
|
|
|
|
|
override-prime: ''
|
|
|
|
|
|
|
|
|
|
halkyon-todo:
|
|
|
|
|
after: [flutter]
|
|
|
|
|
plugin: nil
|
|
|
|
|
source: .
|
|
|
|
|
source-type: git
|
feat(todo): a task done ticks on phones and chimes on desktops
The developer's request of 10 Nov 2026: completing a task should feel like
something. `CompletionFeedback`, held by `TodoDevice` and handed to each
person's `TodoPerson`, gives a light haptic tick on Android and iOS and, on
desktops, a short quiet chime of our own: two soft bell tones a fifth apart,
synthesized by `apps/todo/tool/completion_sound.dart` into
`assets/sounds/task_done.wav`, so it needs no one's licence. A task's check
and the selection's Complete call it once, however many tasks are done;
an undo is silent.
Settings' Tasks turns the chime off on a desktop, kept per device in
`<app support>/completion_feedback.json`; a phone is offered no switch. A
device that can't play loses only the sound. The player is `audioplayers`,
as Learn's sounds: on Linux it links GStreamer, so Todo's snap gains the
`audio-playback` plug and GStreamer's headers to build, as Learn's recipe has.
Whats-New: Completing a task now gives a light tap on phones and a short chime on computers, which Settings › Tasks turns off.
Whats-New-De: Eine erledigte Aufgabe gibt jetzt auf dem Handy ein leichtes Tippen und am Computer einen kurzen Klang, den du unter Einstellungen › Aufgaben ausschaltest.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-10 23:04:59 +01:00
|
|
|
# The chime's player (audioplayers) links GStreamer, which the GNOME SDK
|
|
|
|
|
# lacks; the GNOME runtime brings the same GStreamer to run, as in Learn's
|
|
|
|
|
# recipe. sodium's build hook compiles libsodium with its configure script and
|
|
|
|
|
# make (ADR 0017), with the Flutter part's clang.
|
build(todo): Todo deployable beside Learn's server, and released as an APK, on F-Droid and as a snap (ADR 0033, step 5)
deploy/compose.todo.yaml adds Todo's server at todo.halkyon.eu, a member
of Learn's register, its database halkyon_todo in the instance's
PostgreSQL, its image built as Train's. redeploy.sh and backup.sh go over
every app server .env switches on (train, todo). Each compose file names
its server to the register in a variable of its own
(INSTANCE_MEMBER_TRAIN, INSTANCE_MEMBER_TODO), which halkyon_base adds to
INSTANCE_MEMBERS, each address once, as a second compose file's default
would have replaced Train's.
apps/todo/release.dart configures the release tool for Todo's APK and
snap: a key of its own (pinned once made; until then nothing is
released), the F-Droid listing (Time, NonFreeNet), and the snap from
apps/todo/snap/, which the tool builds in a clone of the repository at the
tag with that folder in place of snap/, as snapcraft builds one recipe a
folder and the root's is Learn's. What's new for 0.1.0 in English and
German, now shown. Android's backup and transfer are off, as Train's
(D53): the reminders scheduled keep their tasks' titles unsealed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-02 15:35:40 +01:00
|
|
|
build-packages:
|
feat(todo): a task done ticks on phones and chimes on desktops
The developer's request of 10 Nov 2026: completing a task should feel like
something. `CompletionFeedback`, held by `TodoDevice` and handed to each
person's `TodoPerson`, gives a light haptic tick on Android and iOS and, on
desktops, a short quiet chime of our own: two soft bell tones a fifth apart,
synthesized by `apps/todo/tool/completion_sound.dart` into
`assets/sounds/task_done.wav`, so it needs no one's licence. A task's check
and the selection's Complete call it once, however many tasks are done;
an undo is silent.
Settings' Tasks turns the chime off on a desktop, kept per device in
`<app support>/completion_feedback.json`; a phone is offered no switch. A
device that can't play loses only the sound. The player is `audioplayers`,
as Learn's sounds: on Linux it links GStreamer, so Todo's snap gains the
`audio-playback` plug and GStreamer's headers to build, as Learn's recipe has.
Whats-New: Completing a task now gives a light tap on phones and a short chime on computers, which Settings › Tasks turns off.
Whats-New-De: Eine erledigte Aufgabe gibt jetzt auf dem Handy ein leichtes Tippen und am Computer einen kurzen Klang, den du unter Einstellungen › Aufgaben ausschaltest.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-10 23:04:59 +01:00
|
|
|
- libgstreamer1.0-dev
|
|
|
|
|
- libgstreamer-plugins-base1.0-dev
|
build(todo): Todo deployable beside Learn's server, and released as an APK, on F-Droid and as a snap (ADR 0033, step 5)
deploy/compose.todo.yaml adds Todo's server at todo.halkyon.eu, a member
of Learn's register, its database halkyon_todo in the instance's
PostgreSQL, its image built as Train's. redeploy.sh and backup.sh go over
every app server .env switches on (train, todo). Each compose file names
its server to the register in a variable of its own
(INSTANCE_MEMBER_TRAIN, INSTANCE_MEMBER_TODO), which halkyon_base adds to
INSTANCE_MEMBERS, each address once, as a second compose file's default
would have replaced Train's.
apps/todo/release.dart configures the release tool for Todo's APK and
snap: a key of its own (pinned once made; until then nothing is
released), the F-Droid listing (Time, NonFreeNet), and the snap from
apps/todo/snap/, which the tool builds in a clone of the repository at the
tag with that folder in place of snap/, as snapcraft builds one recipe a
folder and the root's is Learn's. What's new for 0.1.0 in English and
German, now shown. Android's backup and transfer are off, as Train's
(D53): the reminders scheduled keep their tasks' titles unsealed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-02 15:35:40 +01:00
|
|
|
- make
|
|
|
|
|
override-build: |
|
|
|
|
|
set -eu
|
|
|
|
|
export PATH="$CRAFT_STAGE/usr/bin:$PATH"
|
|
|
|
|
cd apps/todo/halkyon_todo_flutter
|
|
|
|
|
craftctl set version="$(sed -n 's/^version: *\([^+]*\).*/\1/p' pubspec.yaml)"
|
|
|
|
|
flutter pub get --enforce-lockfile
|
|
|
|
|
flutter build linux --release \
|
|
|
|
|
--dart-define=SERVER_URL=https://todo.halkyon.eu/
|
|
|
|
|
mkdir -p "$CRAFT_PART_INSTALL/bin"
|
|
|
|
|
cp -r build/linux/x64/release/bundle/. "$CRAFT_PART_INSTALL/bin/"
|
|
|
|
|
|
|
|
|
|
secret-backend:
|
|
|
|
|
plugin: dump
|
|
|
|
|
source: snap/local
|
|
|
|
|
organize:
|
|
|
|
|
secret-backend: bin/secret-backend
|
|
|
|
|
|
|
|
|
|
# As Learn's: every file the GNOME runtime or the base has at the same path
|
|
|
|
|
# goes, so that nothing staged hides the runtime's own (Learn's recipe says
|
|
|
|
|
# what that broke there). Todo stages no package today; the part keeps a
|
|
|
|
|
# later one from doing so unnoticed.
|
|
|
|
|
cleanup:
|
|
|
|
|
after: [halkyon-todo, secret-backend]
|
|
|
|
|
plugin: nil
|
|
|
|
|
build-snaps: [core24, gnome-46-2404]
|
|
|
|
|
override-prime: |
|
|
|
|
|
set -eu
|
|
|
|
|
for snap in core24 gnome-46-2404; do
|
|
|
|
|
cd "/snap/$snap/current/usr"
|
|
|
|
|
find . \( -type f -o -type l \) -print0 |
|
|
|
|
|
while IFS= read -r -d '' path; do
|
|
|
|
|
case "$path" in */blas/* | */lapack/*) continue ;; esac
|
|
|
|
|
target="$CRAFT_PRIME/usr/$path"
|
|
|
|
|
if [ -L "$target" ] || [ -f "$target" ]; then
|
|
|
|
|
rm -f "$target"
|
|
|
|
|
fi
|
|
|
|
|
done
|
|
|
|
|
done
|