White-label & branding#
Hinata is a white-label platform: you run your own server, and you can ship your own branded client under your own name in the app stores. Because the native app carries no baked-in server URL, a single published app can serve every operator through the Hinata Connect gateway — but you are equally free to build and publish your own. This page is the practical guide to doing exactly that.
Open source, GPL-3.0
The client is licensed GPL-3.0. You may rebrand, modify and distribute it, provided you honor the license — chiefly, make your corresponding source available to your users under the same terms.
The zero-build option: the hosted web app#
Before you build anything, consider whether you even need a native app. The
server repository ships docker-compose.app.yml, an overlay that serves the
compiled Flutter web client as static files at your own domain, e.g.
https://track.example.com.
docker compose -f docker-compose.yml -f docker-compose.app.yml up -d
This gives users a branded URL in the browser with nothing to install and nothing to build. The web build points at whatever API it is configured for, so many operators run only this and let mobile users reach them through the published apps. Reach for a custom native build when you specifically need your own store presence, icon and name.
What you change#
A white-label client is a fork of hinata-app with a handful of identity values swapped. There are five things to change.
| # | What | Where |
|---|---|---|
| 1 | Package / bundle id | com.yourorg.yourapp — Android applicationId + namespace, iOS/macOS PRODUCT_BUNDLE_IDENTIFIER |
| 2 | App display name | Android android:label, iOS/macOS display name |
| 3 | Icons & splash | assets/branding/ + flutter_launcher_icons / flutter_native_splash |
| 4 | Accent color | the honey-amber #D9A032 accent token in the theme |
| 5 | Gateway | point at the Hinata Connect gateway (or your own) |
1 — Package / bundle id#
Pick a reverse-DNS identifier you own, e.g. com.yourorg.yourapp, and set it
everywhere:
// android/app/build.gradle.kts
android {
namespace = "com.yourorg.yourapp"
defaultConfig {
applicationId = "com.yourorg.yourapp"
}
}
For iOS and macOS, set PRODUCT_BUNDLE_IDENTIFIER in the Xcode project (Runner
target). This id is permanent once published to a store — choose carefully.
2 — App display name#
Set the visible name shown under the icon:
<!-- android/app/src/main/AndroidManifest.xml -->
<application android:label="Your App Name" ... >
On iOS/macOS set the display name in the Runner target's Info settings.
3 — Icons & splash#
Drop your artwork into assets/branding/ (app icon, adaptive foreground,
splash) and regenerate the native assets with the tooling already wired into
pubspec.yaml:
dart run flutter_launcher_icons # regenerate app icons (android/ios/web/macos)
dart run flutter_native_splash:create # regenerate splash screens
The flutter_launcher_icons and flutter_native_splash blocks in pubspec.yaml
control the source images and background colors (light #F4F3EF, dark #131119
by default) — edit them to your brand, then re-run the generators.
4 — Accent color#
The signature honey-amber accent lives as a color token in the theme
(lib/core/theme/app_colors.dart, accent = Color(0xFFD9A032)). Change it to
your brand color; the token is consumed app-wide, so a single edit re-tints
buttons, highlights and active states. Pick a hue with enough contrast to read in
both light and dark mode.
5 — Point at a gateway#
Push notifications and universal links are relayed through the
Hinata Connect gateway, so self-hosters need no
Firebase project of their own. Your branded app registers against a gateway; use
the default public gateway or run your own and set HINATA_GATEWAY_BASE_URL on
your server. The server registers itself with the gateway on boot.
Deep links & universal links#
To make https://track.example.com/... links open your app instead of a browser
tab, you serve two association files and declare the capability in the app.
- Android App Links — an
assetlinks.jsonserved athttps://track.example.com/.well-known/assetlinks.json, listing yourpackage_nameand the SHA-256 fingerprints of your release signing key. - iOS Universal Links — an
apple-app-site-association(AASA) file served athttps://track.example.com/.well-known/apple-app-site-association, listing yourappID(TEAMID.com.yourorg.yourapp) and the URL paths to capture.
Both files are served by the web image, so hosting them is automatic once the
web app runs at your domain. Example 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"
]
}
}
]
Use your release key's SHA-256, not the debug key
Android verifies App Links against the fingerprint of the key that signed
the installed APK/AAB. List your Play release (upload) signing key's SHA-256
in assetlinks.json, or links will silently fall back to the browser. You can
list several fingerprints (debug, upload, Play-managed) side by side.
iOS needs the Associated Domains capability
Universal Links only work if the app declares the domain in its
Associated Domains entitlement (applinks:track.example.com) and that
capability is enabled in the provisioning profile. Without it, iOS never
fetches your AASA file.
Store releases need a privacy policy#
Both Apple's App Store and Google Play require a reachable privacy policy URL
for review, and you need one for GDPR/DSGVO compliance anyway. Hinata surfaces
this URL in the app from the server setting HINATA_PRIVACY_POLICY_URL (also
editable live in the Admin area → App settings). Set it
before you submit.
Accessibility is part of compliance
The UI is built to be accessibility-minded — scalable text, semantic widgets and sufficient contrast. Keep that in mind when you choose your accent color and any custom copy.
Branding checklist#
Work top to bottom; each step is independent.
- Fork hinata-app and honor GPL-3.0.
- Set the package/bundle id (
com.yourorg.yourapp) on Android, iOS and macOS. - Set the app display name on every platform.
- Replace the artwork in
assets/branding/and run the icon + splash generators. - Change the accent color token in the theme; verify light and dark mode.
- Decide your gateway — default, or your own via
HINATA_GATEWAY_BASE_URL. - Serve
assetlinks.json+ AASA athttps://track.example.com/.well-known/(the web image does this) and list your release key SHA-256. - Enable the Associated Domains capability for iOS Universal Links.
- Set
HINATA_PRIVACY_POLICY_URLon the server. - Build, sign and submit to the stores.
Where to go next#
- The apps — how the client connects, gates versions and manages servers.
- Hinata Connect gateway — push + universal-link relay.
- Configuration reference — every server setting.