Skip to content

Statusline: hardcoded 72-column cap has no escape hatch, so wide terminals go unused (+ optional wide layout) #1717

Description

@xmasyx

Summary

LIFEOS_StatusLine.sh caps its render width at a hardcoded 72 columns with no way to opt out. On a wide terminal the dashboard occupies the leftmost 72 columns and leaves everything to the right of them empty, no matter how much room is actually available.

I understand the cap is intentional — the comment says so. This is a request for an escape hatch, not a claim that the default is wrong.

Where

LifeOS/install/LIFEOS/LIFEOS_StatusLine.sh, lines 504–507 (read from main via the GitHub contents API today, so the line numbers are current):

# Content width: cap at 72 so wide terminals don't stretch, but narrow ones fit
content_width=$term_width
[ "$content_width" -gt 72 ] && content_width=72
[ "$content_width" -lt 10 ] && content_width=10

content_width feeds SEP_SOLID / SEP_DASHED / SEP_DOT, the context-bar width, and every wrap calculation, so the whole dashboard inherits the 72.

Why it matters more now than it used to

Claude Code's fullscreen renderer (/tui fullscreen) pins the statusline to the bottom of the screen instead of letting it scroll away with the conversation. Once the dashboard is permanently on screen, its height is a standing cost, and height is exactly what the width cap forces: on a 150-column terminal the current layout renders around 15 stacked rows while using less than half the available width. Anything that could sit side by side is stacked instead.

Suggested fix — 1: make the cap configurable

Three lines, default unchanged, so nobody's current render moves:

# Content width: cap at MAX_WIDTH (default 72) so wide terminals don't stretch,
# but narrow ones fit. Set LIFEOS_STATUSLINE_MAX_WIDTH=0 to use the full width.
: "${LIFEOS_STATUSLINE_MAX_WIDTH:=72}"
content_width=$term_width
if [ "$LIFEOS_STATUSLINE_MAX_WIDTH" -gt 0 ] 2>/dev/null; then
    [ "$content_width" -gt "$LIFEOS_STATUSLINE_MAX_WIDTH" ] && content_width="$LIFEOS_STATUSLINE_MAX_WIDTH"
fi
[ "$content_width" -lt 10 ] && content_width=10

Suggested fix — 2: an optional wide/compact layout

With the cap lifted, the natural follow-up is a layout that actually spends the width. Pairing blocks left/right collapses the normal-mode render from roughly 15 rows to 4:

LIFEOS 7.1.1 │ CC 2.1.220 │ ALGO 8.4.0 │ <MODEL>                    <SESSION LABEL>
ACTIVE: <rungs> │ <cross-vendor engines>              ⚡ LOW MEDIUM HIGH XHIGH MAX
                                        🧠 OK · REVIEWED 10M AGO · NEXT IN 5 TURNS
CONTEXT: 12% │ STARTUP LOAD: 2.8% ≈ 28.6K TOK      📊 5HR 14% ↻2030 WK 38% ↻SUN@23

Two things that are easy to get wrong there, both of which cost me a debugging pass:

  1. Width has to be reported, not re-derived. detect_terminal_width() has five tiers, and tiers 4–5 do not write $_width_cache. Anything downstream that re-detects the width can land on a different number than the one the separators were drawn with, and the right-hand column then sits a few columns off. Whatever composes the columns should be handed content_width directly.
  2. Emoji are two display columns wide but one character. ${#var} counts characters, so right-aligning a segment that starts with , 🧠 or 📊 using ${#} shifts it by one column per emoji.

A third, separate observation: hosts may not give the statusline the terminal's full width. Under Claude Code's fullscreen renderer, asking for the last column got the end of my right-hand column replaced with ; reserving a few columns fixed it. If a wide layout lands upstream, a small configurable right margin is probably worth having.

I'm happy to open a PR for fix 1 if that's useful — it's the self-contained half.

Repro

  1. Open a terminal at 150 columns.
  2. Start a session with the LifeOS statusline configured.
  3. The dashboard renders inside the first 72 columns; the remaining ~78 are blank.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions