[{"data":1,"prerenderedAt":104},["ShallowReactive",2],{"$fXezm6wI3WFNotWvAPcbXi7M9XBCIE2Y2soltzWNdQSU":3},{"success":4,"data":5,"pagination":99},true,[6,34,58,79],{"_id":7,"title":8,"slug":9,"contentType":10,"tags":11,"status":15,"seo":16,"viewCount":20,"likeCount":21,"readingTime":22,"defaultLanguage":23,"createdAt":24,"updatedAt":25,"excerpt":26,"coverImage":27,"publishedAt":28,"author":29,"availableLanguages":31},"6ab236b82e56af1fc98fd6c0","Cloudflare R2: the bill doesn't go away, it moves","cloudflare-r2-billing","html",[12,13,14],"Cloudflare","R2","Devops","published",{"metaTitle":17,"metaDescription":18,"metaKeywords":19},"Cloudflare R2 pricing: Class A and Class B","Why egress is free on R2, what Class A and Class B operations actually mean, and what it means that the bill moves from gigabytes to request counts.",[12,13,14],39,8,5,"tr","2026-09-22T08:05:12.717Z","2026-09-29T17:14:06.471Z","No egress fee, and that's true. But in Cloudflare's own example storage is zero, writes are zero, and the bill is $104. Where does it come from?","https://cdn.batuhanbas.dev/blog/covers/1790585010070-90315f89-18ca-425d-a3f5-c16534a6a8d6.webp","2026-09-28T08:48:08.583Z",{"name":30},"Batuhan Baş",[32,23,33],"en","ar",{"_id":35,"title":36,"slug":37,"contentType":10,"excerpt":38,"tags":39,"status":15,"seo":45,"viewCount":49,"likeCount":50,"readingTime":51,"defaultLanguage":23,"createdAt":52,"updatedAt":53,"coverImage":54,"publishedAt":55,"author":56,"availableLanguages":57},"6a94dd97cb83796db4dc881d","The framework war ended and nobody noticed","framework-war-is-over","No significant new frontend framework shipped in 2025. But the real change was never happening on the framework side anyway.",[40,41,42,43,44],"Frontend","CSS","JavaScript","Vite","Web Platform",{"metaTitle":46,"metaDescription":47,"metaKeywords":48},"Frontend 2026: the browser changed, not the framework","From State of JS 2025: Vite 8 and Rolldown, the Next.js satisfaction drop, CSS features reaching Baseline, and why CSS is resisting AI.",[40,41,42,43,44],84,50,6,"2026-08-31T01:49:11.227Z","2026-09-29T17:14:06.506Z","https://cdn.batuhanbas.dev/blog/covers/1788142749534-8464bbfb-0284-4c68-a90a-dfe26236470e.webp","2026-08-31T02:23:29.503Z",{"name":30},[32,23,33],{"_id":59,"title":60,"slug":61,"contentType":10,"excerpt":62,"tags":63,"status":15,"seo":68,"viewCount":72,"likeCount":73,"readingTime":51,"defaultLanguage":23,"createdAt":74,"updatedAt":75,"coverImage":76,"publishedAt":74,"author":77,"availableLanguages":78},"6a896a6cf2037887a38e21ec","Contributions have never been higher. That's the problem.","open-source-maintainer-crisis","Open source contributions hit records in 2025. In January 2026, four major projects narrowed their doors. Both are true, for the same reason.",[64,65,66,67],"Open Source","AI","Software Culture","curl",{"metaTitle":69,"metaDescription":70,"metaKeywords":71},"The open source maintainer crisis, explained","Why curl ended its bug bounty, what AI-generated contributions broke on the maintainer side, and why record contribution volume and closures happen together.",[64,65,66,67],104,16,"2026-08-22T09:22:52.568Z","2026-09-29T17:14:06.535Z","https://cdn.batuhanbas.dev/blog/covers/1787390837814-a7c5a567-dc28-4d4b-a89a-335db0e70085.webp",{"name":30},[32,23,33],{"_id":80,"title":81,"slug":82,"contentType":10,"excerpt":83,"tags":84,"status":15,"seo":87,"coverImage":91,"viewCount":92,"likeCount":93,"readingTime":22,"defaultLanguage":23,"createdAt":94,"updatedAt":95,"publishedAt":96,"author":97,"availableLanguages":98},"6a86af50d4d07b7fff86abd3","The Node.js inconsistency that sat open for four years","nodejs-timerify-inconsistency","timerify() skips the histogram when a function throws, but records it when an async one rejects. A confirmed bug that waited four years.",[85,86,64],"Node.js","Javascript",{"metaTitle":88,"metaDescription":89,"metaKeywords":90},"Node.js timerify() inconsistency explained","Why timerify() records rejected promises but not sync throws: Promise.finally vs then, the minimal thenable contract, and a four-year-old Node issue.",[85,86,64],"https://cdn.batuhanbas.dev/blog/covers/1787211312262-8079970a-061a-4ba2-be7c-648d674c126d.webp",156,11,"2026-08-20T07:40:00.768Z","2026-09-29T17:14:06.539Z","2026-08-20T07:40:00.769Z",{"name":30},[32,23,33],{"page":100,"limit":101,"total":102,"totalPages":100,"hasNext":103,"hasPrev":103},1,7,4,false,1790708003661]