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.tomland needing the authoritative option list + defaults. - Answering "what options does the
git_status/directory/awsmodule 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).
-
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. -
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 areoptions,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
formatstrings — not config options) and an Example TOML block. Only the Options table holds settable config keys.
- Each module is an
-
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 likebattery.display),td[2]= description. HTML-decode entities ('→',"→") and preserve the raw default strings verbatim — many defaults are TOML/format strings containing escaped brackets, Nerd-Font glyphs, and emoji (e.g. AWSsymboldefault is'☁️ ', batteryfull_symbolis' '). -
Also capture the global "Prompt" options (the
id="prompt"section) — these are the top-level keys that live outside any[module]table instarship.toml. -
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. -
(Optional) Scope to one module. If the caller names a module, locate just that
<h2 id="{name}">(translate underscores→hyphens:git_status→git-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: cloudflareheader and the pre-run probe hintinglikelyNeedsProxies: true, a barebrowse cloud fetch(no--proxies, no--verified) returns200with 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 idgit-status→ config table[git_status];docker-context→[docker_context];cobol-gnucobol→[cobol].google-cloud-gcloudis 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 insideformatstrings (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{}, booleansfalse/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'/"/&but otherwise preserve. - Some defaults are a "link", not a value. When a default points to a sub-table (e.g. battery
display, or moduleformatdefaults documented elsewhere), the Default cell renders as an anchor readinglinkpointing 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-commandssection ([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" }