The native macOS companion app for Claude Code.
Six live Claude sessions in one window. Embedded terminals with real PTYs. A polished UI for MCPs, skills, plugins, and usage analytics — all the things Claude Code can do, surfaced where you can see them.
Download for macOS → Read the latest release notes →
- Tabbed Claude sessions — run multiple Claude Code sessions side-by-side in one window. Each tab is a real PTY hosting a real
claudeprocess, not a subprocess wrapper. Drag to reorder. Cmd+1–9 to switch. - MCPs tab — every MCP feature Claude Code exposes, with a UI: three real scopes (User / Local / Project), HTTP headers + Bearer-token masking, OAuth fields,
alwaysLoadtoggle, per-server timeouts,${VAR}env expansion. Matches what Claude Code's docs describe; saves you from hand-editing~/.claude.json. - Skills tab — browse personal, project, and plugin skills with full SKILL.md preview. See which copy actually wins when a name exists at multiple scopes. Create, clone, toggle auto-invoke.
- Marketplace tab — browse plugin marketplaces, install/update/uninstall plugins.
- Usage tab — GitHub-style daily heatmap, week/month/year views, today vs yesterday delta, K/M/B/T token formatting.
- Restart session — in-place SIGTERM + respawn so a Claude session picks up newly-added MCPs / hooks / skills without leaving the terminal.
- Sparkle auto-update — signed, notarized, EdDSA-verified releases shipped silently in the background.
Download the latest signed + notarized DMG from work.munyamakosa.com and drag Work.app to /Applications.
That's it. No Homebrew tap (yet), no extra setup. The app uses Sparkle for auto-updates — once installed, new versions land silently and the badge flips to "Relaunch to update" when ready.
Requirements:
- macOS 15.0+
- Xcode 16+
- xcodegen (
brew install xcodegen)
git clone https://github.com/farmhutsoftwareteam/work-for-claude-code
cd work-for-claude-code
xcodegen generate
open Work.xcodeprojBuild & run in Xcode (⌘R). For a release build matching the published DMG, run ./release.sh <version> — but note that requires your own Apple Developer ID, signing identity, and a configured notarytool keychain profile (see NOTARIZATION-INSTRUCTIONS.md).
Sources/ All Swift source (~45 files)
├── Store.swift Single source of truth — parses ~/.claude/, watches for changes
├── ContentView.swift Root SwiftUI scene + tab routing
├── ExtensionsView.swift MCPs/Skills/Marketplace tabs
├── TerminalsController.swift
│ Owns all embedded SwiftTerm PTYs, idle/busy detection, tab lifecycle
├── MCPEditor.swift The MCP add/edit sheet
├── MCPConfigWriter.swift NSFileCoordinator-protected writer for ~/.claude.json + .mcp.json
├── UsageView.swift Heatmap + activity charts
└── …
project.yml xcodegen project descriptor
Work.entitlements Sandbox-off + AppleEvents-on entitlements
release.sh Build → sign → DMG → notarize → staple pipeline
docs/ Marketing + distribution site (deployed to work.munyamakosa.com)
├── index.html
├── appcast.xml Sparkle feed
├── releases.html Auto-generated from appcast.xml
└── …
scripts/build-releases.js Regenerates releases.html from appcast.xml
recipes/ Marketplace recipes for one-click MCP installs
resources/ Icons, DMG background, etc.
Work never re-implements anything Claude Code already does. It's a UI layer over Claude Code's existing files:
- Reads
~/.claude/projects/<cwd-hash>/*.jsonlfor session history + token counts - Reads
~/.claude.json(top-level +projects.<cwd>.mcpServers) for user/local MCPs - Reads
<cwd>/.mcp.jsonfor project-scoped MCPs - Reads
~/.claude/skills/,~/.claude/agents/,~/.claude/plugins/for skills/agents/plugins - Spawns
claude/claude --resume/claude --continuevia embedded SwiftTerm PTYs - Writes back to
~/.claude.jsonand.mcp.jsonthroughNSFileCoordinatorso the CLI and the app cooperate cleanly
When Claude Code's data model changes, Work follows. There is no proprietary database, no cloud service, no telemetry.
- SwiftUI + AppKit hybrid. The embedded terminal is a
LocalProcessTerminalViewfrom SwiftTerm wrapped inNSViewRepresentable. Everything else is pure SwiftUI. - No tests at the moment. The codebase is small enough that the dogfood loop (every change ships through a live release) catches regressions quickly. Contributions to add an XCTest target are welcome.
- Self-relocates to /Applications. First-launch from any location outside /Applications triggers an offer to move + relaunch — Sparkle can't update an app running from a translocated quarantine path, and this avoids the "Work can't be updated" trap.
- No CI yet. Releases are built locally on the maintainer's machine because they require an Apple Developer ID signing identity. CI signing is on the roadmap.
PRs welcome. Some ground rules:
- One feature per PR. Easier to review, easier to revert if it ships a bug.
- No new dependencies without discussion. The dependency surface today is intentionally tiny: SwiftTerm, Sparkle, swift-markdown-ui.
- Match the existing voice in copy. Buttons, tooltips, and release-notes copy in this repo follow a deliberate plain-English style (no "Awesome!", no emoji, no marketing fluff). Read a few existing sheets before writing new copy.
- No code-signed builds in PRs. The signing identity is the maintainer's. Submit unsigned changes; the maintainer signs the release build.
If you find a bug: open an issue with the symptom, your macOS version, and (if possible) the steps to reproduce. The bug-hunt skill plays well with this repo if you want to triage in your own Claude session before filing.
- Not affiliated with Anthropic. Work is a third-party companion app. Claude Code is a separate product made by Anthropic.
- Not a Claude Code replacement. It runs Claude Code; you still need
claudeinstalled (Work helps you find / install it if missing). - Not a chat interface. There's no Work-owned chat — every conversation lives in a real Claude Code session in a real PTY.
MIT — see LICENSE.
Built by Munyaradzi Makosa in public. Issues and PRs at the issues page.