[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"verticals":3,"blog-topics":44,"search-suggestions":165,"topics-all":178,"articles-all-10---":258,"articles-total":452},[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":449},[260,281,298,315,331,347,364,381,397,414,432],{"id":261,"slug":262,"title":263,"subtitle":48,"excerpt":264,"coverUrl":265,"locale":13,"readingMinutes":101,"publishedAt":266,"viewCount":267,"likeCount":19,"commentCount":19,"author":268,"vertical":273,"topic":274,"tags":275,"_count":280,"playground":48,"hasQuiz":18,"hasPlayground":18},"019fe65f-e7b8-7175-a185-34775c370bcf","abort-controller-async-cancellation","Your fetch() Is Still Running After the User Left","Stale requests, race conditions in search boxes, state updates on unmounted components — these are all the same bug: async work you forgot to cancel. AbortController is the fix.","\u002Fmedia\u002Fcovers\u002Fabort-controller-async-cancellation.png","2026-07-05T09:12:47.873Z",163,{"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":243},[276,277,278,279],{"slug":51,"name":52,"color":48},{"slug":46,"name":47,"color":48},{"slug":55,"name":56,"color":48},{"slug":71,"name":72,"color":48},{"assessments":19},{"id":282,"slug":283,"title":284,"subtitle":48,"excerpt":285,"coverUrl":286,"locale":13,"readingMinutes":251,"publishedAt":287,"viewCount":288,"likeCount":19,"commentCount":19,"author":289,"vertical":290,"topic":291,"tags":292,"_count":297,"playground":48,"hasQuiz":18,"hasPlayground":18},"019fe65f-e05c-77bb-b8a3-cb8dbdc99346","css-layer-architecture","You reached for !important again. @layer is the real fix.","When a third-party reset beats your styles and your own utilities lose to an ancient nested rule, the problem isn't your selectors. It's that your stylesheet has no architecture. @layer adds one.","\u002Fmedia\u002Fcovers\u002Fcss-layer-architecture.png","2026-07-04T08:44:02.193Z",81,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":59,"name":228},[293,294,295,296],{"slug":59,"name":60,"color":48},{"slug":46,"name":47,"color":48},{"slug":55,"name":56,"color":48},{"slug":51,"name":52,"color":48},{"assessments":19},{"id":299,"slug":300,"title":301,"subtitle":48,"excerpt":302,"coverUrl":303,"locale":13,"readingMinutes":251,"publishedAt":304,"viewCount":305,"likeCount":19,"commentCount":19,"author":306,"vertical":307,"topic":308,"tags":309,"_count":314,"playground":48,"hasQuiz":18,"hasPlayground":18},"019fe65f-d8d6-73ed-b26b-18726a494914","view-transitions-native-page-transitions","The page transition you pay a library for is now free","You reach for Framer Motion or GSAP to make navigation feel smooth. The View Transitions API does the same thing natively — and the starting price is a single CSS rule.","\u002Fmedia\u002Fcovers\u002Fview-transitions-native-page-transitions.png","2026-07-03T09:26:36.534Z",96,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":59,"name":228},[310,311,312,313],{"slug":59,"name":60,"color":48},{"slug":46,"name":47,"color":48},{"slug":55,"name":56,"color":48},{"slug":51,"name":52,"color":48},{"assessments":19},{"id":316,"slug":317,"title":318,"subtitle":48,"excerpt":319,"coverUrl":320,"locale":13,"readingMinutes":101,"publishedAt":321,"viewCount":53,"likeCount":19,"commentCount":19,"author":322,"vertical":323,"topic":324,"tags":325,"_count":330,"playground":48,"hasQuiz":18,"hasPlayground":18},"019fe65f-d19a-709a-855e-54178d886feb","has-selector-condition-evaluator",":has() isn't a parent selector. It deletes JavaScript.","Everyone calls :has() the parent selector. That framing is too small — it's a condition evaluator that obsoletes a whole category of class-toggling JS, and it's in every browser today.","\u002Fmedia\u002Fcovers\u002Fhas-selector-condition-evaluator.png","2026-07-02T07:18:03.500Z",{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":59,"name":228},[326,327,328,329],{"slug":59,"name":60,"color":48},{"slug":46,"name":47,"color":48},{"slug":55,"name":56,"color":48},{"slug":51,"name":52,"color":48},{"assessments":19},{"id":332,"slug":333,"title":334,"subtitle":48,"excerpt":335,"coverUrl":336,"locale":13,"readingMinutes":101,"publishedAt":337,"viewCount":49,"likeCount":19,"commentCount":19,"author":338,"vertical":339,"topic":340,"tags":341,"_count":346,"playground":48,"hasQuiz":18,"hasPlayground":18},"019fe65f-c9aa-70db-8ac8-df39bed8061b","optimistic-updates-stop-waiting-for-the-server","Your Save button waits 300ms for nothing. Stop it.","Every click that spins for a server round-trip is a choice you made. Optimistic updates remove the wait — but the rollback is where almost every implementation quietly breaks.","\u002Fmedia\u002Fcovers\u002Foptimistic-updates-stop-waiting-for-the-server.png","2026-07-01T07:42:41.462Z",{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":51,"name":243},[342,343,344,345],{"slug":46,"name":47,"color":48},{"slug":55,"name":56,"color":48},{"slug":51,"name":52,"color":48},{"slug":71,"name":72,"color":48},{"assessments":19},{"id":348,"slug":349,"title":350,"subtitle":48,"excerpt":351,"coverUrl":352,"locale":13,"readingMinutes":101,"publishedAt":353,"viewCount":354,"likeCount":19,"commentCount":19,"author":355,"vertical":356,"topic":357,"tags":358,"_count":363,"playground":48,"hasQuiz":18,"hasPlayground":18},"019fe65f-c193-7159-96ba-bff62b34e53d","container-queries-responsive-primitive","Your card breaks in the sidebar. Here's the real fix.","A component that looks perfect in the main column falls apart in a sidebar — and the viewport width says everything's fine. The bug isn't your CSS. It's the question your CSS is asking.","\u002Fmedia\u002Fcovers\u002Fcontainer-queries-responsive-primitive.png","2026-06-30T07:30:01.218Z",83,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":59,"name":228},[359,360,361,362],{"slug":59,"name":60,"color":48},{"slug":46,"name":47,"color":48},{"slug":55,"name":56,"color":48},{"slug":51,"name":52,"color":48},{"assessments":19},{"id":365,"slug":366,"title":367,"subtitle":48,"excerpt":368,"coverUrl":369,"locale":13,"readingMinutes":101,"publishedAt":370,"viewCount":371,"likeCount":19,"commentCount":19,"author":372,"vertical":373,"topic":374,"tags":375,"_count":380,"playground":48,"hasQuiz":18,"hasPlayground":18},"019fe65f-b9de-72a8-8656-ee81360dbd99","url-as-state-manager","The URL Is Your Best State Manager","You're storing filter state, search queries, and pagination in useState — and losing it every time someone refreshes. The URL already does this better.","\u002Fmedia\u002Fcovers\u002Furl-as-state-manager.png","2026-06-29T07:59:09.726Z",132,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":51,"name":243},[376,377,378,379],{"slug":46,"name":47,"color":48},{"slug":55,"name":56,"color":48},{"slug":51,"name":52,"color":48},{"slug":71,"name":72,"color":48},{"assessments":19},{"id":382,"slug":383,"title":384,"subtitle":48,"excerpt":385,"coverUrl":386,"locale":13,"readingMinutes":43,"publishedAt":387,"viewCount":49,"likeCount":19,"commentCount":19,"author":388,"vertical":389,"topic":390,"tags":391,"_count":396,"playground":48,"hasQuiz":18,"hasPlayground":18},"019fe65f-b1ba-7644-b327-4118cffd7d22","server-components-mental-model","Server Components Without the Hype: A Mental Model That Sticks","RSC isn't 'SSR 2.0' and it isn't magic. Here's the one distinction that makes the whole model click.","\u002Fmedia\u002Fcovers\u002Fserver-components-mental-model.png","2026-06-28T09:41:35.140Z",{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":71,"name":72},[392,393,394,395],{"slug":71,"name":72,"color":48},{"slug":46,"name":47,"color":48},{"slug":55,"name":56,"color":48},{"slug":51,"name":52,"color":48},{"assessments":19},{"id":398,"slug":399,"title":400,"subtitle":48,"excerpt":401,"coverUrl":402,"locale":13,"readingMinutes":43,"publishedAt":403,"viewCount":404,"likeCount":19,"commentCount":19,"author":405,"vertical":406,"topic":407,"tags":408,"_count":413,"playground":48,"hasQuiz":18,"hasPlayground":18},"019fe65f-a9f9-7079-bfbf-ca4dc5685bdd","typescript-won-what-it-bought-us","TypeScript Won. Here's What That Actually Bought Us.","The 'should we use TypeScript?' debate is over. The interesting question is what all those types are quietly enabling now.","\u002Fmedia\u002Fcovers\u002Ftypescript-won-what-it-bought-us.png","2026-06-28T07:31:54.189Z",104,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":67,"name":201},[409,410,411,412],{"slug":67,"name":68,"color":48},{"slug":51,"name":52,"color":48},{"slug":46,"name":47,"color":48},{"slug":115,"name":116,"color":48},{"assessments":19},{"id":415,"slug":416,"title":417,"subtitle":48,"excerpt":418,"coverUrl":419,"locale":13,"readingMinutes":43,"publishedAt":420,"viewCount":421,"likeCount":19,"commentCount":19,"author":422,"vertical":423,"topic":424,"tags":425,"_count":431,"playground":48,"hasQuiz":18,"hasPlayground":18},"019fe65f-a25a-702f-b8a0-ae60efb61964","design-system-api-for-machines","Your Design System Is Now an API for Machines","Component libraries used to be for humans. Now they're the rails an AI plans against — and that changes how you should build them.","\u002Fmedia\u002Fcovers\u002Fdesign-system-api-for-machines.png","2026-06-26T07:29:19.042Z",105,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":234,"name":235},[426,427,428,430],{"slug":46,"name":47,"color":48},{"slug":55,"name":56,"color":48},{"slug":234,"name":429,"color":48},"Designsystems",{"slug":115,"name":116,"color":48},{"assessments":19},{"id":433,"slug":434,"title":435,"subtitle":48,"excerpt":436,"coverUrl":437,"locale":13,"readingMinutes":101,"publishedAt":438,"viewCount":439,"likeCount":19,"commentCount":19,"author":440,"vertical":441,"topic":442,"tags":443,"_count":448,"playground":48,"hasQuiz":18,"hasPlayground":18},"019fe65f-9991-7098-a2e8-28d741366ffa","frontend-future-ai","The Frontend Is Becoming a Conversation: Where UI Engineering Goes Next","Frontend stacks consolidated, the rendering wars cooled off, and AI quietly changed what a frontend engineer actually does all day. Here's where it's heading.","\u002Fmedia\u002Fcovers\u002Ffrontend-future-ai.png","2026-06-25T12:27:00.662Z",164,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":115,"name":225},[444,445,446,447],{"slug":46,"name":47,"color":48},{"slug":55,"name":56,"color":48},{"slug":115,"name":116,"color":48},{"slug":51,"name":52,"color":48},{"assessments":19},{"page":450,"perPage":77,"total":451,"totalPages":450},10,119,{"items":453,"meta":473},[454],{"id":455,"slug":456,"title":457,"subtitle":48,"excerpt":458,"coverUrl":459,"locale":13,"readingMinutes":460,"publishedAt":461,"viewCount":462,"likeCount":19,"commentCount":19,"author":463,"vertical":464,"topic":465,"tags":466,"_count":471,"playground":472,"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",14,"2026-09-20T16:27:07.271Z",85,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":71,"name":72},[467,468,469,470],{"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":456},{"page":184,"perPage":184,"total":451,"totalPages":451}]