Skip to content
Oeiuwq Faith Blog OpenSource Porfolio

eliaskc/kajji

A simple terminal interface for jj

eliaskc/kajji.json
{
"createdAt": "2025-12-30T19:10:19Z",
"defaultBranch": "main",
"description": "A simple terminal interface for jj",
"fullName": "eliaskc/kajji",
"homepage": "",
"language": "TypeScript",
"name": "kajji",
"pushedAt": "2026-07-13T00:29:00Z",
"stargazersCount": 8,
"topics": [],
"updatedAt": "2026-07-13T00:29:04Z",
"url": "https://github.com/eliaskc/kajji"
}

kajji

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.

![normal mode]!(./assets/normal-mode.png)

Terminal window
# 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 kajji

To remove kajji and its config/data:

Terminal window
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 prompt

Requirements: Bun

Terminal window
git clone https://github.com/eliaskc/kajji.git
cd kajji
bun install
bun dev

Run kajji in any jj repository:

Terminal window
kajji # current directory
kajji /path/to/repo # specific directory

Kajji 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:

Terminal window
# 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 -y

Kajji reads JSONC config from ~/.config/kajji/config.json (comments and trailing commas are supported).

  • Open it from the command palette (?) with open config
  • Changes made through open config are 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, or light
  • ui.syntaxTheme.dark / ui.syntaxTheme.light: syntax highlighting theme names
  • ui.showFileTree: show files as a tree or flat list
  • diff.layout: auto, unified, or split
  • diff.autoSwitchWidth: terminal width where auto switches to split view
  • diff.wrap: wrap long diff lines
  • diff.useJjFormatter: use jj’s configured diff formatter in the detail pane
  • gitHooksPath: default Git-compatible hooks directory to check for pre-commit before jj.new (.git/hooks enables standard per-repo Git hooks in every repo)
  • repos: repo-specific gitHooksPath and operation hooks keyed by repository path
  • whatsNewDisabled / autoUpdatesDisabled: update notification controls

Default keybindings are contextual. Press ? or ctrl+p in kajji for the full command list available in the current panel.

KeyAction
qQuit
? / ctrl+pCommand palette
Tab / shift+TabNext / previous panel
1 / 2 / 3 / 4Focus log / refs / detail / command log
j / k or / Move down / up
ctrl+d / ctrl+uPage down / up
EnterOpen/drill into the selected item
EscapeBack, close, or clear filter
[ / ] or h / lPrevious / next tab
/Filter revisions or bookmarks
ctrl+rRefresh
ctrl+xToggle normal/diff focus mode
ctrl+oOpen recent repository
KeyAction
n / NNew change / new menu
eEdit change, or open selected file in editor from file view
EOpen all files in editor from file view
dDescribe, delete bookmark, restore operation, or discard file changes depending on context
sSquash
aAbandon
rRebase, or rename bookmark in refs
SSplit
DDuplicate
RResolve conflicts, or toggle remote-only bookmarks in refs
u / UUndo / redo
f / FGit fetch / fetch menu
p / PGit push / push menu
KeyAction
-Toggle file tree/list in file view, or jj formatter in detail
vToggle split/unified diff
wToggle 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
KeyAction
cCreate bookmark
dDelete bookmark
rRename bookmark
xForget bookmark locally
bSet bookmark on selected revision
mMove bookmark
o / OOpen selected revision on GitHub (prompt / direct)
oOpen selected bookmark’s commit or PR on GitHub

MIT