JayJay is a native macOS GUI for Jujutsu and a set of Rust libraries for jj-aware diff and review tooling.
This repository has two primary products:
- JayJay macOS app - the released GUI, built with Rust + SwiftUI.
- Rust libraries - reusable crates for diffing, review state, repo operations, and app bindings.
JayJay is a fast, keyboard-driven GUI for people who use jj every day.
- DAG visualization with bookmarks, tags, conflicts, author avatars, relative time, and revset filters.
- Unified and side-by-side diffs with syntax highlighting, word-level changes, context collapsing, rename detection, and image/SVG/Markdown/HTML previews.
- Interdiff for PR-style revision comparison, file annotate, file history, and change evolution (
jj evolog). - Diff edit mode: select files, hunks, or line ranges across a change.
- Persistent file review state that survives restart and auto-invalidates when content changes.
- Conflict resolution with one-click "Use Ours" / "Use Theirs" and editor-backed
jj resolve --tool. - Common jj operations from the app: new, edit, describe, squash, abandon, split, graft, duplicate, merge, absorb, back out, Git push/fetch, and undo.
- Bookmark Manager, drag-to-move bookmarks and working copy, GitHub/GitLab/Codeberg PR actions, stacked PRs/MRs, and command palette.
- AI commit-message fallback chain: Codex CLI, Claude CLI, then Apple Intelligence.
- External editor and terminal integration, multi-window support, recent repos, Dock menu, and CLI launcher.
See the full feature guide for screenshots and workflows.
Requirements: macOS 26 or later.
Homebrew:
brew install --cask hewigovens/tap/jayjayDirect 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.
just run # Build and launch the SwiftUI macOS app
just install-cli # Install the jayjay launcher to ~/.local/bin
jayjay . # Open the current repoThe app is not the only product here. The Rust workspace is split so reusable lower layers do not have to inherit 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 |
App launcher plus agent-facing review subcommands | Through jayjay-core |
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-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:
- Histogram line diff via
similar. - Word-level highlighting within changed lines.
- tree-sitter syntax highlighting for common source formats.
- Context collapsing with display-to-full line index mapping.
- Side-by-side row building for two-column renderers.
- Placeholder detection for Git LFS, submodules, and binary content.
See crates/jj-diff/README.md for the full API.
- User Guide - shipped features and workflows.
- Roadmap - current milestones and platform status.
- Contributing - development loop, testing, architecture, and the
jj-libvsjjCLI backend split. - DeepWiki - indexed codebase reference.
- FAQ - install, licensing, platform support, and common feature questions.
There is also an experimental GPUI shell for cross-platform work. It is not the released product yet; see Roadmap.md if you want to follow or try that track.
just gpui # Build and launch the alpha 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 |
- Rust crates (
crates/): Apache-2.0 - App shells and everything else (
shell/, 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.
