En liten gubbe per Cowork-tråd. Daemonen läser Coworks/Claude Codes transkript-loggar, ritar en pixel-figur per aktiv tråd, och pingar dig med en macOS-notis när en tråd väntar på ditt svar — så du slutar barnvakta fönstret och vet direkt vilken tråd som vill något.
Rent observerande. Ingenting i Cowork ändras — samma trick som Pixel Agents, fast riktat mot Cowork-trådarna istället för VS Code-terminaler.
cd pixel-office
npm install
npm startÖppna sedan http://localhost:4577 i en webbläsare. Det är pixelpanelen. Lämna fliken öppen (eller se "Alltid överst" nedan).
Säkerhet: Servern lyssnar bara på
127.0.0.1(localhost) och har ingen autentisering. Kör inte exponerat mot ett nätverk.
Notiser kommer automatiskt via macOS Notiser när en tråd går till väntar. Första gången frågar macOS om osascript/Terminal får skicka notiser — godkänn det.
Per tråd, tre lägen:
| Läge | Färg | Betyder |
|---|---|---|
| jobbar | blå | transkriptet växer just nu |
| väntar på dig | gul | turen tog slut, eller jag ställde en AskUserQuestion — din tur |
| inaktiv | grå | tyst, inget hänt på ett tag |
Notis skickas bara vid övergången in i "väntar" (en gång), aldrig vid uppstart. Träffsäkrast är detektionen när jag ställt en konkret fråga (AskUserQuestion) — då visas själva frågan i notisen och i pratbubblan.
| Variabel | Default | Vad |
|---|---|---|
CLAUDE_SESSIONS_DIR |
Cowork-mappen och ~/.claude/projects |
rötter som scannas efter .claude/projects/**/*.jsonl. Flera anges kolonseparerat |
PIXEL_PORT |
4577 |
port för panel + websocket |
IDLE_MS |
6000 |
hur länge en fil får vara tyst innan turen räknas som slut |
ACTIVE_WINDOW_MS |
1800000 |
hur länge en tråd visas efter senaste aktivitet (30 min) |
STALL_MS |
300000 |
hur länge en pågående tur får vara tyst innan den räknas som stall (5 min) |
NOTIFY |
på | sätt NOTIFY=0 för att stänga av notiser |
Exempel: NOTIFY=0 IDLE_MS=4000 npm start
Spara som ~/Library/LaunchAgents/com.jamesmcstrid.pixeloffice.plist (byt ut SÖKVÄG mot var mappen ligger, t.ex. ~/pixel-office):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key><string>com.jamesmcstrid.pixeloffice</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/node</string>
<string>SÖKVÄG/watcher.js</string>
</array>
<key>WorkingDirectory</key><string>SÖKVÄG</string>
<key>RunAtLoad</key><true/>
<key>KeepAlive</key><true/>
<key>StandardErrorPath</key><string>/tmp/pixeloffice.err</string>
<key>StandardOutPath</key><string>/tmp/pixeloffice.out</string>
</dict>
</plist>Kolla din node-sökväg med which node och justera. Ladda: launchctl load ~/Library/LaunchAgents/com.jamesmcstrid.pixeloffice.plist.
En liten gubbe som sitter grensle på överkanten av det fönster du jobbar i och rullar stolen dit när du byter fönster — genomskinlig bakgrund, ramlös, alltid överst. Fyra stämningar som speglar dina trådar sammantaget:
| Stämning | När |
|---|---|
| jobbar | minst en tråd skriver just nu — skriver vid datorn, skärmen glöder |
| väntar | minst en tråd väntar — tittar upp, lugn andning, trådens namn under |
| uttråkad | allt tyst senaste minuterna — lutar huvudet i handen, pillar med papper |
| sover | lugnt längre än 3 min — huvudet ner, Zzz |
Är flera trådar igång samtidigt glider kollegor in bredvid honom, en per tråd med egen färg (max tre). Kontoret växer och krymper med arbetsbelastningen.
På skrivbordet står en ut-korg. Varje gång en tråd blir klar och väntar på dig landar ett ark i den, och räknaren visar hur mycket färdigt arbete som ligger och väntar. Hovra över korgen för att se vad varje tråd faktiskt gjorde — "Använde Gmail-integrationen, läste 4 filer, körde ett kommando". Klicka en rad för att ta bort den, eller Rensa för att tömma korgen.
Arken lever kvar längre än de 30 minuter som trådarna själva visas, eftersom hela poängen är att du ska kunna skicka iväg frågor och komma tillbaka senare. Börjar tråden jobba igen försvinner arket av sig självt.
Kräver Hammerspoon. Peka din Hammerspoon-config mot repot så de inte kan glida isär:
-- ~/.hammerspoon/init.lua
dofile(os.getenv("HOME") .. "/sökväg/till/pixel-office/hammerspoon-pixel-pet.lua")Fönsterföljningen kräver Accessibility-behörighet. Systeminställningar → Sekretess och säkerhet → Hjälpmedel → bocka i Hammerspoon. Utan den parkerar gubben nere till höger som förr, och börjar följa av sig själv så fort behörigheten ges — ingen omladdning behövs.
| Snabbtangent | Gör |
|---|---|
Cmd+Alt+Ctrl+P |
starta om gubben |
Cmd+Alt+Ctrl+L |
nåla fast / släpp lös (fastnålad slutar följa fönster) |
Cmd+Alt+Ctrl+F |
hoppa till det aktiva fönstret nu |
Drar du honom med musen nålas han fast automatiskt — annars skulle han rycka iväg så fort du bytte fönster. ×-knappen döljer honom tills en tråd börjar jobba, 📌-knappen växlar fastnålning.
Han hoppar över fönster som inte är värda att sitta på (paletter, tooltips, Finders skrivbord) och parkerar i hörnet när det aktiva fönstret är i helskärm. Positionen sparas mellan omstarter, inklusive vilken skärm han satt på.
Watcher måste köra (npm start) — Hammerspoon-skriptet öppnar bara http://localhost:4577/pet.html i ett WKWebView-fönster.
npm install # hämtar Electron (~tar en stund första gången)
# Terminal 1 — watcher
npm start
# Terminal 2 — gubben
npm run petGubben dyker upp nere till höger. Dra den dit du vill. Stäng med Cmd+Q.
Electron-skalet följer inte fönster — Electron kan inte se andra appars fönsterpositioner utan native-tillägg. Vill du ha fönsterföljningen kör du Hammerspoon-varianten.
Vill du ha både skrivbordsgubben och panelvyn (en gubbe per tråd) kör du
npm startoch öppnarhttp://localhost:4577i en flik.
- "Väntar" är en heuristik. Cowork-loggarna säger inte rakt ut "nu väntar jag på input". Vi gissar på att turen tog slut (filen tystnade) eller att en
AskUserQuestionligger sist. Frågefallet är pålitligt; "tyst-betyder-klar" kan missfyra om en tur har en lång naturlig paus mitt i. Höj/sänkIDLE_MSför att kalibrera. - Subagenter ritas inte i v1 (filtreras bort). Lätt att lägga till som småfigurer kopplade till föräldern.
- Klick gör inget än. Att klicka en gubbe och hoppa till rätt tråd i Cowork går inte att skripta säkert — figurerna är display + notis i v1.
- En karaktär = en transkriptfil. Om en tråd byter sessionsfil kan en ny gubbe dyka upp.
- Trådar som kör i Claudes VM-sandlåda syns inte. Hela appen bygger på att läsa transkript från värdfilsystemet. Kör en tråd inuti sandlådan stannar transkriptet där inne, och gubben har ingenting att gå på — han rapporterar då tillståndet för de trådar han kan se, vilket lätt ser ut som att han sover mitt i ett pågående arbete. På den här maskinen slutade interaktiva Cowork-trådar skriva till disk 2026-09-14; Claude Code-sessioner gör det fortfarande.
watcher.js— daemonen: filbevakning, tillståndslogik, notiser, http/websocket-serverpublic/index.html— pixelpanelen (canvas, en gubbe per tråd)public/pet.html— skrivbordsgubben (canvas, animerad pixelkaraktär med stämningar)hammerspoon-pixel-pet.lua— Hammerspoon-bryggan (ramlöst WKWebView-fönster, macOS-nativ)electron-main.cjs— Electron-alternativ till Hammerspoon för skrivbordsgubbenpackage.json— beroenden (chokidar,ws; Electron som devDependency)
Inspirerad av Pixel Agents (VS Code-versionen).
Pixelkaraktären är en inofficiell homage till Claude — skapad med uppskattning, utan koppling till Anthropic. Inget officiellt varumärke används och inga loggor kopieras. MIT-licens — se LICENSE.