Skip to main content

claudlet 🐾

English | 한국어

PyPI

A tiny pixel creature that lives on your desktop and reacts to Claude Code (and Codex) in real time — it types while the agent works, waits when it needs you, celebrates when it's done, and roams around while you code. Click it to bring the terminal back to the front.

Drawn entirely in code — no image assets — so it's self-contained and original (CC0 artwork).

Pets roaming over the wallpaper
Real desktop capture — perching on titlebars, dozing off between tasks, climbing over whatever's on screen.

Install

pipx install claudlet
claudlet-install      # hooks + /claudlet skill, for every agent found (Claude Code, Codex)

New sessions then spawn a pet on their own; restart sessions that were already running. Best on KDE Plasma; perching on windows also works on Windows and macOS, and elsewhere the pet just roams. See Platform support.

Codex

claudlet-install hooks every agent it finds — Claude Code via ~/.claude/settings.json, Codex via ~/.codex/hooks.json — and only ever touches its own entries. Narrow it with claudlet-install-hooks --agent codex (--remove to undo).

Codex runs hooks only when ~/.codex/config.toml has:

[features]
hooks = true

Codex sends no Notification event, so the permission-prompt and idle-nudge states come from its PermissionRequest instead.

Update
claudlet-version                                                                           # installed vs latest
pipx upgrade claudlet && claudlet-install                                                  # latest release
pipx install --force "git+https://github.com/YeeDochi/Claudlet@develop" && claudlet-install # tip of develop

Restart your session afterward (claude --continue) so the new hooks load. Or run /claudlet update (update latest for develop) and follow the prompts.

Uninstall

Unhook first, then remove the package — claudlet-uninstall is the only step that takes the hooks out of ~/.claude/settings.json; delete the package first and Claude Code keeps calling a claudlet-hook that no longer exists.

claudlet-uninstall        # stops pets, unregisters hooks + skill (--purge: config too)
pipx uninstall claudlet   # only after the line above succeeds
  • Command not found (common on Windows): pipx ensurepath, restart the terminal, try again.
  • Source install: python ~/claudlet/bin/claudlet-uninstall, then delete ~/claudlet.
  • Removed the package already? pipx install claudlet && claudlet-uninstall && pipx uninstall claudlet, or delete the claudlet-hook entries from ~/.claude/settings.json by hand.
Without pipx — one-line source install

Clones (or updates) to ~/claudlet, installs deps, registers hooks + skill:

curl -fsSL https://raw.githubusercontent.com/YeeDochi/Claudlet/master/install.py | python3 -   # Linux / macOS
irm https://raw.githubusercontent.com/YeeDochi/Claudlet/master/install.py | python -           # Windows

The claudlet* commands then live in ~/claudlet/bin, not on your PATH. Hooks work regardless; add that dir to PATH to run the commands yourself.

What it shows

The pose tracks what the agent is doing — editing, reading, calling MCP, thinking, waiting on you, done, failed. Running unattended (auto / bypass mode) pulls a VR visor over its eyes.

states

When the agent spawns subagents, a hatted companion trails the pet for each one (up to three), mirrors what it's doing, and waves goodbye when it finishes.

Agent companions on the desktop

Talking to it

Right-click → 💬 Start a conversation… opens a chat window. Enter types your line straight into the session; right-click ➤ → 📝 Leave as a note has the pet hold it in its mouth until the next tool call or prompt. 🎯 lets you drag over a window so what's on it rides along with your next line.

The answer comes back in the creature's own voice, in a bubble over its head — each creature can have its own name and voice (settings page).

Turn on Creature answers first (settings → preferences) and what you say goes to the creature instead of your session: a separate, hook-free one-shot call that reads the session's recent activity, answers small talk itself, and hands real work to the session — so chatting never interrupts the agent mid-task. Each message is its own call, so it's off by default.

the chat window

Platform notes
  • KDE: sending straight away needs Konsole's Enable the security sensitive parts of the DBus API; without it Enter leaves a note (the input says so).
  • macOS: notes only for now.
  • Hangul/CJK on Linux (fcitx): pip's Qt carries no fcitx input method. With the distro PyQt6 installed (sudo apt install python3-pyqt6) the pet relaunches on that Qt and it works.

Fetching a window

Lost a window behind ten others, or minimized it? Ask the agent — "bring up the Slack window" — and the pet goes and gets it, the app's icon in its mouth. A minimized window rises up right where the pet stood; a buried one gets tugged back in steps.

the pet fetching a window

KDE Plasma and Windows. On macOS minimized windows aren't listed and it fronts the whole app.

Make it yours

/claudlet setting (or claudlet-config ui) opens a page to pick which creature the pet wears and its colour and size, previewed with the real renderer. With more than one agent installed, each gets its own tab.

The settings page

Four creatures ship with the pet, and /claudlet make <what you want> writes a new one (/claudlet make a grumpy little robot):

claudlet, codex, astronaut and slime across the same states

