Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
5aed09d
Show address-book display name boldly and add DCS Norway logo
cursoragent Aug 10, 2026
435a4bd
Refine DCS Norway branding and address-book labels
cursoragent Aug 10, 2026
4dab8f7
Handle empty currentUser responses without FormatException
cursoragent Aug 10, 2026
a556b14
Fix peer display names and NAT punch overflow panic
cursoragent Aug 10, 2026
c289a38
Replace connection UI logo with official Hetlebakken emblem
cursoragent Aug 10, 2026
cab6304
Hide Printer settings and customize About for DCS Norway
cursoragent Aug 10, 2026
3adf496
Drop unused url_launcher_string imports after About cleanup
cursoragent Aug 10, 2026
2291018
Apply Betterdesk AB passwords on first connect
cursoragent Aug 10, 2026
c3e3b05
Show AB alias on Recent peer cards instead of hostname
cursoragent Aug 10, 2026
0246e62
Fix Recent cards to use Betterdesk device alias/note
cursoragent Aug 10, 2026
aa89ee2
Fail fast from direct peer connect to relay in 3s
cursoragent Aug 10, 2026
ff67ae4
Keep Betterdesk display names on Recent cards after logout
cursoragent Aug 10, 2026
a2f8ccd
Add RdClient-style desktop home shell while keeping RustDesk peer/con…
Chesster1981 Aug 10, 2026
7f60e52
Fix GetX Obx errors in RdClient sidebar and force dark home chrome.
Chesster1981 Aug 10, 2026
593f4b1
Fix GetX Obx errors in RdClient sidebar and force dark home chrome.
Chesster1981 Aug 10, 2026
718a1bc
Strip pure-client UI: no manual connect, Your Desktop, service footer…
Chesster1981 Aug 10, 2026
17f3bf6
Add home account/login status bar and hide Auto update in General set…
Chesster1981 Aug 10, 2026
6276eea
Hide Security settings for pure client and dark-theme overlay dialogs.
Chesster1981 Aug 10, 2026
90eb188
Give Groups sidebar matching margins and denser item spacing.
Chesster1981 Aug 10, 2026
2e0d51b
Hide Account settings tab when login lives on the home account bar.
Chesster1981 Aug 10, 2026
e64062f
Identify as DCS Norway and send app_name on API login/sysinfo.
Chesster1981 Aug 10, 2026
6f629e7
Use DCS-Norway APP_NAME so Windows installer validation passes.
Chesster1981 Aug 10, 2026
e8ef62e
Name installed Windows exe DCS-Norway-RD.exe and rename on install.
Chesster1981 Aug 10, 2026
5db92b4
Polish RdClient install and home branding.
Chesster1981 Aug 10, 2026
5a700ba
Add GitHub Releases in-app updates for DCS Windows clients.
Chesster1981 Aug 11, 2026
86800ce
Fix DCS release dispatch when workflow is not on default branch.
Chesster1981 Aug 11, 2026
5a073b8
Fix windows-only matrix filtering for reusable Flutter build workflow.
Chesster1981 Aug 11, 2026
4e3e524
Emit Windows CI matrix from a prepare job for windows-only builds.
Chesster1981 Aug 11, 2026
53dd6e5
Avoid needs-based matrix on reusable TopMostWindow workflow call.
Chesster1981 Aug 11, 2026
5dfdace
Simplify DCS release CI: drop windows-only matrix hacks that broke wo…
Chesster1981 Aug 11, 2026
a7ba382
Temporarily smoke-test DCS release workflow without reusable build call.
Chesster1981 Aug 11, 2026
dcf1df3
Restore DCS Windows Release to call Flutter build and publish install…
Chesster1981 Aug 11, 2026
63ee709
Call stock Flutter build from DCS release without release-version input.
Chesster1981 Aug 11, 2026
667a8dd
Grant contents:write to DCS release caller so Flutter SBOM/release jo…
Chesster1981 Aug 11, 2026
e17ca07
Commit Cargo.lock after 1.4.10 bump so CI --locked builds succeed.
Chesster1981 Aug 11, 2026
e8bd214
Brand Android as DCS Norway Remote Desktop Client.
cursoragent Aug 12, 2026
894dcbf
Add DCS logo.png asset used by Flutter loadLogo().
cursoragent Aug 12, 2026
ddba59a
Pin file_picker to 5.5.0 for Flutter 3.24 Android builds.
cursoragent Aug 13, 2026
d8f0986
Add DCS Norway Android x86_64 debug APK with native libs.
cursoragent Aug 13, 2026
c03adeb
Document DCS Norway Android APK on GitHub Releases.
cursoragent Aug 13, 2026
c699203
Brand Linux, macOS, and iOS as DCS Norway RD Client.
cursoragent Aug 16, 2026
cddb34b
Add iPad IPA publish path and tablet layout for DCS Norway.
cursoragent Aug 16, 2026
851a23d
Stop publishing the Android x86_64 emulator APK.
cursoragent Aug 16, 2026
e1ec70e
Stop publishing iOS builds on GitHub.
cursoragent Aug 16, 2026
f616144
Update DCS Norway logo and two-line home title.
cursoragent Aug 16, 2026
e899b5b
Release 1.4.11 with DCS-named Windows, Android, Linux, and macOS assets.
cursoragent Aug 16, 2026
eac79e4
Skip the armv7 Sciter job so DCS releases can finish.
cursoragent Aug 16, 2026
ec47921
Refresh DCS Norway emblem and release 1.4.12.
cursoragent Aug 16, 2026
3428ff0
Drop the armv7 Sciter matrix cell that blocked tag builds.
cursoragent Aug 16, 2026
812818b
Grant Full Flutter CI the permissions flutter-build.yml requires.
cursoragent Aug 16, 2026
61a81a0
Skip macOS CI and release jobs.
cursoragent Aug 16, 2026
2dd9115
Use the uploaded DCS Norway emblem with white sky and transparent cor…
cursoragent Aug 16, 2026
ee9b83f
Prompt for GitHub updates at startup and hourly.
cursoragent Aug 17, 2026
abc1a7c
Use the same in-app update flow on Windows, Linux, and Android.
cursoragent Aug 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
109 changes: 109 additions & 0 deletions .github/workflows/dcs-windows-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
# DCS Norway Windows release — tag builds publish portable installer to GitHub Releases.
# Clients check Chesster1981/RustDesk releases (not rustdesk.com).
name: DCS Windows Release

