native macOS · jujutsu

The native way to
drive jj.Beta

A fast, keyboard-first client for Jujutsu. The change graph, diffs, splits, and conflicts — in one window, built on jj-lib in Rust.

JayJay — DAG graph and diff (dark) JayJay — DAG graph and diff (light)
// what's inside

A complete jj surface — graph to conflict, one window.

graph

Lane-based DAG

Fork/merge lanes with bookmark, tag, conflict, and divergent markers — drag a bookmark to move it. Highlighted shortest change-ids; revset filtering with preset chips; immutable-aware menus.

diff

Side-by-side & word-level

Histogram diff, tree-sitter highlighting, intraline changes, context collapsing, background preloading.

interdiff

Compare any revisions

Shift-click two changes for a PR-style diff between them — full file navigation included.

diff edit

Split by line

Select files, hunks, or individual lines and extract them into a new change. Mark files reviewed, then split.

evolog

Change evolution

Replay every snapshot of a change over time, with filtering and restore — jj's superpower, made visible.

bookmark

Bookmarks & diff

Stats dashboard, prune/forget stale bookmarks, auto-track on fetch, and diff a bookmark against its base.

stacked PR

Stacked PRs & MRs

One GitHub PR or GitLab MR per change in a linear stack, with dependent bases. Editable, AI-named branches; re-run to update them.

conflict

One-click resolve

Use Ours / Use Theirs inline, or open the editor merge tool via jj resolve. Divergent detection.

palette

Command palette

Fuzzy-search ~35 actions; run raw jj with an ! prefix and inline output — no terminal needed.

integrations

Editors, terminals, AI

VS Code, VSCodium, Zed, Xcode, Vim · Terminal, iTerm2, Ghostty · AI commit messages via Codex, Claude, or Apple Intelligence.

diffs

Side-by-side, tree view, word-level

Toggle unified or side-by-side, browse files as a tree, and read tree-sitter syntax highlighting with intraline change highlights. Context collapsing and background preloading keep it instant.

Side-by-side tree diff Side-by-side tree diff
diff edit

Split work, line by line

Select files, hunks, or individual lines and extract them into a new change — mark files reviewed as you go. Perfect for carving a big working copy into clean, reviewable commits.

Diff edit — split by line Diff edit — split by line
stacked pull requests

One PR per change, stacked

Right-click the tip of a linear stack → Create / Update Stacked PRs. JayJay names a branch per change — editable, or suggested by Apple Intelligence — pushes them, and opens one GitHub PR or GitLab MR per change with dependent bases. Re-run any time to update.

Stacked PRs preview Stacked PRs preview
interdiff

A PR review for any two changes

Shift-click two commits in the DAG to see exactly what moved between them — syntax-highlighted, with file-by-file navigation.

Interdiff Interdiff
conflict resolution

Resolve without leaving the app

Conflicted files get a red indicator and a resolution bar — one click for Use Ours / Use Theirs, or open the merge editor in VS Code or Zed via jj resolve.

Conflict resolution Conflict resolution
evolog

Replay a change's evolution

Every snapshot of a change over time, with filtering and one-click restore — jj's hidden superpower, made visible. Undo a rebase or recover lost work without touching the op log by hand.

Change evolution log Change evolution log
command palette

Every action, one keystroke away

Hit ⌘ ⇧ P and fuzzy-search any operation. Prefix with ! to run raw jj commands with inline output — the terminal stays closed.

Command palette Command palette

Every feature, in detail → read the full guide.

// keyboard-first

Every action reachable without the mouse.

Command palette⌘ ⇧ P
Bookmark manager⌘ ⇧ B
Find in diff⌘ F
Refresh⌘ R
Open repository⌘ O
Zoom in / out / reset⌘+ ⌘- ⌘0
Undo (operation log)⌘ ⇧ U
Mark reviewedSpace
Compare revisions⇧ Click
Next / previous fileJ / K
// get started in terminal

Install, open a repo, you're in.

Requires macOS 26 or later. Apple-silicon, notarized, no telemetry.

zsh — ~/my-project
# 1 · install  (or download the .app)
$ brew install --cask hewigovens/tap/jayjay
#      brew trusts this cask the first time

# 2 · open a repo  (or File → Open in the app)
$ jayjay ~/my-project

# 3 · then work — all keyboard-driven
browse · diff · split · commit
// why JayJay

Built for jj, not bolted onto git.

Jujutsu has a better model than git — but most GUIs either think in git branches or run a web app in a shell. JayJay started from one question: why isn't there a true native client that speaks jj?

So it's opinionated and fast: one native way to do each workflow — changes, bookmarks, mutable history — the way jj intends. Git LFS, submodules, and colocated Git repos work out of the box. No subscription. No telemetry. No surprises.

JayJay is 100% free, built by a developer for developers. Every detail matters — down to a hidden easter egg. Can you find it?

// faq

Questions, answered.

What is JayJay?

A native macOS GUI for Jujutsu (jj) — the version control system that reimagines the git model with mutable history, changes instead of commits, and bookmarks instead of branches. Built with Rust (wrapping jj-lib directly, no CLI scraping) and SwiftUI.

Is there a GUI for Jujutsu?

Yes — JayJay is a full-featured native macOS jj GUI: DAG visualization, unified + side-by-side diffs with tree-sitter highlighting, interdiff, diff edit mode, file annotate, one-click conflict resolution, and every common jj operation (squash, split, graft, absorb, revert, merge, duplicate, describe, abandon) without memorizing flags.

How do I install JayJay on macOS?

brew install --cask hewigovens/tap/jayjay is the easiest path — Homebrew 6.0 trusts the cask the first time you install it. Or download the signed, notarized app from GitHub Releases. Requires macOS 26 or later.

Does JayJay support interdiff (comparing two revisions)?

Yes. Shift-click two revisions in the DAG to compare them PR-style — the same unified and side-by-side views with word-level highlighting, rendering the difference between the two change contents.

Does JayJay support side-by-side diffs?

Yes. Toggle unified and side-by-side with one click. Both use tree-sitter syntax highlighting and word-level highlights, and image files (PNG, JPG, SVG, HEIC…) render as actual before/after images, not <binary> placeholders.

Can JayJay extract individual lines or hunks into a new change?

Yes — that's diff edit mode. Select files, hunks, or line ranges and split them into a new child or parallel change. On the working copy you can also right-click → Abandon Selected Lines to drop individual edits.

How is JayJay different from using jj on the command line?

It complements the CLI rather than replacing it. The DAG graph, visual diff review, diff-edit, evolution viewer, and bookmark manager are far easier in a GUI. For anything not exposed, the command palette (⌘ ⇧ P) takes a jj (or !) prefix to run raw jj in-window.

Is JayJay open source?

Free and source-available. The macOS app is BSL 1.1 — free to use, fork, modify, and redistribute; only paid app-store distribution needs permission. It converts to Apache-2.0 on 2030-03-23. The Rust crates are Apache-2.0 today.

Does JayJay work on Windows or Linux?

The shipped SwiftUI app is macOS-only. A cross-platform shell built on Zed's GPUI framework is in alpha — it shares the same Rust core with read parity and early write actions. See the roadmap.