add NabuxRemote branded configuration

This commit is contained in:
Hussain Mousavi 2026-05-30 17:26:26 +04:00
commit 71265233be
52 changed files with 137 additions and 37 deletions

7
.gitignore vendored
View file

@ -17,6 +17,11 @@ cert.pfx
*png
*svg
*jpg
!branding/
!branding/nabuxai.png
!branding/nabuxai.svg
!flutter/android/app/src/main/res/drawable-*/
!flutter/android/app/src/main/res/drawable-*/ic_launcher_foreground.png
sciter.dll
**pdb
src/bridge_generated.rs
@ -55,4 +60,4 @@ examples/**/target/
vcpkg_installed
flutter/lib/generated_plugin_registrant.dart
libsciter.dylib
flutter/web/
flutter/web/

BIN
branding/nabuxai.icns Normal file

Binary file not shown.

BIN
branding/nabuxai.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

33
branding/nabuxai.svg Normal file
View file

@ -0,0 +1,33 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<defs>
<radialGradient id="space" cx="50%" cy="42%" r="65%">
<stop offset="0%" stop-color="#07336b"/>
<stop offset="58%" stop-color="#03162f"/>
<stop offset="100%" stop-color="#01050d"/>
</radialGradient>
<linearGradient id="orbit" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#00d9ff"/>
<stop offset="55%" stop-color="#75fff5"/>
<stop offset="100%" stop-color="#ffd15a"/>
</linearGradient>
</defs>
<rect width="512" height="512" rx="96" fill="url(#space)"/>
<circle cx="256" cy="226" r="154" fill="none" stroke="url(#orbit)" stroke-width="12"/>
<g fill="none" stroke="#54eeff" stroke-linecap="round" stroke-width="7">
<path d="M115 228h282"/>
<path d="M164 123l184 214"/>
<path d="M169 329c61-7 121-39 176-136"/>
<path d="M201 113c-14 74 5 146 89 218"/>
</g>
<g fill="#eaffff" stroke="#54eeff" stroke-width="5">
<circle cx="156" cy="228" r="13"/>
<circle cx="217" cy="184" r="19"/>
<circle cx="270" cy="229" r="16"/>
<circle cx="329" cy="228" r="23"/>
<circle cx="288" cy="153" r="14"/>
<circle cx="247" cy="291" r="20"/>
<circle cx="309" cy="278" r="13"/>
</g>
<text x="256" y="421" fill="#ffd15a" font-family="Arial, sans-serif" font-size="48" letter-spacing="12" text-anchor="middle">NABUX</text>
<text x="256" y="463" fill="#eaffff" font-family="Arial, sans-serif" font-size="20" letter-spacing="9" text-anchor="middle">REMOTE</text>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View file

@ -13,7 +13,8 @@ validate a config without modifying the source tree.
The script configures application metadata, platform IDs, URL schemes, launcher
icons, an optional SVG `ui_logo`, default or forced server settings, and an
optional update-check endpoint.
optional update-check endpoint. For the legacy macOS runner, provide an optional
`mac_icns` path to replace `flutter/macos/Runner/AppIcon.icns`.
The update-check endpoint must accept the same POST request and return the same
JSON response shape as the RustDesk version endpoint. For Windows, placeholders

View file

