DevTrendsDeveloper trends
Accent color

DEV TRENDS / DAILY DISCOVERIES

Jun 7, 2026 · What developers are building

Daily discoveries from developer communities, independent makers, and open source.

AI 编码 Agent 在会议室连续喊了三次「Mission Accomplished」

最近我开始大量使用 AI 编码工具处理一些重复性的开发工作。 以前写代码的时候,人基本都坐在电脑前等结果。 现在不一样了。 很多任务交给 Agent 之后,我会直接让它在后台运行: 修改代码 修复问题 编写测试 重构模块 然后去做别的事情。 为了知道任务什么时候完成,我给完成通知设置了一个特别的声音。 《红色警戒》里的经典语音: Mission Accomplished. 效果非常好。 每次听到这个声音,我就知道 Agent 又干完了一件活。 直到有一天。 我离开工位去参加一个会议。 会议刚开始没多久。 突然。 会议室外面传来一声: Mission Accomplished. 我愣了一下。 心想: 谁还在玩《红色警戒》? 过了几分钟。 又来一次: Mission Accomplished. 这次我感觉有点不对劲。 然后。 第三次: Mission Accomplished. 这时候我终于意识到: 那是我的电脑。 原来在我离开工位后,蓝牙耳机断开了连接。 而 macOS 按照默认逻辑,自动把音频输出切换回了内置扬声器。 与此同时,后台运行的几个 AI 编码任务陆续完成。 于是电脑开始认真地向整个办公室汇报工作成果。 Mission Accomplished. Mission Accomplished. Mission Accomplished. 那一刻,所有人都知道我的 Agent 今天工作很努力。 事后想想。 问题其实不在通知音。 也不在 AI Agent。 macOS 的行为完全符合预期。 耳机断开了。 系统总要找一个新的输出设备。 大多数情况下,它会切换到内置扬声器。 逻辑上没有任何问题。 但现实里并不总是这样。 很多时候,我们根本不希望声音继续播放。 例如: 在办公室 在会议室 在共享空间 深夜工作 离开工位时 后台运行长时间任务时 这些场景下。 突然外放不是方便。 而是尴尬。 于是我开始寻找解决方案。 我找到了一些音频路由工具。 找到了一些自动化工具。 甚至找到了一些需要编写脚本的方案。 但始终没有找到一个足够简单的工具。 我真正想要的功能只有一句话: 当耳机断开并切换到内置扬声器时,立即静音。 仅此而已。 既然找不到。 那就自己做一个。 于是有了 QuietSwitch。 它是一个运行在 macOS 菜单栏中的小工具。 当检测到: 耳机 → 内置扬声器 这个切换发生时, 立即自动静音。 避免任何意外外放。 没有账号。 没有云服务。 没有复杂配置。 没有数据收集。 只解决一个问题。 有趣的是。 我觉得这个问题未来可能会越来越常见。 随着 AI Agent 和自动化工具越来越普及。 越来越多的人会把任务交给电脑,然后离开工位。 而任务完成通知、语音提醒、自动播放内容,也会越来越频繁地出现在人不在电脑前的时候。 软件变得越来越智能。 但有时候。 我们需要的并不是更智能的软件。 而是一个简单的保险丝。 QuietSwitch 就是这样一个小工具。 它诞生于一次有点尴尬的会议事故。 但我始终相信。 很多好产品,最开始都只是开发者想解决自己的一个小麻烦。 App Store:

Original
DTDesktop productivityDTSoftware developmentDTAgent observability
—

Tutti 是一个 macOS 菜单栏小工具,让你的多个扬声器同时播放同一段声音。

Tutti 一个声音,响遍全场 Tutti 是一个 macOS 菜单栏小工具,让同一份声音同时从多个输出设备播放。 macOS 的系统音频一次只能播放一个设备,想边外放边戴耳机、或者让客厅和卧室两组音箱一起响,系统自带的音量功能做不到,需要去 MIDI 里进行设置。 Tutti 补上了这个缺口。不用装任何虚拟音频驱动,也没有内核扩展,全部用苹果自带的 CoreAudio 框架实现。在菜单栏勾选多个输出,Tutti 会临时搭一个聚合设备,让每个设备同时发声;退出时原来的输出干净恢复,不留后台进程,也不留垃圾设备。 使用场景 家里多台蓝牙音响,同时播放一首歌曲,每个房间的音乐同步。 一台 Mac 能同时连两副、甚至三副 AirPods。在咖啡馆不方便外放?你和朋友一人戴一副,一起看同一部电影、听同一首歌。 老师上课时,可以通过耳机监听自己的声音,同时让现场的观众和学生听到功放的声音。直播、录课同理:自己戴耳机听,声音照常外放。 任何"想让同一份声音同时去几个地方"的场景。 核心功能 多设备同步输出,在菜单栏勾选有线音箱、、蓝牙耳机、AirPods、显示器的任意组合,同一个声音同时播,完全同步。 音量控制,一个主音量统一调全组,每个设备还能单独调音量和静音。 蓝牙电量,连着的蓝牙耳机电量直接显示在面板里,不用再去系统里查。 替代系统音量图标,可以把 Tutti 设成菜单栏那个音量图标,按音量键时弹的也是它自己的 OSD。 快捷键增强,键盘音量键和滚轮直接控制整组输出,还能把常用的设备组合存成预设,一键切换。 主要能力 源码在 GitHub 上公开(PolyForm Noncommercial 许可)。支持 9 种语言,需要 macOS 13 及以上。 Github:

Original
DTDesktop productivityDTLifestyle & entertainmentDTDesktop app
—

Scout4j:让 AI 编程助手先读懂 Java 后端项目,再动手改代码

Scout4j Scout4j 是一个面向 Java 企业后端项目的 AgentSkill,用来约束 AI 编程助手在修改代码前,先调查项目结构、读取本地约定、参考相邻实现,再制定计划、修改代码和验证结果。 现在很多人已经开始用 Claude Code、Cursor、Codex 等 AI 编程工具处理真实业务代码。但在 Java 后端项目里,AI 很容易犯一个问题:还没看懂项目,就直接开始改。 比如: 没看现有分层结构,就新建一套不一致的代码; 没看 mapper / repository 写法,就乱补 SQL; 没理解事务边界,就把逻辑拆错位置; 没确认 RPC / MQ / CDC / 下游依赖,就只改了表面代码; 没跑针对性测试,就给出“已完成”的结论。 Scout4j 想解决的就是这个问题:给 AI 编程助手一套 Java 企业后端工作的流程约束。 它会引导 Agent 按下面顺序工作: investigate → plan → edit → verify → summarize 也就是: 1. 先调查仓库结构和本地约定; 2. 再根据任务类型读取对应参考; 3. 然后制定修改计划; 4. 修改代码; 5. 最后做针对性验证和总结。 适用场景 Scout4j 覆盖了一些常见 Java 后端任务: 新增字段 / API / 数据库 schema; bug fix 和 code review; 事务边界和一致性问题; RPC / 下游依赖的超时、重试、失败传播; MQ / CDC 消费和投影更新; 数据修复 / backfill job; 分页、性能和 SQL / mapper 一致性; 单元测试、集成测试和验证策略。 特点 不绑定具体公司架构; 不默认假设 Spring Boot、Maven、MyBatis、JPA、Kafka 或 DDD,除非目标仓库本身体现这些模式; 重点不是“给出标准答案”,而是让 Agent 先读懂项目,再按项目已有风格改; 提供了若干细分参考文档,例如 RPC、事务、数据修复、性能、测试等; 包含一个轻量的 deoverfit 检查脚本,避免把私有 benchmark 或标准答案泄露进公开 skill; 测试阶段已在 100+ 个 GitHub 开源企业级 Java 项目上验证,对 Agent 的代码修改质量、上下文遵循和验证完整性有明显提升。 为什么做这个项目 AI 编程工具越来越强,但在企业后端项目里,真正危险的地方往往不是“不会写代码”,而是“没理解上下文就开始写代码”。 Scout4j 更像是给 AI 编程助手的一套工作纪律: 不要一上来就 patch,先 scout 一遍项目。 项目开源,MIT License。 GitHub:

Original
DTData & operationsDTSoftware developmentDTAgent extension
—

smctl:给 Apple Silicon Mac 补上官方没有的风扇控制和电池限充(命令行工具)

