Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 82 additions & 0 deletions packaging/flatpak/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
# Flatpak-MVP-Spike (packaging/flatpak/)

Minimaler, lokal getesteter Ansatz, um BlitztextLinux als GUI-App in einer
Flatpak-Sandbox zu starten. Kein Release-, Flathub- oder Signing-Setup.

## Umfang (MVP)

Absichtlich enthalten:
- Qt6-GUI (`org.kde.Platform`/`org.kde.Sdk` 6.8)
- Zwischenablage ueber den bestehenden Qt-Clipboard-Fallback
(`app/paste_service.py`, bereits in PR #47 gehaertet)
- Audioaufnahme ueber PulseAudio-Socket
- Cloud-Aufrufe (OpenAI: LLM-Workflows, ggf. Transkription/TTS) ueber
`--share=network`

Absichtlich **nicht** enthalten / sichtbar deaktiviert:
- Globale Hotkeys (evdev) -- `app/hotkey_service.py` importiert `evdev` lazy
und liefert im Flatpak bereits den Hinweis
"Globale Hotkeys sind im Flatpak nicht verfügbar"
(siehe `tests/test_flatpak_fallback.py::test_hotkey_service_flatpak_hint`).
Der Sandbox fehlt bewusst jeder Input-Device-Zugriff
(kein `--device=all`, kein `input`-Gruppen-Aequivalent).
- Auto-Paste via `ydotool` (kein Provider im Sandbox vorgesehen; Clipboard-
Kopie funktioniert weiter, siehe bestehender Fallback-Test
`test_paste_service_autopaste_without_ydotool`).
- Lokale Whisper-Transkription (`openai-whisper`/`faster-whisper`/`torch`):
bewusst aus `requirements-flatpak.txt` ausgeklammert, da der Download
mehrere GB umfasst. `app/transcribe.py` importiert `whisper` ebenfalls
lazy, das Modul ist fuer eine spaetere Erweiterung vorbereitet.
- Desktop-Notifications (`notify-send` ist im Sandbox nicht gebuendelt;
`app/notify.py` degradiert bereits stillschweigend, wenn das Binary fehlt).

## Dateien

- `io.github.TimInTech.BlitztextLinux.yaml` -- Flatpak-Manifest.
`io.github.TimInTech.*` ist ein Platzhalter-App-ID-Namespace (an das
GitHub-Repo `TimInTech/blitztext-linux` angelehnt), nicht auf Flathub
registriert.
- `blitztext-linux.sh` -- Launcher, ruft `app/blitztext_linux.py` direkt auf.
- `requirements-flatpak.txt` -- reduzierte pip-Abhaengigkeiten fuer den
Sandbox-Build (nur `PyQt6` + `openai`).

## Bekannte Abweichungen von Flathub-Konventionen

- Das `blitztext-linux-deps`-Modul installiert pip-Pakete direkt aus PyPI
waehrend des Builds (`--share=network` nur fuer dieses Modul). Flathub
verlangt gepinnte/vendored Quellen (z. B. via `flatpak-pip-generator`).
Fuer diesen lokalen MVP-Spike bewusst nicht umgesetzt.
- Kein AppStream-Metadata-File, kein `.desktop`-File, kein Icon --
ausserhalb dieses Ordners wurden bewusst keine Dateien angelegt.
- `notes_folder`-Export (`~/Blitztext-Notizen`, siehe `app/config.py`)
liegt ausserhalb des sandboxed `$HOME`; ohne zusaetzliches
`--filesystem=home` bleibt dieser Pfad im Flatpak unerreichbar. Nicht
Teil des MVP-Scopes, hier nur dokumentiert.

## Verifikation (in diesem Spike durchgefuehrt)

`flatpak-builder` 1.4.8 ist auf diesem Host vorhanden. Ein vollstaendiger
Build (Download von `org.kde.Platform`/`org.kde.Sdk` 6.8, ca. 1,5 GB) wurde
in diesem Diagnose-Pass **nicht** ausgefuehrt -- das waere ein groesserer,
bestaetigungspflichtiger Download/Installationsschritt ausserhalb des
Spike-Rahmens. Stattdessen nur strukturelle Validierung ohne Runtime-Install:

```bash
flatpak-builder --show-manifest packaging/flatpak/io.github.TimInTech.BlitztextLinux.yaml
flatpak-builder --show-deps packaging/flatpak/io.github.TimInTech.BlitztextLinux.yaml
```

## Naechster Schritt (nicht Teil dieses Spikes)

Falls ein echter Build gewuenscht ist:

```bash
flatpak install flathub org.kde.Platform//6.8 org.kde.Sdk//6.8
flatpak-builder --user --install --force-clean build-dir \
packaging/flatpak/io.github.TimInTech.BlitztextLinux.yaml
flatpak run io.github.TimInTech.BlitztextLinux
```

Rollback: `packaging/flatpak/` einfach loeschen bzw. den Branch
`spike/flatpak-manifest-mvp` verwerfen -- keine Aenderungen ausserhalb
dieses Ordners.
7 changes: 7 additions & 0 deletions packaging/flatpak/blitztext-linux.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#!/bin/sh
# Flatpak-Launcher fuer BlitztextLinux (MVP-Spike).
#
# app/blitztext_linux.py fuegt sein Projektverzeichnis (der Elternordner von
# app/) beim Start selbst zu sys.path hinzu (siehe PROJECT_DIR-Logik am
# Dateianfang), daher genuegt ein direkter Aufruf ueber den vollen Pfad.
exec python3 /app/share/blitztext-linux/app/blitztext_linux.py "$@"
46 changes: 46 additions & 0 deletions packaging/flatpak/io.github.TimInTech.BlitztextLinux.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
app-id: io.github.TimInTech.BlitztextLinux
runtime: org.kde.Platform
runtime-version: "6.8"
sdk: org.kde.Sdk
command: blitztext-linux

# MVP-Sandbox-Rechte: nur was fuer GUI, Zwischenablage (Qt-Fallback),
# Audioaufnahme (PulseAudio) und Cloud-Aufrufe (OpenAI) noetig ist.
# Bewusst NICHT enthalten: --device=all / --system-talk-name=... fuer
# evdev-Zugriff -- globale Hotkeys bleiben im Flatpak deaktiviert
# (app/hotkey_service.py faengt das fehlende evdev bereits ab, siehe
# tests/test_flatpak_fallback.py::test_hotkey_service_flatpak_hint).
finish-args:
- --share=ipc
- --share=network
- --socket=wayland
- --socket=fallback-x11
- --socket=pulseaudio

modules:
- name: blitztext-linux-deps
buildsystem: simple
# Netzwerk nur fuer dieses Modul erlauben (pip-Installation).
# Nicht Flathub-konform (keine gepinnten/vendored Quellen) -- fuer
# diesen MVP-Spike bewusst so belassen, siehe README.md.
build-options:
build-args:
- --share=network
build-commands:
- pip3 install --prefix=/app --no-build-isolation -r requirements-flatpak.txt
sources:
- type: file
path: requirements-flatpak.txt

- name: blitztext-linux
buildsystem: simple
build-commands:
- install -Dm755 blitztext-linux.sh /app/bin/blitztext-linux
- mkdir -p /app/share/blitztext-linux
- cp -r app /app/share/blitztext-linux/app
sources:
- type: dir
path: ../../app
dest: app
- type: file
path: blitztext-linux.sh
15 changes: 15 additions & 0 deletions packaging/flatpak/requirements-flatpak.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Laufzeit-Abhaengigkeiten fuer den Flatpak-MVP-Spike.
#
# Bewusst NICHT enthalten (siehe README.md fuer Details):
# - evdev -> globale Hotkeys sind im Flatpak-MVP deaktiviert;
# app/hotkey_service.py importiert evdev lazy und
# faengt das Fehlen bereits ab.
# - openai-whisper /
# faster-whisper /
# torch -> lokale Transkription ist im MVP-Spike nicht
# Teil des Build-Checks (mehrere GB Download).
# app/transcribe.py importiert whisper ebenfalls
# lazy; das Modul bleibt fuer eine spaetere
# Erweiterung vorbereitet.
PyQt6
openai