Skip to content

Repository files navigation

🏢 Pixel Office

Pixel Office — skrivbordsgubben i jobbat-läge

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.

Kör igång

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.

Hur den tänker

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.

Konfig (env-variabler)

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

Starta automatiskt vid inloggning (launchd)

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.

🪑 Skrivbordskompisen

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.

📤 Ut-korgen

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.

Hammerspoon (rekommenderat, macOS-nativt)

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.

Electron (alternativ)

npm install   # hämtar Electron (~tar en stund första gången)

# Terminal 1 — watcher
npm start

# Terminal 2 — gubben
npm run pet

Gubben 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 start och öppnar http://localhost:4577 i en flik.

Kända begränsningar (ärligt)

  • "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 AskUserQuestion ligger 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änk IDLE_MS fö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.

Filer

  • watcher.js — daemonen: filbevakning, tillståndslogik, notiser, http/websocket-server
  • public/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 skrivbordsgubben
  • package.json — beroenden (chokidar, ws; Electron som devDependency)

Krediter

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.

About

Desktop pet that watches your Claude Code threads and pings you when one is waiting for input

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages