starship/starship
Lore
The story of how Starship got from a JavaScript proof of concept in 2019 to a 50K-line Rust binary that ships in every major package repository.
Eras
The JavaScript-to-Rust pivot (Apr–Aug 2019)
Starship's first commit landed on Apr 1, 2019 (Initial commit, 2019-04-01). The original implementation was a Node.js script — Starship was inspired by denysdovhan/spaceship-prompt (a ZSH prompt) and denysdovhan/robbyrussell-node (a cross-shell prompt in JavaScript), and writing a "fast cross-shell prompt" in Rust was the natural next step.
Within months the project was rewritten in Rust to get the "blazing-fast" property baked into the README. The first tagged release v0.1.0 arrived in June 2019. Twelve releases shipped that year, ending with v0.10.x in August 2019.
Filling out the language support (Sep 2019 – Sep 2021)
The 0.x series spent two years iterating on the module catalog: more languages (Java, Crystal, Erlang, Dart, Elm, OCaml, …), more cloud providers (AWS, GCP, Azure), more VCS (Mercurial, Fossil), more shells (Nushell, Xonsh, Tcsh, Cmd via Clink). The pattern that solidified during this era — [name].rs for the module + configs/[name].rs for the config + an entry in ALL_MODULES/PROMPT_ORDER — has not changed since.
Notable releases in this period:
v0.20(Dec 2019): early stabilization of the format-string DSL.v0.30(Mar 2020): big config refactor.v0.40series: configurable presets shipped as TOML.
The 1.0 release (Nov 2021)
v1.0.0 was tagged on Nov 9, 2021. By this point Starship had accumulated 50+ modules and was already widely packaged. The 1.0 release did not break the format string DSL or the basic [module] config layout, but it did formally promise compatibility going forward.
Steady cadence (Dec 2021 – present)
After 1.0 the project has kept a roughly quarterly release rhythm:
| Release | Date | Notable additions |
|---|---|---|
v1.1.0 |
Dec 2021 | |
v1.5.0 |
Jan 2022 | Reorganized git_status |
v1.7.0 |
May 2022 | |
v1.10.0 |
Sep 2022 | |
v1.15.0 |
Jun 2023 | |
v1.18.0 |
Mar 2024 | |
v1.20.0 |
Jul 2024 | |
v1.21.0 |
Oct 2024 | |
v1.22.0 |
Jan 2025 | |
v1.23.0 |
Apr 2025 | |
v1.24.0 |
Oct 2025 | Claude Code statusline subcommand & built-in profile |
v1.25.0 |
Apr 2026 | Most recent stable; profiles in [profiles] |
v1.25.1 |
Apr 2026 | Bug-fix |
The codebase has grown roughly linearly with the addition of new modules. The architectural skeleton — Context, StringFormatter, the dispatch in modules::handle, the two-phase init — was substantially in place by 0.10 and has been refined rather than rebuilt.
The branch rename (Apr 2026)
The default branch was renamed from master to main in April 2026, with chore: rename master branch to main (#7446). The README still includes a one-time git branch -m master main migration snippet.
Longest-standing features
Some files date back to the first Rust commits and have grown into the modules they are today:
| Module | Earliest history | Notes |
|---|---|---|
directory |
Apr 2019 | Now ~1,900 lines, with platform-specific helpers in modules/utils/directory_*.rs. The truncation/contract logic dates to the original prompt. |
git_branch / git_status |
Apr 2019 | Both backed by the in-house git logic, then migrated to gix (gitoxide) for performance. |
character |
Apr 2019 | The success/error arrow has had vi-mode support for shells added across the years (zsh, fish, PowerShell, Cmd) but the core is unchanged. |
rust |
May 2019 | The first language module; its detection-then-version-lookup pattern shaped every later toolchain module. |
| Format string DSL | 2019 | The pest grammar in src/formatter/spec.pest has been a small, stable file since shortly after the Rust rewrite. |
Deprecated features
Starship is conservative with deprecations. Two that are still on the runway:
- Old
kubernetesalias keys.src/modules/kubernetes.rs:231has a// TODO: remove deprecated aliases after starship 2.0. The new key iscontext_aliases(with map-style entries); the old one used a flatter shape. detect_extentions(sic) alias on[fennel].src/configs/fennel.rs:16has#[serde(alias = "detect_extentions")] // TODO: remove it after breaking change releases. A typo'd field name kept around for compatibility.
Both are awaiting starship 2.0, whenever that lands.
Major rewrites
The biggest structural changes since the original Rust port:
- Migration to
gixfor git access. Earlier versions usedgit2(libgit2 bindings). Migrating to pure-Rustgitoxideremoved a C dependency, improved cross-compilation, and enabled the strict feature-flag tuning that issue #4251 documents. Several// TODOmarkers in the git modules document gix features that aren't quite complete yet. PROMPT_ORDERversus alphabetical. The default order was reshuffled multiple times —username/hostnamefirst, toolchains alphabetized, line break + character pinned to the bottom — but the structure has been the same since 1.0.- Profiles (
[profiles]). TheTarget::Profilerender target arrived alongside the Claude Code statusline (around v1.24). Before that, alternate prompts had to be assembled by the shell itself.
Growth trajectory
Module count has grown roughly with the open-source language ecosystem: every time a new mainstream language ships, a starship contributor adds a module. The codebase grew from ~5K lines at v0.1 to ~50K lines at v1.25 — the bulk of the growth is in src/modules/ and src/configs/, with the engine (context.rs, print.rs, formatter/) staying relatively stable in size.
The contributor base shows a similar pattern: Matan Kushner (creator) anchors the early years, with David Knaack stepping up as a long-running maintainer. Renovate and Dependabot together account for nearly half of all commits, reflecting how heavily the project depends on pinned crates kept fresh by automation.
See also
- By the numbers for the snapshot statistics.
- Fun facts for the more whimsical bits.
Built by Factory AutoWiki from public repository content. It is a generated preview for codebase exploration, not source-maintained documentation.