← Back to Skills Marketplace
vinxu

Castreader Openclaw Skill

by vinxu · GitHub ↗ · v3.2.14 · MIT-0
darwinlinuxwin32 ⚠ suspicious
594
Downloads
1
Stars
1
Active Installs
35
Versions
Install in OpenClaw
/install castreader
Description
URL to audio: extract any web page and convert to natural AI speech (Kokoro TTS). The only skill that turns a URL into a podcast-quality MP3 — no API key nee...
README (SKILL.md)

CastReader — Read Web Pages & Books Aloud

Setup (once per session)

cd \x3Cskill-directory> && npm install

How to find target (chatId)

User messages look like: [Telegram username id:8716240840 ...] The number after id: is the target. You MUST use this number in every message tool call. Example: target is "8716240840".


Mode A: When user sends a URL

Step 1: Extract article

node scripts/read-url.js "\x3Curl>" 0

Returns: { title, language, totalParagraphs, totalCharacters, paragraphs[] }

Step 2: Show info + ask user to choose

Reply with this text:

📖 {title}
🌐 {language} · 📝 {totalParagraphs} paragraphs · 📊 {totalCharacters} chars

📋 Summary:
{write 2-3 sentence summary from paragraphs}

Reply a number to choose:
1️⃣ Listen to full article (~{totalCharacters} chars, ~{Math.ceil(totalCharacters / 200)} sec to generate)
2️⃣ Listen to summary only (~{summary_char_count} chars, ~{Math.ceil(summary_char_count / 200)} sec to generate)

STOP. Wait for user to reply 1 or 2.

Step 3a: User chose 1 (full article)

Reply: 🎙️ Generating full audio (~{totalCharacters} chars, ~{Math.ceil(totalCharacters / 200)} seconds)...

node scripts/read-url.js "\x3Curl>" all

Then send the audio file using the message tool:

{"action":"send", "target":"\x3CchatId>", "channel":"telegram", "filePath":"\x3CaudioFile>", "caption":"🔊 {title}"}

Reply: ✅ Done!

Step 3b: User chose 2 (summary only)

Reply: 🎙️ Generating summary audio...

Save the SAME summary text you showed in Step 2 to a file and generate:

echo "\x3Csummary text>" > /tmp/castreader-summary.txt
node scripts/generate-text.js /tmp/castreader-summary.txt \x3Clanguage>

Then send the audio file using the message tool:

{"action":"send", "target":"\x3CchatId>", "channel":"telegram", "filePath":"/tmp/castreader-summary.mp3", "caption":"📋 Summary: {title}"}

Reply: ✅ Done!


Mode B: When user asks to read a book (微信读书 / Kindle)

Books are synced from WeChat Reading or Kindle to ~/castreader-library/books/. Each book is stored in a folder like 书名-hashid (e.g. 儒林外史-dc532c705c6d3edc5503acc).

⚠️ CRITICAL: You MUST use sync-books.js --list to get the exact book folder ID. NEVER guess or construct the folder path yourself. The folder name includes a title prefix that you cannot predict.

Step 1: List available books

node scripts/sync-books.js --list

Returns: { books: [{ id, title, author, language, totalChapters, totalCharacters, source, syncedAt }] }

The id field is the exact folder name you must use in all subsequent commands. Example: "儒林外史-dc532c705c6d3edc5503acc".

Step 2: Show book list and let user choose

Reply with the book list:

📚 Your synced books:

1. 📖 {title} — {author}
   🌐 {language} · 📑 {totalChapters} chapters · 📊 {totalCharacters} chars · 📱 {source}

2. ...

Reply the number of the book you want to read.

STOP. Wait for user to choose a book.

Step 3: Show chapter list and let user choose

node scripts/sync-books.js --book "\x3Cid>"

Use the exact id from Step 1 output. Returns the book content with chapter list.

Reply:

📖 {title} — {author}
📑 {totalChapters} chapters · 📊 {totalCharacters} chars

📋 Chapters:
1. {chapter 1 title}
2. {chapter 2 title}
...

Reply a number to listen to a chapter, or "all" to listen to the full book.

STOP. Wait for user to choose.

Step 4a: User chose a chapter number

node scripts/sync-books.js --book "\x3Cid>" --chapter \x3Cnum> --audio

Returns: { title, audioFile, fileSizeBytes }

Send the audio:

{"action":"send", "target":"\x3CchatId>", "channel":"telegram", "filePath":"\x3CaudioFile>", "caption":"🔊 {bookTitle} — Chapter {num}"}

Step 4b: User chose "all" (full book)

node scripts/sync-books.js --book "\x3Cid>" --audio

Returns: { title, audioFile, fileSizeBytes }

Send the audio:

{"action":"send", "target":"\x3CchatId>", "channel":"telegram", "filePath":"\x3CaudioFile>", "caption":"🔊 {bookTitle} (full)"}

Reading a chapter as text (no audio)

If the user wants to read (not listen), use without --audio:

