Published on

CCBuddy - Building a Native macOS Menu Bar App to Monitor Claude Code Usage

Authors
  • avatar
    Name
    Jack Qin
    Twitter

As a heavy Claude Code user, I always wondered how many tokens I was consuming and how much it was costing me. So I built CCBuddy - a native macOS menu bar app to solve this problem.

The Problem

Claude Code is an incredibly powerful AI coding assistant from Anthropic. Whether you're on a Pro/Max subscription or using the API with pay-as-you-go pricing, understanding your usage is crucial.

The challenge? Claude Code doesn't provide a visual usage dashboard. All your conversation logs are quietly stored in JSONL files under ~/.claude/projects/, but analyzing them requires manual effort.

I decided to build a native macOS application that makes token usage and costs crystal clear.

What is CCBuddy?

CCBuddy is a lightweight macOS menu bar application that:

  • Real-time monitoring of Claude Code token usage and costs
  • Dual mode support: Pro/Max subscription (5-hour rolling window) and API pay-as-you-go mode
  • Cost projection: Estimates total cost based on current "burn rate"
  • Historical analysis: View usage trends by day/week/month with charts
  • Completely offline: All calculations happen locally, zero network requests

It sits quietly in your menu bar, ready to show you the stats whenever you need them.

Key Features

Dual Mode Pricing

Pro/Max Mode - For subscription users:

  • 5-hour rolling time window
  • Real-time usage percentage and remaining time
  • Burn rate and cost projection

API Mode - For pay-as-you-go users:

  • Today/This Week/This Month/All-time cumulative costs
  • No time window constraints

Comprehensive Cost Calculation

Supports pricing for all Claude models, including the latest Claude Opus 4.5:

ModelInputOutputCache CreateCache Read
Opus 4.5$5/M$25/M$6.25/M$0.50/M
Opus 4$15/M$75/M$18.75/M$1.50/M
Sonnet 4/4.5$3/M$15/M$3.75/M$0.30/M
Haiku 4.5$1/M$5/M$1.25/M$0.10/M

Notably, CCBuddy fully supports Prompt Caching cost calculation - a detail many tools overlook. Claude's caching mechanism generates additional cache_creation_input_tokens and cache_read_input_tokens, which have different pricing than regular tokens.

Glassmorphism UI

As a native macOS app, I wanted it to blend seamlessly with the system. Using SwiftUI + AppKit's NSVisualEffectView, I achieved the signature macOS glassmorphism effect:

  • Adjustable opacity
  • Multiple material styles (Ultra Thin to Ultra Thick)
  • Smooth animations and transitions

Technical Deep Dive

Architecture

The project follows MVVM architecture with approximately 3,000 lines of Swift code:

CCBuddy/
├── Models/           # Data models
├── Services/         # Business logic (parsing, calculation, file watching)
├── ViewModels/       # UI state management
├── Views/            # SwiftUI views
└── Utilities/        # Helpers and extensions

Real-time Monitoring Pipeline

This is the heart of the application. How do we efficiently monitor file changes and update the UI?

FileWatcher (0.5s polling)
Change detected, mark as dirty
Timer check (default 10s)
Quick modification time check (avoid unnecessary parsing)
JSONLParser parses session data
UsageCalculator computes statistics
UsageViewModel publishes updates
SwiftUI automatically refreshes UI

Key optimizations:

  • Dirty flag marking: Only re-parse when files actually change
  • Modification time check: Quickly skip unchanged files
  • Deduplication: Based on requestId + messageId to avoid double-counting

JSONL Parsing

Claude Code stores data in JSONL format (one JSON object per line):

{
  "type": "assistant",
  "sessionId": "xxx-xxx-xxx",
  "timestamp": "2025-12-02T13:03:29.591Z",
  "message": {
    "model": "claude-opus-4-5-20251101",
    "usage": {
      "input_tokens": 9,
      "cache_creation_input_tokens": 5095,
      "cache_read_input_tokens": 12610,
      "output_tokens": 5
    }
  }
}

Parsing considerations:

  • Only process messages with type: "assistant" (user messages aren't billed)
  • Correctly accumulate all four token types
  • Handle multi-session, multi-project data aggregation

Swift Charts Visualization

Using the Swift Charts framework for usage history visualization:

Chart(dailyData) { item in
    BarMark(
        x: .value("Date", item.date),
        y: .value("Cost", item.cost)
    )
    .foregroundStyle(.blue.gradient)
}

Supports day/week/month view switching for intuitive trend analysis.

Development Insights

macOS menu bar apps (LSUIElement) have some quirks:

  • No Dock icon
  • No main window
  • Manual management of Popover show/hide states

The NSStatusItem + NSPopover combination is the best practice.

Bridging SwiftUI and AppKit

Pure SwiftUI can't achieve certain effects (like true glassmorphism), requiring NSViewRepresentable to bridge AppKit:

struct VisualEffectView: NSViewRepresentable {
    func makeNSView(context: Context) -> NSVisualEffectView {
        let view = NSVisualEffectView()
        view.material = .hudWindow
        view.blendingMode = .behindWindow
        return view
    }
}

Automated Release Pipeline

I configured a complete GitHub Actions workflow:

  • Automatic release build compilation
  • Package into .app bundle with proper Info.plist
  • Create DMG installer with custom icon using create-dmg
  • Auto-publish GitHub Release with changelog

This makes version releases effortless.

User Experience

After installation, CCBuddy lives in your menu bar. Click the icon to see:

┌────────────────────────────────────┐
│ ▊▊▊  CCBuddy   Pro          10s   │
├────────────────────────────────────┤
Session Progress              35%│ ████████████░░░░░░░░░░░░░░░░░░░░  │
│                                   │
│ 📄 Tokens Used             7.4M   │
│ 💲 Session Cost         $3.1725│ 🕐 Time Remaining         3:58│ 📈 Projected Cost       $22.10│ 🔥 Burn Rate         186.2K/min   │
└────────────────────────────────────┘

At a glance, you can see:

  • Token consumption in the current period
  • Current spending
  • Remaining time in the window
  • Projected cost at current rate

No more worrying about unknowingly overspending!

Tech Stack

  • Language: Swift 5.9+
  • UI Framework: SwiftUI + AppKit
  • Charts: Swift Charts
  • Minimum OS: macOS 14.0 (Sonoma)
  • Build System: Swift Package Manager
  • CI/CD: GitHub Actions

Roadmap

  • Usage threshold alerts (50%/75%/90%)
  • Launch at login
  • Historical data export
  • Keyboard shortcuts
  • Sparkle auto-update integration

Conclusion

CCBuddy was born from a real need. As a heavy Claude Code user, I needed a tool to track my usage, so I built one.

The entire project is approximately 3,000 lines of Swift code, follows MVVM architecture, and is completely open source. If you're also a Claude Code user, give it a try!


This blog post was written with the assistance of Claude Code, while CCBuddy quietly monitored the token consumption from my menu bar.