The native way
to drive jj

A fast, keyboard-friendly client for Jujutsu. The change graph, diffs, splits, and conflicts, in one window.

Free · macOS 26 or later · Linux x86_64 & aarch64 · Windows beta

JayJay — DAG graph and diff (dark) JayJay — DAG graph and diff (light)

Speaks jj

Changes, bookmarks, revsets, and mutable history, the way jj intends. No git branches bolted on.

Native on each platform

SwiftUI on macOS and GPUI on Linux, over a shared Rust core that links jj-lib directly. No CLI scraping, no web view.

Free to use

No subscription and no repository data. Anonymous build and OS stats can be turned off in Settings.

Diffs

Read changes the way you read code

Unified or side-by-side, a file tree, tree-sitter highlighting with intraline changes, and rich previews for images, Markdown, notebooks, CSV/TSV, SARIF, and binary plists.

Side-by-side tree diff Side-by-side tree diff
Review

Keep your place through every edit

Press Space to review a file, or click a hunk's gutter stripe to mark just that part. Reviewed hunks survive edits and rebases, and notes stay on the changed line.

Coding agents can read your notes and mark files with the jayjay CLI. Install the JayJay skill with npx skills add hewigovens/jayjay --skill jayjay, or on macOS from Settings > Integrations.

Working-copy review with a reviewed hunk and inline note Working-copy review with a reviewed hunk and inline note
Split

Split exactly the lines you mean

Pick hunks or individual lines from any file in the change, then split that selection into a clean child or parallel change.

Interdiff

Diff any two revisions

Shift-click two changes, two bookmarks, or a PR branch and its base to see exactly what moved between them. For a divergent change, Compare Divergent Versions shows which one to keep.

Interdiff Interdiff
Stacked pull requests

One PR per change, stacked

Right-click the tip of a linear stack and choose Create / Update Stacked PRs. JayJay names a branch per change, pushes them, and opens one GitHub PR, GitLab MR, or Cursor Origin PR per change with dependent bases.

Sign in to GitHub and GitLab from Settings, or use an existing CLI login or environment token. Cursor Origin uses your origin auth login credentials.

Conflicts

Resolve without leaving the app

Take Left, Right, or Base per hunk in the built-in merge editor, edit the raw markers, and save a partial resolution when work remains. Or hand off to your configured external tool.

Built-in merge editor Built-in merge editor
Evolog

Replay a change's evolution

Every snapshot of a change over time, with filtering and one-click restore. Undo a rebase or recover lost work without touching the op log by hand.

Change evolution log Change evolution log
Operation log

Undo anything

Every abandon, rebase, and split is an operation. Click the last one in the status bar, or press ⌘⇧U, to open the operation log and restore the repository to any earlier point.

And more

Also in the app

Lane-based DAG

Fork and merge lanes, shortest change IDs, and revset filtering with preset chips.

Bookmarks

Drag a bookmark onto any change to move it. Per-remote ahead, behind, and diverged state.

File annotate

See which change last touched each line of a file.

AI descriptions

Change descriptions drafted by Codex, Claude, or Apple Intelligence.

Your tools

VS Code, VSCodium, Zed, Xcode, Vim, Terminal, iTerm2, and Ghostty.

Git interop

Colocated Git repos, Git LFS, and submodules work out of the box.

JayJay Diff Review GitHub pull requests in your browser, with review marks that survive force-pushes.

Keyboard

Run any jj operation from the keyboard

Fuzzy-search any operation in the command palette, type help split to discover features, or prefix ! to run raw jj with inline output.

Command palette Command palette
  • Command palette⌘⇧P
  • Bookmark manager⌘⇧B
  • Undo (operation log)⌘⇧U
  • Find in diff⌘F
  • Open repository⌘O
  • Refresh⌘R
  • Mark reviewedSpace
  • Next / previous fileJK
  • Compare revisions⇧Click
Get started

Install and open a repo

macOS

macOS 26 or later · Apple silicon · signed and notarized

# Homebrew trusts the cask the first time
$ brew install --cask hewigovens/tap/jayjay
$ jayjay ~/my-project

Or download the app.

Linux

x86_64 & aarch64 · AppImage, Debian/Ubuntu, Arch

# Debian package or AppImage; checksum verified
$ curl -fsSL https://jayjay.hewig.dev/install.sh | bash
# Arch: AUR
$ yay -S jayjay-appimage

Packages are on GitHub Releases.

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, the way jj intends. JayJay is 100% free, built by a developer for developers. Every detail matters, down to a hidden easter egg. Can you find it?

FAQ

Common questions

What is JayJay?

A native GUI for Jujutsu (jj) on macOS and Linux — 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 jj GUI for macOS and Linux: 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, 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. Image files (PNG, JPG, SVG, HEIC...) render as actual before/after images, and Markdown, notebooks, CSV/TSV, SARIF, and binary property lists have rich previews when source text is not enough.

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. The command palette (⌘ ⇧ P) searches actions and local help, and 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.

How do I install JayJay on Linux?

Run curl -fsSL https://jayjay.hewig.dev/install.sh | bash. The script installs the latest Debian package on apt-based systems and the AppImage elsewhere for x86_64 or aarch64, after verifying its checksum; run it again to upgrade. On Arch Linux, install jayjay-appimage from AUR, for example with yay -S jayjay-appimage. Add --beta to install the newest beta when it is ahead of stable. Then run jayjay /path/to/repo or open a repository from the window. The guide lists what it covers.

How do I install JayJay on Arch Linux?

Install jayjay-appimage from AUR for x86_64 or aarch64, for example with yay -S jayjay-appimage. The custom pacman repo has been retired; remove the entire [jayjay] section from /etc/pacman.conf before upgrading through AUR. To try an AppImage beta, remove the installed package first, then run the Linux installer with --beta. The guide has the steps.

Does JayJay work on Windows or Linux?

Linux and Windows use the GPUI shell and share the Rust core with macOS. Linux ships as an AppImage, Debian/Ubuntu package, and AUR package for x86_64 and aarch64; see the guide. Windows support is in beta. Install Windows x64 from the Microsoft Store, or use the portable ZIP from GitHub Releases for beta builds. Windows requires Windows 10 version 1903 or later, or Windows 11, with jj installed separately. The Store manages its updates; the portable ZIP has no automatic updater.

Can JayJay open a repository on another machine over SSH?

Yes, in the macOS app and on Linux. Choose File > Open Remote Repository…, pick a host from your SSH config, and browse to the repository. macOS, Linux, and Windows hosts are supported; on first connect JayJay installs a small helper on the host, and the host must accept key or agent authentication. Review notes stay on your machine. The guide has the details.

Blog

Writing on jj and its neighbors