- core/display.py: write_positions() persists Arrangement's drag-and-drop
layout into niri's config.kdl (one output { position x= y= } per output),
validated via `niri validate` on a temp copy with a .kdl.bak backup before
writing — same pattern as core/keybindings.py's rebind(). Previously the
page only ever called `niri msg output … position set`, which niri treats
as live-only and drops on the next login/reload.
- gui/pages/display.py: Arrangement's Apply now runs each output's `niri msg
output … position set` synchronously instead of queuing them all on the
single-shot ProcessRunner (which rejects a second run() while the first is
still async) — a 2-monitor apply previously moved only the first output
and silently dropped the rest. _dock_to_nearest keeps the free axis at the
dragged position (so a shorter display can sit vertically centered next to
a taller rotated one) rather than forcing corner alignment.
- core/panel.py, files/__init__.py: incidental fixes alongside the above.
- packaging/: signing-key generation script + build-user systemd setup for
the [tanin] AUR auto-rebuild pipeline; PKGBUILD bumped to pkgrel=5.
- src/taninux/browser/: new module for browser theme sync (Fuji accent).
8.7 KiB
TANINUX — Verteilung als „Distro"
Ziel: ein Calamares-Installer, der eine fertige TANINUX-Umgebung aufsetzt.
Modell: eigenes Binär-Repo [tanin] nur für eigene Pakete, alles Standard
aus den offiziellen Arch-Repos (wie CachyOS/EndeavourOS).
Pakete
| Paket | Repo | Inhalt |
|---|---|---|
taninux |
[tanin] |
App: tsettings + thub + TUI, Helper, polkit, .desktop |
tanin-eww |
[tanin] |
eww Panel/Dock-Config + Scripts (→ /usr/share) |
tanin-setup |
[tanin] |
seedet ~/.config aus /usr/share + Portal/Session-Fix |
tanin-desktop |
[tanin] |
Metapackage: depends = eigene + Arch-Pakete |
tanin-desktop zieht per depends die Arch-Pakete aus den normalen Repos und
die eigenen aus [tanin]. AUR bleibt Opt-in → paru ist optdepends, kein
hartes depends (Metapackage baut also nichts aus dem AUR).
Dotfile-Auslieferung (wichtig)
AUR/Binär-Pakete dürfen nicht nach /home schreiben. Daher:
- Default-Configs ins Paket nach
/usr/share/tanin/(oder/etc/skel/). tanin-setupkopiert sie beim ersten Start nach~/.config(idempotent, überschreibt nichts ohne--force) und richtet das Session-Portal ein (siehe „Dark Mode / Portal" unten).
Phasen
-
Fundament —
packaging/taninux/PKGBUILD(fertig), LICENSE (✅ da, GPL-3.0-or-later),cd packaging/taninux && makepkg -silokal testen. -
Meta + Config —
tanin-desktop(Skelett da),tanin-eww,tanin-setup. -
Eigenes Repo
[tanin]. Hosts:- Code →
git.openbureau.ch/karim/taninux(PKGBUILD-source, wohermakepkgklont) - Projekt + Repo →
taninux.kgva.ch(PKGBUILD-url/Homepage und pacman-Server)
DB bauen + signieren:
repo-add -s tanin.db.tar.zst *.pkg.tar.zst # -s signiert mit Packager-KeyHosten — zwei Optionen:
- Gitea/Forgejo Arch-Registry (falls git.openbureau.ch das kann): Pakete
pushen,
Server = https://git.openbureau.ch/api/packages/karim/arch/<repo>.taninux.kgva.chals Reverse-Proxy/Vanity davor. - Statisches Verzeichnis hinter
taninux.kgva.ch:*.pkg.tar.zst+tanin.db.
pacman.conf-Snippet für bestehende User (unverändert, siehe Warnung):[tanin] # TEMPORÄR + UNSICHER: TrustAll akzeptiert JEDES Paket ohne Signaturprüfung. # Nur zum Bootstrappen, solange die DB noch nicht signiert ist. Sobald der # Packager-Key steht -> auf "Required DatabaseOptional" umstellen (siehe unten). SigLevel = Optional TrustAll Server = https://taninux.kgva.ch/$archWichtig: Dieses Snippet bleibt bewusst auf
Optional TrustAll, auch nachdem Signing verdrahtet ist (siehe unten) — würde man es hier aufRequiredumstellen, würde das nächste-Syubei allen bestehenden Usern gegen das heute unsignierte Repo fehlschlagen. Neue Installs (ISO/Calamares) bekommenRequired DatabaseOptionalbereits vorkonfiguriert (sieheiso/overrides/airootfs/etc/pacman.conf). Bestehende User steigen über den Cutover-Abschnitt unten manuell um, sobald das Repo signiert ausgeliefert wird.Repo-Signing
Verdrahtet (
packaging/):packaging/gen-signing-key.sherzeugt den Packager-Key EINMALIG (Ed25519,gpg --batch --gen-key, interaktive Passphrase — kein Hardcoding) und druckt danach die Export-/Cutover-Schritte aus.build-tanin-repo.sh,finish-tanin-repo.sh,aur-autoupdate.shlesenGPGKEYaus der Umgebung und brechen fail-closed ab, wenn er fehlt — es wird nie stillschweigend unsigniert gebaut. Pakete werden mitmakepkg --sign(bzw. beiaur-autoupdate.sh, das im isoliertenmakechrootpkg-Chroot baut, pergpg --detach-signdirekt nach dem Kopieren aus dem Chroot) signiert, die DB mitrepo-add -s -k "$GPGKEY".
Noch manuell/offen:
packaging/gen-signing-key.sheinmal ausführen (noch nicht geschehen — dieser Repo-Stand enthält KEINEN Key) und den privaten Key sicher sichern (siehe Skript-Output).- Public Key exportieren nach
iso/overrides/airootfs/etc/pacman.d/tanin-repo.gpg(+iso/build-profile/..., wird bei jedembootstrap-profile.sh-Lauf ausoverrides/neu kopiert) und öffentlich untertaninux.kgva.ch/tanin.gpg(o. ä.) ablegen. - In
iso/overrides/airootfs/root/customize_airootfs.sheine zweitepacman-key --lsign-key <packager-fpr>-Zeile ergänzen (siehe Kommentar dort) — ohne die bleibt der Key zwar importiert, aber nicht getrustet. GPGKEYinpackaging/systemd/tanin-aur-update.servicesetzen (dort als Kommentar vorbereitet) und den geheimen Key insGNUPGHOMEdestanin-build-Users legen (siehe „Build-Infrastruktur" unten).- Sobald das ausgelieferte Repo tatsächlich signierte Pakete + DB serviert: bestehende User per Cutover-Anleitung (unten) umstellen.
- Calamares / ISO ✅ —
archiso-Profil mit[tanin]vorkonfiguriert + Calamarespackages-Modul, dastanin-desktopinstalliert (iso/build-profile/, gebaute ISO iniso/out/). Neue Installs starten direkt mitRequired DatabaseOptional.
Cutover für bestehende User (Optional TrustAll → Required DatabaseOptional)
Erst durchführen, wenn Schritt 1–4 oben erledigt sind und
taninux.kgva.ch(bzw. die Gitea-Registry) tatsächlich signierte Pakete + eine signierte DB ausliefert — vorher würdeRequiredjedes-Syubrechen.# 1) Packager-Pubkey importieren + lokal signieren (einmalig, als root) curl -o /tmp/tanin-repo.gpg https://taninux.kgva.ch/tanin.gpg # oder gleicher Pfad wie oben pacman-key --add /tmp/tanin-repo.gpg pacman-key --lsign-key <packager-fingerprint> # Fingerprint aus gen-signing-key.sh # 2) In /etc/pacman.conf das [tanin]-SigLevel umstellen # von SigLevel = Optional TrustAll # auf SigLevel = Required DatabaseOptional # 3) Testen sudo pacman -Sy sudo pacman -S tanin-desktop --dbonly # oder ein beliebiges [tanin]-PaketSchlägt Schritt 3 fehl ("signature is unknown trust" o. ä.), war entweder Schritt 1 unvollständig (Key nicht lsigned) oder das Repo liefert noch nicht signierte Pakete — dann bei
Optional TrustAllbleiben. - Code →
Dark Mode / Portal (Session-Fix)
libadwaita-Apps (Nautilus etc.) lesen Hell/Dunkel über
org.freedesktop.portal.Settings. Damit das Portal startet, muss die Session
graphical-session.target aktivieren. tanin-setup legt dafür
~/.config/systemd/user/<wm>-session.target an und ergänzt die Compositor-
Autostarts:
exec-once = dbus-update-activation-environment --systemd --all
exec-once = systemctl --user start <wm>-session.target
Build-Infrastruktur
Der tägliche AUR-Rebuild (packaging/aur-autoupdate.sh, via
packaging/systemd/tanin-aur-update.timer) braucht makechrootpkg /
arch-nspawn / mkarchroot als root — effektiv root-äquivalent (baut
beliebige, aus dem AUR gezogene PKGBUILDs in einem chroot). Das lief bisher
per NOPASSWD-sudo auf dem persönlichen Account karim. Stattdessen jetzt:
ein dedizierter, gesperrter Systemaccount tanin-build
(packaging/systemd/setup-build-user.sh, Home /var/lib/tanin-build, kein
Passwort/Login) — nur dieser Account bekommt den NOPASSWD-Sudo-Grant
(packaging/systemd/tanin-aur-update.sudoers), und der systemd-Service läuft
mit User=tanin-build/Group=tanin-build. Ein kompromittiertes AUR-PKGBUILD
(oder ein Bug in der Pipeline) kann so nicht mehr karims eigentlichen
Account root-äquivalent übernehmen — nur den isolierten Build-Account, der
sonst nichts kann.
Konsequenzen für Pfade: Der systemd-Unit nutzt %h-Spezifier, die jetzt gegen
tanin-builds Home auflösen, nicht mehr /home/karim. setup-build-user.sh
synct dafür einmalig einen Checkout nach /var/lib/tanin-build/taninux (muss
nach git pull erneut laufen) und legt /var/lib/tanin-build/.gnupg an — dort
muss der geheime Packager-Key (siehe „Repo-Signing" oben) importiert sein,
sonst kann tanin-build nichts signieren. Einrichtung: sudo packaging/systemd/setup-build-user.sh (erstellt User, synct Repo, installiert
Sudoers-Drop-in + .service/.timer als System-Units).
Hosts
- Code:
git.openbureau.ch/karim/taninux(+ Repo für die eww-Config, Absprache mit der eww-Instanz). - Projekt/Repo:
taninux.kgva.ch(Homepage +[tanin]-pacman-Server).
Offene Voraussetzungen
- LICENSE-Datei ablegen (Vorschlag GPL-3.0-or-later):
curl -L https://www.gnu.org/licenses/gpl-3.0.txt -o LICENSE. taninux.kgva.chans Repo-Hosting hängen (Gitea-Arch-Registry oder statisch).