## What Adds a **Recovering from a stale tunnel** section to the Coder Desktop user guide, with separate macOS and Windows procedures, and tightens the existing macOS log-collection instructions. ## Why Users in the field have hit a state where Coder Desktop's menu bar / tray shows **Coder Connect** as enabled but the embedded tunnel is no longer working: * `workspace.coder` fails to resolve (`No such host`), or * DNS returns stale `fd60:627a:a42b::/48` addresses that no longer route, causing `coder ssh`, file sync, and the directory picker to hang. Related issues: * coder/coder#26669 — `ExistsViaCoderConnect` false positives when Coder Desktop has stale DNS * coder/coder-desktop-windows#171 — Tray reports Coder Connect as healthy while tunnel/DNS is broken Until the underlying state-management gap is fixed in the apps, the docs should give users (and support) a safe, repeatable way to recover without rebooting. ## Changes `docs/user-guides/desktop/index.md`: 1. **New "Recovering from a stale tunnel" section** under Troubleshooting: * **macOS:** stop the VPN configuration with `scutil --nc stop`, quit the app via `osascript`, restart the helper daemon in place with `launchctl kickstart -k system/com.coder.Coder-Desktop.Helper`, flush DNS caches, then relaunch. * Includes a warning to **not** use `launchctl bootout`, which removes the daemon from launchd's system domain entirely and is not re-bootstrapped on app relaunch. * Includes a verification step using the built-in sentinel hostname `is.coder--connect--enabled--right--now.coder` (defined in `tailnet/conn.go` as `IsCoderConnectEnabledFmtString`) so users don't need a workspace name to confirm the tunnel is healthy. * Uses `dig @fd60:627a:a42b::53` (explicit server) and `dscacheutil -q host -a name` because plain `dig` does not respect the macOS system resolver. * **Windows:** stop the app and `Coder Desktop` service, flush DNS, restart, then verify the NRPT rule and Wintun adapter. Notes that `ipconfig /flushdns` does not reset the embedded resolver and that filtering agents (e.g., Zscaler) may still shadow `.coder` lookups. 2. **macOS log-collection improvements:** * Switch the predicate from `subsystem == "com.coder.Coder-Desktop"` to `subsystem BEGINSWITH "com.coder.Coder-Desktop"` so the export captures the app, helper daemon, and network extension (which all log under prefixed subsystems). * Add a `log stream` example for live tailing while reproducing an issue. ## Verification * `npx markdownlint-cli2 docs/user-guides/desktop/index.md` — 0 errors. * macOS recovery steps were validated end-to-end on a real install (the `kickstart -k` form, in particular, was confirmed to restart the helper without breaking the install, unlike `bootout`). --- Created on behalf of @mdanter --------- Co-authored-by: blink-so[bot] <211532188+blink-so[bot]@users.noreply.github.com> Co-authored-by: Atif Ali <atif@coder.com> Co-authored-by: Nick Vigilante <nickvigilante@users.noreply.github.com> Co-authored-by: Matyas Danter <mdanter@gmail.com>
12 KiB
Coder Desktop
Coder Desktop provides seamless access to your remote workspaces through a native application. Connect to workspace services using simple hostnames like myworkspace.coder, launch applications with one click, and synchronize files between local and remote environments, all without installing a CLI or configuring manual port forwarding.
Tip
Coder Desktop provides automatic port forwarding to every service running in your workspace. Any port your application listens on is instantly accessible at
workspace-name.coder:PORTwith no manual setup required. For a comparison of all port forwarding methods, see Workspace Ports.
What You'll Need
- A Coder deployment running
v2.20.0or later - Administrator privileges on your local machine (for VPN extension installation)
- Access to your Coder deployment URL
Quick Start
- Install:
brew install --cask coder/coder/coder-desktop(macOS) orwinget install Coder.CoderDesktop(Windows) - Open Coder Desktop and approve any system prompts to complete the installation.
- Sign in with your deployment URL and session token
- Enable "Coder Connect" toggle
- Access workspaces at
workspace-name.coder
How It Works
Coder Connect, the primary component of Coder Desktop, creates a secure tunnel to your Coder deployment, allowing you to:
- Access workspaces directly: Connect via
workspace-name.coderhostnames - Automatic port forwarding: All workspace ports are available at
workspace-name.coder:PORTwith no configuration - Use any application: SSH clients, browsers, IDEs work seamlessly
- Sync files: Bidirectional sync between local and remote directories
- Work offline: Edit files locally, sync when reconnected
The VPN extension routes only Coder traffic—your other internet activity remains unchanged.
Installation
macOS
Homebrew (Recommended)
brew install --cask coder/coder/coder-desktop
Manual Installation
- Download the latest release from coder-desktop-macos releases
- Run
Coder-Desktop.pkgand follow the prompts to install Coder Desktop.appwill be installed to your Applications folder
Coder Desktop requires VPN extension permissions:
- When prompted with "Coder Desktop" would like to use a new network extension, select Open System Settings
- In Network Extensions settings, enable the Coder Desktop extension
- You may need to enter your password to authorize the extension
✅ Verify Installation: Coder Desktop should appear in your menu bar
Windows
WinGet (Recommended)
winget install Coder.CoderDesktop
Manual Installation
- Download the latest
CoderDesktopinstaller (.exe) from coder-desktop-windows releases - Choose the correct architecture (
x64orarm64) for your system - Run the installer and accept the license terms
- If prompted, install the .NET Windows Desktop Runtime
- Install Windows App Runtime SDK if prompted
- .NET Windows Desktop Runtime (installed automatically if not present)
- Windows App Runtime SDK (may require manual installation)
✅ Verify Installation: Coder Desktop should appear in your system tray (you may need to click ^ to show hidden icons)
Testing Your Connection
Once connected, test access to your workspaces:
SSH Connection
ssh your-workspace.coder
Ping Test
# macOS
ping6 -c 3 your-workspace.coder
# Windows
ping -n 3 your-workspace.coder
Web Services
Open http://your-workspace.coder:PORT in your browser, replacing PORT with the specific service port you want to access (e.g. 3000 for frontend, 8080 for API)
Administrator Configuration
Organizations that manage Coder Desktop deployments can configure the application using MDM (Mobile Device Management) or group policy.
Disable Automatic Updates
Administrators can disable the built-in auto-updater to manage updates through their own software distribution system.
macOS
Set the disableUpdater preference to true using the defaults command:
defaults write com.coder.Coder-Desktop disableUpdater -bool true
Organization administrators can also enforce this setting across managed devices using MDM (Mobile Device Management) software by deploying a configuration profile that sets this preference.
Windows
Set the Updater:Enable registry value to 0 under HKEY_LOCAL_MACHINE\SOFTWARE\Coder Desktop\App:
New-Item -Path "HKLM:\SOFTWARE\Coder Desktop\App" -Force
New-ItemProperty -Path "HKLM:\SOFTWARE\Coder Desktop\App" -Name "Updater:Enable" -Value 0 -PropertyType DWord -Force
You can also configure a Updater:ForcedChannel string value to lock users to a specific update channel (e.g. stable).
Note
For security, updater settings can only be configured at the machine level (
HKLM), not per-user (HKCU).
Troubleshooting
Connection Issues
Can't connect to workspace
- Verify Coder Connect is enabled (toggle should be ON)
- Check that your deployment URL is correct
- Ensure your session token hasn't expired
- Try disconnecting and reconnecting Coder Connect
VPN extension not working
- Restart Coder Desktop
- Check system permissions for network extensions
- Ensure only one copy of Coder Desktop is installed
Recover from a stale tunnel
If the menu bar or tray shows Coder Connect as enabled but workspaces are
unreachable (SSH hangs, workspace.coder fails to resolve, or file sync cannot
list the workspace directory), the embedded tunnel may be in a stale state.
Restart the helper components first.
If that doesn't resolve the issue, reboot your computer.
macOS
Run the following commands in a terminal. These steps leave the app and helper daemon installed. They only restart the running tunnel and flush DNS caches.
-
Stop the Coder VPN configuration:
vpn_name=$(scutil --nc list | grep "com.coder.Coder-Desktop" | awk -F'"' '{print $2}' | tail -n1) if [ -n "$vpn_name" ]; then scutil --nc stop "$vpn_name"; fi -
Quit the Coder Desktop app:
osascript -e 'tell application id "com.coder.Coder-Desktop" to quit' -
Restart the helper daemon in place:
sudo launchctl kickstart -k system/com.coder.Coder-Desktop.HelperWarning
Do not use
launchctl bootouthere.bootoutremoves the daemon from launchd's system domain entirely, and relaunching the app does not re-bootstrap it. Usekickstart -kto restart it in place. -
Flush DNS caches:
sudo dscacheutil -flushcache sudo killall -HUP mDNSResponder -
Confirm the stale tunnel is gone (the command should print nothing):
scutil --nc list | grep "com.coder.Coder-Desktop" -
Relaunch Coder Desktop from your
/Applicationsfolder and toggle Coder Connect back on.
To verify the tunnel is healthy after relaunching, query the built-in sentinel hostname against Coder Desktop's embedded DNS server:
dig @fd60:627a:a42b::53 AAAA is.coder--connect--enabled--right--now.coder +short
dscacheutil -q host -a name is.coder--connect--enabled--right--now.coder
Both commands should return an fd60:627a:a42b::/48 address.
If dig returns nothing or dscacheutil reports no entries, Coder Connect is not publishing DNS.
Collect logs and file an issue.
Windows
Run the following in an elevated PowerShell session. The service restart clears the embedded DNS state. The NRPT and adapter checks confirm the system routing policy is intact.
-
Stop the app and the VPN service:
Get-Process -Name "Coder Desktop" -ErrorAction SilentlyContinue | Stop-Process -Force Stop-Service -Name "Coder Desktop" -Force -
Flush DNS caches:
ipconfig /flushdns Clear-DnsClientCache -
Start the service again and relaunch the app:
Start-Service -Name "Coder Desktop" Start-Process "C:\Program Files\Coder Desktop\CoderDesktop.exe" -
After re-enabling Coder Connect in the tray, verify the NRPT rule and the Wintun adapter exist:
Get-DnsClientNrptRule | Where-Object { $_.Namespace -like "*.coder" } Get-NetAdapter | Where-Object { $_.InterfaceDescription -like "*Wintun*" }If either command returns nothing while Coder Connect shows as enabled, the tunnel did not finish coming up. Disable and re-enable the toggle, or repeat the steps above.
Note
ipconfig /flushdnsdoes not reset Coder Desktop's embedded DNS resolver; restarting the service is what clears its internal cache. If you are running a network filtering agent (for example, Zscaler), it may shadow.coderlookups even after the tunnel comes back. Check with your IT team if DNS still fails after a clean restart.
Collect logs
When reporting an issue, attach the relevant log files so we can diagnose it faster.
macOS
Coder Desktop and its network extension write to the Apple unified logging system. The file sync (Mutagen) daemon writes to a separate log file.
-
Export the unified logs for the last hour with the
logcommand:log show --predicate 'subsystem BEGINSWITH "com.coder.Coder-Desktop"' \ --info --debug --last 1h > ~/Desktop/coder-desktop.logThe
BEGINSWITHpredicate captures the app, the helper daemon, and the network extension, which all log under subsystems prefixed withcom.coder.Coder-Desktop. Adjust--last(e.g.30m,2h,1d) to cover the time the issue occurred.You can stream the logs live while reproducing an issue:
log stream --predicate 'subsystem BEGINSWITH "com.coder.Coder-Desktop"' --info --debugYou can also view the same logs interactively in Console.app by filtering on
subsystem:com.coder.Coder-Desktopwith Info and Debug messages enabled. -
If you're using file sync, also collect the Mutagen daemon log:
~/Library/Application\ Support/Coder\ Desktop/Mutagen/daemon.logCoder Desktop also opens this file in Console automatically when the file sync daemon fails.
Windows
Coder Desktop has three components that write logs: the app (UI), the VPN service, and the file sync (Mutagen) daemon.
-
App log (daily rolling):
%LOCALAPPDATA%\CoderDesktop\app.log -
VPN service log (default install path):
C:\Program Files\Coder Desktop\coder-desktop-service.log -
File sync (Mutagen) daemon log, if you use file sync:
%LOCALAPPDATA%\CoderDesktop\mutagen\daemon.log
You can quickly open the app log directory by pasting %LOCALAPPDATA%\CoderDesktop into File Explorer.
Tip
Before attaching logs to a public issue, review them for any sensitive information (deployment URLs, usernames, hostnames) and redact as needed.
Getting Help
If you encounter issues not covered here:
Uninstalling
macOS
- Disable Coder Connect in the app menu
- Quit Coder Desktop completely
- Remove VPN extension from System Settings > Network Extensions
- Delete the app from Applications folder
- Remove configuration (optional):
rm -rf ~/Library/Application\ Support/Coder\ Desktop
Windows
- Disable Coder Connect in the app menu
- Quit Coder Desktop from system tray
- Uninstall via Settings > Apps or Control Panel
- Remove configuration (optional): Delete
%APPDATA%\Coder Desktop