Fast unified Starship prompt module for Git and Jujutsu repositories
Rust
240
56 commits
updated Sep 4, 2026
Unified Starship prompt module for Git and Jujutsu repositories that is optimized for latency.
brew install dmmulroy/tap/jj-starship
cargo install jj-starship
git clone https://github.com/dmmulroy/jj-starship
cd jj-starship
cargo install --path .
# Try it
nix run github:dmmulroy/jj-starship
# Install to profile
nix profile install github:dmmulroy/jj-starship
# Minimal build (no git support, smaller closure)
nix run github:dmmulroy/jj-starship#jj-starship-no-git
Or add to your flake inputs:
{
inputs.jj-starship.url = "github:dmmulroy/jj-starship";
outputs = { self, nixpkgs, jj-starship, ... }: {
# Use the overlay
nixosConfigurations.myhost = nixpkgs.lib.nixosSystem {
modules = [{
nixpkgs.overlays = [ jj-starship.overlays.default ];
environment.systemPackages = [ pkgs.jj-starship ];
}];
};
};
}
The git feature is enabled by default. Disable to compile out the git backend:
# JJ only (excludes git2 dependency)
cargo install --no-default-features jj-starship
Add to ~/.config/starship.toml:
[custom.jj]
when = "jj-starship detect"
shell = ["jj-starship"]
format = "$output "
Why these settings:
when = "jj-starship detect" - Walks up directory tree to find .jj or .git, works from any subdirectoryshell = ["jj-starship"] - Executes jj-starship directly without shell wrapper overhead (cross-platform)format = "$output " - Passes through jj-starship's ANSI colors directlyTo hide built-in modules when in a JJ repo:
[git_branch]
disabled = true
[git_status]
disabled = true
on {symbol}{change_id} ({bookmarks}) [{status}]
{change_id} - Short change ID (hide with --no-jj-id){bookmarks} - Comma-separated bookmarks with distance, sorted by proximity (hide with --no-jj-name)
mainmain~3 (3 commits behind)…+N when bookmarks exceed display limit{status} - JJ state indicators; remote sync is based on the first/closest bookmark onlyExamples:
on yzxv1234 [∅] - No bookmarks; the working-copy commit has file changes but no descriptionon yzxv1234 (main) [∅] - On bookmark main with no descriptionon yzxv1234 (main~3) [∅] - 3 commits ahead of main with no descriptionon yzxv1234 (pr-3, pr-2~1, main~5) - Direct + ancestor bookmarkson yzxv1234 (main, feat~1, …+3) - 5 bookmarks, limit 2on yzxv1234 (feat-x, fix-y~1) - with --strip-bookmark-prefix "dmmulroy/"on {symbol}{branch} ({commit}) [{status}]
| Symbol | Meaning |
|---|---|
! | Conflict |
∅ | Working-copy commit has file changes but no description |
⇔ | Divergent |
⇡ | Current or closest bookmark unsynced with remote |
| Symbol | Meaning |
|---|---|
= | Conflicted |
+ | Staged |
! | Modified |
? | Untracked |
✘ | Deleted |
⇡n | Ahead by n |
⇣n | Behind by n |
| Option | Description |
|---|---|
--cwd <PATH> | Override working directory |
--truncate-name <N> | Max branch/bookmark name length (0 = unlimited) |
--id-length <N> | Hash display length (default: 8) |
--ancestor-bookmark-depth <N> | Max depth to search for ancestor bookmarks (default: 10, 0 = disabled) |
--bookmarks-display-limit <N> | Max bookmarks to display (default: 3, 0 = unlimited) |
--strip-bookmark-prefix <P> | Prefixes to strip from bookmark names (comma-separated) |
--jj-symbol <S> | JJ repo symbol (default: ) |
--git-symbol <S> | Git repo symbol (default: ) |
--no-color | Disable output styling |
--no-symbol | Disable symbol prefix |
--no-jj-prefix | Hide "on {symbol}" for JJ |
--no-jj-name | Hide bookmark name |
--no-jj-id | Hide change ID |
--no-jj-status | Hide JJ status |
--no-git-prefix | Hide "on {symbol}" for Git |
--no-git-name | Hide branch name |
--no-git-id | Hide commit hash |
--no-git-status | Hide Git status |
All options can be set via environment variables (CLI args take precedence):
JJ_STARSHIP_TRUNCATE_NAMEJJ_STARSHIP_ID_LENGTHJJ_STARSHIP_ANCESTOR_BOOKMARK_DEPTHJJ_STARSHIP_BOOKMARKS_DISPLAY_LIMITJJ_STARSHIP_STRIP_BOOKMARK_PREFIXJJ_STARSHIP_JJ_SYMBOLJJ_STARSHIP_GIT_SYMBOLJJ_STARSHIP_NO_JJ_PREFIXJJ_STARSHIP_NO_JJ_COLORJJ_STARSHIP_NO_JJ_NAMEJJ_STARSHIP_NO_JJ_IDJJ_STARSHIP_NO_JJ_STATUSJJ_STARSHIP_NO_GIT_PREFIXJJ_STARSHIP_NO_GIT_COLORJJ_STARSHIP_NO_GIT_NAMEJJ_STARSHIP_NO_GIT_IDJJ_STARSHIP_NO_GIT_STATUSExample configuration using a powerline-style Starship preset such as Gruvbox Rainbow:
format = """
[](color_orange)\
$os\
$username\
[](bg:color_yellow fg:color_orange)\
$directory\
[](fg:color_yellow bg:color_aqua)\
${custom.jj}\ # <- replace $git_branch $git_status here
[](fg:color_aqua bg:color_blue)\
...
"""
[git_branch]
disabled = true
[git_status]
disabled = true
[custom.jj]
symbol = ""
style = "bg:color_aqua"
format = '[[ $symbol $output ](fg:color_fg0 bg:color_aqua)]($style)'
when = "jj-starship detect"
shell = ["jj-starship", "--no-color", "--no-symbol", "--no-jj-prefix", "--no-git-prefix"]
MIT
Rust
92.4%
Nix
5.1%
Shell
2.5%
Fast unified Starship prompt module for Git and Jujutsu repositories
Rust
240
56 commits
updated Sep 4, 2026
Unified Starship prompt module for Git and Jujutsu repositories that is optimized for latency.
brew install dmmulroy/tap/jj-starship
cargo install jj-starship
git clone https://github.com/dmmulroy/jj-starship
cd jj-starship
cargo install --path .
# Try it
nix run github:dmmulroy/jj-starship
# Install to profile
nix profile install github:dmmulroy/jj-starship
# Minimal build (no git support, smaller closure)
nix run github:dmmulroy/jj-starship#jj-starship-no-git
Or add to your flake inputs:
{
inputs.jj-starship.url = "github:dmmulroy/jj-starship";
outputs = { self, nixpkgs, jj-starship, ... }: {
# Use the overlay
nixosConfigurations.myhost = nixpkgs.lib.nixosSystem {
modules = [{
nixpkgs.overlays = [ jj-starship.overlays.default ];
environment.systemPackages = [ pkgs.jj-starship ];
}];
};
};
}
The git feature is enabled by default. Disable to compile out the git backend:
# JJ only (excludes git2 dependency)
cargo install --no-default-features jj-starship
Add to ~/.config/starship.toml:
[custom.jj]
when = "jj-starship detect"
shell = ["jj-starship"]
format = "$output "
Why these settings:
when = "jj-starship detect" - Walks up directory tree to find .jj or .git, works from any subdirectoryshell = ["jj-starship"] - Executes jj-starship directly without shell wrapper overhead (cross-platform)format = "$output " - Passes through jj-starship's ANSI colors directlyTo hide built-in modules when in a JJ repo:
[git_branch]
disabled = true
[git_status]
disabled = true
on {symbol}{change_id} ({bookmarks}) [{status}]
{change_id} - Short change ID (hide with --no-jj-id){bookmarks} - Comma-separated bookmarks with distance, sorted by proximity (hide with --no-jj-name)
mainmain~3 (3 commits behind)…+N when bookmarks exceed display limit{status} - JJ state indicators; remote sync is based on the first/closest bookmark onlyExamples:
on yzxv1234 [∅] - No bookmarks; the working-copy commit has file changes but no descriptionon yzxv1234 (main) [∅] - On bookmark main with no descriptionon yzxv1234 (main~3) [∅] - 3 commits ahead of main with no descriptionon yzxv1234 (pr-3, pr-2~1, main~5) - Direct + ancestor bookmarkson yzxv1234 (main, feat~1, …+3) - 5 bookmarks, limit 2on yzxv1234 (feat-x, fix-y~1) - with --strip-bookmark-prefix "dmmulroy/"on {symbol}{branch} ({commit}) [{status}]
| Symbol | Meaning |
|---|---|
! | Conflict |
∅ | Working-copy commit has file changes but no description |
⇔ | Divergent |
⇡ | Current or closest bookmark unsynced with remote |
| Symbol | Meaning |
|---|---|
= | Conflicted |
+ | Staged |
! | Modified |
? | Untracked |
✘ | Deleted |
⇡n | Ahead by n |
⇣n | Behind by n |
| Option | Description |
|---|---|
--cwd <PATH> | Override working directory |
--truncate-name <N> | Max branch/bookmark name length (0 = unlimited) |
--id-length <N> | Hash display length (default: 8) |
--ancestor-bookmark-depth <N> | Max depth to search for ancestor bookmarks (default: 10, 0 = disabled) |
--bookmarks-display-limit <N> | Max bookmarks to display (default: 3, 0 = unlimited) |
--strip-bookmark-prefix <P> | Prefixes to strip from bookmark names (comma-separated) |
--jj-symbol <S> | JJ repo symbol (default: ) |
--git-symbol <S> | Git repo symbol (default: ) |
--no-color | Disable output styling |
--no-symbol | Disable symbol prefix |
--no-jj-prefix | Hide "on {symbol}" for JJ |
--no-jj-name | Hide bookmark name |
--no-jj-id | Hide change ID |
--no-jj-status | Hide JJ status |
--no-git-prefix | Hide "on {symbol}" for Git |
--no-git-name | Hide branch name |
--no-git-id | Hide commit hash |
--no-git-status | Hide Git status |
All options can be set via environment variables (CLI args take precedence):
JJ_STARSHIP_TRUNCATE_NAMEJJ_STARSHIP_ID_LENGTHJJ_STARSHIP_ANCESTOR_BOOKMARK_DEPTHJJ_STARSHIP_BOOKMARKS_DISPLAY_LIMITJJ_STARSHIP_STRIP_BOOKMARK_PREFIXJJ_STARSHIP_JJ_SYMBOLJJ_STARSHIP_GIT_SYMBOLJJ_STARSHIP_NO_JJ_PREFIXJJ_STARSHIP_NO_JJ_COLORJJ_STARSHIP_NO_JJ_NAMEJJ_STARSHIP_NO_JJ_IDJJ_STARSHIP_NO_JJ_STATUSJJ_STARSHIP_NO_GIT_PREFIXJJ_STARSHIP_NO_GIT_COLORJJ_STARSHIP_NO_GIT_NAMEJJ_STARSHIP_NO_GIT_IDJJ_STARSHIP_NO_GIT_STATUSExample configuration using a powerline-style Starship preset such as Gruvbox Rainbow:
format = """
[](color_orange)\
$os\
$username\
[](bg:color_yellow fg:color_orange)\
$directory\
[](fg:color_yellow bg:color_aqua)\
${custom.jj}\ # <- replace $git_branch $git_status here
[](fg:color_aqua bg:color_blue)\
...
"""
[git_branch]
disabled = true
[git_status]
disabled = true
[custom.jj]
symbol = ""
style = "bg:color_aqua"
format = '[[ $symbol $output ](fg:color_fg0 bg:color_aqua)]($style)'
when = "jj-starship detect"
shell = ["jj-starship", "--no-color", "--no-symbol", "--no-jj-prefix", "--no-git-prefix"]
MIT
Rust
92.4%
Nix
5.1%
Shell
2.5%