node scripts/sync-books.js --book "\x3Cid>" --chapter \x3Cnum>

Returns: { title, author, language, chapter: { number, title, text }, totalChapters }


Rules

  • ALWAYS extract first (index=0 for URLs, --list for books), show info, wait for user choice. Never skip.
  • ALWAYS send audio files using the message tool with target (numeric chatId) and channel ("telegram"). Never just print the file path.
  • For books: ALWAYS run --list first and use the exact id from the output. NEVER construct book paths manually or use partial IDs.
  • Do NOT use built-in TTS tools. ONLY use read-url.js, generate-text.js, and sync-books.js.
  • Do NOT use web_fetch. ONLY use read-url.js.
  • Do NOT use the read tool to directly access files in ~/castreader-library/. ONLY use sync-books.js.
Usage Guidance
What to consider before installing: - Network & privacy: The skill extracts webpage text and book files and sends that text to an external TTS API (default https://api.castreader.ai). If pages or books contain sensitive data, do not use the online TTS mode. The API key is optional; if you set CASTREADER_API_KEY it will be included in requests to the API. - Install footprint: You must run `npm install` in the skill folder. That will install Puppeteer and many npm packages and will download a Chromium binary — expect a large download and extra disk space. Prefer running in a sandbox, container, or VM if you are cautious. - Local file access: The skill will read from ~/castreader-library/books/ for synced books. Ensure only intended files are stored there before using the book features. - Code review & testing: If you want to be extra safe, inspect the included scripts (they are present) and test extraction-only mode (run `node scripts/read-url.js <url> 0`) offline to verify extraction behavior without generating TTS. You can also run `npm install --no-audit` in an isolated environment and monitor network traffic. - Metadata mismatch: The registry metadata didn't declare the environment variables the scripts use — be aware and set/omit CASTREADER_API_KEY and CASTREADER_API_URL intentionally. If these observations are acceptable, the skill appears to do what it claims. If not, consider an offline/local TTS alternative or running the tool in an isolated environment.
Capability Analysis
Type: OpenClaw Skill Name: castreader Version: 3.2.14 The CastReader skill is a comprehensive web extraction and text-to-speech tool. It uses Puppeteer (scripts/extract.js) to scrape content and communicates with a dedicated TTS API (api.castreader.ai) to generate audio. The complex logic in dist/extractor-bundle.js includes specialized parsers for platforms like Kindle, WeChat Reading, and various AI chat interfaces, all of which align with the stated purpose of converting web pages and books to audio. No evidence of data exfiltration, malicious command execution, or harmful prompt injection was found.
Capability Assessment
Purpose & Capability
The skill is a URL/book-to-audio tool and its code (extractor bundle, puppeteer-based extraction, and TTS calls) matches that purpose. It also reads a local library directory (~/castreader-library/books/) for synced books — this is consistent with the 'read books' capability. Small mismatch: the SKILL metadata does not list environment variables (CASTREADER_API_URL/VOICE/API_KEY) even though the scripts use them; README documents them.
Instruction Scope
SKILL.md instructs the agent to run npm install and then use the provided node scripts only. Those scripts (extract/read-url/sync-books/generate-text) perform web browsing via Puppeteer, inject extractor-bundle.js into target pages, read/write files under /tmp and the user's home castreader-library, and POST extracted text to an external TTS endpoint (default https://api.castreader.ai). All of these actions are within the stated scope, but they do involve sending extracted webpage/book text off-host (privacy consideration).
Install Mechanism
There is no automated install spec in the registry, but SKILL.md insists on running `npm install` in the skill directory. package.json depends on puppeteer, which will fetch many npm packages and download a Chromium binary during install — a moderate-risk, high-footprint operation. The packages come from the npm registry (no obscure URLs), but you should expect a substantial download and native resource use.
Credentials
The skill does not declare required env vars in registry metadata, but the code reads optional environment variables: CASTREADER_API_URL, CASTREADER_API_KEY, CASTREADER_VOICE, CASTREADER_SPEED. Using an API_KEY (if provided) would send that secret to the TTS API on requests. The scripts also read files under the user's home directory (~/castreader-library/books/) — appropriate for reading synced books but potentially sensitive. Overall the requested/used env and filesystem access are explainable for the feature set but the registry metadata omission and the fact that extracted text is posted to an external API are notable concerns.
Persistence & Privilege
The skill does not request 'always: true', does not modify other skills or system settings, and does not persist agent-wide configuration. It runs as-invoked (node scripts) and does not request elevated privileges beyond normal filesystem and network access for the current user.
How to Use
  1. Make sure OpenClaw is installed (local or Docker)
  2. Run the install command in chat: /install castreader
  3. After installation, invoke the skill by name or use /castreader
  4. Provide required inputs per the skill's parameter spec and get structured output
Version History
v3.2.14
Improve README: clearer value prop, remove deleted scripts, fix links, optimize SKILL.md for search
v3.2.13
Security improvements: switch to HTTPS API, remove Chrome sandbox bypass, remove unused scripts, clean up setup command
v3.2.12
Fix book path resolution: add sync-books.js script so LLM agents use exact folder IDs from --list instead of guessing paths. Fixes ENOENT when title prefix missing from book directory name.
v3.2.11
castreader 3.2.11 - Updated scripts/generate-text.js (details of the change not specified) - No user-facing feature or documentation changes documented in SKILL.md - All rules and user guidance remain unchanged
v3.2.10
castreader 3.2.10 - Documentation improved in SKILL.md: now specifies that when using Kindle login with email/password, the previous script must fully exit before starting a new one, to avoid Chrome profile conflicts. - Added guidance to reliably extract email (contains "@") and password from user's message. - No code changes—documentation update only.
v3.2.9
CastReader 3.2.9 - Updated scripts/sync-books.js with unspecified changes. - No changes to user-facing documentation or core usage instructions. - No visible SKILL.md modifications for this release. - Functionality improvements or fixes may be included in the updated script.
v3.2.8
## CastReader 3.2.8 Changelog - Updated the sync-books.js script. - No user-facing or documentation changes in the SKILL.md. - Bug fixes or improvements likely applied internally within sync-books.js.
v3.2.7
No visible changes in this release (3.2.7). - No files were changed compared to the previous version. - Functionality and documentation remain the same.
v3.2.6
- Expanded Kindle login options: users can now provide their Amazon email and password to log in automatically if preferred. - Added 2FA handling for Kindle: if verification is required, sends a screenshot and prompts user for the code. - Clarified messaging instructions for handling Kindle and WeRead login events. - Updated operational steps for syncing books to reflect new authentication flows.
v3.2.5
Version 3.2.5 - Improved handling of sync-books.js output: now processes multiple JSON lines, supports QR image events, and sends WeRead QR codes via message tool for easier phone scanning. - SKILL.md updated to clarify: always send WeRead QR image to the user (not just instructions), and handle all listed sync-books.js JSON events explicitly.
v3.2.4
CastReader 3.2.4 - Updated scripts/sync-books.js with improvements (exact details not specified). - No documentation or user-facing changes noted in SKILL.md. - All core features and flow remain consistent with prior version.
v3.2.3
castreader 3.2.3 - Updated scripts/sync-books.js. - No user-facing changes documented. - No changes to SKILL.md or user instructions.
v3.2.2
- Updated sync/login instructions to use only the sync-books.js script for login and book listing, removing manual login and polling requirements. - Simplified the book synchronization flow: sync-books.js now handles login automatically and waits for user login if needed. - Clarified user messaging: always instruct users to log in via the computer browser if prompted, and retry sync automatically once on failure. - Deprecated use of sync-login.js and any polling or screenshot-based login flows. - Updated rules and guidance sections to reflect the streamlined login and sync flow.
v3.2.1
Fix Kindle sync Phase 3 hang (bypass sync server, direct filesystem save). Add PaddleOCR cross-platform fallback for Windows. Fix WeRead login navigation error.
v3.2.0
Kindle sync 7x faster: large viewport (4x fewer pages) + 8x parallel Apple Vision OCR pipeline. WeRead login navigation fix.
v3.1.5
Passive collector: Puppeteer drives flips for 3x speedup
v3.1.4
External flip for Kindle isTrusted fix + real-time needsFlip polling
v3.1.3
- Library now defaults to safe empty state if not present, avoiding errors on first run. - Manual login is always checked before listing books, even if the user logged in previously. - Improved login instructions and flow—users are always prompted to log in first and receive clear next steps. - Removed 60 localization files and related Chrome extension resources. - Updated documentation to clarify the sync sequence, error handling, and guidance for connecting Kindle/WeRead accounts.
v3.1.2
CastReader 3.1.2 - Version bumped to 3.1.2. - Minor documentation or metadata updates in SKILL.md. - No major user-facing changes.
v3.1.1
v3.1.1: Explain WHY before asking user to act — DRM login reason, platform-specific messages
Metadata
Slug castreader
Version 3.2.14
License MIT-0
All-time Installs 1
Active Installs 1
Total Versions 35
Frequently Asked Questions

What is Castreader Openclaw Skill?

URL to audio: extract any web page and convert to natural AI speech (Kokoro TTS). The only skill that turns a URL into a podcast-quality MP3 — no API key nee... It is an AI Agent Skill for Claude Code / OpenClaw, with 594 downloads so far.

How do I install Castreader Openclaw Skill?

Run "/install castreader" in the OpenClaw or Claude Code chat to install it in one step — no extra setup required.

Is Castreader Openclaw Skill free?

Yes, Castreader Openclaw Skill is completely free, licensed under MIT-0. You can download, install and use it at no cost.

Which platforms does Castreader Openclaw Skill support?

Castreader Openclaw Skill is cross-platform and runs anywhere OpenClaw / Claude Code is available (darwin, linux, win32).

Who created Castreader Openclaw Skill?

It is built and maintained by vinxu (@vinxu); the current version is v3.2.14.

💬 Comments