[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"verticals":3,"search-suggestions":44,"tag-tutorial-5":93,"tags-all":335},[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,49,53,57,61,65,69,73,77,81,85,89],{"slug":46,"name":47,"articles":48},"webdev","Webdev",174,{"slug":50,"name":51,"articles":52},"javascript","Javascript",141,{"slug":54,"name":55,"articles":56},"frontend","Frontend",96,{"slug":58,"name":59,"articles":60},"tutorial","Tutorial",71,{"slug":62,"name":63,"articles":64},"css","Css",51,{"slug":66,"name":67,"articles":68},"performance","Performance",30,{"slug":70,"name":71,"articles":72},"typescript","Typescript",25,{"slug":74,"name":75,"articles":76},"react","React",20,{"slug":78,"name":79,"articles":80},"programming","Programming",19,{"slug":82,"name":83,"articles":84},"browser","Browser",18,{"slug":86,"name":87,"articles":88},"node","Node",16,{"slug":90,"name":91,"articles":92},"html","Html",12,{"items":94,"meta":333},[95,121,142,161,180,200,219,237,255,273,293,315],{"id":96,"slug":97,"title":98,"subtitle":99,"excerpt":100,"coverUrl":101,"locale":13,"readingMinutes":102,"publishedAt":103,"viewCount":104,"likeCount":19,"commentCount":19,"author":105,"vertical":110,"topic":111,"tags":113,"_count":118,"playground":120,"hasQuiz":17,"hasPlayground":17},"01a080a9-801c-727a-ad92-866c15063710","css-custom-highlight-api-no-dom-mutation","The Search Highlight That Deletes Your Selection",null,"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",6,"2026-09-13T11:25:57.014Z",773,{"id":106,"name":107,"username":108,"avatarUrl":99,"headline":109},"019fe637-3c25-7088-9034-39c9f15dc3c8","Parsa Jiravand","parsa","Frontend engineer · building bestpractic",{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":62,"name":112},"CSS",[114,115,116,117],{"slug":62,"name":63,"color":99},{"slug":50,"name":51,"color":99},{"slug":46,"name":47,"color":99},{"slug":58,"name":59,"color":99},{"assessments":119},1,{"slug":97},{"id":122,"slug":123,"title":124,"subtitle":99,"excerpt":125,"coverUrl":126,"locale":13,"readingMinutes":127,"publishedAt":128,"viewCount":129,"likeCount":19,"commentCount":19,"author":130,"vertical":131,"topic":132,"tags":135,"_count":140,"playground":141,"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",15,"2026-09-13T08:40:50.070Z",707,{"id":106,"name":107,"username":108,"avatarUrl":99,"headline":109},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":133,"name":134},"nestjs","Nestjs",[136,137,138,139],{"slug":133,"name":134,"color":99},{"slug":86,"name":87,"color":99},{"slug":70,"name":71,"color":99},{"slug":58,"name":59,"color":99},{"assessments":119},{"slug":123},{"id":143,"slug":144,"title":145,"subtitle":99,"excerpt":146,"coverUrl":147,"locale":13,"readingMinutes":148,"publishedAt":149,"viewCount":150,"likeCount":19,"commentCount":19,"author":151,"vertical":152,"topic":153,"tags":154,"_count":159,"playground":160,"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",14,"2026-09-13T08:40:18.434Z",745,{"id":106,"name":107,"username":108,"avatarUrl":99,"headline":109},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":133,"name":134},[155,156,157,158],{"slug":133,"name":134,"color":99},{"slug":86,"name":87,"color":99},{"slug":70,"name":71,"color":99},{"slug":58,"name":59,"color":99},{"assessments":119},{"slug":144},{"id":162,"slug":163,"title":164,"subtitle":99,"excerpt":165,"coverUrl":166,"locale":13,"readingMinutes":167,"publishedAt":168,"viewCount":169,"likeCount":19,"commentCount":19,"author":170,"vertical":171,"topic":172,"tags":173,"_count":178,"playground":179,"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",13,"2026-09-12T10:23:52.928Z",1101,{"id":106,"name":107,"username":108,"avatarUrl":99,"headline":109},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":74,"name":75},[174,175,176,177],{"slug":74,"name":75,"color":99},{"slug":50,"name":51,"color":99},{"slug":58,"name":59,"color":99},{"slug":46,"name":47,"color":99},{"assessments":119},{"slug":163},{"id":181,"slug":182,"title":183,"subtitle":99,"excerpt":184,"coverUrl":185,"locale":13,"readingMinutes":127,"publishedAt":186,"viewCount":187,"likeCount":19,"commentCount":19,"author":188,"vertical":189,"topic":190,"tags":193,"_count":198,"playground":199,"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",752,{"id":106,"name":107,"username":108,"avatarUrl":99,"headline":109},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":191,"name":192},"nextjs","Nextjs",[194,195,196,197],{"slug":191,"name":192,"color":99},{"slug":74,"name":75,"color":99},{"slug":46,"name":47,"color":99},{"slug":58,"name":59,"color":99},{"assessments":119},{"slug":182},{"id":201,"slug":202,"title":203,"subtitle":99,"excerpt":204,"coverUrl":205,"locale":13,"readingMinutes":167,"publishedAt":206,"viewCount":207,"likeCount":19,"commentCount":19,"author":208,"vertical":209,"topic":210,"tags":212,"_count":217,"playground":218,"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",698,{"id":106,"name":107,"username":108,"avatarUrl":99,"headline":109},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":50,"name":211},"JavaScript",[213,214,215,216],{"slug":50,"name":51,"color":99},{"slug":46,"name":47,"color":99},{"slug":58,"name":59,"color":99},{"slug":66,"name":67,"color":99},{"assessments":119},{"slug":202},{"id":220,"slug":221,"title":222,"subtitle":99,"excerpt":223,"coverUrl":224,"locale":13,"readingMinutes":167,"publishedAt":225,"viewCount":226,"likeCount":19,"commentCount":19,"author":227,"vertical":228,"topic":229,"tags":230,"_count":235,"playground":236,"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",821,{"id":106,"name":107,"username":108,"avatarUrl":99,"headline":109},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":74,"name":75},[231,232,233,234],{"slug":74,"name":75,"color":99},{"slug":50,"name":51,"color":99},{"slug":58,"name":59,"color":99},{"slug":46,"name":47,"color":99},{"assessments":119},{"slug":221},{"id":238,"slug":239,"title":240,"subtitle":99,"excerpt":241,"coverUrl":242,"locale":13,"readingMinutes":148,"publishedAt":243,"viewCount":244,"likeCount":19,"commentCount":19,"author":245,"vertical":246,"topic":247,"tags":248,"_count":253,"playground":254,"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","2026-09-01T11:24:15.087Z",3763,{"id":106,"name":107,"username":108,"avatarUrl":99,"headline":109},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":191,"name":192},[249,250,251,252],{"slug":191,"name":192,"color":99},{"slug":74,"name":75,"color":99},{"slug":46,"name":47,"color":99},{"slug":58,"name":59,"color":99},{"assessments":119},{"slug":239},{"id":256,"slug":257,"title":258,"subtitle":99,"excerpt":259,"coverUrl":260,"locale":13,"readingMinutes":148,"publishedAt":261,"viewCount":262,"likeCount":19,"commentCount":19,"author":263,"vertical":264,"topic":265,"tags":266,"_count":271,"playground":272,"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",801,{"id":106,"name":107,"username":108,"avatarUrl":99,"headline":109},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":50,"name":211},[267,268,269,270],{"slug":50,"name":51,"color":99},{"slug":46,"name":47,"color":99},{"slug":58,"name":59,"color":99},{"slug":66,"name":67,"color":99},{"assessments":119},{"slug":257},{"id":274,"slug":275,"title":276,"subtitle":99,"excerpt":277,"coverUrl":278,"locale":13,"readingMinutes":102,"publishedAt":279,"viewCount":280,"likeCount":19,"commentCount":19,"author":281,"vertical":282,"topic":283,"tags":284,"_count":291,"playground":292,"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",556,{"id":106,"name":107,"username":108,"avatarUrl":99,"headline":109},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":50,"name":211},[285,286,287,288],{"slug":50,"name":51,"color":99},{"slug":46,"name":47,"color":99},{"slug":58,"name":59,"color":99},{"slug":289,"name":290,"color":99},"apis","Apis",{"assessments":119},{"slug":275},{"id":294,"slug":295,"title":296,"subtitle":99,"excerpt":297,"coverUrl":298,"locale":13,"readingMinutes":148,"publishedAt":299,"viewCount":300,"likeCount":19,"commentCount":19,"author":301,"vertical":302,"topic":303,"tags":306,"_count":313,"playground":314,"hasQuiz":17,"hasPlayground":17},"01a04446-3f08-701c-8cdc-e5ab5e87086e","nuxt-weekly-cross-request-state-leak","Nuxt useState vs ref(): Why Server State Leaks Across Users","A module-scope ref() in Nuxt is shared by every request that hits your server. Learn why useState isolates state per user, and how to fix the leak.","\u002Fmedia\u002Fcovers\u002Fnuxt-weekly-cross-request-state-leak.png","2026-08-30T11:37:11.335Z",641,{"id":106,"name":107,"username":108,"avatarUrl":99,"headline":109},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":304,"name":305},"nuxt","Nuxt",[307,308,311,312],{"slug":304,"name":305,"color":99},{"slug":309,"name":310,"color":99},"ssr","SSR",{"slug":50,"name":51,"color":99},{"slug":58,"name":59,"color":99},{"assessments":119},{"slug":295},{"id":316,"slug":317,"title":318,"subtitle":99,"excerpt":319,"coverUrl":320,"locale":13,"readingMinutes":102,"publishedAt":321,"viewCount":322,"likeCount":19,"commentCount":19,"author":323,"vertical":324,"topic":325,"tags":326,"_count":331,"playground":332,"hasQuiz":17,"hasPlayground":17},"01a037b3-f71a-755b-9820-9f2489daaebd","css-aspect-ratio-replace-padding-hack","Delete Your padding-bottom Aspect-Ratio Hack","For a decade the only way to keep a responsive box's shape was a padding percentage and an absolutely positioned wrapper. One CSS property replaces it — with one gotcha on real images nobody warns you about.","\u002Fmedia\u002Fcovers\u002Fcss-aspect-ratio-replace-padding-hack.png","2026-08-30T11:36:40.014Z",607,{"id":106,"name":107,"username":108,"avatarUrl":99,"headline":109},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":62,"name":112},[327,328,329,330],{"slug":62,"name":63,"color":99},{"slug":46,"name":47,"color":99},{"slug":54,"name":55,"color":99},{"slug":58,"name":59,"color":99},{"assessments":119},{"slug":317},{"page":334,"perPage":92,"total":60,"totalPages":102},5,[336,337,338,339,340,341,342,343,344,345,346,347,348,350,354,357,359,361,364,367,371,374,377,380,382,383,386,389,392,395,398,401,404,407,410,413,416,419,422,425],{"slug":46,"name":47,"color":99,"articles":48},{"slug":50,"name":51,"color":99,"articles":52},{"slug":54,"name":55,"color":99,"articles":56},{"slug":58,"name":59,"color":99,"articles":60},{"slug":62,"name":63,"color":99,"articles":64},{"slug":66,"name":67,"color":99,"articles":68},{"slug":70,"name":71,"color":99,"articles":72},{"slug":74,"name":75,"color":99,"articles":76},{"slug":78,"name":79,"color":99,"articles":80},{"slug":82,"name":83,"color":99,"articles":84},{"slug":86,"name":87,"color":99,"articles":88},{"slug":90,"name":91,"color":99,"articles":92},{"slug":191,"name":192,"color":99,"articles":349},11,{"slug":351,"name":352,"color":99,"articles":353},"vue","Vue",10,{"slug":355,"name":356,"color":99,"articles":353},"accessibility","Accessibility",{"slug":133,"name":134,"color":99,"articles":358},9,{"slug":304,"name":305,"color":99,"articles":360},8,{"slug":362,"name":363,"color":99,"articles":360},"career","Career",{"slug":365,"name":366,"color":99,"articles":360},"discuss","Discuss",{"slug":368,"name":369,"color":99,"articles":370},"beginners","Beginners",7,{"slug":372,"name":373,"color":99,"articles":370},"productivity","Productivity",{"slug":375,"name":376,"color":99,"articles":102},"grammar","Grammar",{"slug":378,"name":379,"color":99,"articles":334},"security","Security",{"slug":309,"name":310,"color":99,"articles":381},4,{"slug":289,"name":290,"color":99,"articles":381},{"slug":384,"name":385,"color":99,"articles":43},"ai","Ai",{"slug":387,"name":388,"color":99,"articles":43},"api","API",{"slug":390,"name":391,"color":99,"articles":43},"caching","Caching",{"slug":393,"name":394,"color":99,"articles":31},"async","Async",{"slug":396,"name":397,"color":99,"articles":31},"forms","Forms",{"slug":399,"name":400,"color":99,"articles":31},"dom","Dom",{"slug":402,"name":403,"color":99,"articles":31},"backend","Backend",{"slug":405,"name":406,"color":99,"articles":31},"english","English",{"slug":408,"name":409,"color":99,"articles":31},"verbs","Verbs",{"slug":411,"name":412,"color":99,"articles":31},"spanish","Spanish",{"slug":414,"name":415,"color":99,"articles":31},"a1","A1",{"slug":417,"name":418,"color":99,"articles":31},"a2","A2",{"slug":420,"name":421,"color":99,"articles":31},"tenses","Tenses",{"slug":423,"name":424,"color":99,"articles":31},"turkish","Turkish",{"slug":426,"name":427,"color":99,"articles":31},"animation","Animation"]