Halo heisst ab hier Flaro — die Marke stand im Weg

Der Upload zu App Store Connect scheiterte am Namen. „Halo" ist eine
eingetragene Marke von Microsoft; im App Store heisst zwar keine App exakt
so, aber reservierte und markenrechtlich belegte Namen tauchen in keiner
Suche auf. Der einzige verlässliche Test war die Eingabe dort, und die ging
daneben.

**Der Name wurde diesmal vorher geprüft.** Zwanzig Kandidaten gegen den
deutschen und amerikanischen App Store, auf exakte Treffer und auf ähnliche
Namen. „Kavo" wäre dieselbe Wand gewesen — exakt belegt in beiden Stores, in
Deutschland von KaVo Dental GmbH. „Flare" ist mit 42 ähnlichen Apps je Store
der am dichtesten besetzte Name der ganzen Runde. **Flaro** ist in beiden
frei und liest sich als eigenes Wort, nicht als Flare mit Tippfehler.

Das bleibt eine Store-Suche und keine Markenrecherche — reservierte Namen
ohne veröffentlichte App sieht sie nicht. Aber es ist mehr Prüfung, als beim
letzten Mal stattfand.

---

2160 Textvorkommen in 273 Dateien, 49 Pfade. Betroffen ist diesmal auch der
Server: `Flaro.Api`, `Flaro.Core`, `Flaro.Data`, `Flaro.Media`,
`Flaro.Metadata`, `FlaroContext`, `FlaroPaths`, `flaro.db`, die Variablen
`FLARO_DATA`, `FLARO_CACHE`, `FLARO_TRANSCODE`, `FLARO_WRITE_SIDECARS`, und
das Image.

**Vor dem Ersetzen geprüft**, ob „halo" irgendwo als Teil eines anderen
Wortes steckt — und ob es im TMDB-Token vorkommt. Tat es nicht; ein blindes
Ersetzen hätte den sonst zerlegt.

`docs/superpowers/specs/` bleibt wie beim letzten Mal unangetastet: datierte
Entwurfsdokumente sind ein Protokoll getroffener Entscheidungen. Das
Server-Dokument hat stattdessen einen Nachtrag bekommen, damit es niemanden
in die Irre führt.

**Die Bundle-ID wandert mit**, zum zweiten Mal an einem Tag:
`com.scarriffleservices.flaro`. Wer die vorige Fassung installiert hat, hat
jetzt zwei Karteileichen auf dem Gerät — beide löschen, dann ist Ruhe.