on:
workflow_dispatch:
inputs:
release_tag:
description: "Git tag / asset version (e.g. 1.4.10). Required when not running from a tag ref."
required: false
type: string
default: ""
push:
tags:
- 'v[0-9]+.[0-9]+.[0-9]+'
- '[0-9]+.[0-9]+.[0-9]+'
- 'v[0-9]+.[0-9]+.[0-9]+-[0-9]+'
- '[0-9]+.[0-9]+.[0-9]+-[0-9]+'
- 'dcs-v[0-9]+.[0-9]+.[0-9]+'
- 'dcs-[0-9]+.[0-9]+.[0-9]+'
- 'dcs-v[0-9]+.[0-9]+.[0-9]+-[0-9]+'
- 'dcs-[0-9]+.[0-9]+.[0-9]+-[0-9]+'

# Reusable flutter-build.yml jobs (SBOM / softprops release) need contents:write.
permissions:
contents: write
actions: read

jobs:
resolve-version:
runs-on: ubuntu-latest
outputs:
version: ${{ steps.ver.outputs.version }}
tag: ${{ steps.ver.outputs.tag }}
steps:
- id: ver
shell: bash
env:
INPUT_TAG: ${{ inputs.release_tag }}
run: |
set -euo pipefail
TAG="${INPUT_TAG:-}"
if [ -z "$TAG" ]; then
if [[ "${GITHUB_REF}" == refs/tags/* ]]; then
TAG="${GITHUB_REF_NAME}"
else
echo "::error::Set workflow_dispatch input release_tag (e.g. 1.4.10), or push a version tag."
exit 1
fi
fi
# Asset filenames must use the same string as the release tag path segment
# (updater builds rustdesk-{tag}-x86_64.exe from the release page URL).
echo "tag=${TAG}" >> "$GITHUB_OUTPUT"
echo "version=${TAG}" >> "$GITHUB_OUTPUT"
echo "Release tag/version=${TAG}"

run-flutter-tag-build:
needs: resolve-version
permissions:
contents: write
actions: write
id-token: write
uses: ./.github/workflows/flutter-build.yml
secrets: inherit
with:
upload-artifact: true
upload-tag: ${{ needs.resolve-version.outputs.tag }}

publish-dcs-alias:
name: Publish DCS-named installer alias
if: ${{ always() && needs.resolve-version.result == 'success' }}
needs: [resolve-version, run-flutter-tag-build]
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Download, alias, and publish
env:
GH_TOKEN: ${{ github.token }}
TAG: ${{ needs.resolve-version.outputs.tag }}
VER: ${{ needs.resolve-version.outputs.version }}
REPO: ${{ github.repository }}
shell: bash
run: |
set -euo pipefail
DISPLAY="${VER}"
DISPLAY="${DISPLAY#dcs-}"
DISPLAY="${DISPLAY#v}"
mkdir -p ./out

alias_asset() {
local src="$1" dest="$2" required="${3:-0}"
if gh release download "$TAG" --repo "$REPO" --pattern "$src" --dir ./out; then
cp "./out/$src" "./out/$dest"
gh release upload "$TAG" "./out/$dest" --repo "$REPO" --clobber
# Keep rustdesk-* names so Windows, Linux, and Android in-app updaters share one asset scheme.
elif [[ "$required" == "1" ]]; then
echo "::error::missing required asset $src"
exit 1
else
echo "skip missing $src"
fi
}

alias_asset "rustdesk-${VER}-x86_64.exe" "DCS-Norway-RDC-${DISPLAY}-x86_64-install.exe" 1
alias_asset "rustdesk-${VER}-aarch64.apk" "DCS-Norway-RDC-${DISPLAY}-aarch64.apk"
alias_asset "rustdesk-${VER}-x86_64.deb" "DCS-Norway-RDC-${DISPLAY}-x86_64.deb"
ls -la ./out
gh release edit "$TAG" --repo "$REPO" --prerelease=false
24 changes: 9 additions & 15 deletions .github/workflows/flutter-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ env:
# 2. Update the `VCPKG_COMMIT_ID` in `ci.yml` and `playground.yml`.
VCPKG_COMMIT_ID: "120deac3062162151622ca4860575a33844ba10b"
ARMV7_VCPKG_COMMIT_ID: "6f29f12e82a8293156836ad81cc9bf5af41fe836" # 2025.01.13, got "/opt/artifacts/vcpkg/vcpkg: No such file or directory" with latest version
VERSION: "1.4.9"
VERSION: "1.4.15"
NDK_VERSION: "r28c"
#signing keys env variable checks
ANDROID_SIGNING_KEY: "${{ secrets.ANDROID_SIGNING_KEY }}"
Expand Down Expand Up @@ -558,7 +558,8 @@ jobs:
./SignOutput/rustdesk-*.exe

build-rustdesk-ios:
if: ${{ inputs.upload-artifact }}
# Unsigned IPA cannot be installed by DCS operators.
if: false
name: build rustdesk ios ipa
runs-on: ${{ matrix.job.os }}
needs: [generate-bridge]
Expand Down Expand Up @@ -680,6 +681,8 @@ jobs:


build-for-macOS:
# DCS ships Windows, Linux, and Android only.
if: false
name: ${{ matrix.job.target }}
runs-on: ${{ matrix.job.os }}
needs: [generate-bridge]
Expand Down Expand Up @@ -905,7 +908,8 @@ jobs:
- build-for-windows-flutter
- build-for-windows-sciter
runs-on: ubuntu-latest
if: ${{ inputs.upload-artifact }}
# Unsigned macOS+Windows bundle is not a DCS product.
if: false
steps:
- name: Download artifacts
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
Expand Down Expand Up @@ -1219,7 +1223,7 @@ jobs:
path: ${{steps.sign-rustdesk.outputs.signedReleaseFile}}

- name: Publish signed apk package
if: env.ANDROID_SIGNING_KEY != null && env.UPLOAD_ARTIFACT == 'true'
if: env.ANDROID_SIGNING_KEY != null && env.UPLOAD_ARTIFACT == 'true' && matrix.job.arch != 'x86_64'
uses: softprops/action-gh-release@de2c0eb89ae2a093876385947365aca7b0e5f844 # v1
with:
prerelease: true
Expand All @@ -1228,7 +1232,7 @@ jobs:
${{steps.sign-rustdesk.outputs.signedReleaseFile}}

- name: Publish unsigned apk package
if: env.ANDROID_SIGNING_KEY == null && env.UPLOAD_ARTIFACT == 'true'
if: env.ANDROID_SIGNING_KEY == null && env.UPLOAD_ARTIFACT == 'true' && matrix.job.arch != 'x86_64'
uses: softprops/action-gh-release@de2c0eb89ae2a093876385947365aca7b0e5f844 # v1
with:
prerelease: true
Expand Down Expand Up @@ -2048,16 +2052,6 @@ jobs:
vcpkg-triplet: x64-linux,
extra_features: ",hwcodec,unix-file-copy-paste",
}
- {
arch: armv7,
target: armv7-unknown-linux-gnueabihf,
on: ubuntu-22.04-arm,
distro: ubuntu18.04-rustdesk,
deb_arch: armhf,
sciter_arch: arm32,
vcpkg-triplet: arm-linux,
extra_features: ",unix-file-copy-paste",
}
steps:
- name: Export GitHub Actions cache environment variables
uses: actions/github-script@d7906e4ad0b1822421a7e6a35d5ca353c962f410 # v6
Expand Down
6 changes: 6 additions & 0 deletions .github/workflows/flutter-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,12 @@ on:

jobs:
run-ci:
# generate-sbom in flutter-build.yml requests contents:write; callers default to read.
permissions:
contents: write
actions: write
id-token: write
uses: ./.github/workflows/flutter-build.yml
secrets: inherit
with:
upload-artifact: false
6 changes: 0 additions & 6 deletions .github/workflows/flutter-tag.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,6 @@ name: Flutter Tag Build

on:
workflow_dispatch:
push:
tags:
- 'v[0-9]+.[0-9]+.[0-9]+'
- '[0-9]+.[0-9]+.[0-9]+'
- 'v[0-9]+.[0-9]+.[0-9]+-[0-9]+'
- '[0-9]+.[0-9]+.[0-9]+-[0-9]+'

jobs:
run-flutter-tag-build:
Expand Down
3 changes: 0 additions & 3 deletions .gitmodules

This file was deleted.

4 changes: 2 additions & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rustdesk"
version = "1.4.9"
version = "1.4.15"
authors = ["rustdesk <info@rustdesk.com>"]
edition = "2021"
build= "build.rs"
Expand Down
2 changes: 1 addition & 1 deletion appimage/AppImageBuilder-aarch64.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ AppDir:
path: ./AppDir
app_info:
id: rustdesk
name: rustdesk
name: DCS Norway
icon: rustdesk
version: 1.4.9
exec: usr/share/rustdesk/rustdesk
Expand Down
2 changes: 1 addition & 1 deletion appimage/AppImageBuilder-x86_64.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ AppDir:
path: ./AppDir
app_info:
id: rustdesk
name: rustdesk
name: DCS Norway
icon: rustdesk
version: 1.4.9
exec: usr/share/rustdesk/rustdesk
Expand Down
2 changes: 1 addition & 1 deletion build.py
Original file line number Diff line number Diff line change
Expand Up @@ -366,7 +366,7 @@ def generate_control_file(version):
Homepage: https://rustdesk.com
Depends: libgtk-3-0t64 | libgtk-3-0, libxcb-randr0, libxdo3 | libxdo4, libxfixes3, libxcb-shape0, libxcb-xfixes0, libasound2t64 | libasound2, libsystemd0, curl, libva2, libva-drm2, libva-x11-2, libgstreamer-plugins-base1.0-0, libpam0g, gstreamer1.0-pipewire%s
Recommends: libayatana-appindicator3-1
Description: A remote control software.
Description: DCS Norway Remote Desktop Client.

""" % (version, get_deb_arch(), get_deb_extra_depends())
file = open(control_file_path, "w")
Expand Down
Binary file added dcs-norway-x86_64-debug.apk
Binary file not shown.
91 changes: 91 additions & 0 deletions docs/DCS-RELEASE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
# DCS Norway Remote Desktop Client — releases & updates

Operators get updates from **GitHub Releases** (pre-built installers), not by compiling source on their PCs.

Windows, Linux, macOS (Apple Silicon and Intel), and Android share the same DCS client:
branding, Available devices only (no Recent / Favorites / Discovered / Address book / Remote ID),
and the DCS About page. iOS is not published (unsigned IPA would require sideloading).

## Publish a new build

1. Bump the version in source so clients detect “newer”:
- [`Cargo.toml`](../Cargo.toml) / [`libs/portable/Cargo.toml`](../libs/portable/Cargo.toml)
- Commit the updated [`Cargo.lock`](../Cargo.lock) (CI uses `cargo build --locked`)
- Default `VERSION` in [`.github/workflows/flutter-build.yml`](../.github/workflows/flutter-build.yml) (must match the release tag for asset names)
- [`flutter/pubspec.yaml`](../flutter/pubspec.yaml) version (optional consistency)
2. Commit and push to the branding branch.
3. Create and push a **tag** matching the version string used in asset names, e.g.:
- `1.4.10`
- `1.4.9-2`
Prefer tags **without** a leading `v` so updater filenames stay simple (`rustdesk-1.4.10-x86_64.exe`).
4. Start the Windows build:
- **Preferred while the workflow lives only on the branding branch:**
Actions → **DCS Windows Release** → Run workflow (branch = branding branch) → set `release_tag` to `1.4.10`.
Or: `gh workflow run dcs-windows-release.yml --ref <branding-branch> -f release_tag=1.4.10`
- **Automatic on tag push** works only after this workflow file exists on the repo **default** branch (GitHub limitation).
5. Wait for workflow **DCS Windows Release**. It calls the full Flutter build reusable workflow; ensure `VERSION` in `.github/workflows/flutter-build.yml` matches the tag (asset name `rustdesk-{tag}-x86_64.exe`).
6. On the GitHub Release for that tag, confirm assets:
- `rustdesk-{tag}-x86_64.exe` — used by in-app updater
- `DCS-Norway-RDC-{version}-x86_64-install.exe` — human-friendly Windows alias
- `DCS-Norway-RDC-{version}-aarch64.apk` — Android phones / tablets
- `DCS-Norway-RDC-{version}-x86_64.deb` — Linux (when built)
- `DCS-Norway-RDC-{version}-x86_64.dmg` — macOS Intel (when built)
- `DCS-Norway-RDC-{version}-aarch64.dmg` — macOS Apple Silicon (when built)
Release is marked **non-prerelease** so clients can find it.

Linux and both macOS architectures use the same Flutter desktop client as Windows (RdClient home,
Available devices, DCS About).

### Android (DCS-branded APK)

Website / GitHub Releases file for phones and tablets:

- `DCS-Norway-RDC-{version}-aarch64.apk`

Upload via the release page, or after a local/CI build:

```bash
gh release upload 1.4.10 ./DCS-Norway-RDC-1.4.10-aarch64.apk --clobber
```

Do not publish `*-x86_64.apk`. That ABI is for PC Android emulators, not operator phones.

### Linux (.deb)

Build the Flutter Linux client from this branding branch, then attach:

- `DCS-Norway-RDC-{version}-x86_64.deb`
- `DCS-Norway-RDC-{version}-aarch64.deb` (when built)

The `.desktop` launcher name is **DCS Norway**. The on-disk binary stays `rustdesk` so packaging
paths remain compatible.

### macOS (.dmg) — Apple Silicon and Intel

Both architectures share `flutter/macos/` (display name **DCS Norway**, DCS app icon). Attach:

- `DCS-Norway-RDC-{version}-aarch64.dmg` — Apple Silicon
- `DCS-Norway-RDC-{version}-x86_64.dmg` — Intel

The `.app` product name stays `RustDesk.app` for signing/CI; Finder and the Dock show **DCS Norway**.

Manual run (same as step 4): Actions → **DCS Windows Release** → Run workflow.

## How clients update

- On startup (if **Check for software update on startup** is enabled — default on): queries
`https://api.github.com/repos/Chesster1981/RustDesk/releases`
- Settings → **About** → **Check for updates**
- A newer tag is offered when it has a DCS client asset (`.exe`, `.deb`, `.dmg`, `.apk`, …).
Windows can download + `--update` install; Linux / macOS / Android open the GitHub Release page.

## Local test (no tag)

Build and run Release as usual; packing an installer is optional until you want to ship.

## Notes

- Compile-from-source on operator machines is **not** supported.
- Windows x64 is the primary automated release target; Linux / macOS / Android use the same branded
source and are packaged from this branch.
- Code signing uses existing fork secrets when configured; unsigned builds are fine for internal DCS use.
Loading
Loading