diff --git a/ClaudeChecker/Info.plist b/ClaudeChecker/Info.plist
index 486b9e4..5ae3940 100644
--- a/ClaudeChecker/Info.plist
+++ b/ClaudeChecker/Info.plist
@@ -15,9 +15,9 @@
CFBundlePackageType
APPL
CFBundleShortVersionString
- 1.2.1-beta.6
+ 1.2.1-beta.7
CFBundleVersion
- 54
+ 55
LSMinimumSystemVersion
13.0
LSUIElement
diff --git a/ClaudeChecker/LoginView.swift b/ClaudeChecker/LoginView.swift
index 470d879..26830cb 100644
--- a/ClaudeChecker/LoginView.swift
+++ b/ClaudeChecker/LoginView.swift
@@ -38,7 +38,7 @@ struct LoginWebView: NSViewRepresentable {
// URL is not a login/auth page, so if any claude.ai cookie exists we're signed in
WKWebsiteDataStore.default().httpCookieStore.getAllCookies { cookies in
- let hasAnyCookie = cookies.contains { $0.domain.contains("claude.ai") }
+ let hasAnyCookie = cookies.contains { $0.domain.contains("claude.ai") || $0.domain.contains("anthropic.com") }
guard hasAnyCookie, !self.didAuthenticate else { return }
self.didAuthenticate = true
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
diff --git a/ClaudeChecker/UsageViewModel.swift b/ClaudeChecker/UsageViewModel.swift
index 24f5f28..b96caf6 100644
--- a/ClaudeChecker/UsageViewModel.swift
+++ b/ClaudeChecker/UsageViewModel.swift
@@ -43,7 +43,7 @@ class UsageViewModel: ObservableObject {
private func checkInitialSignInState() async {
let cookies = await WKWebsiteDataStore.default().httpCookieStore.allCookies()
- let hasAnyCookie = cookies.contains { $0.domain.contains("claude.ai") }
+ let hasAnyCookie = cookies.contains { $0.domain.contains("claude.ai") || $0.domain.contains("anthropic.com") }
if hasAnyCookie { isSignedIn = true }
}
@@ -51,7 +51,7 @@ class UsageViewModel: ObservableObject {
let store = WKWebsiteDataStore.default()
let types = WKWebsiteDataStore.allWebsiteDataTypes()
let records = await store.dataRecords(ofTypes: types)
- let claudeRecords = records.filter { $0.displayName.contains("claude.ai") }
+ let claudeRecords = records.filter { $0.displayName.contains("claude.ai") || $0.displayName.contains("anthropic.com") }
await store.removeData(ofTypes: types, for: claudeRecords)
UserDefaults.standard.removeObject(forKey: "claude_org_id")
isSignedIn = false
@@ -109,6 +109,7 @@ class UsageViewModel: ObservableObject {
checkLimitNotifications(for: limits)
} catch AppError.notAuthenticated {
isNotAuthenticated = true
+ isSignedIn = false
errorMessage = "Not signed in"
} catch let error as DecodingError {
switch error {
@@ -192,7 +193,7 @@ class UsageViewModel: ObservableObject {
private func claudeCookieHeader() async -> String? {
let cookies = await WKWebsiteDataStore.default().httpCookieStore.allCookies()
- let claudeCookies = cookies.filter { $0.domain.contains("claude.ai") }
+ let claudeCookies = cookies.filter { $0.domain.contains("claude.ai") || $0.domain.contains("anthropic.com") }
return HTTPCookie.requestHeaderFields(with: claudeCookies)["Cookie"]
}
diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md
index c408a82..d3c4a36 100644
--- a/RELEASE_NOTES.md
+++ b/RELEASE_NOTES.md
@@ -6,4 +6,6 @@
- Fixed login window auto-closing before the user could sign in — the login window now correctly loads the `/login` page so it only detects auth after the actual sign-in redirect
- Fixed "No API key configured" showing after signing out — now correctly shows "Not signed in" with a prompt to sign in
- Added `/api/organizations` as a final fallback for org ID resolution when the bootstrap API response doesn't include it
-- Fixed usage data not loading after sign-in — API requests now include required browser-like headers (Origin, Referer, User-Agent) that Claude's usage endpoints require
+- Fixed usage data not loading — API requests now include required browser-like headers (Origin, Referer, User-Agent)
+- Fixed sign-in detection and cookie handling for accounts whose session cookies are on the `anthropic.com` domain rather than `claude.ai`
+- Fixed Settings incorrectly showing "Signed in" after a failed refresh — sign-in state now resets when authentication fails