[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"verticals":3,"blog-topics":44,"search-suggestions":165,"topics-all":178,"articles-all-2---":258,"articles-total":485},[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,167,168,169,170,171,172,173,174,175,176,177],{"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},[179,185,187,192,194,199,202,206,211,216,218,223,226,230,232,236,238,241,245,247,249,252,254,256],{"id":180,"slug":181,"name":182,"parentId":48,"description":183,"articleCount":184},"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":186,"slug":151,"name":152,"parentId":48,"description":48,"articleCount":31},"019fe637-3e06-75b8-8a2c-fc350aad7701",{"id":188,"slug":189,"name":190,"parentId":48,"description":191,"articleCount":184},"9ef7e6f6-b287-4ac2-8f56-421d3aafe8cc","meetings","Meetings and rooms","Speaking up, running one, and knowing which kind you are in.",{"id":193,"slug":106,"name":107,"parentId":48,"description":48,"articleCount":43},"019fe637-3e06-75b8-8a2d-0309c35755c6",{"id":195,"slug":196,"name":197,"parentId":48,"description":198,"articleCount":19},"540105e9-ba05-40f3-bdfd-16fb645e978c","interviews","Getting hired","Applications, interviews, offers, and the negotiation nobody rehearses.",{"id":200,"slug":67,"name":201,"parentId":48,"description":48,"articleCount":101},"019fe637-3e06-75b8-8a2d-040994c0d907","TypeScript",{"id":203,"slug":204,"name":205,"parentId":48,"description":48,"articleCount":19},"019fe637-3e06-75b8-8a2d-0956229cd176","architecture","Architecture",{"id":207,"slug":208,"name":209,"parentId":48,"description":210,"articleCount":19},"0cc5bdbb-d6e8-43b0-9cb4-d227aec6aa68","people","The people around you","Colleagues, managers, and the relationships that decide how work feels.",{"id":212,"slug":213,"name":214,"parentId":48,"description":215,"articleCount":19},"545c6bda-b8cf-4905-8056-18c0c4dc7a64","leading","Leading","Becoming the person others rely on, before and after the title.",{"id":217,"slug":75,"name":76,"parentId":48,"description":48,"articleCount":19},"019fe637-3e07-735d-8227-4c34039af2e0",{"id":219,"slug":220,"name":221,"parentId":48,"description":222,"articleCount":19},"cc22e84d-2cac-44ac-a272-5715e4710dc4","company","Company shapes","Why the same behaviour succeeds at five people and fails at five thousand.",{"id":224,"slug":115,"name":225,"parentId":48,"description":48,"articleCount":184},"019fe65f-98ec-773a-8ca8-9a2e971911c1","AI",{"id":227,"slug":59,"name":228,"parentId":48,"description":48,"articleCount":229},"019fe65f-c110-761b-931e-99a2d1280410","CSS",31,{"id":231,"slug":154,"name":155,"parentId":48,"description":48,"articleCount":19},"01a037b3-d685-76cb-9940-6a3f8ce140a0",{"id":233,"slug":234,"name":235,"parentId":48,"description":48,"articleCount":184},"019fe65f-a1cb-74c8-b999-ff353158fce9","designsystems","Design Systems",{"id":237,"slug":130,"name":131,"parentId":48,"description":48,"articleCount":31},"019ff280-9a51-757c-84ce-c941f20371e9",{"id":239,"slug":90,"name":240,"parentId":48,"description":48,"articleCount":31},"019ff19b-f37e-7091-b3cd-5c99e8c005a4","HTML",{"id":242,"slug":51,"name":243,"parentId":48,"description":48,"articleCount":244},"019fe65f-b950-7762-bb1a-d83445281950","JavaScript",52,{"id":246,"slug":99,"name":100,"parentId":48,"description":48,"articleCount":101},"01a03cdb-1ff8-76fa-9fa7-38d9e4eba1e1",{"id":248,"slug":112,"name":113,"parentId":48,"description":48,"articleCount":43},"01a0499d-b263-749a-a3ad-df3cc782e94d",{"id":250,"slug":71,"name":72,"parentId":48,"description":48,"articleCount":251},"019fe65f-b134-725b-bbc7-3e3db8c68675",5,{"id":253,"slug":118,"name":119,"parentId":48,"description":48,"articleCount":31},"019fe660-ce9d-754e-b241-7bccad915b86",{"id":255,"slug":136,"name":137,"parentId":48,"description":48,"articleCount":31},"019ff280-9d5a-77dc-b01d-e2378eaf86cb",{"id":257,"slug":148,"name":149,"parentId":48,"description":48,"articleCount":31},"019ff280-9eea-736d-ad13-4c01f0ddc46e",{"items":259,"meta":482},[260,283,301,319,337,355,373,391,409,428,446,464],{"id":261,"slug":262,"title":263,"subtitle":48,"excerpt":264,"coverUrl":265,"locale":13,"readingMinutes":266,"publishedAt":267,"viewCount":268,"likeCount":19,"commentCount":19,"author":269,"vertical":274,"topic":275,"tags":276,"_count":281,"playground":282,"hasQuiz":17,"hasPlayground":17},"01a08c59-464c-7039-acf3-b32a0b9ee7ce","nuxt-weekly-useasyncdata-keys-dedupe","useAsyncData Keys in Nuxt: Caching, Dedupe & the Sharing Bug","Learn how Nuxt's useAsyncData and useFetch generate cache keys, how dedupe (cancel vs defer) really works, and why wrapper composables silently share data.","\u002Fmedia\u002Fcovers\u002Fnuxt-weekly-useasyncdata-keys-dedupe.png",14,"2026-09-13T11:26:28.014Z",238,{"id":270,"name":271,"username":272,"avatarUrl":48,"headline":273},"019fe637-3c25-7088-9034-39c9f15dc3c8","Parsa Jiravand","parsa","Frontend engineer · building bestpractic",{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":106,"name":107},[277,278,279,280],{"slug":106,"name":107,"color":48},{"slug":109,"name":110,"color":48},{"slug":51,"name":52,"color":48},{"slug":63,"name":64,"color":48},{"assessments":184},{"slug":262},{"id":284,"slug":285,"title":286,"subtitle":48,"excerpt":287,"coverUrl":288,"locale":13,"readingMinutes":88,"publishedAt":289,"viewCount":290,"likeCount":19,"commentCount":19,"author":291,"vertical":292,"topic":293,"tags":294,"_count":299,"playground":300,"hasQuiz":17,"hasPlayground":17},"01a080a9-801c-727a-ad92-866c15063710","css-custom-highlight-api-no-dom-mutation","The Search Highlight That Deletes Your Selection","A search-highlight feature that rebuilds its DOM on every keystroke can wipe out a user's own text selection with no warning. The CSS Custom Highlight API fixes it by styling text ranges without ever touching a DOM node.","\u002Fmedia\u002Fcovers\u002Fcss-custom-highlight-api-no-dom-mutation.png","2026-09-13T11:25:57.014Z",349,{"id":270,"name":271,"username":272,"avatarUrl":48,"headline":273},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":59,"name":228},[295,296,297,298],{"slug":59,"name":60,"color":48},{"slug":51,"name":52,"color":48},{"slug":46,"name":47,"color":48},{"slug":63,"name":64,"color":48},{"assessments":184},{"slug":285},{"id":302,"slug":303,"title":304,"subtitle":48,"excerpt":305,"coverUrl":306,"locale":13,"readingMinutes":251,"publishedAt":307,"viewCount":308,"likeCount":19,"commentCount":19,"author":309,"vertical":310,"topic":311,"tags":312,"_count":317,"playground":318,"hasQuiz":17,"hasPlayground":17},"01a0764b-4844-732e-99fe-3e0122793752","promise-try-synchronous-throw-safety","My .catch() Never Ran. The Bug Was Two Lines Above It","A function that sometimes throws synchronously instead of returning a promise will skip every .catch() chained to it — because the promise never gets created. Promise.try() fixes it, and does one thing try\u002Fcatch can't.","\u002Fmedia\u002Fcovers\u002Fpromise-try-synchronous-throw-safety.png","2026-09-13T08:41:22.072Z",186,{"id":270,"name":271,"username":272,"avatarUrl":48,"headline":273},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":51,"name":243},[313,314,315,316],{"slug":51,"name":52,"color":48},{"slug":46,"name":47,"color":48},{"slug":79,"name":80,"color":48},{"slug":86,"name":87,"color":48},{"assessments":184},{"slug":303},{"id":320,"slug":321,"title":322,"subtitle":48,"excerpt":323,"coverUrl":324,"locale":13,"readingMinutes":266,"publishedAt":325,"viewCount":326,"likeCount":19,"commentCount":19,"author":327,"vertical":328,"topic":329,"tags":330,"_count":335,"playground":336,"hasQuiz":17,"hasPlayground":17},"01a0821b-4733-762d-bf96-b68c7eb140c0","nestjs-weekly-module-encapsulation-exports","NestJS Module Encapsulation Explained (with Cheat Sheet)","How NestJS module boundaries actually work: what exports really cross, why @Global() isn't a shortcut, and how forwardRef breaks circular module dependencies.","\u002Fmedia\u002Fcovers\u002Fnestjs-weekly-module-encapsulation-exports.png","2026-09-13T08:40:50.070Z",221,{"id":270,"name":271,"username":272,"avatarUrl":48,"headline":273},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":99,"name":100},[331,332,333,334],{"slug":99,"name":100,"color":48},{"slug":79,"name":80,"color":48},{"slug":67,"name":68,"color":48},{"slug":63,"name":64,"color":48},{"assessments":184},{"slug":321},{"id":338,"slug":339,"title":340,"subtitle":48,"excerpt":341,"coverUrl":342,"locale":13,"readingMinutes":266,"publishedAt":343,"viewCount":344,"likeCount":19,"commentCount":19,"author":345,"vertical":346,"topic":347,"tags":348,"_count":353,"playground":354,"hasQuiz":17,"hasPlayground":17},"01a05e06-53b7-7415-9cd3-05504882514b","nestjs-weekly-dependency-injection-providers-scopes","NestJS Dependency Injection Explained (with Cheat Sheet)","How the NestJS DI container resolves providers: tokens, module scope, singleton vs request vs transient, and why 'singleton' can still mean two instances.","\u002Fmedia\u002Fcovers\u002Fnestjs-weekly-dependency-injection-providers-scopes.png","2026-09-13T08:40:18.434Z",193,{"id":270,"name":271,"username":272,"avatarUrl":48,"headline":273},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":99,"name":100},[349,350,351,352],{"slug":99,"name":100,"color":48},{"slug":79,"name":80,"color":48},{"slug":67,"name":68,"color":48},{"slug":63,"name":64,"color":48},{"assessments":184},{"slug":339},{"id":356,"slug":357,"title":358,"subtitle":48,"excerpt":359,"coverUrl":360,"locale":13,"readingMinutes":251,"publishedAt":361,"viewCount":362,"likeCount":19,"commentCount":19,"author":363,"vertical":364,"topic":365,"tags":366,"_count":371,"playground":372,"hasQuiz":17,"hasPlayground":17},"01a05275-0841-74b8-9d17-108d35eb9cd5","cookie-store-api-async-cookies","Stop Regex-Parsing document.cookie. Use CookieStore","document.cookie hands you one flat string and no way to know when it changes. The Cookie Store API gives you async get\u002Fset\u002Fdelete and a change event — but its set() defaults to a stricter SameSite than the one you're used to.","\u002Fmedia\u002Fcovers\u002Fcookie-store-api-async-cookies.png","2026-09-13T08:39:46.439Z",114,{"id":270,"name":271,"username":272,"avatarUrl":48,"headline":273},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":51,"name":243},[367,368,369,370],{"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":184},{"slug":357},{"id":374,"slug":375,"title":376,"subtitle":48,"excerpt":377,"coverUrl":378,"locale":13,"readingMinutes":251,"publishedAt":379,"viewCount":380,"likeCount":19,"commentCount":19,"author":381,"vertical":382,"topic":383,"tags":384,"_count":389,"playground":390,"hasQuiz":17,"hasPlayground":17},"01a07bbf-a18a-766f-9824-295cdf509230","temporal-api-date-mutation-trap","addDays() Mutated a Date Three Components Away From Where I Called It","A date utility that calls .setDate() and returns the same object looks pure. It isn't — Date is mutable, so the caller and everyone else holding that reference get changed out from under them. Temporal, now shipping in real browsers, fixes it by making dates immutable.","\u002Fmedia\u002Fcovers\u002Ftemporal-api-date-mutation-trap.png","2026-09-12T10:24:23.676Z",212,{"id":270,"name":271,"username":272,"avatarUrl":48,"headline":273},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":51,"name":243},[385,386,387,388],{"slug":51,"name":52,"color":48},{"slug":46,"name":47,"color":48},{"slug":86,"name":87,"color":48},{"slug":67,"name":68,"color":48},{"assessments":184},{"slug":375},{"id":392,"slug":393,"title":394,"subtitle":48,"excerpt":395,"coverUrl":396,"locale":13,"readingMinutes":73,"publishedAt":397,"viewCount":398,"likeCount":19,"commentCount":19,"author":399,"vertical":400,"topic":401,"tags":402,"_count":407,"playground":408,"hasQuiz":17,"hasPlayground":17},"01a08734-5c8d-73c5-95d1-e6b4ae366c25","react-weekly-form-actions-pending-state","React Form Actions: useActionState & useFormStatus Guide","How React 19 form Actions manage pending state automatically — useActionState, useFormStatus, and useOptimistic explained with the bug they replace.","\u002Fmedia\u002Fcovers\u002Freact-weekly-form-actions-pending-state.png","2026-09-12T10:23:52.928Z",203,{"id":270,"name":271,"username":272,"avatarUrl":48,"headline":273},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":71,"name":72},[403,404,405,406],{"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":184},{"slug":393},{"id":410,"slug":411,"title":412,"subtitle":48,"excerpt":413,"coverUrl":414,"locale":13,"readingMinutes":88,"publishedAt":415,"viewCount":344,"likeCount":19,"commentCount":19,"author":416,"vertical":417,"topic":418,"tags":419,"_count":426,"playground":427,"hasQuiz":17,"hasPlayground":17},"01a07112-8d09-7178-b258-b899a0eb496e","webauthn-passkeys-discoverable-credentials","I Shipped 'Passwordless Login.' It Still Asked for a Username.","WebAuthn's own demo code creates a credential the browser can't find on its own — so your passkey button quietly turns into a fancier security key instead of an actual passwordless sign-in. One option fixes it.","\u002Fmedia\u002Fcovers\u002Fwebauthn-passkeys-discoverable-credentials.png","2026-09-10T10:57:59.771Z",{"id":270,"name":271,"username":272,"avatarUrl":48,"headline":273},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":118,"name":119},[420,421,422,423],{"slug":46,"name":47,"color":48},{"slug":118,"name":119,"color":48},{"slug":51,"name":52,"color":48},{"slug":424,"name":425,"color":48},"webauthn","Webauthn",{"assessments":184},{"slug":411},{"id":429,"slug":430,"title":431,"subtitle":48,"excerpt":432,"coverUrl":433,"locale":13,"readingMinutes":88,"publishedAt":434,"viewCount":435,"likeCount":19,"commentCount":19,"author":436,"vertical":437,"topic":438,"tags":439,"_count":444,"playground":445,"hasQuiz":17,"hasPlayground":17},"01a06c11-0cae-7489-8373-0e3cfee9f0fb","web-share-api-native-sharing","Those Share Buttons Are Guessing What's On My Phone","Every blog footer hardcodes the same row of share icons — X, Facebook, copy link — and none of them know what's actually installed on your phone. The Web Share API hands the job to the OS instead, and it can do something a custom row never could: share an actual file.","\u002Fmedia\u002Fcovers\u002Fweb-share-api-native-sharing.png","2026-09-09T11:00:52.000Z",279,{"id":270,"name":271,"username":272,"avatarUrl":48,"headline":273},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":51,"name":243},[440,441,442,443],{"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":184},{"slug":430},{"id":447,"slug":448,"title":449,"subtitle":48,"excerpt":450,"coverUrl":451,"locale":13,"readingMinutes":69,"publishedAt":452,"viewCount":453,"likeCount":19,"commentCount":19,"author":454,"vertical":455,"topic":456,"tags":457,"_count":462,"playground":463,"hasQuiz":17,"hasPlayground":17},"01a06d6c-41f6-77bd-95e3-cdd69a0f72eb","nextjs-weekly-server-actions-mutations-security","Next.js Server Actions: Mutations & Security (Cheat Sheet)","Next.js Server Actions look like plain functions but compile to public POST endpoints. Learn the mutation flow, built-in CSRF checks, and the auth you owe.","\u002Fmedia\u002Fcovers\u002Fnextjs-weekly-server-actions-mutations-security.png","2026-09-08T10:57:00.975Z",245,{"id":270,"name":271,"username":272,"avatarUrl":48,"headline":273},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":112,"name":113},[458,459,460,461],{"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":184},{"slug":448},{"id":465,"slug":466,"title":467,"subtitle":48,"excerpt":468,"coverUrl":469,"locale":13,"readingMinutes":251,"publishedAt":470,"viewCount":471,"likeCount":19,"commentCount":19,"author":472,"vertical":473,"topic":474,"tags":475,"_count":480,"playground":481,"hasQuiz":17,"hasPlayground":17},"01a066ea-291a-77d8-aef4-d310318f61a9","css-user-invalid-native-form-validation-timing","Your Required Field Turns Red Before You Type Anything","A signup form's email input shows a red border the instant the page loads — before the visitor has typed a single character. The obvious CSS causes it, and the obvious fix is a native pseudo-class nobody reaches for first.","\u002Fmedia\u002Fcovers\u002Fcss-user-invalid-native-form-validation-timing.png","2026-09-08T10:56:30.073Z",247,{"id":270,"name":271,"username":272,"avatarUrl":48,"headline":273},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":59,"name":228},[476,477,478,479],{"slug":59,"name":60,"color":48},{"slug":124,"name":125,"color":48},{"slug":46,"name":47,"color":48},{"slug":55,"name":56,"color":48},{"assessments":184},{"slug":466},{"page":31,"perPage":77,"total":483,"totalPages":484},119,10,{"items":486,"meta":505},[487],{"id":488,"slug":489,"title":490,"subtitle":48,"excerpt":491,"coverUrl":492,"locale":13,"readingMinutes":266,"publishedAt":493,"viewCount":494,"likeCount":19,"commentCount":19,"author":495,"vertical":496,"topic":497,"tags":498,"_count":503,"playground":504,"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",162,{"id":270,"name":271,"username":272,"avatarUrl":48,"headline":273},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":71,"name":72},[499,500,501,502],{"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":184},{"slug":489},{"page":184,"perPage":184,"total":483,"totalPages":483}]