Your bank accounts, credit cards, and spending — always one click away in the macOS menu bar.
PlaidBar is an open-source macOS menu bar app that integrates with Plaid to display bank account balances, credit card utilization, recent transactions, and spending breakdowns — all from your status bar.
No cloud. No telemetry. All data stays local.
Personal finance data lives behind bank website logins. The closest thing to a menu bar finance app was Balance — commercial and now defunct. PlaidBar fills that gap as an open-source, privacy-first alternative.
- Glanceable — Net balance visible right in the menu bar
- Account Balances — All bank accounts and credit cards at a glance
- Recent Transactions — Searchable, filterable list grouped by day with category icons
- Transaction Detail — Tap any transaction for merchant, category, account, and status details
- Transaction Filtering — Filter by category, account, or date range with chip controls
- Recurring Detection — Automatic identification of subscriptions and recurring charges with monthly total
- Spending Breakdown — Donut chart, trend line, income vs expense views, and month-over-month comparison
- Credit Utilization — Progress bars with configurable warning thresholds and gauge
- Smart Notifications — Alerts for large transactions, low balances, and high credit utilization
- Balance History — Sparkline showing net balance trend over time
- Keyboard Shortcuts — Cmd+1-4 to switch tabs, Cmd+R to refresh, Cmd+N to add account
- Settings Persistence — Preferences saved across launches
- Launch at Login — Optional auto-start via macOS Login Items
- Auto-Updates — Sparkle integration for seamless updates
- Sandbox Mode — Try with demo data, no Plaid credentials needed
- Private — Everything stored locally on your Mac, period
Generate screenshots:
./Scripts/screenshots.sh(requires building in release mode)
git clone https://github.com/ftchvs/PlaidBar.git
cd PlaidBar
swift build./Scripts/run.sh --sandboxThis starts both the local server and the menu bar app with Plaid's sandbox environment (demo bank data).
Select "Try with sandbox" → Add Account → complete the demo bank login in your browser → data appears instantly.
export PLAID_CLIENT_ID=your_client_id
export PLAID_SECRET=your_secret
./Scripts/run.shGet credentials free at dashboard.plaid.com. Sandbox works immediately; production requires Plaid approval.
| Shortcut | Action |
|---|---|
Cmd+1 |
Accounts tab |
Cmd+2 |
Transactions tab |
Cmd+3 |
Spending tab |
Cmd+4 |
Credit tab |
Cmd+R |
Refresh balances |
Cmd+N |
Add account |
| Requirement | Version |
|---|---|
| macOS | 15.0 (Sequoia)+ |
| Swift | 6.0+ |
| Xcode | 16+ (or Swift toolchain) |
| Plaid account | Free for sandbox |
PlaidBar uses a two-process architecture — a SwiftUI menu bar app talks to a local companion server that proxies all Plaid API calls.
┌─────────────────────────────────────┐
│ PlaidBar.app (SwiftUI) │
│ MenuBarExtra · Swift Charts │
│ Accounts · Transactions · Spending │
└──────────────┬──────────────────────┘
│ HTTP (localhost:8484)
┌──────────────▼──────────────────────┐
│ PlaidBarServer (Hummingbird 2) │
│ Plaid API proxy · Fluent/SQLite │
│ Token storage · OAuth callback │
└──────────────┬──────────────────────┘
│ HTTPS
┌──────────────▼──────────────────────┐
│ Plaid API │
│ /accounts · /transactions/sync │
└─────────────────────────────────────┘
Why a companion server? Plaid requires that client_secret and access_token never exist in client code. The server:
- Holds all secrets in a local SQLite database
- Binds to
127.0.0.1only — zero network exposure - Can be restarted independently of the UI
- Opens the door for future CLI tools or iOS companion
| Layer | Technology | Why |
|---|---|---|
| Menu bar app | SwiftUI MenuBarExtra (.window) |
Native macOS, modern API |
| Charts | Swift Charts | Built-in, no dependencies |
| Design system | Semantic tokens + 8pt grid | Consistent, maintainable |
| Local server | Hummingbird 2 | Lightweight, SwiftNIO-based, same language as app |
| Database | SQLite via Fluent ORM | Migrations, queries, Hummingbird-native |
| Secrets (app) | macOS Keychain | OS-level secure storage |
| Auto-updates | Sparkle 2 | Standard for open-source macOS apps |
| Launch at login | SMAppService | Native macOS Login Items API |
PlaidBar/
├── Sources/
│ ├── PlaidBar/ # macOS menu bar app
│ │ ├── App/ # @main entry, AppState
│ │ ├── Theme/ # Design tokens, typography
│ │ ├── Views/ # SwiftUI views (4 tabs)
│ │ │ ├── AccountsView.swift # Balance list by account type
│ │ │ ├── TransactionsView.swift # Searchable grouped list
│ │ │ ├── SpendingView.swift # Donut/trend/bar charts
│ │ │ ├── CreditView.swift # Utilization bars + gauge
│ │ │ ├── SetupView.swift # Onboarding flow
│ │ │ └── Charts/ # Chart components
│ │ ├── Models/ # Local cache models
│ │ ├── Services/ # HTTP client, refresh, launch
│ │ └── Settings/ # Preferences window
│ ├── PlaidBarServer/ # Local companion server
│ │ ├── Routes/ # REST endpoints
│ │ ├── Plaid/ # Plaid API client + models
│ │ ├── Storage/ # Fluent models + migrations
│ │ └── Config/ # Server configuration
│ └── PlaidBarCore/ # Shared library
│ ├── Models/ # DTOs (Account, Transaction, etc.)
│ └── Utilities/ # Currency formatters, constants
├── Tests/ # 61 tests across 3 suites
├── Scripts/ # build.sh, run.sh, screenshots.sh
├── Assets/ # README screenshots
├── DESIGN.md # Design system spec
├── PRD.md # Product requirements
├── .github/workflows/ci.yml # GitHub Actions CI
├── Package.swift # SPM with 3 targets
└── LICENSE # MIT
PlaidBar uses these Plaid endpoints:
| Endpoint | Feature | Cost | Frequency |
|---|---|---|---|
/link/token/create |
Account setup | Free | On-demand |
/item/public_token/exchange |
Account setup | Free | Once per bank |
/accounts/get |
Cached balances | Free | Every 15 min |
/accounts/balance/get |
Real-time balances | Per-request | Manual refresh |
/transactions/sync |
Transactions | Per-item | Every 30 min |
Rate limits are well within Plaid's allowances for personal use (~2-4 requests/hour/item).
| Concern | How PlaidBar handles it |
|---|---|
| Plaid secrets | Stored in server SQLite, never in app binary |
| Access tokens | Encrypted at rest, localhost-only server |
| Network exposure | Server binds to 127.0.0.1 only |
| App ↔ Server auth | Shared token generated at first run |
| Data at rest | macOS encrypted APFS volume |
| Distribution | Hardened runtime + notarized DMG (planned) |
PlaidBar has no cloud backend, no analytics, no telemetry, and no tracking. Your financial data never leaves your machine.
# Build all targets
swift build
# Build release
swift build -c release
# Run tests (61 tests)
swift test
# Run server standalone
swift run PlaidBarServer --sandbox
# Run both (server + app)
./Scripts/run.sh --sandbox
# Capture screenshots (demo mode)
./Scripts/screenshots.sh
# First-time setup helper
./Scripts/setup.shSee CONTRIBUTING.md for code style, PR process, and architecture guidelines.
The companion server exposes these localhost endpoints:
| Method | Endpoint | Description |
|---|---|---|
GET |
/health |
Health check |
GET |
/api/status |
Server version, environment, item count |
GET |
/api/items |
List connected bank items |
POST |
/api/link/create |
Create Plaid Link token + URL |
GET |
/oauth/callback |
Plaid OAuth redirect handler |
GET |
/api/accounts |
List all accounts (cached) |
GET |
/api/accounts/balances |
Real-time balances |
DELETE |
/api/accounts/:itemId |
Remove a bank connection |
GET |
/api/transactions/sync |
Incremental transaction sync |
- Budget alerts per category
- Multi-currency support
- Investment account tracking (Plaid Investments)
- CSV/JSON export for tax/accounting
- Webhook support for real-time updates
- macOS notifications for large transactions
- Homebrew cask distribution
- Dark/light theme customization
- Teller as alternative provider (free tier)
- Recurring transaction detection
- RepoBar — GitHub stats in the macOS menu bar
- Balance — Commercial macOS finance app (defunct)
- Cashculator — Personal finance for Mac




