A little raccoon who lives on your Mac's Dock and reacts to your day.
He watches your cursor, knows what app you're in, sweats when your CPU spikes, gets hangry when your battery's low, wakes all the way up after midnight, and paces the Dock across all your screens. Feed him, water him, pet him β and he never, ever touches the internet.
curl -fsSL https://raw.githubusercontent.com/DavidSirota/bandit/main/install.sh | shNo tools needed. Downloads the app, drops it on your Dock, and starts it β sandboxed and offline.
Desktop pets are having a moment β but almost all of them are heavy Electron
apps that watch your screen and phone home for "updates." Bandit is the
opposite: a tiny native app (Rust + a transparent window, no Electron, no
node_modules) that the macOS kernel physically forbids from making a single
network connection. He's cute and he's the one you can actually trust to watch
what you're doing.
- Reacts to what you're doing β nosy in a browser, locked-in while you code, chatty in a terminal, and he calls you out for app-hopping.
- Reacts to your machine β sweats when the CPU is pegged, gets hangry under 25% battery, dramatically dying under 10%, happy and munching on the charger.
- Nocturnal β greets you through the day, and after midnight the raccoon wakes right up. Trash-panda hours. π
- Roams β paces the Dock and wanders across all your monitors; drag him anywhere and he sticks, feet shuffling as he walks.
- Care loop β hover him for Feed Β· Water Β· Pet Β· Edit. Meters drift while you're away, so you return to a slightly needy little guy. Gentle by design β he sulks and droops, but never dies. Steady care sprouts a fuller head of grass.
- Pomodoro buddy β a Focus timer with a progress ring around him; he nudges you at break time and calls you back to work.
- Reacts to your coding agent β perks up on a prompt, bustles while tools run, and jumps when a task finishes. Works with anything that can run a hook (Claude Code, etc.) by writing a word to
~/.deskpet/state. - Approve tool calls from his bubble β wire him into Claude Code and when the agent wants to run a command or edit a file, Bandit pops an Allow / Deny card. You answer from him instead of the terminal. See In your coding session below.
- Make him yours β recolor his coat and grass, resize him, pick Light / Dark / OS themes, and toggle his chatter on or off.
He floats over fullscreen apps, sits on your Dock with no app icon of his own, and is fully click-through β he never blocks anything.
| Claim | Check it yourself |
|---|---|
| No networking code in the app | nm Bandit.app/Contents/MacOS/* | grep -i reqwest β empty |
| The webview can't reach the net | connect-src 'none' in the config |
| The kernel forbids all networking | he runs under sandbox-exec with (deny network*) |
| No open connections, ever | lsof -nP -a -p "$(pgrep -x deskpet)" -i β nothing |
| No npm / hidden deps | the raccoon is drawn in pure <canvas> code |
Everything he reads (cursor, frontmost app name, CPU, battery) stays on your
machine, written only to ~/.deskpet/.
Easiest β one line (prebuilt, no tools):
curl -fsSL https://raw.githubusercontent.com/DavidSirota/bandit/main/install.sh | shOr download it: grab Bandit.app.zip from Releases, unzip, and drag to Applications.
Build from source (needs Rust + Xcode CLT):
git clone https://github.com/DavidSirota/bandit && cd bandit
sh build.sh- Stop:
launchctl bootout gui/$(id -u)/app.bandit - Uninstall:
rm -rf ~/Applications/Bandit.app ~/Library/LaunchAgents/app.bandit.plist ~/.deskpet
- Move your mouse β his eyes track you.
- Hover him β Feed / Water / Pet / Focus / Edit.
- Drag his body to move him anywhere (it sticks across restarts and monitors).
- Wire him to your agent: he watches
~/.deskpet/stateβprintf celebrate > ~/.deskpet/statemakes him jump. Any tool with hooks can driveidle / working / thinking / celebrate / alert.
Wire Bandit into Claude Code and he handles permission prompts for you. When the agent wants to run a command or edit a file, a card pops up on him:
Claude wants to run Β·
Bashrm -rf build/ && npm run deploy[ Deny ] [ Allow ]
Allow runs it, Deny blocks it β no jumping to the terminal. He only asks for the tools that change things (Bash, Write, Edit), never reads, and if you ignore him he hands the prompt back to the terminal so nothing hangs. It's all local files β no server, no network.
Turn it on (needs jq β brew install jq):
sh ~/Applications/Bandit.app/Contents/Resources/hooks/install-hook.shStart a fresh Claude Code session and he's in. Off: delete the PreToolUse
entry in ~/.claude/settings.json.
Pure JavaScript + <canvas> (no framework, no image assets β Bandit is drawn
from scratch in code), Tauri v2 for a tiny transparent
always-on-top window, and a macOS sandbox profile for the network guarantee.
Bandit is an original character β no third-party mascots.
Bandit is a personal project shared because he's fun. I'm not taking issues or pull requests and may not respond to them β but please fork him and make your own creature. π¦
MIT.