| name | statusline |
| description | Configure the now-playing statusline in one place โ toggle items (volume, progress bar, time, output device), arrange which item sits on which line as a numeric pattern like 123/456, and style every part; bold/italic/color for the track title, artist, app, time, volume bar & percent, and output device name; playing/paused colors, bar characters, and bar length (cells) for the progress bar; the volume icon and bar shape; the output device icon; the value off hides any part. Use when the user wants to lay out, reorder, restyle, recolor, resize, hide, or redesign anything in the statusline โ e.g. "make the title cyan", "title color |
| argument-hint | ["pattern like 123/456 | preset | style wish like \"title bold cyan\" | reset"] |
| allowed-tools | Bash, AskUserQuestion |
Requested arrangement or style (may be empty): $ARGUMENTS
Current items, in render order (/ starts a new line):
!"${CLAUDE_PLUGIN_ROOT}/scripts/media.sh" config statusline.fields
Current settings โ the style table below marks customized values *custom
(see also display.statusline, statusline.multiline, statusline.color):
!"${CLAUDE_PLUGIN_ROOT}/scripts/media.sh" config
How arrangement works
statusline.fields is an ordered list โ the segment renders the items in
exactly the order they are saved. A / in the list starts a new line
(explicit layout: each line shows exactly the items placed on it; app
directly after track folds into it as (App); a line with nothing to show
disappears). Without /, items group automatically (app onto track,
adjacent progressbar+time, output/volume onto a neighbor) and
statusline.multiline on puts each group on its own line.
Numeric patterns โ wherever an arrangement can be given ($ARGUMENTS, a
typed reply, an "Other" answer): digits name the items, / starts a new
line, digit order = display order, and digits left out are omitted:
| digit | item | looks like |
|---|
| 1 | track | โถ๏ธ Karma Police โ Radiohead |
| 2 | app | (Spotify) |
| 3 | volume | ๐ โ 45% (๐ when muted) |
| 4 | progressbar | โโโโโโโโโโ |
| 5 | time | 2:13/4:24 |
| 6 | output | ๐ง AirPods Pro (icon by device: ๐ speakers ยท ๐ง Bluetooth/headphones ยท ๐บ HDMI/DisplayPort ยท ๐ถ AirPlay) |
123/456 โ track,app,volume,/,progressbar,time,output (two lines);
45/126 โ progressbar,time,/,track,app,output; 15 โ track,time.
Presets: Standard = 123456 one line, Stacked = 123/456 two lines
(a "compact" wish maps to 15 by intent).
The style model
Every visible part has a style.* config key:
| key | part | default |
|---|
style.track.title | track title | bold |
style.track.artist | artist name | italic |
style.app | app name (Spotify) | dim |
style.volume.icon | volume icon glyph | auto (๐/๐/๐ by level) |
style.volume.style | volume bar shape | block (โ height bar) |
style.volume.bar | volume bar on/off | on (draws in the accent) |
style.volume.percent | volume percent 45% | dim |
style.progressbar.playing | bar fill + โถ๏ธ accent while playing | green |
style.progressbar.paused | bar fill + โธ accent while paused | yellow |
style.progressbar.style | progress bar characters | line |
style.progressbar.length | progress bar width in cells (1โ60) | 20 |
style.progressbar.sprite | sprite style: frames, cycling one per second | โ โ |
style.progressbar.trail | sprite style: the walked track | โ |
style.progressbar.track | sprite style: the track still ahead | โ |
style.time.elapsed | elapsed time 2:13 | bold |
style.time.total | total-time tail /4:24 | dim |
style.output.icon | output device icon | auto (by device kind) |
style.output | output device name | dim |
Style spec (the text parts): any of bold, dim, italic, underline,
plus at most one color โ black red green yellow blue magenta cyan white,
bright-<color>, or an exact hex code like #ff8800 (short #f80 works
too; stored as #rrggbb, rendered as 24-bit truecolor) โ or none (no
styling, alone), or off (hide that part, alone). Hiding follows the part: title off drops the โ separator, elapsed
off drops the / before the total, and an item whose parts are all hidden
disappears (with its line, when it sat alone on one).
Bar characters (style.progressbar.style): line โโโโโโโโโโ
(default) ยท blocks โโโโโโโโโโ ยท smooth โโโโโโโโโโ (โ
-step partial
boundary) ยท rise โโโโโโ
โโโโ (โ
-step boundary rising bottom-up) ยท
fade โโโโโโโโโโ (โ
-step shade boundary) ยท corner โโโโโโโโโโ
(ยผ-step quadrant boundary) ยท glide โโโโโโพโโโโ (half-cell steps) ยท
stipple โฃฟโฃฟโฃฟโฃฟโฃฟโฃถโฃโฃโฃโฃ (โ
-step braille boundary) ยท tiles
โ โ โ โ โ โงโกโกโกโก (half-filled square) ยท dash โโโโโโ
โโโโ (a heavy line
over a dashed track; at the boundary the dashes thicken, multiply, and
fuse into the line โ โโ
โ, ยผ steps, ink only ever grows) ยท
knob โโโโโโโโโโ (slider head) ยท playhead โโโโโโผโพโโโ (a one-cell
thick head gliding along a thin track in half-cell steps โ aligned it
draws โ, straddling it splits into โผโพ; the elapsed side keeps the
accent) ยท braille โฃฟโฃฟโฃฟโฃฟโฃฟโฃฟโฃโฃโฃโฃ ยท chevron โธโธโธโธโธโธโนโนโนโน ยท
tape โฐโฐโฐโฐโฐโฐโฑโฑโฑโฑ ยท cassette โฎโฎโฎโฎโฎโฎโฏโฏโฏโฏ ยท retro ======---- ยท
dots โโโโโโโโโโ โ or any two characters meaning "filled + empty"
("#-" โ ######----). Audio
visualizers span the whole bar (colors on: the accent/dim split marks
progress; colors off: the unplayed tail dims in height, notes to ยท
rests): wave โ
โโโโโ
โโโโ (a length-adaptive sine swell) ยท pulse
โโโโโโโโโโ (an ECG trace) ยท eq โ
โโโโโ
โโ
โ
โ (multi-frequency) ยท
notes โชยทยทโซโชโซยทยทโชโซ (a โชโซ note density) ยท spectrum โโโ
โ
โโโโโโ
ยท
mirror โโโโโโโโโโ ยท cava โขโฃฆโฃดโฃโฃ โฃฆโฃดโฃโฃดโฃค ยท ripple โข โฃฟโฃโขโฃพโฃทโกโฃฐโฃฟโก (braille);
swell โขโฃผโฃทโกโขโฃผโฃทโกโขโฃผ ยท bars โฃฆโฃคโฃดโฃฆโกโข โฃดโฃฆโฃดโฃด ยท ekg โฃโฃโฃโฃคโฃโฃโฃโฃโฃโฃค โ
swell/bars are braille twins of wave/eq, ekg draws pulse's ECG in braille. The waveforms and visualizers drift
forward while playing and freeze on pause. Sprites walk the bar instead of
filling it โ the creature stands where the track has got to, so its position
is the progress, and its legs cycle once a second while playing (they hold
still when paused): cat โโโแแแขโโโโ ยท snake โโโแแแโโโโ ยท
duck โโโแฌแข~~~~~ ยท bird โโโโvโยทยทยทยท โ each on its own kind of track.
sprite is the bring-your-own one: style.progressbar.sprite takes the
frames it cycles ("แแแข แแแข", or a single glyph such as "๐" to walk
without animating), style.progressbar.trail and style.progressbar.track
the walked and untravelled halves of the track. Bar length (style.progressbar.length): any whole
number of cells from 1 to 60 (default 20); the /media:now bar follows
it too. Volume bar shape (style.volume.style): block (one โ
whose height tracks the level, default) ยท progress (an eight-cell mini
bar drawn with the progress-bar characters) ยท stairs (a โ..โ staircase
by eighths). The
volume bar always draws in the playing/paused accent colors;
style.volume.bar is just its on/off switch (on default, off hides the
bar). Icons: style.volume.icon and style.output.icon are auto
(tiered by level / by device kind), none (hidden), or any short glyph
(โช, ๐ต); muted always shows ๐.
Notes you must apply when relevant:
- SGR styles need
statusline.color on (NO_COLOR always wins). Character
choices โ bar charsets, shapes, icons, and off โ apply even with colors
off.
- Named colors follow the terminal palette; hex codes render as 24-bit
truecolor, which most terminals support (iTerm2, Ghostty, WezTerm, Kitty,
VS Code) but Apple Terminal does not โ if colors look wrong there, fall
back to named colors.
- The playing/paused colors style the progress-bar fill, the โถ๏ธ/โธ icon in
front of the title (the icon keeps its bold), and the volume bar โ one
accent across the segment. To recolor any of them, change
style.progressbar.playing / .paused.
- Hiding a part (
off) is not removing an item: dropping the whole
volume/time/output item is an arrangement change (Items tab or pattern).
- cmd+click actions (the โถ๏ธ/โธ icon toggles, title/artist jump to the
playing media โ browser tab / Music track when scriptable, app front
otherwise โ and bar cells seek) are not a style key โ a wish to turn
clicks/links on or off ("ํด๋ฆญ/๋งํฌ ๊บผ์ค") maps to
/media:config statusline.links on|off. Each part switches on its own,
so "์ฑ ์ด๋ฆ๋ง ํด๋ฆญ ์ ๋๊ฒ" / "๋ฐ๋ง ํด๋ฆญ๋๊ฒ" is a list, not on/off:
/media:config statusline.links <parts> over toggle (the icon),
track (title/artist), app (the app name), seek (the bar) โ name the
ones to KEEP clickable (toggle,track,seek drops just the app name).
config style.<key> reset restores one default; config style reset all
styles; config statusline reset additionally restores the arrangement,
lines, colors, and marquee (the full stock look).
Mode A โ $ARGUMENTS is NOT empty
Arrangement requests map onto an ordered field list and save per Step S.
A preset name or numeric pattern maps per the tables above; an explicit list
(time,track or track,app,/,time) passes through; a described arrangement
maps by intent โ "time first" โ time,progressbar,track,app; "track and app
on line 1, the rest on line 2" โ track,app,/,volume,progressbar,time,output.
Style wishes map onto style.* keys, applied one Bash call each:
"${CLAUDE_PLUGIN_ROOT}/scripts/media.sh" config style.track.title "bold cyan"
Mapping guide โ "์ ๋ชฉ/title" โ style.track.title, "๊ฐ์/์ํฐ์คํธ/artist" โ
style.track.artist, "์ฑ/app" โ style.app, "๋ณผ๋ฅจ ๋ฐ ์ผ/๊บผ/์จ๊ฒจ" โ
style.volume.bar on|off (the bar's color follows the playing/paused
accent โ a volume-bar color wish maps to style.progressbar.playing /
.paused and recolors the whole accent; say so), "๋ณผ๋ฅจ ๋ฐ
๋ชจ์(๊ธฐ๋ณธ/progress/๊ณ๋จ)" โ style.volume.style (๊ณ๋จ(์)/stairs โ
stairs, ๊ธฐ๋ณธ/default โ block), "ํผ์ผํธ/percent" โ
style.volume.percent, "๋ณผ๋ฅจ ์์ด์ฝ" โ style.volume.icon, "์ฌ์ ์/playing
color" โ style.progressbar.playing, "์ผ์์ ์ง/์ ์ง ์" โ
style.progressbar.paused, "๋ฐ ์คํ์ผ/๋ฌธ์" โ style.progressbar.style,
"๋ฐ ๊ธธ์ด/์งง๊ฒ/๊ธธ๊ฒ/bar length" โ style.progressbar.length (a number of
cells, 1โ60; also sizes the /media:now bar),
"ํ์ฌ ์๊ฐ/elapsed" โ style.time.elapsed, "์ด ์๊ฐ/total" โ
style.time.total, "์ถ๋ ฅ (์ฅ์น) ์ด๋ฆ/output" โ style.output, "์ถ๋ ฅ
์์ด์ฝ" โ style.output.icon. Translate color words to the English token
(ํ๋์ โ blue, ํ๋์ โ cyan or bright-cyan); a hex code
(#ff8800, #f80) passes through verbatim โ always double-quote the value
so the shell does not treat # as a comment; "๊ตต๊ฒ" โ bold,
"๊ธฐ์ธ์" โ italic, "ํ๋ฆฌ๊ฒ" โ dim, "๋ฐ์ค" โ underline, "์คํ์ผ
์์ด/ํ๋ฌธ" โ none; "์จ๊ฒจ/๋นผ์ค/๋ฏธ๋
ธ์ถ/hide" for a part โ off. A
progress-bar color wish like cyan/black means playing cyan + paused
black; a single color sets both. When a wish names a part without saying
which attributes to keep, preserve the current non-color attributes and
change only what was asked (current bold + "์ ๋ชฉ์ ๋นจ๊ฐ์์ผ๋ก" โ bold red). Resets: one part โ config style.<key> reset; "์คํ์ผ ์ ๋ถ ์ด๊ธฐํ" โ
config style reset; "statusline ์ ๋ถ/๋ฐฐ์น๊น์ง ์ด๊ธฐํ" โ config statusline reset. If a value is refused (exit 2), relay the stderr reason โ it
names the valid tokens โ and ask for a corrected value. Never invent keys.
Mode B โ no arguments โ the three-tab setup
Ask ONE AskUserQuestion call with exactly THREE questions โ they render
as tabs. Build the option labels from the current state shown above.
-
Q1 header "Items" โ multiSelect: true: "Which optional items should
the statusline show? (check = shown โ track & app are arranged via the
pattern)" โ exactly these options, each description stating what it looks
like and whether it is currently shown:
Volume โ ๐ โ 45%, ๐ when muted (digit 3)
Progress bar โ โโโโโโโโโโ (digit 4)
Time โ 2:13/4:24 (digit 5)
Output device โ ๐ง AirPods Pro, icon by device kind (digit 6)
-
Q2 header "Layout" โ single-select: "How should the items be arranged?
Digits are items โ 1 track ยท 2 app ยท 3 volume ยท 4 bar ยท 5 time ยท 6 output;
digit order = display order, / starts a new line. Typing a pattern via
Other works right away." Options (mark the one matching the current state
in its label):
Keep current โ <pattern> โ no layout change; render the current field
list as a pattern (e.g. 123/456; track app / time โ 1/5)
Standard โ 123456 โ everything on one line:
โถ๏ธ Karma Police โ Radiohead (Spotify) ๐ โ 45% โโโโโโโโโโ 2:13/4:24 ๐ง AirPods Pro
Stacked โ 123/456 โ two lines: track, app & volume / stats & output
Customโฆ โ type any pattern into the chat next
-
Q3 header "Style" โ single-select: "Restyle an item? (colors,
bold/italic, characters, icons โ off hides a part)" โ exactly these four
groups; mark groups holding *custom values in their descriptions:
Track & app โ title, artist, app name
Volume โ icon, bar shape & styling, percent
Progress bar & time โ playing/paused colors, bar characters & length, elapsed/total
Output device โ icon, device name
(An "Other" answer here that reads like "skip"/"none"/"๊ทธ๋๋ก" means no
style change; a style wish typed there applies per Mode A instead.)
Apply the answers, in this order
-
Layout (Q2): Keep current โ start from the current list. A preset or
an Other-typed pattern โ map per the digit legend. Customโฆ โ reply with
ONLY the digit legend table plus one line โ "Type your pattern: digit
order = display order, / starts a new line, leave a digit out to drop
that item. Current: <pattern>" โ then stop and wait; map the user's next
message (a pattern per the legend, anything else per Mode A), then
continue.
-
Items (Q1) as a diff: compare each of volume/progressbar/time/output
against the CURRENT field list. Only act on differences: newly checked โ
append to the end of the layout from step 1 (unless the pattern already
placed it); newly unchecked โ remove it. An item whose checkbox matches
its current visibility leaves the layout result untouched โ so a
deliberate pattern always wins.
-
Save (skip when nothing changed) โ Step S:
"${CLAUDE_PLUGIN_ROOT}/scripts/media.sh" config statusline.fields "track,app,volume,/,progressbar,time,output"
When the list has no / (one line), also write statusline.multiline off
so a leftover stacked flag cannot re-split it; with /, leave
statusline.multiline alone. If display.statusline is off, enable it
(config display.statusline on) โ the arrangement is pointless without
the segment. Enabling also wires the segment into ~/.claude/settings.json
automatically (wrapper + backup; the command's output says what it did โ
relay it). If it is refused (exit 3), relay the stderr reason,
point to /media:doctor, keep the arrangement saved, and never bypass
the refusal.
-
Style (Q3): run the chosen group's follow-up below. Skip when the
answer was a no-change "Other".
Style follow-ups โ one sequential AskUserQuestion per group
Ask ONE AskUserQuestion call whose questions are the group's parts (they
render as tabs). Every question's FIRST option is Keep current (<value>) โ
a no-op. A Default (<default>) option maps to config style.<key> reset;
Off โ hide maps to the value off; an "Other" answer is the style spec
itself (e.g. "bold, dim, italic, cyan" โ commas are fine). Show the current
value in each question text.
- Track & app โ 3 questions:
- "Title" (
style.track.title): Keep current / Default (bold) /
Off โ hide the title / Other โ any spec
- "Artist" (
style.track.artist): Keep current / Default (italic) /
Off โ hide the artist / Other
- "App" (
style.app): Keep current / Default (dim) /
Off โ hide the app name / Other
- Volume โ 4 questions:
- "Icon" (
style.volume.icon): Keep current / Default โ ๐๐๐ by level (auto) / Hide (none) / Other โ any glyph, e.g. ๐ต
- "Bar shape" (
style.volume.style): Keep current / Block โ (default) /
Progress โโโโโโโโ / Stairs โโโโโ
โโโ โ every shape draws in the
playing/paused accent colors
- "Bar" (
style.volume.bar): Keep current / Show (on, default) /
Hide (off)
- "Percent" (
style.volume.percent): Keep current / Default (dim) /
Off โ hide the percent / Other
- Progress bar & time โ 4 questions:
- "Bar colors" (
style.progressbar.playing / .paused): "playing/paused โ
cyan/black colors them separately, a single color sets both". Keep
current / Default (green / yellow) / cyan / black / Other โ X/Y or
one color (a name or a hex code like #ff8800)
- "Bar characters" (
style.progressbar.style): Keep current /
Line โโโโโโโโโโ (default) / Blocks โโโโโโโโโโ / Other โ smooth,
rise, fade, corner, glide, stipple, tiles, dash,
knob, playhead, wave, pulse, eq, notes, spectrum,
mirror, cava, ripple, swell, bars, ekg,
heartbeat, monitor, cat, snake, duck, bird, sprite,
braille, chevron, tape, cassette, retro, dots, or any
two glyphs like #-
- Only when the chosen style is
sprite, follow up with "Sprite frames"
(style.progressbar.sprite): Keep current / Blinking dot โ โ (default) /
Walking cat แแแข แแแข / Other โ space-separated frames cycling one per
second, or a single glyph like ๐ to walk without animating. The two
track halves are style.progressbar.trail (walked) and
style.progressbar.track (ahead), one narrow glyph each.
- "Bar length" (
style.progressbar.length): Keep current /
Default (20 cells) / 10 โ the pre-0.20 width / Other โ any whole
number of cells, 1โ60 (the /media:now bar follows it)
- "Time" (
style.time.elapsed / style.time.total): "elapsed/total โ
bold cyan/dim styles them separately (X/Y); off as the total
hides the /total tail". Keep current / Defaults (bold / dim) /
Elapsed only โ total off / Other โ X/Y
- Output device โ 2 questions:
- "Icon" (
style.output.icon): Keep current / Default โ by device kind (auto) / Hide (none) / Other โ any glyph
- "Name" (
style.output): Keep current / Default (dim) /
Off โ icon only / Other
Apply every non-Keep answer with config style.<key> โฆ Bash calls (exit 2 โ
relay the stderr reason and re-ask that one value). Offer to continue with
another group only if the user asked for more than one.
Show the result
NO_COLOR=1 "${CLAUDE_PLUGIN_ROOT}/scripts/media.sh" statusline
Show the segment in a fenced code block (plain glyphs here; the real
statusline is ANSI-styled) and report what changed โ the saved pattern and/or
each style key old โ new. Colors cannot render in chat: the live statusline
picks every change up within a second (each write drops the segment cache),
so tell the user to glance at it. If a changed style is SGR-only while
statusline.color is off, point that out (config statusline.color on).
If statusline prints nothing, nothing is playing โ the setup is saved and
shows once something plays. Close with one reminder when relevant: enabling
wired the segment into the statusline automatically (no restart needed;
details in docs/statusline.md); quick on/off toggles and the full reset
live in /media:config.