@ -97,7 +97,7 @@ android {
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.carriez.flutter_hbb"
applicationId "com.nabuxai.nabuxremote"
minSdkVersion 22
targetSdkVersion 33
versionCode flutterVersionCode.toInteger()

View file

@ -25,7 +25,7 @@
<application
android:name=".MainApplication"
android:icon="@mipmap/ic_launcher"
android:label="RustDesk"
android:label="@string/app_name"
android:requestLegacyExternalStorage="true"
android:roundIcon="@mipmap/ic_launcher"
android:supportsRtl="true">
@ -76,7 +76,7 @@
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="rustdesk" />
<data android:scheme="nabuxremote" />
</intent-filter>
</activity>

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 254 KiB

View file

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
<monochrome android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 9.5 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 56 KiB

Before After
Before After

View file

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="primary">#FF0071FF</color>
<color name="ic_launcher_background">#000000</color>
</resources>

View file

@ -1,4 +1,4 @@
<resources>
<string name="app_name">RustDesk</string>
<string name="app_name">NabuxRemote</string>
<string name="accessibility_service_description">Allow other devices to control your phone using virtual touch, when RustDesk screen sharing is established</string>
</resources>

View file

@ -1 +1,33 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" viewBox="66.993 897.484 26 26"><linearGradient id="a" x1=".148" x2=".845" y1=".851" y2=".154" gradientTransform="matrix(26.301 0 0 26.331 90.674 911.757)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#0071ff"/><stop offset="1" stop-color="#00bfe1"/></linearGradient><defs><linearGradient xlink:href="#a" id="b" x1=".148" x2=".845" y1=".851" y2=".154" gradientTransform="matrix(26.00048 0 0 25.99935 66.993 897.485)" gradientUnits="userSpaceOnUse"/></defs><path fill="url(#b)" d="m89.318 903.552-2.135 2.122c-.376.337-.558.879-.347 1.337 1.422 2.976.882 6.524-1.452 8.856-2.335 2.331-5.887 2.87-8.866 1.449-.439-.197-.954-.03-1.292.312l-2.17 2.167a1.154 1.154 0 0 0 .208 1.81 13.005 13.005 0 0 0 15.91-1.912 12.97 12.97 0 0 0 1.956-15.887 1.154 1.154 0 0 0-1.812-.254zm-18.467-2.305a12.969 12.969 0 0 0-2.02 15.885 1.154 1.154 0 0 0 1.812.254l2.124-2.11c.385-.336.572-.884.359-1.348-1.423-2.976-.884-6.524 1.451-8.856 2.334-2.332 5.887-2.871 8.866-1.45.434.194.942.033 1.281-.3l2.182-2.18a1.152 1.152 0 0 0-.208-1.81 13.009 13.009 0 0 0-15.893 1.973z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<defs>
<radialGradient id="space" cx="50%" cy="42%" r="65%">
<stop offset="0%" stop-color="#07336b"/>
<stop offset="58%" stop-color="#03162f"/>
<stop offset="100%" stop-color="#01050d"/>
</radialGradient>
<linearGradient id="orbit" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#00d9ff"/>
<stop offset="55%" stop-color="#75fff5"/>
<stop offset="100%" stop-color="#ffd15a"/>
</linearGradient>
</defs>
<rect width="512" height="512" rx="96" fill="url(#space)"/>
<circle cx="256" cy="226" r="154" fill="none" stroke="url(#orbit)" stroke-width="12"/>
<g fill="none" stroke="#54eeff" stroke-linecap="round" stroke-width="7">
<path d="M115 228h282"/>
<path d="M164 123l184 214"/>
<path d="M169 329c61-7 121-39 176-136"/>
<path d="M201 113c-14 74 5 146 89 218"/>
</g>
<g fill="#eaffff" stroke="#54eeff" stroke-width="5">
<circle cx="156" cy="228" r="13"/>
<circle cx="217" cy="184" r="19"/>
<circle cx="270" cy="229" r="16"/>
<circle cx="329" cy="228" r="23"/>
<circle cx="288" cy="153" r="14"/>
<circle cx="247" cy="291" r="20"/>
<circle cx="309" cy="278" r="13"/>
</g>
<text x="256" y="421" fill="#ffd15a" font-family="Arial, sans-serif" font-size="48" letter-spacing="12" text-anchor="middle">NABUX</text>
<text x="256" y="463" fill="#eaffff" font-family="Arial, sans-serif" font-size="20" letter-spacing="9" text-anchor="middle">REMOTE</text>
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Before After
Before After

View file

@ -434,7 +434,7 @@
"-framework",
"\"wakelock_plus\"",
);
PRODUCT_BUNDLE_IDENTIFIER = com.carriez.flutterHbb;
PRODUCT_BUNDLE_IDENTIFIER = com.nabuxai.nabuxremote;
PRODUCT_NAME = "$(TARGET_NAME)";
STRIP_STYLE = "non-global";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@ -630,7 +630,7 @@
"-framework",
"\"wakelock_plus\"",
);
PRODUCT_BUNDLE_IDENTIFIER = com.carriez.flutterHbb;
PRODUCT_BUNDLE_IDENTIFIER = com.nabuxai.nabuxremote;
PRODUCT_NAME = "$(TARGET_NAME)";
STRIP_STYLE = "non-global";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@ -718,7 +718,7 @@
"-framework",
"\"wakelock_plus\"",
);
PRODUCT_BUNDLE_IDENTIFIER = com.carriez.flutterHbb;
PRODUCT_BUNDLE_IDENTIFIER = com.nabuxai.nabuxremote;
PRODUCT_NAME = "$(TARGET_NAME)";
STRIP_STYLE = "non-global";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 1.3 MiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 511 B

