starship.rs logo
starship.rs

expose-config-options

Installation

Adds this website's skill for your agents

 

Summary

Enumerate every configuration option Starship's cross-shell prompt exposes, grouped by module, with each option's default value and description, from the single server-rendered config docs page. Read-only.

FIG. 01
FIG. 02
FIG. 03
SKILL.md
149 lines

Expose Starship Configuration Options

Purpose

Enumerate every configuration option that the Starship cross-shell prompt exposes, grouped by module, with each option's name, default value, and description. The entire reference lives on a single server-rendered documentation page (https://starship.rs/config/); this skill returns a structured dump of all ~827 options across ~104 sections (103 modules + the top-level global "Prompt" options), or a scoped subset for one named module. Read-only — it only reads public documentation, never writes a starship.toml.

When to Use

  • Building a config editor, linter, validator, or autocomplete for starship.toml and needing the authoritative option list + defaults.
  • Answering "what options does the git_status / directory / aws module take, and what are their defaults?"
  • Generating documentation, JSON Schema, or type definitions for Starship configuration.
  • Diffing the option surface across Starship releases.
  • Any time you'd otherwise hand-scrape the config docs — a single HTTP GET returns the whole rendered page.

Workflow

Recommended method: fetch. https://starship.rs/config/ is a static, pre-rendered VitePress page. A plain HTTP GET returns the complete HTML (~510 KB) with every module's options already in the markup — no JavaScript execution, no session, no proxy, and no stealth required (Cloudflare's CDN serves it 200 even bare). Parse the HTML tables locally; do not drive a headless browser module-by-module (that path works but costs 100+ round-trips — see Gotchas).

  1. Fetch the page in one request:

    browse cloud fetch "https://starship.rs/config/"
    # returns a JSON envelope; the full HTML is in the `.content` field.
    # --proxies is NOT needed (bare GET returns 200), but is harmless if added.
    
  2. Understand the DOM shape. The doc body (div.vp-doc) is a flat sequence of headings + tables:

    • Each module is an <h2 id="{module}"> (e.g. id="aws", id="git-status", id="directory"). The id is the kebab-case module name; the actual TOML key uses underscores (git-status[git_status]).
    • The top-level global options are under <h2 id="prompt"> (options: format, right_format, scan_timeout, command_timeout, add_newline, palette, palettes, follow_symlinks).
    • Immediately under each module <h2> is an <h3>Options</h3> (ids are options, options-1, options-2, …) followed by a <table> with a fixed 3-column layout: Option | Default | Description.
    • Modules may also carry a Variables table (template vars available in format strings — not config options) and an Example TOML block. Only the Options table holds settable config keys.
  3. Extract every Options table. For each module <h2>, find the first following <table> and read its <tbody> rows: td[0] = option name (inside <code>), td[1] = default value (inside <code>, or an anchor "link" when the default is a sub-table like battery.display), td[2] = description. HTML-decode entities (&#39;', &quot;") and preserve the raw default strings verbatim — many defaults are TOML/format strings containing escaped brackets, Nerd-Font glyphs, and emoji (e.g. AWS symbol default is '☁️ ', battery full_symbol is '󰁹 ').

  4. Also capture the global "Prompt" options (the id="prompt" section) — these are the top-level keys that live outside any [module] table in starship.toml.

  5. Assemble the result as { module_name: [{option, default, description}, ...] }. Expect ~104 sections and ~827 total options (819 module-level + 8 global). Use these counts as a completeness check before declaring done.

  6. (Optional) Scope to one module. If the caller names a module, locate just that <h2 id="{name}"> (translate underscores→hyphens: git_statusgit-status) and return only its options table.

Browser fallback (only if the raw GET is ever blocked)

A full browser works but is strictly slower and should only be used if browse cloud fetch starts returning a challenge page:

sid=$(browse cloud sessions create --keep-alive | node -e "let s='';process.stdin.on('data',c=>s+=c).on('end',()=>process.stdout.write(JSON.parse(s).id))")
browse open "https://starship.rs/config/" --remote --session "$sid"
browse wait load --remote --session "$sid"
browse get html .vp-doc --remote --session "$sid"   # ONE call returns all modules + tables — then parse locally
browse cloud sessions update "$sid" --status REQUEST_RELEASE

Do the extraction in a single get html .vp-doc (or get text .vp-doc) call and parse client-side. Iterating browse get text "#{module} ~ table" once per module technically works (the ~ sibling selector correctly targets each module's Options table) but needs 100+ round-trips and will exhaust an agent's turn budget before finishing all modules.

Site-Specific Gotchas

  • No anti-bot for GETs. Despite the Server: cloudflare header and the pre-run probe hinting likelyNeedsProxies: true, a bare browse cloud fetch (no --proxies, no --verified) returns 200 with the full rendered HTML, and a bare (non-stealth) remote browser session loads the page cleanly. Neither proxies nor verified/stealth were required in any successful run. Don't burn budget on stealth here.
  • Everything is on ONE page. All ~104 sections are in https://starship.rs/config/. There are no per-module sub-pages to crawl. Fetch once, parse locally.
  • <h2 id> uses hyphens; TOML keys use underscores. Section id git-status → config table [git_status]; docker-context[docker_context]; cobol-gnucobol[cobol]. google-cloud-gcloud is the [gcloud] module. Map hyphen→underscore and strip vendor suffixes when emitting the real TOML key.
  • Three heading types repeat per module. Only the Options <h3> table holds settable config keys. The Variables table lists read-only template variables usable inside format strings (NOT config options) — do not conflate them. The Example block is illustrative TOML.
  • Default values are raw strings, not typed literals. Keep them verbatim. Defaults include: empty strings '', empty tables {}, booleans false/true, integers (scan_timeout = 30), format strings with escaped brackets ('on [$symbol($profile )(\($region\) )(\[$duration\] )]($style)'), Nerd-Font private-use glyphs, and emoji. HTML-entity-decode &#39;/&quot;/&amp; but otherwise preserve.
  • Some defaults are a "link", not a value. When a default points to a sub-table (e.g. battery display, or module format defaults documented elsewhere), the Default cell renders as an anchor reading link pointing to an in-page section (e.g. #battery-display, #default-prompt-format). Treat these as "see referenced section" rather than a scalar default.
  • The custom-commands section ([custom]) is special. Its 16 "options" describe how to define arbitrary user commands (command, when, shell, format, etc.), not a fixed built-in module. Include it, but note it configures user-defined command modules.
  • The full enumeration is large. ~827 options is a lot of tokens. If an agent tries to emit every option in a single LLM response it can hit the output-token cap (observed: a browser run truncated at max_tokens while serializing all modules at once). Prefer parsing/serializing deterministically (code, not LLM freeform), scope to the requested module, or stream the JSON in chunks.
  • Counts as of 2026-09-22: 104 <h2> sections = 103 modules + 1 global "Prompt" section; 819 module options + 8 global options = 827 total. These grow between releases — recompute rather than hardcoding.

Expected Output

{
  "success": true,
  "source_url": "https://starship.rs/config/",
  "section_count": 104,
  "module_count": 103,
  "global_option_count": 8,
  "total_options": 827,
  "global_prompt_options": [
    { "option": "format",          "default": "link", "description": "Configure the format of the prompt." },
    { "option": "right_format",    "default": "''",   "description": "See Enable Right Prompt." },
    { "option": "scan_timeout",    "default": "30",   "description": "Timeout for starship to scan files (in milliseconds)." },
    { "option": "command_timeout", "default": "500",  "description": "Timeout for commands executed by starship (in milliseconds)." },
    { "option": "add_newline",     "default": "true", "description": "Inserts blank line between shell prompts." },
    { "option": "palette",         "default": "''",   "description": "Sets which color palette from palettes to use." },
    { "option": "palettes",        "default": "{}",   "description": "Collection of color palettes that assign colors to user-defined names." },
    { "option": "follow_symlinks", "default": "true", "description": "Follows symlinks to check if they're directories; used in modules such as git." }
  ],
  "modules": {
    "aws": [
      { "option": "format",         "default": "'on [$symbol($profile )(\\($region\\) )(\\[$duration\\] )]($style)'", "description": "The format for the module." },
      { "option": "symbol",         "default": "'☁️ '",       "description": "The symbol used before displaying the current AWS profile." },
      { "option": "region_aliases", "default": "{}",          "description": "Table of region aliases to display in addition to the AWS name." },
      { "option": "profile_aliases","default": "{}",          "description": "Table of profile aliases to display in addition to the AWS name." },
      { "option": "style",          "default": "'bold yellow'","description": "The style for the module." },
      { "option": "expiration_symbol","default": "'X'",       "description": "The symbol displayed when the temporary credentials have expired." },
      { "option": "disabled",       "default": "false",       "description": "Disables the AWS module." },
      { "option": "force_display",  "default": "false",       "description": "If true displays info even if credentials cannot be detected." }
    ],
    "battery": [
      { "option": "full_symbol",        "default": "'󰁹 '", "description": "The symbol shown when the battery is full." },
      { "option": "charging_symbol",    "default": "'󰂄 '", "description": "The symbol shown when the battery is charging." },
      { "option": "discharging_symbol", "default": "'󰂃 '", "description": "The symbol shown when the battery is discharging." },
      { "option": "unknown_symbol",     "default": "'󰂑 '", "description": "The symbol shown when the battery state is unknown." },
      { "option": "empty_symbol",       "default": "'󰂎 '", "description": "The symbol shown when the battery state is empty." },
      { "option": "format",             "default": "'[$symbol$percentage]($style) '", "description": "The format for the module." },
      { "option": "display",            "default": "link",  "description": "Display threshold and style for the module (see battery-display sub-table)." },
      { "option": "disabled",           "default": "false", "description": "Disables the battery module." }
    ]
    // ... every other module (directory, git_branch, git_status, python, nodejs,
    //     kubernetes, custom, ...) follows the identical [{option,default,description}] shape.
  },
  "error_reasoning": null
}

Scoped-to-one-module request returns the same shape with a single key under modules. On failure:

{ "success": false, "source_url": "https://starship.rs/config/", "error_reasoning": "module 'foo' not found; nearest sections: fossil-branch, fortran" }