[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6DG1F02EEEJ2SWA9TENM224":3,"skill-same:01M6DG1F02EEEJ2SWA9TENM224":88},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":33,"linkOnly":34,"markdownContent":35,"markdownBody":36,"frontMatter":37,"refName":38,"commitSha":39,"skillDirectory":40,"forksCount":13,"repositoryHtmlUrl":41,"repositoryHomepageUrl":6,"ownerHtmlUrl":42,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":43,"install":44,"resources":57},"01M6DG1F02EEEJ2SWA9TENM224","add-pdf-reader",null,"Add PDF reading to NanoClaw agents. Extracts text from PDFs via pdftotext CLI. Handles WhatsApp attachments, URLs, and local files.","mbaker95\u002Fnanodex","mbaker95","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F11398294?v=4","01M6DFXVNAJHZG78Y2D700Y6V3","01M6DFXVTTW83QGKTJ9FJ5YCH5",0,"MIT","https:\u002F\u002Fgithub.com\u002Fmbaker95\u002Fnanodex\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fadd-pdf-reader\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000002","文档处理","SCENARIO","使用场景",[23,24,25,26,27,28,29,30,31,32],"PDF","reader","pdf reader","add pdf reader","cli","whatsapp","attachments","text","files","local","2026-11-10 10:12:30",false,"---\nname: add-pdf-reader\ndescription: Add PDF reading to NanoClaw agents. Extracts text from PDFs via pdftotext CLI. Handles WhatsApp attachments, URLs, and local files.\n---\n\n# Add PDF Reader\n\nAdds PDF reading capability to all container agents using poppler-utils (pdftotext\u002Fpdfinfo). PDFs sent as WhatsApp attachments are auto-downloaded to the group workspace.\n\n## Phase 1: Pre-flight\n\n1. Check if `container\u002Fskills\u002Fpdf-reader\u002Fpdf-reader` exists — skip to Phase 3 if already applied\n2. Confirm WhatsApp is installed first (`skill\u002Fwhatsapp` merged). This skill modifies WhatsApp channel files.\n\n## Phase 2: Apply Code Changes\n\n### Ensure WhatsApp fork remote\n\n```bash\ngit remote -v\n```\n\nIf `whatsapp` is missing, add it:\n\n```bash\ngit remote add whatsapp https:\u002F\u002Fgithub.com\u002Fqwibitai\u002Fnanoclaw-whatsapp.git\n```\n\n### Merge the skill branch\n\n```bash\ngit fetch whatsapp skill\u002Fpdf-reader\ngit merge whatsapp\u002Fskill\u002Fpdf-reader\n```\n\nThis merges in:\n- `container\u002Fskills\u002Fpdf-reader\u002FSKILL.md` (agent-facing documentation)\n- `container\u002Fskills\u002Fpdf-reader\u002Fpdf-reader` (CLI script)\n- `poppler-utils` in `container\u002FDockerfile`\n- PDF attachment download in `src\u002Fchannels\u002Fwhatsapp.ts`\n- PDF tests in `src\u002Fchannels\u002Fwhatsapp.test.ts`\n\nIf the merge reports conflicts, resolve them by reading the conflicted files and understanding the intent of both sides.\n\n### Validate\n\n```bash\nnpm run build\nnpx vitest run src\u002Fchannels\u002Fwhatsapp.test.ts\n```\n\n### Rebuild container\n\n```bash\n.\u002Fcontainer\u002Fbuild.sh\n```\n\n### Restart service\n\n```bash\nlaunchctl kickstart -k gui\u002F$(id -u)\u002Fcom.nanoclaw  # macOS\n# Linux: systemctl --user restart nanoclaw\n```\n\n## Phase 3: Verify\n\n### Test PDF extraction\n\nSend a PDF file in any registered WhatsApp chat. The agent should:\n1. Download the PDF to `attachments\u002F`\n2. Respond acknowledging the PDF\n3. Be able to extract text when asked\n\n### Test URL fetching\n\nAsk the agent to read a PDF from a URL. It should use `pdf-reader fetch \u003Curl>`.\n\n### Check logs if needed\n\n```bash\ntail -f logs\u002Fnanoclaw.log | grep -i pdf\n```\n\nLook for:\n- `Downloaded PDF attachment` — successful download\n- `Failed to download PDF attachment` — media download issue\n\n## Troubleshooting\n\n### Agent says pdf-reader command not found\n\nContainer needs rebuilding. Run `.\u002Fcontainer\u002Fbuild.sh` and restart the service.\n\n### PDF text extraction is empty\n\nThe PDF may be scanned (image-based). pdftotext only handles text-based PDFs. Consider using the agent-browser to open the PDF visually instead.\n\n### WhatsApp PDF not detected\n\nVerify the message has `documentMessage` with `mimetype: application\u002Fpdf`. Some file-sharing apps send PDFs as generic files without the correct mimetype.\n","# Add PDF Reader\n\nAdds PDF reading capability to all container agents using poppler-utils (pdftotext\u002Fpdfinfo). PDFs sent as WhatsApp attachments are auto-downloaded to the group workspace.\n\n## Phase 1: Pre-flight\n\n1. Check if `container\u002Fskills\u002Fpdf-reader\u002Fpdf-reader` exists — skip to Phase 3 if already applied\n2. Confirm WhatsApp is installed first (`skill\u002Fwhatsapp` merged). This skill modifies WhatsApp channel files.\n\n## Phase 2: Apply Code Changes\n\n### Ensure WhatsApp fork remote\n\n```bash\ngit remote -v\n```\n\nIf `whatsapp` is missing, add it:\n\n```bash\ngit remote add whatsapp https:\u002F\u002Fgithub.com\u002Fqwibitai\u002Fnanoclaw-whatsapp.git\n```\n\n### Merge the skill branch\n\n```bash\ngit fetch whatsapp skill\u002Fpdf-reader\ngit merge whatsapp\u002Fskill\u002Fpdf-reader\n```\n\nThis merges in:\n- `container\u002Fskills\u002Fpdf-reader\u002FSKILL.md` (agent-facing documentation)\n- `container\u002Fskills\u002Fpdf-reader\u002Fpdf-reader` (CLI script)\n- `poppler-utils` in `container\u002FDockerfile`\n- PDF attachment download in `src\u002Fchannels\u002Fwhatsapp.ts`\n- PDF tests in `src\u002Fchannels\u002Fwhatsapp.test.ts`\n\nIf the merge reports conflicts, resolve them by reading the conflicted files and understanding the intent of both sides.\n\n### Validate\n\n```bash\nnpm run build\nnpx vitest run src\u002Fchannels\u002Fwhatsapp.test.ts\n```\n\n### Rebuild container\n\n```bash\n.\u002Fcontainer\u002Fbuild.sh\n```\n\n### Restart service\n\n```bash\nlaunchctl kickstart -k gui\u002F$(id -u)\u002Fcom.nanoclaw  # macOS\n# Linux: systemctl --user restart nanoclaw\n```\n\n## Phase 3: Verify\n\n### Test PDF extraction\n\nSend a PDF file in any registered WhatsApp chat. The agent should:\n1. Download the PDF to `attachments\u002F`\n2. Respond acknowledging the PDF\n3. Be able to extract text when asked\n\n### Test URL fetching\n\nAsk the agent to read a PDF from a URL. It should use `pdf-reader fetch \u003Curl>`.\n\n### Check logs if needed\n\n```bash\ntail -f logs\u002Fnanoclaw.log | grep -i pdf\n```\n\nLook for:\n- `Downloaded PDF attachment` — successful download\n- `Failed to download PDF attachment` — media download issue\n\n## Troubleshooting\n\n### Agent says pdf-reader command not found\n\nContainer needs rebuilding. Run `.\u002Fcontainer\u002Fbuild.sh` and restart the service.\n\n### PDF text extraction is empty\n\nThe PDF may be scanned (image-based). pdftotext only handles text-based PDFs. Consider using the agent-browser to open the PDF visually instead.\n\n### WhatsApp PDF not detected\n\nVerify the message has `documentMessage` with `mimetype: application\u002Fpdf`. Some file-sharing apps send PDFs as generic files without the correct mimetype.\n",{"name":5,"description":7},"main","b6b2f4d4a0c7243409d1684119a6772629bfeba6",".claude\u002Fskills\u002Fadd-pdf-reader","https:\u002F\u002Fgithub.com\u002Fmbaker95\u002Fnanodex","https:\u002F\u002Fgithub.com\u002Fmbaker95","2026-03-12 23:02:12",{"source":8,"skillName":5,"commands":45,"prompt":55,"zipAvailable":56},[46,49,52],{"tool":47,"command":48},"npx","npx skills add mbaker95\u002Fnanodex --skill add-pdf-reader",{"tool":50,"command":51},"bunx","bunx skills add mbaker95\u002Fnanodex --skill add-pdf-reader",{"tool":53,"command":54},"pnpm","pnpm dlx skills add mbaker95\u002Fnanodex --skill add-pdf-reader","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmbaker95\u002Fnanodex\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fadd-pdf-reader\u002FSKILL.md",true,[58,64,68,72,76,80,84],{"path":59,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":62,"sourceHtmlUrl":63},"components\u002F21st-community.md","REFERENCE","参考文档",7269,"https:\u002F\u002Fgithub.com\u002Fyqecea\u002Fgem-swarm\u002Fblob\u002Fmain\u002Fsrc\u002Fskills\u002Fdomain\u002Fdesign-taste\u002Fcomponents\u002F21st-community.md",{"path":65,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":66,"sourceHtmlUrl":67},"components\u002Faceternity-ui.md",16738,"https:\u002F\u002Fgithub.com\u002Fyqecea\u002Fgem-swarm\u002Fblob\u002Fmain\u002Fsrc\u002Fskills\u002Fdomain\u002Fdesign-taste\u002Fcomponents\u002Faceternity-ui.md",{"path":69,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":70,"sourceHtmlUrl":71},"components\u002Fgsap-explore.md",17624,"https:\u002F\u002Fgithub.com\u002Fyqecea\u002Fgem-swarm\u002Fblob\u002Fmain\u002Fsrc\u002Fskills\u002Fdomain\u002Fdesign-taste\u002Fcomponents\u002Fgsap-explore.md",{"path":73,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":74,"sourceHtmlUrl":75},"components\u002Freactbits.md",27680,"https:\u002F\u002Fgithub.com\u002Fyqecea\u002Fgem-swarm\u002Fblob\u002Fmain\u002Fsrc\u002Fskills\u002Fdomain\u002Fdesign-taste\u002Fcomponents\u002Freactbits.md",{"path":77,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":78,"sourceHtmlUrl":79},"components\u002FREADME.md",1959,"https:\u002F\u002Fgithub.com\u002Fyqecea\u002Fgem-swarm\u002Fblob\u002Fmain\u002Fsrc\u002Fskills\u002Fdomain\u002Fdesign-taste\u002Fcomponents\u002FREADME.md",{"path":81,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":82,"sourceHtmlUrl":83},"components\u002Fstyle-recipes.md",10099,"https:\u002F\u002Fgithub.com\u002Fyqecea\u002Fgem-swarm\u002Fblob\u002Fmain\u002Fsrc\u002Fskills\u002Fdomain\u002Fdesign-taste\u002Fcomponents\u002Fstyle-recipes.md",{"path":85,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":86,"sourceHtmlUrl":87},"README.md",1547,"https:\u002F\u002Fgithub.com\u002Fyqecea\u002Fgem-swarm\u002Fblob\u002Fmain\u002Fsrc\u002Fskills\u002Fdomain\u002Fdesign-taste\u002FREADME.md",[89,118,137,158,170,182],{"skillNo":90,"name":91,"nameZh":6,"description":92,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":93,"categories":94,"keywords":98,"publishedAt":33},"01M6DG2XYNH5XV7XGTJJ1SF0TG","agent-browser","Browse the web for any task — research topics, read articles, interact with web apps, fill forms, take screenshots, extract data, and test web pages. Use whenever a browser would be useful, not just when the user explicitly asks.","https:\u002F\u002Fgithub.com\u002Fmbaker95\u002Fnanodex\u002Fblob\u002Fmain\u002Fcontainer\u002Fskills\u002Fagent-browser\u002FSKILL.md",[95],{"categoryNo":96,"categoryName":97,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",[99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117],"agent browser","browser","pages","forms","task","test web","take","use","extract","data","user","read","screenshots","research","test","web","just","Bash","browse",{"skillNo":119,"name":120,"nameZh":6,"description":121,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":122,"categories":123,"keywords":127,"publishedAt":33},"01M6DG2TPZAT3SMWSYFJ3K82TE","x-integration","X (Twitter) integration for NanoClaw. Post tweets, like, reply, retweet, and quote. Use for setup, testing, or troubleshooting X functionality. Triggers on \"setup x\", \"x integration\", \"twitter\", \"post tweet\", \"tweet\".","https:\u002F\u002Fgithub.com\u002Fmbaker95\u002Fnanodex\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fx-integration\u002FSKILL.md",[124],{"categoryNo":125,"categoryName":126,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000008","测试与质量",[128,129,106,130,131,132,133,134,135,136],"x integration","integration","testing","setup","troubleshooting","twitter","reply","quote","triggers",{"skillNo":138,"name":139,"nameZh":6,"description":140,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":141,"categories":142,"keywords":143,"publishedAt":33},"01M6DG2Q4BJQ046BZSR9N7GZ72","use-local-whisper","Use when the user wants local voice transcription instead of OpenAI Whisper API. Switches to whisper.cpp running on Apple Silicon. WhatsApp only for now. Requires voice-transcription skill to be applied first.","https:\u002F\u002Fgithub.com\u002Fmbaker95\u002Fnanodex\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fuse-local-whisper\u002FSKILL.md",[],[144,145,106,32,146,147,148,149,109,150,151,152,153,154,155,156,157,28],"whisper","local whisper","use local whisper","apple","openai whisper","only","voice","apple silicon","api","first","openai","cpp","transcription","openai whisper api",{"skillNo":159,"name":160,"nameZh":6,"description":161,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":162,"categories":163,"keywords":164,"publishedAt":33},"01M6DG2N2Z1V8VV4MQFRKFAQV0","update-skills","Check for and apply updates to installed skill branches from upstream.","https:\u002F\u002Fgithub.com\u002Fmbaker95\u002Fnanodex\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fupdate-skills\u002FSKILL.md",[],[165,166,167,168,169],"update","update skills","upstream","branches","check",{"skillNo":171,"name":172,"nameZh":6,"description":173,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":174,"categories":175,"keywords":176,"publishedAt":33},"01M6DG2J5D7Y3R2BF8V87XZAXF","update-nanoclaw","Efficiently bring upstream NanoClaw updates into a customized install, with preview, selective cherry-pick, and low token usage.","https:\u002F\u002Fgithub.com\u002Fmbaker95\u002Fnanodex\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fupdate-nanoclaw\u002FSKILL.md",[],[165,177,178,179,167,180,181],"update nanoclaw","install","pick","token","preview",{"skillNo":183,"name":131,"nameZh":6,"description":184,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":185,"categories":186,"keywords":187,"publishedAt":33},"01M6DG2FN7S7DVD337CNT5Y67D","Run initial NanoClaw setup. Use when user wants to install dependencies, authenticate messaging channels, register their main channel, or start the background services. Triggers on \"setup\", \"install\", \"configure nanoclaw\", or first-time setup requests.","https:\u002F\u002Fgithub.com\u002Fmbaker95\u002Fnanodex\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fsetup\u002FSKILL.md",[],[131,178,136,188,189,38,106,190,109,191,153,192,193,194,195],"time","dependencies","channel","configure","services","start","messaging","run"]