[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"verticals":3,"blog-topics":44,"topics-all":165,"search-suggestions":245,"articles-all-3---":258,"articles-total":483},[4,20,32],{"id":5,"slug":6,"name":7,"tagline":8,"description":9,"accentFrom":10,"accentTo":11,"icon":12,"defaultLocale":13,"locales":14,"features":16,"position":19},"019fe637-3d33-714b-b57f-23e163ffca0c","dev","Web Development","Read it. Run it. Prove it.","A post a day on modern web development — most with an editable playground and a quiz that explains every answer. Free, no account needed.","violet-500","cyan-400","◇","en",[13,15],"fa",{"courses":17,"paths":17,"articles":17,"exams":18,"flashcards":18,"packages":17,"community":17,"certificates":17,"teams":17,"commerce":17},true,false,0,{"id":21,"slug":22,"name":23,"tagline":24,"description":25,"accentFrom":26,"accentTo":10,"icon":27,"defaultLocale":13,"locales":28,"features":30,"position":31},"019fe637-3dc2-754c-8657-0f175bfee7c6","lang","Languages","Learn a language the way you learn a codebase.","Grammar explained the way good documentation explains an API — one idea at a time, each with a quiz.","amber-400","⌘",[13,15,29],"es",{"courses":18,"paths":18,"articles":17,"exams":18,"flashcards":17,"packages":18,"community":17,"certificates":17,"teams":18,"commerce":18},2,{"id":33,"slug":34,"name":35,"tagline":36,"description":37,"accentFrom":38,"accentTo":39,"icon":40,"defaultLocale":13,"locales":41,"features":42,"position":43},"7b3c16f2-931d-410e-802e-e1fa4edab7de","soft","Soft Skills","The half of the job nobody wrote documentation for.","Weekly, on the parts of working life that decide more than your code does — first weeks, meetings, interviews, promotions, and the people around you. Written from what actually happens, and recorded as a podcast you can listen to on the walk.","emerald-400","teal-300","◉",[13],{"courses":18,"paths":18,"articles":17,"exams":18,"flashcards":18,"packages":18,"community":17,"certificates":18,"teams":18,"commerce":18},3,[45,50,54,58,62,66,70,74,78,82,85,89,92,95,98,102,105,108,111,114,117,120,123,126,129,132,135,138,141,144,147,150,153,156,159,162],{"slug":46,"name":47,"color":48,"articles":49},"webdev","Webdev",null,103,{"slug":51,"name":52,"color":48,"articles":53},"javascript","Javascript",87,{"slug":55,"name":56,"color":48,"articles":57},"frontend","Frontend",71,{"slug":59,"name":60,"color":48,"articles":61},"css","Css",34,{"slug":63,"name":64,"color":48,"articles":65},"tutorial","Tutorial",32,{"slug":67,"name":68,"color":48,"articles":69},"typescript","Typescript",15,{"slug":71,"name":72,"color":48,"articles":73},"react","React",13,{"slug":75,"name":76,"color":48,"articles":77},"performance","Performance",12,{"slug":79,"name":80,"color":48,"articles":81},"node","Node",9,{"slug":83,"name":84,"color":48,"articles":81},"browser","Browser",{"slug":86,"name":87,"color":48,"articles":88},"programming","Programming",6,{"slug":90,"name":91,"color":48,"articles":88},"html","Html",{"slug":93,"name":94,"color":48,"articles":88},"grammar","Grammar",{"slug":96,"name":97,"color":48,"articles":88},"accessibility","Accessibility",{"slug":99,"name":100,"color":48,"articles":101},"nestjs","Nestjs",4,{"slug":103,"name":104,"color":48,"articles":101},"apis","Apis",{"slug":106,"name":107,"color":48,"articles":43},"nuxt","Nuxt",{"slug":109,"name":110,"color":48,"articles":43},"ssr","SSR",{"slug":112,"name":113,"color":48,"articles":43},"nextjs","Nextjs",{"slug":115,"name":116,"color":48,"articles":43},"ai","Ai",{"slug":118,"name":119,"color":48,"articles":31},"security","Security",{"slug":121,"name":122,"color":48,"articles":31},"async","Async",{"slug":124,"name":125,"color":48,"articles":31},"forms","Forms",{"slug":127,"name":128,"color":48,"articles":31},"api","API",{"slug":130,"name":131,"color":48,"articles":31},"english","English",{"slug":133,"name":134,"color":48,"articles":31},"verbs","Verbs",{"slug":136,"name":137,"color":48,"articles":31},"spanish","Spanish",{"slug":139,"name":140,"color":48,"articles":31},"a1","A1",{"slug":142,"name":143,"color":48,"articles":31},"a2","A2",{"slug":145,"name":146,"color":48,"articles":31},"tenses","Tenses",{"slug":148,"name":149,"color":48,"articles":31},"turkish","Turkish",{"slug":151,"name":152,"color":48,"articles":31},"vue","Vue",{"slug":154,"name":155,"color":48,"articles":31},"career","Career",{"slug":157,"name":158,"color":48,"articles":31},"beginners","Beginners",{"slug":160,"name":161,"color":48,"articles":31},"productivity","Productivity",{"slug":163,"name":164,"color":48,"articles":31},"discuss","Discuss",[166,172,174,179,181,186,189,193,198,203,205,210,213,217,219,223,225,228,232,234,236,239,241,243],{"id":167,"slug":168,"name":169,"parentId":48,"description":170,"articleCount":171},"0da12d3c-ac33-4b32-859f-9a16877ef255","starting","Starting somewhere new","First days, first weeks, and the part where you do not know anything yet.",1,{"id":173,"slug":151,"name":152,"parentId":48,"description":48,"articleCount":31},"019fe637-3e06-75b8-8a2c-fc350aad7701",{"id":175,"slug":176,"name":177,"parentId":48,"description":178,"articleCount":171},"9ef7e6f6-b287-4ac2-8f56-421d3aafe8cc","meetings","Meetings and rooms","Speaking up, running one, and knowing which kind you are in.",{"id":180,"slug":106,"name":107,"parentId":48,"description":48,"articleCount":43},"019fe637-3e06-75b8-8a2d-0309c35755c6",{"id":182,"slug":183,"name":184,"parentId":48,"description":185,"articleCount":19},"540105e9-ba05-40f3-bdfd-16fb645e978c","interviews","Getting hired","Applications, interviews, offers, and the negotiation nobody rehearses.",{"id":187,"slug":67,"name":188,"parentId":48,"description":48,"articleCount":101},"019fe637-3e06-75b8-8a2d-040994c0d907","TypeScript",{"id":190,"slug":191,"name":192,"parentId":48,"description":48,"articleCount":19},"019fe637-3e06-75b8-8a2d-0956229cd176","architecture","Architecture",{"id":194,"slug":195,"name":196,"parentId":48,"description":197,"articleCount":19},"0cc5bdbb-d6e8-43b0-9cb4-d227aec6aa68","people","The people around you","Colleagues, managers, and the relationships that decide how work feels.",{"id":199,"slug":200,"name":201,"parentId":48,"description":202,"articleCount":19},"545c6bda-b8cf-4905-8056-18c0c4dc7a64","leading","Leading","Becoming the person others rely on, before and after the title.",{"id":204,"slug":75,"name":76,"parentId":48,"description":48,"articleCount":19},"019fe637-3e07-735d-8227-4c34039af2e0",{"id":206,"slug":207,"name":208,"parentId":48,"description":209,"articleCount":19},"cc22e84d-2cac-44ac-a272-5715e4710dc4","company","Company shapes","Why the same behaviour succeeds at five people and fails at five thousand.",{"id":211,"slug":115,"name":212,"parentId":48,"description":48,"articleCount":171},"019fe65f-98ec-773a-8ca8-9a2e971911c1","AI",{"id":214,"slug":59,"name":215,"parentId":48,"description":48,"articleCount":216},"019fe65f-c110-761b-931e-99a2d1280410","CSS",31,{"id":218,"slug":154,"name":155,"parentId":48,"description":48,"articleCount":19},"01a037b3-d685-76cb-9940-6a3f8ce140a0",{"id":220,"slug":221,"name":222,"parentId":48,"description":48,"articleCount":171},"019fe65f-a1cb-74c8-b999-ff353158fce9","designsystems","Design Systems",{"id":224,"slug":130,"name":131,"parentId":48,"description":48,"articleCount":31},"019ff280-9a51-757c-84ce-c941f20371e9",{"id":226,"slug":90,"name":227,"parentId":48,"description":48,"articleCount":31},"019ff19b-f37e-7091-b3cd-5c99e8c005a4","HTML",{"id":229,"slug":51,"name":230,"parentId":48,"description":48,"articleCount":231},"019fe65f-b950-7762-bb1a-d83445281950","JavaScript",52,{"id":233,"slug":99,"name":100,"parentId":48,"description":48,"articleCount":101},"01a03cdb-1ff8-76fa-9fa7-38d9e4eba1e1",{"id":235,"slug":112,"name":113,"parentId":48,"description":48,"articleCount":43},"01a0499d-b263-749a-a3ad-df3cc782e94d",{"id":237,"slug":71,"name":72,"parentId":48,"description":48,"articleCount":238},"019fe65f-b134-725b-bbc7-3e3db8c68675",5,{"id":240,"slug":118,"name":119,"parentId":48,"description":48,"articleCount":31},"019fe660-ce9d-754e-b241-7bccad915b86",{"id":242,"slug":136,"name":137,"parentId":48,"description":48,"articleCount":31},"019ff280-9d5a-77dc-b01d-e2378eaf86cb",{"id":244,"slug":148,"name":149,"parentId":48,"description":48,"articleCount":31},"019ff280-9eea-736d-ad13-4c01f0ddc46e",[246,247,248,249,250,251,252,253,254,255,256,257],{"slug":46,"name":47,"articles":49},{"slug":51,"name":52,"articles":53},{"slug":55,"name":56,"articles":57},{"slug":59,"name":60,"articles":61},{"slug":63,"name":64,"articles":65},{"slug":67,"name":68,"articles":69},{"slug":71,"name":72,"articles":73},{"slug":75,"name":76,"articles":77},{"slug":83,"name":84,"articles":81},{"slug":79,"name":80,"articles":81},{"slug":90,"name":91,"articles":88},{"slug":93,"name":94,"articles":88},{"items":259,"meta":480},[260,282,300,318,336,354,372,389,407,426,444,462],{"id":261,"slug":262,"title":263,"subtitle":48,"excerpt":264,"coverUrl":265,"locale":13,"readingMinutes":77,"publishedAt":266,"viewCount":267,"likeCount":19,"commentCount":19,"author":268,"vertical":273,"topic":274,"tags":275,"_count":280,"playground":281,"hasQuiz":17,"hasPlayground":17},"01a018ca-67d5-7020-bce5-9816c38a7a54","weekly-web-workers","Web Workers in JavaScript: The Complete Guide","Learn JavaScript Web Workers step by step: message passing, transferable objects, error handling, and a copy-paste cheat sheet for offloading work.","\u002Fmedia\u002Fcovers\u002Fweekly-web-workers.png","2026-09-07T12:03:05.323Z",328,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},"019fe637-3c25-7088-9034-39c9f15dc3c8","Parsa Jiravand","parsa","Frontend engineer · building bestpractic",{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":51,"name":230},[276,277,278,279],{"slug":51,"name":52,"color":48},{"slug":46,"name":47,"color":48},{"slug":63,"name":64,"color":48},{"slug":75,"name":76,"color":48},{"assessments":171},{"slug":262},{"id":283,"slug":284,"title":285,"subtitle":48,"excerpt":286,"coverUrl":287,"locale":13,"readingMinutes":101,"publishedAt":288,"viewCount":289,"likeCount":19,"commentCount":19,"author":290,"vertical":291,"topic":292,"tags":293,"_count":298,"playground":299,"hasQuiz":17,"hasPlayground":17},"01a061c4-985b-758b-86a4-21f6b2fd81f8","css-accent-color-native-form-control-tinting","One CSS Property Replaces Your Checkbox Hack","Recoloring a checkbox to match the brand usually means appearance: none, a hand-drawn checkmark, and a rebuilt focus ring. accent-color does the same job in one line — and knowing where it stops matters as much as knowing that it works.","\u002Fmedia\u002Fcovers\u002Fcss-accent-color-native-form-control-tinting.png","2026-09-07T12:02:34.132Z",259,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":59,"name":215},[294,295,296,297],{"slug":59,"name":60,"color":48},{"slug":46,"name":47,"color":48},{"slug":55,"name":56,"color":48},{"slug":96,"name":97,"color":48},{"assessments":171},{"slug":284},{"id":301,"slug":302,"title":303,"subtitle":48,"excerpt":304,"coverUrl":305,"locale":13,"readingMinutes":238,"publishedAt":306,"viewCount":307,"likeCount":19,"commentCount":19,"author":308,"vertical":309,"topic":310,"tags":311,"_count":316,"playground":317,"hasQuiz":17,"hasPlayground":17},"01a05cb5-e732-76ca-8865-14b97c64f2ba","screen-wake-lock-api-keep-screen-on","Your Recipe App Is Hiding a Silent Video","Cooking sites, workout timers, and boarding-pass pages used to autoplay an invisible, muted, looping video for one job only: stopping your phone from locking its screen. The Screen Wake Lock API replaces that hack with three lines of JavaScript — and it comes with one gotcha the docs bury.","\u002Fmedia\u002Fcovers\u002Fscreen-wake-lock-api-keep-screen-on.png","2026-09-06T10:37:22.891Z",223,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":51,"name":230},[312,313,314,315],{"slug":51,"name":52,"color":48},{"slug":46,"name":47,"color":48},{"slug":83,"name":84,"color":48},{"slug":103,"name":104,"color":48},{"assessments":171},{"slug":302},{"id":319,"slug":320,"title":321,"subtitle":48,"excerpt":322,"coverUrl":323,"locale":13,"readingMinutes":73,"publishedAt":324,"viewCount":325,"likeCount":19,"commentCount":19,"author":326,"vertical":327,"topic":328,"tags":329,"_count":334,"playground":335,"hasQuiz":17,"hasPlayground":17},"01a0632c-7248-73e3-9951-e8c6eaa578c7","react-weekly-compiler-memoization","React Compiler 1.0: What useMemo You Can Delete","React Compiler 1.0 is stable. Here's the re-render model it automates, which useMemo\u002FuseCallback\u002Fmemo calls you can delete, and what still needs you.","\u002Fmedia\u002Fcovers\u002Freact-weekly-compiler-memoization.png","2026-09-05T10:17:49.849Z",298,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":71,"name":72},[330,331,332,333],{"slug":71,"name":72,"color":48},{"slug":51,"name":52,"color":48},{"slug":63,"name":64,"color":48},{"slug":46,"name":47,"color":48},{"assessments":171},{"slug":320},{"id":337,"slug":338,"title":339,"subtitle":48,"excerpt":340,"coverUrl":341,"locale":13,"readingMinutes":101,"publishedAt":342,"viewCount":343,"likeCount":19,"commentCount":19,"author":344,"vertical":345,"topic":346,"tags":347,"_count":352,"playground":353,"hasQuiz":17,"hasPlayground":17},"01a057f2-68b2-7521-a373-0ea70eae6f55","page-visibility-api-tab-aware-timers","Your Timer Doesn't Know You Tabbed Away","window blur feels like the obvious way to detect an idle tab, and it's wrong in ways that only show up in production. The Page Visibility API answers the actual question — can anyone see this? — so polling, timers, and video stop wasting work the moment nobody's looking.","\u002Fmedia\u002Fcovers\u002Fpage-visibility-api-tab-aware-timers.png","2026-09-05T10:17:19.010Z",252,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":51,"name":230},[348,349,350,351],{"slug":51,"name":52,"color":48},{"slug":46,"name":47,"color":48},{"slug":83,"name":84,"color":48},{"slug":75,"name":76,"color":48},{"assessments":171},{"slug":338},{"id":355,"slug":356,"title":357,"subtitle":48,"excerpt":358,"coverUrl":359,"locale":13,"readingMinutes":238,"publishedAt":360,"viewCount":361,"likeCount":19,"commentCount":19,"author":362,"vertical":363,"topic":364,"tags":365,"_count":370,"playground":371,"hasQuiz":17,"hasPlayground":17},"01a04d81-723b-725d-9e99-7e11d03aa56a","clipboard-writetext-focus-bug","The await That Silently Breaks navigator.clipboard.writeText()","navigator.clipboard.writeText() only works while the document is focused and the user gesture is still fresh. Any await before the call can let both expire, so a copy button fails with an uncaught NotAllowedError and nobody ever sees why.","\u002Fmedia\u002Fcovers\u002Fclipboard-writetext-focus-bug.png","2026-09-03T17:23:32.218Z",312,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":51,"name":230},[366,367,368,369],{"slug":46,"name":47,"color":48},{"slug":51,"name":52,"color":48},{"slug":83,"name":84,"color":48},{"slug":55,"name":56,"color":48},{"assessments":171},{"slug":356},{"id":373,"slug":374,"title":375,"subtitle":48,"excerpt":376,"coverUrl":377,"locale":13,"readingMinutes":81,"publishedAt":378,"viewCount":379,"likeCount":19,"commentCount":19,"author":380,"vertical":381,"topic":382,"tags":383,"_count":388,"playground":48,"hasQuiz":18,"hasPlayground":18},"01a05274-fd83-71ed-9890-3cc8c1004104","speaking-up-in-meetings","You're not quiet in meetings, you're editing","The reason you don't speak up isn't confidence. Everyone else is thinking out loud while you wait for your thought to be finished — and a good point at minute thirty is worth less than a rough one at minute twelve. Here's how to land it on time.","\u002Fmedia\u002Fcovers\u002Fspeaking-up-in-meetings.png","2026-09-02T10:58:23.112Z",145,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":34,"name":35,"accentFrom":38,"accentTo":39},{"slug":176,"name":177},[384,385,386,387],{"slug":154,"name":155,"color":48},{"slug":163,"name":164,"color":48},{"slug":160,"name":161,"color":48},{"slug":157,"name":158,"color":48},{"assessments":19},{"id":390,"slug":391,"title":392,"subtitle":48,"excerpt":393,"coverUrl":394,"locale":13,"readingMinutes":238,"publishedAt":395,"viewCount":396,"likeCount":19,"commentCount":19,"author":397,"vertical":398,"topic":399,"tags":400,"_count":405,"playground":406,"hasQuiz":17,"hasPlayground":17},"01a0499d-bb9f-709b-9e8a-9c426ae95530","declarative-shadow-dom-ssr-web-components","Shadow DOM Needed JavaScript to Exist. Now It Doesn't.","attachShadow() is a JavaScript-only API with no HTML serialization, so a server-rendered web component ships an empty host element until the client hydrates it. Declarative Shadow DOM attaches the real shadow root during HTML parsing — zero JS required.","\u002Fmedia\u002Fcovers\u002Fdeclarative-shadow-dom-ssr-web-components.png","2026-09-02T10:57:52.645Z",274,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":51,"name":230},[401,402,403,404],{"slug":46,"name":47,"color":48},{"slug":51,"name":52,"color":48},{"slug":90,"name":91,"color":48},{"slug":55,"name":56,"color":48},{"assessments":171},{"slug":391},{"id":408,"slug":409,"title":410,"subtitle":48,"excerpt":411,"coverUrl":412,"locale":13,"readingMinutes":413,"publishedAt":414,"viewCount":415,"likeCount":19,"commentCount":19,"author":416,"vertical":417,"topic":418,"tags":419,"_count":424,"playground":425,"hasQuiz":17,"hasPlayground":17},"01a0499d-b520-778f-8286-8221ec03b8b5","nextjs-weekly-cache-components-explained","Next.js Cache Components Explained (with Cheat Sheet)","How Next.js Cache Components decide what's static, what's cached, and what streams — the use cache directive, cacheLife, and Suspense explained.","\u002Fmedia\u002Fcovers\u002Fnextjs-weekly-cache-components-explained.png",14,"2026-09-01T11:24:15.087Z",334,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":112,"name":113},[420,421,422,423],{"slug":112,"name":113,"color":48},{"slug":71,"name":72,"color":48},{"slug":46,"name":47,"color":48},{"slug":63,"name":64,"color":48},{"assessments":171},{"slug":409},{"id":427,"slug":428,"title":429,"subtitle":48,"excerpt":430,"coverUrl":431,"locale":13,"readingMinutes":238,"publishedAt":432,"viewCount":433,"likeCount":19,"commentCount":19,"author":434,"vertical":435,"topic":436,"tags":437,"_count":442,"playground":443,"hasQuiz":17,"hasPlayground":17},"01a04446-4fc4-73e1-b763-eda8c9cf631f","navigation-api-intercept-navigation","Your Router Doesn't Intercept Navigation. It Reacts To It.","Double-click a link during a slow route change and most SPA routers render two pages and settle on the wrong one — because they're listening for navigation after it already happened. The Navigation API lets you stop it before it starts.","\u002Fmedia\u002Fcovers\u002Fnavigation-api-intercept-navigation.png","2026-09-01T11:23:43.875Z",237,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":51,"name":230},[438,439,440,441],{"slug":51,"name":52,"color":48},{"slug":46,"name":47,"color":48},{"slug":83,"name":84,"color":48},{"slug":55,"name":56,"color":48},{"assessments":171},{"slug":428},{"id":445,"slug":446,"title":447,"subtitle":48,"excerpt":448,"coverUrl":449,"locale":13,"readingMinutes":413,"publishedAt":450,"viewCount":451,"likeCount":19,"commentCount":19,"author":452,"vertical":453,"topic":454,"tags":455,"_count":460,"playground":461,"hasQuiz":17,"hasPlayground":17},"019ff73a-fb5b-73ce-b725-2912167a7dde","weekly-debounce-and-throttle","Debounce and Throttle in JavaScript: The Complete Guide","Learn debounce and throttle in JavaScript step by step, with worked examples, edge cases, and a copy-paste cheat sheet for search, scroll, and resize.","\u002Fmedia\u002Fcovers\u002Fweekly-debounce-and-throttle.png","2026-08-31T13:12:14.139Z",325,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":51,"name":230},[456,457,458,459],{"slug":51,"name":52,"color":48},{"slug":46,"name":47,"color":48},{"slug":63,"name":64,"color":48},{"slug":75,"name":76,"color":48},{"assessments":171},{"slug":446},{"id":463,"slug":464,"title":465,"subtitle":48,"excerpt":466,"coverUrl":467,"locale":13,"readingMinutes":88,"publishedAt":468,"viewCount":469,"likeCount":19,"commentCount":19,"author":470,"vertical":471,"topic":472,"tags":473,"_count":478,"playground":479,"hasQuiz":17,"hasPlayground":17},"01a03cdb-3743-73ef-ab9d-21f03158ca35","server-sent-events-eventsource-live-updates","You Don't Need a WebSocket for That Live Feed","A live notification badge, a progress bar, a dashboard counter — you reached for socket.io and started hand-rolling reconnect logic. The browser already ships a simpler API that does it for you.","\u002Fmedia\u002Fcovers\u002Fserver-sent-events-eventsource-live-updates.png","2026-08-31T13:11:42.385Z",265,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":51,"name":230},[474,475,476,477],{"slug":51,"name":52,"color":48},{"slug":46,"name":47,"color":48},{"slug":63,"name":64,"color":48},{"slug":103,"name":104,"color":48},{"assessments":171},{"slug":464},{"page":43,"perPage":77,"total":481,"totalPages":482},119,10,{"items":484,"meta":503},[485],{"id":486,"slug":487,"title":488,"subtitle":48,"excerpt":489,"coverUrl":490,"locale":13,"readingMinutes":413,"publishedAt":491,"viewCount":492,"likeCount":19,"commentCount":19,"author":493,"vertical":494,"topic":495,"tags":496,"_count":501,"playground":502,"hasQuiz":17,"hasPlayground":17},"01a0ab57-dda2-74dd-816b-a0ef7f77aeb3","react-weekly-derived-state-bug","React Derived State: Why That useState Is Probably a Bug","React derived state explained: why syncing a computed value into useState with an Effect causes extra renders and drift, and what to write instead.","\u002Fmedia\u002Fcovers\u002Freact-weekly-derived-state-bug.png","2026-09-20T16:27:07.271Z",120,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":71,"name":72},[497,498,499,500],{"slug":71,"name":72,"color":48},{"slug":51,"name":52,"color":48},{"slug":63,"name":64,"color":48},{"slug":46,"name":47,"color":48},{"assessments":171},{"slug":487},{"page":171,"perPage":171,"total":481,"totalPages":481}]