smctl 是一个开源(MIT)命令行工具,给 Apple Silicon Mac 提供风扇曲线控制和电池充电限制——这两件事 macOS 官方都不开放:M 系列芯片没有任何风扇控制 API,电池也只有固定 80% 一档优化充电。 解决的问题: 长期插电的 MacBook 想把电量维持在自定义区间(如 smctl battery maintain 7080)延长电池寿命 Mac mini / Studio 当家用服务器时风扇策略不可控,smctl 支持手动转速和声明式风扇曲线(TOML 配置),所有命令可走 SSH,支持 json 输出 smctl sensors watch 实时查看全部温度传感器、风扇转速和封装功耗 安全方面做了比较多的工作:daemon 被卸载或异常退出都会自动把硬件交还系统接管;带不可关闭的温度护栏,持续过热会强制风扇回到系统控制。所有 SMC 写入都有回读校验。 安装:brew install leaperone/smctl/smctl (中文文档)

Original
DTSecurity & testingDTCLIDTContent / resource
—

Github 照妖镜 — 输入 GitHub 用户名,AI 毒舌分析 + 给你的账号估个价

【开源自荐】Github 照妖镜 — 输入 GitHub 用户名,AI 毒舌分析 + 给你的账号估个价 在线体验: 具体介绍 Github 照妖镜是一个 AI 驱动的 GitHub 开发者档案分析工具。输入 GitHub 用户名或仓库链接,自动抓取公开资料、仓库和动态,生成一份包含 13 个维度的毒舌分析报告——外加一个独家公式算出你的 GitHub 账号值多少钱。 预览 核心功能 🪞 AI 毒舌分析 — 基于 DeepSeek,输出 Roast、技术栈、弱点、开源影响力、协作风格、活力指数等 13 张卡片 💰 账号估值 — 根据 Star、关注者、原创/Fork 仓库数量,用独家公式算出你的 GitHub 身价(¥/$) 📸 截图下载 — 支持按区段逐个下载 PNG,也支持一键全部下载 𝕏 分享到 X — 预填好文案的一键分享 🌐 中英文切换 — 实时切换 🏢 支持个人和组织 — 自动检测账号类型,使用不同的分析提示词 🆓 免费使用 — 通过 OpenCode 免费通道调用,无需付费 技术栈 Python + Streamlit + DeepSeek + GitHub REST API

Original
DTContent creationDTSoftware developmentDTVertical agent
—

X照妖镜 — 输入 X/Twitter 用户名,AI 秒出毒舌人格分析报告

【开源自荐】X照妖镜 — 输入 X/Twitter 用户名,AI 秒出毒舌人格分析报告 在线体验: 截图展示 <p float="left" width="45%" width="45%" </p 中文报告 @罗永浩,更多示例见项目 README。 核心功能 一键抓取 — 输入 @ 用户名,自动抓取个人资料 + 最新推文 AI 人格分析 — DeepSeek V4 生成 15 维报告:吐槽、长处、弱点、爱情观、金钱观、健康、MBTI 等 账号价值评估 — 加权公式估算账号市场价值(粉丝数 + 互动 + 认证状态) 截图即分享 — 一键下载 PNG,预填推文分享到 X 中英文切换 — UI 语言实时切换,报告语言自动跟随 技术栈 Python Streamlit Playwright DeepSeek API OpenCode API html2canvas

Original
DTLifestyle & entertainmentDTVertical agentDTOpenCode
—

Job Bro v0.3.0 - AI Agent 架构升级:评估器可联网搜索,结果实时流式返回

项目地址: 上一期:v0.2.0 基于 Chrome 内置 AI 的职位分析助手 一句话: Chrome 扩展,用 AI 分析 LinkedIn 职位 —— 五个维度评估,支持 API 与 Gemini Nano 本地双后端。v0.3.0 引入 AI Agent 架构,评估器可联网搜索公司信息,结果实时流式返回,支持断点续跑。 🚀 v0.3.0 新特性 1. AI Agent:评估器可调用搜索和网页工具 问题:之前的评估器完全依赖 LLM 的预训练知识来评估公司风险、薪资水平等,对于新创公司、未公开信息只能猜测。 解决:为风险、薪资、成长、偏好四个评估器配备 websearch(DuckDuckGo)和 readpage 工具。评估过程中,AI 会主动搜索公司裁员新闻、行业趋势、薪资数据等,并阅读实际网页获取真实信息。 salary 评估器 → 搜索 "senior frontend engineer salary Austin 2026" risk 评估器 → 搜索 "company X layoffs 2026" → 阅读相关文章 去重机制:同一个 run 内对同一 URL 只取一次结果,多个评估器共享缓存。 2. 分阶段流水线 + 断点续跑 旧的并行执行(Promise.all)改为 4 阶段流水线: | 阶段 | 评估器 | 依赖 | |||| | Stage 1 | 偏好评估 | 无 | | Stage 2 | 技能匹配 + 薪资评估 | 无 | | Stage 3 | 风险评估 + 成长评估 | 依赖 Stage 2 结果 | | Stage 4 | 总结评估 | 依赖全部完成 | 下游评估器可直接复用上游的研究成果。若中途失败(如网络超时),可点击「继续」从失败阶段重试,无需从头开始。 3. 实时流式结果 以前需要等全部 6 个评估器跑完才能看到报告。现在每个评估器做完立即显示结果,还能实时看到 AI 正在「搜索中...」「阅读中...」的进度状态。 4. Offscreen Document + 结构化输出 将 HTML 转 Markdown 的 DOM 解析移到 offscreen document,解决 MV3 Service Worker 无 DOM 访问的问题 云端模型启用严格 JSON Schema 约束,输出更稳定 推理模型(如 MiniMax)的 think 标签自动裁剪,jsonrepair 兜底解析 HTTP 504 自动重试 📦 历史功能回顾 五种 AI 评估 | 维度 | 说明 | ||| | 薪资评估 | 基于职位、地点、经验估算薪资范围,与期望对比 | | 技能匹配 | 对比职位要求与你的技能栈,标注匹配/缺失/额外技能 | | 偏好评估 | 远程/混合、行业、公司规模等偏好匹配度 | | 风险评估 | 裁员历史、招聘活跃度、职位稳定性 | | 成长评估 | 技能提升空间、职业路径、学习资源 | 双后端:Cloud + Chrome AI | 方案 | API Key | 网络依赖 | Token 费用 | 数据隐私 | |||||| | Cloud (OpenAI) | 需要 | 需要 | 按量付费 | 数据上云 | | Chrome AI | 不需要 | 不需要 | 免费 | 数据不出设备 | Chrome AI 基于 Gemini Nano,开启后无需 API Key、零网络请求、数据完全本地处理,适合隐私敏感场景。 智能对话追问 对报告内容不满意?可直接追问,AI 会结合报告上下文进一步分析。Chrome AI 后端利用有状态 API 实现持久化会话,大幅减少延迟。 🧗 使用方式 1. 从 Chrome Web Store 安装(或 git clone + bun install && bun dev) 2. 打开任意 LinkedIn 职位页面 3. 点击侧边栏 Job Bro 图标 4. 点击「分析」,等待评估完成 5. 查看报告,或进一步追问 Chrome AI 前提:Chrome 127+,启用 chrome://flags/promptapiforgemininano,下载模型(约 4GB,浏览器自动管理) 🙏 致谢 感谢社区反馈和贡献 欢迎 Star、提 Issue、贡献新功能。让求职分析像打开一个网页一样简单。

Original
DTResearch & learningDTData & operationsDTAgent extension
—

我刚经历了3小时内增加500+用户的恐怖增长

【我刚经历了3小时内增加500+用户的恐怖增长】 过去3小时之内,我的产品新增了500+的注册用户 考虑到之前我们的产品目前一个多月也才实现了2000+的注册用户,新增的500+的注册用户对我们而言是一次不小的爆发,相当于之前大半个月的工作量 我们的产品为什么突然实现了用户数量上的爆发?很多人以为这会是一个励志的故事:长期坚持不断打磨产品、跟进用户需求改善体验、所做的一切在市场上有了反馈、从此产品步入正轨。 但遗憾的是,都不是。 真实的情况是:我们买量了。但在三个小时后,我们决定结束这场闹剧。 1.预料之外的爆发 我们在做的是一款叫“连连AI”的小程序,产品核心的功能在于让AI根据你的需求帮你找到合适的人并自动进行沟通。这样的话,当你有找人的需求时,无论是找程序员、设计师接单,还是找律师等,你都可以节省繁重的寻找和沟通过程。 用户的爆发,始于一次偶然的提议。 一个团队成员说,我们是不是可以在网上找一些人帮我们拉拉用户,我们按照注册用户数来付费。 于是,我们在一个微信群里发了一条广告。一个小时内,新增的注册用户数就突破了100+,并在随后的一个小时内又突破了300+ 直接给钱的激励效果远超我们的想象,我们仅为一个注册用户支付2块钱左右,但大家仍然有充足的热情帮我们去做这些东西。 即使我们完全有能力支付相应的费用,我们还是仅在三个小时内就决定停止这一切,停止所有“虚假的繁荣”。 2.激烈的心理斗争 关于是否停止这一切,我们经历了激烈的心理斗争。 用户增长的太快了,几个小时内就超过了我们几周所做的工作,而付出的东西又都在我们的预算范围内,这一切都很难让人拒绝。这会不会是一次产品火起来的契机?放任大家增长下去,会不会有意外的收获? 所有的东西在我脑海中萦绕。 但我们还是决定停止这一切,是因为两个数据: 1.绝大多数的注册用户并没有完成一次有效的行为。一个AI产品,用户只有完成对功能的体验和使用之后,用户才会有留存的可能。对“连连AI”这个产品而言,如果用户有需求并进行了发布,这时候能够体验到用AI帮你找人并自动沟通的过程,这个人才会具有后续留存的可能。 但我们看到,绝大多数的用户只是注册了,并没有完成对功能的体验和使用,甚至连和Ai对话都没有,这意味着这部分用户以后是不可能再继续使用我们的产品的。 当时我们为了修正这种情况,更改了规则,需要用户也完成一次找人功能的使用才算作有效用户,但很快我们又失望了。 2.绝大多数用户只是发了一些无意义的内容。这是一个极为典型的有政策,也有对策的场景,在我们要求用户需要与AI对话,向AI下达任务让AI去帮你找人才算作是有效用户后,我们看到的结果是大部分用户只是发布了一些无意义的内容。这显然不是我们希望的结果,我们很快意识到引来的这部分用户的人群画像是过于宽泛的,他们不知道能用产品来做什么。我们并非挑选用户,但可能过于宽泛的用户群体对我们也并非什么好的事情。 于是,我们做出了停止的决定。 3.对初期产品最重要的是什么 我们之前做的错误的一点,就是花了太多的时间和精力在用户增长上。 因为“连连AI”的核心功能是根据你的需求帮你由AI自动进行匹配并沟通,我们需要不断扩大我们的用户池,否则便可能找不到相应的人。 做用户增长没有错,但不应该将用户的增长情况作为初期最核心的指标。用户的增长情况这种规模性数据更多是金钱等资源投放之后的结果,但你还需要更多的其他数据来验证产品的PMF,例如留存、成功率和用户满意度等等。 如果你初期花费了过多的精力在一个个地拉用户,而不是注重于收集用户的使用情况与反馈,那你可能将精力放错了地方。 你只要能够在一个地方完成闭环即可,在一个场景中满足用户的需求。比如,我们能够专注把创业者找人、或程序员找外包这类场景做好的话,那会比漫无目的地拉用户来的快得多。程序员找外包这类场景中,最麻烦的就是去找订单和沟通需求的过程,如果能够有一个Agent 24小时帮助你在平台上搜集信息并自动沟通的话,会是一件很有价值的事情。 但我们目前这个最基础的场景都没有做好,而是花费了过多的精力在用户增长上。完成一次功能的闭环,比用钱烧出来的用户增长数据的“虚假繁荣”重要的多。 但用户的爆发也是有价值的。它让团队清醒过来,既然用户增长可以用钱解决,那自然应该花更多时间在其他方面,争取在其他方面构建起一定的壁垒。但我们之前不懂,对一个饥渴于流量的创业者而言,只有体会过一定的富足之后才会静下心来思考。就如同一个快要饿死的人,他只会一味地进食、进食、再进食。 这便是我在本次用户增长后的思考,感谢你的阅读。

Original
DTBusiness & growthDTVertical agent
—

MuJoCo Skills:面向 Robotics 环境搭建和操控技能库

我是这个仓库的作者: 做这个项目的原因很简单:我自己还是机器人仿真的初学者,经常会用 AI 帮我创建 MuJoCo 仿真环境。 这个过程一开始很有帮助。比如我可以让 AI 创建一个 Franka 机械臂抓取场景、UR5e 分拣场景、Go1 越障场景,或者 H1 人形机器人的行走布局。AI 很快能给出 MJCF 文件,也能帮我打开 viewer 检查。 但问题也很明显:生成出来的场景经常“看起来像那么回事”,实际却不一定符合物理常识。 我遇到过的问题包括: 物体悬空 机器人初始姿态不合理 机械臂没有夹爪,却被要求做抓取 末端执行器穿过桌面或传送带 人形机器人一开始就倒下 场景能加载,但不是一个可用的仿真环境 所以我开始把这些经验沉淀成一个 MuJoCo Skill,让 AI Agent 在创建场景时不只是“写 XML”,而是按一个更可靠的流程工作。 这个 Skill 目前主要帮助 AI 做这些事: 构建 MJCF 场景 做基础物理合理性检查 启动 MuJoCo viewer 检查 actuator 做最小控制实验 在不确定时询问用户,而不是猜测需求 对常见场景进行更严格的验证 README 中的示例和场景检查是在 Codex GPT5.5 下验证的。 我并不想把它包装成一个“自动生成完美仿真环境”的工具。它更像是一个给初学者和 AI Agent 使用的工作流约束:让 AI 在创建 MuJoCo 场景时少犯明显错误,也让使用者能更快得到一个可以继续学习和修改的起点。 如果你也在用 AI 辅助机器人仿真,或者你对 MuJoCo、MJCF、机器人控制有经验,欢迎帮我看看这个仓库,也欢迎提建议:

Original
DTResearch & learningDTAgent extensionDTSkill / plugin
—

PaperQuay:给桌面端文献阅读补上 AI 翻译、论文概览、内联笔记和 Agent 工作流

PaperQuay是面向桌面端的覆盖 PDF 阅读、全文翻译、论文概览、富文本笔记和 Agent 工作流 AI 辅助文献管理阅读工具。 解决的问题: 常规文献管理工具如 Zotero 等,主要提供基础的文献管理和 PDF 阅读能力;许多 AI 插件与 Zotero 的集成度不够,阅读、翻译、总结、笔记和文献整理往往分散在多个工具里,集成度不够,同时相互之间无法联动。 PaperQuay 希望把这些操作放回同一个桌面工作区:导入 PDF 后,可以管理元数据、分类、标签和附件;阅读时支持 PDF 批注、MinerU 结构块视图、全文翻译、块级译文缓存和划词翻译;速读时可以生成论文概览,包含背景、研究问题、方法、实验设置、主要发现、结论和局限等字段。 笔记方面,PaperQuay 内置富文本 Notes 工作区,支持 [[笔记]] 双向链接、标签、@paper 文献引用、反向链接、本地自动保存和全文搜索,让论文笔记不再脱离文献上下文。 AI 工作流方面,PaperQuay 提供面向文献管理的 Agent 工作区,不只是普通聊天框。Agent 可以辅助批量重命名、元数据补全、智能标签、标签清洗、自动分类和论文总结,并展示工具调用过程和执行结果,方便用户确认后再执行。 数据与隐私方面,PaperQuay 采用本地优先设计,文献库、笔记、批注、导入记录和 RAG 索引保存在本地 SQLite 数据库中,PDF 保存到用户配置的文献存储文件夹。Zotero 兼容是可选能力,可以从 zotero.sqlite 导入分类、标签和可用 PDF 附件,但不强依赖 Zotero。 <div align="center" <br / <subPaperQuay 文献阅读界面</sub </div <div align="center" <br / <subPaperQuay 管理文献界面</sub </div 安全和隐私方面做了比较多的工作:PaperQuay 采用本地优先设计,文献库、笔记、批注、翻译缓存、导入记录和 RAG 索引都保存在本地 SQLite 数据库中,PDF 文件存放在用户配置的本地文献目录里;AI 能力由用户自行配置模型服务,不强绑定云端账号。Agent 在执行批量重命名、标签清洗、元数据补全等文献库操作时,会展示工具调用过程和执行结果,方便用户确认,避免黑箱式修改本地文献库。

Original
DTResearch & learningDTData & operationsDTAgent extension
—

@webc.site/math - 全球最小最快的网页 Markdown 公式渲染器

<a href=" target="blank" alt="npm" height="60" /</a&nbsp;&nbsp;<a href=" target="blank" alt="github" height="60" /</a&nbsp;&nbsp;<a href=" target="blank" alt="demo" height="60" /</a 3.5KB 搞定公式渲染!是时候放弃 KaTeX / MathJax,拥抱原生 MathML 了 为什么说网页数学公式渲染一直以来都在“走弯路”? 你敢相信吗?仅仅为了在网页里正常显示几个数学公式,你的项目就必须引入 260KB 甚至接近 1MB 的 MathJax/KaTeX 大礼包。更糟的是,这些库在浏览器的 JS 线程中动态计算字符宽度、对齐间距,并用绝对定位硬生生拼出成百上千个 DOM 节点来模拟排版。这不仅让用户的首屏加载缓慢,还极大地消耗了 CPU,造成严重的重绘卡顿。 其实,时代早已经变了。 自 2023 年 1 月起,随着 Chrome 109 正式支持 MathML Core,所有主流浏览器(Blink、Gecko、WebKit)早已完全实现了原生的数学公式排版。 这意味着:我们不再需要向前端打包庞大的排版引擎,所有的公式排版,完全可以交由浏览器的底层 C++ 引擎去高效完成! @webc.site/math 就是为此诞生的开源项目:一个仅有 3.5KB (Gzip) 的 TeXtoMathML 翻译器。我们只负责在几毫秒内将 TeX 语法转换为标准的 MathML 标签,把耗时的排版工作完全外包给浏览器本身。 为什么它具有极强的破坏力? 1. 包体积狂缩 20 到 70 倍 @webc.site/math 压缩后仅有 3.58 KB,而 KaTeX 压缩后为 75.15 KB,MathJax 更是高达 278.39 KB。这让你可以毫无压力地将其打包进任何轻量前端应用、小程序,或在 SSR/SSG 构建阶段直接静态生成,实现网页首屏的瞬间加载。 2. 渲染速度暴增 3 到 48 倍 避开了 JS 排版计算后,它的编译性能达到了恐怖的 32.9 万次每秒(Ops/sec),是 KaTeX 的 3.6 倍,MathJax 的 48.8 倍。 3. LLM/AI 时代前端实时公式渲染的黄金搭档 在当下的 AI 智能对话(LLM Chat)场景中,AI 正在以前端流式输出(Streaming)的方式吐出大量的技术公式。在这种高频重绘场景下,传统的 MathJax/KaTeX 会造成显著的延迟和发热。而本库极低的 CPU 消耗,保证了即使在低端移动设备上,AI 输出公式时的打字机效果依然丝滑顺畅。 4. 极为硬核的容错设计 在处理用户或 AI 输入的公式时,如果有未闭合的 \left 或其他非法语法,本库会自动捕获异常并优雅退化为显示原始公式,绝不因为语法错误导致前端应用崩溃。 真实公式渲染排版效果展示 以下为浏览器使用 Latin Modern Math 字体原生渲染 TeX 公式转换后的 MathML 真实效果展示(导出为 SVG 矢量图): 欧拉恒等式 (Euler's Identity) 二次方程求解公式 (Quadratic Formula) 麦克斯韦方程之一 (Maxwell's Equation) 薛定谔方程 (Schrödinger Equation) 性能对比数据 1. 体积对比(Gzip 压缩后) 2. 编译速度对比 (Ops/sec) 快速上手 1. 替换 Markdown 文本中的公式 javascript import mdMath from "@webc.site/math/md"; const markdown = "欧拉恒等式:$$e^{i\\pi} + 1 = 0$$"; const html = mdMath(markdown); 2. 直接转换单个 TeX 公式 javascript import mathml from "@webc.site/math"; const html = mathml("e^{i\\pi} + 1 = 0", true); 3. 数学字体配置推荐(关键) 虽然浏览器已原生支持 MathML,但为了达到印刷级别的精美排版,强烈建议配合 Latin Modern Math 数学字体使用(可使用 18s 字体包): css / 引入在线数学字体 / @import url("//registry.npmmirror.com/18s/0.2.24/files/m.css"); math { fontfamily: m, sansserif; } 坦诚的局限性 本库旨在满足 95% 场景下的日常需求,因此砍掉了少数冷门特性。它目前不支持化学公式扩展(如 \ce),复杂的自定义宏定义(如 \newcommand)。如果你的网站需要完美排版大学高等物理、化学论文级别的公式,可能仍需要使用 KaTeX。但对于个人博客、常规技术文档、AI 对话公式渲染等绝大多数场景,本库已经是极佳的替代选择。 欢迎大家前往 GitHub 试用、反馈与交流!

Original
DTResearch & learningDTWeb appDTWeb
—

