12 releases (5 breaking)
Uses new Rust 2024
| 0.7.0 | Jan 25, 2026 |
|---|---|
| 0.6.0 | Jan 10, 2026 |
| 0.5.1 | Jan 4, 2026 |
| 0.5.0 | Dec 29, 2025 |
| 0.1.0 | Dec 21, 2025 |
#409 in Development tools
74KB
1.5K
SLoC
jj-starship
Unified Starship prompt module for Git and Jujutsu repositories that is optimized for latency.
Installation
Homebrew (macOS)
brew install dmmulroy/tap/jj-starship
Cargo
cargo install jj-starship
Build from source
git clone https://github.com/dmmulroy/jj-starship
cd jj-starship
cargo install --path .
Nix
# 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 ];
}];
};
};
}
Feature Flags
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
Starship Configuration
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.jjor.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 directly
To hide built-in modules when in a JJ repo:
[git_branch]
disabled = true
[git_status]
disabled = true
Output Format
JJ Format
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)- Distance 0 (bookmark on WC):
main - Ancestor bookmark:
main~3(3 commits behind) - Overflow indicator:
…+Nwhen bookmarks exceed display limit
- Distance 0 (bookmark on WC):
{status}- Sync status based on first/closest bookmark only
Examples:
on yzxv1234 [?]- No bookmarkson yzxv1234 (main) [?]- On bookmarkmainon yzxv1234 (main~3) [?]- 3 commits ahead ofmainon 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/"
Git Format
on {symbol}{branch} ({commit}) [{status}]
JJ Status Symbols
| Symbol | Meaning |
|---|---|
! |
Conflict |
? |
Empty description |
⇔ |
Divergent |
⇡ |
Current or closest bookmark unsynced with remote |
Git Status Symbols
| Symbol | Meaning |
|---|---|
= |
Conflicted |
+ |
Staged |
! |
Modified |
? |
Untracked |
✘ |
Deleted |
⇡n |
Ahead by n |
⇣n |
Behind by n |
CLI Options
| 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 |
Environment Variables
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_STATUS
Powerline Prompt
Example configuration in a powerline prompt, for instance 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"]
License
MIT
Dependencies
~23–45MB
~637K SLoC