Skip to content

Repository files navigation

JayJay

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.

CIReleasemacOSRustLicenseAsk DeepWiki

JayJay macOS App

JayJay is a fast, keyboard-driven GUI for people who use jj every day.

JayJay - DAG graph and side-by-side diff

Highlights

  • 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 whole-file or per-hunk choices, syntax-aware -/+ gutters, a raw marker editor, and an explicit external jj resolve --tool handoff.
  • Common jj operations from the app: new, edit, describe, squash, abandon, split, duplicate, merge, absorb, back out, Git push/fetch, and undo.
  • Bookmark Manager, drag-to-move bookmarks and working copy, GitHub/GitLab/Codeberg/Cursor Origin 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.
  • jayjay config prints the paste-ready jj diff/edit/merge tool definition, also available from Settings → Tools.

See the full feature guide for screenshots and workflows.

Install

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.

Feedback

Choose Help -> Send Feedback in JayJay to email us.

Build The App

just run # Build and launch the SwiftUI macOS app
just install-cli # Install the jayjay launcher to ~/.local/bin
jayjay .# Open the current repo

Rust Libraries

The app is not the only product here. The Rust workspace is split so reusable lower layers do not have to inherit jj-lib.

CrateRolejj-lib?
jj-diffStandalone diff engine: histogram line diff, word diff, syntax highlighting, context collapse, side-by-side rowsNo
jayjay-primitivesShared jj-lib-free domain and review identity typesNo
jayjay-reviewLocal review marks, notes, and reconciliationNo
jayjay-networkShared blocking HTTP helpersNo
jayjay-coreApp-facing repo operations, jj data access, mutations, and format projectionsYes
jayjay-uniffiSwift bindings for the SwiftUI appThrough jayjay-core
jayjay-cliThin app launcher; command-line subcommands are served by the bundled macOS app executableNo

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

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.

Docs

  • User Guide - shipped features and workflows (docs/guide.html).
  • Issues - planned work and known gaps.
  • Contributing - setup, development checks, testing, and pull request policy.
  • DeepWiki - indexed codebase reference.
  • FAQ - install, licensing, platform support, and common feature questions.
  • Blog - notes on Jujutsu, collaboration, and the tools around them.

Alpha GPUI Shell

There is also an experimental GPUI shell 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.

just gpui # Build and launch the alpha GPUI shell
just gpui-appimage # Build the Linux AppImage

Keyboard Shortcuts

KeyAction
Cmd+Shift+PCommand palette
Cmd+FFind in diff
Cmd+RRefresh
Cmd+OOpen repository
Cmd+Plus / Cmd+Minus / Cmd+0Zoom in / out / reset
Cmd+Shift+BBookmark Manager
Cmd+Shift+UUndo through operation log
SpaceToggle file reviewed
Shift+ClickCompare two revisions

License

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

About

A native macOS GUI for Jujutsu (jj) — DAG graph, side-by-side diffs, interdiff, conflict resolution. Built with Rust + SwiftUI.

Topics

Resources

Contributing

Security policy

Stars

127 stars

Watchers

2 watching

Forks

Releases

Sponsor this project

Used by

Contributors

Languages