gh-my-posts
Local dashboard for your own GitHub discussions, issues and inbox (read-only; single Node file, no git needed)
- Stars
- 0
- Language
- JavaScript
- Created
- Oct 4, 2026
- Updated
- Oct 5, 2026
Introduction
gh-my-posts · 我的 GitHub 看板
把你在 GitHub 上的动静汇总成一页:收件箱 + 我发起的 + 我参与的,点一下就跳过去。
| 区块 | 内容 |
|---|---|
| 📥 收件箱 | GitHub 通知里属于你的新回复 —— 谁回的你、在哪个帖子、什么原因 |
| ✍️ 我发起的 | 你创建的 Discussions / Issues(含评论数、最后回复是谁) |
| 💬 我参与的 | 你评论过、但不是你发起的帖子(按 仓库#编号 剔除已在我发起里的) |
全程只读,不发送任何写请求。
两种用法,选一个就行
| 方式 | 适合谁 | 入口 |
|---|---|---|
| 脚本版(单文件 Node) | 任何人 / 任何环境,只要装了 Node 与 gh | 本仓库根目录的 gh-my-posts.mjs,双击 run.cmd(Windows)或 bash run.sh |
| DSH 插件版 | 在用 DeepSeek Harness 的话 —— 界面里直接有面板,不用开浏览器 | panel/ 目录,见文末「插件版」一节 |
两版取数逻辑同源(同一套 gh 调用与字段映射),差别只在呈现:脚本版吐一个本地 HTML,插件版是一个常驻面板。
📺 视频介绍(B 站,27 秒):https://www.bilibili.com/video/BV1NCHs6iE1m
为什么需要它
因为 GitHub 上「我发的」和「我参与的」是两个不同的地方,而且后者特别难找:
- 自己发的:要么靠
author:搜索,要么一个个仓库的 Discussions 页去翻; - 参与过的:得靠
involves:限定符 —— 通知页里根本没有它。
顺带澄清一个常见误解:通知页不是"我发了什么"的列表。它是「别人对我做了什么」的收件箱 —— 你自己发帖不会通知你自己,所以那里永远看不到你发的内容。
依赖
- Node.js 18 或更新
- GitHub CLI(命令是
gh),并且已经gh auth login
脚本版用法
node gh-my-posts.mjs
- Windows:双击
run.cmd - macOS / Linux:
bash run.sh
它会在同目录生成 my-posts.html 并用默认浏览器打开。
换账号 / 换输出路径
GH_MY_POSTS_USER=someone-else node gh-my-posts.mjs # 不填则用 gh 当前登录的账号
GH_MY_POSTS_HTML=~/dashboard.html node gh-my-posts.mjs
Windows PowerShell 写法:
$env:GH_MY_POSTS_USER = 'someone-else'; node gh-my-posts.mjs
它怎么取数
| 区块 | 来源 |
|---|---|
| 收件箱 | gh api notifications --paginate —— GitHub 官方通知,"是否未读"由 GitHub 自己维护,不需要工具自己记时间戳 |
| 我发起的 | GitHub 搜索 author:<你>,分别取 discussion 与 issue |
| 我参与的 | GitHub 搜索 involves:<你>,再剔除上面那一类 |
插件版(DSH)
panel/ 是一个标准的 DSH bundle:host 半边开一条只读路由 GET /gh-my-posts-panel/data,client 半边在左侧栏加一个 GitHub 图标,点开后主区域就是那三块列表。
安装分两步(用 DSH 官方的插件管理器,不要手改 profile 的 package.json):
第一步:把 panel/ 弄到本地。 它必须是本地目录才能安装 —— 用 git 的话:
git clone --depth 1 https://github.com/luoyukun3-oss/gh-my-posts.git
# 插件目录就是 ./gh-my-posts/panel
不用 git 的话,在 GitHub 网页上进 panel/ 逐个下载 package.json、cordis.patch.yml、src/index.js、lib/client.js,按相同结构放好。
第二步:安装这个目录。
plugin_manager action=install_bundle target=<本仓库 panel/ 目录的绝对路径>
装完刷新一次页面(浏览器半边的插件要重新加载页面才会装载)。
行为细节:
- 数据在 host 侧缓存 60 秒(用来秒开;
?force=1绕过)。打开面板时先用缓存立刻渲染,再在后台补拉一次新的 —— 实测真拉一次要 3.2~3.6 秒(host 要跑 2 次gh),而命中缓存只要 12 ms,所以体感是"瞬间出现、随即变新"; - 从 GitHub 切回窗口时会自动重拉(监听
focus/visibilitychange),所以你在 GitHub 上读完一条再回来,未读状态会立刻更新。刷新带防抖(10 秒内只刷一次)—— 两个事件会几乎同时触发,不防抖会连拉两次gh; - 点条目在新标签打开对应页面。
给写 DSH UI 插件的人一个踩坑提醒:cordis_inspect_query 只要传 platform: client(例如 Slots.listSubTree、Theme.listTokens),就会等页面应答;页面不应答时它静默挂起 —— 不报错、不超时(我们实测卡了 3 小时零输出,直到手动取消)。写 UI 插件建议直接照 templates/ 里的现成例子改,不要先查 client slot 树。
已知限制
- 搜索接口每类最多取 50 条;
- 通知默认只返回未读(GitHub 的行为)—— 你在 GitHub 上清掉通知后就看不到了;
- 需要能访问
api.github.com(公司网络或代理环境下可能被拦;若代理开了 fake-IP,Hostname resolves to a non-public IP address这类报错来自地址校验,改代理侧而不是改这里); - 脚本版输出的是生成时的快照,不是实时刷新 —— 想更新就再跑一次(插件版会自动/手动刷新)。
License
MIT