308 Server-Tests grün, 368 im Swift-Paket, null Warnungen. iOS und tvOS
bauen, das Image baut, und ein frischer Container läuft durch Einrichtung
und Anmeldung.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-10-03 19:38:27 +02:00
co-authored by Claude Opus 5
parent f98b995050
commit a7cf6c5def
390 changed files with 2078 additions and 2069 deletions
+68 -68
View File
@@ -1,4 +1,4 @@
name: Halo
name: Flaro
options:
bundleIdPrefix: com.scarriffleservices
@@ -19,11 +19,11 @@ settings:
SWIFT_STRICT_CONCURRENCY: complete
packages:
HaloKit:
path: Packages/HaloKit
FlaroKit:
path: Packages/FlaroKit
targets:
Halo:
Flaro:
type: application
platform: iOS
# Ausdrücklich aufgeschrieben, statt Xcode raten zu lassen.
@@ -34,39 +34,39 @@ targets:
# auflösen. Hier steht es im Projekt und überlebt jedes Neuerzeugen.
scheme:
testTargets:
- HaloUITests
- FlaroUITests
sources:
# Das Icon ist ein Bündel, also technisch ein Ordner. Ohne diesen
# Ausschluss läuft XcodeGen hinein und trägt icon.json und play.svg
# einzeln ein — dann fehlt das Icon, ohne dass irgendwo ein Fehler
# auftaucht.
#
- path: Halo
- path: Flaro
excludes:
- "AppIcon.icon"
- path: Halo/AppIcon.icon
- path: Flaro/AppIcon.icon
type: file
dependencies:
- target: DownloadWidget
# Die neutrale Grundschicht. Ausdrücklich genannt, obwohl sie über
# JellyfinKit ohnehin im Baum hängt: die App soll sie direkt benutzen und
# nicht davon abhängen, dass ein bestimmter Server sie mitschleppt.
- package: HaloKit
- package: FlaroKit
product: MediaKit
# Der Server. Steht auf der neutralen Schicht, nicht darin — kommt ein
# zweiter dazu, steht er daneben.
- package: HaloKit
- package: FlaroKit
product: JellyfinKit
- package: HaloKit
product: HaloDesign
- package: HaloKit
product: HaloPlayback
- package: HaloKit
product: HaloDownloads
- package: FlaroKit
product: FlaroDesign
- package: FlaroKit
product: FlaroPlayback
- package: FlaroKit
product: FlaroDownloads
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: com.scarriffleservices.halo
PRODUCT_NAME: Halo
PRODUCT_BUNDLE_IDENTIFIER: com.scarriffleservices.flaro
PRODUCT_NAME: Flaro
# Verweist auf AppIcon.icon. Der frühere leere AppIcon.appiconset im
# Asset-Katalog ist entfernt — zwei Dinge namens AppIcon, und Xcode
# nimmt das falsche.
@@ -75,9 +75,9 @@ targets:
TARGETED_DEVICE_FAMILY: "1,2"
CODE_SIGN_STYLE: Automatic
info:
path: Halo/Info.plist
path: Flaro/Info.plist
properties:
CFBundleDisplayName: Halo
CFBundleDisplayName: Flaro
UILaunchScreen:
UIColorName: LaunchBackground
@@ -136,25 +136,25 @@ targets:
# Freigabe. Fehlt der Text, verweigert das System sie kommentarlos und
# die Serversuche findet dauerhaft nichts.
NSLocalNetworkUsageDescription: >-
Halo benötigt Zugriff auf das lokale Netzwerk, um deinen
Flaro benötigt Zugriff auf das lokale Netzwerk, um deinen
Jellyfin-Server zu erreichen und Medien direkt von ihm zu laden.
# Die Fassung für den Fernseher.
#
# **Eigene Ansichten, geteilte Modelle.** Die Quellenpfade sind die ganze
# Aussage dieses Blocks: `HaloTV/` gehört nur hierher, `Halo/Session/`
# Aussage dieses Blocks: `FlaroTV/` gehört nur hierher, `Flaro/Session/`
# gehört beiden. Keine Datei muss dafür umziehen — XcodeGen nimmt Pfade je
# Ziel, und die iOS-Fassung sieht von der ganzen Sache nichts.
HaloTV:
FlaroTV:
type: application
platform: tvOS
# Aus demselben Grund ausgeschrieben wie bei Halo — siehe dort.
# Aus demselben Grund ausgeschrieben wie bei Flaro — siehe dort.
scheme: {}
sources:
# Die eigenen Ansichten.
- path: HaloTV
- path: FlaroTV
# Die Modelle.
- path: Halo/Session
- path: Flaro/Session
excludes:
# Ein Fernseher dreht sich nicht.
- "OrientationLock.swift"
@@ -169,60 +169,60 @@ targets:
# aufruft. Beide sind reine Übersetzer ohne UIKit.
# Reines Modell trotz des Ordnernamens: LoadState, ErrorText und
# MediaRoute liegen zusammen in einer Datei.
- path: Halo/Views/LoadState.swift
- path: Flaro/Views/LoadState.swift
type: file
# Der Player. **Ohne PlayerView** — die zeichnet auf iOS das Bild und
# alle Bedienelemente selbst; auf dem Fernseher macht das Apples
# AVPlayerViewController. Das Modell darunter ist dasselbe.
- path: Halo/Views/Player/PlayerModel.swift
- path: Flaro/Views/Player/PlayerModel.swift
type: file
- path: Halo/Views/Player/VideoSurface.swift
- path: Flaro/Views/Player/VideoSurface.swift
type: file
- path: Halo/Branding.swift
- path: Flaro/Branding.swift
type: file
# Die Texte. Dieselben Schlüssel, dieselben Übersetzungen.
- path: Halo/Resources/Localizable.xcstrings
- path: Flaro/Resources/Localizable.xcstrings
type: file
dependencies:
- package: HaloKit
- package: FlaroKit
product: MediaKit
- package: HaloKit
- package: FlaroKit
product: JellyfinKit
- package: HaloKit
product: HaloDesign
- package: HaloKit
product: HaloPlayback
- package: FlaroKit
product: FlaroDesign
- package: FlaroKit
product: FlaroPlayback
# Nur damit `PlayerModel` den Typ nennen darf. Angelegt wird nie einer:
# HaloTVApp reicht `nil` durch, und damit gibt es auf tvOS auch keinen
# FlaroTVApp reicht `nil` durch, und damit gibt es auf tvOS auch keinen
# ModelContainer und kein SwiftData.
- package: HaloKit
product: HaloDownloads
- target: HaloTopShelf
- package: FlaroKit
product: FlaroDownloads
- target: FlaroTopShelf
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: com.scarriffleservices.halo.tv
PRODUCT_NAME: Halo
PRODUCT_BUNDLE_IDENTIFIER: com.scarriffleservices.flaro.tv
PRODUCT_NAME: Flaro
# Nur Apple TV.
TARGETED_DEVICE_FAMILY: "3"
# Kein AppIcon.icon: Icon Composer deckt iOS, macOS und watchOS ab,
# tvOS nicht. Der Name zeigt auf die Brand-Assets-Gruppe im Katalog,
# und der Katalog liegt unter HaloTV/Resources.
# und der Katalog liegt unter FlaroTV/Resources.
ASSETCATALOG_COMPILER_APPICON_NAME: "App Icon & Top Shelf Image"
CODE_SIGN_STYLE: Automatic
CODE_SIGN_ENTITLEMENTS: HaloTV/Halo.entitlements
CODE_SIGN_ENTITLEMENTS: FlaroTV/Flaro.entitlements
info:
path: HaloTV/Info.plist
path: FlaroTV/Info.plist
properties:
CFBundleDisplayName: Halo
CFBundleDisplayName: Flaro
UIUserInterfaceStyle: Dark
ITSAppUsesNonExemptEncryption: false
# Über dieses Schema schickt das Regal zurück in die App. Ohne den
# Eintrag kennt tvOS es nicht, und ein Druck auf ein Plakat tut
# nichts — ohne Fehler, ohne Hinweis.
CFBundleURLTypes:
- CFBundleURLName: com.scarriffleservices.halo.topshelf
- CFBundleURLName: com.scarriffleservices.flaro.topshelf
CFBundleURLSchemes:
- halo
- flaro
# Was hier **nicht** steht, und warum:
#
# UILaunchScreen — tvOS hat kein Startbild dieser Art.
@@ -234,7 +234,7 @@ targets:
NSAppTransportSecurity:
NSAllowsLocalNetworking: true
NSLocalNetworkUsageDescription: >-
Halo benötigt Zugriff auf das lokale Netzwerk, um deinen
Flaro benötigt Zugriff auf das lokale Netzwerk, um deinen
Jellyfin-Server zu erreichen.
# Das Regal über der App im tvOS-Menü.
@@ -243,25 +243,25 @@ targets:
# läuft — und mit weniger als einer Sekunde Zeit. Sie liest deshalb nur eine
# Datei aus der App-Gruppe, die die App beim Laden der Startseite ablegt:
# kein Netz, kein Schlüsselbund, kein Blättern.
HaloTopShelf:
FlaroTopShelf:
type: tv-app-extension
platform: tvOS
sources:
- path: HaloTopShelf
- path: FlaroTopShelf
dependencies:
- package: HaloKit
- package: FlaroKit
product: MediaKit
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: com.scarriffleservices.halo.tv.topshelf
PRODUCT_NAME: HaloTopShelf
PRODUCT_BUNDLE_IDENTIFIER: com.scarriffleservices.flaro.tv.topshelf
PRODUCT_NAME: FlaroTopShelf
CODE_SIGN_STYLE: Automatic
CODE_SIGN_ENTITLEMENTS: HaloTopShelf/HaloTopShelf.entitlements
CODE_SIGN_ENTITLEMENTS: FlaroTopShelf/FlaroTopShelf.entitlements
SKIP_INSTALL: YES
info:
path: HaloTopShelf/Info.plist
path: FlaroTopShelf/Info.plist
properties:
CFBundleDisplayName: Halo
CFBundleDisplayName: Flaro
# **Die Erweiterung hat ihre eigene Info.plist.**
#
# Und damit ihre eigene Transportsicherheit: die Ausnahme in der
@@ -278,17 +278,17 @@ targets:
# Nur zum Hinsehen: fährt die App mit der Attrappe in einen bestimmten
# Zustand und hält sie dort an, damit von außen fotografiert werden kann.
# Kein Teil der App, wird nie mitgeliefert.
HaloUITests:
FlaroUITests:
type: bundle.ui-testing
platform: iOS
sources:
- HaloUITests
- FlaroUITests
dependencies:
- target: Halo
- target: Flaro
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: com.scarriffleservices.halo.uitests
TEST_TARGET_NAME: Halo
PRODUCT_BUNDLE_IDENTIFIER: com.scarriffleservices.flaro.uitests
TEST_TARGET_NAME: Flaro
TARGETED_DEVICE_FAMILY: "1,2"
CODE_SIGN_STYLE: Automatic
GENERATE_INFOPLIST_FILE: YES
@@ -303,13 +303,13 @@ targets:
sources:
- path: DownloadWidget
dependencies:
- package: HaloKit
product: HaloDownloads
- package: HaloKit
product: HaloDesign
- package: FlaroKit
product: FlaroDownloads
- package: FlaroKit
product: FlaroDesign
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: com.scarriffleservices.halo.downloadwidget
PRODUCT_BUNDLE_IDENTIFIER: com.scarriffleservices.flaro.downloadwidget
PRODUCT_NAME: DownloadWidget
CODE_SIGN_STYLE: Automatic
SKIP_INSTALL: YES
@@ -320,6 +320,6 @@ targets:
info:
path: DownloadWidget/Info.plist
properties:
CFBundleDisplayName: Halo Downloads
CFBundleDisplayName: Flaro Downloads
NSExtension:
NSExtensionPointIdentifier: com.apple.widgetkit-extension