Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
- Claude: preserve Plan Usage history across external OAuth token rotations and reunite saved fragments with verified account/profile bindings, while keeping other accounts and unverified history separate (#4322). Thanks @urda!
- Claude: keep Enterprise monthly Extra usage visible in Compact Overview when quota limits are unavailable, respecting the optional-usage preference (#4320). Thanks @wrick17!
- Claude: distinguish insights-only CLI reports from subscription-only notices so failed direct fallbacks preserve the original PTY error, and log that error before fallback (#4083). Thanks @sczhui!
- Settings: open the CodexBar project website from the About pane's Website link (#4325). Thanks @elijahfriedman!
- Docs: correct Codex Auto source order and explain credential renewal, local cost coverage, and the distinct Pi, OpenCodex, OpenCode, Amp, and dots paths (#3635, #3273, #3556, #4300).
- Codex costs: share repeated turn identifiers when reading cached usage to reduce retained memory (#3323). Thanks @CharlieLZ and @kristofferR!

Expand Down
2 changes: 1 addition & 1 deletion Sources/CodexBar/PreferencesAboutPane.swift
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ struct AboutPane: View {
icon: "chevron.left.slash.chevron.right",
title: L("link_github"),
url: "https://github.com/steipete/CodexBar")
AboutLinkRow(icon: "globe", title: L("link_website"), url: "https://steipete.me")
AboutLinkRow(icon: "globe", title: L("link_website"), url: "https://codexbar.app")
AboutLinkRow(icon: "bird", title: L("link_twitter"), url: "https://twitter.com/steipete")
AboutLinkRow(icon: "envelope", title: L("link_email"), url: "mailto:peter@steipete.me")
} header: {
Expand Down
52 changes: 52 additions & 0 deletions Tests/CodexBarTests/AboutWebsiteTests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import AppKit
import SwiftUI
import Testing
@testable import CodexBar

@MainActor
struct AboutWebsiteTests {
@Test
func `website link matches the published project domain`() throws {
let root = URL(fileURLWithPath: #filePath).deletingLastPathComponent()
.deletingLastPathComponent().deletingLastPathComponent()
let domain = try String(contentsOf: root.appendingPathComponent("docs/CNAME"), encoding: .utf8)
.trimmingCharacters(in: .whitespacesAndNewlines)
#expect(try Self.websiteURL() == "https://\(domain)")
}

@Test
func `about links render without opening a browser`() throws {
guard let directory = ProcessInfo.processInfo.environment["CODEXBAR_ABOUT_WEBSITE_PROOF_DIR"] else { return }
try CodexBarLocalizationOverride.$appLanguage.withValue("en") {
let url = try Self.websiteURL()
let renderer = ImageRenderer(content: VStack(alignment: .leading, spacing: 16) {
AboutLinkRow(icon: "globe", title: L("link_website"), url: url)
Divider()
Text("Configured destination (proof annotation)").font(.caption)
Text(url).font(.system(.body, design: .monospaced))
}
.padding(24)
.frame(width: 530)
.environment(\.colorScheme, .light)
.background(Color.white))
renderer.scale = 2
let bitmap = try NSBitmapImageRep(cgImage: #require(renderer.cgImage))
let png = try #require(bitmap.representation(using: .png, properties: [:]))
let output = URL(fileURLWithPath: directory, isDirectory: true)
try FileManager.default.createDirectory(at: output, withIntermediateDirectories: true)
try png.write(to: output.appendingPathComponent("about.png"))
}
}

private static func websiteURL() throws -> String {
let root = URL(fileURLWithPath: #filePath).deletingLastPathComponent()
.deletingLastPathComponent().deletingLastPathComponent()
let source = try String(
contentsOf: root.appendingPathComponent("Sources/CodexBar/PreferencesAboutPane.swift"), encoding: .utf8)
let pattern = #"title:\s*L\("link_website"\),\s*url:\s*"([^"]+)""#
let regex = try NSRegularExpression(pattern: pattern)
let match = try #require(regex.firstMatch(in: source, range: NSRange(source.startIndex..., in: source)))
let range = try #require(Range(match.range(at: 1), in: source))
return String(source[range])
}
}
1 change: 1 addition & 0 deletions docs/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ read_when:
# Configuration

The app's **Help → CodexBar Help** command opens the [README](https://github.com/steipete/CodexBar/blob/main/README.md), including setup instructions and links to provider documentation.
**Settings → About → Website** opens the project website at [codexbar.app](https://codexbar.app).

The app and CLI share one JSON file for API keys, manual cookie headers, source selection, provider ordering, and token accounts. The running app detects external edits, atomic replacements, and restored older contents, including during watcher startup and change callbacks. App writes update the baseline without being treated as external edits.
Keychain holds runtime cookie caches, browser Safe Storage access, and provider OAuth/device-flow credentials where required.
Expand Down
Loading