White-Label & Branding#
Hinata ist eine White-Label-Plattform: Du betreibst deinen eigenen Server und kannst deinen eigenen gebrandeten Client unter deinem eigenen Namen in den App Stores ausliefern. Weil die native App keine einkompilierte Server-URL trägt, kann eine einzige veröffentlichte App über das Hinata Connect Gateway jedem Betreiber dienen — es steht dir aber genauso frei, deine eigene App zu bauen und zu veröffentlichen. Diese Seite ist der praktische Leitfaden dazu.
Open Source, GPL-3.0
Der Client ist unter GPL-3.0 lizenziert. Du darfst ihn neu branden, modifizieren und verteilen, sofern du die Lizenz einhältst — vor allem musst du deinen entsprechenden Quellcode deinen Benutzern zu denselben Bedingungen zur Verfügung stellen.
Die Zero-Build-Option: die gehostete Web-App#
Bevor du irgendetwas baust, überlege, ob du überhaupt eine native App brauchst. Das
Server-Repository liefert docker-compose.app.yml, ein Overlay, das den
kompilierten Flutter-Web-Client als statische Dateien unter deiner eigenen
Domain ausliefert, z. B. https://track.example.com.
docker compose -f docker-compose.yml -f docker-compose.app.yml up -d
Das gibt Benutzern eine gebrandete URL im Browser mit nichts zu installieren und nichts zu bauen. Der Web-Build zeigt auf die API, für die er konfiguriert ist, sodass viele Betreiber nur dies betreiben und mobile Benutzer über die veröffentlichten Apps erreichen lassen. Greife zu einem eigenen nativen Build, wenn du gezielt deine eigene Store-Präsenz, dein eigenes Icon und deinen eigenen Namen brauchst.
Was du änderst#
Ein White-Label-Client ist ein Fork von hinata-app, bei dem eine Handvoll Identitätswerte ausgetauscht sind. Es gibt fünf Dinge zu ändern.
| # | Was | Wo |
|---|---|---|
| 1 | Package- / Bundle-ID | com.yourorg.yourapp — Android applicationId + namespace, iOS/macOS PRODUCT_BUNDLE_IDENTIFIER |
| 2 | App-Anzeigename | Android android:label, iOS/macOS Anzeigename |
| 3 | Icons & Splash | assets/branding/ + flutter_launcher_icons / flutter_native_splash |
| 4 | Akzentfarbe | das Honig-Amber-Akzent-Token #D9A032 im Theme |
| 5 | Gateway | auf das Hinata Connect Gateway (oder dein eigenes) zeigen |
1 — Package- / Bundle-ID#
Wähle einen Reverse-DNS-Identifier, den du besitzt, z. B. com.yourorg.yourapp,
und setze ihn überall:
// android/app/build.gradle.kts
android {
namespace = "com.yourorg.yourapp"
defaultConfig {
applicationId = "com.yourorg.yourapp"
}
}
Für iOS und macOS setzt du PRODUCT_BUNDLE_IDENTIFIER im Xcode-Projekt
(Runner-Target). Diese ID ist nach der Veröffentlichung in einem Store permanent —
wähle sorgfältig.
2 — App-Anzeigename#
Setze den sichtbaren Namen, der unter dem Icon angezeigt wird:
<!-- android/app/src/main/AndroidManifest.xml -->
<application android:label="Your App Name" ... >
Unter iOS/macOS setzt du den Anzeigenamen in den Info-Einstellungen des Runner-Targets.
3 — Icons & Splash#
Lege dein Artwork in assets/branding/ (App-Icon, adaptiver Vordergrund, Splash)
und generiere die nativen Assets mit dem bereits in pubspec.yaml verdrahteten
Tooling neu:
dart run flutter_launcher_icons # App-Icons neu generieren (android/ios/web/macos)
dart run flutter_native_splash:create # Splash-Screens neu generieren
Die Blöcke flutter_launcher_icons und flutter_native_splash in pubspec.yaml
steuern die Quellbilder und Hintergrundfarben (hell #F4F3EF, dunkel #131119
standardmäßig) — passe sie an deine Marke an und lass die Generatoren dann erneut
laufen.
4 — Akzentfarbe#
Der charakteristische Honig-Amber-Akzent lebt als Farb-Token im Theme
(lib/core/theme/app_colors.dart, accent = Color(0xFFD9A032)). Ändere ihn in
deine Markenfarbe; das Token wird app-weit konsumiert, sodass eine einzige
Bearbeitung Buttons, Highlights und aktive Zustände neu einfärbt. Wähle einen
Farbton mit genug Kontrast, um in beiden Modi, hell und dunkel, lesbar zu sein.
5 — Auf ein Gateway zeigen#
Push-Benachrichtigungen und Universal Links werden über das
Hinata Connect Gateway weitergeleitet, sodass
Self-Hoster kein eigenes Firebase-Projekt brauchen. Deine gebrandete App
registriert sich gegen ein Gateway; nutze das standardmäßige öffentliche Gateway
oder betreibe dein eigenes und setze HINATA_GATEWAY_BASE_URL auf deinem Server.
Der Server registriert sich beim Start selbst beim Gateway.
Deep Links & Universal Links#
Damit https://track.example.com/...-Links deine App statt eines Browser-Tabs
öffnen, lieferst du zwei Zuordnungsdateien aus und deklarierst die Fähigkeit in der
App.
- Android App Links — eine
assetlinks.json, ausgeliefert unterhttps://track.example.com/.well-known/assetlinks.json, die deinenpackage_nameund die SHA-256-Fingerprints deines Release-Signaturschlüssels auflistet. - iOS Universal Links — eine
apple-app-site-association(AASA)-Datei, ausgeliefert unterhttps://track.example.com/.well-known/apple-app-site-association, die deineappID(TEAMID.com.yourorg.yourapp) und die zu erfassenden URL-Pfade auflistet.
Beide Dateien werden vom Web-Image ausgeliefert, sodass ihr Hosting automatisch
erfolgt, sobald die Web-App unter deiner Domain läuft. Beispiel
assetlinks.json:
[
{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.yourorg.yourapp",
"sha256_cert_fingerprints": [
"AA:BB:CC:...:release-signing-key-sha256"
]
}
}
]
Verwende die SHA-256 deines Release-Schlüssels, nicht des Debug-Schlüssels
Android verifiziert App Links gegen den Fingerprint des Schlüssels, der die
installierte APK/AAB signiert hat. Liste die SHA-256 deines
Play-Release-Signaturschlüssels (Upload) in assetlinks.json auf, sonst fallen
Links stillschweigend auf den Browser zurück. Du kannst mehrere Fingerprints
(Debug, Upload, Play-managed) nebeneinander auflisten.
iOS braucht die Associated-Domains-Fähigkeit
Universal Links funktionieren nur, wenn die App die Domain in ihrem
Associated Domains-Entitlement (applinks:track.example.com) deklariert
und diese Fähigkeit im Provisioning Profile aktiviert ist. Ohne sie ruft iOS
deine AASA-Datei nie ab.
Store-Releases brauchen eine Datenschutzerklärung#
Sowohl Apples App Store als auch Google Play verlangen für die Prüfung eine
erreichbare URL zur Datenschutzerklärung, und du brauchst sie ohnehin für die
DSGVO-Konformität. Hinata zeigt diese URL in der App über die Servereinstellung
HINATA_PRIVACY_POLICY_URL an (auch live im Adminbereich →
App-Einstellungen editierbar). Setze sie, bevor du einreichst.
Barrierefreiheit ist Teil der Konformität
Die Oberfläche ist mit Blick auf Barrierefreiheit gebaut — skalierbarer Text, semantische Widgets und ausreichender Kontrast. Behalte das im Kopf, wenn du deine Akzentfarbe und eigene Texte wählst.
Branding-Checkliste#
Arbeite von oben nach unten; jeder Schritt ist unabhängig.
- Forke hinata-app und halte GPL-3.0 ein.
- Setze die Package-/Bundle-ID (
com.yourorg.yourapp) auf Android, iOS und macOS. - Setze den App-Anzeigenamen auf jeder Plattform.
- Ersetze das Artwork in
assets/branding/und lass die Icon- + Splash-Generatoren laufen. - Ändere das Akzentfarb-Token im Theme; verifiziere den hellen und dunklen Modus.
- Entscheide dich für dein Gateway — Standard oder dein eigenes über
HINATA_GATEWAY_BASE_URL. - Liefere
assetlinks.json+ AASA unterhttps://track.example.com/.well-known/aus (das Web-Image erledigt das) und liste deine Release-Schlüssel-SHA-256 auf. - Aktiviere die Associated Domains-Fähigkeit für iOS Universal Links.
- Setze
HINATA_PRIVACY_POLICY_URLauf dem Server. - Baue, signiere und reiche bei den Stores ein.
Wie es weitergeht#
- Die Apps — wie sich der Client verbindet, Versionen sperrt und Server verwaltet.
- Hinata Connect Gateway — Push- + Universal-Link-Relay.
- Konfigurationsreferenz — jede Servereinstellung.