Skip to content

Repository files navigation

Workspace

Workspace

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.

Install

  1. Download Workspace.dmg from the latest release.

  2. Open it and drag Workspace onto Applications.

  3. 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.

What you need

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.

Features

Repositories

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.

Pull requests

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.

Code and diffs

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.

Editor

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.

Previews

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.
PDF Read page by page, with a floating page and zoom bar.
Offline Every renderer ships inside the app. Nothing is fetched at runtime.

Terminal and Claude Code

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.

Looks

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.

Keyboard

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

Thanks

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 .drawio viewer.
  • 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.

Contributing

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, launch

A 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.png

How to land a change:

  1. Branch off main and keep the change to one thing.
  2. Match the code around you — Swift 6, SwiftUI first, AppKit where it has to be. Run every external tool through Support/Shell.swift.
  3. Anything touching pull requests has to work on both GitHub and Bitbucket.
  4. Check it builds (Scripts/bundle.sh) and run the app on a real repo before opening the PR — there is no test target.
  5. Update the feature list here if you added something a user can see.
  6. Open the PR against main and 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.

License

Workspace is released under the MIT License — use it, change it, ship it, as long as the copyright notice comes along.

About

One native macOS window for all your repositories.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages