迁出 dev-ai 测试域名
dev-ai.candobear.com 不再展示 wechat2readwise 审核页,改为独立的 Casdoor 微信登录测试入口。
tech移除 wechat-to-readwise Worker 上的 dev-ai.candobear.com route,保留 wechat2readwise.candobear.com 作为唯一生产业务域名。
product.log / infrastructure for Chinese internet reading
Readwise Reader 是长期阅读的基础设施。wechat2readwise 会持续修复中文互联网里的剪藏断点,让微信文章更稳定地进入你的 Reader。
每次功能、修复或体验优化完成后,都会追加到这里。
dev-ai.candobear.com 不再展示 wechat2readwise 审核页,改为独立的 Casdoor 微信登录测试入口。
tech移除 wechat-to-readwise Worker 上的 dev-ai.candobear.com route,保留 wechat2readwise.candobear.com 作为唯一生产业务域名。
微信登录回调遇到临时配置异常时,会显示可读的登录失败提示,不再直接出现 Cloudflare 1101 页面。
techCasdoor OAuth callback 增加异常兜底和结构化日志;token 交换前的运行时配置异常会返回 502 登录失败页,便于重新发起登录和后台定位。
在手机微信里打开 account 时,微信登录会继续使用原微信登录配置,并由 Casdoor 自动切到服务号网页授权。
techCasdoor 授权 URL 会附加 provider_hint=wechat_pc;Casdoor 在微信内置浏览器回调时会使用该 provider 的 clientId2/clientSecret2 交换服务号网页授权 code。这样避免新建 provider 时 masked secret 被保存为 *** 导致 40125 invalid appsecret。旧账户仍优先通过 account_auth 或历史微信 openid 找回,不要求用户重新注册。
account 入口只展示微信登录。已有用户不需要重新注册,就能回到账户页、绑定 Readwise 和更新 Token。
tech微信登录由 auth.candobear.com Casdoor OIDC/OAuth 承载,/account?lookup=wechat 和 /account?lookup=auth 都进入同一条登录链路;Worker 会优先按 account_auth 命中账户,并在 Casdoor userinfo 暴露历史微信 openid 时补写 account_auth 索引。微信支付 openid 只作为支付身份保留,不会用统一登录 subject 替代。
为微信开放平台网站应用审核,临时提供 dev-ai.candobear.com 展示产品介绍页。
tech将 dev-ai.candobear.com/* 作为 Worker route 接入现有 Cloudflare 代理域名;该域名只直接服务产品页、健康检查和页面所需静态资源,其他路径会跳回正式域名。
转发 Readwise Reader 的 shared 链接后,新保存的条目会保留原 shared 链接,并带上标题、摘要和正文,不再显示为空标题。
tech保存 readwise.io/reader/shared/<id> 时先抓取公开分享页的正文 HTML 与元数据,再把用户转发的 shared URL 作为 Reader 文档 URL 提交给 Readwise。
误打开 wechat2readwise.candobear.ai 的用户现在会自动跳转到正式的 wechat2readwise.candobear.com,不再看到 Cloudflare DNS 错误页。
tech将 wechat2readwise.candobear.ai 作为 Worker custom domain 接入,并在业务路由前统一 308 跳转到 canonical host,保留原路径和查询参数;微信 OAuth、支付和文件导入仍以 .com 作为唯一业务域名。
新保存的公众号文章会先清掉微信编辑器残留的空列表、不可读组件和重复标题,再进入 Reader。手机端使用朗读功能时,文字高亮和播放进度会更容易保持同步。
tech保存 mp.weixin.qq.com 文章时仍会提取正文 HTML、标题、作者、摘要、封面和发布时间;正文不再额外注入可见标题或署名,并会移除 mp-* 自定义组件、空白段落/列表项和 data-pm-slice 等编辑器属性,随后用 should_clean_html 交给 Reader 做最终清洗。
付费按钮下方新增一段说明,让用户知道这个工具背后有持续的服务成本,也能更清楚地理解订阅支持的意义。
tech账户页支付按钮后新增 support-note 文案,并让空的支付状态提示不再预留高度。
新用户添加企业微信个人号后,会收到更清晰的欢迎说明和一个专属账户入口。这个入口可用于首次绑定 Readwise,也会在绑定成功后长期回到账户页。
tech客户联系欢迎卡片 URL 从 /setup/<nonce> 调整为 /account/setup/<nonce>;底层仍复用 setup session,旧 /setup/<nonce> 链接继续兼容,OAuth 回调会保持 account setup 路径。
账户页现在只保留 Readwise 账号邮箱和更新入口,Token 尾号、更新时间和更新表单集中到二级页面,主页面更适合快速查看额度和订阅状态。
tech/account/<accountKey> 的 Readwise 摘要改为紧凑账号条,并放在使用额度和订阅状态上方;/account/<accountKey>/readwise 增加 Readwise Access Token 获取地址。
曾经绑定过 Readwise Token 的用户,如果 account 页面没有自动找到账号,现在可以用 Readwise 邮箱和 Access Token 找回账户,继续查看状态、订阅支付和更新绑定。
tech/account 的微信找回未命中时会创建短时 account recovery session;用户提交 Readwise 邮箱和 Token 后,Worker 校验 Token 并匹配旧加密记录,成功后补齐 accountKey、wechatOpenid 和 account_openid 索引。
如果删除企业微信好友后重新添加没有收到新欢迎语,用户现在可以从 account 入口通过微信身份找回已绑定账户;旧绑定链接再次打开也会回到账户页。
tech绑定成功后保留 /setup/<nonce> 到 /account/<accountKey> 的长期跳转,并增加 account_openid 索引用于 /account 的服务号 OAuth 找回。
账户与订阅页现在只展示 Readwise 绑定状态;需要更换邮箱或 Access Token 时,可从更新入口进入单独页面处理。
tech/account/<accountKey> 保留绑定摘要和订阅支付,/account/<accountKey>/readwise 增加独立更新页面,提交成功后回到账户总览。
顶部导航里的账户入口文案已简化为 account,和 product、changelog 的命名风格保持一致。
tech共享 page header、/account 中转页标题、文档和公开 changelog 文案统一使用 account。
顶部导航现在会用深蓝色标出当前页面,其他页面入口颜色更浅,三页切换时位置和状态更清楚。
tech共享 page header 增加 active page 参数和 aria-current 标记,用统一 CSS 区分选中与未选中导航项。
产品页、账户页和 changelog 页现在使用完全一致的顶部导航,切换页面时品牌、链接和尺寸保持统一。
tech抽取共享 page header 渲染和样式,三个页面复用同一份 header markup;移除产品页独有的顶部扫码按钮,扫码入口保留在正文。
产品页的 account 和 changelog 入口已移到顶部导航,页面底部不再保留重复的白色链接区。
tech首页 header 增加 account / changelog 导航,并移除 footer 白色区域;移动端保留顶部账户和更新日志入口。
产品页、账户页和 changelog 页面现在都能互相跳转,用户不需要依赖浏览器返回键切换页面。
tech账户页增加 product / changelog 顶部导航,changelog 增加 product / account 导航,并继续通过 /account 中转保护具体账户链接。
产品页底部现在提供 account 和 changelog 两个入口,用户可以从首页回到已保存的账户页。
tech首页 footer 增加 /account 和 /changelog 英文链接;/account 会尝试读取本机保存的账户路径并跳转,账户页打开时会记录当前账户路径。
用户现在可以在长期账户页查看已绑定邮箱、Token 尾号和更新时间,并随时更换 Readwise 邮箱和 Access Token。
tech/account/<accountKey> 增加 Readwise 绑定管理表单和 /account/<accountKey>/readwise 更新入口;页面只展示 Token 遮罩预览,不展示完整 Token。
微信内打开绑定 readwise 账户页面时,页面现在会按手机屏幕宽度铺满,不再出现右侧留白。
tech绑定页移动端布局移除固定 390px 宽度,改为流式 100% 宽度,并保留桌面最大宽度约束。
订阅页去掉顶部重复标题;付费后显示额度不限,订阅状态只保留有效期。
tech账户页按 paidUntil 渲染权益摘要,FAQ 更新客服微信 happy_logos,并移除过期支付恢复提示。
新用户可以先免费剪藏 3 篇文章;免费额度用完后,需要订阅月卡或年卡继续保存。
tech生产环境开启 BILLING_ENFORCEMENT_ENABLED,文章和文件保存入口会按免费额度与订阅有效期判断权益。
微信内打开订阅页时,页面现在会按手机屏幕宽度铺满,不再出现右侧留白。
tech账户页移动端布局移除固定 390px 宽度,改为流式 100% 宽度,并保留桌面最大宽度约束。
从微信转发 EPUB 电子书后,现在会和 PDF 一样进入 Reader Inbox,并保留文件标签。
tech文件暂存 URL 改为 Worker /reader-files/... 出口,由 Worker 从私有 R2 流式返回并同时支持 HEAD/GET;保存成功后追加 Reader metadata update 补齐 reader-file 标签。
企业微信个人号开始具备接收 PDF、EPUB、OPML、XML、CSV 文件并导入 Reader 的服务端链路。
tech会话存档 poller 增加文件识别、Finance SDK 媒体下载、R2 临时暂存;Worker /archive/ingest 增加文件去重和 Readwise 文件保存 payload。
用户现在可以在产品页底部进入更新日志,看到 wechat2readwise 的持续迭代记录。
tech新增 /changelog 静态路由,更新内容由结构化 TypeScript 数据维护。
保存到 Reader 的内容统一带上 wechat-to-readwise 标签,公众号文章会额外标记为 wechat-articles。
techReadwise 保存 payload 支持按文章类型传入 tags,并对标签做去重和清洗。
账户页、服务号授权和微信支付路径已经准备好,后续可以在验证稳定后逐步开启订阅闭环。
tech新增 JSAPI 下单、支付通知验签解密、订单幂等和 paidUntil 延期逻辑,保存拦截仍由独立开关控制。
不同用户可以绑定自己的 Readwise Token,转发文章后保存到各自的 Reader Inbox。
tech会话内容存档 poller 传入 archiveUserId,Worker 按用户记录解密并调用对应的 Readwise Token。
用户添加企业微信个人号后,会收到专属绑定链接,用邮箱和 Readwise Access Token 完成初始化。
tech客户联系回调创建一次性 setup 会话,并通过固定 IP relay 发送欢迎文字和链接卡片。
公众号文章会保存正文、标题、摘要、封面和发布时间,不再只依赖 Reader 自己抓取微信链接。
tech保存前抓取 mp.weixin.qq.com 页面,提取 js_content,并向 Readwise Reader 提交 HTML snapshot 和元数据。
带图片的公众号文章保存到 Reader 后,正文图片也能正常进入阅读内容。
tech将微信懒加载图片的 data-src、data-original、data-backsrc 规范化为真实 src。