Linux-Fassung (Ubuntu) ergaenzen

Die Fachlogik war bereits plattformneutral — paths.js loeste ~/.config
schon auf, jsonl.js liest ueber os.homedir(). Zu tun waren Autostart,
Build-Targets und drei Linux-Eigenheiten der Oberflaeche.

XWayland erzwingen: Ab Electron 36 waehlt Chromium in einer
Wayland-Sitzung von sich aus Wayland. Dort darf sich ein Fenster weder
selbst positionieren noch dauerhaft in den Vordergrund legen — beides
ist der Kern dieses Widgets. Der Schalter muss auf der Kommandozeile
stehen, weil Ozone die Plattform vor dem Main-Skript festlegt;
appendSwitch() und ELECTRON_OZONE_PLATFORM_HINT kommen beide zu spaet.
Bleibt ein einmaliger Neustart mit --ozone-platform=x11, der sich am
Argument selbst als Abbruchbedingung erkennt. Im AppImage muss dabei
execPath auf APPIMAGE zeigen, sonst laeuft der Nachfolger in den
/tmp-Einhaengepunkt, den der Vorgaenger beim Beenden wegraeumt.

Autostart: app.setLoginItemSettings() gibt es unter Linux nicht. Das
neue Modul autostart.js kapselt die Weiche und schreibt bzw. loescht
dort ~/.config/autostart/claude-live-dashboard.desktop. Der Startbefehl
kommt aus APPIMAGE, falls gesetzt.

Ausserdem: enable-transparent-visuals fuer echte Transparenz, das
32-px-Tray-Symbol in der GNOME-Leiste, plattformabhaengige
Beschriftungen in Tray-Menue und Einstellungsdialog, AppImage- und
deb-Targets, icon.png auf 512 px (electron-builder rechnet daraus die
Linux-Groessen herunter) und start.sh als Gegenstueck zu start.cmd.

