[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"verticals":3,"search-suggestions":44,"tag-tutorial-2":91,"tags-all":330},[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,84,88],{"slug":46,"name":47,"articles":48},"webdev","Webdev",103,{"slug":50,"name":51,"articles":52},"javascript","Javascript",87,{"slug":54,"name":55,"articles":56},"frontend","Frontend",71,{"slug":58,"name":59,"articles":60},"css","Css",34,{"slug":62,"name":63,"articles":64},"tutorial","Tutorial",32,{"slug":66,"name":67,"articles":68},"typescript","Typescript",15,{"slug":70,"name":71,"articles":72},"react","React",13,{"slug":74,"name":75,"articles":76},"performance","Performance",12,{"slug":78,"name":79,"articles":80},"browser","Browser",9,{"slug":82,"name":83,"articles":80},"node","Node",{"slug":85,"name":86,"articles":87},"html","Html",6,{"slug":89,"name":90,"articles":87},"grammar","Grammar",{"items":92,"meta":329},[93,117,137,156,174,193,211,231,253,272,290,310],{"id":94,"slug":95,"title":96,"subtitle":97,"excerpt":98,"coverUrl":99,"locale":13,"readingMinutes":72,"publishedAt":100,"viewCount":101,"likeCount":19,"commentCount":19,"author":102,"vertical":107,"topic":108,"tags":109,"_count":114,"playground":116,"hasQuiz":17,"hasPlayground":17},"01a08734-5c8d-73c5-95d1-e6b4ae366c25","react-weekly-form-actions-pending-state","React Form Actions: useActionState & useFormStatus Guide",null,"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",197,{"id":103,"name":104,"username":105,"avatarUrl":97,"headline":106},"019fe637-3c25-7088-9034-39c9f15dc3c8","Parsa Jiravand","parsa","Frontend engineer · building bestpractic",{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":70,"name":71},[110,111,112,113],{"slug":70,"name":71,"color":97},{"slug":50,"name":51,"color":97},{"slug":62,"name":63,"color":97},{"slug":46,"name":47,"color":97},{"assessments":115},1,{"slug":95},{"id":118,"slug":119,"title":120,"subtitle":97,"excerpt":121,"coverUrl":122,"locale":13,"readingMinutes":68,"publishedAt":123,"viewCount":124,"likeCount":19,"commentCount":19,"author":125,"vertical":126,"topic":127,"tags":130,"_count":135,"playground":136,"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",242,{"id":103,"name":104,"username":105,"avatarUrl":97,"headline":106},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":128,"name":129},"nextjs","Nextjs",[131,132,133,134],{"slug":128,"name":129,"color":97},{"slug":70,"name":71,"color":97},{"slug":46,"name":47,"color":97},{"slug":62,"name":63,"color":97},{"assessments":115},{"slug":119},{"id":138,"slug":139,"title":140,"subtitle":97,"excerpt":141,"coverUrl":142,"locale":13,"readingMinutes":76,"publishedAt":143,"viewCount":144,"likeCount":19,"commentCount":19,"author":145,"vertical":146,"topic":147,"tags":149,"_count":154,"playground":155,"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",337,{"id":103,"name":104,"username":105,"avatarUrl":97,"headline":106},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":50,"name":148},"JavaScript",[150,151,152,153],{"slug":50,"name":51,"color":97},{"slug":46,"name":47,"color":97},{"slug":62,"name":63,"color":97},{"slug":74,"name":75,"color":97},{"assessments":115},{"slug":139},{"id":157,"slug":158,"title":159,"subtitle":97,"excerpt":160,"coverUrl":161,"locale":13,"readingMinutes":72,"publishedAt":162,"viewCount":163,"likeCount":19,"commentCount":19,"author":164,"vertical":165,"topic":166,"tags":167,"_count":172,"playground":173,"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",304,{"id":103,"name":104,"username":105,"avatarUrl":97,"headline":106},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":70,"name":71},[168,169,170,171],{"slug":70,"name":71,"color":97},{"slug":50,"name":51,"color":97},{"slug":62,"name":63,"color":97},{"slug":46,"name":47,"color":97},{"assessments":115},{"slug":158},{"id":175,"slug":176,"title":177,"subtitle":97,"excerpt":178,"coverUrl":179,"locale":13,"readingMinutes":180,"publishedAt":181,"viewCount":182,"likeCount":19,"commentCount":19,"author":183,"vertical":184,"topic":185,"tags":186,"_count":191,"playground":192,"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",338,{"id":103,"name":104,"username":105,"avatarUrl":97,"headline":106},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":128,"name":129},[187,188,189,190],{"slug":128,"name":129,"color":97},{"slug":70,"name":71,"color":97},{"slug":46,"name":47,"color":97},{"slug":62,"name":63,"color":97},{"assessments":115},{"slug":176},{"id":194,"slug":195,"title":196,"subtitle":97,"excerpt":197,"coverUrl":198,"locale":13,"readingMinutes":180,"publishedAt":199,"viewCount":200,"likeCount":19,"commentCount":19,"author":201,"vertical":202,"topic":203,"tags":204,"_count":209,"playground":210,"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",331,{"id":103,"name":104,"username":105,"avatarUrl":97,"headline":106},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":50,"name":148},[205,206,207,208],{"slug":50,"name":51,"color":97},{"slug":46,"name":47,"color":97},{"slug":62,"name":63,"color":97},{"slug":74,"name":75,"color":97},{"assessments":115},{"slug":195},{"id":212,"slug":213,"title":214,"subtitle":97,"excerpt":215,"coverUrl":216,"locale":13,"readingMinutes":87,"publishedAt":217,"viewCount":218,"likeCount":19,"commentCount":19,"author":219,"vertical":220,"topic":221,"tags":222,"_count":229,"playground":230,"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",269,{"id":103,"name":104,"username":105,"avatarUrl":97,"headline":106},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":50,"name":148},[223,224,225,226],{"slug":50,"name":51,"color":97},{"slug":46,"name":47,"color":97},{"slug":62,"name":63,"color":97},{"slug":227,"name":228,"color":97},"apis","Apis",{"assessments":115},{"slug":213},{"id":232,"slug":233,"title":234,"subtitle":97,"excerpt":235,"coverUrl":236,"locale":13,"readingMinutes":180,"publishedAt":237,"viewCount":238,"likeCount":19,"commentCount":19,"author":239,"vertical":240,"topic":241,"tags":244,"_count":251,"playground":252,"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",252,{"id":103,"name":104,"username":105,"avatarUrl":97,"headline":106},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":242,"name":243},"nuxt","Nuxt",[245,246,249,250],{"slug":242,"name":243,"color":97},{"slug":247,"name":248,"color":97},"ssr","SSR",{"slug":50,"name":51,"color":97},{"slug":62,"name":63,"color":97},{"assessments":115},{"slug":233},{"id":254,"slug":255,"title":256,"subtitle":97,"excerpt":257,"coverUrl":258,"locale":13,"readingMinutes":87,"publishedAt":259,"viewCount":260,"likeCount":19,"commentCount":19,"author":261,"vertical":262,"topic":263,"tags":265,"_count":270,"playground":271,"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",327,{"id":103,"name":104,"username":105,"avatarUrl":97,"headline":106},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":58,"name":264},"CSS",[266,267,268,269],{"slug":58,"name":59,"color":97},{"slug":46,"name":47,"color":97},{"slug":54,"name":55,"color":97},{"slug":62,"name":63,"color":97},{"assessments":115},{"slug":255},{"id":273,"slug":274,"title":275,"subtitle":97,"excerpt":276,"coverUrl":277,"locale":13,"readingMinutes":72,"publishedAt":278,"viewCount":279,"likeCount":19,"commentCount":19,"author":280,"vertical":281,"topic":282,"tags":283,"_count":288,"playground":289,"hasQuiz":17,"hasPlayground":17},"01a04446-373a-775b-8aaf-b72c8952123d","react-weekly-rerender-vs-remount","React Re-render vs Remount: What Actually Triggers Each","A practical guide to React re-render vs remount: what type, position, and key decide, why state resets unexpectedly, and how to force a remount.","\u002Fmedia\u002Fcovers\u002Freact-weekly-rerender-vs-remount.png","2026-08-29T12:32:41.200Z",353,{"id":103,"name":104,"username":105,"avatarUrl":97,"headline":106},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":70,"name":71},[284,285,286,287],{"slug":70,"name":71,"color":97},{"slug":50,"name":51,"color":97},{"slug":62,"name":63,"color":97},{"slug":46,"name":47,"color":97},{"assessments":115},{"slug":274},{"id":291,"slug":292,"title":293,"subtitle":97,"excerpt":294,"coverUrl":295,"locale":13,"readingMinutes":72,"publishedAt":296,"viewCount":297,"likeCount":19,"commentCount":19,"author":298,"vertical":299,"topic":300,"tags":303,"_count":308,"playground":309,"hasQuiz":17,"hasPlayground":17},"01a03cdb-22ef-748a-b555-8071c7a905e6","nestjs-weekly-request-lifecycle","NestJS Request Lifecycle Explained (with Cheat Sheet)","A complete guide to the NestJS request lifecycle: the exact order middleware, guards, interceptors, pipes, and filters run, and why it matters.","\u002Fmedia\u002Fcovers\u002Fnestjs-weekly-request-lifecycle.png","2026-08-28T17:01:41.941Z",371,{"id":103,"name":104,"username":105,"avatarUrl":97,"headline":106},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":301,"name":302},"nestjs","Nestjs",[304,305,306,307],{"slug":301,"name":302,"color":97},{"slug":82,"name":83,"color":97},{"slug":66,"name":67,"color":97},{"slug":62,"name":63,"color":97},{"assessments":115},{"slug":292},{"id":311,"slug":312,"title":313,"subtitle":97,"excerpt":314,"coverUrl":315,"locale":13,"readingMinutes":316,"publishedAt":317,"viewCount":318,"likeCount":19,"commentCount":19,"author":319,"vertical":320,"topic":321,"tags":322,"_count":327,"playground":328,"hasQuiz":17,"hasPlayground":17},"01a02d61-19cf-72cd-8490-a59e14f8839c","css-grid-auto-fit-vs-auto-fill","Your Grid Has Invisible Columns: auto-fill vs auto-fit","A responsive card grid that works perfectly with twelve items breaks with two — not from a bug, but from one word in a repeat() you copy-pasted without reading.","\u002Fmedia\u002Fcovers\u002Fcss-grid-auto-fit-vs-auto-fill.png",5,"2026-08-28T17:00:06.666Z",460,{"id":103,"name":104,"username":105,"avatarUrl":97,"headline":106},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":58,"name":264},[323,324,325,326],{"slug":58,"name":59,"color":97},{"slug":46,"name":47,"color":97},{"slug":54,"name":55,"color":97},{"slug":62,"name":63,"color":97},{"assessments":115},{"slug":312},{"page":31,"perPage":76,"total":64,"totalPages":43},[331,332,333,334,335,336,337,338,339,340,341,344,345,346,349,351,352,353,354,355,358,361,364,367,370,373,376,379,382,385,388,391,394,397,400,403],{"slug":46,"name":47,"color":97,"articles":48},{"slug":50,"name":51,"color":97,"articles":52},{"slug":54,"name":55,"color":97,"articles":56},{"slug":58,"name":59,"color":97,"articles":60},{"slug":62,"name":63,"color":97,"articles":64},{"slug":66,"name":67,"color":97,"articles":68},{"slug":70,"name":71,"color":97,"articles":72},{"slug":74,"name":75,"color":97,"articles":76},{"slug":82,"name":83,"color":97,"articles":80},{"slug":78,"name":79,"color":97,"articles":80},{"slug":342,"name":343,"color":97,"articles":87},"programming","Programming",{"slug":85,"name":86,"color":97,"articles":87},{"slug":89,"name":90,"color":97,"articles":87},{"slug":347,"name":348,"color":97,"articles":87},"accessibility","Accessibility",{"slug":301,"name":302,"color":97,"articles":350},4,{"slug":227,"name":228,"color":97,"articles":350},{"slug":242,"name":243,"color":97,"articles":43},{"slug":247,"name":248,"color":97,"articles":43},{"slug":128,"name":129,"color":97,"articles":43},{"slug":356,"name":357,"color":97,"articles":43},"ai","Ai",{"slug":359,"name":360,"color":97,"articles":31},"security","Security",{"slug":362,"name":363,"color":97,"articles":31},"async","Async",{"slug":365,"name":366,"color":97,"articles":31},"forms","Forms",{"slug":368,"name":369,"color":97,"articles":31},"api","API",{"slug":371,"name":372,"color":97,"articles":31},"english","English",{"slug":374,"name":375,"color":97,"articles":31},"verbs","Verbs",{"slug":377,"name":378,"color":97,"articles":31},"spanish","Spanish",{"slug":380,"name":381,"color":97,"articles":31},"a1","A1",{"slug":383,"name":384,"color":97,"articles":31},"a2","A2",{"slug":386,"name":387,"color":97,"articles":31},"tenses","Tenses",{"slug":389,"name":390,"color":97,"articles":31},"turkish","Turkish",{"slug":392,"name":393,"color":97,"articles":31},"vue","Vue",{"slug":395,"name":396,"color":97,"articles":31},"career","Career",{"slug":398,"name":399,"color":97,"articles":31},"beginners","Beginners",{"slug":401,"name":402,"color":97,"articles":31},"productivity","Productivity",{"slug":404,"name":405,"color":97,"articles":31},"discuss","Discuss"]