{"id":"8360072f-41f5-4550-8d32-ab02e7ccbb20","shortId":"Nf4TKk","kind":"skill","title":"tapestry","tagline":"AI-native web intelligence workflow for crawling, organizing, and synthesizing web content from multiple platforms (Zhihu, Reddit, HN, X/Twitter, Xiaohongshu, Weibo). Use when users share URLs, want to archive web content, build knowledge bases, or analyze online discussions.","description":"# 🧵 Tapestry\n\n**AI-Native Web Intelligence Workflow**\n\nTapestry is a complete workflow for turning scattered web content into organized, searchable knowledge. It handles everything from crawling to synthesis across multiple platforms.\n\n## When to Use Tapestry\n\nUse this skill when the user:\n- Shares URLs to ingest (from Zhihu, Reddit, HN, X/Twitter, Xiaohongshu, Weibo, or any webpage)\n- Wants to archive or capture web content\n- Asks to organize content into a knowledge base\n- Wants structured feeds or analysis of web content\n- Needs to visualize their knowledge base\n- Wants to manage RSS/Atom feed subscriptions (list, add, remove sources)\n- Wants to refresh or fetch the latest content from subscribed sources\n\n## Workflow Overview\n\nTapestry has eight internal sub-skills that work together:\n\n1. **Init Deps Install** (`init-deps-install/SKILL.md`) - Auto-triggered dependency installation (Phase 0: setup)\n2. **Ingest** (`ingest/SKILL.md`) - Crawl and capture URLs (Phase 1: deterministic)\n3. **Synthesis** (`synthesis/SKILL.md`) - Analyze and organize into knowledge base (Phase 2: AI-driven)\n4. **Feed** (`feed/SKILL.md`) - Generate structured, source-aware feeds\n5. **Display** (`display/SKILL.md`) - Visualize the knowledge base as a website\n6. **Visual Card** (`visual-card/SKILL.md`) - Generate visual note cards from KB content\n7. **Subscriptions** (`subscriptions/SKILL.md`) - Manage RSS/Atom sources and refresh them into the knowledge base\n8. **Export** (`export/SKILL.md`) - Export KB content to PDF, Markdown, or HTML files saved under `_data/exports/`\n\n### Two-Phase Architecture\n\nTapestry uses a two-phase design with automatic dependency setup:\n\n**Phase 0 (Init)**: Auto-triggered dependency installation when first launched or dependencies missing\n**Phase 1 (Ingest)**: Deterministic extraction → `_data/notes/YYYY/MM/` (date-organized)\n**Phase 2 (Synthesis)**: AI-driven analysis → `_data/books/{topic}/{chapter}/` (book-organized)\n\nBy default, synthesis runs automatically after each ingest (`synthesis.mode: \"auto\"` in `tapestry.config.json`). You can configure this to \"manual\" or \"batch\" mode.\n\n## How to Use This Skill\n\n### Step 1: Understand the User's Intent\n\nAnalyze what the user wants:\n- **Just capture?** → Use ingest only (set synthesis mode to \"manual\" if needed)\n- **Structured feed?** → Use ingest + feed\n- **Analysis/organization?** → Use ingest + synthesis (default with \"auto\" mode)\n- **Browse knowledge base?** → Use display\n- **Visual summary?** → Use visual-card to generate infographic cards\n- **Complete workflow?** → Ingest automatically triggers synthesis in \"auto\" mode\n- **Manage subscriptions?** → Use subscriptions (list/add/remove sources)\n- **Refresh subscribed feeds?** → Use subscriptions fetch → ingest → synthesis pipeline\n\n### Step 2: Execute the Appropriate Sub-Skill(s)\n\nRead and follow the instructions in the relevant sub-skill SKILL.md files:\n\n#### For Dependency Installation (Auto-Triggered)\n\nRead the file `init-deps-install/SKILL.md` to understand the detection and installation workflow.\nAll installation steps require explicit user confirmation before execution.\n\n#### For URL Ingestion\n\nRead the file `ingest/SKILL.md`, then follow the workflow described there.\n\n#### For Structured Feeds\n\nRead the file `feed/SKILL.md`, then follow the workflow described there.\n\n#### For Synthesis & Knowledge Base\n\nRead the file `synthesis/SKILL.md`, then follow the workflow described there.\n\n#### For Visualization\n\nRead the file `display/SKILL.md`, then follow the workflow described there.\n\n#### For Visual Cards\n\nRead the file `visual-card/SKILL.md`, then follow the workflow described there.\n\n#### For Subscription Management & Feed Refresh\n\nRead the file `subscriptions/SKILL.md`, then follow the workflow described there.\n\n### Step 3: Chain Sub-Skills When Needed\n\nThe sub-skills reference each other. When one sub-skill says to \"route to\" another, read that sub-skill's SKILL.md and follow its instructions.\n\n## Supported Platforms\n\n- 🇨🇳 **Zhihu**: Questions, answers, articles, profiles\n- 🐦 **X/Twitter**: Posts, threads\n- 📱 **Xiaohongshu**: Notes, profiles\n- 🇨🇳 **Weibo**: Posts\n- 🔶 **Hacker News**: Discussions with full comment trees\n- 🤖 **Reddit**: Threads\n- 🌐 **Generic HTML**: Any webpage (fallback)\n\n## Key Principles\n\n1. **Read sub-skill instructions first**: Each sub-skill's SKILL.md contains detailed workflow steps\n2. **Follow the deterministic pipeline**: Ingest → Feed → Synthesis → Display\n3. **Respect user intent**: Don't over-process if they just want capture\n4. **Chain appropriately**: Let sub-skills hand off to each other as described in their instructions\n5. **Report clearly**: Tell the user what was done and where artifacts are stored\n\n## Directory Structure\n\n```\ntapestry/\n├── SKILL.md (this file)          # Main orchestrator\n├── init-deps-install/SKILL.md     # Dependency installation sub-skill\n├── ingest/SKILL.md                # URL crawling sub-skill\n├── feed/SKILL.md                  # Feed generation sub-skill\n├── synthesis/SKILL.md             # Analysis & KB sub-skill\n├── display/SKILL.md               # Visualization sub-skill\n├── visual-card/SKILL.md           # Visual card generation sub-skill\n├── subscriptions/SKILL.md         # RSS/Atom subscription management sub-skill\n├── _src/                          # Shared code (crawlers, parsers, storage)\n└── _tests/                        # Unit tests\n```\n\n## Example Usage Patterns\n\n### Pattern 1: Simple Capture\n```\nUser: \"Ingest this Zhihu answer: https://www.zhihu.com/question/123/answer/456\"\n\nAction:\n1. Read ingest/SKILL.md\n2. Follow its workflow to capture the URL\n3. Report the created artifacts\n```\n\n### Pattern 2: Structured Feed\n```\nUser: \"Give me a structured feed of this Reddit thread\"\n\nAction:\n1. Read ingest/SKILL.md and capture the URL\n2. Read feed/SKILL.md and generate the structured feed\n3. Present the feed to the user\n```\n\n### Pattern 3: Full Analysis (Default)\n```\nUser: \"Analyze this HN discussion and add it to my knowledge base\"\n\nAction:\n1. Read ingest/SKILL.md and capture the URL\n2. Synthesis runs automatically (default \"auto\" mode)\n3. Report where the content was organized in the KB\n```\n\n### Pattern 4: Manual Synthesis\n```\nUser: \"Just capture these URLs for now, I'll organize them later\"\n\nAction:\n1. Set synthesis mode to \"manual\" in tapestry.config.json\n2. Read ingest/SKILL.md and capture the URLs\n3. User can later run synthesis on selected URLs\n```\n\n### Pattern 4: Batch Processing\n```\nUser: \"Ingest these 5 URLs and organize them\"\n\nAction:\n1. Read ingest/SKILL.md and batch process all URLs\n2. With \"auto\" mode, synthesis runs for each URL automatically\n3. Summarize the results\n```\n\n### Pattern 5: Subscription Refresh\n```\nUser: \"Refresh all my subscribed feeds\"\n\nAction:\n1. Read subscriptions/SKILL.md\n2. Run: python subscriptions/_scripts/run.py fetch\n3. Collect the printed URLs\n4. Pass them to $tapestry-ingest for ingestion\n5. Let the synthesis pipeline run per config\n```\n\n### Pattern 6: Export KB Content\n```\nUser: \"Export the entire knowledge base as PDF\"\n\nAction:\n1. Read export/SKILL.md\n2. Run: python export/_scripts/export.py --format pdf --scope kb\n3. Report the output paths from _data/exports/pdf/\n```\n\n## Important Notes\n\n- **Always read the sub-skill SKILL.md files**: They contain the actual implementation details\n- **Don't invent workflows**: Follow what's written in the sub-skill instructions\n- **Preserve artifacts**: The pipeline creates `_data/captures/`, `_data/feeds/`, `_data/notes/`, `_data/books/`, and `_data/exports/`\n- **Respect the architecture**: Ingest is deterministic, synthesis is interpretive\n- **Check for errors**: Sub-skills may fail; handle gracefully and report to user\n\n## Resources\n\n- `_src/`: Shared Python code for crawlers, parsers, and storage\n- `_tests/`: Unit tests for the shared code\n- Each sub-skill has its own `_scripts/`, `_specs/`, or `_kb_rules/` directories\n\n---\n\n**Remember**: This main skill is an orchestrator. The real work happens in the sub-skills. Read their SKILL.md files and follow their instructions.","tags":["tapestry","natsufox","agent-skills","claude-code","codex","crawler","knowledge-base","openclaw","workflow"],"capabilities":["skill","source-natsufox","skill-tapestry","topic-agent-skills","topic-claude-code","topic-codex","topic-crawler","topic-knowledge-base","topic-openclaw","topic-workflow"],"categories":["Tapestry"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/NatsuFox/Tapestry/tapestry","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add NatsuFox/Tapestry","source_repo":"https://github.com/NatsuFox/Tapestry","install_from":"skills.sh"}},"qualityScore":"0.478","qualityRationale":"deterministic score 0.48 from registry signals: · indexed on github topic:agent-skills · 57 github stars · SKILL.md body (8,086 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-02T06:55:55.278Z","embedding":null,"createdAt":"2026-04-18T22:14:52.489Z","updatedAt":"2026-05-02T06:55:55.278Z","lastSeenAt":"2026-05-02T06:55:55.278Z","tsv":"'/question/123/answer/456':767 '/skill.md':166,224,448,526,698,730 '0':173,276 '1':158,183,290,338,615,757,769,800,840,881,918,951,995 '2':175,195,299,414,632,772,786,807,847,889,926,954,998 '3':185,549,641,780,815,823,854,896,936,959,1006 '4':199,655,865,906,964 '5':208,672,912,941,973 '6':218,982 '7':232 '8':245 'across':69 'action':768,799,839,880,917,950,994 'actual':1026 'add':132,833 'ai':3,43,197,302 'ai-driven':196,301 'ai-nat':2,42 'alway':1015 'analysi':115,304,717,825 'analysis/organization':366 'analyz':38,188,344,828 'anoth':572 'answer':588,764 'appropri':417,657 'architectur':263,1056 'archiv':31,98 'articl':589 'artifact':683,784,1044 'ask':103 'auto':168,279,320,372,396,439,852,928 'auto-trigg':167,278,438 'automat':272,315,392,850,935 'awar':206 'base':36,110,124,193,214,244,376,494,838,991 'batch':330,907,922 'book':309 'book-organ':308 'brows':374 'build':34 'captur':100,180,350,654,759,777,804,844,870,893 'card':220,223,228,384,388,519,525,729,732 'chain':550,656 'chapter':307 'check':1063 'clear':674 'code':746,1081,1093 'collect':960 'comment':604 'complet':51,389 'config':980 'configur':325 'confirm':462 'contain':628,1024 'content':14,33,57,102,106,118,142,231,250,858,985 'crawl':9,66,178,706 'crawler':747,1083 'creat':783,1047 'data/books':305,1051 'data/captures':1048 'data/exports':259,1053 'data/exports/pdf':1012 'data/feeds':1049 'data/notes':1050 'data/notes/yyyy/mm':294 'date':296 'date-organ':295 'default':312,370,826,851 'dep':160,164,446,696 'depend':170,273,281,287,436,699 'describ':476,489,503,515,531,546,668 'design':270 'detail':629,1028 'detect':452 'determinist':184,292,635,1059 'directori':686,1106 'discuss':40,601,831 'display':209,378,640 'display/skill.md':210,510,722 'done':680 'driven':198,303 'eight':150 'entir':989 'error':1065 'everyth':64 'exampl':753 'execut':415,464 'explicit':460 'export':246,248,983,987 'export/_scripts/export.py':1001 'export/skill.md':247,997 'extract':293 'fail':1070 'fallback':612 'feed':113,129,200,207,362,365,406,480,536,638,711,788,794,814,818,949 'feed/skill.md':201,484,710,809 'fetch':139,409,958 'file':256,434,443,470,483,497,509,522,540,691,1022,1126 'first':284,621 'follow':424,473,486,500,512,528,543,581,633,773,1033,1128 'format':1002 'full':603,824 'generat':202,225,386,712,733,811 'generic':608 'give':790 'grace':1072 'hacker':599 'hand':662 'handl':63,1071 'happen':1117 'hn':20,89,830 'html':255,609 'implement':1027 'import':1013 'infograph':387 'ingest':85,176,291,318,352,364,368,391,410,467,637,761,910,970,972,1057 'ingest/skill.md':177,471,704,771,802,842,891,920 'init':159,163,277,445,695 'init-deps-instal':162,444,694 'instal':161,165,171,282,437,447,454,457,697,700 'instruct':426,583,620,671,1042,1130 'intellig':6,46 'intent':343,644 'intern':151 'interpret':1062 'invent':1031 'kb':230,249,718,863,984,1005,1104 'key':613 'knowledg':35,61,109,123,192,213,243,375,493,837,990 'later':879,899 'latest':141 'launch':285 'let':658,974 'list':131 'list/add/remove':402 'll':876 'main':692,1109 'manag':127,235,398,535,740 'manual':328,358,866,886 'markdown':253 'may':1069 'miss':288 'mode':331,356,373,397,853,884,929 'multipl':16,70 'nativ':4,44 'need':119,360,555 'news':600 'note':227,595,1014 'one':564 'onlin':39 'orchestr':693,1113 'organ':10,59,105,190,297,310,860,877,915 'output':1009 'over-process':647 'overview':147 'parser':748,1084 'pass':965 'path':1010 'pattern':755,756,785,822,864,905,940,981 'pdf':252,993,1003 'per':979 'phase':172,182,194,262,269,275,289,298 'pipelin':412,636,977,1046 'platform':17,71,585 'post':592,598 'present':816 'preserv':1043 'principl':614 'print':962 'process':649,908,923 'profil':590,596 'python':956,1000,1080 'question':587 'read':422,441,468,481,495,507,520,538,573,616,770,801,808,841,890,919,952,996,1016,1123 'real':1115 'reddit':19,88,606,797 'refer':560 'refresh':137,239,404,537,943,945 'relev':429 'rememb':1107 'remov':133 'report':673,781,855,1007,1074 'requir':459 'resourc':1077 'respect':642,1054 'result':939 'rout':570 'rss/atom':128,236,738 'rule':1105 'run':314,849,900,931,955,978,999 'save':257 'say':568 'scatter':55 'scope':1004 'script':1101 'searchabl':60 'select':903 'set':354,882 'setup':174,274 'share':27,82,745,1079,1092 'simpl':758 'skill':78,154,336,420,432,553,559,567,577,619,625,661,703,709,715,721,726,736,743,1020,1041,1068,1097,1110,1122 'skill-tapestry' 'skill.md':433,579,627,689,1021,1125 'sourc':134,145,205,237,403 'source-awar':204 'source-natsufox' 'spec':1102 'src':744,1078 'step':337,413,458,548,631 'storag':749,1086 'store':685 'structur':112,203,361,479,687,787,793,813 'sub':153,419,431,552,558,566,576,618,624,660,702,708,714,720,725,735,742,1019,1040,1067,1096,1121 'sub-skil':152,418,430,551,557,565,575,617,623,659,701,707,713,719,724,734,741,1018,1039,1066,1095,1120 'subscrib':144,405,948 'subscript':130,233,399,401,408,534,739,942 'subscriptions/_scripts/run.py':957 'subscriptions/skill.md':234,541,737,953 'summar':937 'summari':380 'support':584 'synthes':12 'synthesi':68,186,300,313,355,369,394,411,492,639,848,867,883,901,930,976,1060 'synthesis.mode':319 'synthesis/skill.md':187,498,716 'tapestri':1,41,48,75,148,264,688,969 'tapestry-ingest':968 'tapestry.config.json':322,888 'tell':675 'test':750,752,1087,1089 'thread':593,607,798 'togeth':157 'topic':306 'topic-agent-skills' 'topic-claude-code' 'topic-codex' 'topic-crawler' 'topic-knowledge-base' 'topic-openclaw' 'topic-workflow' 'tree':605 'trigger':169,280,393,440 'turn':54 'two':261,268 'two-phas':260,267 'understand':339,450 'unit':751,1088 'url':28,83,181,466,705,779,806,846,872,895,904,913,925,934,963 'usag':754 'use':24,74,76,265,334,351,363,367,377,381,400,407 'user':26,81,341,347,461,643,677,760,789,821,827,868,897,909,944,986,1076 'visual':121,211,219,222,226,379,383,506,518,524,723,728,731 'visual-card':221,382,523,727 'want':29,96,111,125,135,348,653 'web':5,13,32,45,56,101,117 'webpag':95,611 'websit':217 'weibo':23,92,597 'work':156,1116 'workflow':7,47,52,146,390,455,475,488,502,514,530,545,630,775,1032 'written':1036 'www.zhihu.com':766 'www.zhihu.com/question/123/answer/456':765 'x/twitter':21,90,591 'xiaohongshu':22,91,594 'zhihu':18,87,586,763","prices":[{"id":"1696d35a-af61-4d96-b23a-36692a1e8cd0","listingId":"8360072f-41f5-4550-8d32-ab02e7ccbb20","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"NatsuFox","category":"Tapestry","install_from":"skills.sh"},"createdAt":"2026-04-18T22:14:52.489Z"}],"sources":[{"listingId":"8360072f-41f5-4550-8d32-ab02e7ccbb20","source":"github","sourceId":"NatsuFox/Tapestry/tapestry","sourceUrl":"https://github.com/NatsuFox/Tapestry/tree/main/skills/tapestry","isPrimary":false,"firstSeenAt":"2026-04-18T22:14:52.489Z","lastSeenAt":"2026-05-02T06:55:55.278Z"}],"details":{"listingId":"8360072f-41f5-4550-8d32-ab02e7ccbb20","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"NatsuFox","slug":"tapestry","github":{"repo":"NatsuFox/Tapestry","stars":57,"topics":["agent-skills","claude-code","codex","crawler","knowledge-base","openclaw","workflow"],"license":"mit","html_url":"https://github.com/NatsuFox/Tapestry","pushed_at":"2026-04-16T17:57:45Z","description":"Tapestry - 基于 Agent Skill Bundle 的轻量级书签知识库","skill_md_sha":"4a418c9f964b412d1ae326f7fa04eaeca6130a95","skill_md_path":"skills/tapestry/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/NatsuFox/Tapestry/tree/main/skills/tapestry"},"layout":"multi","source":"github","category":"Tapestry","frontmatter":{"name":"tapestry","description":"AI-native web intelligence workflow for crawling, organizing, and synthesizing web content from multiple platforms (Zhihu, Reddit, HN, X/Twitter, Xiaohongshu, Weibo). Use when users share URLs, want to archive web content, build knowledge bases, or analyze online discussions."},"skills_sh_url":"https://skills.sh/NatsuFox/Tapestry/tapestry"},"updatedAt":"2026-05-02T06:55:55.278Z"}}