After

Width:  |  Height:  |  Size: 1 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 989 B

After

Width:  |  Height:  |  Size: 3.3 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 6.9 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 755 B

After

Width:  |  Height:  |  Size: 1.9 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 6.5 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 989 B

After

Width:  |  Height:  |  Size: 3.3 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 50 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 37 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Before After
Before After

View file

@ -7,7 +7,7 @@
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>RustDesk</string>
<string>NabuxRemote</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
@ -15,7 +15,7 @@
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>RustDesk</string>
<string>NabuxRemote</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
@ -32,10 +32,10 @@
<key>CFBundleURLIconFile</key>
<string></string>
<key>CFBundleURLName</key>
<string>com.carriez.rustdesk</string>
<string>com.nabuxai.nabuxremote</string>
<key>CFBundleURLSchemes</key>
<array>
<string>rustdesk</string>
<string>nabuxremote</string>
</array>
</dict>
</array>

View file

@ -7,7 +7,7 @@ project(runner LANGUAGES C CXX)
set(BINARY_NAME "rustdesk")
# The unique GTK application identifier for this application. See:
# https://wiki.gnome.org/HowDoI/ChooseApplicationID
set(APPLICATION_ID "com.carriez.flutter_hbb")
set(APPLICATION_ID "com.nabuxai.nabuxremote")
# Explicitly opt into modern CMake behaviors to avoid warnings with recent
# versions of CMake.

Binary file not shown.

View file

@ -5,10 +5,10 @@
// 'flutter create' template.
// The application's name. By default this is also the title of the Flutter window.
PRODUCT_NAME = RustDesk
PRODUCT_NAME = NabuxRemote
// The application's bundle identifier
PRODUCT_BUNDLE_IDENTIFIER = com.carriez.flutterHbb
PRODUCT_BUNDLE_IDENTIFIER = com.nabuxai.nabuxremote
// The copyright displayed in application information
PRODUCT_COPYRIGHT = Copyright © 2025 Purslane Ltd. All rights reserved.
PRODUCT_COPYRIGHT = Copyright (c) 2026 Nabux AI. All rights reserved.

View file

@ -26,10 +26,10 @@
<key>CFBundleURLIconFile</key>
<string></string>
<key>CFBundleURLName</key>
<string>com.carriez.rustdesk</string>
<string>com.nabuxai.nabuxremote</string>
<key>CFBundleURLSchemes</key>
<array>
<string>rustdesk</string>
<string>nabuxremote</string>
</array>
</dict>
</array>

View file

@ -128,6 +128,8 @@ dependency_overrides:
flutter_icons:
image_path: "../res/icon.png"
remove_alpha_ios: true
adaptive_icon_background: "#000000"
adaptive_icon_foreground: "../res/icon.png"
android: true
ios: true
windows:

View file

@ -89,13 +89,13 @@ BEGIN
BEGIN
BLOCK "040904e4"
BEGIN
VALUE "CompanyName", "Purslane Ltd" "\0"
VALUE "FileDescription", "RustDesk Remote Desktop" "\0"
VALUE "CompanyName", "Nabux AI" "\0"
VALUE "FileDescription", "NabuxRemote Remote Desktop" "\0"
VALUE "FileVersion", VERSION_AS_STRING "\0"
VALUE "InternalName", "rustdesk" "\0"
VALUE "LegalCopyright", "Copyright © 2025 Purslane Ltd. All rights reserved." "\0"
VALUE "LegalCopyright", "Copyright (c) 2026 Nabux AI. All rights reserved." "\0"
VALUE "OriginalFilename", "rustdesk.exe" "\0"
VALUE "ProductName", "RustDesk" "\0"
VALUE "ProductName", "NabuxRemote" "\0"
VALUE "ProductVersion", VERSION_AS_STRING "\0"
END
END

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 1.9 MiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 1.9 MiB

Before After
Before After

View file

