Open-source project
idursun/jjui avatar
idursun/jjui

jjui takes Jujutsu out of the terminal incantation business

jjui is a TUI designed for interacting with the Jujutsu version control system.

2,196 stars119 forksGoMIT

At a glance

What is it?
A Go terminal interface for the Jujutsu version control system, built on Bubble Tea v2, with single-key revision editing, in-terminal credential prompts and Lua scripting through gopher-lua.
Who is it for?
jjui is the layer that decides whether Jujutsu is usable for you or only scriptable. The Jujutsu command line makes you remember revset syntax, argument order and the name of the flag that does the thing you want, and jjui lets you press a letter while looking at the graph.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 4 days ago.
What is it written in?
Mainly Go, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 7, 2026, and from our analysis. They are not legal advice.

Editorial analysis

One author's terminal, now 2,185 stars

The README states the motive plainly: jjui is a terminal user interface for working with the Jujutsu version control system, and the author built it according to his own needs and will keep adding features as he needs them. He invites feature requests and contributions. That framing matters because it explains the feature set better than any roadmap would. What is in jjui is what a Jujutsu user hit while working, in the order the author hit it.

The project is at 2,185 stars with 118 forks and 39 open issues, written in Go, licensed under MIT, on the default branch main. The last push was on 2026-09-24. Documentation lives on a separate site at idursun.github.io/jjui, and the README links into it for each feature rather than explaining it inline, which is the right division of labour for a program with as many distinct panels as this one has. The topics are bubbletea, golang, jj and tui, which is an accurate four-word summary.

There is a compatibility floor worth knowing before anything else: the minimum supported jj version is v0.37. The tool wraps a command line program and tracks its output format, so a jj that is too old will not simply be unsupported in a soft sense.

The dependency list is the architecture

The go.mod is more informative than a tree diagram. The module targets Go 1.27.0 and its direct dependencies fall into recognisable groups.

The interface layer is the Charm stack, and notably the second generation of it: charm.land/bubbles/v2 at v2.2.1, charm.land/bubbletea/v2 at v2.0.9 and charm.land/lipgloss/v2 at v2.0.6. Bubble Tea is the Elm-style update loop, Bubbles holds the text inputs, list and viewport components, and Lipgloss does layout and styling. The module paths have moved off the github.com/charmbracelet form onto charm.land, which tells you this tracks the current release line rather than an older pinned copy.

Around that sit four dependencies that explain specific behaviour. github.com/BurntSushi/toml at v1.6.0 is the configuration parser, and the releases refer to config.toml settings by name. github.com/alecthomas/chroma/v2 at v2.27.0 is the syntax highlighter for diffs. github.com/sahilm/fuzzy at v0.1.3 is fuzzy matching, which is what makes the revset autocomplete and the bookmark filtering feel responsive. github.com/atotto/clipboard at v0.1.4 handles the clipboard, and the annotation view copies comments as Markdown through it.

The three most interesting entries are further down. github.com/yuin/gopher-lua at v1.1.2 is a Lua interpreter, and the v0.10.11 notes describe a feature that ships in the default configuration using only Lua actions, which means the scripting layer is not decorative. github.com/tailscale/peercred is used for process credential checks, pulled at a pseudo-version. github.com/mattn/go-shellwords parses command lines. Two Charm packages sit in the direct list alongside them: charmbracelet/ultraviolet at a dated pseudo-version, which is the new screen backend, and the ansi and term packages for terminal capability negotiation.

Revsets, rebase and the details pane

The revision list is the centre of the program, and the first feature listed in the README is changing the revset with auto-complete and signature help while typing. Jujutsu addresses revisions with expressions rather than hashes, which is powerful and is exactly the sort of thing you forget when you last used it three days ago. Getting completion on that expression is the single most valuable thing a wrapper can offer.

Rebase is the second feature and it works from the revision tree, so you select a revision, select a target, and the rebase happens without you assembling a command. Squash is bound to S and folds a revision into the one below it, and the revision that was above is automatically selected afterwards so you can keep collapsing a stack, with j and k to change which revision is current when the automatic selection is not what you want.

