SLOPSHOPPER

message-style

Your prompts in the terminal as opencode-style panels: right-aligned text with a blue stripe on the right

newrows
v0.3.0no licenseupdated 2026-10-16Ilja-Garbuz/claude-code-mods/mods/message-style
A shopper browsing a rack in a slop shop
Preview · a replayed session in a sandbox
claude · ~/work/app · message-style
▐ fix the failing auth test and add an audit log call ▐ ▐ ▐ ▐ ▐ ▐ ▐ ▐ ▐ ▐ ▐ ▐ ▐ ▐ ▐ ▐ ▐ ▐ ▐ ▐ ▐ ▐ ▐ ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── › ? for shortcuts

Draws

Your message
fix the failing auth test and add an audit log call
README

Claude Code mods

Three mods for the Claude Code terminal (CLI). Claude Desktop, VS Code and mobile keep their normal look.

ModWhat it does
session-panelA side panel docked on the right: live 5-hour and weekly limits, context use with a per-category breakdown, the model and effort with switchers, skills with their context cost, connector status, the working directory, the Claude Code version and toggles for your mods. /panel opens it; the ✕ collapses it to a « button.
message-styleYour prompts as opencode-style panels: full width, text on the right, a thin blue stripe on the right edge.
mod-manager/mods lists your installed plugins and mods with on/off toggles that apply in the open session, no restart. The side panel's Mods section uses it.

Install

You need Claude Code 2.1.300 or newer.

In a Claude Code terminal session, run each of these, answering y to add the marketplace and choosing the user scope:

/plugin install session-panel --marketplace Ilja-Garbuz/claude-code-mods
/plugin install message-style --marketplace Ilja-Garbuz/claude-code-mods
/plugin install mod-manager --marketplace Ilja-Garbuz/claude-code-mods

Or from any shell (PowerShell, bash, fish):

claude plugin marketplace add Ilja-Garbuz/claude-code-mods
claude plugin install session-panel@ilja-mods --scope user
claude plugin install message-style@ilja-mods --scope user
claude plugin install mod-manager@ilja-mods --scope user

session-panel brings mod-manager along, so installing it alone also works.

Start a new session (or run /reload-plugins) and the panel appears once the terminal is wide enough (144 columns in the fullscreen layout). Anywhere else, type /panel.

To update later: claude plugin marketplace update ilja-mods, then /reload-plugins.

Settings

  • message-style: /plugin configure message-style@ilja-mods sets the panel colour and the stripe colour.
  • Turn a mod off: use the toggles in the side panel's Mods section, /mods toggle <name>, or claude plugin disable <name>@ilja-mods.

Notes

  • Model switching: changing the model in the panel works like /model, so it also becomes your default for new sessions. Mid-session the panel warns first, because a switch drops the prompt cache.
  • Background checks: to stay current, the panel runs claude -p /usage --safe-mode every 3 minutes and claude mcp list every 15 minutes. Neither calls the model or uses your limits.
  • Windows and Linux: the mods call claude and git by name, so both need to be on your PATH. Nothing depends on the shell.

Developing

See DEVELOPMENT.md. Each mod checks with:

claude plugin validate mods/session-panel
claude plugin test mods/session-panel
Source 1 files
hooks/register.tsx 31 lines
1import type { Register } from 'claude-code'
2
3// Your prompts in the terminal as opencode draws them, mirrored: a padded
4// full-width panel with the text on the right and a blue stripe down the
5// right edge. Claude's replies stay as the engine draws them; Desktop, VS
6// Code and mobile keep their own look. The engine's row can't be restyled,
7// so the panel is drawn here from the prompt's text; ctrl+o still shows the
8// engine's row.
9export const register: Register = (on, options) => {
10  const panel = String(options.bubbleColor ?? '#1e1e1e')
11  const stripe = String(options.stripeColor ?? '#5c9cf5')
12
13  on('ui.render', { component: 'UserMessage', surface: 'terminal' }, async ($, e, next) => {
14    // Only the person's own prompts, and the full row under ctrl+o.
15    if (e.props.origin.kind !== 'composer' || e.props.isExpanded) return next(e)
16    const { Box, Text } = $.ui.resolve(e)
17    // The stripe is half a cell wide: a column of right-half blocks laid over
18    // the last cell, clipped to the panel's height, so it never adds rows.
19    return (
20      <Box marginTop={1} marginLeft={2}>
21        <Box flexGrow={1} flexDirection="column" alignItems="flex-end" backgroundColor={panel} paddingX={2} paddingY={1} marginRight={1}>
22          <Text wrap="wrap">{e.props.text}</Text>
23        </Box>
24        <Box position="absolute" top={0} bottom={0} right={0} width={1} overflow="hidden">
25          <Text color={stripe}>{'▐\n'.repeat(200)}</Text>
26        </Box>
27      </Box>
28    )
29  })
30}
31