150 lines
115 KiB
JSON
150 lines
115 KiB
JSON
[
|
||
{
|
||
"item_id": "sha256:4139f277b8cb621b02b3398f8a7bd78e3f9eef7bcd320b70b8590e802540c6ca",
|
||
"source_id": "freshrss:66c2d55d7563e741",
|
||
"external_id": "tag:google.com,2005:reader/item/00064dc1a1f5c0dd",
|
||
"title": "套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的\"套壳\"疑云",
|
||
"url": "http://www.ruanyifeng.com/blog/2026/03/kimi-cursor.html",
|
||
"author": "阮一峰",
|
||
"published_at": "2026-03-21T10:19:11Z",
|
||
"discovered_at": "2026-03-25T10:32:30.103137Z",
|
||
"content_kind": "article",
|
||
"language": null,
|
||
"raw_summary": "<p>1、</p>\n\n<p>本周末,有一条最热闹的 AI 新闻,震动了太平洋两岸,连马斯克都关注了。</p>\n\n <p>昨天,AI 编程工具 Cursor 推出了\"自己的\"模型 <a href=\"https://cursor.com/cn/docs/models/cursor-composer-2\">Composer 2</a>。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026032101.webp\" alt=\"\" title=\"\"></p>\n\n<p>上图是官网截图,现在点进去还写着\"自有模型\"。</p>\n\n<p>自从2024年10月,Composer 1 发布以来,外界就一直怀疑,它是套壳的中国模型,因为行为很类似,但苦于找不到证据。</p>\n\n<p>现在 Composer 2 来了,很多人就开始研究,它的背后到底是什么模型,真的是 Cursor 自家的吗?</p>\n\n<p>Cursor 为了防止破解,做了很多限制,但是百密一疏。国外推友 @fynnso <a href=\"https://x.com/fynnso/status/2034710006546014363\">发现</a>,有一个地方在上一个版本是禁止的,但是这个版本却可以执行。</p>\n\n<p>首先,你自己架设一台服务器,充当 AI 模型的调用接口,有没有模型无所谓,只要能收到客户端请求就行。</p>\n\n<p>然后,你在本地的 Cursor 里面,设置使用的模型为 Composer 2,模型网址就是你刚架设的服务器。这样一来,Cursor 就会向你的服务器发出请求,从而可以看到它到底在请求什么模型。</p>\n\n<p>真相就暴露了,它请求的模型 ID 居然是 kimi-k2p5-rl-0317-s515-fast(下图)。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026032102.webp\" alt=\"\" title=\"\"></p>\n\n<p>2、</p>\n\n<p>这位国外推友就把上面的截图,<a href=\"https://x.com/fynnso/status/2034706304875602030\">发布</a>到网上。这下炸锅了,明眼人都看出来,这是铁证,<strong>Composer 2 实际上是套壳的 Kimi K2.5</strong>。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026032115.webp\" alt=\"\" title=\"\"></p>\n\n<p>可笑的是,事情一爆发,Cursor 第一时间就把漏洞堵上,现在已经没法复现这个请求(下图)。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026032103.webp\" alt=\"\" title=\"\"></p>\n\n<p>但是为时已晚,网上传遍了,就连马斯克也<a href=\"https://x.com/elonmusk/status/2034941631871455262\">发推</a>:\"它就是 Kimi K2.5\"。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026032104.webp\" alt=\"\" title=\"\"></p>\n\n<p>这下好了,变成了公开的秘密,再也无法掩盖了。</p>\n\n<p>3、</p>\n\n<p>大家的关注点,很快就转移到 Cursor 是否侵权。因为 Kimi K2.5 虽然是开源模型,但是采用的是修改的 MIT 许可证(下图)。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026032105.webp\" alt=\"\" title=\"\"></p>\n\n<p>许可证这样说:你可以任意使用这个模型,唯一的条件是如果你的商业产品月活用户超过1亿,或者月收入超过2000万美元,<strong>你必须在用户界面的醒目位置披露,你使用了 Kimi K2.5</strong>。</p>\n\n<p>Cursor 最新披露的年化收入是20亿美元,相当于月收入1.67亿美元,显然满足上面的条件。但是,它隐藏了使用 K2.5 的事实。</p>\n\n<p>就在大家认定 Cursor 侵权的时候,他们的一个负责人终于坐不住了,出来<a href=\"https://x.com/leerob/status/2035050444347600936\">说话</a>了。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026032106.webp\" alt=\"\" title=\"\"></p>\n\n<p>他承认确实使用 Kimi K2.5,但是没有侵权,他们的许可证来自合作伙伴 Fireworks AI。</p>\n\n<p>稍后,Kimi 官方也<a href=\"https://x.com/Kimi_Moonshot/status/2035074972943831491\">发推</a>了。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026032107.webp\" alt=\"\" title=\"\"></p>\n\n<p>Kimi 官方确认,Cursor 是从 Fireworks AI 得到了授权。后者是一家硅谷的华人 AI 公司,从事 AI 模型的微调和强化学习,它从 Kimi 得到授权对模型进行再训练,然后又转授权给了 Cursor。</p>\n\n<p>4、</p>\n\n<p>事情到这里就基本清楚了,Cursor 并没有违反 Kimi 的授权条款,因此不存在侵权。</p>\n\n<p>既然如此,为什么它拼命掩盖这个事实,大大方方承认,提供 Kimi K2.5 的修改版模型,很难吗?</p>\n\n<p>我猜测,<strong>原因跟 Cursor 不断膨胀的估值有关</strong>。</p>\n\n<p>彭博社本月报道,Cursor 正在进行下一轮融资,估值达到500亿美元。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026032108.webp\" alt=\"\" title=\"\"></p>\n\n<p>大家知道吗,它以前的估值是多少?</p>\n\n<p>2023年10月,Cursor 成立时的估值是5000万美元;2024年8月的 A 轮融资,估值上升到4亿美元;12月的 B 轮融资,估值快速上升到26美元;2025年11月的最新一轮融资,估值已经到了293亿美元。</p>\n\n<p>可以看到,每过几个月,估值就会翻倍。这种火箭式的上升速度,需要有业绩支持。但它本身只是一个 VS Code 的修改版,使用的都是开源技术。</p>\n\n<p>为了支撑越来越高的估值,<strong>它有动机把自己从 AI 工具,包装成具有模型研发能力的大模型公司</strong>。</p>\n\n<p>我认为,这才是它不愿意披露使用了 Kimi K2.5 的主要原因。</p>\n\n<p>5、</p>\n\n<p>纵观整个事件,Cursor 无疑是输家,Kimi 则是这次的赢家,免费得到一大波高价值的曝光。</p>\n\n<p>Cursor 发布 Composer 2 时,披露了性能和成本比较。</p>\n\n<p>Composer 2 的性能低于 GPT-5.4,但高于 Opus 4.6。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026032109.webp\" alt=\"\" title=\"\"></p>\n\n<p>但是,它的生成速度比 GPT-5.4 和 Opus 4.6 都快,成本也是最低的。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026032110.webp\" alt=\"\" title=\"\"></p>\n\n<p>既然 Composer 2 就是微调的 Kimi K2.5,那么<strong>直接使用 Kimi,也能得到同样的效果</strong>。</p>\n\n<p>6、</p>\n\n<p>以前,国外总是有人指责,中国公司窃取外国技术。但是,这个事件证明了,中国公司也有技术输出。那些国外的明星公司,背地也在偷偷摸摸使用中国技术。</p>\n\n<p>联想到上周,Kimi 的创始人杨植麟收到黄仁勋的邀请,在 Nvidia GTC 大会<a href=\"https://www.51cto.com/article/838459.html\">演讲</a>,是唯一的中国大模型公司代表。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026032112.webp\" alt=\"\" title=\"\"></p>\n\n<p>他在台上宣讲,Kimi 团队刚刚发表的论文<a href=\"https://github.com/MoonshotAI/Attention-Residuals\">《注意力残差》</a>(Attention Residuals)。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026032113.webp\" alt=\"\" title=\"\"></p>\n\n<p>这种新技术据说可以显著提升大模型的推理能力。</p>\n\n<p>我的想法是,大家要对国产大模型有信心,日常工作完全可以放心使用。国产大模型与国外旗舰模型的差距,正在不断缩小,而且价格实惠。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026032114.webp\" alt=\"\" title=\"\"></p>\n\n<p><a href=\"https://www.51cto.com/article/835315.html\">据杨植麟说</a>,下一个要发布的 K3 模型性能提升巨大,即便没有强10倍,也比 K2.5 强得多,我们可以期待一下。</p>\n\n<p>(完)</p>\n\n <div><h3>文档信息</h3>\n<ul>\n<li>版权声明:自由转载-非商用-非衍生-保持署名(<a href=\"https://creativecommons.org/licenses/by-nc-nd/3.0/deed.zh\">创意共享3.0许可证</a>)</li>\n<li>发表日期: <abbr title=\"2026-03-21T18:19:11+08:00\" data-sanitized-class=\"published\">2026年3月21日</abbr></li>\n\n</ul></div> \n <div></div>",
|
||
"raw_content": null,
|
||
"metadata": {
|
||
"upstream": "freshrss",
|
||
"origin": {
|
||
"streamId": "feed/2",
|
||
"htmlUrl": "http://www.ruanyifeng.com/blog/",
|
||
"title": "阮一峰的网络日志"
|
||
},
|
||
"categories": [
|
||
"rss",
|
||
"user/-/state/org.freshrss/main",
|
||
"Developer"
|
||
],
|
||
"crawled_at": "2026-03-24T09:18:21.528000Z",
|
||
"published_epoch": 1774088351
|
||
},
|
||
"fetch_state": "pending"
|
||
},
|
||
{
|
||
"item_id": "sha256:a16942c9699333155498d2bc59c530358bd6d81d9afe01e2b96e0e862edfc6a6",
|
||
"source_id": "freshrss:66c2d55d7563e741",
|
||
"external_id": "tag:google.com,2005:reader/item/00064dc1a1f5c0dc",
|
||
"title": "科技爱好者周刊(第 389 期):未来如何招聘程序员",
|
||
"url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-389.html",
|
||
"author": "阮一峰",
|
||
"published_at": "2026-03-19T23:59:16Z",
|
||
"discovered_at": "2026-03-25T10:32:30.103137Z",
|
||
"content_kind": "article",
|
||
"language": null,
|
||
"raw_summary": "<p>这里记录每周值得分享的科技内容,周五发布。</p>\n\n <p>本杂志<a href=\"https://github.com/ruanyf/weekly\">开源</a>,欢迎<a href=\"https://github.com/ruanyf/weekly/issues\">投稿</a>。另有<a href=\"https://github.com/ruanyf/weekly/issues/9088\">《谁在招人》</a>服务,发布程序员招聘信息。合作请<a href=\"mailto:yifeng.ruan@gmail.com\">邮件联系</a>(yifeng.ruan@gmail.com)。</p>\n\n<h2>封面图</h2>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202602/bg2026022807.webp\" alt=\"\" title=\"\"></p>\n\n<p>唐山河头老街景区的轨道车\"大唐云车\"。(<a href=\"https://view.inews.qq.com/k/20260204A01P0P00\">via</a>)</p>\n\n<h2>未来如何招聘程序员</h2>\n\n<p>前些天,讨论区有一个<a href=\"https://github.com/ruanyf/weekly/issues/9238\">帖子</a>,提出一个问题。</p>\n\n<p>如果未来的代码都是 AI 写的,那么我们<a href=\"https://github.com/vorojar/ai-native-hiring-guide\">怎么招聘程序员</a>呢?</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031406.webp\" alt=\"\" title=\"\"></p>\n\n<p>程序员负责代码,但代码是 AI 写的,不是程序员写的,那么应该怎么面试他呢?</p>\n\n<p>你仔细想想,这个问题比预想的难多了。</p>\n\n<p><strong>首先,考察他的代码能力不重要(代码不是他写的),更重要的是考察他会不会 AI</strong>。只要善于使用 AI,能够产出合格的代码,对公司来说就是合格的人选。</p>\n\n<p>但是,什么样的面试问题,能够考察出一个人是否掌握 AI?下面是我想出的一些问题:</p>\n\n<ul>\n<li>请将一个复杂的项目需求,转化成提示词,要求是清晰、逻辑性强、切中要害。</li>\n<li>描述一个你认为需要使用 Skill 和 MCP 的场景,并阐述它们的工作原理和构建方法。</li>\n<li>如何将一个大项目分解,设计出一个多 Agent 协同工作的机制。</li>\n<li>......</li>\n</ul>\n\n<p>这些问题能识别出 AI 编程高手吗?我完全没有把握。</p>\n\n<p><strong>其次,除了 AI,还要考察什么呢?</strong> 这也很不好想。</p>\n\n<p>我应该还会问一些架构问题,你可以不写代码,但要懂怎么组织代码,架构出一个系统。但我也不确定这是必需的,因为 AI 生成的大型系统迟早变成一个黑箱,可能对于架构知识的要求也不是很高。</p>\n\n<p><strong>另外,我还要看看他以前的项目</strong>,如果以前他用 AI 做过类似的东西,那么应该问题不大。但这也不可靠,且不说完全类似的项目非常少,就看 AI 进化速度这么快,两年前的经验早不适用了吧。</p>\n\n<p>总之我发现,很难确定什么面试问题是一定有效的,能够可信地筛选出合格的应聘者。AI 颠覆了软件开发,也连带颠覆了程序员面试。大家有好的面试问题吗?</p>\n\n<p>有一点是确定的,<strong>面试各种编程细节意义不大了</strong>,因为你不需要记住语法细节了,直接问大模型就行。</p>\n\n<h2>科技动态</h2>\n\n<p>1、<a href=\"https://basicappleguy.com/basicappleblog/lil-finder-guy\">访达小子</a></p>\n\n<p>苹果公司最近发布了 Macbook Neo,有人注意到,官方的 Tiktok 宣传海报里面出现了一个全新的吉祥物(下图)。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031208.webp\" alt=\"\" title=\"\"></p>\n\n<p>上面海报的左上角有一个玩偶,以前没见过。</p>\n\n<p>这个玩偶明显来自 Mac 电脑的访达工具(Finder),所以被称为\"访达小子\"(Lil Finder Guy)。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031209.webp\" alt=\"\" title=\"\"></p>\n\n<p>几天后,苹果公司又在一场直播里面,使用了这个形象。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031210.webp\" alt=\"\" title=\"\"></p>\n\n<p>人们纷纷猜测,这到底是偶然的行为,还是苹果公司真的会推出它作为吉祥物?</p>\n\n<p>热心的网友让 AI 绘制了\"访达小子\"的完整形象。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031211.webp\" alt=\"\" title=\"\"></p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031212.webp\" alt=\"\" title=\"\"></p>\n\n<p>看上去很可爱,就跟 Labubu 似的,有可能大受欢迎。</p>\n\n<p>2、<a href=\"https://www.unsw.edu.au/newsroom/news/2026/03/New-negative-light-technology-hides-data-transfers-in-plain-sight\">红外线编码</a></p>\n\n<p>英国科学家发明了一种新的通信方式,通过热辐射二极管,将数字信号以热量形式传递。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031401.webp\" alt=\"\" title=\"\"></p>\n\n<p>肉眼看不见这种信号(因为它是红外线),也检测不到无线电波,但是它的热量以编码方式散发,在红外线热成像仪上能识别(上图)。</p>\n\n<p>因此,这种方法接收信号需要热成像仪,再传入电脑的解码器。这可能对某些工业和军事场景很有用。</p>\n\n<p>3、<a href=\"https://sa.lj.am/rack-mount-hydroponics/\">机柜种植</a></p>\n\n<p>家里有多余的服务器机柜,怎么利用起来?</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031504.webp\" alt=\"\" title=\"\"></p>\n\n<p>一个国外程序员想到机柜里面有电源,拉线和搁板都很方便,可以用来水培种植。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031505.webp\" alt=\"\" title=\"\"></p>\n\n<p>他买了一些 LED 灯带,用来模拟日照,每一层还安装了一个泵,用来自动进排水。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031506.webp\" alt=\"\" title=\"\"></p>\n\n<p>如果你想在家里种一些暖房植物,或者需要长时间光照的植物,服务器机柜确实是一个很好的方案。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031507.webp\" alt=\"\" title=\"\"></p>\n\n<h2>文章</h2>\n\n<p>1、<a href=\"https://www.anisafifi.com/en/blog/i-ditched-elasticsearch-for-meilisearch-heres-what-nobody-tells-you/\">我放弃了 Elasticsearch,转而使用 Meilisearch</a>(英文)</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031303.webp\" alt=\"\" title=\"\"></p>\n\n<p><a href=\"https://github.com/meilisearch/meilisearch\">Meilisearch</a> 是一种开源的搜索软件,作者介绍怎么用它替代 Elasticsearch。</p>\n\n<p>2、<a href=\"https://blog.youxu.info/2026/01/14/ai-codes-retrospective/\">2016 年,我做过一次 AI 写代码创业</a>(中文)</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031918.webp\" alt=\"\" title=\"\"></p>\n\n<p>作者徐宥(Eric Xu)回忆他在2016年的 AI 创业,当时他想训练一个大模型,需要25万美元,但是找不到投资人。(<a href=\"https://github.com/ruanyf/weekly/issues/9296\">@gengxiuli</a> 投稿)</p>\n\n<p>3、<a href=\"https://shawnxie.top/blogs/tools/read-flow-2026.html\">信息过载时代,我的漏斗式阅读工作流</a>(中文)</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031914.webp\" alt=\"\" title=\"\"></p>\n\n<p>每天有太多东西值得看,作者介绍他的信息处理工作流,通过 AI 过滤出值得读的内容。(<a href=\"https://github.com/ruanyf/weekly/issues/9282\">@shawnxie94</a> 投稿)</p>\n\n<p>4、<a href=\"https://medium.com/packt-hub/the-world-of-compiler-backends-9b27a3e37866\">编译器的前端与后端</a>(英文)</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202505/bg2025050118.webp\" alt=\"\" title=\"\"></p>\n\n<p>一篇科普文章,介绍编译器(比如 LLVM)的前端和后端的概念。</p>\n\n<p>5、<a href=\"https://webkit.org/blog/16831/line-height-units/\">CSS 的 lh 单位</a>(英文)</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202505/bg2025050125.webp\" alt=\"\" title=\"\"></p>\n\n<p>CSS 有一个字体大小属性<code>lh</code>,表示行高。</p>\n\n<p>6、<a href=\"https://blog.sciencenet.cn/home.php?mod=space&uid=52727&do=blog&id=1525508\">寻觅杜鹃花之王</a>(中文)</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031302.webp\" alt=\"\" title=\"\"></p>\n\n<p>大树杜鹃是最高大的杜鹃,是一颗会开花的大树(上图),1919年由英国人在云南发现。</p>\n\n<p>后来,这个英国人死在云南,就无人知道哪里有这种杜鹃了,直到1982年才重新在高黎贡山找到。本文讲述这种植物的故事。</p>\n\n<h2>工具</h2>\n\n<p>1、<a href=\"https://github.com/mexirica/aptui\">APTUI</a></p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031301.webp\" alt=\"\" title=\"\"></p>\n\n<p>一个 Linux 的终端应用,用于充当 Debian/Ubuntu 安装管理器,管理 APT 软件包。</p>\n\n<p>2、<a href=\"https://my.wordpress.net/\">my.WordPress.net</a></p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031502.webp\" alt=\"\" title=\"\"></p>\n\n<p>如果你想尝试 WordPress,但没有服务器,可以使用官方新推出的这个服务,打开上面网址就可以了。</p>\n\n<p>它把所有 PHP 脚本编译成 JS,在本地运行,不需要服务器,而且数据都在你的浏览器,下次打开这个网址,网站数据还在,参见<a href=\"https://wordpress.org/news/2026/03/announcing-my-wordpress/\">介绍文章</a>。</p>\n\n<p>3、<a href=\"https://github.com/groverburger/grobpaint\">GrobPaint</a></p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031503.webp\" alt=\"\" title=\"\"></p>\n\n<p>一个跨平台的图像编辑器,特点就是非常轻量级,可以在浏览器运行,也可以编译成二进制文件。</p>\n\n<p>4、<a href=\"https://matting.lingxiangtools.top/\">Apple Matting</a></p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031407.webp\" alt=\"\" title=\"\"></p>\n\n<p>一个 Mac 抠图软件,大小只有 8MB。(<a href=\"https://github.com/ruanyf/weekly/issues/9241\">@pangxiaobin</a> 投稿)</p>\n\n<p>5、<a href=\"https://github.com/lifedever/health-tick-release\">HealthTick</a></p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031409.webp\" alt=\"\" title=\"\"></p>\n\n<p>macOS 菜单栏久坐提醒工具。(<a href=\"https://github.com/ruanyf/weekly/issues/9242\">@lifedever</a> 投稿)</p>\n\n<p>6、<a href=\"https://github.com/yaoyao2mm/cheatreader\">CheatReader</a></p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031501.webp\" alt=\"\" title=\"\"></p>\n\n<p>一个跨平台的阅读软件,可以悬浮在桌面上,支持单行模式,适合想在工作流里\"偷偷读书\"的人。(<a href=\"https://github.com/ruanyf/weekly/issues/9247\">@yaoyao2mm</a> 投稿)</p>\n\n<p>7、<a href=\"https://github.com/zhaoolee/notes\">锤子便签</a></p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031702.webp\" alt=\"\" title=\"\"></p>\n\n<p>开源的网页版锤子便签,可以作为 Skill 调用。(<a href=\"https://github.com/ruanyf/weekly/issues/9274\">@zhaoolee</a> 投稿)</p>\n\n<p>8、<a href=\"https://github.com/tmwgsicp/wechat-download-api\">WeChat Download API</a></p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031917.webp\" alt=\"\" title=\"\"></p>\n\n<p>开源的微信公众号转 RSS 工具。(<a href=\"https://github.com/ruanyf/weekly/issues/9295\">@tmwgsicp</a> 投稿)</p>\n\n<p>9、<a href=\"https://github.com/ywong137/speech-speed\">Speech Speed</a></p>\n\n<p>一个很有意思的 Chrome 插件,根据语速调节视频播放速度。如果剧中人说话慢,视频就快速播放,说话快,就慢速播放。</p>\n\n<h2>AI 相关</h2>\n\n<p>1、<a href=\"https://github.com/xxnuo/VibeGo\">VibeGo</a></p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031913.webp\" alt=\"\" title=\"\"></p>\n\n<p>Vibe Coding 的开源 Web IDE,支持 Claude Code、Gemini CLI、CodeX、OpenCode 等。(<a href=\"https://github.com/ruanyf/weekly/issues/9281\">@xxnuo</a> 投稿)</p>\n\n<p>2、<a href=\"https://github.com/zhanchey/MimicThem\">Mimic Them</a></p>\n\n<p>一个开源应用,使用字节 seedream 图像模型,复刻小红书的图文笔记,从一篇可以衍生出另一篇。(<a href=\"https://github.com/ruanyf/weekly/issues/9215\">@zhanchey</a> 投稿)</p>\n\n<p>3、<a href=\"https://github.com/MatrixA/aicheck\">AICheck</a></p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031305.webp\" alt=\"\" title=\"\"></p>\n\n<p>一个 Rust 语言编写的命令行工具,离线检测图片、视频、音频和文档是否由 AI 生成。(<a href=\"https://github.com/ruanyf/weekly/issues/9219\">@MatrixA</a> 投稿)</p>\n\n<p>4、<a href=\"https://github.com/iOfficeAI/AionUi\">AionUi</a></p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031405.webp\" alt=\"\" title=\"\"></p>\n\n<p>开源的 Cowork 与 OpenClaw 的替代品,自动化各种电脑操作。(<a href=\"https://github.com/ruanyf/weekly/issues/9236\">@cdxiaodong</a> 投稿)</p>\n\n<p>5、<a href=\"https://github.com/zhnd/lumo\">Lumo</a></p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031408.webp\" alt=\"\" title=\"\"></p>\n\n<p>一个 Claude Code 的本地桌面工作台,查看成本、Token、会话和编码时段数据。(<a href=\"https://github.com/ruanyf/weekly/issues/9239\">@zhnd</a> 投稿)</p>\n\n<p>6、<a href=\"https://github.com/twwch/AIComicBuilder\">AIComicBuilder</a></p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031704.webp\" alt=\"\" title=\"\"></p>\n\n<p>开源的 AI 动漫视频生成系统,只需输入文字剧本,即可自动完成角色提取、分镜设计、关键帧生成、视频合成的全流程。(<a href=\"https://github.com/ruanyf/weekly/issues/9275\">@twwch</a> 投稿)</p>\n\n<h2>资源</h2>\n\n<p>1、<a href=\"https://www.canirun.ai/\">canirun.ai</a></p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031402.webp\" alt=\"\" title=\"\"></p>\n\n<p>网页检测你的机器,能够运行哪些本地的 AI 模型。</p>\n\n<p>2、<a href=\"https://wmyskxz.cn/wiki/whats_ai/\">AI 是怎么回事</a>(中文)</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031304.webp\" alt=\"\" title=\"\"></p>\n\n<p>面向普通读者的通俗 AI 原理教程。(<a href=\"https://github.com/ruanyf/weekly/issues/9218\">@wmyskxz</a> 投稿)</p>\n\n<p>3、<a href=\"https://amoilanen.github.io/Algorithms-with-Typescript/preface.html\">TypeScript 数据结构与算法</a>(Algorithms with TypeScript)</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031403.webp\" alt=\"\" title=\"\"></p>\n\n<p>免费阅读的英文电子书,使用 TypeScript 语言介绍数据结构和算法。</p>\n\n<p>4、<a href=\"https://channelsurfer.tv/\">频道冲浪者</a>(Channel Surfer)</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031404.webp\" alt=\"\" title=\"\"></p>\n\n<p>这个网页把 Youtube 改成传统的电视频道,每个频道都有节目表,可以切换频道。如果你不知道用 Youtube 看什么,就可以看这个网站。</p>\n\n<h2>图片</h2>\n\n<p>1、<a href=\"https://rarehistoricalphotos.com/engineering-methods-from-the-past/\">巧妙的古建筑</a></p>\n\n<p>因为缺乏机械和动力,古代建筑物往往包含了很多巧思。</p>\n\n<p>(1)19世纪的英国麦克尔斯菲尔德运河,由于没有水位落差,需要马拉着船前进。</p>\n\n<p>有时,马的牵引道从河的一边转到了另一边,马这时就需要过河。</p>\n\n<p>为了不解开牵引绳,马就能过河,工程师就设计了\"蛇桥\",马可以直接走上去,中间还有让牵引绳通过的孔。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202512/bg2025120205.webp\" alt=\"\" title=\"\"></p>\n\n<p>(2)法国南部的巴尔贝加尔水磨坊,建于公元2世纪,现在只剩下了遗址。</p>\n\n<p>这个磨坊的位置在山坡上,连续建了16个相互连接的水车,充分利用了水能,每天能够生产25吨面粉,被认为是欧洲第一个大规模工业生产的磨坊。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202512/bg2025120206.webp\" alt=\"\" title=\"\"></p>\n\n<p>(3)伊朗纳什提凡的古代风车,建在连片的屋顶上,一根木轴安装了由粘土、稻草和木材做成的立轴式风帆,强风会带动木轴,转动下面屋子里的磨盘,来磨碎谷物。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202512/bg2025120208.webp\" alt=\"\" title=\"\"></p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202512/bg2025120207.webp\" alt=\"\" title=\"\"></p>\n\n<p>(4)中国西安的秦代上林苑遗址,发现了战国时期的陶瓷水管,现保存于西安博物院。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202512/bg2025120209.webp\" alt=\"\" title=\"\"></p>\n\n<h2>文摘</h2>\n\n<p>1、<a href=\"https://laike9m.com/blog/avoid-mini-frameworks,171/\">避免使用定制框架</a></p>\n\n<p>很多小团队在工作中,往往会发明自己的\"定制框架\"。</p>\n\n<p>他们原来使用的是通用框架,但有不满意之处,于是决定在通用框架基础上定制自己的框架。</p>\n\n<p>这种\"定制框架\"有一些共同特点:</p>\n\n<blockquote>\n <p>(1)由小团队创建,旨在解决他们的痛点;</p>\n\n<p>(2)底层是其他更通用的技术栈或框架;</p>\n\n<p>(3)引入原有技术栈不存在的新概念和术语;</p>\n\n<p>(4)创建者声称这个定制框架\"神奇地\"解决了许多问题,并推广更多人使用它。</p>\n</blockquote>\n\n<p>我的个人经验是,\"定制框架\"非常难用,引入了许多新概念,意图掩盖它带来的更多复杂性。</p>\n\n<p>我建议,大家避免使用\"定制框架\",原因有下面这些:</p>\n\n<p>(1)定制框架常常声称,它们能消除或隐藏原始框架\"不必要的复杂性\",但实际上做不到。即使定制框架能很好地处理80%的用例,但是因为引入了新的语法,剩余20%的用例就不如原始框架的灵活性和功能性。</p>\n\n<p>(2)定制框架不易改动。它仅对开发团队的用例建模,以解决他们的特定问题,未来需求变化时,往往跟不上。另外,定制框架通常改动了原始框架的实现细节,而原始框架将来随时可能变动,你修改的细节越多,就越难跟上原始框架的变动。</p>\n\n<p>(3)定制框架反映了开发团队的心理模型,这些团队专注于自己的问题,往往有很强的个人意见。这本身是好事,但也使得定制框架不适合其他人的心理模型。</p>\n\n<p>(4)定制框架往往导致技术栈碎片化。你改动的只是跟你相关的一部分,其他部分保持不变。随着新的层不断增加,框架变得越来越难整体迁移,必须不断改动你原来没改的部分。</p>\n\n<p>(5)定制框架缺乏维护。通用技术往往有一个专门团队或公司来维护,但定制框架通常由一两个创建者拥有。一旦他们离开团队或公司,就很难找到接班人。定制框架很大可能会随着原作者离开而消失,除非在此之前获得了大量采用,才有人愿意接手,而这种情况很少发生。</p>\n\n<p>我不是说,你不要开发自己的框架,而是建议最好遵循三个原则:(1)新概念引入越少越好,(2)优先创建库,而不是框架。(3)不要做现有框架的包装器,而要从零开始构建。</p>\n\n<h2>言论</h2>\n\n<p>1、</p>\n\n<p>我想要的网络世界,是一个万物皆可塑的世界,让你不由自主地成为创造者。</p>\n\n<p>-- <a href=\"https://plumbing-of-everyday-magic.hyperclay.com/\">David Miranda</a></p>\n\n<p>2、</p>\n\n<p>AI 让软件的成本从代码转移到测试和文档,一套好的测试套件的价值可能比编写代码本身更高。</p>\n\n<p>-- <a href=\"https://lucumr.pocoo.org/2026/1/14/minijinja-go-port/\">lucumr.pocoo.org</a></p>\n\n<p>3、</p>\n\n<p>编程的核心在于抽象,即用一种远离底层技术的高级思维方式来思考代码。</p>\n\n<p>-- <a href=\"https://blog.redplanetlabs.com/2025/11/24/the-programmers-who-live-in-flatland/\">《生活在\"平面国\"的程序员》</a></p>\n\n<p>4、</p>\n\n<p>领导力就是让别人去做你想让他们做的事,而且是心甘情愿的。</p>\n\n<p>-- <a href=\"https://hebfdn.org/portfolio/eisenhower-on-leadership/\">艾森豪威尔</a>,美国前总统</p>\n\n<h2>往年回顾</h2>\n\n<p><a href=\"https://www.ruanyifeng.com/blog/2025/03/weekly-issue-342.html\">面试的 AI 作弊----用数字人去面试</a>(#342)</p>\n\n<p><a href=\"https://www.ruanyifeng.com/blog/2024/03/weekly-issue-292.html\">所有代码都是技术债</a>(#292)</p>\n\n<p><a href=\"https://www.ruanyifeng.com/blog/2023/02/weekly-issue-242.html\">一次尴尬的服务器被黑</a>(#242)</p>\n\n<p><a href=\"https://www.ruanyifeng.com/blog/2022/01/weekly-issue-192.html\">最大的机会来自新技术</a>(#192)</p>\n\n<p>(完)</p>\n\n <div><h3>文档信息</h3>\n<ul>\n<li>版权声明:自由转载-非商用-非衍生-保持署名(<a href=\"https://creativecommons.org/licenses/by-nc-nd/3.0/deed.zh\">创意共享3.0许可证</a>)</li>\n<li>发表日期: <abbr title=\"2026-03-20T07:59:16+08:00\" data-sanitized-class=\"published\">2026年3月20日</abbr></li>\n\n</ul></div> \n <div></div>",
|
||
"raw_content": null,
|
||
"metadata": {
|
||
"upstream": "freshrss",
|
||
"origin": {
|
||
"streamId": "feed/2",
|
||
"htmlUrl": "http://www.ruanyifeng.com/blog/",
|
||
"title": "阮一峰的网络日志"
|
||
},
|
||
"categories": [
|
||
"rss",
|
||
"user/-/state/org.freshrss/main",
|
||
"Weekly"
|
||
],
|
||
"crawled_at": "2026-03-24T09:18:21.528000Z",
|
||
"published_epoch": 1773964756
|
||
},
|
||
"fetch_state": "pending"
|
||
},
|
||
{
|
||
"item_id": "sha256:0d315d9489010cfd470a8d479e4e4443722fffdc34ecc1245c1b92458ace5093",
|
||
"source_id": "freshrss:66c2d55d7563e741",
|
||
"external_id": "tag:google.com,2005:reader/item/00064dc1a1f5c0db",
|
||
"title": "科技爱好者周刊(第 388 期):测试是新的护城河",
|
||
"url": "http://www.ruanyifeng.com/blog/2026/03/weekly-issue-388.html",
|
||
"author": "阮一峰",
|
||
"published_at": "2026-03-12T23:59:16Z",
|
||
"discovered_at": "2026-03-25T10:32:30.103137Z",
|
||
"content_kind": "article",
|
||
"language": null,
|
||
"raw_summary": "<p>这里记录每周值得分享的科技内容,周五发布。</p>\n\n <p>本杂志<a href=\"https://github.com/ruanyf/weekly\">开源</a>,欢迎<a href=\"https://github.com/ruanyf/weekly/issues\">投稿</a>。另有<a href=\"https://github.com/ruanyf/weekly/issues/9088\">《谁在招人》</a>服务,发布程序员招聘信息。合作请<a href=\"mailto:yifeng.ruan@gmail.com\">邮件联系</a>(yifeng.ruan@gmail.com)。</p>\n\n<h2>封面图</h2>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026030804.webp\" alt=\"\" title=\"\"></p>\n\n<p>重庆涪陵某景区架设了世界首座\"巨石索桥\",桥面就是一块块巨石,一不小心就会踏空。(<a href=\"https://www.cbg.cn/a/77561/20260214/7b37135efeb74f0fbbaf272a9b7f6ae0.html\">via</a>)</p>\n\n<h2>测试是新的护城河</h2>\n\n<p><a href=\"https://nextjs.org/\">Next.js</a> 是目前排名第一的 JS 框架。平时遇到的 JS 全栈应用,我估计,一半用它开发。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202602/bg2026022808.webp\" alt=\"\" title=\"\"></p>\n\n<p>两周前,这个框架被一则新闻颠覆了。</p>\n\n<p>一个 Cloudflare 工程师<a href=\"https://blog.cloudflare.com/vinext/\">宣布</a>,<strong>他只用一个星期就用 AI 重新实现了 Next.js</strong>,起名为 <a href=\"https://vinext.io/\">vinext</a>。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202602/bg2026022809.webp\" alt=\"\" title=\"\"></p>\n\n<p>事实上,一天就生成产品原型了,后面几天只是在完善。</p>\n\n<blockquote>\n <p>\"真正动手是2月13日,当天晚上,基本功能已经实现。第二天下午,11个路由器做好了10个。第三天,已经部署到我们的服务器,实现了完整的客户端水合。</p>\n\n<p>接下来的几天,主要进行安全加固:修复极端情况,扩展测试套件,提升 API 覆盖率至 94%。\"</p>\n</blockquote>\n\n<p>这个新的实现,比原版 Next.js 性能更好。</p>\n\n<blockquote>\n <p>\"早期基准测试中,构建速度提升了4倍,客户端软件包的体积缩小了57%,生产环境的 Next.js 应用已经直接跑在上面了。\" </p>\n</blockquote>\n\n<p>这个 vinext 的<a href=\"https://github.com/cloudflare/vinext\">代码</a>已经放出来了。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202602/bg2026022810.webp\" alt=\"\" title=\"\"></p>\n\n<p>我觉得,<strong>这件事对 Next.js 的打击非常大</strong>。</p>\n\n<p>Next.js 是 Vercel 公司的产品,背后有一个大型开发团队,每年都是巨额投入,已经整整做了10年。虽然是开源软件,但是企业版、云服务、插件、皮肤都要收费,去年的年收入达到2亿美元。</p>\n\n<p><strong>这种看似难以逾越的护城河,在 AI 面前不堪一击</strong>。一个工程师用了一个星期,就复刻了大团队十年的工作成果,现有的网页应用不改一行代码,放上去就能跑,原版的每个功能都支持。</p>\n\n<p>你知道花了多少钱?Token 费用仅仅为 1100 美元!</p>\n\n<p>这叫 Vercel 怎么再向 Next.js 的开发投钱,客户又怎么愿意再为某个功能付出高昂的使用费。</p>\n\n<p>推而广之,所有的商业软件都受到了重创。<strong>代码的护城河不存在了,只要投入一小笔金钱,AI 就能复刻出大型软件。</strong></p>\n\n<p>那么,为了保护自己,软件公司下一步肯定要防止 AI 复刻。</p>\n\n<p>怎么防呢?<strong>关键就是测试用例</strong>。</p>\n\n<p>Cloudflare 工程师这一次能够复刻成功,主要原因是 Next.js 有完备的文档、庞大的社区文章、以及完整的测试用例。AI 模拟的每一个 API,只要能够通过原有的接口测试,就能确认百分百兼容。</p>\n\n<p>如果拿不到测试用例,谁知道代码行为是否一致,谁敢放到生产环境运行。</p>\n\n<p>可以想象,为了防止复刻,大型软件项目一定会保护自己的测试用例。<strong>测试才是新的护城河。</strong></p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026030601.webp\" alt=\"\" title=\"\"></p>\n\n<p>世界最流行的数据库 <a href=\"https://sqlite.org/\">SQLite</a>,本身代码15.6万行,但是测试用例<a href=\"https://sqlite.org/testing.html\">9205万行</a>,足足大了590倍!</p>\n\n<p>其中,最核心的测试套件 <a href=\"https://sqlite.org/th3.html\">TH3</a> 是闭源的,不公开,主要测试航空、医疗等关键行业的极端情况和边缘案例,属于核心技术资产。正是这些保密用例,才让 SQLite 难以复刻。</p>\n\n<p>无独有偶,就在前两天,另一个开源项目 <a href=\"https://github.com/tldraw/tldraw/issues/8082\">tldraw</a> 也准备将测试用例闭源。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202602/bg2026022811.webp\" alt=\"\" title=\"\"></p>\n\n<p>说实话,保密的测试用例肯定不利于开源项目的发展,但是开发者需要保护自己的利益。在日益强大的 AI 面前,越来越多的软件可能会选择这样做。</p>\n\n<h2>AI 复刻的版权问题</h2>\n\n<p>AI 复刻软件还有一个版权问题,也引起了<a href=\"https://tuananh.net/2026/03/05/relicensing-with-ai-assisted-rewrite/\">很大争议</a>。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026030602.webp\" alt=\"\" title=\"\"></p>\n\n<p>Next.js 是最宽松的 MIT 许可证,所以复刻没有版权问题。但是,有人复刻了一个叫做 <a href=\"https://github.com/chardet/chardet\">chardet</a> 的项目,就争议巨大。</p>\n\n<p>chardet 本来采用的许可证,是限制较多的 LGPL,复刻以后改成了 MIT 许可证,引发了原始作者的抗议。</p>\n\n<p>网上的意见也分成了两派。</p>\n\n<p>支持者说,AI 只复刻了功能和接口,代码完全不一样,当然可以更改许可证。</p>\n\n<p>反对者说,GPL 规定了,所有衍生作品都不能更改许可证,AI 复刻就属于衍生。</p>\n\n<p>更麻烦的是,美国法律规定,AI 生成产物无版权,属于公共领域。这意味着,<strong>AI 复刻的软件不能设置许可证,设置了无效。</strong></p>\n\n<p>按照这条法律,软件许可证就意义不大了。管你是什么许可证,任何人 AI 复刻一下就能规避,AI 实现的版本一律没有版权。</p>\n\n<h2>科技动态</h2>\n\n<p>1、<a href=\"https://decrypt.co/360183/roblox-using-ai-rewrite-chat-swears-slurs-real-time\">AI 改写脏话</a></p>\n\n<p>游戏平台 Roblox <a href=\"https://ir.roblox.com/news/news-details/2026/Roblox-Launches-Real-Time-Chat-Rephrasing-to-Maintain-Civility-and-Gameplay-Flow/default.aspx\">宣布</a>,将用 AI 实时修改玩家的对话,让其变得更文明。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026030701.webp\" alt=\"\" title=\"\"></p>\n\n<p>以前,如果玩家在游戏里面骂脏话,系统只会将其过滤,显示为 <code>####</code>,你还是知道他在骂人。</p>\n\n<p>现在,AI 将重新修改整个句子,让表达变得更礼貌、更文明,你就察觉不到对方在骂人。</p>\n\n<p>虽然这样未免有点虚假,但确实有必要。网络论坛也应该跟进,不要让人身攻击毁掉交流氛围。</p>\n\n<p>2、<a href=\"https://www.esa.int/Applications/Connectivity_and_Secure_Communications/World-first_gigabit-per-second_laser_link_between_aircraft_and_geostationary_satellite\">飞机的激光上网</a></p>\n\n<p>欧洲航天局成功进行了飞机的\"激光上网\"实验,通过激光将一架飞机与一颗卫星连接,实现了高速通信。 </p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026030704.webp\" alt=\"\" title=\"\"></p>\n\n<p>飞机上网现在都通过无线电波,比如星链就通过无线电,让飞机连接卫星。本次实验则是通过激光连接卫星。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026030705.webp\" alt=\"\" title=\"\"></p>\n\n<p>上图就是安装在飞机舷窗上的激光终端。</p>\n\n<p>激光通信的优点是带宽大,不受无线频谱的限制,这次实验的上网速度达到了 2.6Gbps,是星链的8到10倍。</p>\n\n<p>缺点是激光与卫星之间必须保持直线,不能有云层和大气的障碍物。所以采用这种方式,大概只有飞到高空时才能上网。</p>\n\n<p>3、<a href=\"https://www.theverge.com/ai-artificial-intelligence/890921/grammarly-ai-expert-reviews\">Grammarly 的专家意见</a></p>\n\n<p>Grammarly 是一个写作服务,提供一个收费功能\"专家意见\",让专家点评你的文章。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031002.webp\" alt=\"\" title=\"\"></p>\n\n<p>一个国外用户使用该功能时,震惊地发现,点评专家里面有他的前老板(下图),但是他知道老板已经去世了。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031003.webp\" alt=\"\" title=\"\"></p>\n\n<p>原来这不是真人点评,而是 AI 为每个专家建了一个分身,用他们各自的文章进行训练,然后让分身点评你的文章。</p>\n\n<p>这引起了争议,我们是否有权搭建别人的\"数字分身\",然后冠以原始人物的名义(比如\"孔子分身\"或者\"爱因斯坦分身\")?</p>\n\n<p>4、<a href=\"https://www.bbc.com/news/articles/cgln72rgrero\">太阳能邮筒</a></p>\n\n<p>网络通信普及以后,传统的邮筒怎么办?</p>\n\n<p>英国皇家邮政想出一个办法,将英国各地3500个邮筒,变为\"太阳能邮筒\"。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202511/bg2025110505.webp\" alt=\"\" title=\"\"></p>\n\n<p>邮筒顶部加装了太阳能光伏片,功能也从寄信,变成了收寄小包裹。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202511/bg2025110506.webp\" alt=\"\" title=\"\"></p>\n\n<p>这样既保存了传统的红色邮筒,成为街道的景观,又为人们邮寄包裹提供了方便。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202511/bg2025110507.webp\" alt=\"\" title=\"\"></p>\n\n<h2>文章</h2>\n\n<p>1、<a href=\"https://grith.ai/blog/clinejection-when-your-ai-tool-installs-another\">GitHub Issue 标题的注入攻击</a>(英文)</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026030703.webp\" alt=\"\" title=\"\"></p>\n\n<p>这可能是第一起 AI 模型注入的真实攻击。Cline 项目使用 AI 对 GitHub Issue 进行分类,有人就在标题插入恶意提示词,从而成功拿到 npm 令牌,发布了一个恶意版本。本文告诉你这是怎么做到的。</p>\n\n<p>2、<a href=\"https://www.infoq.com/news/2026/03/agents-context-file-value-review/\">重新评估 AGENTS.md</a>(英文)</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026030901.webp\" alt=\"\" title=\"\"></p>\n\n<p>最近的一项研究提出,跟推荐做法相反,AGENTS.md 文件对 AI 编码不是促进,而是阻碍。</p>\n\n<p>它只是让模型\"思考\"得更多(成本上升),生成结果却没有更好(性能下降)。</p>\n\n<p>3、<a href=\"https://bloomberg.github.io/js-blog/post/temporal/\">Temporal API 的九年历程</a>(英文)</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031205.webp\" alt=\"\" title=\"\"></p>\n\n<p>本周,Temporal API 正式通过了第四阶段。这意味着,它进入了 ES2026 标准,成为了 JavaScript 语法的一部分。本文是这个标准的起草者对九年推进历程的回顾。</p>\n\n<p>4、<a href=\"https://decrypt.co/360596/benchmark-test-measures-ai-bullshit-most-models-fail\">AI 的胡说测试</a>(英文)</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031206.webp\" alt=\"\" title=\"\"></p>\n\n<p>国外有一个 <a href=\"https://petergpt.github.io/bullshit-benchmark/viewer/index.v2.html\">BuillshitBench</a>,专门问 AI 一些胡说八道的问题,看 AI 能不能分辨这是胡说,还是一本正经地回答。</p>\n\n<p>5、<a href=\"https://www.zolkos.com/2025/12/03/vanilla-css-is-all-you-need\">原生 CSS 就足够了</a>(英文)</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202512/bg2025120704.webp\" alt=\"\" title=\"\"></p>\n\n<p>本文展示了 37Signals 公司的 CSS 代码,表明不使用任何框架(比如 Tailwind)和构建工具(比如 Sass),只用原生 CSS 代码完全可以。</p>\n\n<p>6、<a href=\"https://theconversation.com/physics-of-poo-why-it-takes-you-and-an-elephant-the-same-amount-of-time-76696\">粪便物理学</a>(英文)</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026030802.webp\" alt=\"\" title=\"\"></p>\n\n<p>一篇很另类的科普文章,解释为什么动物不管大小,排便时间都在5~19秒之间,平均12秒。</p>\n\n<h2>工具</h2>\n\n<p>1、<a href=\"https://github.com/c0m4r/kula\">KULA</a></p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026030706.webp\" alt=\"\" title=\"\"></p>\n\n<p>Linux 服务器的监控工具,只有一个二进制文件。</p>\n\n<p>2、<a href=\"https://github.com/lardissone/ansi-saver\">AnsiSaver</a></p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026030803.webp\" alt=\"\" title=\"\"></p>\n\n<p>mac 电脑的屏保程序,用彩色的 Ansi 字符画作为屏保图案。</p>\n\n<p>3、<a href=\"https://github.com/eliasdorneles/upiano\">upiano</a></p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202308/bg2023081012.webp\" alt=\"\" title=\"\"></p>\n\n<p>在命令行下模拟钢琴弹奏。</p>\n\n<p>4、<a href=\"https://github.com/bostrot/wsl2-distro-manager\">WSL Distro Manager</a></p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031207.webp\" alt=\"\" title=\"\"></p>\n\n<p>一个开源 Windows 应用,通过图形界面管理 Windows Subsystem for Linux(WSL)发行版。</p>\n\n<p>5、<a href=\"https://github.com/tw93/Mole\">Mole</a></p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031213.webp\" alt=\"\" title=\"\"></p>\n\n<p>开源的 Mac 电脑清理和优化工具。</p>\n\n<p>6、<a href=\"https://github.com/janbjorge/pipegate\">PipeGate</a></p>\n\n<p>一个将内网服务映射到外网的隧道工具,特点是比较简单,就是几个 Python 脚本,并且可以设置 UUID 客户端认证。</p>\n\n<p>7、<a href=\"https://www.hooklistener.com/\">HookListener</a></p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202412/bg2024121804.webp\" alt=\"\" title=\"\"></p>\n\n<p>一个管理、测试 Webhook 的在线工具,个人可以免费使用。</p>\n\n<p>8、<a href=\"https://github.com/suzuran0y/CCTV-Smartphone-AI-Monitoring\">Sentinel</a></p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031201.webp\" alt=\"\" title=\"\"></p>\n\n<p>将安卓手机转化为网络摄像头,实现实时监控和图像采集。(<a href=\"https://github.com/ruanyf/weekly/issues/9201\">@suzuran0</a> 投稿)</p>\n\n<p>9、<a href=\"https://github.com/chentao1006/FluxMonitor\">Flux Monitor</a></p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031203.webp\" alt=\"\" title=\"\"></p>\n\n<p>Mac 电脑的系统监控、管理面板。(<a href=\"https://github.com/ruanyf/weekly/issues/9207\">@chentao1006</a> 投稿)</p>\n\n<h2>AI 相关</h2>\n\n<p>1、<a href=\"https://github.com/MrQianjinsi/agentic-metric\">Agentic Metric</a></p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026030603.webp\" alt=\"\" title=\"\"></p>\n\n<p>一个 Python 命令行工具,监控本地各种 coding agent(比如 Claude Code、Codex、OpenCode)的使用量。(<a href=\"https://github.com/ruanyf/weekly/issues/9165\">@MrQianjinsi</a> 投稿)</p>\n\n<p>2、<a href=\"https://github.com/chenhg5/cc-connect\">cc-connect</a></p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031202.webp\" alt=\"\" title=\"\"></p>\n\n<p>一个开源的连接器,将各种 AI 编程工具与手机聊天软件相连。(<a href=\"https://github.com/ruanyf/weekly/issues/9202\">@chenhg5</a> 投稿)</p>\n\n<p>3、<a href=\"https://github.com/alibaba/page-agent\">Page Agent</a></p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026030702.webp\" alt=\"\" title=\"\"></p>\n\n<p>只要在网页插入这个 JS 库,就可以使用自然语言操作页面,比如\"点击导航栏的文档链接,总结其内容\"。</p>\n\n<p>4、<a href=\"https://github.com/eugene1g/agent-safehouse\">Agent Safehouse</a></p>\n\n<p>一个 macOS 沙箱工具,用来在沙箱里运行 AI 编程工具。</p>\n\n<p>5、<a href=\"https://github.com/qwibitai/nanoclaw/tree/main/repo-tokens\">Repo Tokens</a></p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202602/bg2026022801.webp\" alt=\"\" title=\"\"></p>\n\n<p>一个 GitHub Action,为你的仓库添加一个图形标签(上图),显示该仓库相当于多少 Token,用来大模型的计算量。</p>\n\n<h2>资源</h2>\n\n<p>1、<a href=\"https://www.worldmonitor.app/\">世界监控</a>(World Monitor)</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026030801.webp\" alt=\"\" title=\"\"></p>\n\n<p>世界局势的一个实时看板,把各种消息源都放在一个网页里。</p>\n\n<p>2、<a href=\"https://fuelingcuriosity.com/game.html\">炼油厂探索</a></p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031204.webp\" alt=\"\" title=\"\"></p>\n\n<p>一个动画互动网站,展示炼油厂怎样将石油变成汽柴油。</p>\n\n<p>3、<a href=\"https://mechanical-pencil.com/\">Mechanical Pencil</a></p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031001.webp\" alt=\"\" title=\"\"></p>\n\n<p>弹簧笔、打火机等生活小物品的机械装置动画。</p>\n\n<h2>图片</h2>\n\n<p>1、<a href=\"https://tesseral.com/blog/i-designed-some-more-user-friendly-methods-for-multi-factor-authentication\">密码的替代方法</a></p>\n\n<p>一位程序员发明了一种新的密码方法,你觉得可行吗?</p>\n\n<p>系统向用户展示一副扑克牌,让其从52张牌中依次挑出5张,作为密码。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202507/bg2025073110.webp\" alt=\"\" title=\"\"></p>\n\n<p>下次登录时,用户必须按同样顺序挑出同样的5张牌。</p>\n\n<h2>文摘</h2>\n\n<p>1、<a href=\"https://news.ycombinator.com/item?id=31670526\">复杂社会的崩溃</a></p>\n\n<p>我们都知道,一个软件的复杂度不断上升,超过某个极限后,就会难以维护,最后往往被放弃。</p>\n\n<p>美国历史学家约瑟夫·坦特(Joseph Tainter)认为,人类社会也是如此。如果社会的复杂度超过极限,这个社会最终也会崩溃。</p>\n\n<p><img src=\"https://cdn.beekka.com/blogimg/asset/202603/bg2026031214.webp\" alt=\"\" title=\"\"></p>\n\n<p>1988年,他出版了一本名为《复杂社会的崩溃》的书,描述了罗马人、玛雅人和查科人等伟大文明的兴衰,试图回答几个世纪以来一直困扰着思想家的一个问题:<strong>为什么强大的社会会崩溃?</strong></p>\n\n<p>他认为,原因是这些社会有一个敌人----复杂性。</p>\n\n<p>随着文明的发展,社会增加了越来越多的复杂性:更多的等级制度、更多的官僚机构、更深层次的社会结构。</p>\n\n<p>一开始,新的等级、官僚、组织都是有用的,比如可以增加经济产出、税收等。但到了某个时刻,收益递减规律开始出现,每增加一点复杂度带来的回报越来越少,直至变成零甚至负数。</p>\n\n<p>(1)法律条文和官僚越多,政府开销也就随之上升,长期很可能令社会无法负担。</p>\n\n<p>(2)复杂度变大,会增加社会的不平等,因为能理解所有规则的人就越少,你就越离不开律师。懂规则的人会比其他人占优势。</p>\n\n<p>(3)规则越多,维护和执行这些规则的机构也就越多,不利于社会提高效率。</p>\n\n<p>(4)复杂性最终导致社会各阶层的差距变大,对立也随之而来。</p>\n\n<p>以上因素的共同作用,导致历史上很多强大的社会最终崩溃。</p>\n\n<h2>言论</h2>\n\n<p>1、</p>\n\n<p>2021年,我感觉做一名优秀的软件工程师棒极了。软件行业蓬勃发展,机会很多,我热爱这份工作,觉得可以永远做下去。</p>\n\n<p>2026年,我已经不确定软件行业十年后会怎样,即使还存在,必定与现在极不相同。我也许能找到出路,也许不得不离开这个行业。无论如何,我热爱的软件工作即将消失。</p>\n\n<p>-- <a href=\"https://www.seangoedecke.com/will-my-job-still-exist/\">《我不知道十年后我的工作是否还存在》</a></p>\n\n<p>2、</p>\n\n<p>与强大的 AI 对抗会是什么感觉?</p>\n\n<p>你会感觉自己莫名其妙地弱了不少,AI 做的每件事都超出你的预期。</p>\n\n<p>这就好像你和一位实力强劲的玩家玩一款随机性很强的游戏,你会感觉这位高手总是运气爆棚。</p>\n\n<p>-- <a href=\"https://probablydance.com/2026/03/07/im-getting-a-whiff-of-iain-banks-culture/\">probablydance.com</a></p>\n\n<p>3、</p>\n\n<p>阅读商战书籍是浪费时间。它们将简单的故事变成通用的建议,将偶然的成功转化为普遍的策略,并用激励人心的口号取代复杂的市场。</p>\n\n<p>这些书的成功并不是因为内容正确,而是因为易于阅读并且让读者感觉良好。</p>\n\n<p>-- <a href=\"https://antemedian.substack.com/p/why-reading-business-books-is-a-waste\">《阅读商战书籍是浪费时间》</a></p>\n\n<p>4、</p>\n\n<p>我想让 AI 告诉我怎么使用一种全新的、AI 也不会用的工具,就会提示 AI \"执行 xxx-tool --help 来了解该工具\"(假定工具名字是 xxx-tool),然后 AI 就学会用了。</p>\n\n<p>-- <a href=\"https://simonwillison.net/2026/Mar/9/not-so-boring/\">Simon Willison</a>,著名开发者</p>\n\n<p>5、</p>\n\n<p>时间是唯一不可再生的资源。AI 大模型是目前我所知的最便宜的赚取额外时间的方式。</p>\n\n<p>-- <a href=\"https://steipete.me/posts/2025/stop-overthinking-ai-subscriptions\">《不要太看重 AI 大模型的订阅费》</a></p>\n\n<h2>往年回顾</h2>\n\n<p><a href=\"https://www.ruanyifeng.com/blog/2025/03/weekly-issue-341.html\">低代码编程,恐怕不会成功</a>(#341)</p>\n\n<p><a href=\"http://www.ruanyifeng.com/blog/2024/03/weekly-issue-291.html\">AI 没有护城河</a>(#291)</p>\n\n<p><a href=\"http://www.ruanyifeng.com/blog/2023/02/weekly-issue-241.html\">中国的增长动力在内陆</a>(#241)</p>\n\n<p><a href=\"http://www.ruanyifeng.com/blog/2022/01/weekly-issue-191.html\">一个程序员的财务独立之路</a>(#191)</p>\n\n<p>(完)</p>\n\n <div><h3>文档信息</h3>\n<ul>\n<li>版权声明:自由转载-非商用-非衍生-保持署名(<a href=\"https://creativecommons.org/licenses/by-nc-nd/3.0/deed.zh\">创意共享3.0许可证</a>)</li>\n<li>发表日期: <abbr title=\"2026-03-13T07:59:16+08:00\" data-sanitized-class=\"published\">2026年3月13日</abbr></li>\n\n</ul></div> \n <div></div>",
|
||
"raw_content": null,
|
||
"metadata": {
|
||
"upstream": "freshrss",
|
||
"origin": {
|
||
"streamId": "feed/2",
|
||
"htmlUrl": "http://www.ruanyifeng.com/blog/",
|
||
"title": "阮一峰的网络日志"
|
||
},
|
||
"categories": [
|
||
"rss",
|
||
"user/-/state/org.freshrss/main",
|
||
"Weekly"
|
||
],
|
||
"crawled_at": "2026-03-24T09:18:21.528000Z",
|
||
"published_epoch": 1773359956
|
||
},
|
||
"fetch_state": "pending"
|
||
},
|
||
{
|
||
"item_id": "sha256:419828361de854cd29dbcd3e8205d3da50ff955ac9c85861d2e195bc888b2103",
|
||
"source_id": "freshrss:2987af960359c5c0",
|
||
"external_id": "tag:google.com,2005:reader/item/00064dc18f09d916",
|
||
"title": "FreshRSS 1.28.1",
|
||
"url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.1",
|
||
"author": "Alkarex",
|
||
"published_at": "2026-01-25T18:20:16Z",
|
||
"discovered_at": "2026-03-25T10:32:30.103137Z",
|
||
"content_kind": "article",
|
||
"language": null,
|
||
"raw_summary": "<ul>\n<li><a href=\"https://github.com/FreshRSS/FreshRSS/milestones/1.28.1\">Milestone</a></li>\n</ul>\n<p>This is a release focussing on bug fixing, in particular regressions from the release <a href=\"https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0\">1.28.0</a>.</p>\n<p>Selected new features ✨:</p>\n<ul>\n<li>New customisable message for closed registrations</li>\n<li>Add username in Apache access logs (also in Docker logs): for GReader API, and for HTTP Basic Auth from reverse proxy</li>\n</ul>\n<p>Improved performance 🏎️:</p>\n<ul>\n<li>Disable counting articles in user labels for Ajax requests (unused)</li>\n</ul>\n<p>Many bug fixes 🐛</p>\n<p>This release has been made by <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/Alkarex/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/Alkarex\" data-sanitized-class=\"user-mention notranslate\">@Alkarex</a>, <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/Frenzie/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/Frenzie\" data-sanitized-class=\"user-mention notranslate\">@Frenzie</a>, <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/Inverle/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/Inverle\" data-sanitized-class=\"user-mention notranslate\">@Inverle</a> and newcomers <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/ciro-mota/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/ciro-mota\" data-sanitized-class=\"user-mention notranslate\">@ciro-mota</a>, <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/eveiscoull/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/eveiscoull\" data-sanitized-class=\"user-mention notranslate\">@eveiscoull</a>, <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/hackerman70000/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/hackerman70000\" data-sanitized-class=\"user-mention notranslate\">@hackerman70000</a>, <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/Hufschmidt/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/Hufschmidt\" data-sanitized-class=\"user-mention notranslate\">@Hufschmidt</a>, <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/johan456789/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/johan456789\" data-sanitized-class=\"user-mention notranslate\">@johan456789</a>, <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/martgnz/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/martgnz\" data-sanitized-class=\"user-mention notranslate\">@martgnz</a>, <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/mmeier86/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/mmeier86\" data-sanitized-class=\"user-mention notranslate\">@mmeier86</a>, <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/netsho/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/netsho\" data-sanitized-class=\"user-mention notranslate\">@netsho</a>, <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/neuhaus/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/neuhaus\" data-sanitized-class=\"user-mention notranslate\">@neuhaus</a>, <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/RobLoach/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/RobLoach\" data-sanitized-class=\"user-mention notranslate\">@RobLoach</a>, <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/rupakbajgain/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/rupakbajgain\" data-sanitized-class=\"user-mention notranslate\">@rupakbajgain</a>.</p>\n<p>Full <a href=\"https://github.com/FreshRSS/FreshRSS/blob/1.28.1/CHANGELOG.md\">changelog</a>:</p>\n<ul>\n<li>Features\n<ul>\n<li>Handle Web scraping of <code>text/plain</code> as <code><pre class=\"text-plain\"></code> <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8340\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8340/hovercard\">#8340</a></li>\n<li>New customisable message for closed registrations <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8462\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8462/hovercard\">#8462</a></li>\n</ul>\n</li>\n<li>Bug fixing\n<ul>\n<li>Fix unwanted expansion of user queries (saved searches) applied to filters <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8395\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8395/hovercard\">#8395</a></li>\n<li>Fix encoding of filter actions for labels <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8368\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8368/hovercard\">#8368</a></li>\n<li>Fix searching of tags <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8425\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8425/hovercard\">#8425</a></li>\n<li>Fix refreshing feeds with token while anonymous refresh is disabled <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8371\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8371/hovercard\">#8371</a></li>\n<li>Fix RSS and OPML access by token <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8434\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8434/hovercard\">#8434</a></li>\n<li>Fix MySQL/MariaDB <code>transliterator_transliterate</code> fallback (when the <code>php-intl</code> extension is unavailable) <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8427\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8427/hovercard\">#8427</a></li>\n<li>Fix regression with MySQL/MariaDB index hint <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8460\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8460/hovercard\">#8460</a></li>\n<li>Auto-add <code>lastUserModified</code> database column also during mark-as-read action <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8346\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8346/hovercard\">#8346</a></li>\n<li>Do not include hidden feeds when counting unread articles in categories <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8357\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8357/hovercard\">#8357</a></li>\n<li>Remove wrong PHP deprecation of OPML export action <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8399\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8399/hovercard\">#8399</a></li>\n<li>Fix shortcut for next unread article <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8466\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8466/hovercard\">#8466</a></li>\n<li>Fix custom <code>session.cookie-lifetime</code> <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8446\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8446/hovercard\">#8446</a></li>\n<li>Fix feed validator button when changing the feed URL <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8436\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8436/hovercard\">#8436</a></li>\n</ul>\n</li>\n<li>Performance\n<ul>\n<li>Disable counting articles in user labels for Ajax requests (unused) <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8352\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8352/hovercard\">#8352</a></li>\n</ul>\n</li>\n<li>Security\n<ul>\n<li>Change <code>Content-Disposition: inline</code> to <code>attachment</code> in <code>f.php</code> <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8344\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8344/hovercard\">#8344</a></li>\n<li>Hardened user methods <code>exists</code>, <code>mtime</code>, <code>ctime</code> <a href=\"https://github.com/FreshRSS/FreshRSS/commit/26c1102567c095b051b5e1a0aedb45b78713c283\">#26c1102</a></li>\n</ul>\n</li>\n<li>Deployment\n<ul>\n<li>Add username in Apache access logs (also in Docker logs): for GReader API, and for HTTP Basic Auth from reverse proxy <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8392\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8392/hovercard\">#8392</a></li>\n</ul>\n</li>\n<li>SimplePie\n<ul>\n<li>Update of <code>CURLOPT_ACCEPT_ENCODING</code> <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8376\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8376/hovercard\">#8376</a>, <a href=\"https://github.com/simplepie/simplepie/pull/960\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/simplepie/simplepie/pull/960/hovercard\">simplepie#960</a>, <a href=\"https://github.com/simplepie/simplepie/pull/962\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/simplepie/simplepie/pull/962/hovercard\">simplepie#962</a></li>\n<li>Fix don’t preserve children inside disallowed <code><template></code> element <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8443\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8443/hovercard\">#8443</a></li>\n<li>Fixes before PHPStan 2 <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8445\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8445/hovercard\">#8445</a>, <a href=\"https://github.com/simplepie/simplepie/pull/957\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/simplepie/simplepie/pull/957/hovercard\">simplepie#957</a></li>\n</ul>\n</li>\n<li>Extensions\n<ul>\n<li>Update <code>.gitignore</code> to ignore installed extensions <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8372\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8372/hovercard\">#8372</a></li>\n</ul>\n</li>\n<li>UI\n<ul>\n<li>Add <code>data-category=\"3\"</code> to ease custom CSS styling of articles <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8397\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8397/hovercard\">#8397</a></li>\n<li>Fix space between <em>By:</em> and the author’s name <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8422\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8422/hovercard\">#8422</a></li>\n</ul>\n</li>\n<li>I18n\n<ul>\n<li>Improve Brazilian Portuguese <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8411\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8411/hovercard\">#8411</a></li>\n<li>Improve Dutch <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8403\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8403/hovercard\">#8403</a></li>\n<li>Improve German <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8402\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8402/hovercard\">#8402</a></li>\n<li>Improve Polish <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8408\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8408/hovercard\">#8408</a></li>\n<li>Improve Spanish <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8464\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8464/hovercard\">#8464</a></li>\n</ul>\n</li>\n<li>Misc.\n<ul>\n<li>Update dev dependencies <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8387\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8387/hovercard\">#8387</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8388\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8388/hovercard\">#8388</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8389\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8389/hovercard\">#8389</a>,<br>\n<a href=\"https://github.com/FreshRSS/FreshRSS/pull/8390\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8390/hovercard\">#8390</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8391\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8391/hovercard\">#8391</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8393\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8393/hovercard\">#8393</a>,<br>\n<a href=\"https://github.com/FreshRSS/FreshRSS/pull/8453\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8453/hovercard\">#8453</a></li>\n</ul>\n</li>\n</ul><figure class=\"enclosure\">\n\t<p class=\"enclosure-content\">\n\t\t<img class=\"enclosure-thumbnail\" src=\"https://avatars.githubusercontent.com/u/1008324?s=60&v=4\" alt=\"\" />\n\t</p>\n</figure>",
|
||
"raw_content": null,
|
||
"metadata": {
|
||
"upstream": "freshrss",
|
||
"origin": {
|
||
"streamId": "feed/1",
|
||
"htmlUrl": "https://github.com/FreshRSS/FreshRSS/",
|
||
"title": "FreshRSS releases"
|
||
},
|
||
"categories": [
|
||
"未分类",
|
||
"user/-/state/org.freshrss/main"
|
||
],
|
||
"crawled_at": "2026-03-24T09:13:04.078000Z",
|
||
"published_epoch": 1769365216
|
||
},
|
||
"fetch_state": "pending"
|
||
},
|
||
{
|
||
"item_id": "sha256:6b36071bbd22c58692c039e172669ae28ac1ec8a6a6bce150c22d80af29761fc",
|
||
"source_id": "freshrss:2987af960359c5c0",
|
||
"external_id": "tag:google.com,2005:reader/item/00064dc18f09d915",
|
||
"title": "FreshRSS 1.28.0",
|
||
"url": "https://github.com/FreshRSS/FreshRSS/releases/tag/1.28.0",
|
||
"author": "Alkarex",
|
||
"published_at": "2025-12-24T19:27:23Z",
|
||
"discovered_at": "2026-03-25T10:32:30.103137Z",
|
||
"content_kind": "article",
|
||
"language": null,
|
||
"raw_summary": "<ul>\n<li><a href=\"https://github.com/FreshRSS/FreshRSS/milestones/1.28.0\">Milestone</a></li>\n</ul>\n<p>This is a major release, just in time for the holidays 🎄</p>\n<p>Selected new features ✨:</p>\n<ul>\n<li>New sorting and filtering by date of <em>User modified</em>, with corresponding search operator, e.g. <code>userdate:PT1H</code> for the past hour</li>\n<li>New sorting by article length</li>\n<li>New advanced search form</li>\n<li>New overview of dates with most unread articles</li>\n<li>New ability to share feed visibility through API (implemented by e.g. <a href=\"https://github.com/jocmp/capyreader\">Capy Reader</a>)\n<ul>\n<li>Bonus: Capy Reader is also the first open source Android app to support <em>user labels</em></li>\n</ul>\n</li>\n<li>Better transitions UI between groups of articles</li>\n<li>New links in UI for transitions between groups of articles, and jump to next transition</li>\n<li>Docker default image updated to Debian 13 Trixie with PHP 8.4.11</li>\n<li>And much more…</li>\n</ul>\n<p>Improved performance 🏎️:</p>\n<ul>\n<li>Scaling of user statistics in Web UI and CLI, to help instances with 1k+ users</li>\n<li>Improve SQL speed for some critical requests for large databases</li>\n<li>API performance optimisation thanks to streaming of large responses</li>\n</ul>\n<p>Selected bug fixes 🐛:</p>\n<ul>\n<li>Fix OpenID Connect with Debian 13</li>\n<li>Fix MySQL / MariaDB bug wrongly sorting new articles</li>\n<li>Fix SQLite bind bug when adding tag</li>\n</ul>\n<p>Breaking changes 💥:</p>\n<ul>\n<li>Move unsafe autologin to an extension</li>\n<li>Potential breaking changes for some extensions (which have to rename some old functions)</li>\n</ul>\n<p>This release has been made by <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/Alkarex/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/Alkarex\" data-sanitized-class=\"user-mention notranslate\">@Alkarex</a>, <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/Frenzie/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/Frenzie\" data-sanitized-class=\"user-mention notranslate\">@Frenzie</a>, <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/Inverle/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/Inverle\" data-sanitized-class=\"user-mention notranslate\">@Inverle</a>, <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/aledeg/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/aledeg\" data-sanitized-class=\"user-mention notranslate\">@aledeg</a>, <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/andris155/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/andris155\" data-sanitized-class=\"user-mention notranslate\">@andris155</a>, <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/horvi28/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/horvi28\" data-sanitized-class=\"user-mention notranslate\">@horvi28</a>, <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/math-GH/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/math-GH\" data-sanitized-class=\"user-mention notranslate\">@math-GH</a>, <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/minna-xD/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/minna-xD\" data-sanitized-class=\"user-mention notranslate\">@minna-xD</a> and newcomers <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/Darkentia/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/Darkentia\" data-sanitized-class=\"user-mention notranslate\">@Darkentia</a>, <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/FollowTheWizard/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/FollowTheWizard\" data-sanitized-class=\"user-mention notranslate\">@FollowTheWizard</a>, <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/GreyChame1eon/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/GreyChame1eon\" data-sanitized-class=\"user-mention notranslate\">@GreyChame1eon</a>, <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/McFev/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/McFev\" data-sanitized-class=\"user-mention notranslate\">@McFev</a>, <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/jocmp/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/jocmp\" data-sanitized-class=\"user-mention notranslate\">@jocmp</a>, <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/larsks/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/larsks\" data-sanitized-class=\"user-mention notranslate\">@larsks</a>, <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/martinhartmann/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/martinhartmann\" data-sanitized-class=\"user-mention notranslate\">@martinhartmann</a>, <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/matthew-neavling/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/matthew-neavling\" data-sanitized-class=\"user-mention notranslate\">@matthew-neavling</a>, <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/pudymody/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/pudymody\" data-sanitized-class=\"user-mention notranslate\">@pudymody</a>, <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/raspo/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/raspo\" data-sanitized-class=\"user-mention notranslate\">@raspo</a>, <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/scharmach/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/scharmach\" data-sanitized-class=\"user-mention notranslate\">@scharmach</a>, <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/scollovati/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/scollovati\" data-sanitized-class=\"user-mention notranslate\">@scollovati</a>, <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/stag-enterprises/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/stag-enterprises\" data-sanitized-class=\"user-mention notranslate\">@stag-enterprises</a>, <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/vandys/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/vandys\" data-sanitized-class=\"user-mention notranslate\">@vandys</a>, <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/xtmd/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/xtmd\" data-sanitized-class=\"user-mention notranslate\">@xtmd</a>, <a data-hovercard-type=\"user\" data-hovercard-url=\"/users/yzx9/hovercard\" data-octo-click=\"hovercard-link-click\" data-octo-dimensions=\"link_type:self\" href=\"https://github.com/yzx9\" data-sanitized-class=\"user-mention notranslate\">@yzx9</a>.</p>\n<p>Full <a href=\"https://github.com/FreshRSS/FreshRSS/blob/1.28.0/CHANGELOG.md\">changelog</a>:</p>\n<ul>\n<li>Features\n<ul>\n<li>New sorting and filtering by date of <em>User modified</em> <a href=\"https://github.com/FreshRSS/FreshRSS/pull/7886\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/7886/hovercard\">#7886</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8090\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8090/hovercard\">#8090</a>,<br>\n<a href=\"https://github.com/FreshRSS/FreshRSS/pull/8105\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8105/hovercard\">#8105</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8118\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8118/hovercard\">#8118</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8130\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8130/hovercard\">#8130</a>\n<ul>\n<li>Corresponding search operator, e.g. <code>userdate:PT1H</code> for the past hour <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8093\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8093/hovercard\">#8093</a></li>\n<li>Allows finding articles marked by the local user as read/unread or starred/unstarred at specific dates for e.g. undo action.</li>\n</ul>\n</li>\n<li>New sorting by article length <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8119\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8119/hovercard\">#8119</a></li>\n<li>New advanced search form <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8103\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8103/hovercard\">#8103</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8122\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8122/hovercard\">#8122</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8226\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8226/hovercard\">#8226</a></li>\n<li>Add compatibility with PCRE word boundary <code>\\b</code> and <code>\\B</code> for regex search using PostgreSQL <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8141\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8141/hovercard\">#8141</a></li>\n<li>More uniform SQL search and PHP search for accents and case-sensitivity (e.g. for automatically marking as read) <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8329\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8329/hovercard\">#8329</a></li>\n<li>New overview of dates with most unread articles <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8089\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8089/hovercard\">#8089</a></li>\n<li>Allow marking as read articles older than 1 or 7 days also when sorting by publication date <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8163\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8163/hovercard\">#8163</a></li>\n<li>New option to show user labels instead of tags in RSS share <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8112\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8112/hovercard\">#8112</a></li>\n<li>Add new feed visibility (priority) <em>Show in its feed</em> <a href=\"https://github.com/FreshRSS/FreshRSS/pull/7972\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/7972/hovercard\">#7972</a></li>\n<li>New ability to share feed visibility through API (implemented by e.g. Capy Reader) <a href=\"https://github.com/FreshRSS/FreshRSS/pull/7583\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/7583/hovercard\">#7583</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8158\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8158/hovercard\">#8158</a></li>\n<li>Configurable notification timeout <a href=\"https://github.com/FreshRSS/FreshRSS/pull/7942\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/7942/hovercard\">#7942</a></li>\n<li>OPML export/import of unicity criteria <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8243\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8243/hovercard\">#8243</a></li>\n<li>Ensure stable IDs (categories, feeds, labels) during export/import <a href=\"https://github.com/FreshRSS/FreshRSS/pull/7988\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/7988/hovercard\">#7988</a></li>\n<li>Add username and timestamp to SQLite export from Web UI <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8169\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8169/hovercard\">#8169</a></li>\n<li>Add option to apply filter actions to existing articles <a href=\"https://github.com/FreshRSS/FreshRSS/pull/7959\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/7959/hovercard\">#7959</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8259\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8259/hovercard\">#8259</a></li>\n<li>Support CSS selector <code>~</code> <em>subsequent-sibling</em> <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8154\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8154/hovercard\">#8154</a>\n<ul>\n<li>Upstream PR <a href=\"https://github.com/phpgt/CssXPath/pull/231\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/phpgt/CssXPath/pull/231/hovercard\">phpgt/CssXPath#231</a></li>\n</ul>\n</li>\n<li>Rework saving of configuration files for more reliability in case of e.g. full disk <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8220\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8220/hovercard\">#8220</a></li>\n<li>Web scraping support date format as milliseconds for Unix epoch <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8266\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8266/hovercard\">#8266</a></li>\n<li>Allow negative category sort numbers <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8330\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8330/hovercard\">#8330</a></li>\n</ul>\n</li>\n<li>Performance\n<ul>\n<li>Improve SQL speed for updating cached information <a href=\"https://github.com/FreshRSS/FreshRSS/pull/6957\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/6957/hovercard\">#6957</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8207\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8207/hovercard\">#8207</a>,<br>\n<a href=\"https://github.com/FreshRSS/FreshRSS/pull/8255\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8255/hovercard\">#8255</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8254\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8254/hovercard\">#8254</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8255\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8255/hovercard\">#8255</a></li>\n<li>Fix SQL performance issue with MySQL, using an index hint <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8211\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8211/hovercard\">#8211</a></li>\n<li>Scaling of user statistics in Web UI and CLI, to help instances with 1k+ users <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8277\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8277/hovercard\">#8277</a></li>\n<li>API streaming of large responses for reducing memory consumption and increasing speed <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8041\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8041/hovercard\">#8041</a></li>\n</ul>\n</li>\n<li>Security\n<ul>\n<li>💥 Move unsafe autologin to an extension <a href=\"https://github.com/FreshRSS/FreshRSS/pull/7958\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/7958/hovercard\">#7958</a></li>\n<li>Fix some CSRFs <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8035\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8035/hovercard\">#8035</a></li>\n<li>Strengthen some crypto (login, tokens, nonces) <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8061\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8061/hovercard\">#8061</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8320\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8320/hovercard\">#8320</a></li>\n<li>Create separate HTTP <code>Retry-After</code> rules for proxies <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8029\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8029/hovercard\">#8029</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8218\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8218/hovercard\">#8218</a></li>\n<li>Add <code>data:</code> to CSP in subscription controller <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8253\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8253/hovercard\">#8253</a></li>\n<li>Improve anonymous authentication logic <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8165\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8165/hovercard\">#8165</a></li>\n<li>Enable GitHub <a href=\"https://github.blog/changelog/2025-10-28-immutable-releases-are-now-generally-available/\">release immutability</a> <a href=\"https://github.com/FreshRSS/FreshRSS/issues/8205\" data-hovercard-type=\"issue\" data-hovercard-url=\"/FreshRSS/FreshRSS/issues/8205/hovercard\">#8205</a></li>\n</ul>\n</li>\n<li>Bug fixing\n<ul>\n<li>Exclude local networks for domain-wide HTTP <code>Retry-After</code> <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8195\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8195/hovercard\">#8195</a></li>\n<li>Fix OpenID Connect with Debian 13 <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8032\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8032/hovercard\">#8032</a></li>\n<li>Fix MySQL / MariaDB bug wrongly sorting new articles <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8223\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8223/hovercard\">#8223</a></li>\n<li>Fix MySQL / MariaDB database size calculation <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8282\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8282/hovercard\">#8282</a></li>\n<li>Fix SQLite bind bug when adding tag <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8101\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8101/hovercard\">#8101</a></li>\n<li>Fix SQL auto-update of field <code>f.kind</code> to ease migrations from FreshRSS versions older than 1.20.0 <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8148\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8148/hovercard\">#8148</a></li>\n<li>Fix search encoding and quoting <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8311\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8311/hovercard\">#8311</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8324\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8324/hovercard\">#8324</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8338\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8338/hovercard\">#8338</a></li>\n<li>Fix handling of database unexpected null content (during migrations) <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8319\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8319/hovercard\">#8319</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8321\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8321/hovercard\">#8321</a></li>\n<li>Fix drag & drop of user query losing information <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8113\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8113/hovercard\">#8113</a></li>\n<li>Fix DOM error while filtering retrieved full content <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8132\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8132/hovercard\">#8132</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8161\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8161/hovercard\">#8161</a></li>\n<li>Fix <code>config.custom.php</code> during install <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8033\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8033/hovercard\">#8033</a></li>\n<li>Fix do not mark important feeds as read from category <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8067\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8067/hovercard\">#8067</a></li>\n<li>Fix regression of warnings in Web browser console due to lack of <code>window.bcrypt</code> object <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8166\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8166/hovercard\">#8166</a></li>\n<li>Fix chart resize regression due to <code>chart.js</code> v4 update <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8298\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8298/hovercard\">#8298</a></li>\n<li>Fix CLI user creation warning when language is not given <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8283\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8283/hovercard\">#8283</a></li>\n<li>Fix merging of custom HTTP headers <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8251\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8251/hovercard\">#8251</a></li>\n<li>Fix bug in the case of duplicated mark-as-read filters <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8322\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8322/hovercard\">#8322</a></li>\n</ul>\n</li>\n<li>SimplePie\n<ul>\n<li>Fix support of HTTP trailer headers <a href=\"https://github.com/FreshRSS/FreshRSS/pull/7983\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/7983/hovercard\">#7983</a>, <a href=\"https://github.com/simplepie/simplepie/pull/943\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/simplepie/simplepie/pull/943/hovercard\">simplepie#943</a></li>\n<li>Apply HTTPS policy also on GUIDs and permalinks <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8037\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8037/hovercard\">#8037</a>, <a href=\"https://github.com/simplepie/simplepie/pull/951\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/simplepie/simplepie/pull/951/hovercard\">simplepie#951</a>\n<ul>\n<li>Fix <code>WordPress.com</code> HTTP duplicates with WebSub <a href=\"https://github.com/Automattic/pushpress/pull/16\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/Automattic/pushpress/pull/16/hovercard\">Automattic/pushpress#16</a></li>\n</ul>\n</li>\n<li>Implement HTML whitelist for SimplePie sanitizer <a href=\"https://github.com/FreshRSS/FreshRSS/pull/7924\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/7924/hovercard\">#7924</a>, <a href=\"https://github.com/simplepie/simplepie/pull/947\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/simplepie/simplepie/pull/947/hovercard\">simplepie#947</a></li>\n<li>Various upstream contributions <a href=\"https://github.com/simplepie/simplepie/pull/940\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/simplepie/simplepie/pull/940/hovercard\">simplepie#940</a>, <a href=\"https://github.com/simplepie/simplepie/pull/944\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/simplepie/simplepie/pull/944/hovercard\">simplepie#944</a></li>\n</ul>\n</li>\n<li>Deployment\n<ul>\n<li>Docker default image updated to Debian 13 Trixie with PHP 8.4.11 and Apache 2.4.65 <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8032\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8032/hovercard\">#8032</a></li>\n<li>Docker alternative image updated to Alpine 3.23 with PHP 8.4.15 and Apache 2.4.65 <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8285\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8285/hovercard\">#8285</a></li>\n<li>Fix Docker healthcheck <code>cli/health.php</code> compatibility with OpenID Connect <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8040\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8040/hovercard\">#8040</a></li>\n<li>Improve Docker for compatibility with other base images such as Arch Linux <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8299\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8299/hovercard\">#8299</a>\n<ul>\n<li>Improve <code>cli/access-permissions.sh</code> to detect the correct permission Web group such as <code>www-data</code>, <code>apache</code>, or <code>http</code></li>\n</ul>\n</li>\n<li>Update PostgreSQL volume for Docker <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8216\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8216/hovercard\">#8216</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8224\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8224/hovercard\">#8224</a></li>\n<li>Catch lack of <code>exec()</code> function for git update <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8228\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8228/hovercard\">#8228</a></li>\n<li>Work around <code>DOMDocument::saveHTML()</code> scrambling charset encoding in some versions of libxml2 <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8296\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8296/hovercard\">#8296</a></li>\n<li>Improve configuration checks for PHP extensions (in Web UI and CLI), including recommending e.g. <code>php-intl</code> <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8334\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8334/hovercard\">#8334</a></li>\n</ul>\n</li>\n<li>UI\n<ul>\n<li>New button for toggling sidebar on desktop view <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8201\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8201/hovercard\">#8201</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8286\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8286/hovercard\">#8286</a></li>\n<li>Better transitions between groups of articles <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8174\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8174/hovercard\">#8174</a></li>\n<li>New links in transitions and jump to next transition <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8294\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8294/hovercard\">#8294</a></li>\n<li>More visible selected article <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8230\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8230/hovercard\">#8230</a></li>\n<li>Show the parsed search query instead of the original user input <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8293\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8293/hovercard\">#8293</a>,<br>\n<a href=\"https://github.com/FreshRSS/FreshRSS/pull/8306\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8306/hovercard\">#8306</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8341\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8341/hovercard\">#8341</a></li>\n<li>Show search query in the page title <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8217\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8217/hovercard\">#8217</a></li>\n<li>Scroll into filtered feed/category on page load in the sidebar <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8281\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8281/hovercard\">#8281</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8307\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8307/hovercard\">#8307</a></li>\n<li>Fix autocomplete issues in change password form <a href=\"https://github.com/FreshRSS/FreshRSS/pull/7812\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/7812/hovercard\">#7812</a></li>\n<li>Fix navigating between read feeds using shortcut <kbd>shift</kbd>+<kbd>j</kbd>/<kbd>k</kbd> <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8057\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8057/hovercard\">#8057</a></li>\n<li>Dark background in Web app manifest to avoid white flash when opening <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8140\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8140/hovercard\">#8140</a></li>\n<li>Increase button visibility in UI to change theme <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8149\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8149/hovercard\">#8149</a></li>\n<li>Replace arrow navigation in theme switcher with <code><select></code> <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8190\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8190/hovercard\">#8190</a></li>\n<li>Improve scroll of article after load of user labels <a href=\"https://github.com/FreshRSS/FreshRSS/pull/7962\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/7962/hovercard\">#7962</a></li>\n<li>Keep scroll state of page when closing the slider <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8295\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8295/hovercard\">#8295</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8301\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8301/hovercard\">#8301</a></li>\n<li>Scroll into filtered feed/category on page load <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8281\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8281/hovercard\">#8281</a></li>\n<li>Display sidebar dropdowns above if no space below <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8335\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8335/hovercard\">#8335</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8336\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8336/hovercard\">#8336</a></li>\n<li>Use native CSS instead of SCSS <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8200\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8200/hovercard\">#8200</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8241\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8241/hovercard\">#8241</a>\n<ul>\n<li>Using <a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Nesting\">CSS nesting</a> and <a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Colors/Using_relative_colors\">relative colours</a>.</li>\n</ul>\n</li>\n<li>Various UI and style improvements: <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8171\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8171/hovercard\">#8171</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8185\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8185/hovercard\">#8185</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8196\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8196/hovercard\">#8196</a></li>\n<li>JavaScript finalise migration from <code>Promise</code> to <code>async</code>/<code>await</code>: <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8182\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8182/hovercard\">#8182</a></li>\n</ul>\n</li>\n<li>API\n<ul>\n<li>API performance optimisation: streaming of large responses <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8041\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8041/hovercard\">#8041</a></li>\n<li>Fever API: Add <code>with_ids</code> parameter to mass-change read/unread/saved/unsaved on lists of articles <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8312\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8312/hovercard\">#8312</a></li>\n<li>Misc API: better REST error semantics <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8232\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8232/hovercard\">#8232</a></li>\n</ul>\n</li>\n<li>Extensions\n<ul>\n<li>Add support for extension priority <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8038\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8038/hovercard\">#8038</a></li>\n<li>Add support for extension compatibility <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8081\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8081/hovercard\">#8081</a></li>\n<li>Improve PHP code with hook enums <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8036\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8036/hovercard\">#8036</a></li>\n<li>New hook <code>nav_entries</code> <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8054\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8054/hovercard\">#8054</a></li>\n<li>Rename <a href=\"https://github.com/FreshRSS/Extensions\">Extensions</a> default branch from <em>master</em> to <em>main</em> <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8194\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8194/hovercard\">#8194</a></li>\n</ul>\n</li>\n<li>I18n\n<ul>\n<li>Translation status as text in README <a href=\"https://github.com/FreshRSS/FreshRSS/pull/7842\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/7842/hovercard\">#7842</a></li>\n<li>Add new translate CLI commands <code>move</code> <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8214\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8214/hovercard\">#8214</a></li>\n<li>Change some regional language codes to comply with RFC 5646 / IETF BCP 47 / ISO 3166 / ISO 639-1 <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8065\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8065/hovercard\">#8065</a></li>\n<li>Improve German <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8028\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8028/hovercard\">#8028</a></li>\n<li>Improve Greek <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8146\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8146/hovercard\">#8146</a></li>\n<li>Improve Finnish <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8073\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8073/hovercard\">#8073</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8092\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8092/hovercard\">#8092</a></li>\n<li>Improve Hungarian <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8244\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8244/hovercard\">#8244</a></li>\n<li>Improve Italian <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8115\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8115/hovercard\">#8115</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8186\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8186/hovercard\">#8186</a></li>\n<li>Improve Polish <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8134\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8134/hovercard\">#8134</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8135\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8135/hovercard\">#8135</a></li>\n<li>Improve Russian <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8155\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8155/hovercard\">#8155</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8197\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8197/hovercard\">#8197</a></li>\n<li>Improve Simplified Chinese <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8308\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8308/hovercard\">#8308</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8313\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8313/hovercard\">#8313</a></li>\n</ul>\n</li>\n<li>Misc.\n<ul>\n<li>Add code to modify a search expression <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8293\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8293/hovercard\">#8293</a></li>\n<li>Remove <em>Pocket</em> sharing service <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8127\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8127/hovercard\">#8127</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8128\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8128/hovercard\">#8128</a></li>\n<li>Update to PHPMailer 7.0.1 <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8048\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8048/hovercard\">#8048</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8180\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8180/hovercard\">#8180</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8272\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8272/hovercard\">#8272</a></li>\n<li>💥 Housekeeping of <code>lib_rss.php</code> with potential breaking changes for some extensions <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8193\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8193/hovercard\">#8193</a>,</li>\n<li>Use native PHP <code>#[Deprecated]</code> <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8325\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8325/hovercard\">#8325</a></li>\n<li>Improve PHP code <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8156\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8156/hovercard\">#8156</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8203\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8203/hovercard\">#8203</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8284\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8284/hovercard\">#8284</a>,<br>\n<a href=\"https://github.com/FreshRSS/FreshRSS/pull/8292\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8292/hovercard\">#8292</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8297\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8297/hovercard\">#8297</a></li>\n<li>GitHub Actions: <code>--no-progress</code> <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8315\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8315/hovercard\">#8315</a></li>\n<li>Update dev dependencies <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8043\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8043/hovercard\">#8043</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8044\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8044/hovercard\">#8044</a>,<br>\n<a href=\"https://github.com/FreshRSS/FreshRSS/pull/8045\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8045/hovercard\">#8045</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8046\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8046/hovercard\">#8046</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8047\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8047/hovercard\">#8047</a>,<br>\n<a href=\"https://github.com/FreshRSS/FreshRSS/pull/8052\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8052/hovercard\">#8052</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8176\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8176/hovercard\">#8176</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8177\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8177/hovercard\">#8177</a>,<br>\n<a href=\"https://github.com/FreshRSS/FreshRSS/pull/8178\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8178/hovercard\">#8178</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8179\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8179/hovercard\">#8179</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8210\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8210/hovercard\">#8210</a>,<br>\n<a href=\"https://github.com/FreshRSS/FreshRSS/pull/8270\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8270/hovercard\">#8270</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8271\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8271/hovercard\">#8271</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8273\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8273/hovercard\">#8273</a>,<br>\n<a href=\"https://github.com/FreshRSS/FreshRSS/pull/8274\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8274/hovercard\">#8274</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8275\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8275/hovercard\">#8275</a>, <a href=\"https://github.com/FreshRSS/FreshRSS/pull/8276\" data-hovercard-type=\"pull_request\" data-hovercard-url=\"/FreshRSS/FreshRSS/pull/8276/hovercard\">#8276</a></li>\n</ul>\n</li>\n</ul><figure class=\"enclosure\">\n\t<p class=\"enclosure-content\">\n\t\t<img class=\"enclosure-thumbnail\" src=\"https://avatars.githubusercontent.com/u/1008324?s=60&v=4\" alt=\"\" />\n\t</p>\n</figure>",
|
||
"raw_content": null,
|
||
"metadata": {
|
||
"upstream": "freshrss",
|
||
"origin": {
|
||
"streamId": "feed/1",
|
||
"htmlUrl": "https://github.com/FreshRSS/FreshRSS/",
|
||
"title": "FreshRSS releases"
|
||
},
|
||
"categories": [
|
||
"未分类",
|
||
"user/-/state/org.freshrss/main"
|
||
],
|
||
"crawled_at": "2026-03-24T09:13:04.078000Z",
|
||
"published_epoch": 1766604443
|
||
},
|
||
"fetch_state": "pending"
|
||
}
|
||
] |