jjui + magit-section inspired jj ui for Emacs!
Screen.Recording.2026-03-21.at.5.03.41.PM.mov
M-x majjicopen the logTABexpand or collapse a revision, file, or hunkRETopen a file or jump from a hunk linen/pmove through visible sectionsM-n/M-pmove between siblings^jump to parent sectionNcreate a new child of the marked revisions, or the current revision if none are marked, and move to@eedit the current revision and move to@ddescribe the current revision with a minibuffer promptSPCtoggle a persistent mark on the current revision and move to the next revisionMclear all marksaabandon the currently marked revisions after confirmationrenter rebase mode using marked revisions as the source, or the current revision if none are marked; in rebase mode,sselects source descendants,o/a/bchoose onto / after / before,RETapplies, andC-gcancelssenter squash mode using marked revisions as the source, or the current revision if none are marked; Majjic selects the common parent as the initial destination when available,RETapplies, andC-gcancelsuundo the latest operation after confirming a full op-log peekUredo the latest undone operation after confirming a full op-log peekG f ffetch from the configured Git remote and refreshG f tfetch only tracked bookmarks from the configured Git remote and refreshG p cpush the marked visible revisions, or the current revision if none are marked, byjj git push --changeafter a dry-run confirmationG p ppush bookmarks pointing at the marked visible revisions, or the current revision if none are marked, byjj git push --revisionafter a dry-run confirmation:run a configured Majjic custom command by name- Mutations and
grefresh run asynchronously; while one is in flight, navigation, snapshots, and lazy diff expansion stay available, but marks, rebase edits, and refresh are blocked Oreserved for an op-log browserBreserved for a bookmark browsergrefresh
Majjic custom commands are selected from the : prompt. They run through
majjic-program, so Jujutsu aliases work naturally. For example, to run a
user-configured jj gt-submit alias against the marked visible revisions, or
the current revision when nothing is marked:
(setq majjic-custom-commands
'((:name "Graphite submit"
:command ("gt-submit" "-r" :revset)
:preview ("gt-submit" "--dry-run" "-r" :revset)
:confirm "Submit selected revision with Graphite? "
:status "Submitting selected revision..."
:success "Submitted selected revision"
:refresh t)))Command templates support :revset for one selected-revisions revset argument
and (:revisions PREFIX) for repeated revision arguments.