SLOPSHOPPER

clawd-buddy

Clawd sits above the prompt and keeps typing: fast while Claude works, slow while idle

newbandtimer
v0.1.0no licenseupdated 2026-10-06dillonmohr8777/claude-skills-repo/mods/clawd-buddy
A shopper browsing a rack in a slop shop
Preview · a replayed session in a sandbox
claude · ~/work/app · clawd-buddy
› fix the failing auth test and add an audit log call ⏺ Read(src/auth.ts) ⎿ Read 6 lines ⏺ Update(src/auth.ts) ⎿ Added 2 lines, removed 1 line ⏺ Bash(bun test) ⎿ 3 pass, 1 fail ● Done. refresh now rejects expired claims and logs an audit event. ✻ Worked for 42s · done 4:20 PM ▐▛███▜▌ ▝▜█████▛▘ ●○○ clawd is vibing ▘▘ ▝▝ ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── › ? for shortcuts

Draws

Band
▐▛███▜▌ ▝▜█████▛▘ ●○○ clawd is vibing ▘▘ ▝▝
Source 2 files
hooks/register.tsx 38 lines
1import { atom, read, update } from 'claude-code'
2import type { Register } from 'claude-code'
3
4const frame = atom({ plugin: 'clawd-buddy', key: 'frame' } as const, 0)
5
6const HANDS = ['  ▘▘ ▝▝', '  ▝▝ ▘▘']
7const DOTS = ['●○○', '○●○', '○○●', '○●○']
8
9// One frame of Clawd: idle types at a third of the working speed.
10export function sprite(tick: number, working: boolean) {
11  const t = working ? tick : Math.floor(tick / 3)
12  return { hands: HANDS[t % HANDS.length], dots: DOTS[t % DOTS.length], caption: working ? 'typing' : 'vibing' }
13}
14
15export const register: Register = on => {
16  on('session.start', ($, e, next) => {
17    $.clock.every(450, () => void update($, frame, f => (f + 1) % 1200))
18    return next(e)
19  })
20
21  on('ui.render', { component: 'AbovePrompt' }, async ($, e, next) => {
22    if (e.props.hasSurvey || e.props.maxRows < 3) return next(e)
23    const { Box, Text } = $.ui.resolve(e)
24    const s = sprite(await read($, frame), e.props.isWorking)
25    return (
26      <Box flexDirection="column">
27        <Text color="claude"> ▐▛███▜▌</Text>
28        <Text>
29          <Text color="claude">▝▜█████▛▘ </Text>
30          <Text color="#A99BF5">{s.dots}</Text>
31          <Text dimColor> clawd is {s.caption}</Text>
32        </Text>
33        <Text color="claude">{s.hands}</Text>
34      </Box>
35    )
36  })
37}
38
types/index.d.ts 8 lines
1export type Frame = number
2
3declare module 'claude-code' {
4  interface PluginState {
5    'clawd-buddy': { frame: Frame }
6  }
7}
8