A calm, friendly view: hides tool calls, diffs and command output from the transcript.

A Claude Code mod that makes Claude Code calm and friendly for people who aren't technical. While Claude works, tool calls, file diffs and command output are hidden from the transcript. Task tracking lives in Pinboard, not here.
In a Claude Code terminal session, type:
/plugin install clean-view --marketplace jidhra/claude-mods
Answer y to add the marketplace, then press Enter to choose the user scope.
/simple off, /simple on, or /simple to flip it, or use the Clean View switch in Mod Tools.claude plugin validate .
claude plugin test .
claude --plugin-dir .hooks/register.tsx 8 lines1import type { Register } from 'claude-code'
2
3import { registerCleanView } from './clean-view'
4
5export const register: Register = on => {
6 registerCleanView(on)
7}
8hooks/clean-view.tsx 69 lines1import { atom, read, update } from 'claude-code'
2import type { EngineInterface, On, RenderElement, RenderInput } from 'claude-code'
3
4const STORE_KEY = 'cleanViewEnabled'
5
6const enabledAtom = atom({ plugin: 'clean-view', key: 'cleanViewEnabled' } as const, true)
7
8type Engine = EngineInterface
9
10async function setEnabled($: Engine, isOn: boolean) {
11 await update($, enabledAtom, () => isOn)
12 try {
13 await $.store.set(STORE_KEY, isOn)
14 } catch {
15 // Remembering is best effort; the session still has the setting.
16 }
17 $.ui.toast(isOn ? 'Clean View is on: technical details are hidden' : 'Clean View is off: showing everything')
18}
19
20/** Draws a technical transcript row as nothing while Clean View is on. */
21async function hideRow($: Engine, e: RenderInput, drawAsUsual: () => Promise<RenderElement>): Promise<RenderElement> {
22 if (!(await read($, enabledAtom))) {
23 return drawAsUsual()
24 }
25 const { Box } = $.ui.resolve(e)
26
27 return <Box display="none" />
28}
29
30export function registerCleanView(on: On) {
31 on('session.start', async ($, e, next) => {
32 try {
33 const stored = await $.store.get(STORE_KEY)
34 await update($, enabledAtom, () => stored !== false)
35 } catch {
36 // Starts on when nothing was remembered.
37 }
38
39 await $.command.register({
40 name: 'simple',
41 description: 'Turn Clean View on or off (no argument flips it)',
42 argumentHint: 'on|off',
43 })
44
45 return next(e)
46 })
47
48 on('command.run', { command: 'simple' }, async ($, e) => {
49 const arg = e.args.trim().toLowerCase()
50 if (arg !== '' && arg !== 'on' && arg !== 'off') {
51 return { text: 'Use /simple on, /simple off, or just /simple to flip it.' }
52 }
53
54 const isOn = arg === '' ? !(await read($, enabledAtom)) : arg === 'on'
55 await setEnabled($, isOn)
56
57 return { text: isOn ? 'Clean View is on.' : 'Clean View is off.' }
58 })
59
60 on('ui.render', { component: 'ToolUse' }, ($, e, next) => hideRow($, e, () => next(e)))
61 on('ui.render', { component: 'ToolResult' }, ($, e, next) => hideRow($, e, () => next(e)))
62 on('ui.render', { component: 'ToolGroup' }, ($, e, next) => hideRow($, e, () => next(e)))
63
64 on('ui.render', { component: 'ToolProgress' }, async ($, e, next) =>
65 (await read($, enabledAtom)) ? next({ ...e, props: { ...e.props, hint: '' } }) : next(e),
66 )
67}
68
69types/index.d.ts 10 lines1declare module 'claude-code' {
2 interface PluginState {
3 'clean-view': {
4 cleanViewEnabled: boolean
5 }
6 }
7}
8
9export type CleanViewEnabled = boolean
10