Install
One line on macOS, Linux or Windows, then three commands to authorize the machine and install the plugin.
CULP is two pieces: a CLI called culp, and a Claude Code plugin that the CLI
installs for you. The one-line installer places the CLI; culp setup does the
rest.
macOS and Linux
curl -fsSL https://api.claudeusagelimits.com/install.sh | bash
Windows
irm https://api.claudeusagelimits.com/install.ps1 | iex
Windows is a first-class target, not a courtesy: the CLI's test suite runs on a real Windows runner in CI, because the bugs that only appear there are the ones that cannot be reproduced anywhere else.
Then, on every machine
-
culp loginopens your browser and authorizes this machine. The authorization lasts 180 days and there is no refresh token; when it expires, log in again. -
culp setupdownloads the plugin bundle and points Claude Code at it. It verifies every step by re-reading what Claude Code reports, becauseclaude plugin installis a no-op on an already-installed plugin and "already exists" is not proof. -
culp doctorchecks all of it and names anything that is wrong.
What lands on your machine
Everything CULP stores is under ~/.culp:
| File | What it holds |
|---|---|
device.key |
This device's Ed25519 private key. It never leaves the machine. |
device.json |
The device identity the key is bound to. |
auth.json |
The device's access token. Deliberately no email, no password, no MAC, no refresh token. |
config.json |
The API URL and endpoint overrides. |
update.json |
The cached release manifest. |
motd.json |
The cached message of the day. |
Set CULP_HOME to move all of it somewhere else. Every path above is derived
from that one variable.
Keeping it current
culp update synchronizes the whole installation, not just the wheel: the CLI
and the plugin carry independent versions, and a plugin-only release is the
normal case.
The wheel half never installs in its own process. It spawns a detached process
that waits for the current culp to exit and only then runs the installer, on
every platform, because replacing a tool environment underneath a running
process loses every module it has not imported yet. So the command reports a
scheduled install rather than a version; culp --version in a later session
is the confirmation.
A session that starts while an update is published tells you so, and you can ask
Claude to run culp update for you rather than doing it yourself.