feat: the Linux app as a Snap
snap/snapcraft.yaml builds the Linux app as a strictly confined Snap on
core24 with the GNOME extension (GTK, WebKitGTK, GStreamer and libsecret
come from its runtime; files and the browser go through the desktop's
portals), connecting to learn.halkyon.eu, the project's instance. It
builds what is committed, with Flutter pinned as in CI.
- The session: libsecret's keyring over D-Bus needs the
password-manager-service plug, which the Store never connects by
itself, so unless it is connected the app keeps the session in an
encrypted file whose key comes from the Secret portal
(snap/local/secret-backend).
- network-manager-observe lets Serverpod hear that the network went and
end the sync's connection at once; until the Store grants it, it too
is connected by hand.
- The listing points to the project, not the instance: the website
learn.halkyon.app, contact and issues support@halkyon.app.
- The icon is the app's with rounded corners (tool/snap_icon.py), for
the Store and the dock alike.
- The app's version is 0.1.0, build 1.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-05 14:27:54 +02:00
|
|
|
# The Linux app as a Snap, built in LXD on a developer's machine, in the repository
|
|
|
|
|
# root:
|
|
|
|
|
#
|
|
|
|
|
# snapcraft pack
|
|
|
|
|
#
|
|
|
|
|
# It builds what is committed (the source is this repository's HEAD), never the
|
|
|
|
|
# working tree with its build caches, and always for learn.halkyon.eu. Flutter is
|
|
|
|
|
# pinned like the local and CI one (FLUTTER_VERSION in .forgejo/workflows/ci.yaml):
|
|
|
|
|
# snapcraft's own Flutter plugin can only take a channel and can't pass
|
|
|
|
|
# --dart-define, so the build is spelled out below.
|
|
|
|
|
name: halkyon-learn
|
|
|
|
|
title: Halkyon Learn
|
|
|
|
|
base: core24
|
|
|
|
|
adopt-info: halkyon-learn # the version, from the app's pubspec.yaml
|
|
|
|
|
summary: Learn with flashcards, studied offline and synced between your devices
|
|
|
|
|
description: |
|
|
|
|
|
Halkyon Learn is a spaced-repetition learning app: studysets of flashcards with
|
|
|
|
|
rich text, notes, learning paths and PDFs, reviewed on an FSRS schedule. It works
|
|
|
|
|
offline and syncs between your devices.
|
|
|
|
|
|
|
|
|
|
It starts with an anonymous account; signing in with GitHub later keeps
|
|
|
|
|
everything. It connects to learn.halkyon.eu, the project's instance.
|
|
|
|
|
license: AGPL-3.0-or-later
|
|
|
|
|
source-code: https://code.halkyon.app/project-halkyon/halkyon_learn
|
|
|
|
|
# The project's, not an instance's: the app works with any instance.
|
2026-10-10 05:48:56 +02:00
|
|
|
website: https://halkyon.app/learn
|
feat: the Linux app as a Snap
snap/snapcraft.yaml builds the Linux app as a strictly confined Snap on
core24 with the GNOME extension (GTK, WebKitGTK, GStreamer and libsecret
come from its runtime; files and the browser go through the desktop's
portals), connecting to learn.halkyon.eu, the project's instance. It
builds what is committed, with Flutter pinned as in CI.
- The session: libsecret's keyring over D-Bus needs the
password-manager-service plug, which the Store never connects by
itself, so unless it is connected the app keeps the session in an
encrypted file whose key comes from the Secret portal
(snap/local/secret-backend).
- network-manager-observe lets Serverpod hear that the network went and
end the sync's connection at once; until the Store grants it, it too
is connected by hand.
- The listing points to the project, not the instance: the website
learn.halkyon.app, contact and issues support@halkyon.app.
- The icon is the app's with rounded corners (tool/snap_icon.py), for
the Store and the dock alike.
- The app's version is 0.1.0, build 1.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-05 14:27:54 +02:00
|
|
|
contact: support@halkyon.app
|
|
|
|
|
# Reports by mail until people can open an account on the issue tracker.
|
|
|
|
|
issues: support@halkyon.app
|
fix(app): the app has its own icon instead of Flutter's
The launcher showed Flutter's logo: the project template's icons were
never replaced. tool/app_icons.py now makes every icon from the
kingfisher (assets/icon/halkyon_icon.png), through flutter_launcher_icons
v0.14.4 configured in the app's pubspec: Android's adaptive icon (the
kingfisher inset 16 % on white, for each launcher to cut to its shape)
and the square one before Android 8; iOS's, without transparency;
macOS's, the rounded tile on Apple's grid (824 of 1024 pixels); and
Windows', the rounded tile, its .ico with every size from 16 to 256
pixels (the tool writes only 256). It keeps the iOS project file as it
was, which the tool would break (flutter_launcher_icons issue 634), and
writes the snap's icon as tool/snap_icon.py did, which it replaces.
The Linux runner gives its window the bundled icon too, for desktops
that don't take it from the desktop file.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-06 22:49:25 +02:00
|
|
|
# The app's icon with rounded corners, made by tool/app_icons.py; also the desktop file's.
|
feat: the Linux app as a Snap
snap/snapcraft.yaml builds the Linux app as a strictly confined Snap on
core24 with the GNOME extension (GTK, WebKitGTK, GStreamer and libsecret
come from its runtime; files and the browser go through the desktop's
portals), connecting to learn.halkyon.eu, the project's instance. It
builds what is committed, with Flutter pinned as in CI.
- The session: libsecret's keyring over D-Bus needs the
password-manager-service plug, which the Store never connects by
itself, so unless it is connected the app keeps the session in an
encrypted file whose key comes from the Secret portal
(snap/local/secret-backend).
- network-manager-observe lets Serverpod hear that the network went and
end the sync's connection at once; until the Store grants it, it too
is connected by hand.
- The listing points to the project, not the instance: the website
learn.halkyon.app, contact and issues support@halkyon.app.
- The icon is the app's with rounded corners (tool/snap_icon.py), for
the Store and the dock alike.
- The app's version is 0.1.0, build 1.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-10-05 14:27:54 +02:00
|
|
|
icon: snap/gui/halkyon-learn.png
|
|
|
|
|
grade: stable
|
|
|
|
|
confinement: strict
|
|
|
|
|
platforms:
|
|
|
|
|
amd64:
|
|
|
|
|
|
|
|
|
|
lint:
|
|
|
|
|
ignore:
|
|
|
|
|
# PDFium is loaded by name while the app runs, which the linter can't see.
|
|
|
|
|
- library:
|
|
|
|
|
- bin/lib/libpdfium.so
|
|
|
|
|
|
|
|
|
|
apps:
|
|
|
|
|
halkyon-learn:
|
|
|
|
|
command: bin/halkyon_learn_flutter
|
|
|
|
|
# How the session is kept: see snap/local/secret-backend.
|
|
|
|
|
command-chain: [bin/secret-backend]
|
|
|
|
|
# GTK, WebKitGTK, GStreamer and libsecret come from the GNOME runtime; files
|
|
|
|
|
# and the browser go through the desktop's portals.
|
|
|
|
|
extensions: [gnome]
|
|
|
|
|
plugs:
|
|
|
|
|
- network
|
|
|
|
|
# GitHub sign-in answers on a loopback address the app listens on.
|
|
|
|
|
- network-bind
|
|
|
|
|
- audio-playback
|
|
|
|
|
# Never connected by itself; whoever connects it by hand gets the keyring.
|
|
|
|
|
- password-manager-service
|
|
|
|
|
# Lets Serverpod hear from NetworkManager that the network went, and end
|
|
|
|
|
# the sync's connection at once rather than after 40 s of silence. Not
|
|
|
|
|
# connected by itself until the Store grants it on a forum request;
|
|
|
|
|
# without it the app logs the refusal once and works on.
|
|
|
|
|
- network-manager-observe
|
|
|
|
|
|
|
|
|
|
parts:
|
|
|
|
|
flutter:
|
|
|
|
|
plugin: nil
|
|
|
|
|
source: https://github.com/flutter/flutter.git
|
|
|
|
|
source-tag: '3.47.5'
|
|
|
|
|
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-learn:
|
|
|
|
|
after: [flutter]
|
|
|
|
|
plugin: nil
|
|
|
|
|
source: .
|
|
|
|
|
source-type: git
|
|
|
|
|
# The sound player links GStreamer, which the GNOME SDK lacks; the GNOME
|
|
|
|
|
# runtime brings the same GStreamer (1.24) to run.
|
|
|
|
|
build-packages:
|
|
|
|
|
- libgstreamer1.0-dev
|
|
|
|
|
- libgstreamer-plugins-base1.0-dev
|
|
|
|
|
override-build: |
|
|
|
|
|
set -eu
|
|
|
|
|
export PATH="$CRAFT_STAGE/usr/bin:$PATH"
|
|
|
|
|
cd halkyon_learn_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://learn.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
|