A native macOS GUI for Jujutsu (jj) — DAG graph, side-by-side diffs, interdiff, conflict resolution. Built with Rust + SwiftUI.
See the codeJayJay is a native macOS and Linux GUI for Jujutsu, with reusable Rust libraries for diff and review tooling.
Install on macOS · Linux beta · Rust libraries · Discord · Contribute
JayJay is a fast, keyboard-driven GUI for people who use jj every day.
jj evolog).-/+ gutters, a raw marker editor, and an explicit external jj resolve --tool handoff.jayjay config prints the paste-ready jj diff/edit/merge tool definition, also available from Settings → CLI.See the full feature guide for screenshots and workflows.
Requirements: macOS 26 or later.
Homebrew:
brew install --cask hewigovens/tap/jayjay
Direct download: grab the latest .zip from GitHub Releases, unzip, and move JayJay to Applications.
JayJay checks for updates automatically through Sparkle. You can also run JayJay -> Check for Updates.
Join the JayJay Discord community to ask questions, share workflows, and give feedback.
Choose Help -> Send Feedback in JayJay to email us.
Follow Contributing to install prerequisites, then:
just run # Build and launch the SwiftUI macOS app
just install-cli # Install the jayjay launcher to ~/.local/bin
jayjay . # Open the current repo
The Rust workspace keeps diff rendering, review state, and shared domain types independent of jj-lib.
| Crate | Role | jj-lib? |
|---|---|---|
jj-diff | Standalone diff engine: histogram line diff, word diff, syntax highlighting, context collapse, side-by-side rows | No |
jayjay-primitives | Shared jj-lib-free domain and review identity types | No |
jayjay-review | Local review marks, notes, and reconciliation | No |
jayjay-network | Shared blocking HTTP helpers | No |
jayjay-core | App-facing repo operations, jj data access, mutations, and format projections | Yes |
jayjay-uniffi | Swift bindings for the SwiftUI app | Through jayjay-core |
jayjay-cli | Thin app launcher; command-line subcommands are served by the bundled macOS app executable | No |
Rule of thumb: jj-lib belongs in jayjay-core. Diff rendering, review state, and shared domain types stay below that boundary so they can be reused without embedding jj's repo model.
jj-diffjj-diff is the most reusable standalone library in the repo. It has zero dependency on jj-lib.
[dependencies]
jj-diff = { git = "https://github.com/hewigovens/jayjay" }
use jj_diff::{collapse_context_with_mapping, compute_file_diff};
let diff = compute_file_diff("main.rs", &old_content, &new_content, false);
let collapsed = collapse_context_with_mapping(&diff);
for line in &collapsed.diff.lines {
// render line.style and line.spans in your UI
}
Features:
similar.See crates/jj-diff/README.md for the full API.
docs/guide.html).There is also a GPUI shell, now in beta, whose current parity target is Linux. Its macOS build is for development; the released macOS product remains the SwiftUI app. Remaining work is tracked in the GPUI Beta checklist.
Linux builds ship with every release: download the AppImage for your architecture from the release page, or on Arch Linux install the attached jayjay-appimage package with pacman -U. Stable releases are also in a signed pacman repo — trust https://pkgs.hewig.dev/arch/jayjay-packages.asc, point a [jayjay] section in /etc/pacman.conf at https://pkgs.hewig.dev/arch/$arch, then sudo pacman -Syu jayjay-appimage; the guide has the full block.
just gpui # Build and launch the GPUI shell
just gpui-appimage # Build the Linux AppImage
| Key | Action |
|---|---|
| Cmd+Shift+P | Command palette |
| Cmd+F | Find in diff |
| Cmd+R | Refresh |
| Cmd+O | Open repository |
| Cmd+Plus / Cmd+Minus / Cmd+0 | Zoom in / out / reset |
| Cmd+Shift+B | Bookmark Manager |
| Cmd+Shift+U | Undo through operation log |
| Space | Toggle file reviewed |
| Shift+Click | Compare two revisions |
crates/): Apache-2.0shell/, docs, packaging): BSL 1.1 - free to use, modify, and redistribute; paid app store distribution requires permission. Converts to Apache-2.0 on 2030-03-23.Rust
67.1%
Swift
28.9%
HTML
2.2%
A native macOS GUI for Jujutsu (jj) — DAG graph, side-by-side diffs, interdiff, conflict resolution. Built with Rust + SwiftUI.
See the codeJayJay is a native macOS and Linux GUI for Jujutsu, with reusable Rust libraries for diff and review tooling.
Install on macOS · Linux beta · Rust libraries · Discord · Contribute
JayJay is a fast, keyboard-driven GUI for people who use jj every day.
jj evolog).-/+ gutters, a raw marker editor, and an explicit external jj resolve --tool handoff.jayjay config prints the paste-ready jj diff/edit/merge tool definition, also available from Settings → CLI.See the full feature guide for screenshots and workflows.
Requirements: macOS 26 or later.
Homebrew:
brew install --cask hewigovens/tap/jayjay
Direct download: grab the latest .zip from GitHub Releases, unzip, and move JayJay to Applications.
JayJay checks for updates automatically through Sparkle. You can also run JayJay -> Check for Updates.
Join the JayJay Discord community to ask questions, share workflows, and give feedback.
Choose Help -> Send Feedback in JayJay to email us.
Follow Contributing to install prerequisites, then:
just run # Build and launch the SwiftUI macOS app
just install-cli # Install the jayjay launcher to ~/.local/bin
jayjay . # Open the current repo
The Rust workspace keeps diff rendering, review state, and shared domain types independent of jj-lib.
| Crate | Role | jj-lib? |
|---|---|---|
jj-diff | Standalone diff engine: histogram line diff, word diff, syntax highlighting, context collapse, side-by-side rows | No |
jayjay-primitives | Shared jj-lib-free domain and review identity types | No |
jayjay-review | Local review marks, notes, and reconciliation | No |
jayjay-network | Shared blocking HTTP helpers | No |
jayjay-core | App-facing repo operations, jj data access, mutations, and format projections | Yes |
jayjay-uniffi | Swift bindings for the SwiftUI app | Through jayjay-core |
jayjay-cli | Thin app launcher; command-line subcommands are served by the bundled macOS app executable | No |
Rule of thumb: jj-lib belongs in jayjay-core. Diff rendering, review state, and shared domain types stay below that boundary so they can be reused without embedding jj's repo model.
jj-diffjj-diff is the most reusable standalone library in the repo. It has zero dependency on jj-lib.
[dependencies]
jj-diff = { git = "https://github.com/hewigovens/jayjay" }
use jj_diff::{collapse_context_with_mapping, compute_file_diff};
let diff = compute_file_diff("main.rs", &old_content, &new_content, false);
let collapsed = collapse_context_with_mapping(&diff);
for line in &collapsed.diff.lines {
// render line.style and line.spans in your UI
}
Features:
similar.See crates/jj-diff/README.md for the full API.
docs/guide.html).There is also a GPUI shell, now in beta, whose current parity target is Linux. Its macOS build is for development; the released macOS product remains the SwiftUI app. Remaining work is tracked in the GPUI Beta checklist.
Linux builds ship with every release: download the AppImage for your architecture from the release page, or on Arch Linux install the attached jayjay-appimage package with pacman -U. Stable releases are also in a signed pacman repo — trust https://pkgs.hewig.dev/arch/jayjay-packages.asc, point a [jayjay] section in /etc/pacman.conf at https://pkgs.hewig.dev/arch/$arch, then sudo pacman -Syu jayjay-appimage; the guide has the full block.
just gpui # Build and launch the GPUI shell
just gpui-appimage # Build the Linux AppImage
| Key | Action |
|---|---|
| Cmd+Shift+P | Command palette |
| Cmd+F | Find in diff |
| Cmd+R | Refresh |
| Cmd+O | Open repository |
| Cmd+Plus / Cmd+Minus / Cmd+0 | Zoom in / out / reset |
| Cmd+Shift+B | Bookmark Manager |
| Cmd+Shift+U | Undo through operation log |
| Space | Toggle file reviewed |
| Shift+Click | Compare two revisions |
crates/): Apache-2.0shell/, docs, packaging): BSL 1.1 - free to use, modify, and redistribute; paid app store distribution requires permission. Converts to Apache-2.0 on 2030-03-23.Rust
67.1%
Swift
28.9%
HTML
2.2%