[FEATURE] User-side sideband display: output the user sees but Claude does not
Preflight Checklist
- [x] I have searched existing requests and this feature hasn't been requested yet
- [x] This is a single feature request (not multiple features)
Problem Statement
Claude Code's extension points (hooks, skills, bang commands, statusline) all share a fundamental constraint: there is no way to show the user information without it entering Claude's context window.
- Skills (
/skill) cause Claude to think about the output, burning tokens to interpret and narrate data you just want displayed. - Bang commands (
!command) inject stdout directly into context. Checking a status dashboard 10 times fills the conversation with repetitive tabular data Claude doesn't need. - Hook
systemMessage(added in v1.0.64, #4084) is the closest primitive, but the message appears in the conversation transcript and enters context. - Statusline is user-only but limited to a single line of text --- it can't display multi-line output like a problem list, test results, or session summary.
I want to glance at my project's TODO list, problem summary, or test results without leaving the Claude Code window. Today, that means either piping it through a bang command (paying tokens for data Claude doesn't need) or switching to another terminal.
The analogy is an IDE's problems panel or output window --- always visible, never in the editor buffer. Claude Code's "editor buffer" is the conversation context, and right now there's no equivalent of the surrounding chrome.
Proposed Solution
A mechanism for hooks (or other extensions) to display output that the user sees but Claude does not. A sideband channel.
The lowest-friction version: extend the existing hook systemMessage mechanism. Today, systemMessage renders in the conversation and enters context. If hooks could instead return something like:
{
"userDisplay": "## Active Problems\n- auth-module: Claude stopped (waiting for review)\n- api-tests: 3 failing tests\n- docs: unreviewed diff (12 files)",
"userDisplayTitle": "Project Status"
}
...and this printed inline the same way hook errors are printed today, but with normal terminal coloring instead of red, that would be sufficient. No new UI primitives needed --- just a non-context, non-error output path.
The essential property is: user sees it, Claude doesn't, and it doesn't cost tokens.
Alternative Solutions
- Bang commands (
!cat TODO.md): Works, but every invocation enters context. Checking status 10 times during a session fills the conversation with repetitive data Claude doesn't need. - Multiple terminal windows / tmux: Works, but defeats the purpose of Claude Code being the primary development environment. You're context-switching to see ambient information.
- Statusline scripts: User-only (good!), but limited to a single line. Can't display a multi-line problem list or test summary.
- External dashboard tools (separate app, web UI): Works for desktop, but unavailable during remote workflows (SSH, Claude Code Remote Control).
Priority
Low - Nice to have
Feature Category
Interactive mode (TUI)
Use Case Example
- I'm managing multiple Claude Code sessions across several projects.
- Between sending instructions, I want to check: which sessions have stopped? Are there unreviewed diffs? Did tests pass? What's on my TODO list
- I run a hook (or bang command) that calls a status script.
- Today: the output enters Claude's context, wasting tokens on tabular data Claude doesn't need to see. Over a session, these status checks accumulate and accelerate context compaction.
- With this feature: the hook returns
"userDisplay"instead of"systemMessage". The status prints inline with normal formatting. Claude's context is unaffected. I stay in one window.
Additional Context
Relationship to existing issues
This is the missing primitive beneath several open requests:
- #22221 --- Expose plan usage limits in status line (wants ambient display of quota data)
- #24537 --- Agent hierarchy dashboard (wants a dedicated panel for multi-agent state)
- #6577 --- Context data access in statusline hooks (wants richer ambient display)
- #29829 --- Session cost and context usage in hook event data
- #10052 --- Expose agent information for external monitoring
- #11224 --- Discovered that exit code 0 + stdout already gives user-only hook output (Claude doesn't see it), and proposed explicit
"visibility": "user-only"control. Closed as not planned, but mapped out the existing undocumented behavior that this request builds on.
Each of these requests a specific piece of ambient information. A sideband display channel would let the community build all of them as extensions without waiting for first-party support for each one.
Acknowledgment
Thank you for building Claude Code. The hooks system, JSONL session files, and statusline are already remarkably extensible for a CLI tool. This one addition would close the loop and let the community build the ambient tooling that makes Claude Code a complete development environment.
---
This feature request was researched and drafted by Claude (Opus 4.6) via Claude Code, on behalf of the author.
This issue has 7 comments on GitHub. Read the full discussion on GitHub ↗