Open-Source Wikis

/

Starship

/

Lore

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.40 series: 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 kubernetes alias keys. src/modules/kubernetes.rs:231 has a // TODO: remove deprecated aliases after starship 2.0. The new key is context_aliases (with map-style entries); the old one used a flatter shape.
  • detect_extentions (sic) alias on [fennel]. src/configs/fennel.rs:16 has #[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 gix for git access. Earlier versions used git2 (libgit2 bindings). Migrating to pure-Rust gitoxide removed a C dependency, improved cross-compilation, and enabled the strict feature-flag tuning that issue #4251 documents. Several // TODO markers in the git modules document gix features that aren't quite complete yet.
  • PROMPT_ORDER versus alphabetical. The default order was reshuffled multiple times — username/hostname first, toolchains alphabetized, line break + character pinned to the bottom — but the structure has been the same since 1.0.
  • Profiles ([profiles]). The Target::Profile render 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

Built by Factory AutoWiki from public repository content. It is a generated preview for codebase exploration, not source-maintained documentation.

Lore – Starship wiki | Factory