From readwise
Automates Readwise Original API via CLI for creating, updating, deleting, listing, and reviewing highlights; searching and fetching books; daily review fetch. Handles retries, pagination, rate limits.
npx claudepluginhub ryanlyn/readwise-skill --plugin readwiseThis skill is limited to using the following tools:
Use this skill to automate work with the Readwise "Original" API that powers highlight exports and metadata management.
Accesses Readwise highlights and Reader documents via CLI for searching, listing, reading, and creating highlights from the command line. Useful for terminal integration with reading libraries.
Queries Readwise for highlights, quotes, annotations, full document text, and article content. Adds highlights or tagged documents to notebooks. Auto-activates on search or fetch requests.
Access Readwise highlights and Reader saved articles via Node.js CLI scripts. List/search/export books and highlights; manage documents with save/get/search.
Share bugs, ideas, or general feedback.
Use this skill to automate work with the Readwise "Original" API that powers highlight exports and metadata management.
READWISE_TOKEN.uv run --project ${CLAUDE_PLUGIN_ROOT} python ${CLAUDE_PLUGIN_ROOT}/skills/readwise/scripts/readwise_client.py ... instead of calling the API directly; it handles retries, pagination, rate-limit surfacing, --dry-run, and tagging rules.highlights review to fetch today's highlights, then formats thembooks to find the book ID, then highlights list to fetchhighlight create with the quote textGlobal options --dry-run and --raw can appear anywhere in the command.
uv run --project ${CLAUDE_PLUGIN_ROOT} python ${CLAUDE_PLUGIN_ROOT}/skills/readwise/scripts/readwise_client.py [--dry-run] [--raw] highlight create --text ... [--book-id ID] [--title ...] [--author ...] [--category ...] [--image-url ...] [--generated] [--tags t1,t2]
Creates a highlight or batch (--bulk-file ndjson). Use --book-id to target an existing book (the CLI resolves it to title/author/category for the API). Always specify --category when creating new sources—see "Category is critical" below. Use --image-url for cover images (recommended for books and podcasts, not needed for articles or tweets). If --generated is set, .generated is appended to tags and location_type defaults to none.... [--dry-run] highlight update <id> [--title --note --tags --generated] – partial updates.... highlight show <id> – fetch highlight details.... highlight delete <id> [--yes] – delete a highlight, --yes skips confirmation.... highlights list [--book-id 123] [--tag focus] [--category books] [--updated-after 2026-02-01] [--limit 50] – cursor-based listing. Dates are ISO format (e.g. 2026-02-01 or 2026-02-01T10:30:00Z).... highlights review – fetches today's daily review highlights (no parameters; returns the curated spaced-repetition set).... books [--title ...] [--author ...] [--limit N] – search books by title/author (case-insensitive substring match).... book <id> – fetch a single book's metadata.... auth validate – confirms your token works by hitting the /api/v2/auth/ endpoint.Default output is human-readable markdown with only key fields. Use --raw to get full JSON with all fields.
books --title performs a case-insensitive substring match and often returns multiple books with the same title. Readwise creates separate book entries per source (Kindle, API, supplemental, etc.), so duplicates are common. When multiple results come back, review them all and use judgement to determine whether they are duplicates of the same work or entirely separate books:
num_highlights is usually the primary one.... books --title "book name"... highlights list --book-id <id>... books --title "when breath becomes air"id from the output.... highlight create --text "the verbatim quote" --book-id <id>
The CLI looks up the book's title/author/category and injects them into the payload so the Readwise API matches the highlight to the correct book.
Only add --generated if the text is a summary or paraphrase, not a direct quote.Readwise groups highlights into "books" (sources) using (title, author, source_url). The API de-duplicates highlights by matching all four fields: (title, author, source_url, text)—including nulls.
Critical: All highlights from the same content—whether verbatim quotes or generated summaries—MUST use identical (title, author, source_url) values to be grouped together. Inconsistent attributes will scatter highlights across separate book entries.
--title, highlights go into a generic "Quotes" book--author, it stays blank (or uses the URL domain if source_url is set)--book-id when adding to an existing book—the CLI fetches and injects the correct title/author/source_urlAlways specify --category explicitly. The API defaults to articles if source_url is present, otherwise books—but these defaults often miscategorize content. Valid categories: books, articles, tweets, podcasts.
| Content type | Category |
|---|---|
| Physical/ebook | books |
| Blog post, web article | articles |
| Tweet/X post | tweets |
| Podcast episode | podcasts |
| YouTube video | podcasts |
YouTube videos should use podcasts, not articles. Readwise treats video content as podcast-like (time-based, spoken word). Using articles will cause display and organizational issues.
Mismatched categories create duplicate book entries and break the user's library organization. When in doubt, ask the user or check existing entries with books --title.
>).--generated ONLY for highlights that are NOT verbatim quotes from the source content—e.g., AI-generated summaries, paraphrases, or synthesized insights. Do NOT use it for actual quotes or excerpts copied directly from the text. The CLI injects .generated for discoverability and sets location_type=none since generated content has no source location. Generated highlights should still use the SAME (title, author, source_url) as verbatim highlights from the same source.--text, --text-file, or pipe content via stdin. The CLI refuses to guess. Bulk imports accept NDJSON rows with text, title, and tags.--location unless you can provide an absolute, client-agnostic reference (page number, character offset). When --location is omitted the payload leaves location blank so Readwise can reconcile it later. Valid --location-type values: page (books), time_offset (podcasts/videos), order (articles). For generated quotes the CLI defaults to location_type=none.--dry-run to print the exact payload without calling the API. Dry-run output always shows the full payload (no field filtering).${CLAUDE_PLUGIN_ROOT}/skills/readwise/scripts/readwise_client.py: full-featured CLI covering highlight create/read/update, daily review, and books list/detail. Commands surface remaining rate-limit headers when provided so agents can throttle work.${CLAUDE_PLUGIN_ROOT}/readwise_common/ (auth, HTTP retries, tag/location utilities); import from there when extending functionality to keep behavior consistent.uv run --project ${CLAUDE_PLUGIN_ROOT} python -m compileall ${CLAUDE_PLUGIN_ROOT}/skills/readwise ${CLAUDE_PLUGIN_ROOT}/readwise_common before shipping changes to catch syntax issues.READWISE_TOKEN and exercise --dry-run highlight create, highlights list, and highlights review against a small limit to verify pagination + rate-limit logging.