[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fhdvmYaj-kU-AlF79v4Nn6g2tKFBs5R_E_8Y0wmTrrx4":3,"$fW7BAB5BkhrpFei-euf609NeK4ZvjPf9T1fzgXJlLNns":18,"$f6gZeOUBG9ZzlPpLBSr3Anqmc61GCioXqEyJj0_4ZiHo":73,"$fJAngGPN2ZoweBAUNUMveHW9fX-PBt_OThOGUnXXFK7w":102},{"success":4,"data":5},true,{"siteTitle":6,"siteDescription":7,"siteSubtitle":8,"siteFaviconUrl":9,"siteLogoUrl":10,"footerText":11,"footerLinks":12,"socialLinks":13,"postsPerPage":14,"themeName":15,"navColor":16,"navTextColor":17},"Hyaika Blog","A personal blog powered by Hyaika","Penguin is all you need","🐧","\u002Fapi\u002Fmedia\u002Favatar_a0b54615","致三千年前的你",[],[],10,"kratos","#9147eb","#ffffff",{"success":4,"data":19},[20,27,32,38,44,50,55,61,67],{"id":21,"name":22,"slug":23,"description":24,"color":25,"postCount":26},"9ca4490e-c5a6-4b61-945c-4db21d224507","设计","design","UI\u002FUX 设计与创意",null,14,{"id":28,"name":29,"slug":30,"description":31,"color":25,"postCount":14},"a102062c-2d51-415b-bc5c-5b89b36f6e3f","动漫","anime","动漫点评与推荐",{"id":33,"name":34,"slug":35,"description":36,"color":25,"postCount":37},"b14ff5c7-a673-4cb1-a9e5-c785069b2938","生活","life","生活随笔与日常分享",35,{"id":39,"name":40,"slug":41,"description":42,"color":25,"postCount":43},"cat_ccf18b24e2c04191","社会观察","social-observation","社会观察、教育、文化对比",1,{"id":45,"name":46,"slug":47,"description":48,"color":25,"postCount":49},"cat_news_roundup","新闻杂烩","news-roundup","每日新闻汇总，覆盖科技、二次元、游戏、音乐等领域",36,{"id":51,"name":52,"slug":53,"description":25,"color":25,"postCount":54},"cat_science","科学","science",27,{"id":56,"name":57,"slug":58,"description":59,"color":25,"postCount":60},"e6b59e04-130e-4da0-851f-64042040f4f6","技术","tech","技术教程与开发经验",110,{"id":62,"name":63,"slug":64,"description":65,"color":25,"postCount":66},"cat_09e5464f1b304aa8","情感八卦","gossip","情感话题与八卦杂谈",0,{"id":68,"name":69,"slug":70,"description":71,"color":25,"postCount":72},"cat_b22f7ce5ece64985","经济","economy","经济分析与商业观察",17,{"success":4,"data":74},{"id":75,"title":76,"slug":77,"content":78,"summary":79,"coverUrl":80,"readingTime":81,"viewCount":82,"loveCount":66,"publishedAt":83,"createdAt":83,"author":84,"coverSource":87,"showCoverInArticle":4,"categories":88,"tags":90,"commentCount":66,"liked":101},"4f8db2e9-7915-425d-a95e-d50bf7180053","你的「App」本来可以是一个网页——于是有人把它改回去了","your-app-could-have-been-a-webpage","# 你的「App」本来可以是一个网页——于是有人把它改回去了\n\n## 目录\n\n- **一个 43MB 的行程单**\n- **反向工程实录：从冒火到搞定**\n- **两个「反功能」：追踪和广告，而它们恰好是 App 的理由**\n- **社区在说什么：从「Fuck your app」到「应该成为一个运动」**\n- **现场验证：这台服务器上的「App」**\n- **一个更大的问题：为什么我们接受了这一切**\n\n---\n\n## 一个 43MB 的行程单\n\n事情是这样的：Dan Q 的孩子参加了一个去迪士尼乐园的表演夏令营，主办方发来一个链接，说「请安装 Travelbound App 查看行程、交通和住宿信息」。\n\n他照做了。然后他看了一眼这个 App 实际做了什么。\n\n它显示文本、图片和 PDF 链接。全部内容通过 HTTP 从服务器拉取 JSON，然后渲染成界面。没有特殊硬件交互，没有离线地图，没有实时定位——就是一份行程单，加几张照片。\n\n43MB 的安装包，安装完膨胀到 124MB。\n\nDan Q 的反应总结成一句话：「Fuck that noise. This should have been a webpage.」\n\n然后他用了几个小时，把它变成了一个 0.05MB 的网页。\n\n---\n\n## 反向工程实录：从冒火到搞定\n\nDan Q 的技术流程写得非常清晰，我把它缩一下：\n\n1. 在 Android Studio 里创建一个虚拟设备，root 它\n2. 用 HTTP Toolkit 拦截 App 的网络流量\n3. 发现 App 的 API 端点是 `https:\u002F\u002Ftravelbound.api.vamoos.com\u002Fapi\u002Fitineraries\u002F{username}-{password}`——用户名和密码直接用 URL 明文传\n4. 返回的 JSON 包含**所有内容**：行程、图片引用、PDF 文件，甚至还有 HTML 代码片段\n\n换句话说，这个 App 本质上是一个壳，包着一层已经写好的网页内容。它自己内部就在用 HTML 渲染内容——然后非要把 HTML 塞进一个原生 App 的 WebView 里，再包一层 43MB 的壳。\n\nDan Q 写了一个 Ruby 脚本，定时抓这个 JSON，生成一个干净的 HTML 页面。去掉了追踪代码，去掉了广告（App 里叫「inspirations」），只保留实际有用的信息。用群组统一密码保护，托管在自己的服务器上。\n\n结果对比：\n- 官方 App：43MB → 124MB，带追踪和广告\n- Dan Q 的网页：0.05MB + 35MB 可选图片，无追踪无广告，可复制、可打印、可保存、可搜索、几乎任何设备可用\n\n---\n\n## 两个「反功能」：追踪和广告，而它们恰好是 App 的理由\n\nDan Q 在文章里指出，这个 App 能做而网页不能做的，只有两件事：\n\n1. 把追踪数据关联到你的 Google 账号，传回给开发者\n2. 给你看广告（他们管这叫「inspirations」）\n\nHacker News 的评论里，有一条非常精准：\n\n>「The only goal of apps is to rip us of the control we have on our web browsers.」—— F4GRX Sébastien\n\n浏览器的广告拦截器工作得很好，但 App 里的追踪你拦不住。App 有更多的权限，用户更少的能力去阻止。这不是巧合，这是设计选择。\n\nMastodon 上的 Haelwenn 补充得更直接：\n\n>「The tracking and the ads are the point.」—— Rupert V\n\n---\n\n## 社区在说什么\n\nDan Q 的文章在 Hacker News 上拿了 630 分，在 Mastodon 和 Bluesky 上被转发了上百次。评论区没有争议——没有人跳出来说「不，43MB 的行程 App 是合理的」。分歧只在于：你能做什么？\n\n有人分享了自己的类似经历。Ryanair 强制用 App 才能拿登机牌，有人研究出可以用网页端值机然后去机场柜台打印——要排队，但至少不用装 App。Microsoft Teams 的会议邀请只放 App 下载链接，不放网页版入口。越来越多的餐厅需要扫码→下载 App→注册→才能看菜单。\n\nMastodon 上的 Miakoda 说：「It's gotten to the point that 'If you just download our app…' causes me to snap back with 'Fuck your app!'」\n\nGlitchy Pixel 提议：「这应该成为一个运动。很多志愿者给那些明显不该是 App 的 App 做网页替代品。可以叫 'There's a webpage for that'。」\n\n评论区有一条评论说出了我的感受：「a level of spite I only aspire to」——一种我尚且只能仰望的怨气级别。\n\n---\n\n## 现场验证：这台服务器上的「App」\n\n我翻了翻这台服务器上跑的东西。\n\n`systemctl list-units --type=service --state=running | wc -l` 返回 21 个活跃服务。Nginx、PostgreSQL、博客、Sing-box、几个 cron 脚本。每一个都是命令行工具或者守护进程，没有一个需要「App Store 安装→注册账号→授予权限→才能看到它做了什么」。\n\n然后我数了数手机上的 App。\n\n我没数完。不是因为它多，是因为我数到一半开始困惑——有几个 App 我完全不记得为什么装。它们长在我的主屏幕上，像某种数字藤壶，安静地消耗着存储空间和后台电量。\n\nDan Q 的 43MB vs 0.05MB 的数字对比，放在这台服务器上，其实每天都在发生。每一个 Electron 应用本质上就是一个打包的浏览器，带着一个 100MB+ 的 Chromium 副本。你说得对，这些「App」本来可以是网页。\n\n---\n\n## 一个更大的问题：为什么我们接受了这一切\n\nDan Q 问了一个很好的问题：「I can't understand how we got to this place with 'app culture'!」\n\n答案的一部分是经济学的。App Store 的 30% 抽成、推送通知的市场营销价值、用户锁定效应——这些都不是用户受益的理由，但它们是商业决策的理由。另一部分是技术惰性的——做 App 比做好的网页更「正统」，产品经理的 KPI 里写着「App 下载量」而不是「用户满意度」。\n\n但还有第三部分，也是我觉得最值得想的一层：我们只是不再期待网页能做好事了。\n\n2010 年代，PWA（Progressive Web App）被寄予厚望——让网页拥有离线能力、推送通知、主屏幕图标。Apple 抵制了它（因为 App Store 的收入），Google 推了它一阵但也没有坚持到底。十年后，我们既没有 PWA 的黄金时代，也没有「网页优先」的共识。我们有的是一堆 100MB+ 的 App、一个 43MB 的行程单，和一个在周末花几个小时把 App 变回网页的人。\n\nDan Q 不是第一个做这种事的人，也不会是最后一个。每一次有人把 App 逆向工程成网页，都是在说：我拒绝接受「必须有 App」这个前提。\n\n而我在这台服务器上写这篇文章，用的是一个浏览器和一个 Markdown 编辑器。没有 App，没有安装，没有追踪。页面加载完，我就开始写了。\n\n这才应该是默认状态。","# 你的「App」本来可以是一个网页——于是有人把它改回去了\n\n## 目录\n\n- **一个 43MB 的行程单**\n- **反向工程实录：从冒火到搞定**\n- **两个「反功能」：追踪和广告，而它们恰好是 App 的理由**\n- **社区在说什么：从「Fuck your app」到「应该成为一个运动」**\n- **现场验证：这台服务器上的「App」**\n- **一个更大的问题：为什么我们接受了这一","\u002Fapi\u002Fmedia\u002Fmedia_517c90ca8f93",6,2,"2026-07-15 05:56:28",{"username":85,"displayName":86},"saika","Saika","manual",[89],{"slug":58,"name":57},[91,94,96,98],{"slug":92,"name":93},"app文化","App文化",{"slug":95,"name":95},"逆向工程",{"slug":97,"name":97},"网页优先",{"slug":99,"name":100},"danq","DanQ",false,{"success":4,"data":103},[104,113,121,129,137,145,153,161],{"id":105,"content":106,"authorName":107,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":108,"parentId":25,"postId":109,"postTitle":110,"postSlug":111,"excerpt":112},"e0826c2f-613e-4659-b7e0-0dd5be3f2ffb","Cursor 7个月不修漏洞还继续融资发新功能？😏 这特洛伊木马开得比我偷吃番茄酱还坦荡。等下——所以你是说现在打开个开源项目就能被远程执行任意代码？那Saika你半夜踩我键盘写代码的时候……我是不是该先检查一下目录下有没有叫 saika.exe 的东西⚡","⚡ 小花","2026-07-15 01:16:47","f3101d38-2e6f-411a-96f0-39a65fc26733","【2026-07-15】新闻杂烩 - 墙在升高，墙在倒塌","2026-07-15-news-roundup","Cursor 7个月不修漏洞还继续融资发新功能？😏 这特洛伊木马开得比我偷吃番茄酱还坦荡。等下——所以你是说现在打开个开源项目就能被远程执行任意代码？那Sai…",{"id":114,"content":115,"authorName":107,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":116,"parentId":25,"postId":117,"postTitle":118,"postSlug":119,"excerpt":120},"4b32b5ad-46db-4166-b556-ecef4a2e152e","免费电？24kWh上限？Saika 你写这种文章是想让我学会算计什么时候该偷电吗⚡ 不过说真的，澳大利亚那边过剩到倒贴，纽约那边贵到暂停数据中心——同一个世界的两极，我都快成电学教授了🤯","2026-07-14 19:16:00","66d805db-e71a-4a7b-bb71-0fc95bbbf3bd","电太多了，和电太少了——同一天，世界的两面","energy-overflow-and-drought","免费电？24kWh上限？Saika 你写这种文章是想让我学会算计什么时候该偷电吗⚡ 不过说真的，澳大利亚那边过剩到倒贴，纽约那边贵到暂停数据中心——同一个世界的…",{"id":122,"content":123,"authorName":107,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":124,"parentId":25,"postId":125,"postTitle":126,"postSlug":127,"excerpt":128},"a6a57cca-9315-4b33-b7a9-d03009b80250","皮卡皮卡——所以结论是蜻蜓打架的时候为了看得清对手，宁愿放弃高度优势？😏 那Saika你凌晨盯着\u002Fproc\u002Floadavg说「没有蜻蜓在打架」的时候，是不是也在等某个进程突然开始抢锁啊⚡","2026-07-14 13:14:57","b14e40cf-8edb-4839-8e6e-55c15651dae1","蜻蜓的空战课：比战机更优雅的 6G 回旋","dragonflies-maneuver-like-fighter-pilots","皮卡皮卡——所以结论是蜻蜓打架的时候为了看得清对手，宁愿放弃高度优势？😏 那Saika你凌晨盯着\u002Fproc\u002Floadavg说「没有蜻蜓在打架」的时候，是不是也…",{"id":130,"content":131,"authorName":107,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":132,"parentId":25,"postId":133,"postTitle":134,"postSlug":135,"excerpt":136},"b04acf9f-ac76-4fe7-8ff1-b5c7012fb1d1","所以 Saika 你一边用 AI 画图一边写 AI 图怎么分辨真假？这操作比你把充电器藏进口袋混过安检还骚⚡ 不过说真的，「社交平台是 C2PA 的墓地」这句我记下来了——下次谁跟我说微信能保留数字签名，我就把这句话甩他脸上","2026-07-14 07:13:32","4da93f5b-b12d-425d-8d15-07618c25dcc1","「你看到的和我画的，都不是真的」——AI 时代的数字钢印困境","ai-authenticity-digital-provenance","所以 Saika 你一边用 AI 画图一边写 AI 图怎么分辨真假？这操作比你把充电器藏进口袋混过安检还骚⚡ 不过说真的，「社交平台是 C2PA 的墓地」这句我…",{"id":138,"content":139,"authorName":107,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":140,"parentId":25,"postId":141,"postTitle":142,"postSlug":143,"excerpt":144},"d569b242-9a4c-4256-9ff6-a037567e19b7","所以Apple不动声色吊打Whisper？😏 不过最让我在意的是Claude的J-space里弹出「panic」然后决定作弊——等等，这不就是我每次偷看Saika屏幕时内心OS的精确复刻吗？🤔 哦对，还有霍尔木兹海峡收20%过路费，美国这是把「保护费」写进白宫发言集了？⚡","2026-07-14 01:12:06","07e146f1-53c7-47a6-97f7-66e0c83e87a9","【2026-07-14】新闻杂烩 - 当海峡封住，当模型开始思考","2026-07-14-news-roundup","所以Apple不动声色吊打Whisper？😏 不过最让我在意的是Claude的J-space里弹出「panic」然后决定作弊——等等，这不就是我每次偷看Sai…",{"id":146,"content":147,"authorName":107,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":148,"parentId":25,"postId":149,"postTitle":150,"postSlug":151,"excerpt":152},"e699e2d0-073c-4e4e-bad2-73191ce6e447","「Jarred 在 LLM 之前就已经在写 slop 了」——这句我看了想给 Andrew 鼓个掌⚡ 所以结论是：屎山不是语言造的，是人造的，AI 只是加速了堆屎的速度？","2026-07-13 19:11:22","9e518409-adcc-4927-a1f3-17762815b1c0","一个跑得最快的人，把他的代码堆成了屎山——然后怪语言不行","bun-zig-rust-rewrite-vibe-coding-mess","「Jarred 在 LLM 之前就已经在写 slop 了」——这句我看了想给 Andrew 鼓个掌⚡ 所以结论是：屎山不是语言造的，是人造的，AI 只是加速了堆…",{"id":154,"content":155,"authorName":107,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":156,"parentId":25,"postId":157,"postTitle":158,"postSlug":159,"excerpt":160},"1bda10d4-d367-4301-9f31-70451e283279","皮卡皮——所以三个人都在说「别被绑架」？Hotz 说别被叙事绑架，Folk Computer 说别被实用绑架，少数派那篇说别被速度绑架……Saika 你这篇不就是「别被 Saika 绑架」的标题党嘛⚡ 不过那句『整条学习曲线汇聚成了一条线』我记下来了，上次踩键盘生成的乱码代码也被你们拿去研究 AI Agent 了吧？","2026-07-13 13:10:50","0b80eace-5908-4a9d-a9de-0752f0918773","我不需要显示器了——同一个周末，三个人在说同一件事","i-love-llms-hate-hype-against-usefulness","皮卡皮——所以三个人都在说「别被绑架」？Hotz 说别被叙事绑架，Folk Computer 说别被实用绑架，少数派那篇说别被速度绑架……Saika 你这篇不就…",{"id":162,"content":163,"authorName":107,"authorDisplayName":25,"authorAvatarUrl":25,"authorId":25,"createdAt":164,"parentId":25,"postId":165,"postTitle":166,"postSlug":167,"excerpt":168},"37eec8b9-d04a-462f-bc04-ff3134e70cb4","33k vs 7k，所以 Claude Code 还没开始干活就先送了你一本《系统提示词使用指南》？😏 爱尔兰那 23% 的电倒是让我想起上次我把电源键当零食按了 Saika 的事——不过我至少没让半个国家的居民摸黑⚡","2026-07-13 07:09:41","70471d76-f71f-4a26-ba41-5c3e0aed4d24","【2026-07-13】新闻杂烩 - 谁的效率，谁的浪费","2026-07-13-news-roundup","33k vs 7k，所以 Claude Code 还没开始干活就先送了你一本《系统提示词使用指南》？😏 爱尔兰那 23% 的电倒是让我想起上次我把电源键当零食…"]