Aquí hi ha 25 versions de Jujutsu UI, des de 4 de juliol del 2025 fins a l’actual, 0.10.12. Cadascuna enllaça amb els instal·ladors del mateix desenvolupador.
25 versions en 1 any · unes 19 per any
| Versió | Data | Mida | Fitxers |
|---|---|---|---|
| 0.10.12Darrera versió | 17 d’octubre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióMostly a bugfix release, with fixes for the bookmark pane and view layering, live theme reloading, and groundwork for context-aware key bindings.
Improvements
- Themes: Sending SIGUSR1 to jjui reloads the active theme without a restart, which is handy while editing a theme file. If the reloaded theme turns on background blending, jjui queries the terminal palette again so blended backgrounds come out right. (#762)
- Bindings: Actions and bindings can now have a when condition based on the current state of the app. For example, annotate (shift+c) is only available when revisions.has_revision && !revisions.is_root && !revisions.is_empty, and expanded help strikes it through on the root or an empty revision. For now it mostly keeps help honest about what applies to the current selection. Later, it will let jjui show the right binding for the situation, such as separate open and close actions instead of one generic toggle.
Bug Fixes
- Bookmarks: Bookmark names containing characters such as # are now quoted correctly for git push and git fetch, from both the Git menu and the bookmark pane. (#763)
- Bookmark pane: ctrl+p and ctrl+n now move up and down in the bookmark pane. (#758)
- Bookmark pane: Styling now follows the bookmark theme. (#757)
- Bookmark pane: The Git menu now stays above the bookmark pane. (#754)
- Preview: Preview hotkeys no longer reach a preview hidden behind a diff or annotation view. Previously, ctrl+n in a diff scrolled the hidden preview.
- Dialogs: Closing a dialog opened over a diff or annotation view now closes the dialog first, not the view underneath it.
- Mouse: Clicks on a list item that is partly scrolled out of view now reach the item.
- Askpass: Askpass is now skipped on Windows instead of failing. (#755)
- Help: Expanded help no longer shows the revset scope when it isn't active.
What's Changed
- fix(bookmarkpane): keep git menu above bookmark pane by @baggiiiie in https://github.com/idursun/jjui/pull/754
- fix(bookmarkpane): align styling with bookmark theme by @baggiiiie in https://github.com/idursun/jjui/pull/757
- fix(bookmarkpane): support readline navigation keys by @baggiiiie in https://github.com/idursun/jjui/pull/758
- fix: quote bookmark names for git push and fetch by @baggiiiie in https://github.com/idursun/jjui/pull/763
- feat: reload active theme on SIGUSR1 by @baggiiiie in https://github.com/idursun/jjui/pull/762
Full Changelog: https://github.com/idursun/jjui/compare/v0.10.11...v0.10.12 |
| 0.10.11 | 21 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióA point release with bug fixes, in-app Git credential prompts, and visual improvements to Annotation View.
Features
- Git credentials: Git credential requests now appear inside jjui, alongside existing SSH askpass support. Usernames remain visible, while passwords and passphrases are masked. Git and SSH askpass support is enabled by default; the old ssh.hijack_askpass setting is replaced by askpass.enabled. Set it to false to disable jjui's credential prompts. (#746)
- Evolog: Pressing s on a hidden entry in evolog splits the change into two: the original change is restored to the selected historical state, and the later edits become a new child change. This is particularly useful when you forget to start a new change before making unrelated edits, as you can separate them at the point they began without manually selecting files or hunks. The best part is that this feature ships in the default configuration using only Lua actions. (#686)
- Describe: Press ctrl+x to clear the entire description into the editor's yank buffer, then ctrl+y to restore it. (#749)
- Details: Press i to invert file selection. (#707)
- Bookmarks: The interactive bookmark pane now supports ctrl+click to toggle selection and alt+click to select a range. (#742)
Improvements
- Annotation View: Leaving with uncopied comments now asks for confirmation. Press esc to keep reviewing, or select Discard to leave. (#744)
- Annotation View: Improved rendering and contrast so text is easier to read against highlighted backgrounds.
- Lua: Previously, Lua actions could read application state through the context module, for example with context.change_id(), context.file(), and context.checked_commit_ids(). In this release, I've added the first "read state" function attached to a feature: revisions.inline_describe.content(). It returns the current inline description draft, or nil when the editor is unavailable. It's only implemented for inline describe for now, but I'd like to extend this to the rest of the application.
- Lua: Existing selection getters now read live UI state so scripts see the current selection after yielding actions and refreshes.
- Lua: Choice dialogues now show footer help and a visible filter: prompt. (#743)
- Describe: Pressing esc with unsaved changes now asks for confirmation, replacing the previous draft-stashing behaviour. In the confirmation, enter discards the draft and esc keeps editing. (#523)
- Command input: The : and $ inputs now appear above the status bar, giving them more room. (#683)
Bug Fixes
- Annotation View: Copying annotations now uses the system clipboard. (#741)
- Annotation View: Pressing esc while help is expanded closes help first. (#744)
- Annotation View: Opening full-file views correctly handles paths containing spaces.
- Bookmarks: Moving bookmarks to hidden revisions now correctly targets the selected historical commit. (#748)
- Help: Expanded help stays within the viewport. (#574)
- Status bar: Restored footer mode labels.
- Diff range: Accepting a range without selecting another target now compares the starting revision against the working copy by omitting --to.
- Terminal: Fixed a crash when the terminal reports an empty background colour. (#745)
What's Changed
- feat: multi-select bookmarks with ctrl and alt click by @baggiiiie in https://github.com/idursun/jjui/pull/742
- lua: add footer help and prompt to choose filter by @baggiiiie in https://github.com/idursun/jjui/pull/743
- fix(bookmarks): move bookmarks to hidden revisions by @anandghegde in https://github.com/idursun/jjui/pull/748
- feat(describe): add clear action (ctrl+x) by @baptiste0928 in https://github.com/idursun/jjui/pull/749
- feat: add in-app git askpass credential prompts by @idursun in https://github.com/idursun/jjui/pull/746
New Contributors
- @anandghegde made their first contribution in https://github.com/idursun/jjui/pull/748
- @baptiste0928 made their first contribution in https://github.com/idursun/jjui/pull/749
Full Changelog: https://gi |
| 0.10.10 | 8 de setembre del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióThis release adds an experimental interactive bookmark pane, an annotation view for reviewing changes, startup-relative file paths, and basename-only window titles.
Features
Experimental Interactive Bookmark Pane
Enable the experimental bookmark pane in config.toml:
[bookmark]
interactive_bookmark_pane = true
This experimental pane was created by @baggiiiie. It is disabled by default, so existing users keep the classic bookmark menu. When enabled, b toggles a split-pane bookmark browser and tab moves focus between the revisions list and the pane. It supports local and remote bookmark inspection, remote and text filtering, expanding remote refs, multi-selection, and bookmark operations including create, move, rename, delete, forget, track, untrack, push, and fetch.
(#584, #721, #732)
Experimental Annotation View
The experimental annotation view provides a lightweight code-review workflow directly in jjui. Press Shift+C in the revisions view to open it for the selected revision, c to leave comments on the changes, and y to copy the comments as Markdown to the clipboard for sharing. Check #718 for more details.
Startup-Relative File Paths
Displayed file paths in details, diffs, the fuzzy file finder, and file target pickers are now relative to the directory where jjui was started. This changes the display only; commands continue to receive the repository-relative paths they expect.
(#719, #735)
Improvements
- ui.set_window_title now accepts "base" to show a title such as jjui - repo, "full" (or true) to show the full repository path, and false to show only jjui. The default remains the full path; the shorter title is useful when several terminal tabs are open. (#736)
- Press Home or End in the revisions list to jump directly to the first or last revision. (#687)
- Expanded help now uses a shared, compact column width across sections, making shortcuts easier to scan in wide terminals. (#728)
Fixes
- Inline describe now supports Ctrl-Y to restore text accidentally deleted with Ctrl-K or Ctrl-U, including when the deletion reaches a line boundary. (#726)
- jjui now accepts the extended revset-aliases format used by newer jj versions, where an alias can be written as { definition = "...", doc = "..." }, instead of crashing on valid configuration. (#724, #725)
- Fixed graph gutter padding that could shift embedded operation panels to the left under comfortable log templates. Details, inline describe, evolog, and rebase previews now stay aligned with the revision graph. (#722)
- Lua API type definitions now include missing function signatures, improving completion and type checking for Lua configuration scripts.
What's Changed
- feat: add Home/End key support for navigating to top/bottom of revs by @nikosavola in https://github.com/idursun/jjui/pull/687
- fix(parser): keep gutter one segment per rune when padding blank graph lines by @shuvamk in https://github.com/idursun/jjui/pull/722
- fix(config): support jj extended revset-alias config by @academician in https://github.com/idursun/jjui/pull/725
- fix: ui: align expanded help columns by @beborngod in https://github.com/idursun/jjui/pull/728
- [experiment] interactive bookmark view by @baggiiiie in https://github.com/idursun/jjui/pull/584
- feat(config): add [bookmark] config for bookmark pane by @baggiiiie in https://github.com/idursun/jjui/pull/721
- toggle bookmarkpane with b when config flag is set by @baggiiiie in https://github.com/idursun/jjui/pull/732
- feat(files): render file paths relative to startup directory by @idursun in https://github.com/idursun/jjui/pull/735
- Feat: Add config option to show just the basename in title by @nickchomey in https://github.com/idursun/jjui/pull/736
New Contributors
- @shuvamk made their first contribution in https://github.com/idursun/jjui/pull/722
- @beborngod made their first contribution in https://github.com/idursun/jjui/pull/728
Full Changelog: https://github.com/idursun/jjui/compare/v0.10.9...v0.10.10 |
| 0.10.9 | 24 de juliol del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióA release with per-file diff navigation, targeted bookmark pushes, filtering for changed files and choice dialogs, and adaptive light and dark themes.
Features
Browse Individual Files in the Diff Viewer
Press ctrl+t in the diff viewer to choose a changed file and show only its diff. Select (all files) to restore the complete diff.
Use [ and ] to move directly to the previous or next changed file. Navigation wraps at either end of the file list and is available for revision, Details, Diff Range, and Evolog diffs.
Push Bookmarks from Selected Changes
The Git menu can now push all eligible bookmarks from the highlighted revision or a multi-selection in one command. Open the menu with g, press p to show push commands, then press b.
The command includes non-conflicted local bookmarks that are new or tracked on the selected remote and deduplicates bookmark names across the selected changes.
(#701, #702, #715, #716)
Adaptive Light and Dark Themes
Theme files can now define shared colors with separate light and dark overrides in a single file. Selected backgrounds can also be blended toward the active component or terminal background, with a global or per-appearance strength configured through ui.background_blend.
For example, a theme can share role styles while changing the selected background and blend strength for each terminal appearance:
[colors]
":selected" = { bold = true }
"revset completion text" = { fg = "green" }
"revset completion text:selected" = { fg = "bright green" }
[light]
background_blend = 0.2
[light.colors]
":selected" = { bg = "white" }
[dark]
background_blend = 0.4
[dark.colors]
":selected" = { bg = "bright black" }
The active theme's blend strength can also be overridden from config.toml:
[ui]
background_blend = { light = 0.2, dark = 0.7 }
jjui queries the terminal background and ANSI palette when blending is enabled and reapplies the active theme when the terminal appearance changes.
Theme selectors now support the :selected suffix, including role-specific selectors such as revset completion text:selected. The legacy selected selector syntax remains supported.
(#406, #637, #668, #712)
Improvements
Filter Changed Files in Details
Press / in the Details view to filter changed files by a case-insensitive path substring. Matching text is highlighted, and existing file selections are preserved while filtering.
Press enter to keep the filter active or esc to clear it.
Filter Any Choice Dialog
Press / to filter any choice dialog, including dialogs created by Lua scripts. The obsolete filter option has been removed from the Lua choose() helper.
(#717)
Fixes
Selected Bookmark Push Eligibility
Fixed selected bookmark pushes so local bookmarks that exist on the chosen remote but are not tracked there are not included.
Selected Theme Styles
Selected rows now preserve role-specific styles for text, dimmed content, and matched text. Git and Bookmarks remote selectors also receive the correct scoped styles, and custom themes no longer inherit unspecified colors from the built-in theme.
Notes
Minimum Supported jj Version
jjui now requires jj v0.37 or later because the revision log uses the change_offset template keyword introduced in v0.37.
(#714)
What's Changed
- feat(git): add push option for selected bookmarks in multi-select by @neil-sriv in https://github.com/idursun/jjui/pull/702
- Feat/background blend by @idursun in https://github.com/idursun/jjui/pull/712
- docs: require jj 0.37 or later by @baggiiiie in https://github.com/idursun/jjui/pull/714
- Allow pushing all bookmarks in selected changes by @nikosavola in https://github.com/idursun/jjui/pull/716
New Contributors
- @neil-sriv made their first contribution in https://github.com/idursun/jjui/pull/702
Full Changelog: https://github.com/idursun/jjui/compare/v0.10.8...v0.10.9 |
| 0.10.8 | 4 de juliol del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióA release with a new revision insertion workflow and fixes for command error output and inline describe editing.
Features
Create Changes Between Revisions
Added a new revisions.open_new_between action, bound by default to alt+n, for creating a new change between revisions.
The operation uses the selected revisions as --insert-after targets and the current revision as the default --insert-before target. You can press space to pin one or more explicit insert-before revisions before applying with enter.
For example, if A and B are selected as insert-after revisions and C is the insert-before revision, applying the operation runs:
jj new --insert-after A --insert-after B --insert-before C
When the same single revision is both the insert-after and insert-before target, jjui falls back to:
jj new A
Fixes
Command Error Output Is Preserved
Fixed failed command handling so non-zero command output is preserved and shown correctly after removing the confusing generic ssh.hijack_askpass hint.
(#704)
Inline Describe Cursor Movement
Fixed inline describe rendering so the editor synchronizes its size before handling wrapped cursor movement. This prevents incorrect cursor/line behavior when editing descriptions in constrained layouts.
Full Changelog: https://github.com/idursun/jjui/compare/v0.10.7...v0.10.8 |
| 0.10.7 | 29 de juny del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióA release with a new diff range workflow, Lua workspace switching, revset completion improvements, and several UI polish fixes.
Features
- Added a revisions diff range operation started with alt+d (#600).
- The initially selected revision becomes the --from target.
- The next selected revision becomes the --to target.
- The result is shown in jjui's built-in diff viewer.
- x swaps the from and to targets.
- t selects the --to target from bookmarks/tags.
- f selects the --from target from bookmarks/tags.
- Added Lua change_workspace support for custom workspace switching (#689, #685).
- This lets Lua actions switch the workspace path used by subsequent jj commands.
- The API intentionally uses change_workspace rather than change_dir to avoid implying full repository switching semantics.
Improvements
- Improved embedded model layout for details and evolog (#474).
- Embedded views now push surrounding revision content up to claim the available space.
- Opening details near the bottom of the list no longer leaves it constrained to a small remainder of the viewport.
- Improved revset completion behavior (#703).
- Revset history now appears before other completions instead of replacing function and alias completions after the first use.
- Revset function arguments such as remote= are now completed.
- Accepted function completions now keep showing the function signature.
- Selected completion styling now paints the background across the text.
- Added missing diff_lines completions.
- Improved absorb target selection (#695).
- Pressing s during absorb now selects descendants of the highlighted revision, which makes it easier to narrow the target set when many mutable commits are preselected.
- Removed the << default >> marker from absorb UI.
Fixes
- Fixed flash cards being corrupted by command output containing carriage returns (#698).
- This affects output from commands such as Git/SSH progress or error messages that use \r for in-place terminal updates.
- Flash rendering now preserves the card border instead of letting command output overwrite it.
- Removed the ssh.hijack_askpass hint from unrelated command failures (#704, #693).
- The hint was originally dimmed, then removed because it was still misleading for failures unrelated to SSH prompts.
- Stopped showing flash messages for successful interactive commands, since they could stack up and become distracting.
- Fixed preview refresh behavior so focus-triggered refreshes do not reset the diff scroll position unnecessarily (#688).
- This fixes losing preview reading position in tmux when focus-events is enabled.
- Fixed bookmark behavior so m moves main.
- Fixed describe behavior so an empty message does not trigger a stash.
- Fixed selected substyle/theme inheritance so selected substyles render correctly.
What's Changed
- fix: set filesearch list half viewport height by @baggiiiie in https://github.com/idursun/jjui/pull/690
- add change_workspace function to support workspace switching by @msgongora in https://github.com/idursun/jjui/pull/689
- refactor(ui): introduce split container for preview rendering by @baggiiiie in https://github.com/idursun/jjui/pull/691
- fix(flash): prevent command output from corrupting card borders by @baggiiiie in https://github.com/idursun/jjui/pull/698
- Show revset history before completions by @baggiiiie in https://github.com/idursun/jjui/pull/703
New Contributors
- @msgongora made their first contribution in https://github.com/idursun/jjui/pull/689
Full Changelog: https://github.com/idursun/jjui/compare/v0.10.6...v0.10.7 |
| 0.10.6 | 19 de maig del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióA quick maintenance update with a handful of usability improvements and scripting additions.
- jjui now uses the real terminal cursor instead of a virtual one. Cursor rendering is now correct when focus moves between views and when returning from external commands.
- Theme rendering has been improved so that themes now paint the backgrounds of view areas more consistently. Lua scripting also now exposes set_theme(name), which changes the active theme at runtime. This builds on the earlier light/dark runtime theme switching work, but it is not wired to the UI by default, so you need to call it from your own action.
- jjui now sets the JJUI environment variable before invoking jj. This makes it easier to use jj conditional config specifically for commands run from inside jjui, for example:
[[--scope]]
--when.environments = ["JJUI"]
[--scope.ui]
diff-formatter = "delta"
- Preview commands now set DFT_WIDTH, so difftastic output wraps to the preview pane width automatically.
- Revision navigation now resolves longer or non-loaded change IDs and commit IDs through jj when they cannot be matched directly in the loaded revision list. This makes Lua navigation actions work more reliably with user-provided revision IDs.
- The : prompt now parses quoted jj arguments correctly, so commands like new -m "message text" work as expected.
- ctrl+n and ctrl+p are now available as list navigation aliases in more places, including revset completion/history, the target picker, and the fuzzy file finder.
What's Changed
- fix(exec): parse jj prompt input with shellwords (#655) by @SAY-5 in https://github.com/idursun/jjui/pull/675
New Contributors
- @SAY-5 made their first contribution in https://github.com/idursun/jjui/pull/675
Full Changelog: https://github.com/idursun/jjui/compare/v0.10.5...v0.10.6 |
| 0.10.4 | 26 d’abril del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióA quick maintenance release with a few improvements and fixes.
Features
Absorb operation
Absorb is now an operation, similar to rebase, revert, duplicate, and other revision operations, instead of immediately running jj absorb with jj's default destination set.
Default absorb targets are preselected and shown with << into >>. Use space to toggle candidate targets, enter to apply, and esc to cancel. Leaving the target set unchanged keeps the previous plain absorb behaviour; changing the set constrains absorb to the selected targets.
(#634, #640)
Directory entries in fuzzy file search
Fuzzy file/path search now includes directory entries such as src/ and src/pkg/, not only leaf file paths. This makes it easier to filter or jump by directory in larger trees.
(#642)
Improvements
Better theme control for selected rows
Selected-row styling is now theme-owned for revset completion, target picker, details lists, and menu shortcuts. Themes can customise selected sub-roles such as "revset completion selected matched", "revset completion selected text", "revset completion selected dimmed", "picker selected matched", and "picker selected text".
This fixes cases where "revset completion selected" changed the selected row background but not the selected foreground or bold styling. Default selected backgrounds for revset completion and target picker now also align with revision details.
(#637)
Consistent preview position toggle in details
shift+p now toggles the preview between side and bottom positions in the details view, matching the existing behaviour in revisions, evolog, and oplog views.
(#649)
Fixes
Lua revset actions outside the revset editor
Lua scripts can now dispatch revset actions such as revset.set(...) even when the revset editor is not open. This fixes custom revision-scoped Lua actions that update the current revset.
Stale file selection after closing details
Closing the details view now clears stale selected-file state, and restoring an existing details operation resynchronises file selection. This fixes cases where a later command error could make Esc behave incorrectly instead of dismissing the visible flash message.
(#643)
Bookmark names with special characters
Bookmark operations now match bookmark names exactly. This fixes deleting bookmarks whose names contain characters that jj would otherwise interpret as string pattern syntax, such as 1.3.63-+-json-length-fix.
(#632, #650)
What's Changed
- feat(absorb): add target picker for jj absorb --into by @manusajith in https://github.com/idursun/jjui/pull/640
- feat: include directories in path entries for fuzzy_files by @baggiiiie in https://github.com/idursun/jjui/pull/642
- Remove unused struct fields, methods, and functions by @nikosavola in https://github.com/idursun/jjui/pull/648
- fix(details): add shift+p binding for preview_toggle_bottom by @ansel1 in https://github.com/idursun/jjui/pull/649
- fix(ui): unable to dismiss flash message after split command error by @baggiiiie in https://github.com/idursun/jjui/pull/643
- fix(bookmarks): match bookmark names exactly by @baggiiiie in https://github.com/idursun/jjui/pull/650
New Contributors
- @manusajith made their first contribution in https://github.com/idursun/jjui/pull/640
- @nikosavola made their first contribution in https://github.com/idursun/jjui/pull/648
- @ansel1 made their first contribution in https://github.com/idursun/jjui/pull/649
Full Changelog: https://github.com/idursun/jjui/compare/v0.10.3...v0.10.4 |
| 0.10.3 | 17 d’abril del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióThis release includes new Lua customisation support, repo-local configuration, preview sizing improvements, and a set of UI fixes. There were also some internal changes around action routing and rendering, so if something feels broken or behaves differently, please let me know.
Features
Repository-local configuration
Repository-local configuration is now supported. You can add .jjui/config.toml or .jjui/config.lua to a repository to customise jjui for that repo while still inheriting global configuration. This is useful for repo-specific revsets, limits, bindings, and Lua configuration. JJUI_CONFIG_DIR remains a hard override when set. #609
Lua editor metadata
Lua scripting now has installable editor metadata. Run jjui --install-lua-types to write generated types.lua metadata to your jjui config directory and create .luarc.json for LuaLS when one does not already exist. This gives Lua users autocomplete and basic type information for config.lua, plugins, and embedded Lua scripts. #617
Preview pane sizing
Preview commands now receive the preview pane size through COLUMNS and LINES. Width-sensitive tools such as difft, and configured delta setups, can now wrap output to the jjui preview pane instead of the outer terminal width. #608
Layered revision operations
Revision operations can now be layered more naturally, with active operation scopes reflected in key handling and help/status display. Active key bindings are grouped by their current scope, and overridden bindings are shown with strikethrough, making it easier to understand which shortcuts are available in nested operations. #625
Improvements
Inline describe customisation
Inline describe is now easier to customise from bindings and Lua. You can bind revisions.inline_describe.new_line separately from revisions.inline_describe.accept, and accept can take force = true for workflows that intentionally update immutable revisions. #260
[[bindings]]
action = "revisions.inline_describe.accept"
key = "enter"
scope = "revisions.inline_describe"
[[bindings]]
action = "revisions.inline_describe.new_line"
key = "shift+enter"
scope = "revisions.inline_describe"
- jjui now refreshes only once on startup instead of doing duplicate initial refresh work.
- Git operation screens now close when the underlying command starts executing, making the transition from choosing an action to running it clearer.
- Debug logging now uses JJUI_DEBUG instead of the generic DEBUG environment variable, reducing the chance that unrelated shell configuration accidentally enables jjui debug behaviour.
Fixes
- Fixed paste handling in Bubble Tea v2 text-input flows, including pasting into the bookmark filter input. #601, #597
- Fixed rebase source plus insert-between so jjui generates the correct jj rebase -s <source> --insert-before <rev> --insert-after <rev> command. #598
- Fixed diff rendering for tab-indented lines. The diff view now preserves indentation and handles wrapping and horizontal scrolling correctly for tab-expanded content. #606, #604
- Fixed command history rendering so long histories are not clipped at the top border, including exact-fit cases. Flash and command-history overlays also layer more cleanly above the status area. #626, #622
- Fixed fuzzy file overlay ordering so the fuzzy file UI appears in the correct layer.
- Fixed clipped rendering for partially visible list items and fallback messages while horizontally scrolled.
- Fixed revset alias parameter metadata preservation.
What's Changed
- Handle Bubble Tea paste messages in text-input flows by @shardulbee in https://github.com/idursun/jjui/pull/601
- Set preview subprocess size via env by @OliverJAsh in https://github.com/idursun/jjui/pull/608
- add repo config file which overrides global config.toml by @nickchomey in https://github.com/idursun/jjui/pull/609
- fix(diff): preserve tab indentation in diff view by @baggiiiie in https://github.com/idursun/jjui/pull/606
- Update installation instruction for archlinux by @TeddyHuang-00 in |
| 0.10.2 | 17 de març del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióQuick release to continue the release early, release often streak.
Features
- Custom diff and preview content — You can now use diff.show() and ui.preview.show() in your Lua actions to display custom command output in the diff and preview panels. (#593)
Bug Fixes
- Rebase source + insert between — Rebase now correctly uses -s (source) instead of -r when combining source mode with insert-between. (#598)
- Missing actions in status bar — Actions with the same name in different scopes (e.g. revset.edit and revisions.edit) are no longer hidden from the status bar. (#595)
- Misaligned lines across terminals — Terminals handle Unicode width calculation differently — Ghostty enables grapheme clustering by default while Kitty does not. We now detect the terminal's width mode and calculate widths accordingly, fixing rendering in both. (#592)
- Operation action overrides — Some built-in actions during operations couldn't be overridden in config.lua. For example, revisions.details.diff, revisions.evolog.diff, and revisions.rebase.* actions can now be properly overridden. (#586, #598)
What's Changed
- fix(render): detect terminal width method by @idursun in https://github.com/idursun/jjui/pull/592
- feat: add diff and preview show intents by @idursun in https://github.com/idursun/jjui/pull/593
Full Changelog: https://github.com/idursun/jjui/compare/v0.10.1...v0.10.2 |
| 0.10.0 | 8 de març del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióWow, a major release after a very long time. As promised, v0.10 is ready, and it comes with breaking changes.
First, thank you to everybody who contributed code, bug reports, ideas, and testing for this release. In particular, thanks to @baggiiiie for various features and fixes, @nickchomey for contributions and continuous feedback, and @vic for updating the documentation website. Thanks as well to everyone else for various code contributions, reporting issues, and verifying fixes.
We changed a lot in v0.10, but the biggest shift is that we finally got rid of some legacy configuration and moved to a unified actions + bindings model. Old concepts like [custom_commands] and [leader] are now replaced by a more consistent system built around actions, bindings, and first-class support for leader-style key sequences.
This release also introduces config.lua, which makes it much easier to customise and extend jjui with real scripting instead of only static configuration. Between config.toml, config.lua, Lua actions, and bindings, much more of the UI can now be customised in one consistent way.
The documentation has been updated with migration notes and examples such as the Lua Cookbook.
From my testing it looks ready, but I am sure more rough edges will show up once more people start using it, so please keep reporting issues as you find them.
⚠️ Breaking Changes
v0.10 replaces the legacy keybinding and customisation model with the new actions + bindings system.
- [keys] configuration is no longer used.
- [custom_commands] is replaced by [[actions]] and [[bindings]].
- [leader] sequences are replaced by sequence bindings via seq.
If you have an existing configuration, plan to migrate it rather than expecting a drop-in upgrade from v0.9.x.
✨Highlights
- Unified actions + bindings system. Keyboard input now flows through a single dispatch pipeline, default bindings are declared in TOML, actions are discoverable, and custom behaviour can be defined in both TOML and Lua.
- Much stronger scripting support. Lua setup now receives the full config plus runtime context, generated intent-backed actions replace handwritten drift-prone bridges, and new helpers like wait_close() and wait_refresh() make multi-step scripts more predictable.
- Upgraded TUI foundations. Moving from Bubble Tea v1 to v2 brings better terminal support, a new rendering engine for better performance, and better input handling, including support for bindings like ctrl+space and dedicated shift+... style keys.
- Improved diff and selection workflows. The diff view now supports word wrap, revisions and details support modifier-based mouse selection, and several details and evolog interactions are more consistent.
🚀 New and Improved
Command History
- Added command history, available with shift+w, to review dismissed command runs together with their output.
- Moved running command information out of the status area and into dedicated flash messages, so the command and its output are now shown together in one place.
Help and Status
- Reintroduced a dedicated Help view for full keybinding discovery, with filtering and scrolling, alongside the existing inline help.
- Changed status/help binding presentation to column-major order so related bindings are easier to scan.
Lua and Configuration
- Shipped the unified actions + bindings architecture introduced in v0.10.
- Exposed the full config object to Lua setup, including runtime context such as repository path via config.repo, and terminal state via config.terminal.dark_mode, config.terminal.fg, and config.terminal.bg.
- Standardised closeable action naming around open_* and aligned apply/close semantics for more predictable scripted workflows.
Oplog
- Added quick search to oplog and shared the search behavior with revision search.
Evolog
- Changed evolog preview defaults to show interdiff output, matching jj evolog -p more closely.
Abandon
- Added s in abandon mode to target descendants of the selected revision(s).
Revset
- Kept re |
| 0.9.12 | 17 de febrer del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióRelease 0.9.12 (Final 0.9.x Series)
[!NOTE]
This is a quick release before marking the end of 0.9.x series due to breaking changes introduced by the work in #533
Fixes & Improvements
- Modal rendering now fills the entire git, bookmarks, and custom command dialogs before drawing rows, eliminating gaps introduced by the new renderer #535
- Fixed a regression where ui.colors.selected = { bg = "black" } no longer highlighted the selected revision by restoring the correct lipgloss → ANSI color conversion #534
- jj git fetch --tracked uses the t shortcut so f remains dedicated to the default fetch, matching the push command’s tracked shortcut #532
- Added a [keys.diff_view] config section so diff scrolling, paging, and closing bindings are customizable #527
- Completion now auto-inserts () when selecting a parameterless function, improving Lua/script authoring speed #530
- Lua’s flash() accepts error and sticky fields, so scripts can show error toasts and control persistence without additional helpers #529
What's Changed
- Auto-append () for parameterless functions in completion by @Dima-369 in https://github.com/idursun/jjui/pull/530
- Add customizable keybindings for the diff view ([keys.diff_view]) by @Dima-369 in https://github.com/idursun/jjui/pull/527
- fix(ui/git): update key for jj git fetch --tracked by @PrayagS in https://github.com/idursun/jjui/pull/532
New Contributors
- @Dima-369 made their first contribution in https://github.com/idursun/jjui/pull/530
Full Changelog: https://github.com/idursun/jjui/compare/v0.9.11...0.9.12 |
| 0.9.11 | 12 de febrer del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióRelease Notes
Overview
The underlying view system has gone through an almost complete rewrite (#473). This major overhaul enabled us to implement various features that weren't possible before and made most of the UI clickable.
What's new:
- Mouse-clickable UI: details panel, evolog, git remotes, bookmark remotes, and more
- Mouse wheel scrolling support across all views
- Foundation for new interactive features like target picker and revset completion box
Highlights
🎉 Which-Key Style Status Bar (#503)
The status bar now works like which-key in Emacs/Vim:
- Dynamically adjusts to window width - shows ?/more when space is limited
- Press ? to expand and see all available keybindings
- Works with stacked menus (git, bookmarks) to show context-specific help
- Press esc to collapse
- Replaces the old help menu
🎯 Target Picker for Operations (#490)
Operations like rebase, new, edit, and squash now support an interactive target picker:
- Press t to open the target picker
- Select a revision or type a custom target (bookmark name, change ID, etc.)
- Press enter to execute the command
https://github.com/user-attachments/assets/353013ea-0f4c-4586-8ad9-4a78b6bcf8ac
✨ Enhanced Revset Completion (#510)
Multi-line revset completion with comprehensive function support:
- Added 16 missing revset functions: bisect, divergent, none, subject, connected, heads, roots, reachable, tracked, untracked, conflict, file, diff, author_date, committer_date, working_copies
- Fixed function signatures and renamed diff_contains to diff_lines
- Shows full completion list when history is empty
- Better visual styling and source-based completion
🔍 Backward Quick Search Navigation (#509)
Quick search now supports cycling in both directions:
- Added quick_search_cycle_back keybinding (default: " which is Shift+')
Improvements
- Split/Restore interactive mode (#500)
- Quit now works from any view without needing to press ESC first
Bug Fixes
- Preview window now updates after squash operations (#518)
- Fixed "Change ID prefix is ambiguous" error when abandoning revisions (#517)
- Preview resets to top when switching revisions (#477)
- Confirmation dialog closes immediately after restore (#508)
- Description editing works with single-line log templates (#496)
- Fixed elided revision markers rendering (#486)
- Fixed highlight rendering when inline describe is open (#485)
- Fixed search highlighting (#481)
- Prevent clicking outside window boundaries
- Cursor position only enforced with keyboard navigation, not mouse wheel
- Fixed remotes dialog height
- Fixed divergent change ID parsing
- Fixed bookmark remote filtering
- Fixed curved graph lines
- Removed extra gap above status line (#513)
- Fixed preview split border z-index (#478)
- Fixed details view rendering position (#476)
- Added left/right arrow key support (#501, #502)
- jj describe -m now handles messages starting with - (#475)
- Fixed footer to show revset keybindings when active (#489)
- Preview updates when jumping through search results (#498)
What's Changed
- Introduce immediate view mode by @idursun in https://github.com/idursun/jjui/pull/473
- feat: add treefmt formatters by @doprz in https://github.com/idursun/jjui/pull/436
- revisions: fix displaycontext_renderer to render details before elided marker by @baggiiiie in https://github.com/idursun/jjui/pull/476
- preview: reset preview offset after revision change by @baggiiiie in https://github.com/idursun/jjui/pull/477
- fix preview split border and stacked menu indexes by @baggiiiie in https://github.com/idursun/jjui/pull/478
- refactor: intents by @idursun in https://github.com/idursun/jjui/pull/480
- hotfix(nix): add jjui build check and update vendor-hash by @doprz in https://github.com/idursun/jjui/pull/482
- displaycontext_renderer: fix overlay rendering over description lines by @baggiiiie in https://github.com/idursun/jjui/pull/485
- fix: set description from stdin to allow messages starting with minus by @kankri in https://github.com/id |
| 0.9.10 | 17 de gener del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióRelease Notes
🆕 Features
Lua Scripting Enhancements
- Lua Context Module (#465): Added context module to Lua scripting API, exposing methods for accessing selected item metadata and checked items:
- context.change_id() - Get the change ID of selected revision or file
- context.commit_id() - Get the commit ID of selected revision, file, or commit
- context.file() - Get the file path of selected file
- context.operation_id() - Get the operation ID of selected operation
- context.checked_files() - Get array of checked file paths
- context.checked_change_ids() - Get array of change IDs from checked items
- context.checked_commit_ids() - Get array of commit IDs from checked items
- Shell Execution in Lua (#471): Exposed exec_shell() function to Lua scripts, enabling interactive commands like opening files in external editors directly from jjui. This enables custom commands such as:
[custom_commands.open_file]
key = ["O"]
lua = '''
local file = context.file()
if not file then
flash("No file selected")
return
end
exec_shell("vim " .. file)
'''
✨ Improvements
- Abandon Workflow: Removed confirmation dialog; users can now use Space to add/remove revisions from the abandon list
🐛 Bug Fixes
- Preview Pane Scrolling (#472): Fixed broken Ctrl-U/Ctrl-D scrolling in the preview pane that was introduced by earlier input routing changes. Preview commands are now properly grouped and always handled.
- Parser: Fixed handling of divergent change ID format
- Bookmarks: Fixed tracking of new bookmarks (currently tracks all remotes)
🔧 Compatibility
- Jujutsu 0.36.0 Support (#407): Updated commands to work with breaking changes in Jujutsu 0.36.0:
- Changed --destination flag to --onto
- Changed --edit flag to --editor
- Removed deprecated --allow-new flag from git push commands
- Updated keybinding from d to o for --onto flag in related modes
📝 Documentation
- README Updates (#470):
- Added missing op log revert item to help menu
- Fixed redo documentation
- Updated custom command examples
What's Changed
- jj-update: fix commands to work with breaking changes in jj-0.36.0 by @baggiiiie in https://github.com/idursun/jjui/pull/407
- refactor(abandon): remove confirmation dialog by @idursun in https://github.com/idursun/jjui/pull/462
- fix(bookmarks): track new bookmarks by @idursun in https://github.com/idursun/jjui/pull/463
- feat(lua): add context module by @idursun in https://github.com/idursun/jjui/pull/465
- lua: expose exec_shell to lua script by @baggiiiie in https://github.com/idursun/jjui/pull/471
- README improvements and help menu missing item by @baggiiiie in https://github.com/idursun/jjui/pull/470
- ui,preview: fix preview pane ctrl-u/d scrolling by @baggiiiie in https://github.com/idursun/jjui/pull/472
Full Changelog: https://github.com/idursun/jjui/compare/v0.9.9...v0.9.10 |
| 0.9.9 | 8 de gener del 2026 | — | 64 bits ZIPARM64 ZIP Notes de la versióRelease Notes
Another release with small improvements and bug fixes. Thanks to all contributors!
🎉 New Features
Custom Commands & Lua API Enhancements
- Custom Commands with Sequence Keys (#420)
- Added key_sequence property allowing custom commands to be invoked with multiple key presses in sequence
- Added desc property for command descriptions
- Introduced sequence overlay UI showing available key sequences when first key is pressed
- Example: key_sequence = ["w", "b", "l"]
- Lua API: Choose Method and UI (#427) (#442)
- New choose() function for interactive selection prompts in Lua scripts
- New input() function to prompt users for text input with customizable title and prompt
- New split_lines() function for text processing
- Lua API: Await on Operation Results (#422)
- start_inline_describe() now returns boolean indicating if operation was applied or cancelled
- Enables conditional command execution based on user actions
- Fixes #310
- Lua API: Interactive Commands (commit 8b257263)
- Added jj_interactive Lua function for interactive jj command execution
Navigation & UI Improvements
- Ace Jump for Operations (#445)
- Pressing 'f' in set_parents/duplicate/rebase/squash modes now triggers ace jump
- After jump completes, returns to the original operation mode instead of normal mode
- Closes #394
- Preview Width Variable (#452)
- Added $preview_width placeholder variable for preview commands
- Exposes actual view width (in columns) to enable tools like delta to use --side-by-side correctly
- Width updates dynamically when preview pane is resized
- Similar to fzf's $FZF_PREVIEW_COLUMNS
- Configurable Flash Message Display Time (#456)
- New config key: ui.flash_message_display_seconds (default: 4)
- Special value 0 means messages display until manually dismissed
- Fixes #455
- Page Up/Down Key Configuration (#437)
- ScrollUp/Down keys now registered in config instead of hardcoded
- Keys exposed to configuration for customization
- Fixes #360
SSH & Authentication
- SSH Askpass Support (#423)
- New [ssh] hijack_askpass setting to prompt for SSH passphrases/PINs within jjui
- Works on Linux and macOS
- Properly handles prompt overriding and cancellation
- Fixes #100
🐛 Bug Fixes
- Exec Command History (#458)
- Fixed issue where selected command history wasn't applied in exec mode
- Input value now properly updated when selecting from fuzzy/regex suggestions
- Selected commands correctly saved to history
- Menu Pagination Display (#446)
- Fixed incorrect %d/%d pagination display
- Height now calculated before pagination render
- Added tab/shift+tab to short help menu
- Fixes #444
- Flash Message Width (#432)
- Added maxWidth (50% of screen) to flash message rendering
- Messages now properly line-wrap instead of extending beyond window width
- Operation Log Refresh (#431)
- Operation log now returns Refresh and SelectionChanged messages upon closing
- Fixes #430
- Custom Commands List Sorting (commit 3fa9783a)
- Fixed custom commands list to use stable sort
- Fixes #424
- JJ Error Pass-through (#421)
- jjui now properly passes through stderr from jj commands
- Error messages are more informative and show actual jj errors
- Navigation Message Display (commit 94a4a874)
- Navigation messages now only shown for paged scrolls
What's Changed
- main: pass through jj error by @baggiiiie in https://github.com/idursun/jjui/pull/421
- feat(lua): add ability to await on operation results (cancelled/applied) by @idursun in https://github.com/idursun/jjui/pull/422
- oplog: return Refresh and SelectionChanged upon oplog closing by @baggiiiie in https://github.com/idursun/jjui/pull/431
- feat(nix): add comprehensive nix flake by @doprz in https://github.com/idursun/jjui/pull/426
- Add option to hijack SSH Askpass to prompt for passphrase/pin by @oliverpool in https://github.com/idursun/jjui/pull/423
- feat(lua): add choose method and ui by @idursun in https://github.com/idursun/jjui/pull/427
- flash: add maxWidth to flash msg rendering by @baggi |
| 0.9.8 | 11 de desembre del 2025 | — | 64 bits ZIPARM64 ZIP Notes de la versióRelease Summary
This release includes experimental Lua scripting support for custom commands, several bug fixes, and UI improvements. The streaming command handler has been reworked to remove the 100ms delay incurred on every refresh (you should feel the difference), and issues with leader keys, parser colour handling, and preview panel focus have been resolved.
Key Highlights
🚀 Major Features
- Lua Scripting in Custom Commands (#415): Experimental support for writing custom commands using Lua scripts.
Initial version includes API for revision navigation, JJ command execution, clipboard operations, revset manipulation and displaying flash messages.
These are the currently available functions but expect the list to grow and change with each release.
Available Functions (v1):
- revisions.current() - Get currently selected change ID
- revisions.checked() - Get list of checked change IDs
- revisions.refresh({keep_selections?, selected_revision?}) - Refresh revisions view
- revisions.navigate({by?, page?, target?, to?, fallback?, ensureView?, allowStream?}) - Navigate revisions
- revisions.start_squash({files?}) - Begin squash workflow
- revisions.start_rebase({source?, target?}) - Start rebase operation
- revisions.open_details() - Open revision details view
- revisions.start_inline_describe() - Open inline describe editor
- revset.set(value) - Set custom revset
- revset.reset() - Reset to default revset
- revset.current() - Get active revset string
- revset.default() - Get default revset string
- jj_async({...}) - Run JJ command asynchronously
- jj({...}) - Run JJ command synchronously (returns output, err)
- flash(message) - Display flash message
- copy_to_clipboard(text) - Copy text to clipboard
Here are a couple of examples:
- Appends | ancestors(<change id of the current revisions>, 2) to the end of revset and bumps the number with each execution
[custom_commands.append_to_revset]
key = ["+"]
lua = '''
local change_id = revisions.current()
if not change_id then return end
local current = revset.current()
local bumped = false
local updated = current:gsub("ancestors%(" .. change_id .. "%s*,%s*(%d+)%)", function(n)
bumped = true
return "ancestors(" .. change_id .. ", " .. (tonumber(n) + 1) .. ")"
end, 1)
if not bumped then
updated = current .. "| ancestors(" .. change_id .. ", 2)"
end
revset.set(updated)
'''
- Inserts a new commit after the selected one and then starts inline describe on the new revision.
[custom_commands.new_then_describe]
key = ["N"]
lua = '''
jj("new", "-A", revisions.current())
revisions.refresh()
local new_change_id = jj("log", "-r", "@", "-T", "change_id.shortest()", "--no-graph")
revisions.navigate{to=new_change_id}
revisions.start_inline_describe()
'''
- Copy to clipboard example
[custom_commands.copy_to_clipboard]
key = ["X"]
lua = '''
local selections = revisions.checked()
if #selections == 0 then
flash("none selected")
end
local content = table.concat(selections, ",")
copy_to_clipboard(content)
'''
✨ Enhancements
- Key Sequences for Custom Commands (#420): Custom commands can now be triggered with multi-key sequences using key_sequence property. Also adds desc property for command descriptions. An overlay shows available sequences after pressing the first key.
Example:
[custom_commands.bookmark_list]
key_sequence = ["w", "b", "l"]
desc = "bookmarks list"
lua = '''
revset.set("bookmarks() | remote_bookmarks()")
'''
- Faster Refresh (#412): Improved streaming command handling, eliminating 100ms delay and making refreshes instant. Previously jjui would fail to launch or get stuck when jj emitted warning messages (e.g., deprecated config options like git.push-new-bookmarks).
- Quick Search Highlighting (#414): Case-insensitive search with visual highlighting of all matches in the revisions view
- Remember Unsaved Descriptions (#417): Descriptions are now preserved when you cancel, preventing accidental loss of work. Addresses the common frustration of accidentally hitting ESC and losing long commit m |
| 0.9.7 | 2 de desembre del 2025 | — | 64 bits ZIPARM64 ZIP Notes de la versió🎉 This release enhances performance and introduces stability improvements in log parsing and command execution. It also takes back some of the stability by adding basic mouse support.
Features
📈 Performance Improvements
Implemented frame-rate limited rendering (capped at 120 FPS) to significantly improve application performance by deferring view generation until the next frame tick. This addresses the slowest path in the application - view generation - making it much more responsive
🐭 Mouse Support
- Clickable and scrollable revisions view (excluding operations) (#391)
- Clickable and scrollable op log view
- Draggable and scrollable (vertically + horizontally) preview pane
- Scrollable diff window
- Replaced custom viewport with bubbles/viewport for more responsive rendering (#396)
https://github.com/user-attachments/assets/7cbad275-713e-4fa3-8d61-4e86c301ab0c
🔎 Preview
- Replaced surrounding border with divider for more preview space (#396)
Operation Log (oplog)
- Added jj op revert functionality with R key binding (#400)
Revset Handling
- Pressing up arrow in empty revset field now sets the current revset (#284)
- Fixed mismatch where empty revset input would use config default instead of session default from -r flag. Now correctly updates CurrentRevset to session default instead of empty string (#399)
Details View
- Allow quitting from details view when quit key is pressed (e.g. q)
Bug Fixes
Rendering Issues
- Fixed double rendering of inline describe content when next line contains only revision line. Added revisionLineRendered tracking flag to properly sequence the description overlay rendering (#403, #369)
- Fixed viewport adjustment when PageDown moves cursor below viewport. The renderer now continues rendering until it reaches the focused item, ensuring proper viewport adjustment (#395)
- Fixed PageUp/Down navigation at top and bottom of revset when less than one page remains. Now includes early return with feedback message when already at boundary (#387, #386)
- Removed incorrect space trimming in renderer (#393)
Log Processing
- Applied partial fixes to prevent out-of-order row updates in log streamer
Details View
- Handle cases where conflict markers span multiple lines (#398)
- Ignore virtual selection on refresh (#381)
Operation Log (oplog)
- Fixed an issue in operation ID detection (#380, #377)
Command Execution
- Added a mechanism for restoring failed commands to input field, allowing retries without retyping (#392)
Template System
- Enhanced jj log parsing using native template prefixes for better change ID and commit ID detection. Fixes issues when bookmarks are "HexLike" (#358, #228, #372)
What's Changed
- Remove teatest package and simplify tests by @idursun in https://github.com/idursun/jjui/pull/379
- internal/parser: get revision ids with template prefixes by @baggiiiie in https://github.com/idursun/jjui/pull/372
- fix(oplog): improve operation id detection by @idursun in https://github.com/idursun/jjui/pull/380
- refactor: serialise command execution by @idursun in https://github.com/idursun/jjui/pull/378
- Revert "refactor: serialise command execution" by @idursun in https://github.com/idursun/jjui/pull/383
- revisions: fix scrolling at the top and bottom of revset by @baggiiiie in https://github.com/idursun/jjui/pull/387
- refactor: introduce and implement common.Model by @idursun in https://github.com/idursun/jjui/pull/384
- refactor: Replace custom cell buffer implementation with cellbuf package by @idursun in https://github.com/idursun/jjui/pull/388
- refactor: use simple layout functions to lay out the main UI by @idursun in https://github.com/idursun/jjui/pull/389
- Coming back to previous state when exec command failed by @ArnaudBger in https://github.com/idursun/jjui/pull/392
- feat: add basic mouse support by @idursun in https://github.com/idursun/jjui/pull/391
- list/renderer: fix viewport adjustment on PageDown by @baggiiiie in https://github.com/idursun/jjui/pull/395
- Make preview hori |
| 0.9.6 | 23 de novembre del 2025 | — | 64 bits ZIPARM64 ZIP Notes de la versióAnother community driven release, mostly focusing on every day improvements.
What's Changed
- fix(ace_jump): close operation after applying jump by @baggiiiie in https://github.com/idursun/jjui/pull/351
- feat: auto-detect preview placement, on by default by @lbonn in https://github.com/idursun/jjui/pull/348
- feat: allow remote selection in git menu by @baggiiiie in https://github.com/idursun/jjui/pull/349
- fix(fuzzy_files): quote path for editor command by @baggiiiie in https://github.com/idursun/jjui/pull/354
- fix for preview copied status file and filename with by @baggiiiie in https://github.com/idursun/jjui/pull/357
- Support interactive file-level restores by @remo5000 in https://github.com/idursun/jjui/pull/365
- fuzzy_files: remove quoting for files in revset by @baggiiiie in https://github.com/idursun/jjui/pull/370
- ui/git: add --tracked to git fetch by @baggiiiie in https://github.com/idursun/jjui/pull/368
- operation: add ForceApply to squash/rebase footer by @baggiiiie in https://github.com/idursun/jjui/pull/371
- abandon: add force apply to footer help menu by @baggiiiie in https://github.com/idursun/jjui/pull/373
- docs(README): add winget and scoop as installation method in Windows by @abgox in https://github.com/idursun/jjui/pull/362
- fix(set_parents): keep parent order by @idursun in https://github.com/idursun/jjui/pull/375
- fix(light theme): Removed the default border style of bright white as it was overriding the text style which should be the terminal’s default foreground and background.
New Contributors
- @lbonn made their first contribution in https://github.com/idursun/jjui/pull/348
- @remo5000 made their first contribution in https://github.com/idursun/jjui/pull/365
- @abgox made their first contribution in https://github.com/idursun/jjui/pull/362
Full Changelog: https://github.com/idursun/jjui/compare/v0.9.5...v0.9.6 |
| 0.9.5 | 20 d’octubre del 2025 | — | 64 bits ZIPARM64 ZIP Notes de la versióThis release contains some minor improvements and bug fixes.
- Help window is now searchable. #334
- changed preview to run in the background while getting the diff contents to improve UI responsiveness. #336
- fix: async command executor used to append --color always to the end of the command to get colourful output but this broke some commands that expect arguments. This change moves the --color always to the beginning of the command. #339
- Added pgup and pgdown bindings to the revisions view so that you can jump down/up without having to press j/k multiple times. #347
- improved handling of bookmarks that contain -- characters in their name. jj returns these bookmarks with quotes which jjui didn't handle well. #346
- JJUI_CONFIG_DIR is changed to match the documentation where it will load the configuration from $JJUI_CONFIG_DIR/config.toml rather than $JJUI_CONFIG_DIR/jjui/config.toml #343
- ace jump didn't highlight change ids in some template configuration. It should highlight change ids and commit ids correctly now.
What's Changed
- feat: add search functionality to help menu by @baggiiiie in https://github.com/idursun/jjui/pull/334
Full Changelog: https://github.com/idursun/jjui/compare/v0.9.4...v0.9.5 |
| 0.9.4 | 11 d’octubre del 2025 | — | 64 bits ZIPARM64 ZIP Notes de la versióA point release mostly made of community contributions. Thanks to all the contributors (via code or feedback or reporting issues) ❤️
I have been most working on the v0.10 refactoring, so that's why this release is delayed for quite some time and I also didn't get my full focus as I have been maintaining two different codebases.
Here are some highlights of the changes in this release.
- ui: jjui can do focus tracking (if it is supported by your terminal). jjui will refresh itself once it receives the focus back.
- redo: Added support for jj redo which is bound to U key.
- git: jj git push --changes can work on multiple revisions #321
- inline describe: Pressing alt+e in the inline describe will launch the description editing in your configured $EDITOR #317
- split: Pressing alt+s will pass --parallel to the split command #324
- megamerge: Due to popular demand megamerge has been renamed to set_parents.
- squash: pressing alt+enter will apply the command with --ignore-immutable.
- rebase: pressing e will toggle --skip-emptied argument.
Let me know if something is broken and enjoy!
What's Changed
- feat(describe): Allow multiple revisions by @the-kenny in https://github.com/idursun/jjui/pull/297
- feat: remove auto refresh in favour of focus tracking by @idursun in https://github.com/idursun/jjui/pull/306
- Revert "feat: remove auto refresh in favour of focus tracking" by @idursun in https://github.com/idursun/jjui/pull/308
- feat: edit in editor escape hatch for inline describe editor by @paradox460 in https://github.com/idursun/jjui/pull/317
- feat(git): Support multiple revisions by @the-kenny in https://github.com/idursun/jjui/pull/321
- feat(suggest): Allow configuring default suggest mode for exec commands by @Adda0 in https://github.com/idursun/jjui/pull/323
- feat: add jj redo functionality by @baggiiiie in https://github.com/idursun/jjui/pull/322
- Add "SplitParallel" command by @ianjsikes in https://github.com/idursun/jjui/pull/324
- feat: add failure test scenario support by @baggiiiie in https://github.com/idursun/jjui/pull/326
New Contributors
- @the-kenny made their first contribution in https://github.com/idursun/jjui/pull/297
- @paradox460 made their first contribution in https://github.com/idursun/jjui/pull/317
- @baggiiiie made their first contribution in https://github.com/idursun/jjui/pull/322
- @ianjsikes made their first contribution in https://github.com/idursun/jjui/pull/324
Full Changelog: https://github.com/idursun/jjui/compare/v0.9.3...v0.9.4 |
| 0.9.3 | 30 d’agost del 2025 | — | 64 bits ZIPARM64 ZIP Notes de la versióWhat's Changed
- feat: squash files from details view by @Jollywatt in https://github.com/idursun/jjui/pull/283
Bug Fixes
- ace_jump: Selection logic improved to fix navigation issues #285
- megamerge: Changed revision removal order to ensure correct rebasing #291
- megamerge: Descendant commits now preserved during merge operations #289
- details: Escaped file names to prevent errors in the details view #290
- revisions: Shortcuts disabled when no revisions are present to prevent crashes #286
- inline_describe: Single row log graphs now display correctly #280
Full Changelog: https://github.com/idursun/jjui/compare/v0.9.2...v0.9.3 |
| 0.9.2 | 21 d’agost del 2025 | — | 64 bits ZIPARM64 ZIP Notes de la versióMostly a maintenance release, but adds a new operation for supporting megamerge users.
Pressing M will start the mega merge operation, in which you can use space to add/remove parents.
Bug fixes
- Make sure that the selected revision stays selected after refreshes
- Fixed a bug in jj shell/exec so that commands always run inside the repository directory.
What's Changed
- fix(fuzzy_file): Prevent crash if current revset is invalid. by @vic in https://github.com/idursun/jjui/pull/265
- feat(fuzzy_input): More intuitive movement on history and different suggestions modes. by @vic in https://github.com/idursun/jjui/pull/254
- fix(leader): Use tea.Sequence instead of our custom cmd sequencing. by @vic in https://github.com/idursun/jjui/pull/268
- $checked_commit_ids expands to none() without checked commit by @glehmann in https://github.com/idursun/jjui/pull/271
Full Changelog: https://github.com/idursun/jjui/compare/v0.9.1...v0.9.2 |
| 0.9.1 | 4 d’agost del 2025 | — | 64 bits ZIPARM64 ZIP Notes de la versióThis was supposed to be a maintenance release but it is packed with new features thanks to all the contributors!
Phew, another release which was supposed to be a minor maintenance release but to be honest, I didn't much other than implementing flash messages and lane tracing.
All the remaining features are implemented by contributors: @vic @zerowidth @penryu Thanks!
New Features
🎉 Flash messages
jjui now shows the output of the commands as flash messages. Success messages disappear after 4 seconds, and failure messages stay sticky and can be dismissed with esc.
🎉 Fuzzy file search
Pressing ctrl+t opens up the fuzzy file search. Choosing one file from the list will change the revset to show all changes made to that file. #203
Additionally, when the fuzzy file search is open, you can use ctrl+t again to turn on preview mode to see the contents of the file and the changes made to the file.
🎉 Ace jump
Similar to how vim's ace jump works, pressing f will highlight the first character of each change id (only non-hidden, non-conflicting, and non-root) or each commit id and typing the letters until an unambigous revision is found will jump the cursor to that revision.
🎉 (experimental) Lane tracing
This is an experimental feature and currently disabled by default, but you can enable it with the following configuration:
[ui.tracer]
enabled = true
When tracing is enabled, lanes that the currently selected revision in are highlighted and out of lane revisions are fainted.
🎉 Restore from evolog
While in the evolog view, you can now press r to restore the selected evolog into the target revision you select.
The operation will run equivalent of the following command:
jj restore --from <selected evolog commit id> --into <selected target revision change id> --restore-descendants
As a result of this new functionality, evolog key bindings turned into a table with the following defaults:
[keys.evolog]
mode = ["v"]
diff = ["d"]
restore = ["r"]
🎉 Preview window at the bottom of the UI
Pressing shift+p will move the preview window to the bottom of the screen. This can be made the default position with the following configuration:
[ui.preview]
show_at_bottom = true
🎉 Force apply
Performing an operation on an immutable revision returned an error in jjui. Now you can use alt+enter to force the command to ignore immutable revisions. (i.e. add --ignore-immutable argument)
Default key binding configuration is like the following:
[keys]
force_apply = ["alt+enter"]
🎉 Log batching
Log batching will only load the first 50 revisions and load the next chunk if you scroll past the 50th revision. Previously, jjui loaded the whole logs before it displayed the revisions. This new method should reduce the start up times greatly if you are working with large repositories. It almost has no effect if you are working with small repositories.
This has been an experimental feature for a while, turned off by default, behind the experimental_log_batching_enabled configuration option.
In this release it is turned on by default, but the configuration location has been moved to the following and you can still turn it off if you like:
[revisions]
log_batching = false
Minor Changes
Light and Dark theme syntax
Theme configuration now allows choosing different themes for light and dark themes.
[ui.theme]
light = "my-light-theme"
dark = "my-dark-theme"
Previous syntax is still supported, which will set light and dark to be the same value.
[ui]
theme = "my-theme"
Conflict markers in details view
Details view now show conflict markers next to the conflicted files.
Make default log format and revset configurable
jjui reads and uses the default revset and the log format as they are configured in jj.
You can now override these values with the following configuration:
[revisions]
template = 'builtin_log_compact' # overrides jj's templates.log
revset = "" # overrides jj's revsets.log
Confirmation dialogs show menu option shortcuts in the status bar
Previously, you needed to know p |
| 0.9.0 | 21 de juliol del 2025 | — | 64 bits ZIPARM64 ZIP Notes de la versióBreaking changes
💥 preview.extra_args configuration option is removed in favour of preview commands (see below).
This change allows far more customisation opportunities than what extra_args offered.
💥 ui.highlight_dark and ui.highlight_light configuration options are removed
These have been replaced by the new theming system for more granular control over the UI's appearance.
Migration: You can now set "selected" = { bg = "your colour" } under [ui.colors] table in your config.toml or by creating a custom theme. See the new "Theme Support" feature below for details.
New Features
🎉 Theme support
You now have granular control over the application's appearance with a new theming system.
- Load Custom Themes: Create your own .toml theme files and enable them with the ui.theme setting in your config.
- Easy Overrides: Quickly tweak any colour from your loaded theme directly in your main config.toml under the [ui.colors] section.
- Detailed Styling: Themes use selectors to target specific UI elements (like selected, border, or revisions title), allowing you to customise everything from text colours and styles to backgrounds.
Selected revision styled with italic and underline:
A complete theme example:
Read Themes page in the wiki for detailed information.
See discussion.
🎉 Leader key support
This release introduces a "Leader key" feature, inspired by Vim's <Leader> and Emacs' hydra. It acts as a prefix key (default: \) to navigate a tree of custom, mnemonic keymaps for your personal workflows.
- Create Custom Shortcuts: Define key sequences in your config.toml under the [leader] table to execute any action possible in the UI.
- Nested & Context-Aware: Keymaps can be nested (e.g., \na for "new after") and can be configured to appear only in specific contexts, such as when a revision is selected.
- How it works: Press the leader key (\), then navigate the help menu with single-character key presses to trigger your custom command sequences.
This allows for powerful, user-defined workflows, such as editing a file from a specific revision or saving the current revset as an alias, directly from the UI.
Read Leader-Key page in the wiki for detailed information
🎉 Execute shell and jj commands directly from jjui
You can now execute jj and shell commands directly from the TUI.
- : Run interactive jj commands. jjui will suspend, and the command will run directly in your terminal (e.g., : restore -i). You will return to jjui when the command finishes.
- $ Run any shell command without leaving jjui. (e.g., \(man jj or\) htop)
Context-aware placeholders like $file and $change_id are supported in your commands.
🎉 Inline describe
You can now edit the description of a revision by pressing enter. This will load the description into an inline editor. You can accept the changes by pressing alt+enter or ctrl+S.
🎉 New shortcuts for menu items
You can now press the assigned shortcut to invoke an item in git, bookmarks and custom commands menus.
For example:
- bmm: will choose and invoke bookmarks move 'main'
- gpa: will choose git push --all
- gpc: will choose git push --change
- etc
🎉 Interactive jj duplicate
You can now duplicate one or more revisions directly from the UI.
- Select the revision(s) you want to copy and press y (the default key) to enter "duplicate mode".
- Choose a Destination: Navigate to the target revision where you want to place the copy.
- Fine-tune Placement: The UI provides a live preview of the operation. Use sub-keys to control the exact placement:
- a: Place the copy after the target revision.
- b: Place the copy before the target revision.
- d: Place the copy onto the target revision (i.e., --destination).
- Confirm: Press Enter to execute the command.
Minor Changes
Introduced preview commands per item type
You can now define separate commands to show the contents of the selected item in the preview window.
The following are the default commands.
[preview]
revision_command = ["show", "--color", "always", "-r", "$change_ |
| 0.8.12 | 4 de juliol del 2025 | — | 64 bits ZIPARM64 ZIP Notes de la versióWhat's Changed
Improvements
Revset
- Completions show on the second line as a list now. You can use tab/shift+tab to cycle forward/backward.
- Loads and adds revset-aliases defined in your jj config to the list of completions.
- Keeps the history. You can use up/down to cycle through revset history. History is only available during the session. (i.e. it's not persisted)
Squash
Got two new modifiers:
- You can use e for keeping the source revision empty (--keep-emptied)
- You can use i for running the squash operation in interactive mode (--interactive)
- Squash key configuration has changed:
[keys.squash]
mode = ["S"]
keep_emptied = ["e"]
interactive = ["i"]
Rebase
Revisions to be moved are marked with move marker, and get updated according to the target. (i.e. branch/source will mark all revisions to be moved according to the target)
Minor
- Details: Added absorb option to absorb changes in the selected files.
- Help window is updated to have 3-columns now.
- Changed auto refresh to proceed only when there's an actual change.
- JJ's colour palette is loaded from jj config at start up and applied to change_id, rest, diff renamed, diff modified, diff removed. This is the first step towards implementing colour themes for jjui.
Fixes
- Revisions view don't get stuck in loading state when the revset don't return any results.
- Selections should be kept as is across auto refreshes.
- Fixed various issues about bookmark management where delete bookmark menu items were not shown, and track/untrack items were shown incorrectly under certain circumstances #155 #156
- Double width characters should not cause visual glitches #138
- Fixed visual glitches when extending graph lines to accommodate graph overlays
Contributions
- gitignore: add result for nix build . by @ilyagr in https://github.com/idursun/jjui/pull/133
- CI and Nix: make nix flake check build the flake by @ilyagr in https://github.com/idursun/jjui/pull/132
- build(nix): add git version to --version by @teto in https://github.com/idursun/jjui/pull/150
- doc: Remove a duplicated maintainer mention by @Adda0 in https://github.com/idursun/jjui/pull/153
- build(nix): allow building flake when self.dirtyRev is not defined by @ilyagr in https://github.com/idursun/jjui/pull/152
- fixed display of empty revsets (#151) by @Gogopex in https://github.com/idursun/jjui/pull/154
- fix: refresh SelectedFile on ToggleSelect by @IvanVergiliev in https://github.com/idursun/jjui/pull/158
New Contributors
- @teto made their first contribution in https://github.com/idursun/jjui/pull/150
- @Gogopex made their first contribution in https://github.com/idursun/jjui/pull/154
- @IvanVergiliev made their first contribution in https://github.com/idursun/jjui/pull/158
Full Changelog: https://github.com/idursun/jjui/compare/v0.8.11...v0.8.12 |