Greenbubbles Personal Memory
bojieli/greenbubbles
Build or revise private, cited Markdown notes from the user's WeChat history in the current agent session.
Searches books, manages the shelf, reads public-account articles and reads or writes highlights and notes in WeRead through the weread-omni CLI.
$ npx skills add teng-lin/weread-omni --skill weread -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install teng-lin/weread-omni weread --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/teng-lin/weread-omni.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/weread .claude/skills/weread && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "weread" agent skill from https://github.com/teng-lin/weread-omni/tree/main/skills/weread into .claude/skills/weread/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "weread", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/teng-lin/weread-omni/tree/main/skills/wereadType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add teng-lin/weread-omni --skill weread -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install teng-lin/weread-omni weread --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/teng-lin/weread-omni.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/weread .agents/skills/weread && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "weread" agent skill from https://github.com/teng-lin/weread-omni/tree/main/skills/weread into .agents/skills/weread/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "weread", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add teng-lin/weread-omni --skill weread -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install teng-lin/weread-omni weread --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/teng-lin/weread-omni.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/weread .cursor/skills/weread && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "weread" agent skill from https://github.com/teng-lin/weread-omni/tree/main/skills/weread into .cursor/skills/weread/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "weread", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/teng-lin/weread-omni.git --path skills/weread--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add teng-lin/weread-omni --skill weread -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install teng-lin/weread-omni weread --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/teng-lin/weread-omni.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/weread .gemini/skills/weread && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "weread" agent skill from https://github.com/teng-lin/weread-omni/tree/main/skills/weread into .gemini/skills/weread/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "weread", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install teng-lin/weread-omni wereadInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add teng-lin/weread-omni --skill weread -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/teng-lin/weread-omni.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/weread .github/skills/weread && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "weread" agent skill from https://github.com/teng-lin/weread-omni/tree/main/skills/weread into .github/skills/weread/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "weread", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add teng-lin/weread-omni --skill weread -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install teng-lin/weread-omni weread --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/teng-lin/weread-omni.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/weread .opencode/skills/weread && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "weread" agent skill from https://github.com/teng-lin/weread-omni/tree/main/skills/weread into .opencode/skills/weread/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "weread", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
wereadSearches books, manages the shelf, reads public-account articles and reads or writes highlights and notes in WeRead through the weread-omni CLI.
The agent talks to WeRead only through the weread-omni command-line tool, always with --json, and summarizes the parsed result. It picks one account alias for the whole session and never switches after a failure. Before any authenticated call it runs a doctor check and proceeds only if the account is authenticated, and it does not start a QR login without your say-so.
Reads start with the narrowest command that answers the request: book search (with scopes such as ebooks, web fiction, audio or authors), book metadata and chapters, public-account articles, shelf and reading data. Results can come from a local library copy, so the agent should say when something may be stale and offer a refresh. Writes such as highlights and notes are allowed unless the operator sets WEREAD_READONLY, which the agent reports as policy rather than working around, and it never exposes credentials.
4 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 88bd2e0. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are bash).
From the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
mp.weixin.qq.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
WeRead Bookshelf and Notes loads about 3.3k tokens when it runs. Until then it costs about 116 tokens; SKILL.md has 1,398 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from teng-lin/weread-omni at commit 88bd2e0, republished under its MIT licence (© teng-lin). 1,398 words, ~3,293 tokens.
.claude/skills/weread/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Use the installed CLI as the only interface. Always pass --json, parse
successful stdout as JSON, and summarize the result for the user. On a non-zero
exit, parse the JSON error from stderr. Never expose credentials or paste raw
tokens.
Choose exactly one account for the session and preserve it through every CLI
call. Use the alias supplied by the user or operator. If none was supplied,
weread-omni accounts --json must show exactly one configured account. In the
examples below, $ACCOUNT means that alias. Do not switch accounts after a
failure.
Writes are permitted unless the operator has set WEREAD_READONLY. A refused
write fails with disabled by WEREAD_READONLY; report that limit as policy, and
never unset it or retry against another account on the user's behalf.
Before the first authenticated operation, run:
weread-omni --account "$ACCOUNT" doctor --jsonProceed only when the result has ok: true, cli.package: "weread-omni", and auth.status: "authenticated". On an authentication
error, require the same cli.package in the JSON error before following its
hint. Do not start QR login without user confirmation. Follow the returned
account-specific hint; malformed or unreadable state must be corrected or
removed first. Retry doctor once with the same account. If it returns
non-JSON or names another
package, stop and report the path from command -v weread-omni; do not guess
another command.
Start with the narrowest read that answers the request. Preserve bookId
values from search or shelf results for follow-up commands.
Book metadata, chapter listings, and downloaded public-account articles are
served from a local library after the first read, so a repeated read can return
a stored copy rather than a fresh one. If a result looks out of date, say so and
offer --refresh to refetch and replace it; --no-library skips the library
entirely for one command. Never present stored content as freshly fetched.
weread-omni --account "$ACCOUNT" public-accounts read-article 'https://mp.weixin.qq.com/s/ARTICLE' --json
weread-omni --account "$ACCOUNT" search books "三体" --json
weread-omni --account "$ACCOUNT" search books "刘慈欣" --scope 6 --json
weread-omni --account "$ACCOUNT" book info BOOK_ID --json
weread-omni --account "$ACCOUNT" shelf sync --count 20 --json
weread-omni --account "$ACCOUNT" public-accounts subscriptions --count 20 --json
weread-omni --account "$ACCOUNT" public-accounts articles MP_WXS_123 --count 20 --json
weread-omni --account "$ACCOUNT" public-accounts resolve-article 'https://mp.weixin.qq.com/s/ARTICLE' --json
weread-omni --account "$ACCOUNT" notes notebooks --count 10 --json
weread-omni --account "$ACCOUNT" notes recent --count 10 --json
weread-omni --account "$ACCOUNT" notes mine BOOK_ID --count 10 --json
weread-omni --account "$ACCOUNT" notes underlines BOOK_ID CHAPTER_UID --json
weread-omni --account "$ACCOUNT" notes read-reviews BOOK_ID CHAPTER_UID --reviews '[{"range":"393-401","count":10}]' --json
weread-omni --account "$ACCOUNT" review single REVIEW_ID --json
weread-omni --account "$ACCOUNT" read-data detail --mode weekly --json
weread-omni --account "$ACCOUNT" discover recommend --count 10 --json
weread-omni --account "$ACCOUNT" ai ask-book BOOK_ID "Summarize the central argument" --jsonsearch books defaults to --scope 10 for ebooks. Choose the scope from the
request: 0 all, 10 ebooks, 16 web fiction, 14 audio, 6 authors, 12
full text, 13 booklists, 2 public accounts, or 4 articles. Do not use
scope 10 for every intent. When hasMore is 1, pass the last result's
searchIdx as --max-idx; a page is not the complete result set.
Use only the cursor that belongs to the command:
shelf sync, pass nextOffset as --offset.public-accounts articles, omit --offset on the first call, or pass a
previous synckey as --synckey for a delta refresh. Never combine the two.
If the response has nextOffset, pass it as --offset; stop when it is absent.notes notebooks, pass the final book's sort as --last-sort.notes recent is a bounded account-wide snapshot; it has no page cursor.notes best and review list, add the returned item count to the
previous --max-idx.synckey only to refresh previously fetched data. It is not a page
cursor.Preserve every upstream hasMore and cursor exactly; do not infer completion
from a short result or from a missing hasMore.
shelf sync returns a compact page by default. Use --full only when the user
needs exact upstream sync fields; it cannot be combined with --count or
--offset.
Use book detail for product images and other books by the same author or
rightsholder. It returns six entries per related catalog by default; use
--count (1-12) when a smaller result is enough. Use book chapters or
book progress for those specific views.
book chapters returns the table of contents, where each
entry carries the chapterUid that the notes and review commands use to address
a position in a book. Use notes bookmarks, notes best, or notes underlines
for those note types. To read thoughts under a popular highlight, take its
chapterUid and range from notes best, call notes read-reviews, then use
review single when the user wants one thought in full. Use review list,
discover similar, and ai suggest for reviews, related books, and suggested
questions.
For a supplied article URL, use public-accounts read-article URL --json directly;
no public-account search or subscription is needed. resolve-article only returns
an ID and review single may only contain metadata or an abstract.
Use the returned markdown or contentHtml, and cite sourceUrl. A cache hit is
marked fromCache: true, with cachedAt and a null fetchedAt. status: readable
does not independently establish completeness (completeness: unverified);
inspect the article structure and ending when completeness matters. partial
means only a preview was obtained. An unavailable body exits nonzero with JSON
diagnostics on stderr; never summarize its metadata as though it were the body.
For public-account discovery and subscription, follow this sequence:
weread-omni --account "$ACCOUNT" search books KEYWORD --scope 2 --json.MP_WXS_<digits> ID.
Never auto-select or auto-subscribe the first fuzzy match.public-accounts subscriptions,
articles, feed, or export.weread-omni --account "$ACCOUNT" public-accounts subscribe MP_WXS_123 --json
weread-omni --account "$ACCOUNT" public-accounts feed MP_WXS_123 --format rss --out /private/path/feed.xml --json
weread-omni --account "$ACCOUNT" public-accounts feed subscriptions --format json --out /private/path/feed.json --json
weread-omni --account "$ACCOUNT" public-accounts export MP_WXS_123 --out /private/path/archive --json
weread-omni --account "$ACCOUNT" public-accounts unsubscribe MP_WXS_123 --yes --jsonFeed and export outputs contain at most 20 items by default and 100 maximum.
For aggregate feeds, this is a final output limit; collection may retrieve up
to that many candidates per account. CLI output paths are never overwritten.
An export is complete only when manifest.json exists; report an incomplete
path rather than deleting it.
Article retrieval makes one bounded direct retrieval attempt from a validated
HTTPS mp.weixin.qq.com/s source URL using WeRead's E-Ink User-Agent. The
attempt may follow at most three validated redirects and sends no WeRead
authentication headers to that host. If a diagnostic reports
SOURCE_CLOUDFLARE_CHALLENGE or SOURCE_WECHAT_CHALLENGE, tell the user to
open its sourceUrl in a browser. Do not claim the archive is complete or
imply that the CLI can execute JavaScript challenges or solve CAPTCHAs.
For a question about a book's substance, prefer ai ask-book: the server
answers it directly, with no need to pull anything down first.
Run a write only when the user explicitly requests that change. State the target before acting. Do not infer consent from a prior read.
weread-omni --account "$ACCOUNT" shelf add BOOK_ID --json
weread-omni --account "$ACCOUNT" review add BOOK_ID "A concise review" --star 100 --json
weread-omni --account "$ACCOUNT" review edit REVIEW_ID "Replacement text" --json
weread-omni --account "$ACCOUNT" import book /absolute/path/to/book.epub --jsonimport book accepts an EPUB, PDF, MOBI, TXT, or AZW3 file the user already
has; it uploads that file to the user's own WeRead account.
Shelf state changes use the positive state by default and a negated option for the reverse:
weread-omni --account "$ACCOUNT" shelf pin BOOK_ID --json
weread-omni --account "$ACCOUNT" shelf pin BOOK_ID --no-top --json
weread-omni --account "$ACCOUNT" shelf set-private BOOK_ID --json
weread-omni --account "$ACCOUNT" shelf set-private BOOK_ID --no-secret --json
weread-omni --account "$ACCOUNT" shelf mark-finished BOOK_ID --json
weread-omni --account "$ACCOUNT" shelf mark-finished BOOK_ID --no-finished --json
weread-omni --account "$ACCOUNT" shelf mark-reading BOOK_ID --json
weread-omni --account "$ACCOUNT" shelf mark-reading BOOK_ID --no-reading --jsonReview ratings use the protocol scale 20, 40, 60, 80, or 100.
Add a highlight (划线) with the chapter, character range, and highlighted text:
weread-omni --account "$ACCOUNT" notes add-bookmark BOOK_ID CHAPTER_UID "777-778" "the highlighted text" --json
weread-omni --account "$ACCOUNT" notes update-bookmark BOOKMARK_ID --style 2 --color-style 5 --jsonDeletion is destructive. Confirm the exact target with the user, then include
--yes; never retry a failed write blindly.
weread-omni --account "$ACCOUNT" shelf delete BOOK_ID --yes --json
weread-omni --account "$ACCOUNT" notes remove-bookmark BOOKMARK_ID --yes --json
weread-omni --account "$ACCOUNT" review delete REVIEW_ID --yes --json
weread-omni --account "$ACCOUNT" public-accounts unsubscribe MP_WXS_123 --yes --jsontotalCount from the compact shelf response. In a --full response, the
total is books.length + albums.length + (non-empty mp ? 1 : 0). Do not
answer from bookCount alone.reviewCount + noteCount + bookmarkCount.
noteCount is highlights only, and reviewCount already includes personal
thoughts/reviews. Exportable content requires both notes bookmarks and
notes mine; highlight text is returned, but type-0 bookmark text is not.preferAuthor[].readTime, which is already formatted text. Reading progress
is an integer percentage: 1 means 1%, and only 100 means finished.20, 40, 60, 80, 100 for one through five
stars. Personal-note review ratings may instead be 0-5 or -1 for none.deepLink directly as the open link. Never construct one when
the response omits it. Convert Unix timestamps to dates before presenting
them.{ "error": ... }, explain the error without guessing or silently
switching commands.errCode -2010 and -2013 are the server's own rate-limit and entitlement
decisions. Report them as such rather than retrying in a loop or trying a
different command to work around them.hasMore=1, nextOffset, or
the command's documented cursor). If the response omits a completion
signal, report that the available page is bounded rather than claiming it is
the complete result set.© teng-lin, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file in skills/weread of teng-lin/weread-omni.
Open the folder on GitHubat commit 88bd2e0
WeRead Bookshelf and Notes next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| WeRead Bookshelf and Notes this skillteng-lin/weread-omni | 660 | — | ~3.3k | Automated safety check: Pass | MIT | |
| Greenbubbles Personal Memorybojieli/greenbubbles | 365 | — | ~669 | Automated safety check: Pass | MIT | |
| Obsidian CLIpablo-mano/Obsidian-CLI-skill | 450 | — | ~3.2k | Automated safety check: Pass | None | |
| Daily Notes Workflowballred/obsidian-claude-pkm | 1.9k | — | ~2k | Automated safety check: Pass | MIT | |
| Tencent ima Knowledge Base Readerzj-unicom-ai/UniEmployee | 360 | — | ~1k | Automated safety check: Pass | MIT | |
| Xiaohongshu Post Extractorchenxiachan/xhs-claude-skills | 421 | — | ~1.5k | Automated safety check: Warn | MIT |
bojieli/greenbubbles
Build or revise private, cited Markdown notes from the user's WeChat history in the current agent session.
pablo-mano/Obsidian-CLI-skill
Lets the agent read, write, search and tidy an Obsidian vault directly through the official Obsidian command-line interface.
ballred/obsidian-claude-pkm
Creates today's daily note in an Obsidian vault and guides morning, midday and evening routines for planning, task review and reflection.
zj-unicom-ai/UniEmployee
Exports the article list and original article text from a Tencent ima knowledge base through a logged-in Chrome session, using browser automation.
chenxiachan/xhs-claude-skills
Pulls a Xiaohongshu post's text, image text and video subtitles or transcript into a Markdown note saved in an Obsidian folder, in Chinese.
kv0906/pm-kit
Log standup update with keyword detection. An agent skill from kv0906/pm-kit.
Works with
Searches books, manages the shelf, reads public-account articles and reads or writes highlights and notes in WeRead through the weread-omni CLI. The agent talks to WeRead only through the weread-omni command-line tool, always with --json, and summarizes the parsed result. It picks one account alias for the whole session and never switches after a failure.
WeRead Bookshelf and Notes fits situations like: looking up a book or author on WeChat Reading; reviewing or adding highlights and notes on a book on your WeRead shelf; reading a public-account article through WeRead; checking reading statistics or recommendations from your WeRead account.
Run `npx skills add teng-lin/weread-omni --skill weread -a claude-code`. Or copy the skill folder (skills/weread in teng-lin/weread-omni) into .claude/skills/weread in your project. Claude Code loads it when a task matches its description.
Run `npx skills add teng-lin/weread-omni --skill weread -a codex`. Or copy the skill folder (skills/weread in teng-lin/weread-omni) into .agents/skills/weread in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add teng-lin/weread-omni --skill weread -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/weread, .gemini/skills/weread, .github/skills/weread and .opencode/skills/weread in your project.
SKILL.md names no scripts, command-line tools or credentials: WeRead Bookshelf and Notes is instructions for the agent only. Our summary lists: The weread-omni CLI installed; A logged-in WeRead account.
SKILL.md names 1 domain. In commands or code: mp.weixin.qq.com; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
WeRead Bookshelf and Notes is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.3k tokens (SKILL.md is roughly 13k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with WeRead Bookshelf and Notes: Greenbubbles Personal Memory (bojieli/greenbubbles, 365 stars), Obsidian CLI (pablo-mano/Obsidian-CLI-skill, 450 stars), Daily Notes Workflow (ballred/obsidian-claude-pkm, 1.9k stars) and Tencent ima Knowledge Base Reader (zj-unicom-ai/UniEmployee, 360 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
teng-lin (a GitHub user) maintains it in teng-lin/weread-omni, which has 660 GitHub stars. The repository was last updated on September 14, 2026.
Source: teng-lin/weread-omni on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.