The details pane opens with l, described as going right into the details of a revision, and it is where file-level work happens. From there r restores selected files, with i opening a dialog for an interactive chunk restore when you want to reject individual hunks rather than a whole file. s splits selected files out into their own change, and d views the diff of whatever is highlighted. The v0.10.11 notes add i to invert file selection, which is the kind of shortcut that only appears once someone has been annoyed by multi-select behaviour often enough to patch it.

The keymap continues past that. o switches to the op log, where r restores the selected operation. p opens a preview window that shows the output of jj show for a revision, jj diff for files and jj op show for operations, scrollable with ctrl+n, ctrl+p, ctrl+d and ctrl+u, with d flipping the preview into a diff view. Elsewhere: D edits a description, n creates a new revision, s splits, a abandons, A absorbs, e edits, g pushes and fetches through a Git menu, u and U are undo and redo, v shows a revision's evolog, and f jumps to a revision with ace jump. That is a large surface for a single-key interface, and it is documented as a list rather than buried in a manual.

Recent releases are mostly interaction polish

The three most recent releases describe work on the seams between Jujutsu and a human at a keyboard, not on new version control features. That is a healthy sign for a wrapper.

v0.10.9, published 2026-07-24, added browsing of individual files in the diff viewer: ctrl+t opens a picker of changed files and shows only that one, selecting all files restores the complete diff, and the bracket keys move to the previous or next changed file with wraparound, available in revision, details, diff range and evolog diffs. The same release pushed bookmarks from selected changes in one command, reachable through the Git menu, including non-conflicted local bookmarks that are new or tracked on the selected remote, deduplicating bookmark names across the selection. It also added filtering for changed files and for choice dialogs, and themes that define shared colours with separate light and dark overrides in a single file, with selected backgrounds blended toward the active component or the terminal background.

v0.10.10, published 2026-09-08, added two experimental features behind flags. The interactive bookmark pane, created by a contributor and disabled by default so existing users keep the classic bookmark menu, is switched on with an interactive_bookmark_pane key under the bookmark section of config.toml. Once enabled, b toggles a split-pane browser and tab moves focus between the revisions list and the pane. It handles local and remote bookmark inspection, remote and text filtering, expanding remote refs, multi-selection, and the bookmark operations create, move, rename, delete, forget, track, untrack, push and fetch. The same release added an annotation view, opened with Shift+C from the revisions view, where c leaves comments on changes and y copies them as Markdown to the clipboard for sharing. It also switched file paths to be startup-relative and window titles to basename only.

v0.10.11, published 2026-09-21, is the point release that matters most for daily use, because Git credential requests now appear inside jjui alongside the existing SSH askpass support, with usernames visible and passwords and passphrases masked. Askpass support is on by default, and the old ssh.hijack_askpass setting has been replaced by askpass.enabled, which you set to false to turn the prompts off. The same release added the evolog split: pressing s on a hidden entry in evolog splits the change in two, restoring the original change to the selected historical state and turning the later edits into a new child change, which is how you separate a forgotten batch of edits without selecting files or hunks by hand. Ctrl+x and ctrl+y clear a description into the editor's yank buffer and put it back.

Installing it, and what the repository looks like

Installation options are unusually broad for a project of this size, and the README lists six routes. Homebrew is the shortest:

shell
brew install jjui

Windows users have WinGet and Scoop:

shell
winget install IbrahimDursun.jjui
shell
scoop bucket add extras
scoop install jjui

Arch has both a binary package and a build-from-source package in the AUR, maintained by two named contributors, and both paru and yay work:

shell
paru -S jjui-bin
# OR
yay -S jjui-bin

Nix users have two entry points, one through nixpkgs maintained by a named contributor and one through the repository's own flake with an overlay:

shell
nix run nixpkgs#jjui

