Guido Schmit d85425671d Aussagekräftige Popovers für CPU, Speicher, Akku und Netzwerk
Ein Popover, das nur den Wert größer wiederholt, den man gerade angeklickt hat,
ist verschenkter Platz. Hier ist Raum — anders als in der Menüleiste, wo jede
Zahl um Breite kämpft.

Prozessor: Ringe für Auslastung, Temperatur und Lüfter, alle Kerne als Raster
statt als Balkenreihe (bei fünfzehn Kernen wird eine Reihe unleserlich schmal),
Leistungsaufschlüsselung und beide Lüfter mit Namen.

Die Leistungsschlüssel sind gegen iStat Menus abgeglichen: PHPC liefert 14,02 W
und deckt sich mit deren CPU-Wert, PSTR mit der Gesamtleistung. Frequenzen
fehlen bewusst — die stehen nicht im SMC, dafür bräuchte es IOReport.

Speicher: Ring mit Aufschlüsselung nach Programmen, Reserviertem, Komprimiertem
und Freiem, Auslagerung mit Gesamtgröße und die fünf größten Verbraucher über
phys_footprint — derselbe Wert, den der Aktivitätsmonitor zeigt, nicht der
virtuelle Adressraum.

Akku: Restzeit, Kapazität, Zyklen, Temperatur, Lade- oder Entladeleistung,
Netzteilleistung und Spannung.

Netzwerk: Verlauf in beide Richtungen auf gemeinsamem Maßstab — getrennte
Maßstäbe ließen einen Upload von 20 KB/s so hoch aussehen wie einen Download
von 20 MB/s. Dazu Spitzenwerte, VPN-Hinweis, alle Adressen und die Summen seit
dem Start.

Was fehlt, wird benannt statt weggelassen: Durchsatz je Programm gibt es ohne
root nicht, das Ladelimit braucht den privilegierten Helfer und einen Key, der
auf diesem Modell noch nicht identifiziert ist.

Sensorliste erweitert und benannt: CPU-Kerne und Grafik stehen vorn, dazu
Luftstrom, Thunderbolt links und rechts. Lüfter heißen links und rechts statt
0 und 1.

Nebenbei ein Übersetzungsfehler behoben: die Modus-Auswahl in den Einstellungen
zeigte die Rohschlüssel, weil die Texte im MetricsProvider-Bündel liegen und
die Einstellungen im App-Bündel suchen.

145 Tests grün.
2026-08-10 22:17:13 +02:00

Onyx

Notch-Erweiterung für macOS. Beim Überfahren der Notch fährt ein Panel mit eigenen Widgets aus — Kalender, Wetter, Medien, Hardware, Netzwerk, Audio-Mixer, Ablage und AirDrop.

Zielgerät: MacBook Pro mit Apple Silicon, macOS 26+.


Bauen

xcodegen generate          # erzeugt Onyx.xcodeproj aus project.yml
open Onyx.xcodeproj        # dann ⌘R

Voraussetzungen: Xcode 26, XcodeGen, Signierung mit Team PP34X97WS3.

Tests laufen ohne Xcode:

cd Packages/OnyxKit && swift test

Aufbau

Die Projektdefinition liegt als project.yml vor, nicht als handgepflegte .xcodeproj — so ist im Diff lesbar, was sich an den Build-Einstellungen ändert.

Onyx/                    App-Target (nicht sandboxed, Hardened Runtime)
Packages/OnyxKit/        Alle Module als lokales Swift-Package
  OnyxCore               Einzelinstanz-Sicherung
  OnyxDesign             Farben, Maße, Bewegung — einzige Quelle
  OnyxNotch              Panel-Fenster, Geometrie, Zustandsmaschine
  OnyxWidgetKit          Widget-Protokoll, Layout-Engine, Persistenz
  OnyxMenuBar            Modul-Protokoll für Menüleisten-Elemente
  CalendarProvider       EventKit (und später Calendarr)
  WeatherProvider        WeatherKit + CoreLocation
  MediaProvider          MediaRemote-Adapter, AppleScript, Medientasten
Vendor/                  Fremdcode im Quellzustand (siehe unten)
Spikes/                  Wegwerf-Werkzeuge zur API-Verifikation
docs/spikes/             Was dabei herauskam — auch die Sackgassen

Entscheidungen, die man sonst für Fehler hält

Keine App-Sandbox. Sie ist mit dem privilegierten Helper, mit IOKit und mit dem MediaRemote-Adapter unvereinbar. Der App-Group-Container für Calendarr bleibt trotzdem erreichbar — auf macOS ist er von der Sandbox unabhängig. Nachgemessen in docs/spikes/D-appgroup.md.

TCC-Entitlements trotz fehlender Sandbox. Bei aktivierter Hardened Runtime verlangt macOS com.apple.security.personal-information.* auch ohne Sandbox. Fehlt eine davon, erscheint der Berechtigungsdialog gar nicht erst — ohne Fehlermeldung. Das hat einen halben Abend gekostet: docs/spikes/E-tcc-hardened-runtime.md.

ENABLE_DEBUG_DYLIB = NO. Xcode lagert im Debug-Build den Programmcode in eine eigene dylib aus. TCC ordnet Berechtigungsanfragen dann dem verbleibenden Rumpf zu, der weder Info.plist noch Entitlements trägt.

Eigenes Einstellungsfenster. SwiftUIs Settings-Szene öffnet über einen privaten Selektor, der bei Apps ohne Menüleiste unzuverlässig ankommt.

Der MediaRemote-Adapter wird nicht gelinkt. Er wird von /usr/bin/perl geladen, einem berechtigten Systemprogramm — im eigenen Prozess greift Apples Entitlement-Prüfung und es käme nichts an.


Fremdcode

Vendor/mediaremote-adapterungive/mediaremote-adapter, BSD-3-Clause. Als Quellcode eingebettet und beim Bauen kompiliert, nicht als fertige Binary: so ist nachvollziehbar, was läuft. Stand siehe ONYX-VERSION.txt.


© 2026 Scarriffleservices

Description
No description provided
Readme 2 MiB
Languages
Swift 97.6%
Shell 2.4%