Phase 9: Einrichtung, Autostart, Notarisierung — und die Mixer-Optik

Die Einrichtung beim ersten Start erklärt jede der vier Sachen einzeln und
fragt jede einzeln an. Vier Systemdialoge hintereinander wären der übliche
Weg und der falsche: wer nicht weiß wofür, klickt viermal „Nicht erlauben",
und danach fragt macOS nie wieder. Sie kommt beim ersten Start immer, auch
wenn zufällig schon alles erlaubt ist — sie erklärt auch den Helfer und den
Autostart.

Beim Autostart ist `requiresApproval` der Zustand, der weh tut. Wer das
Anmeldeobjekt in den Systemeinstellungen abgeschaltet hat, kann in Onyx auf
den Schalter drücken, so oft er will. Als „aus" angezeigt führt das in eine
Schleife, also steht dort jetzt, wo es weitergeht.

Der Mixer verliert den Schalter je Programm. Zehn Mini-Schalter untereinander
sind das, was den Eindruck macht; am Regler zu ziehen ist ohnehin die
Entscheidung, dieses Programm zu regeln, und der große Ausschalter stellt
alles zurück. Der Regler ist selbst gezeichnet — der Systemregler bringt sein
eigenes Erscheinungsbild mit und kann nicht zeigen, worauf es hier ankommt:
den Pegel und die Grenze bei 100 %.

Der Pegel wird im selben Durchlauf gemessen, in dem verstärkt wird, und über
`Atomic` weitergereicht. Eine gewöhnliche Eigenschaft wäre ein Wettlauf, eine
Sperre im Audiothread der klassische Weg zu Aussetzern. Dabei fällt das
`Date()` aus dem Echtzeitpfad, das dort nie hingehört hat.

Zwei Funde beim Bauen des Release-Wegs, beide hätten erst nach dem Hochladen
zur Ablehnung geführt: der Helfer wurde ohne sicheren Zeitstempel signiert,
und das Adapter-Framework ad-hoc. Beides gilt jetzt nur noch im Debug.
Scripts/release.sh prüft Zertifikat und Notarisierungsprofil vorweg, statt
nach zehn Minuten Bauen zu scheitern.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-08-11 10:36:26 +02:00
parent 8308536227
commit a0342205fd
19 changed files with 1589 additions and 385 deletions

View File

@@ -532,6 +532,230 @@
}
}
},
"onboarding.allow": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Erlauben"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Allow"
}
}
}
},
"onboarding.audio": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Systemton"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "System audio"
}
}
}
},
"onboarding.audio.why": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Nötig für die Lautstärke einzelner Programme. Onyx leitet den Ton der geregelten Programme um — und nur deren."
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Needed for per-app volume. Onyx routes the audio of the apps you control, and only those."
}
}
}
},
"onboarding.calendar": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Kalender"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Calendar"
}
}
}
},
"onboarding.calendar.why": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Zeigt deine Termine im Panel. Nur lesend — Onyx ändert nie einen Kalender."
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Shows your appointments in the panel. Read-only — Onyx never changes a calendar."
}
}
}
},
"onboarding.done": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Fertig"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Done"
}
}
}
},
"onboarding.helper": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Lüftersteuerung"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Fan control"
}
}
}
},
"onboarding.helper.why": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Installiert einen kleinen privilegierten Dienst. Er setzt nur Lüfterdrehzahlen und fällt auf Automatik zurück, wenn Onyx schweigt."
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Installs a small privileged service. It only sets fan speeds and falls back to automatic if Onyx goes silent."
}
}
}
},
"onboarding.launchAtLogin": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Onyx beim Anmelden starten"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Start Onyx at login"
}
}
}
},
"onboarding.location": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Standort"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Location"
}
}
}
},
"onboarding.location.why": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Wetter für deinen Aufenthaltsort. Alternativ lässt sich je Widget ein fester Ort einstellen."
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Weather for where you are. You can also set a fixed place per widget instead."
}
}
}
},
"onboarding.openSettings": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Systemeinstellungen öffnen"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Open System Settings"
}
}
}
},
"onboarding.subtitle": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Onyx braucht vier Dinge vom System. Jedes für etwas anderes, und keines davon ist Pflicht — erlaube, was du nutzen möchtest."
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Onyx needs four things from the system. Each one is for something different, and none of them is required — grant what you want to use."
}
}
}
},
"onboarding.title": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Willkommen bei Onyx"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Welcome to Onyx"
}
}
}
},
"settings.display.all": {
"localizations": {
"de": {
@@ -663,6 +887,54 @@
}
}
},
"settings.general": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Allgemein"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "General"
}
}
}
},
"settings.launchAtLogin": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Beim Anmelden starten"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Start at login"
}
}
}
},
"settings.launchAtLogin.blocked": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Anmeldeobjekte wurden für Onyx in den Systemeinstellungen abgeschaltet."
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Login items were turned off for Onyx in System Settings."
}
}
}
},
"settings.menubar.bars": {
"extractionState": "stale",
"localizations": {
@@ -764,6 +1036,22 @@
}
}
},
"settings.onboarding.show": {
"localizations": {
"de": {
"stringUnit": {
"state": "translated",
"value": "Einrichtung erneut zeigen"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Show setup again"
}
}
}
},
"settings.permissions.calendar": {
"extractionState": "stale",
"localizations": {
@@ -899,7 +1187,12 @@
}
}
},
"settings.shelf.count %@": {
"comment": "A label showing the number of items in the shelf. The argument is the number of items in the shelf.",
"isCommentAutoGenerated": true
},
"settings.shelf.count %lld": {
"extractionState": "stale",
"localizations": {
"de": {
"stringUnit": {
@@ -915,7 +1208,12 @@
}
}
},
"settings.shelf.days %@": {
"comment": "A label that lets the user select how many days to wait before automatically removing items from the shelf. The argument is the number of days.",
"isCommentAutoGenerated": true
},
"settings.shelf.days %lld": {
"extractionState": "stale",
"localizations": {
"de": {
"stringUnit": {
@@ -948,6 +1246,7 @@
}
},
"settings.shelf.reveal": {
"extractionState": "stale",
"localizations": {
"de": {
"stringUnit": {
@@ -964,6 +1263,7 @@
}
},
"settings.shelf.title": {
"extractionState": "stale",
"localizations": {
"de": {
"stringUnit": {
@@ -1116,6 +1416,7 @@
}
},
"settings.tab.sources": {
"extractionState": "stale",
"localizations": {
"de": {
"stringUnit": {