Go users can install a tagged release or track the main branch, and the second form exists specifically for testing unreleased work:

shell
go install github.com/idursun/jjui/cmd/jjui@latest
shell
go install github.com/idursun/jjui/cmd/jjui@HEAD

There is also a GOPROXY=direct variant of the HEAD install for bypassing the local module cache, a from-source route that clones and runs go install, and pre-built binaries on the releases page. For contributors the README names a single command, go build ./cmd/jjui from the repository root.

The tree is shaped like a well-run Go project with the parts you would expect. cmd/ holds the entry point, internal/ holds the program, test/ and e2e/ separate unit and end-to-end coverage, and there are three separate top-level documents worth noticing: ARCHITECTURE.md, CONTRIBUTING.md and AGENTS.md, alongside SECURITY.md. There is also a Taskfile.yml for task running, shell.nix and default.nix for development environments, flake.nix and flake.lock for the Nix flake, an .envrc for direnv and an .editorconfig. The presence of AGENTS.md next to ARCHITECTURE.md says the project expects both human contributors and automated ones to read the same description of how the code is laid out.

Where jjui sits in the ecosystem is worth naming, because it is not the only Jujutsu interface. The related searches around this project surface LazyJJ, LightJJ, a Neovim plugin and a jj Neovim workflow, plus generic jj questions about diff conflicts, revsets and git init. jjui is the general-purpose full-screen terminal option among those, and the ones it competes with most directly are the other terminal interfaces.

Editorial conclusion

jjui is the layer that decides whether Jujutsu is usable for you or only scriptable. The Jujutsu command line makes you remember revset syntax, argument order and the name of the flag that does the thing you want, and jjui lets you press a letter while looking at the graph. What makes it more than a demo is the details work: per-file diff navigation, interactive restores that go down to the hunk, an evolog split that separates a forgotten batch of edits from the change you meant to make, and Git credential prompts that render inside the interface instead of shelling out to a prompt you cannot see. The dependencies tell the same story, with Bubbletea, Lipgloss, fuzzy matching, syntax highlighting, TOML config and a Lua interpreter for actions. It is a single authored program with a stated personal motive, 2,185 stars, and releases roughly every six to eight weeks. Start by installing it over the binary you already have, learn rebase and the details pane, and only then go looking for what you would want to write as a Lua action.

Frequently asked questions

What is jjui used for?

jjui is a terminal user interface for working with the Jujutsu version control system. It gives the revision list a full-screen view so you can rebase revisions and branches onto each other, squash a stack, restore or split individual files and hunks, browse the op log and the evolog, and push and fetch through a Git menu, using single keypresses instead of assembling jj commands.

How do I install jjui?

Six routes are documented. Use brew install jjui on Homebrew, winget install IbrahimDursun.jjui or the Scoop extras bucket on Windows, paru or yay with jjui-bin on Arch, nix run nixpkgs#jjui on Nix, or go install github.com/idursun/jjui/cmd/jjui@latest from Go. Pre-built binaries are also on the releases page.

What is the minimum jj version jjui supports?

The README states that the minimum supported jj version is v0.37 or later. Because jjui parses the output of the jj command line program, running it against an older jj is not a supported configuration.

Does jjui support configuration and scripting?

Yes. Configuration lives in a config.toml file, documented on the project's documentation site, and individual features such as the interactive bookmark pane are enabled by a key in it. The go.mod includes gopher-lua, and the v0.10.11 release notes describe a feature that ships enabled in the default configuration using only Lua actions.

How do Git credentials work in jjui?

Since v0.10.11, published 2026-09-21, Git credential requests appear inside the interface rather than in a separate prompt, with usernames visible and passwords and passphrases masked. This sits alongside the earlier SSH askpass support. Both are enabled by default, and setting askpass.enabled to false turns jjui's credential prompts off.

Official sources

  1. idursun/jjui on GitHub
  2. License: MIT
  3. Project website
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/idursun-jjui.svg)](https://hysenlabs.com/projects/idursun-jjui)