Making jj look like Tokyo Night

Part 5 of 9.

This is the least essential lesson in the series and the one I spent the most immediate enjoyment on. jj doesn’t ship theme presets - it ships a [colors] config table where every key is a style label attached to templated output (change_id, bookmarks, conflict, and so on), and the value is a color name, a hex string, or a table for bold, italic, underline. That’s a more general mechanism than a fixed theme switch, at the cost of having to build the theme yourself.

Building it was mostly mechanical: take the Tokyo Night “Night” palette from folke/tokyonight.nvim, and walk down the list of labels jj currently ships defaults for -

jj config list --include-defaults colors
  • assigning each one a palette color that made semantic sense. Change ids in magenta, bookmarks in green and bold since they’re the thing I actually care about scanning for, conflicts in red, everything else muted toward the palette’s comment gray so it recedes rather than competes.

The only real gotcha: label specificity. A key like "working_copy description" targets a more specific compound label than plain description, and when both are set, the more specific one wins for that context. The first time a color didn’t apply where expected, it was because a more specific label further down the default list was already handling that exact spot. jj config list --include-defaults colors is the actual source of truth here, not a screenshot from an old blog post - the label set has grown across releases and probably will keep growing.

Small payoff, but a real one: jj log, jj diff, and jj status now read at a glance, in a palette I already use in the editor and terminal all day.