async0z013 downloadsPrepare and save Obsidian notes as drafts across supported content platforms.
Crosspost Studio is a local-first desktop plugin and Chromium extension that creates or updates drafts on WeChat Official Account, Zhihu, Juejin, CSDN, OSChina, BlogsCN, Jian Shu, SegmentFault, 51CTO, Baijiahao, and Toutiao — all from a single Markdown source note. Bilibili Columns and Tencent Cloud Developer Community are supported as well. It saves drafts only; it does not publish.
Status: buildable MVP. DOM adapters have been tested with offline fixtures; real platform drafts should still be verified with dedicated test accounts before production use.
127.0.0.1; no cloud
relay, telemetry, or persistent article body storage.unknown and
auto-rebuild is locked to prevent duplicate drafts.apps/
obsidian-plugin/ ItemView, preview, SecretStorage, WeChat API, local bridge
browser-extension/ WXT/MV3 extension, on-demand permissions, visible-editor adapters
packages/
core/ Markdown AST, embeds, image dedup, themes, CSS inlining, render adapters
protocol/ Versioned message schemas, HMAC pairing, runtime validation & sanitization
test-vault/ Acceptance samples isolated from your main vault (no .obsidian state)
#crosspost-root and on an
allowlist are acceptedRequires Node.js 24 and pnpm 11.18. All dependencies are installed in the project:
pnpm install
pnpm check
pnpm release:package
Release artifacts:
dist/main.js, dist/manifest.json, dist/styles.css (build-verifier copies)dist/obsidian/main.jsdist/obsidian/manifest.jsondist/obsidian/styles.cssdist/chromium/*.zipWhen developing the plugin, create a dedicated test vault — do not develop directly
against your main vault. Place the three Obsidian files above into
.obsidian/plugins/crosspost-studio/ of the test vault, then enable the plugin.
Chromium extension dev builds live in apps/browser-extension/.output/chrome-mv3/;
load them as an unpacked extension in your browser's extensions page.
Once the Obsidian community directory review is complete, search for
"Crosspost Studio" under Settings → Community plugins → Browse. During review
you can download main.js, manifest.json, and styles.css from
GitHub Releases and
place them in <Vault>/.obsidian/plugins/crosspost-studio/.
WeChat Official Account requires only the Obsidian plugin. The version-numbered
Obsidian Release intentionally contains only main.js, manifest.json, and
styles.css. The other twelve platforms also need the Chromium extension ZIP from
the separate browser-<version> Release; unzip it and load it as an unpacked
extension in Chrome or Edge.
Tag builds generate GitHub provenance attestations for every release asset. For example, verify a downloaded plugin bundle with:
gh attestation verify main.js -R yorha2B0826/crosspost-studio
WeChat direct connections access:
https://api.weixin.qq.com/cgi-bin/tokenhttps://api.weixin.qq.com/cgi-bin/media/uploadimghttps://api.weixin.qq.com/cgi-bin/material/add_materialhttps://api.weixin.qq.com/cgi-bin/draft/addhttps://api.weixin.qq.com/cgi-bin/draft/updateThe extension only requests storage, scripting, tabs, and
http://127.0.0.1/* (to read one-shot local resources); the twelve browser-platform
hosts are optional permissions requested on demand — no cookies. CI audits the
final manifest and common secret patterns.
crosspost:
title: optional, defaults to file name
author: optional
summary: optional
cover: "[[cover.png]]"
targets: [wechat, zhihu, juejin, csdn, oschina, cnblogs, jianshu, segmentfault, 51cto, baijiahao, toutiao, bilibili, tencentcloud]
bindings:
wechat:
draftId: ""
sourceHash: ""
updatedAt: ""
zhihu:
draftUrl: ""
sourceHash: ""
updatedAt: ""
juejin:
draftUrl: ""
sourceHash: ""
updatedAt: ""
csdn:
draftUrl: ""
sourceHash: ""
updatedAt: ""
oschina:
draftUrl: ""
sourceHash: ""
updatedAt: ""
cnblogs:
draftUrl: ""
sourceHash: ""
updatedAt: ""
jianshu:
draftUrl: ""
sourceHash: ""
updatedAt: ""
segmentfault:
draftUrl: ""
sourceHash: ""
updatedAt: ""
51cto:
draftUrl: ""
sourceHash: ""
updatedAt: ""
baijiahao:
draftUrl: ""
sourceHash: ""
updatedAt: ""
toutiao:
draftUrl: ""
sourceHash: ""
updatedAt: ""
bilibili:
draftUrl: ""
sourceHash: ""
updatedAt: ""
tencentcloud:
draftUrl: ""
sourceHash: ""
updatedAt: ""
After a successful save only the target platform binding is updated via
FileManager.processFrontMatter; other frontmatter fields and platform bindings
are preserved.
test-vault/验收文章.md
contains Chinese text, headings, lists, tables, code, local/remote images,
inline/block formulas, and a Mermaid flowchart.
Real acceptance should use dedicated test accounts, verifying first draft creation, draft-link write-back, and second-save update for each platform in sequence. Login and draft saving must be explicitly authorized by the account holder; final publishing is always manual. CSDN, OSChina, BlogsCN, Jian Shu, SegmentFault, 51CTO, Baijiahao, Toutiao, Bilibili Columns, and Tencent Cloud Developer Community have passed offline DOM fixture, image-paste state-machine, and build checks but have not yet claimed real account verification.
See SECURITY.md. This project collects no telemetry, does not write credentials into the repository, does not read browser cookies, and does not restore or persist article body text across extension restarts.
127.0.0.1 to the
local extension when the user explicitly saves a draft; the extension then writes
into the visible editor where the user is already logged in.MIT. This project is an independent implementation — it does not fork mdnice and does not copy its GPL-3.0 code.
The platform list, Markdown/HTML output differences, and draft-idempotency approach were informed by wechatsync/Wechatsync. That project is GPL-3.0 and some of its adapters work via cookies, private interfaces, and request-header rewriting; Crosspost Studio has not copied those implementations and uses only independently-written visible-editor DOM adapters to remain compliant with the MIT license and the zero-cookie/zero-private-interface boundary. Platform entry URLs and strict draft URL allowlists are verified independently before an adapter is enabled.
Crosspost Studio 是一个本地优先的桌面插件与 Chromium 扩展,用同一篇 Markdown 源稿创建或更新微信公众号、知乎、掘金、CSDN、开源中国、博客园、简书、思否、 51CTO、百家号、今日头条、B站专栏和腾讯云开发者社区草稿。它只保存草稿,不执行最终发布。
当前状态:可构建的 MVP。DOM 适配器已用离线 fixture 测试;真实平台草稿仍应使用 专用测试账号逐项验收后再用于正式内容。
127.0.0.1 通信;没有云端中转、遥测或文章正文持久化。unknown 并锁住自动重建,防止重复草稿。apps/
obsidian-plugin/ ItemView、预览、SecretStorage、微信 API、本地 bridge
browser-extension/ WXT/MV3 扩展、按需权限、可见编辑器适配
packages/
core/ Markdown AST、嵌入、图片去重、主题、CSS 内联与渲染适配器
protocol/ 版本化消息 schema、HMAC 配对、运行时校验与脱敏
test-vault/ 与主 Vault 隔离的验收样例(不包含 .obsidian 状态)
#crosspost-root 作用域开头且位于白名单内的属性需要 Node.js 24 和 pnpm 11.18。依赖全部安装在项目内:
pnpm install
pnpm check
pnpm release:package
发布物位于:
dist/main.js、dist/manifest.json、dist/styles.css(供构建审核发现)dist/obsidian/main.jsdist/obsidian/manifest.jsondist/obsidian/styles.cssdist/chromium/*.zip开发插件时请创建独立测试 Vault,不要直接在主 Vault 开发。将上面三个文件放入测试
Vault 的 .obsidian/plugins/crosspost-studio/,再启用插件。Chromium 扩展开发构建
位于 apps/browser-extension/.output/chrome-mv3/,可在浏览器扩展页面以
"加载已解压的扩展"方式加载。
Obsidian 社区目录审核完成后,可在 设置 → 第三方插件 → 浏览 中搜索
"Crosspost Studio"。审核期间可以从
GitHub Releases
下载 main.js、manifest.json 和 styles.css,放入
<Vault>/.obsidian/plugins/crosspost-studio/。
微信公众号只需要 Obsidian 插件。版本号对应的 Obsidian Release 会刻意只包含
main.js、manifest.json 和 styles.css。其余十二个平台还需要独立的
browser-<version> Release 中的 Chromium 扩展 ZIP;解压后在 Chrome 或 Edge
的扩展管理页面选择“加载已解压的扩展”。
标签构建会为每个发布物生成 GitHub provenance attestation。例如可这样验证下载的 插件文件:
gh attestation verify main.js -R yorha2B0826/crosspost-studio
微信直连会访问:
https://api.weixin.qq.com/cgi-bin/tokenhttps://api.weixin.qq.com/cgi-bin/media/uploadimghttps://api.weixin.qq.com/cgi-bin/material/add_materialhttps://api.weixin.qq.com/cgi-bin/draft/addhttps://api.weixin.qq.com/cgi-bin/draft/update扩展只申请 storage、scripting、tabs 和 http://127.0.0.1/*(读取一次性本地
资源);十个浏览器平台的域名都是按需申请的可选权限,不申请 cookies。CI 会审计
最终 manifest 以及常见密钥特征。
crosspost:
title: 可选,默认使用文件名
author: 可选
summary: 可选
cover: "[[cover.png]]"
targets: [wechat, zhihu, juejin, csdn, oschina, cnblogs, jianshu, segmentfault, 51cto, baijiahao, toutiao, bilibili, tencentcloud]
bindings:
wechat:
draftId: ""
sourceHash: ""
updatedAt: ""
zhihu:
draftUrl: ""
sourceHash: ""
updatedAt: ""
juejin:
draftUrl: ""
sourceHash: ""
updatedAt: ""
csdn:
draftUrl: ""
sourceHash: ""
updatedAt: ""
oschina:
draftUrl: ""
sourceHash: ""
updatedAt: ""
cnblogs:
draftUrl: ""
sourceHash: ""
updatedAt: ""
jianshu:
draftUrl: ""
sourceHash: ""
updatedAt: ""
segmentfault:
draftUrl: ""
sourceHash: ""
updatedAt: ""
51cto:
draftUrl: ""
sourceHash: ""
updatedAt: ""
baijiahao:
draftUrl: ""
sourceHash: ""
updatedAt: ""
toutiao:
draftUrl: ""
sourceHash: ""
updatedAt: ""
bilibili:
draftUrl: ""
sourceHash: ""
updatedAt: ""
tencentcloud:
draftUrl: ""
sourceHash: ""
updatedAt: ""
保存成功后只通过 FileManager.processFrontMatter 更新对应平台 binding,其他
frontmatter 字段和平台 binding 会保留。
test-vault/验收文章.md
包含中文、标题、列表、表格、代码、本地/远程图片、行内/行间公式和 Mermaid 流程图。
真实验收应使用专用测试账号,依次验证各平台首次建稿、草稿链接回写,以及第二次保存 更新原草稿。登录与草稿保存必须由账号持有人明确授权;最终发布始终人工完成。CSDN、 开源中国、博客园、简书、思否、51CTO、百家号、今日头条、B站专栏和腾讯云开发者社区目前已通过离线 DOM fixture、 图片粘贴状态机和构建检查,尚未宣称完成真实账号验收。
参见 SECURITY.md。本项目不收集遥测,不把凭据写入仓库,不读取浏览器 Cookie,也不会在扩展重启后恢复或持久化文章正文。
127.0.0.1 发送到本机扩展,
再写入用户已登录的可见编辑器。MIT。本项目是独立实现,不 fork mdnice,也不复制其 GPL-3.0 代码。
平台清单、Markdown/HTML 输出差异和草稿幂等思路参考了 wechatsync/Wechatsync。该项目使用 GPL-3.0,且其部分适配器通过 Cookie、私有接口与请求头改写工作;Crosspost Studio 没有复制这些实现,只采用独立编写的可见编辑器 DOM 适配器,以继续满足 MIT 许可和 零 Cookie/零私有接口边界。启用适配器前会独立验证平台写作入口和严格的草稿 URL 白名单。