- Notifications
You must be signed in to change notification settings - Fork3
Comparing changes
Open a pull request
base repository:coder/coder-desktop-macos
Uh oh!
There was an error while loading.Please reload this page.
base:314edbe
head repository:coder/coder-desktop-macos
Uh oh!
There was an error while loading.Please reload this page.
compare:170b399
- 19commits
- 51files changed
- 2contributors
Commits on May 14, 2025
chore: set 'stop VPN on quit' setting to true by default (#155)
It's fair to assume if you're closing Coder Desktop, you want Coder Connect to stop, so this is the default behaviour.Tailscale also stops their VPN when quitting the app, even though it works fine with the app closed.
Commits on May 16, 2025
fix: manually upgrade system extension (#158)
This PR addresses#121. The underlying bug is still present in macOS, this is just a workaround, so I'm leaving the issue open.macOS calls `actionForReplacingExtension` whenever the version string(s) of the system extension living inside the Coder Desktop app bundle change.i.e. When a new version of the app is installed:1. App sends `activationRequest` (it does this on every launch, to see if the NE is installed)2. Eventually, `actionForReplacingExtension` is called, which can either return `.cancel` or `.replace`.3. Eventually,`didFinishWithResult` is called with whether the replacement was successful.(`actionForReplacingExtension` is *always* called when developing the app locally, even if the version string(s) don't differ)However, in the linked issue, we note that this replacement process is bug-prone. This bug can be worked around by deleting the system extension (in settings), and reactivating it (such as by relaunching the app).Therefore, in this PR, when `didFinishWithResult` is called following a replacement request, we instead will:1. Send a `deactivationRequest`, and wait for it to be successful.2. Send another `activationRequest`, and wait for that to be successful.Of note is that we *cannot* return `.cancel` from `actionForReplacingExtension` and then later send a `deactivationRequest`. `deactivationRequest` *always* searches for a system extension with version string(s) that match the system extension living inside the currently installed app bundle. Therefore, we have to let the replacement take place before attempting to delete it.Also of note is that a successful `deactivationRequest` of the system extension deletes the corresponding VPN configuration. This configuration is normally created by logging in, but if the user is already logged in, we'll update the UI to include a `Reconfigure VPN` button.<img width="263" alt="image" src="https://github.com/user-attachments/assets/d874821e-1696-4d17-bb3e-4ea83556f75c" />I've tested this PR in a fresh macOS 15.4 VM, upgrading from the latest release. I also forced the bug in the linked issue to occur by toggling on the VPN in System Settings before opening the new version of the app for the first time, and going through all the additional prompts did indeed prevent the issue from happening.
fix: set network extension as unconfigured when system extension is d…
Commits on May 19, 2025
feat: add experimental privileged helper (#160)
Closes#135.Closes#142.This PR adds an optional privileged `LaunchDaemon` capable of removing the quarantine flag on a downloaded `.dylib` without prompting the user to enter their password. This is most useful when the Coder deployment updates frequently.<img width="597" alt="image" src="https://github.com/user-attachments/assets/5f51b9a3-93ba-46b7-baa3-37c8bd817733" />The System Extension communicates directly with the `LaunchDaemon`, meaning a new `.dylib` can be downloaded and executed even if the app was closed, which was previously not possible. I've tested this in a fresh 15.4 VM.
Commits on May 22, 2025
feat: show when workspace apps are loading (#163)
Also switches all the stock ProgressViews to our new CircularProgressViewhttps://github.com/user-attachments/assets/7d800856-5dc3-4ae2-8193-41debbf676bdhttps://github.com/user-attachments/assets/c6a953b4-c14f-437c-8e02-2c21348386e7
Commits on May 23, 2025
ci: sign builds for distribution via sparkle (#165)
First PR for#47.To test the later components, we need a release build and a preview build signed with this key. So, this needs to be merged first.I've tested the release script with a dry-run, and validated the pkg passes `sparkle/sign_update --verify`, and that the app still works in a VM (specifically checking that signing it didn't invalidate the notarization, but I don't think signing it modifies it's contents, it just checks the signature matches the embedded public key)
Commits on May 27, 2025
fix: don't create http client if signed out (#166)
If the session item in the keychain is missing but `hasSession` is true, the app will force unwrap the session token optional and crash on launch. Encountered this today.
Commits on May 28, 2025
fix: conform CFBundleVersion to documentation (#167)
Second PR for#47.Previously, we were setting [`CFBundleVersion`](https://developer.apple.com/documentation/bundleresources/information-property-list/cfbundleversion) to the output of `git describe --tags` (`vX.Y.Z` or `vX.Y.Z-N-gHASH` for preview builds).To support Sparkle, and potentially to avoid a breakage with macOS failing to update an installed `LaunchDaemon` when it can't parse `CFBundleVersion`, we'll conform the string to the specification.Given that:> You can include more integers but the system ignores them.We set `CFBundleVersion` to a value of the form `X.Y.Z[.N]` where N is the number of commits since the `X.Y.Z` tag (omitted if 0)Sparkle did previously allow you to supply a manual version comparator, but it was deprecated to help require `CFBundleVersion` start with `X.Y.Z`sparkle-project/Sparkle#2585That issue recommends instead putting marketing version information in `CFBundleShortVersionString`, but that actually has even stricter requirements:https://developer.apple.com/documentation/bundleresources/information-property-list/cfbundleshortversionstringThough not documented, from testing & reading the [Sparkle source](https://github.com/sparkle-project/Sparkle/blob/2.x/Sparkle/SUStandardVersionComparator.m), I discovered that `X.Y.Z.N+1` will be deemed a later version than `X.Y.Z.N`, which is what we'll do for the preview stream of auto-updates. For non-preview builds (i.e. builds on a tag), both version strings will be `X.Y.Z`.Since we're no longer including the commit hash in a version string, we instead embed it separately in the `Info.plist` so we can continue to display it in the UI:<img width="284" alt="image" src="https://github.com/user-attachments/assets/a9b2359d-6e2f-4f7d-979c-ba69ee01e69c" />
Commits on May 29, 2025
feat: make on-upgrade steps more obvious (#172)
Before:<img width="254" alt="image" src="https://github.com/user-attachments/assets/1460ea58-c915-4c72-85c4-0655030cb99f" />After:<img width="260" alt="Screenshot 2025-05-29 at 4 41 05 pm" src="https://github.com/user-attachments/assets/34fe0293-ccc4-4686-9285-eb7482d7a10e" /> <img width="258" alt="Screenshot 2025-05-29 at 4 40 56 pm" src="https://github.com/user-attachments/assets/2bd640eb-5d11-4384-8a24-b705148c2b2a" />
Commits on May 30, 2025
ci: add
update-appcast
script (#171)Third PR for#47.Adds a script to update an existing `appcast.xml`.This will be called in CI to update the appcast before uploading it back to our feed URL (`releases.coder.com/...`). It's currently not used anywhere.Invoked like:```swift run update-appcast -i appcast.xml -s CoderDesktop.pkg.sig -v 0.5.1 -o appcast.xml -d ${{ github.event.release.body }}```To update an appcast that looks like:<details><summary>appcast.xml</summary>```xml<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle" version="2.0"> <channel> <title>Coder Desktop</title> <item> <title>v0.5.1</title> <description><![CDATA[<h2>What's Changed</h2><ul><li>fix: don't create http client if signed out by@ethanndickson in <a href="https://github.com/coder/coder-deskt%E2%80%A6r-desktop-macos/pull/170">https://github.com/coder/coder-deskt…r-desktop-macos/pull/170</a></li></ul><p><strong>Full Changelog</strong>: <a href="https://github.com/coder/coder-desktop-macos/compare/v0.5.0...v0.5.1">https://github.com/coder/coder-desktop-macos/compare/v0.5.0...v0.5.1</a></p>]]></description> <pubDate>Thu, 29 May 2025 06:08:56 +0000</pubDate> <sparkle:channel>stable</sparkle:channel> <sparkle:version>0.5.1</sparkle:version> <sparkle:fullReleaseNotesLink>https://github.com/coder/coder-desktop-macos/releases</sparkle:fullReleaseNotesLink> <sparkle:minimumSystemVersion>14.0.0</sparkle:minimumSystemVersion> <enclosure url="https://github.com/coder/coder-desktop-macos/releases/download/v0.5.1/Coder-Desktop.pkg" type="application/octet-stream" sparkle:installationType="package" sparkle:edSignature="NkyCj7Lzpw95P0N95SQHiBCjDLZYVukbRR3aOjGZAuL5Dc+I//DfTCRFCxoQNhA38uu/CCAR8v9E4SgMkDdmAA==" length="39630183"></enclosure> </item> <item> <title>Preview</title> <pubDate>Thu, 29 May 2025 06:08:08 +0000</pubDate> <sparkle:channel>preview</sparkle:channel> <sparkle:version>0.5.0.3</sparkle:version> <sparkle:fullReleaseNotesLink>https://github.com/coder/coder-desktop-macos/releases</sparkle:fullReleaseNotesLink> <sparkle:minimumSystemVersion>14.0.0</sparkle:minimumSystemVersion> <enclosure url="https://github.com/coder/coder-desktop-macos/releases/download/preview/Coder-Desktop.pkg" type="application/octet-stream" sparkle:installationType="package" sparkle:edSignature="L0cFeyoy+D/Zgm3eXok87SKmgIUka8m2b+g7UWPReF4UhFUb4RlDsZ5PxXKd5MrtsaODGUz2iRMWraO7aQg+DA==" length="39630898"></enclosure> </item> </channel></rss>```</details>Producing a notification like:<img width="620" alt="image" src="https://github.com/user-attachments/assets/acae89d6-5d39-4464-bf60-7beac66af9c7" />
Commits on Jun 2, 2025
ci: remove cache-nix-action (#175)
It's twice as fast without the cacheWith cache:<img width="296" alt="image" src="https://github.com/user-attachments/assets/865bfbaf-774d-4213-ba99-b338dbef13dd" />Without:<img width="296" alt="image" src="https://github.com/user-attachments/assets/e55be0dd-bd4e-472f-af4c-c5d06f7ef7ad" />I can only assume it's just faster to compile some of the dependencies then to copy them from the cache
ci: update appcast on builds (#174)
Fourth PR for#47.Dry-run worked!https://releases.coder.com/coder-desktop/mac/appcast.xml
Closes#47.Stable:<img width="615" alt="image" src="https://github.com/user-attachments/assets/e34c8138-dac7-48ab-af76-0feea79c9f7e" />Preview:<img width="614" alt="image" src="https://github.com/user-attachments/assets/caeb2750-b735-473d-8568-e8f1098954d0" />Additionally:- Removes the updating of the `coder-desktop-preview` cask. - Marks the `coder-desktop` cask as auto-updating, so brew doesn't attempt to `upgrade` itself.I'll also need to make a PR on the `homebrew-coder` repo to mark it as deprecated in brew. If a user wishes to be on the preview channel, they just need to install the stable version, and switch to the preview channel in settings.
ci: fix homebrew out format (#177)
For some reason this line needs to be in the same stanza as conflicts_on. This passes the homebrew CI.
ci: bump google-github-actions/auth from 2.1.8 to 2.1.10 in the githu…
…b-actions group (#178)Signed-off-by: dependabot[bot] <support@github.com>Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Commits on Jun 3, 2025
ci: set preview build description to commit message (#180)
Just lets you see what changed in a preview build at a glance.
fix: disable unattended updates (#179)
There's no point allowing users to enable unattended updates, as the installer requires a password prompt, as does the app the first time it's launched after updating -- it would be more annoying than useful.All this does is remove the checkbox on the update prompt:Before:<img width="1020" alt="image" src="https://github.com/user-attachments/assets/7bed4a05-cf6e-4de4-9f08-e5a05c4ceac5" />After:<img width="620" alt="image" src="https://github.com/user-attachments/assets/a1375eb2-0cd5-4e35-93d1-52275132fc1b" />Automatic update *checks* can still be enabled in settings.
This comparison is taking too long to generate.
Unfortunately it looks like we can’t render this comparison for you right now. It might be too big, or there might be something weird with your repository.
You can try running this command locally to see the comparison on your machine:git diff 314edbe...170b399
Uh oh!
There was an error while loading.Please reload this page.