Turn on “Lines from claude” in the menu (or "ai": true) and the random book
is replaced with remarks about what you are actually doing. Every so often he
gathers the evidence: your open window titles, what’s playing, what you’ve
done to him lately (slaps, drags, the odd murder), and anything currently
embarrassing — a dying battery, an uptime or a pacman sync measured in weeks,
a program that dumped core today, a live microphone, more than half your
agent plan gone. Plus a random few draws from the shame pool: how long since
your last pacman sync, the package count, repos in ~/Work with uncommitted
changes (names included), your most-typed shell command, the workspace and
browser tab counts. He never digs through your folders — no Downloads
inventory, no screenshot hoard, no trash. He hands all of it to your coding
agent as text and asks for five lines in his voice, with a handful of lines
from the book (and your quotesFile) as examples of how far to go. They’re
cached and handed out one at a time, so a click never waits on a model.
The agent is whichever omarchy default agent picked, run the way omarchy
agent prompt runs it but in its one-shot mode with tools off: it gets the
facts as text and can only answer. Nothing on your machine is touched. It does
mean the window title and the rest of that list are sent wherever that agent
sends its prompts, and every batch spends a little of your plan: one small
call every 15 minutes or so at the default pace, more if you keep clicking
him, never more than one a minute. It runs on the agent’s default model
unless aiModel says otherwise. For claude that is the CLI’s default (opus),
not the model in your settings.json, because the call runs with your
settings off so it doesn’t load your CLAUDE.md and hooks. A smaller model
does the job fine (claude-sonnet-5 answered in 4 s, same as opus; haiku 4.5
oddly took a minute). clean applies to these lines too. You can tell his
lines apart: an agent line gets the theme’s accent colour on the bubble and a
little sparkle in the corner. Whenever the agent is unset, not logged in,
offline or slow, the book takes over and you won’t notice, except that the
sparkle is gone.
And when you want a verdict on demand: “Judge my screen” in the menu (or
omarchy-shell costafot.clippy look) screenshots the monitor he is standing
on, hands the picture to the same agent, and ~10 seconds later the jab lands
in his bubble — he visibly inspects the screen while the model chews on it.
This one cites what it can actually see (the tab, the window, the thing
you are pretending to read), which is where the good material was all along.
The screenshot goes wherever your agent sends its prompts, same as the facts
above — but only when you ask: he never takes one on his own, not on a timer,
not ever, and the file is deleted the moment the call returns. claude reads
the image natively and codex gets it attached; any other agent gets the
file path in the prompt and does what it can with it.
And you can talk back. “Say it to his face” in the menu (or omarchy-shell
costafot.clippy listen) opens the microphone — he visibly leans in — and
whatever you say to him comes back as a comeback, through the same agent,
spoken in whatever voice he has. Call listen again to stop, or he gives up
after 15 seconds. He is combative about it: tell him to shut up and he
squares up, ask him a question and he mocks you for asking a paperclip. The
audio is transcribed on your machine by voxtype
(which ships with Omarchy) and the recording is deleted right after — only
the transcribed text goes to your agent (with a slim cut of the usual
facts: just the focused window and what’s playing), and the mic only ever opens on your
explicit gesture, same rule as the screenshot. Say nothing and he notices
that too, without spending a call on it. No mic handy? omarchy-shell
costafot.clippy reply "your words" is the same fight, typed. Without an
agent set he answers both with the stock sass you deserve.
Don’t like who he is? promptFile points at a plain text file that replaces
his entire built-in prompt — the persona, the delivery, the rules, the
swearing, all of it. Your file becomes the character; the machinery stays. He
still gets the facts, still judges screenshots, still fires back when you talk
to him, and still answers in the JSON the plugin expects — but who is doing
all that is now whatever your file says. The built-in register examples step
aside too: only your own quotesFile lines ride along, so his old book can’t
argue with whoever you turned him into. Everything else in this section
(clean’s example filtering, the caching, the sparkle) applies unchanged. A
path that doesn’t exist falls back to the built-in gremlin, and
omarchy-shell costafot.clippy ai tells you which character is actually
running. Write the file as the character brief — who he is, how he talks,
what he goes after — and nothing about output: the plugin appends the facts
block, the mode framing (screenshot, their words, line count) and the JSON
contract itself, so a file that dictates a format fights the scaffold.
Fair warning: his built-in taste rules (no clock jokes, the length
cap, “never be hateful”) are part of what you are replacing — your prompt,
your responsibility.
Verified with claude and opencode; codex and pi are wired the same way
but weren’t run here, and the rest are best guesses from their docs. To see
what he’d send, or try an agent by hand:
cd ~/.config/omarchy/plugins/costafot.clippy
scripts/clippy-ai # a JSON array of lines from the default agent (--count N, default 3)
scripts/clippy-ai --agent opencode # a specific agent; --model <name> where it takes one
scripts/clippy-ai --context # the facts it would send (one random draw of the shame pool)
scripts/clippy-ai --prompt # the whole prompt, register examples and all
scripts/clippy-ai --image shot.png # one jab about a screenshot — what `look` runs
scripts/clippy-ai --reply "make me" # one comeback — what `listen`/`reply` run; --said <his line> is what they answered
scripts/clippy-ai --clean # drop the nsfw examples, the `clean` key
scripts/clippy-ai --quotes ~/mine.json # merge a quotesFile into the examples
scripts/clippy-ai --prompt-file ~/who.txt # your character instead of the built-in one, the `promptFile` key
scripts/clippy-ai --recent "slapped him" # the note the plugin passes about what you did to him lately