基于.NET的浏览器引擎

C 一个用 C 和 SkiaSharp 构建的现代浏览器引擎 UpBrowser 一个用 C 和 SkiaSharp 构建的现代浏览器引擎。 项目旨在帮助对浏览器底层原理感兴趣的开发者轻松学习(与庞大臃肿的chromium相比,UpBrowser更加轻量模块化,更易于学习) 功能特性 自制布局引擎:支持 CSS Block、Inline、Flexbox、Grid、Table 等布局模式 文本渲染:使用 SkiaSharp 进行高质量文本渲染和测量 DOM 解析:基于 AngleSharp 的 HTML 解析器 JavaScript 支持:集成 Jint/v8 JavaScript 引擎 硬件加速:支持 OpenGL GPU 加速 开发计划 [ ] 完善 CSS 布局 [ ] 支持更多 CSS 属性 [ ] 性能优化 [ ] DevTools 调试工具 [ ] 网络请求支持 [ ] JS功能完善 [ ] 跨平台支持 亮点 与庞大臃肿的chromium相比,UpBrowser更加轻量模块化,更易于开发者学习浏览器底层原理 markdown 截图或演示视频

Original
DTResearch & learningDTData & operations
—

Tutti 是一个 macOS 菜单栏小工具,让你的多个扬声器同时播放同一段声音。

Swift Tutti 是一个 macOS 菜单栏小工具,让你的多个扬声器同时播放同一段声音。 Tutti 一个声音,响遍全场 Tutti 是一个 macOS 菜单栏小工具,让同一份声音同时从多个输出设备播放。 macOS 的系统音频一次只能播放一个设备,想边外放边戴耳机、或者让客厅和卧室两组音箱一起响,系统自带的音量功能做不到,需要去 MIDI 里进行设置。 Tutti 补上了这个缺口。不用装任何虚拟音频驱动,也没有内核扩展,全部用苹果自带的 CoreAudio 框架实现。在菜单栏勾选多个输出,Tutti 会临时搭一个聚合设备,让每个设备同时发声;退出时原来的输出干净恢复,不留后台进程,也不留垃圾设备。 使用场景 家里多台蓝牙音响,同时播放一首歌曲,每个房间的音乐同步。 一台 Mac 能同时连两副、甚至三副 AirPods。在咖啡馆不方便外放?你和朋友一人戴一副,一起看同一部电影、听同一首歌。 老师上课时,可以通过耳机监听自己的声音,同时让现场的观众和学生听到功放的声音。直播、录课同理:自己戴耳机听,声音照常外放。 任何"想让同一份声音同时去几个地方"的场景。 主要能力 源码在 GitHub 上公开(PolyForm Noncommercial 许可)。支持 9 种语言,需要 macOS 13 及以上。 Github: 亮点 核心功能 多设备同步输出,在菜单栏勾选有线音箱、、蓝牙耳机、AirPods、显示器的任意组合,同一个声音同时播,完全同步。 音量控制,一个主音量统一调全组,每个设备还能单独调音量和静音。 蓝牙电量,连着的蓝牙耳机电量直接显示在面板里,不用再去系统里查。 替代系统音量图标,可以把 Tutti 设成菜单栏那个音量图标,按音量键时弹的也是它自己的 OSD。 快捷键增强,键盘音量键和滚轮直接控制整组输出,还能把常用的设备组合存成预设,一键切换。 markdown 截图或演示视频

Original
DTDesktop productivityDTLifestyle & entertainmentDTDesktop app
—

Orchestra

Build automations visually. Get real Playwright code you own

DTDesktop productivityDTDesktop app
—

TurnQueue

Queue Management System for Walk-in Businesses

DTResearch & learningDTData & operationsDTContent / resource
—

IdeasBerg

Greg Isenberg's business ideas — AI-analyzed & ranked daily

DTResearch & learning
—

Redirectly

Know which campaigns actually drive your installs

DTSoftware developmentDTMobile appDTLibrary / SDK
—

Daisy

Record, transcribe, summarise — nothing leaves your Mac

DTAgent extensionDTMCP serviceDTmacOS
—

sushigame

Block puzzle meets sushi — satisfying line clears await

DTLifestyle & entertainmentDTiOS
—

DEV TRENDS / COMMUNITY

Discuss this edition

Sign in with GitHub to share a thought, question, or useful follow-up.

Open discussions ↗