chubbyguan/chubbyskills
chubbyguan/chubbyskills has 1,310 GitHub stars and 156 forks. GitHot measured +2 stars in 24 hours. Last checked 2026-11-07 08:17 UTC. Last push 2026-10-14.
把中文全渠道内容(抖音 / B站 / 小红书 / 公众号 / X / 播客)采集进个人知识库的 14 个 AI Skill:图文存图、视频转文字稿、字幕优先免 GPU、RSS/YouTube 订阅调度与每日情报简报,附带知识库 MCP server。| Ingest Chinese content into your personal knowledge base — image/video routing, subtitle-first transcription, feed subscriptions with daily digests, and a KB MCP server.
Measured star growth
- in 24h
- +2
- in 7 days
- Collecting history
- in 15 days
- Collecting history
- in 1 month
- Collecting history
Net star changes over overlapping periods, not daily totals. Missing measurements are left blank. Stars measure attention, not software quality.
README.en.md
Original中文 · English
🧰 Chubby Skills
Turn saved content into a searchable source library
Import documents, capture articles and transcripts, and search the original text when you need it. Export a source-backed brief for your agent to work from.
Quick start · Agent installation · Skills · Documentation · Changelog · 💬 Discussions
Chubby Skills is a set of 14 agent skills and a local command-line workflow for content creators, researchers, and people who keep a Markdown knowledge base. It connects saved material to the sources behind it, so an agent can read your notes before helping you write.
Your library stays in ordinary Markdown files. The repository provides import, platform capture, indexing, search, and evidence-brief export; an optional MCP server lets your agent query the same library.
What you can do
| Start with | Get |
|---|---|
| Existing Markdown, TXT, or text-based PDF | Notes with provenance, content hashes, and referenced local attachments |
| Articles, video links, podcasts, or local audio | Markdown text or transcripts through platform-specific skills |
| A growing Markdown library | Local keyword search and lightweight semantic retrieval |
| A writing or research question | A Markdown/JSON brief with exact excerpts, source links, line numbers, and file hashes |
| An agent that supports skills or MCP | Reusable workflows and direct access to your own source material |
| Public feeds, YouTube channels, and BYO Provider output | Subscription discovery, review queue, controlled transcription, and Markdown ingestion |
New in v0.13.0: unified local document import, experimental Atlas/MuAPI podcast transcription with saved task recovery, and portable installation bundles for the new tools.
See sample outputs to inspect the files before installing. Most detailed guides are currently in Chinese.
Platform availability at a glance
Declared capability (not live probing); dated real-source evidence lives in live verification, full failure modes in platform status:
| Platform | Status | Lightweight path |
|---|---|---|
| Bilibili / YouTube | Stable | Subtitle-first, only needs yt-dlp |
| WeChat OA | Beta | HTML needs beautifulsoup4, PDF fallback |
| Douyin / TikTok / Weibo / Zhihu | Beta, heavy deps | Video transcription needs funasr + ffmpeg |
| Podcasts | Heavy deps | funasr (SenseVoice-Small), optional DashScope/Groq cloud transcription |
| X / Xiaohongshu | Manual fallback | Zero-dependency capture; X long-form articles support logged-in full text via X_COOKIES; manual text fallback. How to obtain credentials and whether they last worked: chubby doctor --credentials |
| RSS / YouTube channel subscriptions | P0 + P1 | Public feeds; BYO RSSHub/RSS-Bridge provenance labels; discovery-only is the safe default |
| Local documents | Stable | Zero dependency, Markdown/TXT/PDF text layer |
Try the local workflow
Requires Python 3.11 or newer on a macOS/Linux shell — check with python3 --version first: the 3.9 that ships with macOS runs the core commands but breaks the subscribe chain on import (datetime.UTC), so install a newer Python or use the virtualenv step below. The core path uses only the standard library: no pip packages, no API keys, no model downloads. (The CLI reports in Chinese; the commands are language-neutral.)
Path one: capture a real link
X posts and Xiaohongshu image notes both go through the Python standard library only — no yt-dlp, no ffmpeg, no model download (per-platform capability and failure modes: platform status):
git clone https://github.com/chubbyguan/chubbyskills.git
cd chubbyskills
python3 tools/chubby.py init --vault "$PWD/creator-vault"
python3 tools/chubby.py ingest "https://x.com/OpenAI/status/1663696190960173056" --no-enrich
python3 tools/chubby.py search "ChatGPT"
✅ 已写入配置:/path/to/chubbyskills/chubby.yaml
✅ 已准备队列:/path/to/chubbyskills/inbox/links.txt
✅ 已准备状态:/path/to/chubbyskills/.chubby/runs.jsonl
✅ 已准备报告目录:/path/to/chubbyskills/runs
✅ 完成:success=1 / failed=0 / dry_run=0
🧾 报告:/path/to/chubbyskills/runs/2026-10-05.md
/path/to/chubbyskills/creator-vault/00_Inbox/The-ChatGPT-iOS-app-is-now-available-in---<source-hash>.md
The ChatGPT iOS app is now available in
00_Inbox/The-ChatGPT-iOS-app-is-now-available-in---<source-hash>.md
# The ChatGPT iOS app is now available in > 👤 OpenAI @OpenAI | 👍 754 · 💬 115 …
The captured note keeps the source, author, timestamp and engagement counts, so a quote can always be traced back to the original post:
title: "The ChatGPT iOS app is now available in "
platform: x
source: "https://x.com/OpenAI/status/1663696190960173056"
author: "OpenAI @OpenAI"
created: 2023-05-30
likes: 754
Swap the link for any post or Xiaohongshu note you want to keep.
Platform capture varies. This is one sample, not a success rate: without a logged-in session a platform may block the request, and X long-form articles return only a preview by default. When it fails, see platform status and fallback routes, or save the body and use the path below.
Path two: import your own files
This one never touches the network and works in any environment. Create one document, import it, and search it back — swap the sample for your own .md, .markdown or .txt, and add --source-url "https://…" when you know the original page:
mkdir -p demo-input
cat > demo-input/sample.md <<'MARKDOWN'
---
title: Source library demo
---
# Source library demo
This is a manually written example. A source library keeps the original text
available so a writer can check context before using an excerpt.
MARKDOWN
python3 tools/chubby.py import demo-input/sample.md --no-enrich
python3 tools/chubby.py search "source library"
✅ 完成:success=1 / failed=0 / dry_run=0
🧾 报告:/path/to/chubbyskills/runs/2026-10-05.md
Source library demo
00_Inbox/Source-library-demo--<source-hash>.md
# Source library demo This is a manually written example. A source library keeps the original text…
Then export the brief — the artifact this project actually exists to produce:
python3 tools/chubby.py brief --topic "source library" \
--output "$PWD/creator-vault/30_Output/source-library-brief.md"
{
"markdown": "/path/to/chubbyskills/creator-vault/30_Output/source-library-brief.md",
"json": "/path/to/chubbyskills/creator-vault/30_Output/source-library-brief.json"
}
The Markdown brief carries verbatim excerpts, original line numbers, the source link and a file SHA-256, so every claim can be traced back. Both derived values move with your own paths and timestamps: the filename suffix comes from the source path, and the hash covers the imported copy including its metadata.
## E1 · Source library demo
笔记相对路径:`00_Inbox/Source-library-demo--<source-hash>.md`
原始来源:未提供可打开的网页链接。
文件 SHA-256:`<content hash of the imported copy>`
原文第 22–22 行:
Three things land on disk: creator-vault/00_Inbox/ (the note plus any referenced local attachments), creator-vault/30_Output/ (the brief and its JSON companion), and .chubby/runs.jsonl with runs/ (task state and run reports). Everything above runs offline; the brief never calls a cloud model and never judges whether the source is right.
Optional: install the chubby command
The workflow above uses python3 tools/chubby.py and needs no install. For the chubby … form:
python3 -m venv .venv && source .venv/bin/activate
python3 -m pip install -e . # provides the `chubby` command
A plain package install works too (pip install ., or pipx install git+https://github.com/chubbyguan/chubbyskills.git). The knowledge-base commands are all available — init / import / search / brief / index / doctor / subscribe (including digest and site build) — and user state is written to your current directory, never into the install directory.
Platform capture (ingest) works too: the 14 skill directories ship with the package (their names — bilibili-transcribe — are not legal Python package names, so the build maps them to bilibili_transcribe; you never see this). To install those skills into an agent rather than calling them through the CLI, use tools/install_skill.py from a checkout — the two routes are independent.
The import preserves the original document, copies supported local attachments, and updates the index. Repeating the same import can reuse a valid result; changing the document or its attachments creates a new result while retaining the old one. If you repeat the brief export, choose a different output filename or explicitly add --force to replace the previous brief.
To use your own files:
python3 tools/chubby.py import "/path/to/notes.md" --no-enrich
python3 tools/chubby.py import "/path/to/notes.txt" --no-enrich
# Optional dependency for PDFs that already contain a text layer:
python3 -m pip install 'pymupdf>=1.24'
python3 tools/chubby.py import "/path/to/report.pdf" --no-enrich
PDF import does not include OCR. Scanned PDFs without extractable text fail with an explanation. Use --source-url to record an original HTTP(S) source; it records provenance without downloading or verifying that page. See document import for attachment rules and the creator workflow for the full capture-to-brief process.
Work with your own material
Platform links
Choose the runtime dependencies for the content you need. Run installation commands inside your active virtual environment:
| Content or operation | Setup |
|---|---|
| Local Markdown/TXT import, search, briefs | Python standard library; no additional setup |
| X/Xiaohongshu text and image posts | bash setup.sh light checks Python and prints configuration guidance; it does not install packages |
| Bilibili/YouTube captions | python3 -m pip install yt-dlp |
| Local video transcription | bash setup.sh video; requires system ffmpeg and installs transcription dependencies |
| Local podcast transcription | bash setup.sh podcast; installs the SenseVoice-Small (funasr) transcription dependencies |
| WeChat article/PDF processing | bash setup.sh wechat |
setup.sh handles runtime checks and selected dependencies; tools/install_skill.py builds skill directories. See installation for all profiles, agent paths, and upgrade details.
For example, install the caption downloader, check YouTube requirements, and ingest a video you are allowed to save:
python3 -m pip install yt-dlp
python3 tools/chubby.py doctor --platform youtube
python3 tools/chubby.py ingest "REPLACE_WITH_YOUR_YOUTUBE_URL" --no-enrich
python3 tools/chubby.py status --latest
Platform capture is implemented for Bilibili, YouTube, Douyin, TikTok, Weibo, Zhihu, WeChat, Xiaohongshu, X/Twitter, and podcasts. Support varies by content type:
- Bilibili/YouTube: available captions first; audio transcription needs additional local dependencies when captions are unavailable.
- Articles and image posts: platform access, login state, and page changes can affect extraction. Manual-text fallback is recorded as manual input.
- Video and audio: local transcription needs its runtime/model dependencies and may take time. Check the corresponding skill before starting.
These are supported code paths, not a guarantee that every live link works. See platform status, the dated live verification report, and failure/fallback guidance.
YouTube may demand sign-in proof on flagged exit IPs (Sign in to confirm you are not a bot). Two optional environment variables pass through to every yt-dlp call across all platform skills: YTDLP_COOKIES_FROM_BROWSER (e.g. chrome, maps to --cookies-from-browser) and YTDLP_REMOTE_COMPONENTS (e.g. ejs:github, lets yt-dlp download its JS challenge solver).
X long-form articles only return preview text by default, with an explicit warning. Setting --cookies or X_COOKIES (your own account's auth_token + ct0) fetches the full text through the logged-in GraphQL endpoint, falling back to the preview when it fails. See x-ingest.
Podcasts and optional cloud transcription
To transcribe local audio with the local provider:
python3 tools/chubby.py ingest "/path/to/episode.mp3" \
--skill podcast --provider local --no-enrich
The local provider defaults to SenseVoice-Small; Qwen3-ASR-0.6B is an optional alternative (--provider local --model qwen3-asr-0.6b, requires a manual pip install qwen-asr transformers torch). Measured on an M3 Pro CPU with a 5-minute Chinese podcast (2026-10): SenseVoice RTF 0.11 vs Qwen RTF 0.80 (about 7x slower). Quality is a trade-off — Qwen is steadier on proper nouns and names but can hallucinate rewrites and has no ITN (numbers come out as words); SenseVoice output needs emotion-tag cleanup. Keep the SenseVoice default on CPU; pick Qwen on GPU machines or when proper-noun accuracy matters. See podcast-transcribe.
Podcast transcription defaults to local SenseVoice-Small (via funasr). Alibaba Cloud Model Studio's DashScope qwen3-asr-flash (--provider dashscope, requires DASHSCOPE_API_KEY) and Groq's whisper-large-v3-turbo (--provider groq, requires GROQ_API_KEY; free tier caps single files at 25 MB plus rate limits — longer audio is automatically chunked with resumable per-chunk progress) are optional, opt-in cloud providers. Its request lifecycle, saved result recovery, and error handling are tested with simulated responses; real paid-service transcription has not been validated.
Cloud mode sends audio to the selected provider and may incur charges. DashScope inputs are limited to 10 MB after base64 encoding and at most 5 minutes of audio; oversized files are rejected before submission with a hint to use the local SenseVoice-Small provider instead. Groq handles long audio by splitting it into 20-minute MP3 chunks (~9.6 MB each), submitting them in order with per-chunk persisted progress (rerun the same command to resume without resubmitting finished chunks), and stitching text and offset-adjusted timestamps back together; HTTP 429 responses are waited out via Retry-After / exponential backoff within --cloud-timeout. Completed results are persisted and reused after interruptions; --resubmit explicitly creates a new task and may charge again. Follow the cloud transcription guide for credentials, configuration, limits, and recovery.
Automatic podcast/RSS downloads accept only direct public HTTP(S) addresses, without redirects or proxies. For a source requiring either, download the audio yourself first and pass its local file path.
Reuse, queues, and retries
Valid results are reused for the same source, processing settings, and destination. --refresh processes the source again while keeping previous versions. For batch capture, place one source per line in inbox/links.txt:
python3 tools/chubby.py run --queue inbox/links.txt --no-enrich
python3 tools/chubby.py status --failed
python3 tools/chubby.py retry --all-failed
The index updates after ingestion and before unified searches. See the creator workflow for retry behavior and knowledge automation for index migration or rebuilding.
Subscribe to feeds, podcasts, and YouTube channels (P0)
Subscriptions keep source discovery separate from expensive media work. The first sync creates a seen baseline; new entries enter a review queue by default. Once a source proves reliable, auto_ingest can route its YouTube videos or podcast enclosures through the existing subtitle-first / transcription pipeline.
python3 tools/chubby.py subscribe init
python3 tools/chubby.py subscribe add \
--id yt-3blue1brown --name "3Blue1Brown" \
--kind youtube_channel --channel-id UCYO_jab_esuFRV4b17AJtAw \
--content-profile video --mode discover_only
python3 tools/chubby.py subscribe sync --all
python3 tools/chubby.py subscribe pending
Schedule python3 tools/chubby.py subscribe tick --due --process-limit 3 through launchd or cron. subscribe digest turns the last N days of queued entries into a daily intelligence brief — zero-LLM by default (event clustering plus vault related-note links), with an optional --enrich DeepSeek layer whose model output is always labeled. subscribe site build renders the same clusters as a zero-JS static site for GitHub Pages, publishing only titles, sources, links and heat — never bodies or local paths — alongside a feed.xml and an llms.txt so agents can consume the same events. The workflow consumes public RSS / Atom / JSON feeds and official YouTube channel feeds, including final public output from a user-managed RSSHub, RSS-Bridge, or another provider. A Provider label never enables platform crawling, authentication, or proxying. It does not claim unattended account scanning for X, Xiaohongshu, Douyin, Bilibili, or WeChat. See subscription and scheduling (Chinese) and the 7-day Provider acceptance guide.
Install skills for your agent
From the complete repository, install one skill into your agent's actual skills directory. For example, for Codex:
python3 tools/install_skill.py knowledge-base-management --dest ~/.codex/skills
This produces a self-contained skill directory, including its shared source modules and local import/index/brief tools. It can be moved as a unit without the original repository. Do not download just a raw skill folder from GitHub: it may reference modules elsewhere in the repository.
To browse the available skills or install all 14, use the following commands. --all is an alternative to the single-skill installation above, for a destination without existing copies of these skills:
python3 tools/install_skill.py --list
python3 tools/install_skill.py --all --dest /path/to/agent/skills
The installer refuses to overwrite existing skill directories. For an update, install into a new directory, compare changes, and retain your customizations before replacing the old copy. It does not install Python packages or configure/start your agent.
The tools/chubby.py workflow on this page requires the complete repository. An installed knowledge-base skill instead provides its own tools/import_document.py, tools/vault_index.py, and tools/evidence_brief.py; see document import for those commands.
Connect the library through MCP
You can give the exported brief directly to an agent that can read files. Ask it to read the cited notes, distinguish source claims from its own inferences, and mark missing evidence. brief retrieves and quotes material; it does not generate a finished article or establish that a source's claims are true.
For direct library access, enable the optional MCP server using Python 3.10 or newer:
python3 -m pip install -r knowledge-base-management/requirements-mcp.txt
python3 tools/mcp_smoke.py --json
The requirements file pins the verified SDK to mcp==1.30.0. The smoke check starts a real server, completes the protocol handshake, and tests search/read calls against temporary notes.
Configure your actual client with the server command and VAULT_DIR pointing to the same library. Use the Python environment where you installed the MCP dependency. The MCP guide includes a client configuration example, all six tools, and standalone-skill setup; check the connection in your client too.
Skills
| Skill | Purpose |
|---|---|
| douyin-transcribe | Douyin video transcription |
| bilibili-transcribe | Bilibili captions and transcription |
| tiktok-transcribe | TikTok video transcription |
| weibo-transcribe | Weibo video transcription |
| zhihu-transcribe | Zhihu video transcription |
| youtube-transcribe | YouTube captions, transcription, optional translation |
| podcast-transcribe | Podcasts, RSS, and local audio; optional DashScope/Groq cloud providers |
| wechat-article-ingest | WeChat articles and PDF ingestion |
| xiaohongshu-ingest | Xiaohongshu text, images, and video |
| x-ingest | X/Twitter text, long-form articles (logged-in full text), images, and video |
| content-enrich | Optional API-based summaries, key points, and tags |
| knowledge-base-management | Document import, indexing, briefs, and MCP |
| industry-intelligence-radar | Multi-source research workflow |
| learning-notes-automation | Learning notes and flashcards |
Data and processing boundaries
Source material is stored locally by default. Network access depends on the operation:
| Operation | Where content is processed |
|---|---|
| Local import, keyword search, semantic-lite, briefs | Local; document import does not fetch remote attachments |
| Platform capture | The source platform; some paths need your own login state (XHS_COOKIE, X_COOKIES, or YTDLP_COOKIES_FROM_BROWSER for yt-dlp paths) |
| Local transcription | Local inference; the first run may download a model |
| Optional enrichment, translation, learning-note extraction | The configured API, using DEEPSEEK_API_KEY |
| Optional OpenAI embeddings | OpenAI API, using OPENAI_API_KEY |
| DashScope podcast transcription | Alibaba Cloud Model Studio, using DASHSCOPE_API_KEY |
| Groq podcast transcription | Groq, using GROQ_API_KEY |
| A cloud agent reading notes | The material it reads enters that agent's model context |
API services may charge. Keep credentials and cookies out of notes and version control. Other parsers can hand off Markdown to the local importer; see optional integrations for cue-omni-reader and its current verification status.
Output format
Captures and imports use Markdown with frontmatter for the title, type, platform, source, and date. The unified CLI adds schema v1 metadata for task identity, capture time, source hashes, and attachments. See the sample outputs.
python3 tools/validate_outputs.py output/ --schema-v1
Verification and community contributions
The v0.13.0 release records 220 passing tests, Linux/Python 3.11 and macOS/Python 3.12 CI, real PDF import, and real MCP protocol checks. The extracted release bundle was checked across 14 skills and 24 isolated script imports. These checks cover the reported local behavior; they do not prove platform availability or real cloud transcription quality.
For a quick offline environment/workflow check:
python3 tools/chubby.py quickstart --ephemeral --no-state
The current implementation incorporates installation suggestions from catwithtudou's #1, Atlas requirements from binyangzhu000-sudo's #3, and MuAPI requirements from Anil-matcha's #5. huhoo's #6 is covered in the optional integration guide; a real parser example is still pending. See the community triage record for attribution and decisions.
Issues and contributions are welcome. See CONTRIBUTING and the platform adapter guide. Include reproducible inputs or errors without credentials or private content.
Not sure where to post? Usage questions, scenarios, and feature ideas belong in Discussions; reproducible bugs go to Issues. Chinese readers can also reach out via the WeChat official account 「关关不过」.
Documentation
Most detailed guides are currently in Chinese.
| Guide | Use it for |
|---|---|
| Project introduction (Chinese) | What it is, what it does, and the trade-offs behind it |
| Creator workflow | Capture → search → evidence brief → agent handoff |
| Document import | File formats, attachments, provenance, and PDF limits |
| Installation | Runtime dependencies and portable skill installation |
| MCP configuration | Connect an agent to your library |
| Cloud transcription | DashScope (qwen3-asr-flash) / Groq (whisper-large-v3-turbo) configuration and task recovery |
| Subscription and scheduling (Chinese) | Public feeds / YouTube subscriptions, queue, scheduling, and recovery |
| Knowledge automation | Retrieval, optional embeddings, and archive/card workflows |
| Optional integrations | Import Markdown produced by other tools |
| Community triage | Contribution attribution and adoption decisions |
| Verification model (Chinese) | Claim-strength tiers, live-acceptance protocol, publish boundaries, third-party evidence |
| Changelog | Changes by version |
Related projects
- chubby-recruitment-ops: recruitment operations plugin for Codex and Claude Code.
Usage limits
Ingestion skills are intended for personal learning and research. Follow platform terms, robots.txt, and applicable laws. Do not use them for bulk scraping, commercial scraping, redistribution, or infringing uses. Use only your own authorized login state. Source content remains the original author's work; obtain permission when required and attribute it appropriately.
Code is provided under the MIT License, as is. This does not grant rights to third-party content.
About Chubby
I am Chubby. I create content, build a personal knowledge base, and share what I learn about AI agents, skills, and e-commerce.
X/Twitter · Jike · Xiaohongshu · WeChat: 关关不过
Gitee mirror · Made by @chubbyguan
Explore related projects
ytdl-org/youtube-dl
Command-line program to download videos from YouTube.com and other video sites
141,473 starsexcalidraw/excalidraw
Virtual whiteboard for sketching hand-drawn like diagrams
135,243 starsgodotengine/godot
Godot Engine – Multi-platform 2D and 3D game engine
119,710 starsmrdoob/three.js
JavaScript 3D Library.
117,745 stars