A creature is a small Python package, so it can be drawn with rectangles, blitted from a sprite sheet, anything — see Writing a creature. The arrow buttons on the settings page export one as a .zip and import one someone sent you; an import shows you what's inside before installing anything, since it runs their code.

/claudlet

claudlet-install links a /claudlet skill into every agent it found:

  • /claudlet — attach a pet to this session · /claudlet standalone — an unattached one
  • /claudlet <motion> — jump · wave · sing · juggle · float · celebrate · … (list, stop)
  • /claudlet setting · wear <creature> · make <description> · export / import
  • /claudlet config — or just ask in plain language ("jump when I run Bash")
  • /claudlet window <what> — find a window and have the pet fetch it
  • /claudlet update
Shell commands
Command What it does
claudlet Launch a pet right now (standalone).
claudlet-install Register the hooks + /claudlet skill — run once after installing.
claudlet-uninstall Stop pets, unregister the hooks + skill, clean up (--purge also deletes your config).
claudlet-config Show / scaffold / open the user config (--path, init, open); ui opens the appearance page (--app for a window of its own, --agent <name> to open on that agent).
claudlet-config wear <creature> Put a creature on, --agent <name> for one agent only; no argument lists what is available.
claudlet-config export <creature> Zip a creature to share (--out <dir|file.zip>, --force to overwrite).
claudlet-config import <file.zip> Install a creature someone shared, after showing you what is inside (--yes to skip the prompt, --force to replace one of the same name).
claudlet-version Show the installed version vs the latest PyPI release.
claudlet-attach Attach a pet to the current Claude Code session.
claudlet-motion <name> Play a motion on running pets (jump, wave, … ; stop, list).
claudlet-install-hooks Just the hooks half of claudlet-install (--agent codex to narrow, --remove to undo).
claudlet-window list windows (JSON, topmost first), raise <id> one (--wait, --pull), chat for the pet's chat window.
claudlet-doctor Tell you what is switched off and what that breaks (--quiet: only when something is).
claudlet-macos-diag Print raw macOS window coordinates (perch troubleshooting).
claudlet-hook Internal — invoked by the agent's hooks, not by you.

Docs

Contributors

  • @htto0824 — dock placement (corner slots, multi-pet alignment, drag-to-move the whole row) and Windows Terminal tab focus
  • @Rio-Kyeong — art pixels snapped to the whole-pixel grid (crisp edges, no silhouette wobble as the pet bobs)
  • @pawprint0706 — Windows fixes: the no-go zone editor took no mouse input at all, and skill-link junctions were re-warned about on every install
  • @reujea — point at something on screen and ask about it (reads the window's text, redacts it, sends only on approval), and the log of what was asked and answered

License

Code: MIT (see LICENSE). Creature artwork: CC0 (see NOTICE).

Metadata

Release files for claudlet 2.6.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for claudlet 2.6.0
File Size Uploaded
claudlet-2.6.0.tar.gz 355.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for claudlet 2.6.0
File Interpreter ABI Platform
claudlet-2.6.0-py3-none-any.whl Python 3 none any Details

Total release size: 739.5 kB

Release files / claudlet-2.6.0.tar.gz

Download URL claudlet-2.6.0.tar.gz
Size 355.1 kB
Tags Source
SHA-256 checksum
How to use checksums
fd2329dd26d0174ae84a6bd73336b18cfa864db1029a4806fd53abb275e1933b
BLAKE2b-256 checksum
How to use checksums
5ab8d73b4f5f8a4380990ccf0b2284947395ebe3feea1ee24924e4c2eb79eff5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 1, 2026.

Transparency log

Release files / claudlet-2.6.0-py3-none-any.whl

Download URL claudlet-2.6.0-py3-none-any.whl
Size 384.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3c0657f6ec1ed855e65b02b794212e8d9b01add39e0fbefeb9b82ad09e01f3f5
BLAKE2b-256 checksum
How to use checksums
ce15a5f84c3d87839c0d340afac9e13c2141273c37035f3a4a6ef53cd3d09be1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 1, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

2.6.0 This release

2 release files

2.5.1

2 release files

2.5.0

2 release files

2.4.1

2 release files

2.4.0

2 release files

2.3.0

2 release files

2.2.0

2 release files

2.1.0

2 release files

2.0.4

2 release files

2.0.3

2 release files

2.0.2

2 release files

2.0.1

2 release files

2.0.0

2 release files

1.8.0

2 release files

1.7.1

2 release files

1.6.0

2 release files

1.5.1

2 release files

1.5.0

2 release files

1.4.1

2 release files

1.4.0

2 release files

1.3.1

2 release files

1.3.0

2 release files

1.2.1

2 release files

1.2.0

2 release files

1.1.0

2 release files

1.0.1

2 release files

1.0.0

2 release files

0.3.6

2 release files

0.3.5

2 release files

0.3.4

2 release files

0.3.3

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page