Rebrand VNC Viewer to RealVNC Connect Viewer - #48255
Conversation
Update maintained app metadata and frontend mapping to reflect RealVNC rebrand and package changes. Renamed app entries for macOS and Windows, bumped macOS version to 8.4.2, updated bundle identifier checks and patch queries to account for both legacy and new bundle IDs, and replaced installer URL, checksums, and install/uninstall script refs. Marked the Homebrew input as frozen. Also updated frontend icon mappings to include the new "realvnc connect viewer" name (and kept a mapping for the legacy name).
Script Diff Resultsee/maintained-apps/outputs/vnc-viewer/darwin.json=== Install // 126e9470 -> 796192e5 ===
--- /tmp/old.Euc5Ds 2026-06-25 03:04:55.648237606 +0000
+++ /tmp/new.QG4kWE 2026-06-25 03:04:55.648237606 +0000
@@ -94,15 +94,11 @@
}
-# extract contents
-MOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)
-yes | hdiutil attach -plist -nobrowse -readonly -mountpoint "$MOUNT_POINT" "$INSTALLER_PATH" || exit 1
-sudo cp -R "$MOUNT_POINT"/* "$TMPDIR"
-hdiutil detach "$MOUNT_POINT" || true
-# copy to the applications folder
+# install pkg files
+quit_and_track_application 'com.realvnc.rvncconnect'
+sudo installer -pkg "$TMPDIR/RealVNC-Connect-Viewer-8.4.2-MacOSX-universal.pkg" -target /
+relaunch_application 'com.realvnc.rvncconnect'
+# Remove the legacy VNC Viewer (pre-rebrand bundle id com.realvnc.vncviewer) so the rebranded
+# RealVNC Connect Viewer supersedes it and the patch policy converges.
quit_and_track_application 'com.realvnc.vncviewer'
-if [ -d "$APPDIR/VNC Viewer.app" ]; then
- sudo mv "$APPDIR/VNC Viewer.app" "$TMPDIR/VNC Viewer.app.bkp"
-fi
-sudo cp -R "$TMPDIR/VNC Viewer.app" "$APPDIR"
-relaunch_application 'com.realvnc.vncviewer'
+sudo rm -rf "/Applications/VNC Viewer.app"
=== Uninstall // ca97bbc0 -> 2477e102 ===
--- /tmp/old.shDE0A 2026-06-25 03:04:55.675237790 +0000
+++ /tmp/new.Q7Jh3N 2026-06-25 03:04:55.676237797 +0000
@@ -1,10 +1,48 @@
#!/bin/bash
# variables
-APPDIR="/Applications/"
LOGGED_IN_USER=$(scutil <<< "show State:/Users/ConsoleUser" | awk '/Name :/ { print $3 }')
# functions
+quit_application() {
+ local bundle_id="$1"
+ local timeout_duration=10
+
+ # check if the application is running
+ local app_running
+ app_running=$(osascript -e "application id \"$bundle_id\" is running" 2>/dev/null)
+ if [[ "$app_running" != "true" ]]; then
+ return
+ fi
+
+ local console_user
+ console_user=$(stat -f "%Su" /dev/console)
+ if [[ -z "$console_user" || "$console_user" == "root" || "$console_user" == "loginwindow" ]]; then
+ echo "Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'."
+ return
+ fi
+
+ echo "Quitting application '$bundle_id'..."
+
+ # try to quit the application within the timeout period
+ local quit_success=false
+ SECONDS=0
+ while (( SECONDS < timeout_duration )); do
+ if osascript -e "tell application id \"$bundle_id\" to quit" >/dev/null 2>&1; then
+ if ! pgrep -f "$bundle_id" >/dev/null 2>&1; then
+ echo "Application '$bundle_id' quit successfully."
+ quit_success=true
+ break
+ fi
+ fi
+ sleep 1
+ done
+
+ if [[ "$quit_success" = false ]]; then
+ echo "Application '$bundle_id' did not quit."
+ fi
+}
+
trash() {
local logged_in_user="$1"
local target_file="$2"
@@ -52,6 +90,11 @@
fi
}
-sudo rm -rf "$APPDIR/VNC Viewer.app"
-trash $LOGGED_IN_USER '~/Library/Preferences/com.realvnc.vncviewer.plist'
-trash $LOGGED_IN_USER '~/Library/Saved Application State/com.realvnc.vncviewer.savedState'
+quit_application 'com.realvnc.rvncconnect'
+sudo rm -rf '/Applications/RealVNC Connect Viewer.app'
+sudo pkgutil --forget 'com.realvnc.rvncconnect.viewer.1' 2>/dev/null || true
+trash $LOGGED_IN_USER '~/Library/Application Support/com.realvnc.rvncconnect'
+trash $LOGGED_IN_USER '~/Library/Caches/com.realvnc.rvncconnect'
+trash $LOGGED_IN_USER '~/Library/Logs/vnc'
+trash $LOGGED_IN_USER '~/Library/Preferences/com.realvnc.rvncconnect.plist'
+trash $LOGGED_IN_USER '~/Library/Saved Application State/com.realvnc.rvncconnect.savedState' |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #48255 +/- ##
========================================
Coverage 67.30% 67.30%
========================================
Files 3660 3660
Lines 231442 231442
Branches 12156 12302 +146
========================================
Hits 155762 155762
+ Misses 61742 61741 -1
- Partials 13938 13939 +1
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
Script Diff Resultsee/maintained-apps/outputs/vnc-viewer/darwin.json=== Install // 126e9470 -> 796192e5 ===
--- /tmp/old.vxhf2G 2026-06-25 03:12:46.245678963 +0000
+++ /tmp/new.5hw6ck 2026-06-25 03:12:46.245678963 +0000
@@ -94,15 +94,11 @@
}
-# extract contents
-MOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)
-yes | hdiutil attach -plist -nobrowse -readonly -mountpoint "$MOUNT_POINT" "$INSTALLER_PATH" || exit 1
-sudo cp -R "$MOUNT_POINT"/* "$TMPDIR"
-hdiutil detach "$MOUNT_POINT" || true
-# copy to the applications folder
+# install pkg files
+quit_and_track_application 'com.realvnc.rvncconnect'
+sudo installer -pkg "$TMPDIR/RealVNC-Connect-Viewer-8.4.2-MacOSX-universal.pkg" -target /
+relaunch_application 'com.realvnc.rvncconnect'
+# Remove the legacy VNC Viewer (pre-rebrand bundle id com.realvnc.vncviewer) so the rebranded
+# RealVNC Connect Viewer supersedes it and the patch policy converges.
quit_and_track_application 'com.realvnc.vncviewer'
-if [ -d "$APPDIR/VNC Viewer.app" ]; then
- sudo mv "$APPDIR/VNC Viewer.app" "$TMPDIR/VNC Viewer.app.bkp"
-fi
-sudo cp -R "$TMPDIR/VNC Viewer.app" "$APPDIR"
-relaunch_application 'com.realvnc.vncviewer'
+sudo rm -rf "/Applications/VNC Viewer.app"
=== Uninstall // ca97bbc0 -> 2477e102 ===
--- /tmp/old.JQHvgH 2026-06-25 03:12:46.262679174 +0000
+++ /tmp/new.AGlMiT 2026-06-25 03:12:46.263679186 +0000
@@ -1,10 +1,48 @@
#!/bin/bash
# variables
-APPDIR="/Applications/"
LOGGED_IN_USER=$(scutil <<< "show State:/Users/ConsoleUser" | awk '/Name :/ { print $3 }')
# functions
+quit_application() {
+ local bundle_id="$1"
+ local timeout_duration=10
+
+ # check if the application is running
+ local app_running
+ app_running=$(osascript -e "application id \"$bundle_id\" is running" 2>/dev/null)
+ if [[ "$app_running" != "true" ]]; then
+ return
+ fi
+
+ local console_user
+ console_user=$(stat -f "%Su" /dev/console)
+ if [[ -z "$console_user" || "$console_user" == "root" || "$console_user" == "loginwindow" ]]; then
+ echo "Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'."
+ return
+ fi
+
+ echo "Quitting application '$bundle_id'..."
+
+ # try to quit the application within the timeout period
+ local quit_success=false
+ SECONDS=0
+ while (( SECONDS < timeout_duration )); do
+ if osascript -e "tell application id \"$bundle_id\" to quit" >/dev/null 2>&1; then
+ if ! pgrep -f "$bundle_id" >/dev/null 2>&1; then
+ echo "Application '$bundle_id' quit successfully."
+ quit_success=true
+ break
+ fi
+ fi
+ sleep 1
+ done
+
+ if [[ "$quit_success" = false ]]; then
+ echo "Application '$bundle_id' did not quit."
+ fi
+}
+
trash() {
local logged_in_user="$1"
local target_file="$2"
@@ -52,6 +90,11 @@
fi
}
-sudo rm -rf "$APPDIR/VNC Viewer.app"
-trash $LOGGED_IN_USER '~/Library/Preferences/com.realvnc.vncviewer.plist'
-trash $LOGGED_IN_USER '~/Library/Saved Application State/com.realvnc.vncviewer.savedState'
+quit_application 'com.realvnc.rvncconnect'
+sudo rm -rf '/Applications/RealVNC Connect Viewer.app'
+sudo pkgutil --forget 'com.realvnc.rvncconnect.viewer.1' 2>/dev/null || true
+trash $LOGGED_IN_USER '~/Library/Application Support/com.realvnc.rvncconnect'
+trash $LOGGED_IN_USER '~/Library/Caches/com.realvnc.rvncconnect'
+trash $LOGGED_IN_USER '~/Library/Logs/vnc'
+trash $LOGGED_IN_USER '~/Library/Preferences/com.realvnc.rvncconnect.plist'
+trash $LOGGED_IN_USER '~/Library/Saved Application State/com.realvnc.rvncconnect.savedState' |
There was a problem hiding this comment.
Claude Code Review
This repository is configured for manual code reviews. Comment @claude review to trigger a review and subscribe this PR to future pushes, or @claude review once for a one-time review.
Tip: disable this comment in your organization's Code Review settings.
Script Diff Resultsee/maintained-apps/outputs/vnc-viewer/darwin.json=== Install // 126e9470 -> 796192e5 ===
--- /tmp/old.O3PEkE 2026-06-25 03:19:44.947248060 +0000
+++ /tmp/new.11s0ly 2026-06-25 03:19:44.947248060 +0000
@@ -94,15 +94,11 @@
}
-# extract contents
-MOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)
-yes | hdiutil attach -plist -nobrowse -readonly -mountpoint "$MOUNT_POINT" "$INSTALLER_PATH" || exit 1
-sudo cp -R "$MOUNT_POINT"/* "$TMPDIR"
-hdiutil detach "$MOUNT_POINT" || true
-# copy to the applications folder
+# install pkg files
+quit_and_track_application 'com.realvnc.rvncconnect'
+sudo installer -pkg "$TMPDIR/RealVNC-Connect-Viewer-8.4.2-MacOSX-universal.pkg" -target /
+relaunch_application 'com.realvnc.rvncconnect'
+# Remove the legacy VNC Viewer (pre-rebrand bundle id com.realvnc.vncviewer) so the rebranded
+# RealVNC Connect Viewer supersedes it and the patch policy converges.
quit_and_track_application 'com.realvnc.vncviewer'
-if [ -d "$APPDIR/VNC Viewer.app" ]; then
- sudo mv "$APPDIR/VNC Viewer.app" "$TMPDIR/VNC Viewer.app.bkp"
-fi
-sudo cp -R "$TMPDIR/VNC Viewer.app" "$APPDIR"
-relaunch_application 'com.realvnc.vncviewer'
+sudo rm -rf "/Applications/VNC Viewer.app"
=== Uninstall // ca97bbc0 -> 2477e102 ===
--- /tmp/old.XmJ4HZ 2026-06-25 03:19:44.973248489 +0000
+++ /tmp/new.7EbZi5 2026-06-25 03:19:44.973248489 +0000
@@ -1,10 +1,48 @@
#!/bin/bash
# variables
-APPDIR="/Applications/"
LOGGED_IN_USER=$(scutil <<< "show State:/Users/ConsoleUser" | awk '/Name :/ { print $3 }')
# functions
+quit_application() {
+ local bundle_id="$1"
+ local timeout_duration=10
+
+ # check if the application is running
+ local app_running
+ app_running=$(osascript -e "application id \"$bundle_id\" is running" 2>/dev/null)
+ if [[ "$app_running" != "true" ]]; then
+ return
+ fi
+
+ local console_user
+ console_user=$(stat -f "%Su" /dev/console)
+ if [[ -z "$console_user" || "$console_user" == "root" || "$console_user" == "loginwindow" ]]; then
+ echo "Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'."
+ return
+ fi
+
+ echo "Quitting application '$bundle_id'..."
+
+ # try to quit the application within the timeout period
+ local quit_success=false
+ SECONDS=0
+ while (( SECONDS < timeout_duration )); do
+ if osascript -e "tell application id \"$bundle_id\" to quit" >/dev/null 2>&1; then
+ if ! pgrep -f "$bundle_id" >/dev/null 2>&1; then
+ echo "Application '$bundle_id' quit successfully."
+ quit_success=true
+ break
+ fi
+ fi
+ sleep 1
+ done
+
+ if [[ "$quit_success" = false ]]; then
+ echo "Application '$bundle_id' did not quit."
+ fi
+}
+
trash() {
local logged_in_user="$1"
local target_file="$2"
@@ -52,6 +90,11 @@
fi
}
-sudo rm -rf "$APPDIR/VNC Viewer.app"
-trash $LOGGED_IN_USER '~/Library/Preferences/com.realvnc.vncviewer.plist'
-trash $LOGGED_IN_USER '~/Library/Saved Application State/com.realvnc.vncviewer.savedState'
+quit_application 'com.realvnc.rvncconnect'
+sudo rm -rf '/Applications/RealVNC Connect Viewer.app'
+sudo pkgutil --forget 'com.realvnc.rvncconnect.viewer.1' 2>/dev/null || true
+trash $LOGGED_IN_USER '~/Library/Application Support/com.realvnc.rvncconnect'
+trash $LOGGED_IN_USER '~/Library/Caches/com.realvnc.rvncconnect'
+trash $LOGGED_IN_USER '~/Library/Logs/vnc'
+trash $LOGGED_IN_USER '~/Library/Preferences/com.realvnc.rvncconnect.plist'
+trash $LOGGED_IN_USER '~/Library/Saved Application State/com.realvnc.rvncconnect.savedState' |
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (1)
🚧 Files skipped from review as they are similar to previous changes (1)
WalkthroughThe PR renames VNC Viewer entries to RealVNC Connect Viewer in the Homebrew and Winget inputs and in the maintained app registry. It also marks the Homebrew input as frozen, updates the Darwin deployment policy to version 8.4.2 with new install and uninstall refs, and adds RealVNC viewer aliases to the frontend icon map. Possibly related PRs
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Pull request overview
This PR updates Fleet-maintained app metadata (macOS + Windows) and the Software page icon mapping to reflect the RealVNC Viewer rebrand to RealVNC Connect Viewer, including updated installer metadata and name-to-icon aliases.
Changes:
- Updated maintained app list entries to rename “VNC Viewer” → “RealVNC Connect Viewer” (macOS + Windows) and adjusted identifiers/descriptions.
- Updated the macOS maintained-app manifest to the new 8.4.2 package URL, scripts, SHA, and patch logic intended to account for legacy vs rebranded bundle IDs.
- Added icon mappings for the new software name while keeping legacy mappings.
Reviewed changes
Copilot reviewed 5 out of 5 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| frontend/pages/SoftwarePage/components/icons/index.ts | Adds icon aliases for “realvnc connect viewer” and “realvnc viewer”. |
| ee/maintained-apps/outputs/vnc-viewer/darwin.json | Updates macOS manifest to new pkg installer + scripts and bundle-id-aware patch query. |
| ee/maintained-apps/outputs/apps.json | Renames the maintained app entries and updates identifiers/descriptions. |
| ee/maintained-apps/inputs/winget/vnc-viewer.json | Updates the Winget input display name to the rebranded name. |
| ee/maintained-apps/inputs/homebrew/vnc-viewer.json | Renames the Homebrew input and marks it frozen. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| "queries": { | ||
| "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.realvnc.vncviewer';", | ||
| "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.realvnc.vncviewer' AND version_compare(bundle_short_version, '7.15.1') < 0);" | ||
| "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.realvnc.rvncconnect';", |
| "126e9470": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'com.realvnc.vncviewer'\nif [ -d \"$APPDIR/VNC Viewer.app\" ]; then\n\tsudo mv \"$APPDIR/VNC Viewer.app\" \"$TMPDIR/VNC Viewer.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/VNC Viewer.app\" \"$APPDIR\"\nrelaunch_application 'com.realvnc.vncviewer'\n", | ||
| "ca97bbc0": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/VNC Viewer.app\"\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.realvnc.vncviewer.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.realvnc.vncviewer.savedState'\n" | ||
| "2477e102": "#!/bin/bash\n\n# variables\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nquit_application 'com.realvnc.rvncconnect'\nsudo rm -rf '/Applications/RealVNC Connect Viewer.app'\nsudo pkgutil --forget 'com.realvnc.rvncconnect.viewer.1' 2>/dev/null || true\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.realvnc.rvncconnect'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.realvnc.rvncconnect'\ntrash $LOGGED_IN_USER '~/Library/Logs/vnc'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.realvnc.rvncconnect.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.realvnc.rvncconnect.savedState'\n", | ||
| "796192e5": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# install pkg files\nquit_and_track_application 'com.realvnc.rvncconnect'\nsudo installer -pkg \"$TMPDIR/RealVNC-Connect-Viewer-8.4.2-MacOSX-universal.pkg\" -target /\nrelaunch_application 'com.realvnc.rvncconnect'\n# Remove the legacy VNC Viewer (pre-rebrand bundle id com.realvnc.vncviewer) so the rebranded\n# RealVNC Connect Viewer supersedes it and the patch policy converges.\nquit_and_track_application 'com.realvnc.vncviewer'\nsudo rm -rf \"/Applications/VNC Viewer.app\"\n" |
| "name": "RealVNC Connect Viewer", | ||
| "unique_identifier": "com.realvnc.vncviewer", |
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@ee/maintained-apps/outputs/vnc-viewer/darwin.json`:
- Around line 6-7: The install check is missing the legacy bundle ID, so
`exists` in the vnc-viewer Darwin output should match both
`com.realvnc.rvncconnect` and `com.realvnc.vncviewer` just like the migration
logic does. Update the `exists` query in this JSON entry to include the
pre-rebrand bundle identifier so the check remains consistent with the migration
path and still detects older installs.
- Line 19: The uninstall script currently only targets the new RealVNC Connect
Viewer app, so legacy VNC Viewer installs are left behind. Update the uninstall
flow in the script around quit_application and the app-removal step to also
detect and remove the legacy “VNC Viewer.app” alongside “RealVNC Connect
Viewer.app”, and make sure any related pkgutil forget or cleanup paths cover the
legacy bundle identifier if it exists.
- Line 20: The relaunch tracking in
quit_and_track_application/relaunch_application only covers
com.realvnc.rvncconnect, so a legacy-running upgrade can lose the app state when
com.realvnc.vncviewer is the one that was open. Track the running state for the
legacy bundle id before removing it, then relaunch the new bundle id after
installation if the legacy app was previously running; use the existing
quit_and_track_application and relaunch_application flow to preserve state
across the migration.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 8460cfe9-6d68-424b-bb87-6345ec991445
📒 Files selected for processing (5)
ee/maintained-apps/inputs/homebrew/vnc-viewer.jsonee/maintained-apps/inputs/winget/vnc-viewer.jsonee/maintained-apps/outputs/apps.jsonee/maintained-apps/outputs/vnc-viewer/darwin.jsonfrontend/pages/SoftwarePage/components/icons/index.ts
| "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.realvnc.rvncconnect';", | ||
| "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.realvnc.vncviewer' OR (bundle_identifier = 'com.realvnc.rvncconnect' AND version_compare(bundle_short_version, '8.4.2') < 0));" |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Include the legacy bundle ID in exists.
Line 6 now recognizes only com.realvnc.rvncconnect, so machines that still have the pre-rebrand com.realvnc.vncviewer app will stop matching the install check even though Line 7 and Line 20 still try to migrate that legacy install.
Suggested fix
- "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.realvnc.rvncconnect';",
+ "exists": "SELECT 1 FROM apps WHERE bundle_identifier IN ('com.realvnc.vncviewer', 'com.realvnc.rvncconnect');",📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.realvnc.rvncconnect';", | |
| "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.realvnc.vncviewer' OR (bundle_identifier = 'com.realvnc.rvncconnect' AND version_compare(bundle_short_version, '8.4.2') < 0));" | |
| "exists": "SELECT 1 FROM apps WHERE bundle_identifier IN ('com.realvnc.vncviewer', 'com.realvnc.rvncconnect');", | |
| "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.realvnc.vncviewer' OR (bundle_identifier = 'com.realvnc.rvncconnect' AND version_compare(bundle_short_version, '8.4.2') < 0));" |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@ee/maintained-apps/outputs/vnc-viewer/darwin.json` around lines 6 - 7, The
install check is missing the legacy bundle ID, so `exists` in the vnc-viewer
Darwin output should match both `com.realvnc.rvncconnect` and
`com.realvnc.vncviewer` just like the migration logic does. Update the `exists`
query in this JSON entry to include the pre-rebrand bundle identifier so the
check remains consistent with the migration path and still detects older
installs.
Script Diff Resultsee/maintained-apps/outputs/vnc-viewer/darwin.json=== Install // 126e9470 -> 796192e5 ===
--- /tmp/old.VScg70 2026-06-25 03:36:04.778526515 +0000
+++ /tmp/new.zK8iWd 2026-06-25 03:36:04.778526515 +0000
@@ -94,15 +94,11 @@
}
-# extract contents
-MOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)
-yes | hdiutil attach -plist -nobrowse -readonly -mountpoint "$MOUNT_POINT" "$INSTALLER_PATH" || exit 1
-sudo cp -R "$MOUNT_POINT"/* "$TMPDIR"
-hdiutil detach "$MOUNT_POINT" || true
-# copy to the applications folder
+# install pkg files
+quit_and_track_application 'com.realvnc.rvncconnect'
+sudo installer -pkg "$TMPDIR/RealVNC-Connect-Viewer-8.4.2-MacOSX-universal.pkg" -target /
+relaunch_application 'com.realvnc.rvncconnect'
+# Remove the legacy VNC Viewer (pre-rebrand bundle id com.realvnc.vncviewer) so the rebranded
+# RealVNC Connect Viewer supersedes it and the patch policy converges.
quit_and_track_application 'com.realvnc.vncviewer'
-if [ -d "$APPDIR/VNC Viewer.app" ]; then
- sudo mv "$APPDIR/VNC Viewer.app" "$TMPDIR/VNC Viewer.app.bkp"
-fi
-sudo cp -R "$TMPDIR/VNC Viewer.app" "$APPDIR"
-relaunch_application 'com.realvnc.vncviewer'
+sudo rm -rf "/Applications/VNC Viewer.app"
=== Uninstall // ca97bbc0 -> 2477e102 ===
--- /tmp/old.RwNMej 2026-06-25 03:36:04.822526669 +0000
+++ /tmp/new.LQgfQl 2026-06-25 03:36:04.822526669 +0000
@@ -1,10 +1,48 @@
#!/bin/bash
# variables
-APPDIR="/Applications/"
LOGGED_IN_USER=$(scutil <<< "show State:/Users/ConsoleUser" | awk '/Name :/ { print $3 }')
# functions
+quit_application() {
+ local bundle_id="$1"
+ local timeout_duration=10
+
+ # check if the application is running
+ local app_running
+ app_running=$(osascript -e "application id \"$bundle_id\" is running" 2>/dev/null)
+ if [[ "$app_running" != "true" ]]; then
+ return
+ fi
+
+ local console_user
+ console_user=$(stat -f "%Su" /dev/console)
+ if [[ -z "$console_user" || "$console_user" == "root" || "$console_user" == "loginwindow" ]]; then
+ echo "Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'."
+ return
+ fi
+
+ echo "Quitting application '$bundle_id'..."
+
+ # try to quit the application within the timeout period
+ local quit_success=false
+ SECONDS=0
+ while (( SECONDS < timeout_duration )); do
+ if osascript -e "tell application id \"$bundle_id\" to quit" >/dev/null 2>&1; then
+ if ! pgrep -f "$bundle_id" >/dev/null 2>&1; then
+ echo "Application '$bundle_id' quit successfully."
+ quit_success=true
+ break
+ fi
+ fi
+ sleep 1
+ done
+
+ if [[ "$quit_success" = false ]]; then
+ echo "Application '$bundle_id' did not quit."
+ fi
+}
+
trash() {
local logged_in_user="$1"
local target_file="$2"
@@ -52,6 +90,11 @@
fi
}
-sudo rm -rf "$APPDIR/VNC Viewer.app"
-trash $LOGGED_IN_USER '~/Library/Preferences/com.realvnc.vncviewer.plist'
-trash $LOGGED_IN_USER '~/Library/Saved Application State/com.realvnc.vncviewer.savedState'
+quit_application 'com.realvnc.rvncconnect'
+sudo rm -rf '/Applications/RealVNC Connect Viewer.app'
+sudo pkgutil --forget 'com.realvnc.rvncconnect.viewer.1' 2>/dev/null || true
+trash $LOGGED_IN_USER '~/Library/Application Support/com.realvnc.rvncconnect'
+trash $LOGGED_IN_USER '~/Library/Caches/com.realvnc.rvncconnect'
+trash $LOGGED_IN_USER '~/Library/Logs/vnc'
+trash $LOGGED_IN_USER '~/Library/Preferences/com.realvnc.rvncconnect.plist'
+trash $LOGGED_IN_USER '~/Library/Saved Application State/com.realvnc.rvncconnect.savedState' |
Script Diff Resultsee/maintained-apps/outputs/vnc-viewer/darwin.json=== Install // 796192e5 -> 932783c1 ===
--- /tmp/old.V2BFMz 2026-06-25 03:48:49.647381940 +0000
+++ /tmp/new.Elnh1x 2026-06-25 03:48:49.647381940 +0000
@@ -102,3 +102,8 @@
# RealVNC Connect Viewer supersedes it and the patch policy converges.
quit_and_track_application 'com.realvnc.vncviewer'
sudo rm -rf "/Applications/VNC Viewer.app"
+# If the legacy VNC Viewer was running, relaunch the rebranded app in its place.
+if [ "$APP_WAS_RUNNING_com_realvnc_vncviewer" = "1" ]; then
+ export APP_WAS_RUNNING_com_realvnc_rvncconnect=1
+ relaunch_application 'com.realvnc.rvncconnect'
+fi
=== Uninstall // 2477e102 -> 4d626246 ===
--- /tmp/old.uwAJH4 2026-06-25 03:48:49.691381817 +0000
+++ /tmp/new.wYzdjS 2026-06-25 03:48:49.691381817 +0000
@@ -93,8 +93,13 @@
quit_application 'com.realvnc.rvncconnect'
sudo rm -rf '/Applications/RealVNC Connect Viewer.app'
sudo pkgutil --forget 'com.realvnc.rvncconnect.viewer.1' 2>/dev/null || true
+# Also remove the legacy VNC Viewer (pre-rebrand bundle id com.realvnc.vncviewer) if present.
+quit_application 'com.realvnc.vncviewer'
+sudo rm -rf '/Applications/VNC Viewer.app'
trash $LOGGED_IN_USER '~/Library/Application Support/com.realvnc.rvncconnect'
trash $LOGGED_IN_USER '~/Library/Caches/com.realvnc.rvncconnect'
trash $LOGGED_IN_USER '~/Library/Logs/vnc'
trash $LOGGED_IN_USER '~/Library/Preferences/com.realvnc.rvncconnect.plist'
trash $LOGGED_IN_USER '~/Library/Saved Application State/com.realvnc.rvncconnect.savedState'
+trash $LOGGED_IN_USER '~/Library/Preferences/com.realvnc.vncviewer.plist'
+trash $LOGGED_IN_USER '~/Library/Saved Application State/com.realvnc.vncviewer.savedState' |
Update maintained app metadata and frontend mapping to reflect RealVNC rebrand and package changes. Renamed app entries for macOS and Windows, bumped macOS version to 8.4.2, updated bundle identifier checks and patch queries to account for both legacy and new bundle IDs, and replaced installer URL, checksums, and install/uninstall script refs. Marked the Homebrew input as frozen. Also updated frontend icon mappings to include the new "realvnc connect viewer" name (and kept a mapping for the legacy name).
Summary by CodeRabbit
New Features
Bug Fixes