One native macOS window for all your repositories.
Your projects and their pull requests, diffs you can comment on, an editor with language servers, and a real terminal running Claude Code — side by side, in one place, on one theme.
Download · Features · Shortcuts · Contributing · License
┌──────────────┬────────────────────────────────┬──────────────────┐
│ >_ │ ‹ › breadcrumb ✕ │Files│±│>_│✳│Info│
│ ├────────────────────────────────┼──────────────────┤
│ repo card │ │ file tree │
│ branch ↑↓ │ one viewer: │ changes │
│ 2 PR clean │ dashboard · file · diff · PR │ terminals │
│ │ │ claude │
│ │ │ ports, open in… │
│ + Add Repo ├────────────────────────────────┤ │
│ │ Ln 12, Col 4 Swift ⚠2 sourcekit-lsp running │
└──────────────┴────────────────────────────────┴──────────────────┘
Left — your repositories, each card showing branch, ahead/behind, open PRs and changed files. Centre — exactly one thing at a time, with browser-style back/forward. Right — files, changes, terminals, Claude conversations and info for the repo you picked. No scrollbars anywhere.
-
Download
Workspace.dmgfrom the latest release. -
Open it and drag Workspace onto Applications.
-
The app is signed ad-hoc, not with a paid Apple Developer account, so macOS warns on first launch. Clear the flag once:
xattr -dr com.apple.quarantine /Applications/Workspace.app
(Or right-click the app → Open, then Open Anyway in Privacy & Security.)
From then on the app updates itself from its own releases — check and download in the background, relaunch when you say so.
macOS 14 or newer, plus whichever of these you actually use:
| Tool | For |
|---|---|
gh |
GitHub pull requests |
bkt |
Bitbucket pull requests |
claude |
the Claude Code conversations |
rg |
fast search inside files (git grep stands in) |
Settings (⌘,) checks all of them for you and installs or signs in to the missing ones, so you never have to work out which command it wanted.
| Feature | What it does |
|---|---|
| Any folder, any host | GitHub, Bitbucket Cloud and Data Center, detected from origin. SSH aliases included. |
| Start or clone one | ⌘N makes an empty repository; ⇧⌘N clones from an SSH or HTTPS URL. Either lands in the sidebar. |
| Sidebar that stays true | Branch, ahead/behind, open PRs and changed files, re-read every five minutes. |
| Back to the default branch | The dashboard asks GitHub or Bitbucket which branch is the default — main, develop, master — and one button checks it out. |
| Pull, next to it | The button beside it brings the branch you are on up to date. Plain git pull — whatever the repository configures is what runs. |
| Your order | Drag cards to reorder, filter by name or path, fold it away with ⌘0. |
| Several GitHub accounts | Each repo uses its own gh account. Nothing global is switched. |
| Ports and Open in… | Live ports for the folder, and one click to VS Code, Cursor, Zed, Finder or Terminal. |
| Feature | What it does |
|---|---|
| The board | Open PRs as a table: title, age, activity, reviewers, CI — one row each. |
| Read it all | Details, Diff and Commits tabs. Markdown, images and mentions rendered properly. |
| Threads | Replies nested under what they answer, every author in a colour of their own. A resolved one folds to a single row — author, file and first line, under a green Resolved chip — in the conversation and in the diff alike; click it to read the rest. |
| Write back | Comment, reply, resolve a thread or open it again, edit the description, approve, request changes, merge, reject. |
| Second thoughts | Edit on a comment of your own — in the conversation or on a line of the diff — reopens it in place, wherever the host lets you change it. Delete takes it down for good, once you have said so twice. |
| Fold a comment | The chevron beside any top-level comment puts it away: header, first line and reply count stay, everything under it — its replies and all — goes. |
| Reviewers | See who approved, add more from a searchable list of the people who can be asked. |
@ anyone |
Type @ in any comment box and pick a name from the repo. |
| Builds beside you | CI runs for the head commit in a side panel, failures first, kept current on their own while the panel is in front of you. |
| Update from main | One button when the branch has fallen behind. |
| Read it again | One button in the summary bar re-reads the whole request from the host — title, state, diff, conversation, reviewers and builds. |
| Off to the host | The button beside the title opens the pull request in your browser. |
| Feature | What it does |
|---|---|
| Diffs worth reading | Side-by-side or unified, syntax coloured, with the changed words picked out. |
| Comment on a line | Hover the gutter, hit + — a new thread right there, on both hosts. |
| Changes tab | Stage, unstage, discard, commit and push without leaving the window. |
| Merge conflicts | Their own group, marked resolved one by one, and no commit while markers remain. |
| Commit message by Claude | One button writes it from what you staged, in your repo's style. |
| History | Recent commits grouped by day; click one for its patch, #123 opens that PR. |
| Feature | What it does |
|---|---|
| Real editing | Tree-sitter colours, folding, multiple cursors, find and replace (⌘F), auto-indent. |
| Wrap or don't | ⌥Z folds a long line into the pane, or lets it run off the edge and scroll sideways. |
| Change markers | What has changed since HEAD, down the edge of the gutter — green where lines were added, yellow where they were changed, and a red wedge where they were deleted. |
| Language servers | Diagnostics, completions (⌃Space) and ⌘-click to definition for 20+ languages. |
| Go to file (⌘P) | item controller finds app/controllers/item_controller.rb. Punctuation optional. |
| Search in files | ripgrep, grouped by file, every hit marked in the file you open. |
| A file tree you can use | Drag in and out, copy and paste with Finder, rename in place, duplicate, multi-select, new file or folder. |
| Changes in the tree | A new file is green, a changed one yellow, a conflict red — same colours as the gutter beside it. Folders wear a dot for whatever is inside them. |
| Feature | What it does |
|---|---|
| Markdown | Rendered, not raw, by the same parser both hosts use — nested lists, tables with their alignment, quotes, footnotes, :tada:, code chips, and the pictures a README keeps beside itself. Saved as PDF with ⇧⌘E. |
| Tick a box | Checkboxes in a .md file, a PR description or a comment are real: click one and it is written back. |
| Jump around | An outline button on any document with headings worth jumping between. |
| Copy a block | A fenced block copies whole on hover, without selecting around it. |
| Open a picture | Click a screenshot to see it at full size instead of squinting at the capped one. |
| Mermaid | ```mermaid fences drawn as diagrams. |
| draw.io | .drawio files drawn as the diagram, with pages, zoom and layers. |
| Read page by page, with a floating page and zoom bar. | |
| Offline | Every renderer ships inside the app. Nothing is fetched at runtime. |
| Feature | What it does |
|---|---|
| A real terminal | The Ghostty engine, rooted at the repo. As many shells as you like. |
| Ask Claude (⇧⌘L) | The real Claude Code CLI in a floating panel — every flag, slash command and plugin works. Drag it, size it from any edge or corner, or fold it down to a bar on the dock along the bottom of the editor. One click on the bar brings it straight back, with no wait: a folded conversation keeps its terminal. |
| Park it (⇧⌘→) | While you are typing in a conversation, one key puts it back in the bottom-right corner of the editor, at the size you gave it. Anywhere else — the editor, a comment box — ⇧⌘→ still selects to the end of the line. |
| Many at once | As many conversations as you like, each named after what it is about, all on screen together. Fold the ones you are not reading down to the dock; when there are more bars than the editor is wide, the dock scrolls sideways, and dragging a bar moves it along the row. |
| Resume anything | Past conversations listed from disk — including ones you started in your own shell. |
| It tells you | A Notification Centre banner when a shell wants you back; click it to land on that tab. |
| Home shells | Terminals that belong to no repository (⇧⌘T). |
| Drop to type | Drop a file on the terminal and its path lands at the prompt. |
| Feature | What it does |
|---|---|
| Four themes | Adonis Eclipse, GitHub Dark, Atom One Dark, Dark+ — editor, diff and terminal alike. |
| One palette | All sixteen ANSI colours come from the theme, so git diff matches the code above it. |
| One font | Your monospaced face across the app, with its own sizes and line spacing. |
| Bring your own | Scripts/import-vscode-theme.swift ports any VS Code theme. |
| Your keys | Every shortcut the app binds is rebindable in Settings → Shortcuts, or removable. |
The keys below are what the app ships with. Every one of them is yours to change — Settings (⌘,) → Shortcuts records a new key for any command, or takes its key away entirely. The rows the app does not own (⌘F, ⌃Space and everything macOS binds) are not on offer there.
| Shortcut | Action |
|---|---|
| ⌘, | Settings — theme and font, shortcuts, required tools, language servers, updates |
| ⇧⌘O | Add repository |
| ⌘, | Settings — theme and font, required tools, language servers, updates |
| ⌘N / ⇧⌘N | New empty repository · clone one from a URL |
| ⇧⌘O | Add a repository folder you already have |
| ⌘P | Go to file |
| ⌘F | Find in the file |
| ⌥Z | Wrap long lines, and the same key back to scrolling sideways |
| ⌘S | Save the file — or the PR description — you are editing |
| ⇧⌘E | Save the Markdown preview as a PDF |
| ⌘[ / ⌘] | Back / forward |
| ⎋ / ⇧⌘W | Close what is open |
| ⌘0 / ⌥⌘0 | Toggle the repositories / navigator sidebar |
| ⌃⇥ | Switch repository |
| ⌘R | Refresh all repositories |
| ⇧⌘L | Ask Claude about the selected repo, in a panel over the window |
| ⇧⌘→ | Park the conversation you are typing in, bottom-right of the editor |
| ⌃⌘T / ⌘T / ⇧⌘T | Repo terminal · new tab · home terminal |
| ⌃` | Show the repo's terminal, and the same key to leave it |
| ⌃⌘P | Create PR with Claude Code |
| ⌃Space | Completions |
| ⌘-click | Go to definition · in the file tree, add a row to the selection |
| ⌘↩ | Post the comment you typed · commit the staged files |
| ⏎ / ⌘⌫ | File tree: rename in place · move to Trash |
| ⌘C / ⌘V | File tree: copy the picked files · paste files copied in Finder |
Workspace is mostly other people's excellent work, joined together:
- CodeEditSourceEditor and CodeEditLanguages by the CodeEdit team — the editor, its gutter, its highlighting and its find panel.
- Ghostty by Mitchell Hashimoto and its contributors — the terminal engine, embedded as libghostty, packaged for SwiftPM by Lakr233.
- tree-sitter by Max Brunsfeld and every grammar author — the syntax colours everywhere in the app.
- swift-markdown by Apple and the Swift community — the Markdown parser, over cmark-gfm, which is what both hosts render a comment with.
- mermaid by Knut Sveidqvist and contributors — the diagrams in Markdown.
- draw.io by JGraph — the
.drawioviewer. - ripgrep by Andrew Gallant — the search inside files.
- GitHub CLI and bkt — how the hosts are asked.
- Claude Code by Anthropic — the thing in the terminal, and a fair share of this app's own code.
Pull requests are welcome — bug fixes, new features, themes, or just better wording.
Build and run:
git clone https://github.com/necessarylion/workspace.git
cd workspace
Scripts/run.sh # build, wrap in Workspace.app, launchA bare clone builds with nothing installed beyond Xcode 16+. swift build does
not work — a dependency ships an asset catalog only xcodebuild can compile,
so use the scripts (or open Package.swift in Xcode).
Scripts/bundle.sh # build + bundle only, prints the .app path
Scripts/install.sh # build Release and install to /Applications
Scripts/make-icon.sh # rebuild Resources/AppIcon.icns from Assets/icon.pngHow to land a change:
- Branch off
mainand keep the change to one thing. - Match the code around you — Swift 6, SwiftUI first, AppKit where it has to be.
Run every external tool through
Support/Shell.swift. - Anything touching pull requests has to work on both GitHub and Bitbucket.
- Check it builds (
Scripts/bundle.sh) and run the app on a real repo before opening the PR — there is no test target. - Update the feature list here if you added something a user can see.
- Open the PR against
mainand say what you changed and how you tried it.
Background reading lives in Docs/ — Development.md
for how the project is built and released, LSP.md for the language
server layer, Terminal.md for the terminal, and
Markdown.md for how the Markdown renderer is put together.
Found a bug or want something? Open an issue — screenshots and the repo host involved help a lot.
Workspace is released under the MIT License — use it, change it, ship it, as long as the copyright notice comes along.