diff --git a/Coder-Desktop/Coder-Desktop/Views/FileSync/FilePicker.swift b/Coder-Desktop/Coder-Desktop/Views/FileSync/FilePicker.swift
index 032a0c3..6f39296 100644
--- a/Coder-Desktop/Coder-Desktop/Views/FileSync/FilePicker.swift
+++ b/Coder-Desktop/Coder-Desktop/Views/FileSync/FilePicker.swift
@@ -23,8 +23,7 @@ struct FilePicker: View {
         VStack(spacing: 0) {
             if model.rootIsLoading {
                 Spacer()
-                ProgressView()
-                    .controlSize(.large)
+                CircularProgressView(value: nil)
                 Spacer()
             } else if let loadError = model.error {
                 Text("\(loadError.description)")
@@ -125,7 +124,8 @@ struct FilePickerEntry: View {
             Label {
                 Text(entry.name)
                 ZStack {
-                    ProgressView().controlSize(.small).opacity(entry.isLoading && entry.error == nil ? 1 : 0)
+                    CircularProgressView(value: nil, strokeWidth: 2, diameter: 10)
+                        .opacity(entry.isLoading && entry.error == nil ? 1 : 0)
                     Image(systemName: "exclamationmark.triangle.fill")
                         .opacity(entry.error != nil ? 1 : 0)
                 }
diff --git a/Coder-Desktop/Coder-Desktop/Views/FileSync/FileSyncSessionModal.swift b/Coder-Desktop/Coder-Desktop/Views/FileSync/FileSyncSessionModal.swift
index 3e48ffd..b510867 100644
--- a/Coder-Desktop/Coder-Desktop/Views/FileSync/FileSyncSessionModal.swift
+++ b/Coder-Desktop/Coder-Desktop/Views/FileSync/FileSyncSessionModal.swift
@@ -68,7 +68,7 @@ struct FileSyncSessionModal<VPN: VPNService, FS: FileSyncDaemon>: View {
                     Text(msg).foregroundStyle(.secondary)
                 }
                 if loading {
-                    ProgressView().controlSize(.small)
+                    CircularProgressView(value: nil, strokeWidth: 3, diameter: 15)
                 }
                 Button("Cancel", action: { dismiss() }).keyboardShortcut(.cancelAction)
                 Button(existingSession == nil ? "Add" : "Save") { Task { await submit() }}
diff --git a/Coder-Desktop/Coder-Desktop/Views/VPN/VPNMenuItem.swift b/Coder-Desktop/Coder-Desktop/Views/VPN/VPNMenuItem.swift
index c10b932..3b92dc9 100644
--- a/Coder-Desktop/Coder-Desktop/Views/VPN/VPNMenuItem.swift
+++ b/Coder-Desktop/Coder-Desktop/Views/VPN/VPNMenuItem.swift
@@ -72,6 +72,8 @@ struct MenuItemView: View {
 
     @State private var apps: [WorkspaceApp] = []
 
+    @State private var loadingApps: Bool = true
+
     var hasApps: Bool { !apps.isEmpty }
 
     private var itemName: AttributedString {
@@ -129,9 +131,13 @@ struct MenuItemView: View {
                 MenuItemIcons(item: item, wsURL: wsURL)
             }
             if isExpanded {
-                if hasApps {
+                switch (loadingApps, hasApps) {
+                case (true, _):
+                    CircularProgressView(value: nil, strokeWidth: 3, diameter: 15)
+                        .padding(.top, 5)
+                case (false, true):
                     MenuItemCollapsibleView(apps: apps)
-                } else {
+                case (false, false):
                     HStack {
                         Text(item.status == .off ? "Workspace is offline." : "No apps available.")
                             .font(.body)
@@ -146,6 +152,7 @@ struct MenuItemView: View {
     }
 
     func loadApps() async {
+        defer { loadingApps = false }
         // If this menu item is an agent, and the user is logged in
         if case let .agent(agent) = item,
            let client = state.client,
diff --git a/Coder-Desktop/Coder-Desktop/Views/VPN/WorkspaceAppIcon.swift b/Coder-Desktop/Coder-Desktop/Views/VPN/WorkspaceAppIcon.swift
index 2eb45cc..94104d2 100644
--- a/Coder-Desktop/Coder-Desktop/Views/VPN/WorkspaceAppIcon.swift
+++ b/Coder-Desktop/Coder-Desktop/Views/VPN/WorkspaceAppIcon.swift
@@ -19,7 +19,7 @@ struct WorkspaceAppIcon: View {
                 ) { $0 }
                     placeholder: {
                         if app.icon != nil {
-                            ProgressView().controlSize(.small)
+                            CircularProgressView(value: nil, strokeWidth: 2, diameter: 10)
                         } else {
                             Image(systemName: "questionmark").frame(
                                 width: Theme.Size.appIconWidth,