A terminal UI for jj / Jujutsu: navigate changes, inspect polished diffs, and run common jj workflows with ease and speed.
Kajji gives jj a fast, keyboard-first interface with a commit graph, file tree, operation log, bookmark management, GitHub helpers, revset filtering, and custom diff rendering with syntax highlighting, word-level emphasis, split/unified layouts, wrapping, and binary-file handling.
# recommended if you use Homebrew
brew install eliaskc/tap/kajji
# standalone binary installer, no package manager required
curl -fsSL https://kajji.sh/install.sh | bash
# or via JavaScript package manager
npm install -g kajji
bun install -g kajji
pnpm add -g kajji
yarn global add kajji
# or run directly without installing
npx kajji
bunx kajjiTo remove kajji and its config/data:
kajji uninstall # interactive: removes config, data, and the binary
kajji uninstall --dry-run # show what would be removed
kajji uninstall --keep-config --keep-data
kajji uninstall --force # skip the confirmation promptRequirements: Bun
git clone https://github.com/eliaskc/kajji.git
cd kajji
bun install
bun devRun kajji in any jj repository:
kajji # current directory
kajji /path/to/repo # specific directoryKajji has two main viewing modes:
- Normal mode keeps the log, bookmarks, detail, and command log visible.
- Diff focus mode gives the detail pane more space for side-by-side diffs.
Toggle between them with ctrl+x.
jj workflows
- Commit log with graph and revset filtering
- File view with tree/list toggle, editor launching, and discard for working-copy files
- New, edit, describe, squash, abandon, duplicate, rebase, split, resolve
- Undo, redo, operation log, and restore
- Bookmark create/delete/rename/forget/set/move plus remote-only filtering
- Git fetch/push menus
- Open commits and PRs on GitHub
- Recent repository switcher
Diff viewing
- Custom unified and split diff renderers
- Syntax highlighting and word-level change emphasis
- Line wrapping and horizontal scrolling
- Hunk and file navigation
- Optional jj formatter output
- Binary file detection
TUI polish
- Vim-style navigation plus mouse support
- Focusable panels and tabs
- Command palette with fuzzy search (
?/ctrl+p) - Context-aware status hints
- JSONC config with schema autocomplete
- Automatic update notifications
Kajji includes a small CLI for scripting and agent workflows:
# List changes with addressable hunk IDs
kajji changes -r @
# Comments
kajji comment list -r @
kajji comment set -r @ --hunk h1 -m "note"
kajji comment set -r @ --file src/App.tsx --line 12 -m "note"
kajji comment delete -r @ --hunk h1
kajji comment delete -r @ --file src/App.tsx --line 12
kajji comment delete -r @ --file src/App.tsx
kajji comment delete -r @ --all -yKajji reads JSONC config from ~/.config/kajji/config.json (comments and trailing commas are supported).
- Open it from the command palette (
?) withopen config - Changes made through
open configare reloaded when you return to kajji - The default config includes
$schema: "https://kajji.sh/schema.json"for editor autocomplete
Common settings include:
ui.themeMode:system,dark, orlightui.syntaxTheme.dark/ui.syntaxTheme.light: syntax highlighting theme namesui.showFileTree: show files as a tree or flat listdiff.layout:auto,unified, orsplitdiff.autoSwitchWidth: terminal width whereautoswitches to split viewdiff.wrap: wrap long diff linesdiff.useJjFormatter: use jj's configured diff formatter in the detail panegitHooksPath: default Git-compatible hooks directory to check forpre-commitbeforejj.new(.git/hooksenables standard per-repo Git hooks in every repo)repos: repo-specificgitHooksPathand operation hooks keyed by repository pathwhatsNewDisabled/autoUpdatesDisabled: update notification controls
Default keybindings are contextual. Press ? or ctrl+p in kajji for the full command list available in the current panel.
| Key | Action |
|---|---|
q |
Quit |
? / ctrl+p |
Command palette |
Tab / shift+Tab |
Next / previous panel |
1 / 2 / 3 / 4 |
Focus log / refs / detail / command log |
j / k or ↓ / ↑ |
Move down / up |
ctrl+d / ctrl+u |
Page down / up |
Enter |
Open/drill into the selected item |
Escape |
Back, close, or clear filter |
[ / ] or h / l |
Previous / next tab |
/ |
Filter revisions or bookmarks |
ctrl+r |
Refresh |
ctrl+x |
Toggle normal/diff focus mode |
ctrl+o |
Open recent repository |
| Key | Action |
|---|---|
n / N |
New change / new menu |
e |
Edit change, or open selected file in editor from file view |
E |
Open all files in editor from file view |
d |
Describe, delete bookmark, restore operation, or discard file changes depending on context |
s |
Squash |
a |
Abandon |
r |
Rebase, or rename bookmark in refs |
S |
Split |
D |
Duplicate |
R |
Resolve conflicts, or toggle remote-only bookmarks in refs |
u / U |
Undo / redo |
f / F |
Git fetch / fetch menu |
p / P |
Git push / push menu |
| Key | Action |
|---|---|
- |
Toggle file tree/list in file view, or jj formatter in detail |
v |
Toggle split/unified diff |
w |
Toggle diff line wrapping |
h / l or ← / → |
Horizontal scroll when wrapping is off |
[ / ] |
Previous / next hunk in custom diff view |
{ / } |
Previous / next file in custom diff view |
| Key | Action |
|---|---|
c |
Create bookmark |
d |
Delete bookmark |
r |
Rename bookmark |
x |
Forget bookmark locally |
b |
Set bookmark on selected revision |
m |
Move bookmark |
o / O |
Open selected revision on GitHub (prompt / direct) |
o |
Open selected bookmark's commit or PR on GitHub |
- OpenTUI + SolidJS - TypeScript TUI framework
- Bun - JavaScript runtime and build tooling
- jj (Jujutsu) - Git-compatible VCS
MIT