Introduction¶
If you use DeepSeek Harness (dsh) with multiple agents or work extensively within the dsh interface and want to quickly check what you read today or which sentences you highlighted on this day last year, you have to toggle back and forth between the browser and WeChat Read. Existing approaches involve viewing in the WeChat Read App / web, or exporting data to other tools; the former is not integrated into dsh, and the latter requires manual synchronization.
zhaohongxuan/dsh-weread is a native dsh Web plugin maintained by zhaohongxuan. It addresses the issue of “bringing WeChat Read’s bookshelf, highlights, notes, and reading statistics into the dsh interface”: adding a “WeChat Read” entry to the left sidebar, inside which are five tabs: Today’s Reading, Review, Bookshelf, Annual Book Wall, and Statistics, and capable of generating AI summaries using dsh’s built-in models. The repository is released under the MIT license, current version 0.3.0, 77 stars and 5 forks on GitHub (as of 2026-11-06). The community directory page classifies it as “Internet Tools”.
Below is an introduction to this plugin.
Feature Overview¶
The plugin’s core capabilities are divided into five parts, all visible directly in the dsh interface:
- Today: Daily reading/listening duration, e-books read today, daily highlights and thoughts, “Reunion with Old Sentences” (randomly viewing a past highlight).
- Review: Calendar of notes based on the creation date of highlights and thoughts, supports jumping directly to a month, selecting a date, searching by book title/author/content, filtering highlights/thoughts, and “This Day in [Year]”.
- Bookshelf: Cover grid, search, filter, sort, showing real reading progress. Two data sources available, allowing switching between the bookshelf API and notes API. In bookshelf mode, folders and books are mixed; folders use internal covers to form thumbnails. Also supports folder pages and audiobooks (albums).
- Annual Book Wall & Statistics: Cover wall assembled by month, one per year, switchable by year; daily heat map for the whole year (switchable by year), category donut chart, 24-hour clock chart, favorite authors/publishers, most read, annual trends.
- AI Summary: Single book summary, highlight topic analysis, bookshelf reading profile. Uses dsh’s
ctx.llmstreaming output, reuses dsh’s configured model, no extra key required.
All WeChat Read requests are made on the host side; the browser only accesses the same-origin /api/weread/*. Authentication is via API Key only, no dependency on Cookies.
Architecture¶
The plugin uses a dual-half structure for dsh. The browser side is a React classic script bundle, attaching the sidebar.panellist icon and main panel; the host side is a Node ESM Cordis plugin, responsible for routing, WeChat Read gateway calls, parsing, caching, and AI.
Browser (React classic script bundle)
└─ sidebar.panellist icon + main panel ── fetch('/api/weread/*')
Host (Node ESM, Cordis plugin)
├─ routes.ts /shelf /bookshelf /book /chapters /highlights /reviews
│ /journal-cache /journal-notes /stats /heatmap /settings /auth /ai
├─ weread/gateway WeChat Read Agent Gateway client (Bearer Key · undici + optional proxy)
├─ weread/parse Raw response → DTO
├─ store/cache LRU + TTL + single request flight
├─ store/journalCache JSON cache per account + 24h incremental sync + breakpoint resume
└─ ai/ ctx.llm.stream streaming summary
Two points to note: First, the API Key only exists on the host side at $DSH_HOME/storages/dsh-weread/config.json (permissions 600), the browser side can only see a mask like wrk-****1234. Second, notes are not stored in a database, but isolated per account as JSON cache, reusable after refreshing the page or restarting dsh.
Requirements for the host environment come from package.json: node ^22.19.0 || >=24.0.0, dsh >=0.2.0-rc.2, and @deepseek-ai/cordis ^4.0.4 as a peerDependency on the browser bundle side.
Installation and Activation¶
Installation involves source code pull + build + linking to profile, no one-click command like dsh plugin add git.... The prerequisite is that DSH_HOME is configured (the example in the README is /volume2/docker/dsh/home), and the profile is web.
git clone https://github.com/zhaohongxuan/dsh-weread.git
cd dsh-weread
npm install --cache ./.npm-cache # Local global npm cache needs a different directory if owned by root
npm run build # Produces lib/index.js + lib/client.js
bash scripts/link-profile.sh web # Equivalent to dsh plugin --profile web add --save-prod file:$PWD
Then open dsh Web GUI → Settings → Plugins → Open dsh-weread → Refresh Page, and the “WeChat Read” entry will appear in the left sidebar.
Before installation, it is recommended to confirm that the plugin runs under the permissions of the current dsh process, and check if write locations like config.json and proxy meet your expectations.
Configuring the API Key¶
The plugin uses WeChat Read’s Agent Gateway Key, not filled in the plugin interface. Steps:
- Open dsh Global Settings → WeChat Read.
- Visit
https://weread.qq.com/api/skills/apikeyGet(returns apikey directly when logged in to WeChat Read), copy and paste into the input box. - Click “Save and Verify”, showing authorized is sufficient.
If prompted with “Network exit blocked by risk control (403)” but the Key is valid, it means the current exit IP is restricted by WeChat Read. You can configure a proxy that can access WeChat Read in the proxy field of config.json.
Bookshelf Data Source and Caching Behavior¶
The “Bookshelf Data Source” switch on the settings page determines which set of data the Bookshelf tab reads. The default bookshelf mode:
| Mode | API | Content |
|---|---|---|
| Bookshelf Mode (Default) | /shelf/sync |
All books on the shelf, folders (book lists), audiobooks (albums); mixed folders and books |
| Notes Mode | /user/notebooks |
Only lists books with notes, with counts of notes/thoughts, can be grouped by category and reading year |
A few practical differences:
- After switching, you need to click the ⟳ refresh button in the top right of the panel for it to take effect; the selection is persisted in
$DSH_HOME/storages/dsh-weread/config.json. - “Has Notes” filter and note badges only appear in notes mode because the bookshelf API does not return the number of notes for each book.
- Audiobook cards are not clickable:
albumIdandbookIdare two different ID spaces, the book details page cannot retrieve album data. - Default is automatic synchronization every 24 hours; entering the page reads the cache directly; after expiration, it retains old content and syncs in the background. “Today/Review” shares the same sync. First-time cross-book notes are scanned in batches of 6, showing progress batch by batch; exiting the page does not interrupt the host sync, and failures retain cached content and allow retry.
- Dates follow the browser’s local timezone; reading duration follows the daily-level statistics buckets from the WeChat Read upstream; when used across timezones, the date boundaries of the two may differ.
Suitable Scenarios and Notes¶
Suitable for those already working in dsh and using WeChat Read for personal reading records, especially scenarios where you want to complete the “What did I read today → Review old highlights → Annual book wall → Let the model summarize” chain within one interface.
A few points to note: The plugin runs with the permissions of the current dsh process, will read/write the plugin data directory, store the API Key, and access WeChat Read interfaces. Before installation, check the source code and the MIT license. The AI summary depends on the model configured on the dsh side (default provider=magpie, model=workbuddy/deepseek-v4.1-flash), not a model brought by the plugin itself. The review calendar only indicates dates with notes, not the complete reading history of those dates. The today’s book list only covers e-books recognizable on the current bookshelf and cannot be used to deduce the daily reading duration of each book.
Conclusion¶
The value of this plugin lies in connecting personal WeChat Read data into the dsh interface and conveniently using dsh’s models for summarization, with only one configuration item: the API Key. You need to link it yourself, suitable for users willing to view the source code and accept a source-level installation method.
- Directory: https://www.skillhub.cn/plugins/zhaohongxuan/dsh-weread
- GitHub: https://github.com/zhaohongxuan/dsh-weread