@@ -276,14 +276,15 @@ final class ViewModel: ObservableObject {
276276 errorMessage = nil
277277 lastUpdated = nil
278278 history.removeAll()
279− isLoading = false
280279 }
281280
282281 refreshTask = Task { @MainActor in
283282 // Check cancellation before setting isLoading — a previous
284283 // refresh() may have cancelled us and already set isLoading = false.
285284 guard !Task.isCancelled else { return }
286− if !key.isEmpty { isLoading = true }
285+ // Loading state covers both fetches: the popover's loading view depends
286+ // on it, and Claude usage is fetched even when there's no Hyper key.
287+ isLoading = true
287288 // Don't clear the errors here — keep showing the last one
288289 // until we have a successful result.
289290
@@ -297,6 +298,7 @@ final class ViewModel: ObservableObject {
297298
298299 applyBalance(balanceResult)
299300 applyClaude(claudeResult)
301+ isLoading = false
300302 }
301303 }
302304
@@ -338,8 +340,6 @@ final class ViewModel: ObservableObject {
338340 // (it's already nil in that case, so nothing to do).
339341 errorMessage = error.localizedDescription
340342 }
341−
342− isLoading = false
343343 }
344344
345345 // MARK: - Claude Usage