@ -18,7 +18,9 @@ pub fn apply() {
.extend(to_owned_settings(generated::OVERRIDE_SETTINGS));
}
fn to_owned_settings(settings: &[(&str, &str)]) -> impl Iterator<Item = (String, String)> + '_ {
fn to_owned_settings<'a>(
settings: &'a [(&'a str, &'a str)],
) -> impl Iterator<Item = (String, String)> + 'a {
settings
.iter()
.map(|(key, value)| ((*key).to_owned(), (*value).to_owned()))

View file

@ -1,5 +1,5 @@
// Generated by tools/white_label.py. Do not edit by hand.
pub const APP_NAME: &str = "";
pub const APP_NAME: &str = "NabuxRemote";
pub const UPDATE_CHECK_URL: &str = "";
pub const WINDOWS_DOWNLOAD_URL_TEMPLATE: &str = "";
pub const DEFAULT_SETTINGS: &[(&str, &str)] = &[];

View file

@ -63,6 +63,11 @@ def rust_pairs(value: Any, name: str) -> str:
)
def rust_array(value: Any, name: str) -> str:
pairs = rust_pairs(value, name)
return f"&[\n {pairs},\n]" if pairs else "&[]"
def write_generated_rust(config: dict[str, Any]) -> None:
update = config.get("updates") or {}
if not isinstance(update, dict):
@ -71,12 +76,8 @@ def write_generated_rust(config: dict[str, Any]) -> None:
pub const APP_NAME: &str = {rust_string(config["app_name"])};
pub const UPDATE_CHECK_URL: &str = {rust_string(update.get("check_url", ""))};
pub const WINDOWS_DOWNLOAD_URL_TEMPLATE: &str = {rust_string(update.get("windows_download_url_template", ""))};
pub const DEFAULT_SETTINGS: &[(&str, &str)] = &[
{rust_pairs(config.get("default_settings"), "default_settings")}
];
pub const OVERRIDE_SETTINGS: &[(&str, &str)] = &[
{rust_pairs(config.get("override_settings"), "override_settings")}
];
pub const DEFAULT_SETTINGS: &[(&str, &str)] = {rust_array(config.get("default_settings"), "default_settings")};
pub const OVERRIDE_SETTINGS: &[(&str, &str)] = {rust_array(config.get("override_settings"), "override_settings")};
"""
(ROOT / "src/white_label_generated.rs").write_text(generated, encoding="utf-8")
@ -103,9 +104,19 @@ def copy_icons(config: dict[str, Any], config_path: Path, generate_icons: bool)
fail(f"mac_icon does not exist: {mac_icon_path}")
shutil.copyfile(mac_icon_path, ROOT / "res/mac-icon.png")
mac_icns = config.get("mac_icns")
if mac_icns:
mac_icns_path = (config_path.parent / mac_icns).resolve()
if not mac_icns_path.is_file():
fail(f"mac_icns does not exist: {mac_icns_path}")
shutil.copyfile(mac_icns_path, ROOT / "flutter/macos/Runner/AppIcon.icns")
if generate_icons:
dart = shutil.which("dart")
if not dart:
fail("dart is required to generate platform icons")
subprocess.run(
["dart", "run", "flutter_launcher_icons"],
[dart, "run", "flutter_launcher_icons"],
cwd=ROOT / "flutter",
check=True,
)

View file

@ -6,6 +6,7 @@
"copyright": "Copyright (c) 2026 Acme Inc. All rights reserved.",
"icon": "branding/acmedesk.png",
"mac_icon": "branding/acmedesk-macos.png",
"mac_icns": "branding/acmedesk-macos.icns",
"ui_logo": "branding/acmedesk.svg",
"updates": {
"check_url": "https://updates.example.com/version/latest",

13
white_label.nabuxai.json Normal file
View file

@ -0,0 +1,13 @@
{
"app_name": "NabuxRemote",
"bundle_id": "com.nabuxai.nabuxremote",
"url_scheme": "nabuxremote",
"company_name": "Nabux AI",
"copyright": "Copyright (c) 2026 Nabux AI. All rights reserved.",
"icon": "branding/nabuxai.png",
"mac_icon": "branding/nabuxai.png",
"mac_icns": "branding/nabuxai.icns",
"ui_logo": "branding/nabuxai.svg",
"default_settings": {},
"override_settings": {}
}