{"id":47636743,"url":"https://github.com/hewigovens/jayjay","last_synced_at":"2026-06-08T06:01:42.067Z","repository":{"id":346241747,"uuid":"1186235672","full_name":"hewigovens/jayjay","owner":"hewigovens","description":"A native macOS GUI for Jujutsu (jj) — DAG graph, side-by-side diffs, interdiff, conflict resolution. Built with Rust + SwiftUI.","archived":false,"fork":false,"pushed_at":"2026-05-21T14:13:06.000Z","size":9056,"stargazers_count":36,"open_issues_count":4,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-05-21T22:30:42.634Z","etag":null,"topics":["dag","developer-tools","gui","jj","jj-vcs","jujutsu","macos","macos-app","rust","swiftui","vcs","version-control"],"latest_commit_sha":null,"homepage":"https://jayjay.hewig.dev","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hewigovens.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"Roadmap.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-03-19T12:13:36.000Z","updated_at":"2026-05-21T16:24:38.000Z","dependencies_parsed_at":"2026-03-23T19:05:47.674Z","dependency_job_id":null,"html_url":"https://github.com/hewigovens/jayjay","commit_stats":null,"previous_names":["hewigovens/jayjay"],"tags_count":20,"template":false,"template_full_name":null,"purl":"pkg:github/hewigovens/jayjay","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hewigovens%2Fjayjay","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hewigovens%2Fjayjay/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hewigovens%2Fjayjay/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hewigovens%2Fjayjay/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hewigovens","download_url":"https://codeload.github.com/hewigovens/jayjay/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hewigovens%2Fjayjay/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33419558,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-23T22:14:44.296Z","status":"online","status_checked_at":"2026-05-24T02:00:06.296Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dag","developer-tools","gui","jj","jj-vcs","jujutsu","macos","macos-app","rust","swiftui","vcs","version-control"],"created_at":"2026-04-02T00:17:00.712Z","updated_at":"2026-06-08T06:01:42.041Z","avatar_url":"https://github.com/hewigovens.png","language":"Rust","funding_links":[],"categories":["developer-tools"],"sub_categories":[],"readme":"# JayJay\n\n**A native macOS GUI for [Jujutsu](https://github.com/jj-vcs/jj) (jj)** — fast, keyboard-driven, built with Rust + SwiftUI.\n\nBrowse your DAG, review side-by-side diffs, resolve conflicts, and run every jj operation from one window. JayJay is a full-featured **jj GUI** with DAG visualization, interdiff (PR-style revision comparison), diff edit mode, file annotate, one-click conflict resolution, AI-generated commit messages, and a command palette.\n\n\u003e **Two shells share a Rust core:** the **SwiftUI shell** (stable, macOS-only) is what ships in releases. A second **GPUI shell** (alpha, cross-platform target — Linux + Windows + macOS) is in active development with read parity and early write actions. See [UserGuide.md](UserGuide.md) for a feature walkthrough, [Roadmap.md](Roadmap.md) for milestone status, and [Build from source](#install) below to try it.\n\n[![CI](https://github.com/hewigovens/jayjay/actions/workflows/ci.yml/badge.svg)](https://github.com/hewigovens/jayjay/actions/workflows/ci.yml)\n[![Release](https://img.shields.io/github/v/release/hewigovens/jayjay?include_prereleases)](https://github.com/hewigovens/jayjay/releases)\n![macOS](https://img.shields.io/badge/macOS-26-blue)\n![Rust](https://img.shields.io/badge/rust-1.93%2B-orange)\n![License](https://img.shields.io/badge/license-BSL--1.1-green)\n[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/hewigovens/jayjay)\n\n## Features\n\n**History \u0026 Graph**\n- DAG visualization with lane-based fork/merge rendering\n- Bookmark and conflict indicators on every node\n- Revset filtering with preset chips (All, Mine, Bookmarks, Trunk, Conflicts, Heads)\n- Change evolution viewer (`jj evolog`) — see every prior version of a rewritten change with interdiff against current; right-click to copy commit-id or `jj restore` command for recovery\n- Load more: incrementally load older history\n- Auto-refresh via file system watcher\n\n**Diff \u0026 Review**\n- Unified + side-by-side diff modes (toggle with one click)\n- Histogram diff algorithm (via [`jj-diff`](#jj-diff) crate) — instant diffs even for large files\n- Diff edit mode (`jj diffedit`-style): select files, hunks, or line ranges across a change\n- Interdiff: compare any two revisions (shift-click or context menu)\n- File annotate (blame) with syntax-highlighted gutter — click to navigate\n- File history: list all revisions that modified a file\n- tree-sitter syntax highlighting (18 languages)\n- Word-level change highlighting\n- Context collapsing, rename detection\n- Background preloading of all file diffs\n- Persistent file review state (survives restart, auto-invalidates on content change)\n\n**Conflict Resolution**\n- Conflicted files shown with warning indicator and resolution bar\n- One-click \"Use Ours\" / \"Use Theirs\" resolution\n- \"Resolve in Editor\" via `jj resolve --tool` (VS Code, Zed merge editors)\n- Auto-refresh after resolution\n\n**Operations**\n- New, edit, describe, squash, abandon, split (with parallel option), graft, duplicate, merge\n- Extract selected diff to child/parallel changes, move selected changes to `@`, discard selected working-copy changes\n- Absorb hunks into ancestors, back out (revert) changes\n- Git push/fetch with auto-track\n- Bookmark Manager (⌘⇧B) with stats, filter, clean up stale branches, resolve conflicts\n- Pull Request on GitHub/Codeberg from bookmark right-click (DAG row + Bookmark Manager) — opens an existing PR when one exists, else a GitHub or Codeberg PR compose URL; public Codeberg PR status is shown via the Forgejo API\n- Divergent commit detection and resolution\n- Undo via operation log\n- Command palette (⌘⇧P) with ~35 commands; type `jj \u003cargs\u003e` (or `! \u003cargs\u003e`) for inline raw jj CLI output\n\n**AI Commit Messages**\n- Codex CLI, Claude CLI, Apple Intelligence fallback chain\n\n**Tools \u0026 Settings**\n- External editor integration (VS Code, Zed, Xcode, Android Studio, Vim + auto-detection)\n- Terminal integration (Terminal.app, iTerm2, Ghostty)\n- Dock menu with recent repositories\n- Font family picker + ⌘+/-/0 zoom\n- Commit avatars (GitHub + Gravatar)\n- Multi-window, recent repos, CLI launcher with URL scheme\n\n## Keyboard Shortcuts\n\n| Key | Action |\n|-----|--------|\n| ⌘⇧P | Command palette |\n| ⌘F | Find in diff |\n| ⌘R | Refresh |\n| ⌘O | Open repository |\n| ⌘+/⌘-/⌘0 | Zoom in/out/reset |\n| ⌘⇧B | Bookmark Manager |\n| ⌘⇧U | Undo (operation log) |\n| Space | Toggle file reviewed |\n| Shift+Click | Compare two revisions (interdiff) |\n\n## Screenshots\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/imgs/home.png\" width=\"100%\" alt=\"JayJay — light mode\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/imgs/home-dark.png\" width=\"100%\" alt=\"JayJay — dark mode\"\u003e\n\u003c/p\u003e\n\n## Install\n\n**Homebrew**:\n```bash\nbrew install --cask hewigovens/tap/jayjay\n```\n\n**Download**: Grab the latest release from [GitHub Releases](https://github.com/hewigovens/jayjay/releases/latest), unzip, and move to Applications.\n\n**Build from source** (SwiftUI shell, macOS):\n```bash\njust run               # Build and run\njust install-cli       # Install CLI launcher to ~/.local/bin\njayjay .               # Open current repo\n```\n\n**Build the GPUI shell (alpha, cross-platform)**:\n```bash\njust gpui              # Build, ad-hoc sign, launch against current dir\njust gpui /path/repo   # Open a specific repo\njust gpui-bundle       # Build the .app without launching\n```\nThe GPUI shell uses [Zed's GPUI 1.0](https://github.com/zed-industries/zed). It has read parity for DAG, diffs, annotate, file history, evolog, FS-watcher auto-refresh, persistent file review, bookmark / workspace pickers, plus early write actions for describe and the commit box. More write actions are tracked in [Roadmap.md](Roadmap.md).\n\n**Auto-update**: JayJay checks for updates automatically via Sparkle. You can also check manually from JayJay → Check for Updates. Auto-update may require App Management permission in System Settings → Privacy \u0026 Security.\n\n**Requirements**: macOS 26 (Tahoe) recommended.\n\n## Roadmap\n\nSee [UserGuide.md](UserGuide.md) for shipped features and [Roadmap.md](Roadmap.md) for current plans.\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for architecture notes, development workflow, and the current `jj-lib` vs `jj` CLI backend split.\n\n## jj-diff\n\nThe diff engine is extracted as a standalone Rust crate with **zero dependency on jj-lib**:\n\n```toml\n[dependencies]\njj-diff = { git = \"https://github.com/hewigovens/jayjay\" }\n```\n\n**Features:**\n- Histogram line diff (via `similar` 3.0)\n- Word-level diff highlighting\n- tree-sitter syntax highlighting (18 languages)\n- Context collapsing with display-to-full line index mapping\n- Skip highlighting for `.lock`/`.csv`/`.svg` files\n\n**Usage:**\n```rust\nuse jj_diff::{compute_file_diff, collapse_context_with_mapping};\n\nlet diff = compute_file_diff(\"main.rs\", \u0026old_content, \u0026new_content, false);\nlet collapsed = collapse_context_with_mapping(\u0026diff);\nfor line in \u0026collapsed.diff.lines {\n    // render line with line.style, line.spans\n}\n```\n\n## FAQ\n\nThe full FAQ lives on the site: **[jayjay.hewig.dev/#faq](https://jayjay.hewig.dev/#faq)** — what JayJay is, install, interdiff, side-by-side diffs, diff edit, how it differs from the CLI, licensing, and platform support.\n\n## License\n\n- **Rust crates** (`crates/`): [Apache-2.0](crates/LICENSE)\n- **macOS app** (`shell/`, everything else): [BSL 1.1](LICENSE) — free to use, modify, and redistribute; paid app store distribution requires permission. Converts to Apache-2.0 on 2030-03-23.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhewigovens%2Fjayjay","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhewigovens%2Fjayjay","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhewigovens%2Fjayjay/lists"}