Getestet unter GNOME/Wayland: Fenster auf X11 an erwarteter Position,
gemerkte Position wird wiederhergestellt, Tray registriert sich auf
DBus, dump liest die Transkripte, beide Pakete bauen und das AppImage
startet ohne Schalter.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-22 21:52:08 +02:00
co-authored by Claude Opus 4.8
parent 868f31fa9a
commit c1b899ec8b
9 changed files with 294 additions and 23 deletions
+91 -5
View File
@@ -1,6 +1,6 @@
# Claude Live Dashboard
Ein rahmenloses Always-on-Top-Widget für Windows, das die Auslastung des
Ein rahmenloses Always-on-Top-Widget für Windows und Linux, das die Auslastung des
Claude-Plans live anzeigt: 5-Stunden-Fenster, Wochenverbrauch, Reset-Countdown,
Tokenverbrauch je Modell und die Hochrechnung auf das Fensterende.
@@ -10,8 +10,12 @@ mitgeschnitten und standardmäßig keine Netzwerkverbindung aufgebaut.
## Start
Node.js wird benötigt. Ist es nicht im `PATH` (etwa bei nvm-windows ohne
aktive Version), genügt der Versionspfad:
Node.js (ab Version 20) wird benötigt.
### Windows
Ist Node nicht im `PATH` (etwa bei nvm-windows ohne aktive Version), genügt der
Versionspfad:
```powershell
$env:PATH = "$env:APPDATA\nvm\v22.22.1;$env:PATH"
@@ -19,9 +23,51 @@ npm install
npm start
```
Alternativ `start.cmd` doppelklicken.
Das Tray-Symbol landet unter Windows zunächst im Überlaufbereich hinter dem
`^` in der Taskleiste; per Drag lässt es sich dauerhaft sichtbar machen.
### Linux (Ubuntu)
```bash
sudo apt install nodejs npm # falls noch nicht vorhanden
./start.sh
```
`start.sh` installiert fehlende Abhängigkeiten selbst und startet Electron;
`npm install && npm start` tut dasselbe.
Das Tray-Symbol braucht unter GNOME die Erweiterung **AppIndicator** — beim
Ubuntu-Desktop ist sie vorinstalliert und aktiv. Auf einer Minimalinstallation
oder unter anderen Oberflächen:
```bash
sudo apt install gnome-shell-extension-appindicator
```
Ohne sie läuft das Widget weiter, nur das Symbol in der oberen Leiste fehlt.
Anders als unter Windows ist im StatusNotifierItem-Standard nicht festgelegt,
welcher Klick als Aktivierung zählt — verlässlich ist deshalb das Kontextmenü
(Rechtsklick) mit „Dashboard anzeigen“ als erstem Eintrag.
**Wayland:** Ab Electron 36 wählt Chromium in einer Wayland-Sitzung von sich
aus Wayland — dort darf sich ein Fenster aber weder selbst positionieren noch
dauerhaft in den Vordergrund legen, und genau das ist der Kern dieses Widgets.
Die App startet sich deshalb unter Wayland einmalig selbst mit
`--ozone-platform=x11` neu und läuft über XWayland. Das geschieht automatisch,
es ist nichts einzustellen.
Der Schalter *muss* auf der Kommandozeile stehen: Ozone legt die Plattform
fest, bevor das Main-Skript läuft — `app.commandLine.appendSwitch()` und
`ELECTRON_OZONE_PLATFORM_HINT` kommen beide zu spät. Wer die Automatik
umgehen will, setzt eine der beiden Größen von Hand; dann greift der Neustart
nicht mehr:
```bash
ELECTRON_OZONE_PLATFORM_HINT=wayland ./start.sh # nativ Wayland, ohne Positionierung
```
## Bedienung
| Aktion | Wirkung |
@@ -157,6 +203,7 @@ src/main/oauth-usage.js Serverabfrage, gekapselt und ausfallsicher
src/main/calibrate.js Kalibrierung gegen die echte Anzeige
src/main/store.js state.json, config.json
src/main/paths.js Speicherorte für Konfiguration und Zustand
src/main/autostart.js Anmeldestart je Betriebssystem
src/preload.js contextBridge fürs Widget
src/settings-preload.js contextBridge für den Einstellungsdialog
src/renderer/ Widget-Oberfläche
@@ -178,6 +225,12 @@ Zwei Details, die nicht offensichtlich sind:
## Release bauen
Gebaut wird jeweils auf dem Zielsystem — electron-builder kann `.deb` nicht
sinnvoll von Windows aus erzeugen und umgekehrt keine signierten `.exe` unter
Linux.
### Windows
```powershell
npm run dist # Installer + portable Fassung nach release/
npm run pack # nur entpackt nach release/win-unpacked (schneller Test)
@@ -201,16 +254,49 @@ Start einen SmartScreen-Hinweis („Der Computer wurde durch Windows geschützt
Weitergabe an andere wäre ein Zertifikat nötig; für den Eigenbedarf ist es
verzichtbar.
### Linux
```bash
npm run dist:linux # AppImage + .deb nach release/
npm run pack:linux # nur entpackt nach release/linux-unpacked
```
Ergebnis in `release/`:
| Datei | Zweck |
|---|---|
| `Claude Live Dashboard-1.0.0-x64.AppImage` | läuft ohne Installation |
| `Claude Live Dashboard-1.0.0-amd64.deb` | Installation per `sudo apt install ./…deb` |
Das AppImage muss einmal ausführbar gemacht werden (`chmod +x`) und braucht
`libfuse2`. Es trägt sich nicht selbst ins Anwendungsmenü ein — der Autostart
über das Tray-Menü funktioniert trotzdem, weil die App den Pfad des Abbilds aus
`APPIMAGE` liest und nicht den temporären Einhängepunkt. Das `.deb` bringt
Menüeintrag und Symbol mit und installiert nach `/opt/Claude Live Dashboard`.
> **Ubuntu 24.04 und AppImage.** Seit 24.04 beschränkt AppArmor unprivilegierte
> User-Namespaces; die Chromium-Sandbox kann dann beim Start fehlschlagen
> (`SUID sandbox helper binary … is not configured correctly`). Zwei Auswege:
> das AppImage mit `--no-sandbox` starten, oder ein AppArmor-Profil unter
> `/etc/apparmor.d/` hinterlegen. Beim `.deb` tritt das nicht auf — dessen
> `postinst` setzt das SUID-Bit auf `chrome-sandbox`.
### Konfiguration und Zustand
Beides liegt im Benutzerprofil, nicht im Programmverzeichnis — dort wäre es
nach der Installation im asar-Archiv und schreibgeschützt:
```
%APPDATA%\Claude Live Dashboard\config.json
%APPDATA%\Claude Live Dashboard\state.json
Windows: %APPDATA%\Claude Live Dashboard\config.json
%APPDATA%\Claude Live Dashboard\state.json
Linux: ~/.config/Claude Live Dashboard/config.json
~/.config/Claude Live Dashboard/state.json
```
Der Autostart ist kein Feld dieser Dateien: unter Windows steckt er in der
Registry, unter Linux in `~/.config/autostart/claude-live-dashboard.desktop`.
Beim ersten Start wird `config.json` aus der mitgelieferten Vorlage angelegt.
Erreichbar über das Tray-Menü (*Konfiguration öffnen* / *Datenordner öffnen*).