[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"summary-c116726456b33e2b-tanstack-server-components-opt-in-granularity-beat-summary":3,"summaries-facets-categories":163,"summary-related-c116726456b33e2b-tanstack-server-components-opt-in-granularity-beat-summary":3732},{"id":4,"title":5,"ai":6,"body":13,"categories":123,"created_at":125,"date_modified":125,"description":117,"extension":126,"faq":125,"featured":127,"kicker_label":125,"meta":128,"navigation":145,"path":146,"published_at":147,"question":125,"scraped_at":148,"seo":149,"sitemap":150,"source_id":151,"source_name":152,"source_type":153,"source_url":154,"stem":155,"tags":156,"thumbnail_url":125,"tldr":160,"tweet":125,"unknown_tags":161,"__hash__":162},"summaries\u002Fsummaries\u002Fc116726456b33e2b-tanstack-server-components-opt-in-granularity-beat-summary.md","TanStack Server Components: Opt-In Granularity Beats Next.js",{"provider":7,"model":8,"input_tokens":9,"output_tokens":10,"processing_time_ms":11,"cost_usd":12},"openrouter","x-ai\u002Fgrok-4.1-fast",7116,1537,11991,0.00216905,{"type":14,"value":15,"toc":116},"minimark",[16,21,38,45,49,60,63,67,70,113],[17,18,20],"h2",{"id":19},"opt-in-server-rendering-via-server-functions","Opt-In Server Rendering via Server Functions",[22,23,24,25,29,30,33,34,37],"p",{},"Render React components on the server explicitly by wrapping them in ",[26,27,28],"code",{},"renderServerComponent"," inside a server function, then fetch like JSON data. This runs server-only code (e.g., ",[26,31,32],{},"os.hostname()",", env vars) without changing your client-first app structure. Pass computed values as props to keep components pure and reusable on client or server. In a TanStack Start route loader, await the server function and use ",[26,35,36],{},"loaderData"," to render: the boundary stays clear since server logic lives solely in the function. Replace server components with JSON fetches seamlessly—no framework overhaul required, unlike Next.js's server-first tree where 'use client' opts out interactivity.",[22,39,40,41,44],{},"For multiple components, use ",[26,42,43],{},"Promise.all"," in one server function or return promises directly for streaming. Client-side, wrap in Suspense for skeletons: slow components load independently without blocking the page.",[17,46,48],{"id":47},"composite-components-eliminate-server-controlled-client-trees","Composite Components Eliminate Server-Controlled Client Trees",[22,50,51,52,55,56,59],{},"Avoid nesting 'use client' components inside server renders, which muddies boundaries (e.g., tracing counter logic requires jumping files). Instead, return ",[26,53,54],{},"createCompositeComponent"," from server functions, defining slots for client content. Fetch the source in loaders, then render with ",[26,57,58],{},"\u003CComposite source={greetingSource}>","—server defines structure and data passthrough, but clients fill slots.",[22,61,62],{},"This keeps all client decisions in client code: server sees opaque slots, executes no client functions. Integrates with TanStack Query for caching\u002FCDN simplicity. Result: explicit server\u002Fclient separation, no 'use client' needed for slots.",[17,64,66],{"id":65},"slot-patterns-for-flexible-client-integration","Slot Patterns for Flexible Client Integration",[22,68,69],{},"Use three slot types to inject client components without server knowledge of their identity:",[71,72,73,85,95],"ul",{},[74,75,76,80,81,84],"li",{},[77,78,79],"strong",{},"Children slots",": Pass ",[26,82,83],{},"{children}"," prop; server forwards anything provided (e.g., counter under greeting).",[74,86,87,90,91,94],{},[77,88,89],{},"Render props",": Define function props (e.g., ",[26,92,93],{},"renderActions?: (postId: string, authorId: string) => ReactNode","). Server calls optionally with data (e.g., above post title); client provides function returning component. Opaque to server—runs client-side, avoids double-fetches (author data passes directly).",[74,96,97,100,101,104,105,108,109,112],{},[77,98,99],{},"Component props",": Pass component directly (e.g., ",[26,102,103],{},"PostActions: Component\u003C{postId: string, authorId: string}>","). Server renders ",[26,106,107],{},"\u003CPostActions {...data} \u002F>"," as placeholder. Swap implementations client-side (e.g., ",[26,110,111],{},"FakePostActions"," works identically). Prefer render props if needing data transforms; component props for direct passthrough.",[22,114,115],{},"These solve real issues: targeted actions (like\u002Ffollow) without children dumping at bottom, data sharing without client refetching. Server provides data\u002Fslots; client handles rendering—reverses Next.js logic for better DX and modularity.",{"title":117,"searchDepth":118,"depth":118,"links":119},"",2,[120,121,122],{"id":19,"depth":118,"text":20},{"id":47,"depth":118,"text":48},{"id":65,"depth":118,"text":66},[124],"Software Engineering",null,"md",false,{"content_references":129,"triage":140},[130,135],{"type":131,"title":132,"url":133,"context":134},"tool","TanStack Start Server Components Docs","https:\u002F\u002Ftanstack.com\u002Fstart\u002Flatest\u002Fdocs\u002Fframework\u002Freact\u002Fguide\u002Fserver-components","mentioned",{"type":136,"title":137,"url":138,"context":139},"other","TanStack React Server Components Announcement","https:\u002F\u002Ftanstack.com\u002Fblog\u002Freact-server-components","cited",{"relevance":141,"novelty":142,"quality":141,"actionability":141,"composite":143,"reasoning":144},4,3,3.8,"Category: Design & Frontend. The article discusses practical techniques for rendering React components on the server, addressing a specific pain point for developers looking to optimize their frontend architecture. It provides actionable insights on using `renderServerComponent` and `createCompositeComponent`, which can be directly applied in building AI-powered products.",true,"\u002Fsummaries\u002Fc116726456b33e2b-tanstack-server-components-opt-in-granularity-beat-summary","2026-04-20 22:30:20","2026-04-21 15:16:40",{"title":5,"description":117},{"loc":146},"44549f7a250bdc2f","Better Stack","article","https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=pWxRvFFUHcY","summaries\u002Fc116726456b33e2b-tanstack-server-components-opt-in-granularity-beat-summary",[157,158,159],"frontend","coding","software-engineering","Use renderServerComponent in server functions to render React components on the server granularly, like fetching JSON. Composite components with slots keep client boundaries clean without 'use client' directives.",[159],"txEuohnvndBk3yN4LUpj-Ih9qNEyhx3iGFhMQ45h3_o",[164,167,170,173,176,179,181,183,185,187,189,191,194,196,198,200,202,204,206,208,210,212,215,218,220,222,224,226,228,231,233,235,237,239,241,243,245,247,249,251,253,255,257,259,261,263,265,267,269,271,273,275,277,279,281,283,285,287,289,291,293,295,297,299,301,303,305,307,309,311,313,315,317,319,321,323,325,327,329,331,333,335,337,339,341,343,345,347,349,351,353,355,357,359,361,363,365,367,369,371,373,375,377,379,381,383,385,387,389,391,393,395,397,399,401,403,405,407,409,411,413,415,417,419,421,423,425,427,429,431,433,435,437,439,441,443,445,447,449,451,453,455,457,459,461,463,465,467,469,471,473,475,477,479,481,483,486,488,490,492,494,496,498,500,502,504,506,508,510,512,514,516,518,520,522,524,526,528,530,532,534,536,538,540,542,544,546,548,550,552,554,556,558,560,562,564,566,568,570,572,574,576,578,580,582,584,586,588,590,592,594,596,598,600,602,604,606,608,610,612,614,616,618,620,622,624,626,628,630,632,634,636,638,640,642,644,646,648,650,652,654,656,658,660,662,664,666,668,670,672,674,676,678,680,682,684,686,688,690,692,694,696,698,700,702,704,706,708,710,712,714,716,718,720,722,724,726,728,730,732,734,736,738,740,742,744,746,748,750,752,754,756,758,760,762,764,766,768,770,772,774,776,778,780,782,784,786,788,790,792,794,796,798,800,802,804,806,808,810,812,814,816,818,820,822,824,826,828,830,832,834,836,838,840,842,844,846,848,850,852,854,856,858,860,862,864,866,868,870,872,874,876,878,880,882,884,886,888,890,892,894,896,898,900,902,904,906,908,910,912,914,916,918,920,922,924,926,928,930,932,934,936,938,940,942,944,946,948,950,952,954,956,958,960,962,964,966,968,970,972,974,976,978,980,982,984,986,988,990,992,994,996,998,1000,1002,1004,1006,1008,1010,1012,1014,1016,1018,1020,1022,1024,1026,1028,1030,1032,1034,1036,1038,1040,1042,1044,1046,1048,1050,1052,1054,1056,1058,1060,1062,1064,1066,1068,1070,1072,1074,1076,1078,1080,1082,1084,1086,1088,1090,1092,1094,1096,1098,1100,1102,1104,1106,1108,1110,1112,1114,1116,1118,1120,1122,1124,1126,1128,1130,1132,1134,1136,1138,1140,1142,1144,1146,1148,1150,1152,1154,1156,1158,1160,1162,1164,1166,1168,1170,1172,1174,1176,1178,1180,1182,1184,1186,1188,1190,1192,1194,1196,1198,1200,1202,1204,1206,1208,1210,1212,1214,1216,1218,1220,1222,1224,1226,1228,1230,1232,1234,1236,1238,1240,1242,1244,1246,1248,1250,1252,1254,1256,1258,1260,1262,1264,1266,1268,1270,1272,1274,1276,1278,1280,1282,1284,1286,1288,1290,1292,1294,1296,1298,1300,1302,1304,1306,1308,1310,1312,1314,1316,1318,1320,1322,1324,1326,1328,1330,1332,1334,1336,1338,1340,1342,1344,1346,1348,1350,1352,1354,1356,1358,1360,1362,1364,1366,1368,1370,1372,1374,1376,1378,1380,1382,1384,1386,1388,1390,1392,1394,1396,1398,1400,1402,1404,1406,1408,1410,1412,1414,1416,1418,1420,1422,1424,1426,1428,1430,1432,1434,1436,1438,1440,1442,1444,1446,1448,1450,1452,1454,1456,1458,1460,1462,1464,1466,1468,1470,1472,1474,1476,1478,1480,1482,1484,1486,1488,1490,1492,1494,1496,1498,1500,1502,1504,1506,1508,1510,1512,1514,1516,1518,1520,1522,1524,1526,1528,1530,1532,1534,1536,1538,1540,1542,1544,1546,1548,1550,1552,1554,1556,1558,1560,1562,1564,1566,1568,1570,1572,1574,1576,1578,1580,1582,1584,1586,1588,1590,1592,1594,1596,1598,1600,1602,1604,1606,1608,1610,1612,1614,1616,1618,1620,1622,1624,1626,1628,1630,1632,1634,1636,1638,1640,1642,1644,1646,1648,1650,1652,1654,1656,1658,1660,1662,1664,1666,1668,1670,1672,1674,1676,1678,1680,1682,1684,1686,1688,1690,1692,1694,1696,1698,1700,1702,1704,1706,1708,1710,1712,1714,1716,1718,1720,1722,1724,1726,1728,1730,1732,1734,1736,1738,1740,1742,1744,1746,1748,1750,1752,1754,1756,1758,1760,1762,1764,1766,1768,1770,1772,1774,1776,1778,1780,1782,1784,1786,1788,1790,1792,1794,1796,1798,1800,1802,1804,1806,1808,1810,1812,1814,1816,1818,1820,1822,1824,1826,1828,1830,1832,1834,1836,1838,1840,1842,1844,1846,1848,1850,1852,1854,1856,1858,1860,1862,1864,1866,1868,1870,1872,1874,1876,1878,1880,1882,1884,1886,1888,1890,1892,1894,1896,1898,1900,1902,1904,1906,1908,1910,1912,1914,1916,1918,1920,1922,1924,1926,1928,1930,1932,1934,1936,1938,1940,1942,1944,1946,1948,1950,1952,1954,1956,1958,1960,1962,1964,1966,1968,1970,1972,1974,1976,1978,1980,1982,1984,1986,1988,1990,1992,1994,1996,1998,2000,2002,2004,2006,2008,2010,2012,2014,2016,2018,2020,2022,2024,2026,2028,2030,2032,2034,2036,2038,2040,2042,2044,2046,2048,2050,2052,2054,2056,2058,2060,2062,2064,2066,2068,2070,2072,2074,2076,2078,2080,2082,2084,2086,2088,2090,2092,2094,2096,2098,2100,2102,2104,2106,2108,2110,2112,2114,2116,2118,2120,2122,2124,2126,2128,2130,2132,2134,2136,2138,2140,2142,2144,2146,2148,2150,2152,2154,2156,2158,2160,2162,2164,2166,2168,2170,2172,2174,2176,2178,2180,2182,2184,2186,2188,2190,2192,2194,2196,2198,2200,2202,2204,2206,2208,2210,2212,2214,2216,2218,2220,2222,2224,2226,2228,2230,2232,2234,2236,2238,2240,2242,2244,2246,2248,2250,2252,2254,2256,2258,2260,2262,2264,2266,2268,2270,2272,2274,2276,2278,2280,2282,2284,2286,2288,2290,2292,2294,2296,2298,2300,2302,2304,2306,2308,2310,2312,2314,2316,2318,2320,2322,2324,2326,2328,2330,2332,2334,2336,2338,2340,2342,2344,2346,2348,2350,2352,2354,2356,2358,2360,2362,2364,2366,2368,2370,2372,2374,2376,2378,2380,2382,2384,2386,2388,2390,2392,2394,2396,2398,2400,2402,2404,2406,2408,2410,2412,2414,2416,2418,2420,2422,2424,2426,2428,2430,2432,2434,2436,2438,2440,2442,2444,2446,2448,2450,2452,2454,2456,2458,2460,2462,2464,2466,2468,2470,2472,2474,2476,2478,2480,2482,2484,2486,2488,2490,2492,2494,2496,2498,2500,2502,2504,2506,2508,2510,2512,2514,2516,2518,2520,2522,2524,2526,2528,2530,2532,2534,2536,2538,2540,2542,2544,2546,2548,2550,2552,2554,2556,2558,2560,2562,2564,2566,2568,2570,2572,2574,2576,2578,2580,2582,2584,2586,2588,2590,2592,2594,2596,2598,2600,2602,2604,2606,2608,2610,2612,2614,2616,2618,2620,2622,2624,2626,2628,2630,2632,2634,2636,2638,2640,2642,2644,2646,2648,2650,2652,2654,2656,2658,2660,2662,2664,2666,2668,2670,2672,2674,2676,2678,2680,2682,2684,2686,2688,2690,2692,2694,2696,2698,2700,2702,2704,2706,2708,2710,2712,2714,2716,2718,2720,2722,2724,2726,2728,2730,2732,2734,2736,2738,2740,2742,2744,2746,2748,2750,2752,2754,2756,2758,2760,2762,2764,2766,2768,2770,2772,2774,2776,2778,2780,2782,2784,2786,2788,2790,2792,2794,2796,2798,2800,2802,2804,2806,2808,2810,2812,2814,2816,2818,2820,2822,2824,2826,2828,2830,2832,2834,2836,2838,2840,2842,2844,2846,2848,2850,2852,2854,2856,2858,2860,2862,2864,2866,2868,2870,2872,2874,2876,2878,2880,2882,2884,2886,2888,2890,2892,2894,2896,2898,2900,2902,2904,2906,2908,2910,2912,2914,2916,2918,2920,2922,2924,2926,2928,2930,2932,2934,2936,2938,2940,2942,2944,2946,2948,2950,2952,2954,2956,2958,2960,2962,2964,2966,2968,2970,2972,2974,2976,2978,2980,2982,2984,2986,2988,2990,2992,2994,2996,2998,3000,3002,3004,3006,3008,3010,3012,3014,3016,3018,3020,3022,3024,3026,3028,3030,3032,3034,3036,3038,3040,3042,3044,3046,3048,3050,3052,3054,3056,3058,3060,3062,3064,3066,3068,3070,3072,3074,3076,3078,3080,3082,3084,3086,3088,3090,3092,3094,3096,3098,3100,3102,3104,3106,3108,3110,3112,3114,3116,3118,3120,3122,3124,3126,3128,3130,3132,3134,3136,3138,3140,3142,3144,3146,3148,3150,3152,3154,3156,3158,3160,3162,3164,3166,3168,3170,3172,3174,3176,3178,3180,3182,3184,3186,3188,3190,3192,3194,3196,3198,3200,3202,3204,3206,3208,3210,3212,3214,3216,3218,3220,3222,3224,3226,3228,3230,3232,3234,3236,3238,3240,3242,3244,3246,3248,3250,3252,3254,3256,3258,3260,3262,3264,3266,3268,3270,3272,3274,3276,3278,3280,3282,3284,3286,3288,3290,3292,3294,3296,3298,3300,3302,3304,3306,3308,3310,3312,3314,3316,3318,3320,3322,3324,3326,3328,3330,3332,3334,3336,3338,3340,3342,3344,3346,3348,3350,3352,3354,3356,3358,3360,3362,3364,3366,3368,3370,3372,3374,3376,3378,3380,3382,3384,3386,3388,3390,3392,3394,3396,3398,3400,3402,3404,3406,3408,3410,3412,3414,3416,3418,3420,3422,3424,3426,3428,3430,3432,3434,3436,3438,3440,3442,3444,3446,3448,3450,3452,3454,3456,3458,3460,3462,3464,3466,3468,3470,3472,3474,3476,3478,3480,3482,3484,3486,3488,3490,3492,3494,3496,3498,3500,3502,3504,3506,3508,3510,3512,3514,3516,3518,3520,3522,3524,3526,3528,3530,3532,3534,3536,3538,3540,3542,3544,3546,3548,3550,3552,3554,3556,3558,3560,3562,3564,3566,3568,3570,3572,3574,3576,3578,3580,3582,3584,3586,3588,3590,3592,3594,3596,3598,3600,3602,3604,3606,3608,3610,3612,3614,3616,3618,3620,3622,3624,3626,3628,3630,3632,3634,3636,3638,3640,3642,3644,3646,3648,3650,3652,3654,3656,3658,3660,3662,3664,3666,3668,3670,3672,3674,3676,3678,3680,3682,3684,3686,3688,3690,3692,3694,3696,3698,3700,3702,3704,3706,3708,3710,3712,3714,3716,3718,3720,3722,3724,3726,3728,3730],{"categories":165},[166],"Developer Productivity",{"categories":168},[169],"Business & SaaS",{"categories":171},[172],"AI & LLMs",{"categories":174},[175],"AI Automation",{"categories":177},[178],"Product Strategy",{"categories":180},[172],{"categories":182},[166],{"categories":184},[169],{"categories":186},[],{"categories":188},[172],{"categories":190},[],{"categories":192},[193],"AI News & Trends",{"categories":195},[175],{"categories":197},[193],{"categories":199},[175],{"categories":201},[175],{"categories":203},[172],{"categories":205},[172],{"categories":207},[193],{"categories":209},[172],{"categories":211},[],{"categories":213},[214],"Design & Frontend",{"categories":216},[217],"Data Science & Visualization",{"categories":219},[193],{"categories":221},[],{"categories":223},[124],{"categories":225},[172],{"categories":227},[175],{"categories":229},[230],"Marketing & Growth",{"categories":232},[172],{"categories":234},[175],{"categories":236},[],{"categories":238},[],{"categories":240},[214],{"categories":242},[175],{"categories":244},[166],{"categories":246},[214],{"categories":248},[172],{"categories":250},[175],{"categories":252},[193],{"categories":254},[],{"categories":256},[],{"categories":258},[175],{"categories":260},[124],{"categories":262},[],{"categories":264},[169],{"categories":266},[],{"categories":268},[],{"categories":270},[175],{"categories":272},[175],{"categories":274},[172],{"categories":276},[],{"categories":278},[124],{"categories":280},[],{"categories":282},[],{"categories":284},[],{"categories":286},[172],{"categories":288},[230],{"categories":290},[214],{"categories":292},[214],{"categories":294},[172],{"categories":296},[175],{"categories":298},[172],{"categories":300},[172],{"categories":302},[175],{"categories":304},[175],{"categories":306},[217],{"categories":308},[193],{"categories":310},[175],{"categories":312},[230],{"categories":314},[175],{"categories":316},[178],{"categories":318},[],{"categories":320},[175],{"categories":322},[],{"categories":324},[175],{"categories":326},[124],{"categories":328},[214],{"categories":330},[172],{"categories":332},[],{"categories":334},[],{"categories":336},[175],{"categories":338},[],{"categories":340},[172],{"categories":342},[],{"categories":344},[166],{"categories":346},[124],{"categories":348},[169],{"categories":350},[193],{"categories":352},[172],{"categories":354},[],{"categories":356},[172],{"categories":358},[],{"categories":360},[124],{"categories":362},[217],{"categories":364},[],{"categories":366},[172],{"categories":368},[214],{"categories":370},[],{"categories":372},[214],{"categories":374},[175],{"categories":376},[],{"categories":378},[175],{"categories":380},[193],{"categories":382},[172],{"categories":384},[],{"categories":386},[175],{"categories":388},[172],{"categories":390},[178],{"categories":392},[],{"categories":394},[172],{"categories":396},[175],{"categories":398},[175],{"categories":400},[],{"categories":402},[217],{"categories":404},[172],{"categories":406},[],{"categories":408},[166],{"categories":410},[169],{"categories":412},[172],{"categories":414},[175],{"categories":416},[124],{"categories":418},[172],{"categories":420},[],{"categories":422},[],{"categories":424},[172],{"categories":426},[],{"categories":428},[214],{"categories":430},[],{"categories":432},[172],{"categories":434},[],{"categories":436},[175],{"categories":438},[172],{"categories":440},[214],{"categories":442},[],{"categories":444},[172],{"categories":446},[172],{"categories":448},[169],{"categories":450},[175],{"categories":452},[172],{"categories":454},[214],{"categories":456},[175],{"categories":458},[],{"categories":460},[],{"categories":462},[193],{"categories":464},[],{"categories":466},[172],{"categories":468},[169,230],{"categories":470},[],{"categories":472},[172],{"categories":474},[],{"categories":476},[],{"categories":478},[172],{"categories":480},[],{"categories":482},[172],{"categories":484},[485],"DevOps & Cloud",{"categories":487},[],{"categories":489},[193],{"categories":491},[214],{"categories":493},[],{"categories":495},[193],{"categories":497},[193],{"categories":499},[172],{"categories":501},[230],{"categories":503},[],{"categories":505},[169],{"categories":507},[],{"categories":509},[172,485],{"categories":511},[172],{"categories":513},[172],{"categories":515},[175],{"categories":517},[172,124],{"categories":519},[217],{"categories":521},[172],{"categories":523},[230],{"categories":525},[175],{"categories":527},[175],{"categories":529},[],{"categories":531},[175],{"categories":533},[172,169],{"categories":535},[],{"categories":537},[214],{"categories":539},[214],{"categories":541},[],{"categories":543},[],{"categories":545},[193],{"categories":547},[],{"categories":549},[166],{"categories":551},[124],{"categories":553},[172],{"categories":555},[214],{"categories":557},[175],{"categories":559},[124],{"categories":561},[193],{"categories":563},[214],{"categories":565},[],{"categories":567},[172],{"categories":569},[172],{"categories":571},[172],{"categories":573},[193],{"categories":575},[166],{"categories":577},[172],{"categories":579},[175],{"categories":581},[485],{"categories":583},[214],{"categories":585},[175],{"categories":587},[],{"categories":589},[],{"categories":591},[214],{"categories":593},[193],{"categories":595},[217],{"categories":597},[],{"categories":599},[172],{"categories":601},[172],{"categories":603},[169],{"categories":605},[172],{"categories":607},[172],{"categories":609},[193],{"categories":611},[],{"categories":613},[175],{"categories":615},[124],{"categories":617},[],{"categories":619},[172],{"categories":621},[172],{"categories":623},[175],{"categories":625},[],{"categories":627},[],{"categories":629},[172],{"categories":631},[],{"categories":633},[169],{"categories":635},[175],{"categories":637},[],{"categories":639},[166],{"categories":641},[172],{"categories":643},[169],{"categories":645},[193],{"categories":647},[],{"categories":649},[],{"categories":651},[],{"categories":653},[193],{"categories":655},[193],{"categories":657},[],{"categories":659},[],{"categories":661},[169],{"categories":663},[],{"categories":665},[],{"categories":667},[166],{"categories":669},[],{"categories":671},[230],{"categories":673},[175],{"categories":675},[169],{"categories":677},[175],{"categories":679},[],{"categories":681},[178],{"categories":683},[214],{"categories":685},[124],{"categories":687},[172],{"categories":689},[175],{"categories":691},[169],{"categories":693},[172],{"categories":695},[],{"categories":697},[],{"categories":699},[124],{"categories":701},[217],{"categories":703},[178],{"categories":705},[175],{"categories":707},[172],{"categories":709},[],{"categories":711},[485],{"categories":713},[],{"categories":715},[175],{"categories":717},[],{"categories":719},[],{"categories":721},[172],{"categories":723},[214],{"categories":725},[230],{"categories":727},[175],{"categories":729},[],{"categories":731},[166],{"categories":733},[],{"categories":735},[193],{"categories":737},[172,485],{"categories":739},[193],{"categories":741},[172],{"categories":743},[169],{"categories":745},[172],{"categories":747},[],{"categories":749},[169],{"categories":751},[],{"categories":753},[124],{"categories":755},[214],{"categories":757},[193],{"categories":759},[217],{"categories":761},[166],{"categories":763},[172],{"categories":765},[124],{"categories":767},[],{"categories":769},[],{"categories":771},[178],{"categories":773},[],{"categories":775},[172],{"categories":777},[],{"categories":779},[214],{"categories":781},[214],{"categories":783},[214],{"categories":785},[],{"categories":787},[],{"categories":789},[193],{"categories":791},[175],{"categories":793},[172],{"categories":795},[172],{"categories":797},[172],{"categories":799},[169],{"categories":801},[172],{"categories":803},[],{"categories":805},[124],{"categories":807},[124],{"categories":809},[169],{"categories":811},[],{"categories":813},[172],{"categories":815},[172],{"categories":817},[169],{"categories":819},[193],{"categories":821},[230],{"categories":823},[175],{"categories":825},[],{"categories":827},[214],{"categories":829},[],{"categories":831},[172],{"categories":833},[],{"categories":835},[169],{"categories":837},[175],{"categories":839},[],{"categories":841},[485],{"categories":843},[217],{"categories":845},[124],{"categories":847},[230],{"categories":849},[124],{"categories":851},[175],{"categories":853},[],{"categories":855},[],{"categories":857},[175],{"categories":859},[166],{"categories":861},[175],{"categories":863},[178],{"categories":865},[169],{"categories":867},[],{"categories":869},[172],{"categories":871},[178],{"categories":873},[172],{"categories":875},[172],{"categories":877},[230],{"categories":879},[214],{"categories":881},[175],{"categories":883},[],{"categories":885},[],{"categories":887},[485],{"categories":889},[124],{"categories":891},[],{"categories":893},[175],{"categories":895},[172],{"categories":897},[214,172],{"categories":899},[166],{"categories":901},[],{"categories":903},[172],{"categories":905},[166],{"categories":907},[214],{"categories":909},[175],{"categories":911},[124],{"categories":913},[],{"categories":915},[172],{"categories":917},[],{"categories":919},[166],{"categories":921},[],{"categories":923},[175],{"categories":925},[178],{"categories":927},[172],{"categories":929},[172],{"categories":931},[214],{"categories":933},[175],{"categories":935},[485],{"categories":937},[214],{"categories":939},[175],{"categories":941},[172],{"categories":943},[172],{"categories":945},[172],{"categories":947},[193],{"categories":949},[],{"categories":951},[178],{"categories":953},[175],{"categories":955},[214],{"categories":957},[175],{"categories":959},[124],{"categories":961},[214],{"categories":963},[175],{"categories":965},[193],{"categories":967},[],{"categories":969},[172],{"categories":971},[214],{"categories":973},[172],{"categories":975},[166],{"categories":977},[193],{"categories":979},[172],{"categories":981},[230],{"categories":983},[172],{"categories":985},[172],{"categories":987},[175],{"categories":989},[175],{"categories":991},[172],{"categories":993},[175],{"categories":995},[214],{"categories":997},[172],{"categories":999},[],{"categories":1001},[],{"categories":1003},[124],{"categories":1005},[],{"categories":1007},[166],{"categories":1009},[485],{"categories":1011},[],{"categories":1013},[166],{"categories":1015},[169],{"categories":1017},[230],{"categories":1019},[],{"categories":1021},[169],{"categories":1023},[],{"categories":1025},[],{"categories":1027},[],{"categories":1029},[],{"categories":1031},[],{"categories":1033},[172],{"categories":1035},[175],{"categories":1037},[485],{"categories":1039},[166],{"categories":1041},[172],{"categories":1043},[124],{"categories":1045},[178],{"categories":1047},[172],{"categories":1049},[230],{"categories":1051},[172],{"categories":1053},[172],{"categories":1055},[172],{"categories":1057},[172,166],{"categories":1059},[124],{"categories":1061},[124],{"categories":1063},[214],{"categories":1065},[172],{"categories":1067},[],{"categories":1069},[],{"categories":1071},[],{"categories":1073},[124],{"categories":1075},[217],{"categories":1077},[193],{"categories":1079},[214],{"categories":1081},[],{"categories":1083},[172],{"categories":1085},[172],{"categories":1087},[],{"categories":1089},[],{"categories":1091},[175],{"categories":1093},[172],{"categories":1095},[169],{"categories":1097},[],{"categories":1099},[166],{"categories":1101},[172],{"categories":1103},[166],{"categories":1105},[172],{"categories":1107},[124],{"categories":1109},[230],{"categories":1111},[172,214],{"categories":1113},[193],{"categories":1115},[214],{"categories":1117},[],{"categories":1119},[485],{"categories":1121},[214],{"categories":1123},[175],{"categories":1125},[],{"categories":1127},[],{"categories":1129},[],{"categories":1131},[],{"categories":1133},[124],{"categories":1135},[175],{"categories":1137},[175],{"categories":1139},[172],{"categories":1141},[172],{"categories":1143},[],{"categories":1145},[214],{"categories":1147},[],{"categories":1149},[],{"categories":1151},[175],{"categories":1153},[],{"categories":1155},[],{"categories":1157},[230],{"categories":1159},[230],{"categories":1161},[175],{"categories":1163},[],{"categories":1165},[172],{"categories":1167},[172],{"categories":1169},[124],{"categories":1171},[214],{"categories":1173},[214],{"categories":1175},[175],{"categories":1177},[166],{"categories":1179},[172],{"categories":1181},[214],{"categories":1183},[214],{"categories":1185},[175],{"categories":1187},[175],{"categories":1189},[172],{"categories":1191},[],{"categories":1193},[],{"categories":1195},[172],{"categories":1197},[175],{"categories":1199},[193],{"categories":1201},[124],{"categories":1203},[166],{"categories":1205},[172],{"categories":1207},[],{"categories":1209},[175],{"categories":1211},[175],{"categories":1213},[],{"categories":1215},[166],{"categories":1217},[172],{"categories":1219},[166],{"categories":1221},[166],{"categories":1223},[],{"categories":1225},[],{"categories":1227},[175],{"categories":1229},[175],{"categories":1231},[172],{"categories":1233},[172],{"categories":1235},[193],{"categories":1237},[217],{"categories":1239},[178],{"categories":1241},[193],{"categories":1243},[214],{"categories":1245},[],{"categories":1247},[193],{"categories":1249},[],{"categories":1251},[],{"categories":1253},[],{"categories":1255},[],{"categories":1257},[124],{"categories":1259},[217],{"categories":1261},[],{"categories":1263},[172],{"categories":1265},[172],{"categories":1267},[217],{"categories":1269},[124],{"categories":1271},[],{"categories":1273},[],{"categories":1275},[175],{"categories":1277},[193],{"categories":1279},[193],{"categories":1281},[175],{"categories":1283},[166],{"categories":1285},[172,485],{"categories":1287},[],{"categories":1289},[214],{"categories":1291},[166],{"categories":1293},[175],{"categories":1295},[214],{"categories":1297},[],{"categories":1299},[175],{"categories":1301},[175],{"categories":1303},[172],{"categories":1305},[230],{"categories":1307},[124],{"categories":1309},[214],{"categories":1311},[],{"categories":1313},[175],{"categories":1315},[172],{"categories":1317},[175],{"categories":1319},[175],{"categories":1321},[175],{"categories":1323},[230],{"categories":1325},[175],{"categories":1327},[172],{"categories":1329},[],{"categories":1331},[230],{"categories":1333},[193],{"categories":1335},[175],{"categories":1337},[],{"categories":1339},[],{"categories":1341},[172],{"categories":1343},[175],{"categories":1345},[193],{"categories":1347},[175],{"categories":1349},[],{"categories":1351},[],{"categories":1353},[],{"categories":1355},[175],{"categories":1357},[],{"categories":1359},[],{"categories":1361},[217],{"categories":1363},[172],{"categories":1365},[217],{"categories":1367},[193],{"categories":1369},[172],{"categories":1371},[172],{"categories":1373},[175],{"categories":1375},[172],{"categories":1377},[],{"categories":1379},[],{"categories":1381},[485],{"categories":1383},[],{"categories":1385},[],{"categories":1387},[166],{"categories":1389},[],{"categories":1391},[],{"categories":1393},[],{"categories":1395},[],{"categories":1397},[124],{"categories":1399},[193],{"categories":1401},[230],{"categories":1403},[169],{"categories":1405},[172],{"categories":1407},[172],{"categories":1409},[169],{"categories":1411},[],{"categories":1413},[214],{"categories":1415},[175],{"categories":1417},[169],{"categories":1419},[172],{"categories":1421},[172],{"categories":1423},[166],{"categories":1425},[],{"categories":1427},[166],{"categories":1429},[172],{"categories":1431},[230],{"categories":1433},[175],{"categories":1435},[193],{"categories":1437},[169],{"categories":1439},[172],{"categories":1441},[175],{"categories":1443},[],{"categories":1445},[172],{"categories":1447},[166],{"categories":1449},[172],{"categories":1451},[],{"categories":1453},[193],{"categories":1455},[172],{"categories":1457},[],{"categories":1459},[169],{"categories":1461},[172],{"categories":1463},[],{"categories":1465},[],{"categories":1467},[],{"categories":1469},[172],{"categories":1471},[],{"categories":1473},[485],{"categories":1475},[172],{"categories":1477},[],{"categories":1479},[172],{"categories":1481},[172],{"categories":1483},[172],{"categories":1485},[172,485],{"categories":1487},[172],{"categories":1489},[172],{"categories":1491},[214],{"categories":1493},[175],{"categories":1495},[],{"categories":1497},[175],{"categories":1499},[172],{"categories":1501},[172],{"categories":1503},[172],{"categories":1505},[166],{"categories":1507},[166],{"categories":1509},[124],{"categories":1511},[214],{"categories":1513},[175],{"categories":1515},[],{"categories":1517},[172],{"categories":1519},[193],{"categories":1521},[172],{"categories":1523},[169],{"categories":1525},[],{"categories":1527},[485],{"categories":1529},[214],{"categories":1531},[214],{"categories":1533},[175],{"categories":1535},[193],{"categories":1537},[175],{"categories":1539},[172],{"categories":1541},[],{"categories":1543},[172],{"categories":1545},[],{"categories":1547},[],{"categories":1549},[172],{"categories":1551},[172],{"categories":1553},[172],{"categories":1555},[175],{"categories":1557},[172],{"categories":1559},[],{"categories":1561},[217],{"categories":1563},[175],{"categories":1565},[],{"categories":1567},[172],{"categories":1569},[193],{"categories":1571},[],{"categories":1573},[214],{"categories":1575},[485],{"categories":1577},[193],{"categories":1579},[124],{"categories":1581},[124],{"categories":1583},[193],{"categories":1585},[193],{"categories":1587},[485],{"categories":1589},[],{"categories":1591},[193],{"categories":1593},[172],{"categories":1595},[166],{"categories":1597},[193],{"categories":1599},[],{"categories":1601},[217],{"categories":1603},[193],{"categories":1605},[124],{"categories":1607},[193],{"categories":1609},[485],{"categories":1611},[172],{"categories":1613},[172],{"categories":1615},[],{"categories":1617},[169],{"categories":1619},[],{"categories":1621},[],{"categories":1623},[172],{"categories":1625},[172],{"categories":1627},[172],{"categories":1629},[172],{"categories":1631},[],{"categories":1633},[217],{"categories":1635},[166],{"categories":1637},[],{"categories":1639},[172],{"categories":1641},[172],{"categories":1643},[485],{"categories":1645},[485],{"categories":1647},[],{"categories":1649},[175],{"categories":1651},[193],{"categories":1653},[193],{"categories":1655},[172],{"categories":1657},[175],{"categories":1659},[],{"categories":1661},[214],{"categories":1663},[172],{"categories":1665},[172],{"categories":1667},[],{"categories":1669},[],{"categories":1671},[485],{"categories":1673},[172],{"categories":1675},[124],{"categories":1677},[169],{"categories":1679},[172],{"categories":1681},[],{"categories":1683},[175],{"categories":1685},[166],{"categories":1687},[166],{"categories":1689},[],{"categories":1691},[172],{"categories":1693},[214],{"categories":1695},[175],{"categories":1697},[],{"categories":1699},[172],{"categories":1701},[172],{"categories":1703},[175],{"categories":1705},[],{"categories":1707},[175],{"categories":1709},[124],{"categories":1711},[],{"categories":1713},[172],{"categories":1715},[],{"categories":1717},[172],{"categories":1719},[],{"categories":1721},[172],{"categories":1723},[172],{"categories":1725},[],{"categories":1727},[172],{"categories":1729},[193],{"categories":1731},[172],{"categories":1733},[172],{"categories":1735},[166],{"categories":1737},[172],{"categories":1739},[193],{"categories":1741},[175],{"categories":1743},[],{"categories":1745},[172],{"categories":1747},[230],{"categories":1749},[],{"categories":1751},[],{"categories":1753},[],{"categories":1755},[166],{"categories":1757},[193],{"categories":1759},[175],{"categories":1761},[172],{"categories":1763},[214],{"categories":1765},[175],{"categories":1767},[],{"categories":1769},[175],{"categories":1771},[],{"categories":1773},[172],{"categories":1775},[175],{"categories":1777},[172],{"categories":1779},[],{"categories":1781},[172],{"categories":1783},[172],{"categories":1785},[193],{"categories":1787},[214],{"categories":1789},[175],{"categories":1791},[214],{"categories":1793},[169],{"categories":1795},[],{"categories":1797},[],{"categories":1799},[172],{"categories":1801},[166],{"categories":1803},[193],{"categories":1805},[],{"categories":1807},[],{"categories":1809},[124],{"categories":1811},[214],{"categories":1813},[],{"categories":1815},[172],{"categories":1817},[],{"categories":1819},[230],{"categories":1821},[172],{"categories":1823},[485],{"categories":1825},[124],{"categories":1827},[],{"categories":1829},[175],{"categories":1831},[172],{"categories":1833},[175],{"categories":1835},[175],{"categories":1837},[172],{"categories":1839},[],{"categories":1841},[166],{"categories":1843},[172],{"categories":1845},[169],{"categories":1847},[124],{"categories":1849},[214],{"categories":1851},[],{"categories":1853},[],{"categories":1855},[],{"categories":1857},[175],{"categories":1859},[214],{"categories":1861},[193],{"categories":1863},[172],{"categories":1865},[193],{"categories":1867},[214],{"categories":1869},[],{"categories":1871},[214],{"categories":1873},[193],{"categories":1875},[169],{"categories":1877},[172],{"categories":1879},[193],{"categories":1881},[230],{"categories":1883},[],{"categories":1885},[],{"categories":1887},[217],{"categories":1889},[172,124],{"categories":1891},[193],{"categories":1893},[172],{"categories":1895},[175],{"categories":1897},[175],{"categories":1899},[172],{"categories":1901},[],{"categories":1903},[124],{"categories":1905},[172],{"categories":1907},[217],{"categories":1909},[175],{"categories":1911},[230],{"categories":1913},[485],{"categories":1915},[],{"categories":1917},[166],{"categories":1919},[175],{"categories":1921},[175],{"categories":1923},[124],{"categories":1925},[172],{"categories":1927},[172],{"categories":1929},[],{"categories":1931},[],{"categories":1933},[],{"categories":1935},[485],{"categories":1937},[193],{"categories":1939},[172],{"categories":1941},[172],{"categories":1943},[172],{"categories":1945},[],{"categories":1947},[217],{"categories":1949},[169],{"categories":1951},[],{"categories":1953},[175],{"categories":1955},[485],{"categories":1957},[],{"categories":1959},[214],{"categories":1961},[214],{"categories":1963},[],{"categories":1965},[124],{"categories":1967},[214],{"categories":1969},[172],{"categories":1971},[],{"categories":1973},[193],{"categories":1975},[172],{"categories":1977},[214],{"categories":1979},[175],{"categories":1981},[193],{"categories":1983},[],{"categories":1985},[175],{"categories":1987},[214],{"categories":1989},[172],{"categories":1991},[],{"categories":1993},[172],{"categories":1995},[172],{"categories":1997},[485],{"categories":1999},[193],{"categories":2001},[217],{"categories":2003},[217],{"categories":2005},[],{"categories":2007},[],{"categories":2009},[],{"categories":2011},[175],{"categories":2013},[124],{"categories":2015},[124],{"categories":2017},[],{"categories":2019},[],{"categories":2021},[172],{"categories":2023},[],{"categories":2025},[175],{"categories":2027},[172],{"categories":2029},[],{"categories":2031},[172],{"categories":2033},[169],{"categories":2035},[172],{"categories":2037},[230],{"categories":2039},[175],{"categories":2041},[172],{"categories":2043},[124],{"categories":2045},[193],{"categories":2047},[175],{"categories":2049},[],{"categories":2051},[193],{"categories":2053},[175],{"categories":2055},[175],{"categories":2057},[],{"categories":2059},[169],{"categories":2061},[175],{"categories":2063},[],{"categories":2065},[172],{"categories":2067},[166],{"categories":2069},[193],{"categories":2071},[485],{"categories":2073},[175],{"categories":2075},[175],{"categories":2077},[166],{"categories":2079},[172],{"categories":2081},[],{"categories":2083},[],{"categories":2085},[214],{"categories":2087},[172,169],{"categories":2089},[],{"categories":2091},[166],{"categories":2093},[217],{"categories":2095},[172],{"categories":2097},[124],{"categories":2099},[172],{"categories":2101},[175],{"categories":2103},[172],{"categories":2105},[172],{"categories":2107},[193],{"categories":2109},[175],{"categories":2111},[],{"categories":2113},[],{"categories":2115},[175],{"categories":2117},[172],{"categories":2119},[485],{"categories":2121},[],{"categories":2123},[172],{"categories":2125},[175],{"categories":2127},[],{"categories":2129},[172],{"categories":2131},[230],{"categories":2133},[217],{"categories":2135},[175],{"categories":2137},[172],{"categories":2139},[485],{"categories":2141},[],{"categories":2143},[172],{"categories":2145},[230],{"categories":2147},[214],{"categories":2149},[172],{"categories":2151},[],{"categories":2153},[230],{"categories":2155},[193],{"categories":2157},[172],{"categories":2159},[172],{"categories":2161},[166],{"categories":2163},[],{"categories":2165},[],{"categories":2167},[214],{"categories":2169},[172],{"categories":2171},[217],{"categories":2173},[230],{"categories":2175},[230],{"categories":2177},[193],{"categories":2179},[],{"categories":2181},[],{"categories":2183},[172],{"categories":2185},[],{"categories":2187},[172,124],{"categories":2189},[193],{"categories":2191},[175],{"categories":2193},[124],{"categories":2195},[172],{"categories":2197},[166],{"categories":2199},[],{"categories":2201},[],{"categories":2203},[166],{"categories":2205},[230],{"categories":2207},[172],{"categories":2209},[],{"categories":2211},[214,172],{"categories":2213},[485],{"categories":2215},[166],{"categories":2217},[],{"categories":2219},[169],{"categories":2221},[169],{"categories":2223},[172],{"categories":2225},[124],{"categories":2227},[175],{"categories":2229},[193],{"categories":2231},[230],{"categories":2233},[214],{"categories":2235},[172],{"categories":2237},[172],{"categories":2239},[172],{"categories":2241},[166],{"categories":2243},[172],{"categories":2245},[175],{"categories":2247},[193],{"categories":2249},[],{"categories":2251},[],{"categories":2253},[217],{"categories":2255},[124],{"categories":2257},[172],{"categories":2259},[214],{"categories":2261},[217],{"categories":2263},[172],{"categories":2265},[172],{"categories":2267},[175],{"categories":2269},[175],{"categories":2271},[172,169],{"categories":2273},[],{"categories":2275},[214],{"categories":2277},[],{"categories":2279},[172],{"categories":2281},[193],{"categories":2283},[166],{"categories":2285},[166],{"categories":2287},[175],{"categories":2289},[172],{"categories":2291},[169],{"categories":2293},[124],{"categories":2295},[230],{"categories":2297},[],{"categories":2299},[193],{"categories":2301},[172],{"categories":2303},[172],{"categories":2305},[193],{"categories":2307},[124],{"categories":2309},[172],{"categories":2311},[175],{"categories":2313},[193],{"categories":2315},[172],{"categories":2317},[214],{"categories":2319},[172],{"categories":2321},[172],{"categories":2323},[485],{"categories":2325},[178],{"categories":2327},[175],{"categories":2329},[172],{"categories":2331},[193],{"categories":2333},[175],{"categories":2335},[230],{"categories":2337},[172],{"categories":2339},[],{"categories":2341},[172],{"categories":2343},[],{"categories":2345},[],{"categories":2347},[],{"categories":2349},[169],{"categories":2351},[172],{"categories":2353},[175],{"categories":2355},[193],{"categories":2357},[193],{"categories":2359},[193],{"categories":2361},[193],{"categories":2363},[],{"categories":2365},[166],{"categories":2367},[175],{"categories":2369},[193],{"categories":2371},[166],{"categories":2373},[175],{"categories":2375},[172],{"categories":2377},[172,175],{"categories":2379},[175],{"categories":2381},[485],{"categories":2383},[193],{"categories":2385},[193],{"categories":2387},[175],{"categories":2389},[172],{"categories":2391},[],{"categories":2393},[193],{"categories":2395},[230],{"categories":2397},[166],{"categories":2399},[172],{"categories":2401},[172],{"categories":2403},[],{"categories":2405},[124],{"categories":2407},[],{"categories":2409},[166],{"categories":2411},[175],{"categories":2413},[193],{"categories":2415},[172],{"categories":2417},[193],{"categories":2419},[166],{"categories":2421},[193],{"categories":2423},[193],{"categories":2425},[],{"categories":2427},[169],{"categories":2429},[175],{"categories":2431},[193],{"categories":2433},[193],{"categories":2435},[193],{"categories":2437},[193],{"categories":2439},[193],{"categories":2441},[193],{"categories":2443},[193],{"categories":2445},[193],{"categories":2447},[193],{"categories":2449},[193],{"categories":2451},[217],{"categories":2453},[166],{"categories":2455},[172],{"categories":2457},[172],{"categories":2459},[],{"categories":2461},[172,166],{"categories":2463},[],{"categories":2465},[175],{"categories":2467},[193],{"categories":2469},[175],{"categories":2471},[172],{"categories":2473},[172],{"categories":2475},[172],{"categories":2477},[172],{"categories":2479},[172],{"categories":2481},[175],{"categories":2483},[169],{"categories":2485},[214],{"categories":2487},[193],{"categories":2489},[172],{"categories":2491},[],{"categories":2493},[],{"categories":2495},[175],{"categories":2497},[214],{"categories":2499},[172],{"categories":2501},[],{"categories":2503},[],{"categories":2505},[230],{"categories":2507},[172],{"categories":2509},[],{"categories":2511},[],{"categories":2513},[166],{"categories":2515},[169],{"categories":2517},[172],{"categories":2519},[169],{"categories":2521},[214],{"categories":2523},[],{"categories":2525},[193],{"categories":2527},[],{"categories":2529},[214],{"categories":2531},[172],{"categories":2533},[230],{"categories":2535},[],{"categories":2537},[230],{"categories":2539},[],{"categories":2541},[],{"categories":2543},[175],{"categories":2545},[],{"categories":2547},[169],{"categories":2549},[166],{"categories":2551},[214],{"categories":2553},[124],{"categories":2555},[],{"categories":2557},[],{"categories":2559},[172],{"categories":2561},[166],{"categories":2563},[230],{"categories":2565},[],{"categories":2567},[175],{"categories":2569},[175],{"categories":2571},[193],{"categories":2573},[172],{"categories":2575},[175],{"categories":2577},[172],{"categories":2579},[175],{"categories":2581},[172],{"categories":2583},[178],{"categories":2585},[193],{"categories":2587},[],{"categories":2589},[230],{"categories":2591},[124],{"categories":2593},[175],{"categories":2595},[],{"categories":2597},[172],{"categories":2599},[175],{"categories":2601},[169],{"categories":2603},[166],{"categories":2605},[172],{"categories":2607},[214],{"categories":2609},[124],{"categories":2611},[124],{"categories":2613},[172],{"categories":2615},[217],{"categories":2617},[172],{"categories":2619},[175],{"categories":2621},[169],{"categories":2623},[175],{"categories":2625},[172],{"categories":2627},[172],{"categories":2629},[175],{"categories":2631},[193],{"categories":2633},[],{"categories":2635},[166],{"categories":2637},[172],{"categories":2639},[175],{"categories":2641},[172],{"categories":2643},[172],{"categories":2645},[],{"categories":2647},[214],{"categories":2649},[169],{"categories":2651},[193],{"categories":2653},[172],{"categories":2655},[172],{"categories":2657},[214],{"categories":2659},[230],{"categories":2661},[217],{"categories":2663},[172],{"categories":2665},[193],{"categories":2667},[172],{"categories":2669},[175],{"categories":2671},[485],{"categories":2673},[172],{"categories":2675},[175],{"categories":2677},[217],{"categories":2679},[],{"categories":2681},[175],{"categories":2683},[124],{"categories":2685},[214],{"categories":2687},[172],{"categories":2689},[166],{"categories":2691},[169],{"categories":2693},[124],{"categories":2695},[],{"categories":2697},[175],{"categories":2699},[172],{"categories":2701},[],{"categories":2703},[193],{"categories":2705},[],{"categories":2707},[193],{"categories":2709},[172],{"categories":2711},[175],{"categories":2713},[175],{"categories":2715},[175],{"categories":2717},[],{"categories":2719},[],{"categories":2721},[172],{"categories":2723},[172],{"categories":2725},[],{"categories":2727},[214],{"categories":2729},[175],{"categories":2731},[230],{"categories":2733},[166],{"categories":2735},[],{"categories":2737},[],{"categories":2739},[193],{"categories":2741},[124],{"categories":2743},[172],{"categories":2745},[172],{"categories":2747},[172],{"categories":2749},[124],{"categories":2751},[193],{"categories":2753},[214],{"categories":2755},[172],{"categories":2757},[172],{"categories":2759},[172],{"categories":2761},[193],{"categories":2763},[172],{"categories":2765},[193],{"categories":2767},[175],{"categories":2769},[175],{"categories":2771},[124],{"categories":2773},[175],{"categories":2775},[172],{"categories":2777},[124],{"categories":2779},[214],{"categories":2781},[],{"categories":2783},[175],{"categories":2785},[],{"categories":2787},[],{"categories":2789},[169],{"categories":2791},[172],{"categories":2793},[175],{"categories":2795},[166],{"categories":2797},[175],{"categories":2799},[230],{"categories":2801},[],{"categories":2803},[175],{"categories":2805},[],{"categories":2807},[166],{"categories":2809},[175],{"categories":2811},[],{"categories":2813},[175],{"categories":2815},[172],{"categories":2817},[193],{"categories":2819},[172],{"categories":2821},[175],{"categories":2823},[193],{"categories":2825},[175],{"categories":2827},[124],{"categories":2829},[214],{"categories":2831},[166],{"categories":2833},[],{"categories":2835},[175],{"categories":2837},[214],{"categories":2839},[193],{"categories":2841},[172],{"categories":2843},[214],{"categories":2845},[166],{"categories":2847},[],{"categories":2849},[175],{"categories":2851},[175],{"categories":2853},[172],{"categories":2855},[],{"categories":2857},[175],{"categories":2859},[178],{"categories":2861},[193],{"categories":2863},[175],{"categories":2865},[169],{"categories":2867},[],{"categories":2869},[172],{"categories":2871},[178],{"categories":2873},[172],{"categories":2875},[175],{"categories":2877},[193],{"categories":2879},[166],{"categories":2881},[485],{"categories":2883},[172],{"categories":2885},[172],{"categories":2887},[172],{"categories":2889},[193],{"categories":2891},[169],{"categories":2893},[172],{"categories":2895},[214],{"categories":2897},[193],{"categories":2899},[485],{"categories":2901},[172],{"categories":2903},[],{"categories":2905},[],{"categories":2907},[485],{"categories":2909},[217],{"categories":2911},[175],{"categories":2913},[175],{"categories":2915},[193],{"categories":2917},[172],{"categories":2919},[166],{"categories":2921},[214],{"categories":2923},[175],{"categories":2925},[172],{"categories":2927},[230],{"categories":2929},[172],{"categories":2931},[175],{"categories":2933},[],{"categories":2935},[172],{"categories":2937},[172],{"categories":2939},[193],{"categories":2941},[166],{"categories":2943},[],{"categories":2945},[172],{"categories":2947},[172],{"categories":2949},[124],{"categories":2951},[214],{"categories":2953},[172,175],{"categories":2955},[230,169],{"categories":2957},[172],{"categories":2959},[],{"categories":2961},[175],{"categories":2963},[],{"categories":2965},[124],{"categories":2967},[172],{"categories":2969},[193],{"categories":2971},[],{"categories":2973},[175],{"categories":2975},[],{"categories":2977},[175],{"categories":2979},[166],{"categories":2981},[175],{"categories":2983},[172],{"categories":2985},[485],{"categories":2987},[230],{"categories":2989},[169],{"categories":2991},[169],{"categories":2993},[166],{"categories":2995},[166],{"categories":2997},[172],{"categories":2999},[175],{"categories":3001},[172],{"categories":3003},[172],{"categories":3005},[166],{"categories":3007},[172],{"categories":3009},[230],{"categories":3011},[193],{"categories":3013},[172],{"categories":3015},[175],{"categories":3017},[172],{"categories":3019},[],{"categories":3021},[124],{"categories":3023},[],{"categories":3025},[175],{"categories":3027},[166],{"categories":3029},[],{"categories":3031},[485],{"categories":3033},[172],{"categories":3035},[],{"categories":3037},[193],{"categories":3039},[175],{"categories":3041},[124],{"categories":3043},[172],{"categories":3045},[175],{"categories":3047},[124],{"categories":3049},[175],{"categories":3051},[193],{"categories":3053},[166],{"categories":3055},[193],{"categories":3057},[124],{"categories":3059},[172],{"categories":3061},[214],{"categories":3063},[172],{"categories":3065},[172],{"categories":3067},[172],{"categories":3069},[172],{"categories":3071},[175],{"categories":3073},[172],{"categories":3075},[175],{"categories":3077},[172],{"categories":3079},[166],{"categories":3081},[172],{"categories":3083},[175],{"categories":3085},[214],{"categories":3087},[166],{"categories":3089},[175],{"categories":3091},[214],{"categories":3093},[],{"categories":3095},[172],{"categories":3097},[172],{"categories":3099},[124],{"categories":3101},[],{"categories":3103},[175],{"categories":3105},[230],{"categories":3107},[172],{"categories":3109},[193],{"categories":3111},[230],{"categories":3113},[175],{"categories":3115},[169],{"categories":3117},[169],{"categories":3119},[172],{"categories":3121},[166],{"categories":3123},[],{"categories":3125},[172],{"categories":3127},[],{"categories":3129},[166],{"categories":3131},[172],{"categories":3133},[175],{"categories":3135},[175],{"categories":3137},[],{"categories":3139},[124],{"categories":3141},[124],{"categories":3143},[230],{"categories":3145},[214],{"categories":3147},[],{"categories":3149},[172],{"categories":3151},[166],{"categories":3153},[172],{"categories":3155},[124],{"categories":3157},[166],{"categories":3159},[193],{"categories":3161},[193],{"categories":3163},[],{"categories":3165},[193],{"categories":3167},[175],{"categories":3169},[214],{"categories":3171},[217],{"categories":3173},[172],{"categories":3175},[],{"categories":3177},[193],{"categories":3179},[124],{"categories":3181},[169],{"categories":3183},[172],{"categories":3185},[166],{"categories":3187},[485],{"categories":3189},[166],{"categories":3191},[],{"categories":3193},[],{"categories":3195},[193],{"categories":3197},[],{"categories":3199},[175],{"categories":3201},[175],{"categories":3203},[175],{"categories":3205},[],{"categories":3207},[172],{"categories":3209},[],{"categories":3211},[193],{"categories":3213},[166],{"categories":3215},[214],{"categories":3217},[172],{"categories":3219},[193],{"categories":3221},[193],{"categories":3223},[],{"categories":3225},[193],{"categories":3227},[166],{"categories":3229},[172],{"categories":3231},[],{"categories":3233},[175],{"categories":3235},[175],{"categories":3237},[166],{"categories":3239},[],{"categories":3241},[],{"categories":3243},[],{"categories":3245},[214],{"categories":3247},[175],{"categories":3249},[172],{"categories":3251},[],{"categories":3253},[],{"categories":3255},[],{"categories":3257},[214],{"categories":3259},[],{"categories":3261},[166],{"categories":3263},[],{"categories":3265},[],{"categories":3267},[214],{"categories":3269},[172],{"categories":3271},[193],{"categories":3273},[],{"categories":3275},[230],{"categories":3277},[193],{"categories":3279},[230],{"categories":3281},[172],{"categories":3283},[],{"categories":3285},[],{"categories":3287},[175],{"categories":3289},[],{"categories":3291},[],{"categories":3293},[175],{"categories":3295},[172],{"categories":3297},[],{"categories":3299},[175],{"categories":3301},[193],{"categories":3303},[230],{"categories":3305},[217],{"categories":3307},[175],{"categories":3309},[175],{"categories":3311},[],{"categories":3313},[],{"categories":3315},[],{"categories":3317},[193],{"categories":3319},[],{"categories":3321},[],{"categories":3323},[214],{"categories":3325},[166],{"categories":3327},[],{"categories":3329},[169],{"categories":3331},[230],{"categories":3333},[172],{"categories":3335},[124],{"categories":3337},[166],{"categories":3339},[217],{"categories":3341},[169],{"categories":3343},[124],{"categories":3345},[],{"categories":3347},[],{"categories":3349},[175],{"categories":3351},[166],{"categories":3353},[214],{"categories":3355},[166],{"categories":3357},[175],{"categories":3359},[485],{"categories":3361},[175],{"categories":3363},[],{"categories":3365},[172],{"categories":3367},[193],{"categories":3369},[124],{"categories":3371},[],{"categories":3373},[214],{"categories":3375},[193],{"categories":3377},[166],{"categories":3379},[175],{"categories":3381},[172],{"categories":3383},[169],{"categories":3385},[175,485],{"categories":3387},[175],{"categories":3389},[124],{"categories":3391},[172],{"categories":3393},[217],{"categories":3395},[230],{"categories":3397},[175],{"categories":3399},[],{"categories":3401},[175],{"categories":3403},[172],{"categories":3405},[169],{"categories":3407},[],{"categories":3409},[],{"categories":3411},[172],{"categories":3413},[217],{"categories":3415},[172],{"categories":3417},[],{"categories":3419},[193],{"categories":3421},[],{"categories":3423},[193],{"categories":3425},[124],{"categories":3427},[175],{"categories":3429},[172],{"categories":3431},[230],{"categories":3433},[124],{"categories":3435},[],{"categories":3437},[193],{"categories":3439},[172],{"categories":3441},[],{"categories":3443},[172],{"categories":3445},[175],{"categories":3447},[172],{"categories":3449},[175],{"categories":3451},[172],{"categories":3453},[172],{"categories":3455},[172],{"categories":3457},[172],{"categories":3459},[169],{"categories":3461},[],{"categories":3463},[178],{"categories":3465},[193],{"categories":3467},[172],{"categories":3469},[],{"categories":3471},[124],{"categories":3473},[172],{"categories":3475},[172],{"categories":3477},[175],{"categories":3479},[193],{"categories":3481},[172],{"categories":3483},[172],{"categories":3485},[169],{"categories":3487},[175],{"categories":3489},[214],{"categories":3491},[],{"categories":3493},[217],{"categories":3495},[172],{"categories":3497},[],{"categories":3499},[193],{"categories":3501},[230],{"categories":3503},[],{"categories":3505},[],{"categories":3507},[193],{"categories":3509},[193],{"categories":3511},[230],{"categories":3513},[166],{"categories":3515},[175],{"categories":3517},[175],{"categories":3519},[172],{"categories":3521},[169],{"categories":3523},[],{"categories":3525},[],{"categories":3527},[193],{"categories":3529},[217],{"categories":3531},[124],{"categories":3533},[175],{"categories":3535},[214],{"categories":3537},[217],{"categories":3539},[217],{"categories":3541},[],{"categories":3543},[193],{"categories":3545},[172],{"categories":3547},[172],{"categories":3549},[124],{"categories":3551},[],{"categories":3553},[193],{"categories":3555},[193],{"categories":3557},[193],{"categories":3559},[],{"categories":3561},[175],{"categories":3563},[172],{"categories":3565},[],{"categories":3567},[166],{"categories":3569},[169],{"categories":3571},[],{"categories":3573},[172],{"categories":3575},[172],{"categories":3577},[],{"categories":3579},[124],{"categories":3581},[],{"categories":3583},[],{"categories":3585},[],{"categories":3587},[],{"categories":3589},[172],{"categories":3591},[193],{"categories":3593},[],{"categories":3595},[],{"categories":3597},[172],{"categories":3599},[172],{"categories":3601},[172],{"categories":3603},[217],{"categories":3605},[172],{"categories":3607},[217],{"categories":3609},[],{"categories":3611},[217],{"categories":3613},[217],{"categories":3615},[485],{"categories":3617},[175],{"categories":3619},[124],{"categories":3621},[],{"categories":3623},[],{"categories":3625},[217],{"categories":3627},[124],{"categories":3629},[124],{"categories":3631},[124],{"categories":3633},[],{"categories":3635},[166],{"categories":3637},[124],{"categories":3639},[124],{"categories":3641},[166],{"categories":3643},[124],{"categories":3645},[169],{"categories":3647},[124],{"categories":3649},[124],{"categories":3651},[124],{"categories":3653},[217],{"categories":3655},[193],{"categories":3657},[193],{"categories":3659},[172],{"categories":3661},[124],{"categories":3663},[217],{"categories":3665},[485],{"categories":3667},[217],{"categories":3669},[217],{"categories":3671},[217],{"categories":3673},[],{"categories":3675},[169],{"categories":3677},[],{"categories":3679},[485],{"categories":3681},[124],{"categories":3683},[124],{"categories":3685},[124],{"categories":3687},[175],{"categories":3689},[193,169],{"categories":3691},[217],{"categories":3693},[],{"categories":3695},[],{"categories":3697},[217],{"categories":3699},[],{"categories":3701},[217],{"categories":3703},[193],{"categories":3705},[175],{"categories":3707},[],{"categories":3709},[124],{"categories":3711},[172],{"categories":3713},[214],{"categories":3715},[],{"categories":3717},[172],{"categories":3719},[],{"categories":3721},[193],{"categories":3723},[166],{"categories":3725},[217],{"categories":3727},[],{"categories":3729},[124],{"categories":3731},[193],[3733,4146,4268,4519],{"id":3734,"title":3735,"ai":3736,"body":3741,"categories":4132,"created_at":125,"date_modified":125,"description":117,"extension":126,"faq":125,"featured":127,"kicker_label":125,"meta":4133,"navigation":145,"path":4134,"published_at":4135,"question":125,"scraped_at":125,"seo":4136,"sitemap":4137,"source_id":4138,"source_name":4139,"source_type":153,"source_url":4140,"stem":4141,"tags":4142,"thumbnail_url":125,"tldr":4143,"tweet":125,"unknown_tags":4144,"__hash__":4145},"summaries\u002Fsummaries\u002Fredux-s-design-for-surgical-re-renders-and-predict-summary.md","Redux's Design for Surgical Re-renders and Predictable State",{"provider":7,"model":8,"input_tokens":3737,"output_tokens":3738,"processing_time_ms":3739,"cost_usd":3740},8028,1502,14418,0.00233395,{"type":14,"value":3742,"toc":4126},[3743,3747,3776,3791,3802,3831,3835,3842,3856,3878,3888,3892,3903,4078,4089,4093,4105,4116,4122],[17,3744,3746],{"id":3745},"global-state-without-prop-drilling-or-wasteful-passes","Global State Without Prop Drilling or Wasteful Passes",[22,3748,3749,3750,3753,3754,3757,3758,3757,3761,3757,3764,3767,3768,3771,3772,3775],{},"Prop drilling forces irrelevant components to pass state like ",[26,3751,3752],{},"isLoggedIn"," through layers—",[26,3755,3756],{},"App"," to ",[26,3759,3760],{},"Layout",[26,3762,3763],{},"Navbar",[26,3765,3766],{},"UserAvatar","—even when intermediates don't use it. Redux fixes this by storing shared state in a single central ",[77,3769,3770],{},"store"," outside the React component tree, accessible by any component via ",[26,3773,3774],{},"react-redux"," hooks.",[22,3777,3778,3779,3782,3783,3786,3787,3790],{},"State is data that changes over time and triggers UI re-renders. Local ",[26,3780,3781],{},"useState"," notifies React via ",[26,3784,3785],{},"setState",", but plain ",[26,3788,3789],{},"let"," variables fail because they don't signal changes or persist across re-renders. Redux's store holds all global state as one predictable JavaScript object, eliminating threading and enabling direct access.",[22,3792,3793,3794,3797,3798,3801],{},"When state like ",[26,3795,3796],{},"x"," changes (with 4 subscribers out of 10 total), only those 4 components re-render—not the whole app or all subscribers. ",[26,3799,3800],{},"useSelector(state => state.x)"," subscribes components to specific slices via a newsletter-like model: Redux tracks per-slice subscribers and notifies surgically on changes.",[22,3803,3804,3807,3808,3811,3812,3815,3816,3819,3820,3822,3823,3826,3827,3830],{},[26,3805,3806],{},"useSelector"," runs after every store update, performing strict ",[26,3809,3810],{},"==="," equality checks on selected values. Creating new objects inline like ",[26,3813,3814],{},"useSelector(state => ({ x: state.x }))"," fails because ",[26,3817,3818],{},"{}"," !== ",[26,3821,3818],{}," by reference, causing unnecessary re-renders. Fix by using separate ",[26,3824,3825],{},"useSelectors"," or memoized selectors from ",[26,3828,3829],{},"reselect",".",[17,3832,3834],{"id":3833},"unidirectional-flow-ensures-predictability-and-debuggability","Unidirectional Flow Ensures Predictability and Debuggability",[22,3836,3837,3838,3841],{},"Changes flow one way: user event → ",[26,3839,3840],{},"dispatch(action)"," → reducer computes new state → store updates → subscribers notified.",[22,3843,3844,3847,3848,3851,3852,3855],{},[77,3845,3846],{},"Actions"," are plain objects describing intent, e.g., ",[26,3849,3850],{},"{ type: \"increment\", incrementBy: 5 }"," or ",[26,3853,3854],{},"{ type: \"addToCart\", item: { id: 42, name: \"Red Shoes\" } }",". They carry no logic.",[22,3857,3858,3861,3862,3865,3866,3869,3870,3873,3874,3877],{},[77,3859,3860],{},"Reducers"," are pure functions ",[26,3863,3864],{},"(state, action) => newState"," using ",[26,3867,3868],{},"switch"," on ",[26,3871,3872],{},"action.type",". They return immutable copies via spreads like ",[26,3875,3876],{},"{ ...state, value: state.value + action.incrementBy }",", never mutating. Unknown types return unchanged state. Purity enables testing and predictability—no side effects like API calls.",[22,3879,3880,3883,3884,3887],{},[26,3881,3882],{},"useDispatch()"," provides the dispatch function; you never call reducers directly. This pipeline creates an audit trail: every change traces to dispatched actions, powering ",[77,3885,3886],{},"Redux DevTools"," for inspecting actions, before\u002Fafter states, rewinding to past states, and replaying bugs.",[17,3889,3891],{"id":3890},"redux-toolkit-cuts-boilerplate-while-preserving-principles","Redux Toolkit Cuts Boilerplate While Preserving Principles",[22,3893,3894,3895,3898,3899,3902],{},"Classic Redux requires manual action types, creators, and switch reducers—verbose for one feature. ",[77,3896,3897],{},"Redux Toolkit (RTK)","'s ",[26,3900,3901],{},"createSlice"," bundles them:",[3904,3905,3909],"pre",{"className":3906,"code":3907,"language":3908,"meta":117,"style":117},"language-js shiki shiki-themes github-light github-dark","import { createSlice } from \"@reduxjs\u002Ftoolkit\";\nconst counterSlice = createSlice({\n  name: \"counter\",\n  initialState: { value: 0 },\n  reducers: {\n    increment: (state, action) => {\n      state.value += action.payload.incrementBy;  \u002F\u002F Immer enables 'mutation'\n    }\n  }\n});\nexport const { increment } = counterSlice.actions;\nexport default counterSlice.reducer;\n","js",[26,3910,3911,3934,3953,3964,3975,3981,4009,4025,4031,4037,4043,4067],{"__ignoreMap":117},[3912,3913,3916,3920,3924,3927,3931],"span",{"class":3914,"line":3915},"line",1,[3912,3917,3919],{"class":3918},"szBVR","import",[3912,3921,3923],{"class":3922},"sVt8B"," { createSlice } ",[3912,3925,3926],{"class":3918},"from",[3912,3928,3930],{"class":3929},"sZZnC"," \"@reduxjs\u002Ftoolkit\"",[3912,3932,3933],{"class":3922},";\n",[3912,3935,3936,3939,3943,3946,3950],{"class":3914,"line":118},[3912,3937,3938],{"class":3918},"const",[3912,3940,3942],{"class":3941},"sj4cs"," counterSlice",[3912,3944,3945],{"class":3918}," =",[3912,3947,3949],{"class":3948},"sScJk"," createSlice",[3912,3951,3952],{"class":3922},"({\n",[3912,3954,3955,3958,3961],{"class":3914,"line":142},[3912,3956,3957],{"class":3922},"  name: ",[3912,3959,3960],{"class":3929},"\"counter\"",[3912,3962,3963],{"class":3922},",\n",[3912,3965,3966,3969,3972],{"class":3914,"line":141},[3912,3967,3968],{"class":3922},"  initialState: { value: ",[3912,3970,3971],{"class":3941},"0",[3912,3973,3974],{"class":3922}," },\n",[3912,3976,3978],{"class":3914,"line":3977},5,[3912,3979,3980],{"class":3922},"  reducers: {\n",[3912,3982,3984,3987,3990,3994,3997,4000,4003,4006],{"class":3914,"line":3983},6,[3912,3985,3986],{"class":3948},"    increment",[3912,3988,3989],{"class":3922},": (",[3912,3991,3993],{"class":3992},"s4XuR","state",[3912,3995,3996],{"class":3922},", ",[3912,3998,3999],{"class":3992},"action",[3912,4001,4002],{"class":3922},") ",[3912,4004,4005],{"class":3918},"=>",[3912,4007,4008],{"class":3922}," {\n",[3912,4010,4012,4015,4018,4021],{"class":3914,"line":4011},7,[3912,4013,4014],{"class":3922},"      state.value ",[3912,4016,4017],{"class":3918},"+=",[3912,4019,4020],{"class":3922}," action.payload.incrementBy;  ",[3912,4022,4024],{"class":4023},"sJ8bj","\u002F\u002F Immer enables 'mutation'\n",[3912,4026,4028],{"class":3914,"line":4027},8,[3912,4029,4030],{"class":3922},"    }\n",[3912,4032,4034],{"class":3914,"line":4033},9,[3912,4035,4036],{"class":3922},"  }\n",[3912,4038,4040],{"class":3914,"line":4039},10,[3912,4041,4042],{"class":3922},"});\n",[3912,4044,4046,4049,4052,4055,4058,4061,4064],{"class":3914,"line":4045},11,[3912,4047,4048],{"class":3918},"export",[3912,4050,4051],{"class":3918}," const",[3912,4053,4054],{"class":3922}," { ",[3912,4056,4057],{"class":3941},"increment",[3912,4059,4060],{"class":3922}," } ",[3912,4062,4063],{"class":3918},"=",[3912,4065,4066],{"class":3922}," counterSlice.actions;\n",[3912,4068,4070,4072,4075],{"class":3914,"line":4069},12,[3912,4071,4048],{"class":3918},[3912,4073,4074],{"class":3918}," default",[3912,4076,4077],{"class":3922}," counterSlice.reducer;\n",[22,4079,4080,4081,4084,4085,4088],{},"Dispatch as ",[26,4082,4083],{},"dispatch(increment({ incrementBy: 5 }))","; RTK auto-generates typed action creators. ",[77,4086,4087],{},"Immer"," converts mutating syntax to immutable updates under the hood, reducing code without risks.",[17,4090,4092],{"id":4091},"redux-beats-context-for-scale-and-tools","Redux Beats Context for Scale and Tools",[22,4094,4095,4096,4100,4101,4104],{},"Context solves prop drilling but re-renders ",[4097,4098,4099],"em",{},"all"," consumers on ",[4097,4102,4103],{},"any"," value change—no granular subscriptions. Fine for simple globals like theme; wasteful for complex, frequent updates.",[22,4106,4107,4108,4111,4112,4115],{},"Redux adds granular efficiency, DevTools time-travel, ",[77,4109,4110],{},"middleware"," for async (e.g., ",[26,4113,4114],{},"redux-thunk","), and team-scale consistency. Use Context for slow-changing basics; Redux for large apps needing performance, debugging, and enforced patterns.",[22,4117,4118,4119,4121],{},"Mental model: Store as central whiteboard. ",[26,4120,3806],{}," reads and sticks a subscription note. Changes via action notes to reducer 'manager'—logged for replay. No direct scribbles.",[4123,4124,4125],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":117,"searchDepth":118,"depth":118,"links":4127},[4128,4129,4130,4131],{"id":3745,"depth":118,"text":3746},{"id":3833,"depth":118,"text":3834},{"id":3890,"depth":118,"text":3891},{"id":4091,"depth":118,"text":4092},[124],{},"\u002Fsummaries\u002Fredux-s-design-for-surgical-re-renders-and-predict-summary","2026-04-08 21:21:20",{"title":3735,"description":117},{"loc":4134},"33ccad64d7b5e22f","Level Up Coding","https:\u002F\u002Funknown","summaries\u002Fredux-s-design-for-surgical-re-renders-and-predict-summary",[157,159],"Redux centralizes global state outside React's tree, uses selector subscriptions for re-rendering only changed slices, enforces unidirectional actions-to-reducers flow for auditability, and enables time-travel debugging via DevTools.",[159],"ZaIiwfineNacbC9O7mgP-wxOz2UUvy9K20_nQZo5-Gs",{"id":4147,"title":4148,"ai":4149,"body":4154,"categories":4245,"created_at":125,"date_modified":125,"description":117,"extension":126,"faq":125,"featured":127,"kicker_label":125,"meta":4246,"navigation":145,"path":4256,"published_at":125,"question":125,"scraped_at":4257,"seo":4258,"sitemap":4259,"source_id":4260,"source_name":4261,"source_type":153,"source_url":4262,"stem":4263,"tags":4264,"thumbnail_url":125,"tldr":4265,"tweet":125,"unknown_tags":4266,"__hash__":4267},"summaries\u002Fsummaries\u002F9166f90169a38f6e-5-layer-mvvm-keeps-swiftui-apps-maintainable-summary.md","5-Layer MVVM Keeps SwiftUI Apps Maintainable",{"provider":7,"model":8,"input_tokens":4150,"output_tokens":4151,"processing_time_ms":4152,"cost_usd":4153},5306,1690,8817,0.00139935,{"type":14,"value":4155,"toc":4240},[4156,4160,4194,4197,4201,4226,4229,4233],[17,4157,4159],{"id":4158},"layered-mvvm-separates-concerns-for-scalability","Layered MVVM Separates Concerns for Scalability",[22,4161,4162,4163,4166,4167,3996,4170,4173,4174,4177,4178,4181,4182,4185,4186,4189,4190,4193],{},"Build SwiftUI apps using a 'full layer cake' MVVM with five distinct layers to prevent Views from handling data or logic, resulting in boring, maintainable code. Models define pure data structures like ",[26,4164,4165],{},"Task"," (with title, notes, priority, category, due date, completion status), ",[26,4168,4169],{},"SubTask",[26,4171,4172],{},"TaskPriority"," (Low\u002FMedium\u002FHigh), and ",[26,4175,4176],{},"TaskCategory","—no UI or persistence code. Repositories abstract storage via protocols like ",[26,4179,4180],{},"TaskRepositoryProtocol","; ",[26,4183,4184],{},"TaskRepository"," uses SwiftData's ",[26,4187,4188],{},"ModelContext"," but hides it from callers. Services handle cross-cutting utilities: date checks (e.g., 'is this today?'), greeting generation, formatting, settings, and notifications, avoiding bloated ViewModels. ViewModels (",[26,4191,4192],{},"@Observable",") manage screen state, fetch via repositories, process with services, and expose UI-ready data\u002Factions. Views render only, calling ViewModel methods without business rules.",[22,4195,4196],{},"This structure scales by keeping each layer single-responsibility: Views stay declarative, ViewModels testable, and data\u002Fpersistence swappable.",[17,4198,4200],{"id":4199},"dependency-injection-and-data-flow-enable-testing","Dependency Injection and Data Flow Enable Testing",[22,4202,4203,4204,4207,4208,4211,4212,4215,4216,4218,4219,4221,4222,4225],{},"Inject repositories and services at app launch via ",[26,4205,4206],{},"@Environment"," or root views—ViewModels never instantiate dependencies. Data flows unidirectionally: user actions trigger ViewModel methods (e.g., ",[26,4209,4210],{},"toggleComplete(task)","), which call ",[26,4213,4214],{},"repository.toggleComplete(task)"," updating ",[26,4217,4188],{},", then refresh observable state for Views. Protocols like ",[26,4220,4180],{}," allow faking for unit tests: swap ",[26,4223,4224],{},"FakeTaskRepository"," to test ViewModels without SwiftData, UI, or real persistence, verifying state changes and actions in isolation.",[22,4227,4228],{},"Trade-off: Adds upfront boilerplate but prevents God objects and eases refactoring as apps grow.",[17,4230,4232],{"id":4231},"demo-app-features-validate-architecture","Demo App Features Validate Architecture",[22,4234,4235,4236,4239],{},"The todo app showcases layers across screens. Today view displays due-today tasks with progress ring and personalized greeting (via Services). All Tasks lists with filters (All\u002FActive\u002FCompleted, by category) loaded by ViewModel. Add Task form sets priority\u002Fcategory\u002Fdue date\u002Ftime\u002Fsubtasks. Search queries tasks by name, showing matches with details. Settings manages profile, default priority, theme (System\u002FLight\u002FDark), notifications—all persisted via repository. UI uses Liquid Glass effects for polish. Run by opening ",[26,4237,4238],{},"IOSMvvCApp.xcodeproj"," in Xcode; MIT licensed.",{"title":117,"searchDepth":118,"depth":118,"links":4241},[4242,4243,4244],{"id":4158,"depth":118,"text":4159},{"id":4199,"depth":118,"text":4200},{"id":4231,"depth":118,"text":4232},[124],{"content_references":4247,"triage":4254},[4248],{"type":136,"title":4249,"author":4250,"publisher":4251,"url":4252,"context":4253},"MVVM in SwiftUI: Build an iOS App That Stays Organized as It Grows","sanjaynelagadde1992","Medium","https:\u002F\u002Fmedium.com\u002F@sanjaynelagadde1992\u002Fmvvm-in-swiftui-build-an-ios-app-that-stays-organized-as-it-grows-a16e64d9eb3a","recommended",{"relevance":141,"novelty":142,"quality":141,"actionability":141,"composite":143,"reasoning":4255},"Category: Design & Frontend. The article provides a structured approach to implementing MVVM in SwiftUI, addressing the audience's need for maintainable code and scalability, which is a common pain point for developers. It offers specific examples of how to structure code and implement dependency injection, making it actionable for developers looking to improve their app architecture.","\u002Fsummaries\u002F9166f90169a38f6e-5-layer-mvvm-keeps-swiftui-apps-maintainable-summary","2026-04-16 02:56:11",{"title":4148,"description":117},{"loc":4256},"9166f90169a38f6e","__oneoff__","https:\u002F\u002Fgithub.com\u002Fsanjaynela\u002FIOSMvvCApp","summaries\u002F9166f90169a38f6e-5-layer-mvvm-keeps-swiftui-apps-maintainable-summary",[158,157],"Implement MVVM as five layers—Models, Repositories, Services, ViewModels, Views—to isolate UI from data, logic, and persistence, enabling dependency injection and isolated ViewModel testing.",[],"P2RjZndIh2s04qnEiZcXtKRJ8CO0tytKe3mwjvwk198",{"id":4269,"title":4270,"ai":4271,"body":4276,"categories":4501,"created_at":125,"date_modified":125,"description":117,"extension":126,"faq":125,"featured":127,"kicker_label":125,"meta":4502,"navigation":145,"path":4506,"published_at":4507,"question":125,"scraped_at":4508,"seo":4509,"sitemap":4510,"source_id":4511,"source_name":4512,"source_type":153,"source_url":4513,"stem":4514,"tags":4515,"thumbnail_url":125,"tldr":4516,"tweet":125,"unknown_tags":4517,"__hash__":4518},"summaries\u002Fsummaries\u002F565cd461d5e56e35-python-variables-sticky-notes-on-shared-objects-summary.md","Python Variables: Sticky Notes on Shared Objects",{"provider":7,"model":8,"input_tokens":4272,"output_tokens":4273,"processing_time_ms":4274,"cost_usd":4275},5293,1238,13529,0.0016551,{"type":14,"value":4277,"toc":4496},[4278,4282,4292,4295,4300,4337,4342,4376,4379,4383,4398,4403,4442,4449,4453,4460,4488,4493],[17,4279,4281],{"id":4280},"names-bind-to-objects-not-values","Names Bind to Objects, Not Values",[22,4283,4284,4285,4288,4289,4291],{},"Python lacks variables as fixed memory boxes like in C or Java. Instead, everything is an object in memory, and variables are labels (sticky notes) pointing to those objects. Assigning ",[26,4286,4287],{},"x = [1, 2, 3]"," creates a list object (e.g., at address 0x1234) and binds the name ",[26,4290,3796],{}," to it. Passing to a function creates a new local label bound to the same object—no copy occurs.",[22,4293,4294],{},"This 'call by sharing' means mutations to mutable objects (lists, dicts) affect all bound names, but rebinding a local name inside a function doesn't alter the caller's object.",[22,4296,4297],{},[77,4298,4299],{},"mutate example:",[3904,4301,4305],{"className":4302,"code":4303,"language":4304,"meta":117,"style":117},"language-python shiki shiki-themes github-light github-dark","def mutate(lst):\n    lst.append(99)  # Mutates shared object\n\nx = [10, 20]\nmutate(x)\n# x now [10, 20, 99]—original object changed\n","python",[26,4306,4307,4312,4317,4322,4327,4332],{"__ignoreMap":117},[3912,4308,4309],{"class":3914,"line":3915},[3912,4310,4311],{},"def mutate(lst):\n",[3912,4313,4314],{"class":3914,"line":118},[3912,4315,4316],{},"    lst.append(99)  # Mutates shared object\n",[3912,4318,4319],{"class":3914,"line":142},[3912,4320,4321],{"emptyLinePlaceholder":145},"\n",[3912,4323,4324],{"class":3914,"line":141},[3912,4325,4326],{},"x = [10, 20]\n",[3912,4328,4329],{"class":3914,"line":3977},[3912,4330,4331],{},"mutate(x)\n",[3912,4333,4334],{"class":3914,"line":3983},[3912,4335,4336],{},"# x now [10, 20, 99]—original object changed\n",[22,4338,4339],{},[77,4340,4341],{},"rebind example:",[3904,4343,4345],{"className":4302,"code":4344,"language":4304,"meta":117,"style":117},"def rebind(lst):\n    lst = [1, 2, 3]  # Local label now points to new object\n\nx = [10, 20, 99]\nrebind(x)\n# x unchanged—original object untouched\n",[26,4346,4347,4352,4357,4361,4366,4371],{"__ignoreMap":117},[3912,4348,4349],{"class":3914,"line":3915},[3912,4350,4351],{},"def rebind(lst):\n",[3912,4353,4354],{"class":3914,"line":118},[3912,4355,4356],{},"    lst = [1, 2, 3]  # Local label now points to new object\n",[3912,4358,4359],{"class":3914,"line":142},[3912,4360,4321],{"emptyLinePlaceholder":145},[3912,4362,4363],{"class":3914,"line":141},[3912,4364,4365],{},"x = [10, 20, 99]\n",[3912,4367,4368],{"class":3914,"line":3977},[3912,4369,4370],{},"rebind(x)\n",[3912,4372,4373],{"class":3914,"line":3983},[3912,4374,4375],{},"# x unchanged—original object untouched\n",[22,4377,4378],{},"Rebinding peels the local label off the shared object and attaches it to a new one, leaving external references intact.",[17,4380,4382],{"id":4381},"mutable-defaults-create-permanent-shared-state","Mutable Defaults Create Permanent Shared State",[22,4384,4385,4386,4389,4390,4393,4394,4397],{},"Functions are objects with defaults evaluated ",[77,4387,4388],{},"once at definition time",", stored in ",[26,4391,4392],{},".__defaults__",". A mutable default like ",[26,4395,4396],{},"items=[]"," creates one list object bound to the function forever—GC can't reclaim it while the function lives.",[22,4399,4400],{},[77,4401,4402],{},"Buggy example:",[3904,4404,4406],{"className":4302,"code":4405,"language":4304,"meta":117,"style":117},"def add_item(item, items=[]):\n    items.append(item)\n    return items\n\nprint(add_item(1))      # [1]—mutates function's default\nprint(add_item(2, []))  # [2]—uses new list\nprint(add_item(\"a\"))   # [1, 'a']—reuses mutated default\n",[26,4407,4408,4413,4418,4423,4427,4432,4437],{"__ignoreMap":117},[3912,4409,4410],{"class":3914,"line":3915},[3912,4411,4412],{},"def add_item(item, items=[]):\n",[3912,4414,4415],{"class":3914,"line":118},[3912,4416,4417],{},"    items.append(item)\n",[3912,4419,4420],{"class":3914,"line":142},[3912,4421,4422],{},"    return items\n",[3912,4424,4425],{"class":3914,"line":141},[3912,4426,4321],{"emptyLinePlaceholder":145},[3912,4428,4429],{"class":3914,"line":3977},[3912,4430,4431],{},"print(add_item(1))      # [1]—mutates function's default\n",[3912,4433,4434],{"class":3914,"line":3983},[3912,4435,4436],{},"print(add_item(2, []))  # [2]—uses new list\n",[3912,4438,4439],{"class":3914,"line":4011},[3912,4440,4441],{},"print(add_item(\"a\"))   # [1, 'a']—reuses mutated default\n",[22,4443,4444,4445,4448],{},"First call mutates the shared default list. Later calls without ",[26,4446,4447],{},"items"," reuse it, accumulating data across invocations. In servers or workers, this leaks state between requests\u002Fjobs, manifesting as ghost bugs like User B seeing User A's data.",[17,4450,4452],{"id":4451},"defensive-fix-none-instantiation-prevents-shared-state","Defensive Fix: None + Instantiation Prevents Shared State",[22,4454,4455,4456,4459],{},"Replace mutable defaults with ",[26,4457,4458],{},"None",", then create fresh objects inside the function at call time:",[3904,4461,4463],{"className":4302,"code":4462,"language":4304,"meta":117,"style":117},"def add_item(item, items=None):\n    if items is None:\n        items = []  # New list per call\n    items.append(item)\n    return items\n",[26,4464,4465,4470,4475,4480,4484],{"__ignoreMap":117},[3912,4466,4467],{"class":3914,"line":3915},[3912,4468,4469],{},"def add_item(item, items=None):\n",[3912,4471,4472],{"class":3914,"line":118},[3912,4473,4474],{},"    if items is None:\n",[3912,4476,4477],{"class":3914,"line":142},[3912,4478,4479],{},"        items = []  # New list per call\n",[3912,4481,4482],{"class":3914,"line":141},[3912,4483,4417],{},[3912,4485,4486],{"class":3914,"line":3977},[3912,4487,4422],{},[22,4489,4490,4492],{},[26,4491,4458],{}," is immutable\u002Fsafe. Instantiation happens on the heap each run, ensuring no shared state. Enforce via linters like Flake8's B006 banning mutable defaults. This model resolves 90% of Python's 'weirdness' for production code.",[4123,4494,4495],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":117,"searchDepth":118,"depth":118,"links":4497},[4498,4499,4500],{"id":4280,"depth":118,"text":4281},{"id":4381,"depth":118,"text":4382},{"id":4451,"depth":118,"text":4452},[124],{"content_references":4503,"triage":4504},[],{"relevance":141,"novelty":142,"quality":141,"actionability":141,"composite":143,"reasoning":4505},"Category: Software Engineering. The article provides a deep dive into Python's variable handling, addressing a common pain point for developers regarding mutable defaults and shared state. It offers practical solutions to avoid bugs, making it actionable for developers looking to improve their code quality.","\u002Fsummaries\u002F565cd461d5e56e35-python-variables-sticky-notes-on-shared-objects-summary","2026-05-05 09:11:46","2026-05-05 16:09:35",{"title":4270,"description":117},{"loc":4506},"565cd461d5e56e35","Data and Beyond","https:\u002F\u002Fmedium.com\u002Fdata-and-beyond\u002Fpythons-silent-production-killer-why-pass-by-reference-is-a-lie-b7f1f5ce7930?source=rss----b680b860beb1---4","summaries\u002F565cd461d5e56e35-python-variables-sticky-notes-on-shared-objects-summary",[4304,158,159],"Forget 'pass-by-reference'—Python variables are labels binding to objects via 'call by sharing'. Mutable defaults like [] create shared state across calls, causing ghost bugs; fix by using None and instantiating inside functions.",[159],"fzEeWz1c9LJmn1gZgGIJuMZGoHMLOUzv4UIryNTNhfk",{"id":4520,"title":4521,"ai":4522,"body":4527,"categories":4987,"created_at":125,"date_modified":125,"description":117,"extension":126,"faq":125,"featured":127,"kicker_label":125,"meta":4988,"navigation":145,"path":4992,"published_at":4993,"question":125,"scraped_at":4994,"seo":4995,"sitemap":4996,"source_id":4997,"source_name":4139,"source_type":153,"source_url":4998,"stem":4999,"tags":5000,"thumbnail_url":125,"tldr":5002,"tweet":125,"unknown_tags":5003,"__hash__":5004},"summaries\u002Fsummaries\u002F8d5558e87957c77a-scale-compose-nav-with-nested-graphs-and-state-lay-summary.md","Scale Compose Nav with Nested Graphs and State Layers",{"provider":7,"model":8,"input_tokens":4523,"output_tokens":4524,"processing_time_ms":4525,"cost_usd":4526},6768,1765,14725,0.00221345,{"type":14,"value":4528,"toc":4981},[4529,4533,4536,4539,4600,4603,4678,4681,4684,4717,4721,4724,4727,4749,4778,4790,4793,4797,4804,4860,4863,4892,4895,4899,4922,4961,4979],[17,4530,4532],{"id":4531},"nested-graphs-isolate-features-and-simplify-reasoning","Nested Graphs Isolate Features and Simplify Reasoning",[22,4534,4535],{},"Flat NavHosts with dozens of composables become unmaintainable—files bloat, flows interfere, back stacks confuse, and refactors risk breakage. Instead, centralize ownership in one root NavHost that only defines major app flows (e.g., auth, main), then nest separate graphs per feature.",[22,4537,4538],{},"Root setup:",[3904,4540,4544],{"className":4541,"code":4542,"language":4543,"meta":117,"style":117},"language-kotlin shiki shiki-themes github-light github-dark","@Composable\nfun AppNavHost(navController: NavHostController) {\n    NavHost(\n        navController = navController,\n        startDestination = Graph.AUTH,\n        route = Graph.ROOT\n    ) {\n        authNavGraph(navController)\n        mainNavGraph(navController)\n    }\n}\n","kotlin",[26,4545,4546,4551,4556,4561,4566,4571,4576,4581,4586,4591,4595],{"__ignoreMap":117},[3912,4547,4548],{"class":3914,"line":3915},[3912,4549,4550],{},"@Composable\n",[3912,4552,4553],{"class":3914,"line":118},[3912,4554,4555],{},"fun AppNavHost(navController: NavHostController) {\n",[3912,4557,4558],{"class":3914,"line":142},[3912,4559,4560],{},"    NavHost(\n",[3912,4562,4563],{"class":3914,"line":141},[3912,4564,4565],{},"        navController = navController,\n",[3912,4567,4568],{"class":3914,"line":3977},[3912,4569,4570],{},"        startDestination = Graph.AUTH,\n",[3912,4572,4573],{"class":3914,"line":3983},[3912,4574,4575],{},"        route = Graph.ROOT\n",[3912,4577,4578],{"class":3914,"line":4011},[3912,4579,4580],{},"    ) {\n",[3912,4582,4583],{"class":3914,"line":4027},[3912,4584,4585],{},"        authNavGraph(navController)\n",[3912,4587,4588],{"class":3914,"line":4033},[3912,4589,4590],{},"        mainNavGraph(navController)\n",[3912,4592,4593],{"class":3914,"line":4039},[3912,4594,4030],{},[3912,4596,4597],{"class":3914,"line":4045},[3912,4598,4599],{},"}\n",[22,4601,4602],{},"Feature graphs group related screens:",[3904,4604,4606],{"className":4541,"code":4605,"language":4543,"meta":117,"style":117},"fun NavGraphBuilder.authNavGraph(navController: NavHostController) {\n    navigation(startDestination = \"login\", route = Graph.AUTH) {\n        composable(\"login\") {\n            LoginScreen(\n                onLoginSuccess = {\n                    navController.navigate(Graph.MAIN) {\n                        popUpTo(Graph.AUTH) { inclusive = true }\n                    }\n                }\n            )\n        }\n        \u002F\u002F signup composable...\n    }\n}\n",[26,4607,4608,4613,4618,4623,4628,4633,4638,4643,4648,4653,4658,4663,4668,4673],{"__ignoreMap":117},[3912,4609,4610],{"class":3914,"line":3915},[3912,4611,4612],{},"fun NavGraphBuilder.authNavGraph(navController: NavHostController) {\n",[3912,4614,4615],{"class":3914,"line":118},[3912,4616,4617],{},"    navigation(startDestination = \"login\", route = Graph.AUTH) {\n",[3912,4619,4620],{"class":3914,"line":142},[3912,4621,4622],{},"        composable(\"login\") {\n",[3912,4624,4625],{"class":3914,"line":141},[3912,4626,4627],{},"            LoginScreen(\n",[3912,4629,4630],{"class":3914,"line":3977},[3912,4631,4632],{},"                onLoginSuccess = {\n",[3912,4634,4635],{"class":3914,"line":3983},[3912,4636,4637],{},"                    navController.navigate(Graph.MAIN) {\n",[3912,4639,4640],{"class":3914,"line":4011},[3912,4641,4642],{},"                        popUpTo(Graph.AUTH) { inclusive = true }\n",[3912,4644,4645],{"class":3914,"line":4027},[3912,4646,4647],{},"                    }\n",[3912,4649,4650],{"class":3914,"line":4033},[3912,4651,4652],{},"                }\n",[3912,4654,4655],{"class":3914,"line":4039},[3912,4656,4657],{},"            )\n",[3912,4659,4660],{"class":3914,"line":4045},[3912,4661,4662],{},"        }\n",[3912,4664,4665],{"class":3914,"line":4069},[3912,4666,4667],{},"        \u002F\u002F signup composable...\n",[3912,4669,4671],{"class":3914,"line":4670},13,[3912,4672,4030],{},[3912,4674,4676],{"class":3914,"line":4675},14,[3912,4677,4599],{},[22,4679,4680],{},"This keeps graphs small, prevents cross-flow pollution, and makes back stack behavior predictable—e.g., clear auth stack on login success.",[22,4682,4683],{},"Centralize routes with sealed classes to avoid string typos:",[3904,4685,4687],{"className":4541,"code":4686,"language":4543,"meta":117,"style":117},"sealed class AppScreen(val route: String) {\n    data object Home : AppScreen(\"home\")\n    data object UserDetails : AppScreen(\"user\u002F{userId}\") {\n        fun createRoute(userId: Long) = \"user\u002F$userId\"\n    }\n}\n",[26,4688,4689,4694,4699,4704,4709,4713],{"__ignoreMap":117},[3912,4690,4691],{"class":3914,"line":3915},[3912,4692,4693],{},"sealed class AppScreen(val route: String) {\n",[3912,4695,4696],{"class":3914,"line":118},[3912,4697,4698],{},"    data object Home : AppScreen(\"home\")\n",[3912,4700,4701],{"class":3914,"line":142},[3912,4702,4703],{},"    data object UserDetails : AppScreen(\"user\u002F{userId}\") {\n",[3912,4705,4706],{"class":3914,"line":141},[3912,4707,4708],{},"        fun createRoute(userId: Long) = \"user\u002F$userId\"\n",[3912,4710,4711],{"class":3914,"line":3977},[3912,4712,4030],{},[3912,4714,4715],{"class":3914,"line":3983},[3912,4716,4599],{},[17,4718,4720],{"id":4719},"layered-state-keeps-navigation-stable","Layered State Keeps Navigation Stable",[22,4722,4723],{},"Navigation only handles movement and small primitives (IDs, filters, flags)—never full objects, which fail serialization and stale quickly. Load data in destinations.",[22,4725,4726],{},"Three layers:",[4728,4729,4730,4739],"ol",{},[74,4731,4732,4735,4736,3830],{},[77,4733,4734],{},"Nav args",": Primitives only, e.g., ",[26,4737,4738],{},"navController.navigate(UserDetails.createRoute(42L))",[74,4740,4741,4744,4745,4748],{},[77,4742,4743],{},"ViewModels",": Screen\u002Fbusiness state with API calls, loading\u002Ferrors. Extract args via ",[26,4746,4747],{},"SavedStateHandle",":",[3904,4750,4752],{"className":4541,"code":4751,"language":4543,"meta":117,"style":117},"class UserDetailsViewModel(savedStateHandle: SavedStateHandle) : ViewModel() {\n    private val userId: Long = checkNotNull(savedStateHandle[\"userId\"])\n    val uiState = MutableStateFlow(UserDetailsUiState())\n    \u002F\u002F Load data in init...\n}\n",[26,4753,4754,4759,4764,4769,4774],{"__ignoreMap":117},[3912,4755,4756],{"class":3914,"line":3915},[3912,4757,4758],{},"class UserDetailsViewModel(savedStateHandle: SavedStateHandle) : ViewModel() {\n",[3912,4760,4761],{"class":3914,"line":118},[3912,4762,4763],{},"    private val userId: Long = checkNotNull(savedStateHandle[\"userId\"])\n",[3912,4765,4766],{"class":3914,"line":142},[3912,4767,4768],{},"    val uiState = MutableStateFlow(UserDetailsUiState())\n",[3912,4770,4771],{"class":3914,"line":141},[3912,4772,4773],{},"    \u002F\u002F Load data in init...\n",[3912,4775,4776],{"class":3914,"line":3977},[3912,4777,4599],{},[4728,4779,4780],{"start":142},[74,4781,4782,4785,4786,4789],{},[77,4783,4784],{},"Composable state",": UI-only like ",[26,4787,4788],{},"rememberSaveable { mutableStateOf(\"\") }"," for inputs\u002Ftoggles.",[22,4791,4792],{},"This separation makes nav robust: pass ID, fetch fresh data, avoid fragile deep passing.",[17,4794,4796],{"id":4795},"route-level-wiring-and-tab-polish","Route-Level Wiring and Tab Polish",[22,4798,4799,4800,4803],{},"Avoid scattering ",[26,4801,4802],{},"NavController"," in leaf UI—pass lambdas from route composables for reusable, testable screens:",[3904,4805,4807],{"className":4541,"code":4806,"language":4543,"meta":117,"style":117},"@Composable\nfun HomeRoute(navController: NavHostController) {\n    HomeScreen(\n        onOpenSettings = { navController.navigate(\"settings\") },\n        onOpenUser = { id -> navController.navigate(\"user\u002F$id\") }\n    )\n}\n@Composable\nfun HomeScreen(onOpenSettings: () -> Unit, onOpenUser: (Long) -> Unit) {\n    \u002F\u002F Buttons call lambdas\n}\n",[26,4808,4809,4813,4818,4823,4828,4833,4838,4842,4846,4851,4856],{"__ignoreMap":117},[3912,4810,4811],{"class":3914,"line":3915},[3912,4812,4550],{},[3912,4814,4815],{"class":3914,"line":118},[3912,4816,4817],{},"fun HomeRoute(navController: NavHostController) {\n",[3912,4819,4820],{"class":3914,"line":142},[3912,4821,4822],{},"    HomeScreen(\n",[3912,4824,4825],{"class":3914,"line":141},[3912,4826,4827],{},"        onOpenSettings = { navController.navigate(\"settings\") },\n",[3912,4829,4830],{"class":3914,"line":3977},[3912,4831,4832],{},"        onOpenUser = { id -> navController.navigate(\"user\u002F$id\") }\n",[3912,4834,4835],{"class":3914,"line":3983},[3912,4836,4837],{},"    )\n",[3912,4839,4840],{"class":3914,"line":4011},[3912,4841,4599],{},[3912,4843,4844],{"class":3914,"line":4027},[3912,4845,4550],{},[3912,4847,4848],{"class":3914,"line":4033},[3912,4849,4850],{},"fun HomeScreen(onOpenSettings: () -> Unit, onOpenUser: (Long) -> Unit) {\n",[3912,4852,4853],{"class":3914,"line":4039},[3912,4854,4855],{},"    \u002F\u002F Buttons call lambdas\n",[3912,4857,4858],{"class":3914,"line":4045},[3912,4859,4599],{},[22,4861,4862],{},"For bottom tabs, use this nav spec to avoid duplicates, save\u002Frestore state:",[3904,4864,4866],{"className":4541,"code":4865,"language":4543,"meta":117,"style":117},"navController.navigate(route) {\n    popUpTo(navController.graph.startDestinationId) { saveState = true }\n    launchSingleTop = true\n    restoreState = true\n}\n",[26,4867,4868,4873,4878,4883,4888],{"__ignoreMap":117},[3912,4869,4870],{"class":3914,"line":3915},[3912,4871,4872],{},"navController.navigate(route) {\n",[3912,4874,4875],{"class":3914,"line":118},[3912,4876,4877],{},"    popUpTo(navController.graph.startDestinationId) { saveState = true }\n",[3912,4879,4880],{"class":3914,"line":142},[3912,4881,4882],{},"    launchSingleTop = true\n",[3912,4884,4885],{"class":3914,"line":141},[3912,4886,4887],{},"    restoreState = true\n",[3912,4889,4890],{"class":3914,"line":3977},[3912,4891,4599],{},[22,4893,4894],{},"This preserves tab state across switches, polishing UX.",[17,4896,4898],{"id":4897},"full-stack-ties-it-together","Full Stack Ties It Together",[22,4900,4901,4902,4905,4906,4909,4910,4913,4914,4917,4918,4921],{},"Thin ",[26,4903,4904],{},"MainActivity"," sets ",[26,4907,4908],{},"App()"," with ",[26,4911,4912],{},"rememberNavController()",". ",[26,4915,4916],{},"AppNavHost"," wires root. Graphs use route sealed interfaces (e.g., ",[26,4919,4920],{},"AuthDest.Login.route","). UserDetails handles args:",[3904,4923,4925],{"className":4541,"code":4924,"language":4543,"meta":117,"style":117},"composable(\n    route = MainDest.UserDetails.route,\n    arguments = listOf(navArgument(MainDest.UserDetails.ARG) { type = NavType.LongType })\n) { entry ->\n    val userId = entry.arguments?.getLong(MainDest.UserDetails.ARG) ?: return@composable\n    UserDetailsRoute(userId)\n}\n",[26,4926,4927,4932,4937,4942,4947,4952,4957],{"__ignoreMap":117},[3912,4928,4929],{"class":3914,"line":3915},[3912,4930,4931],{},"composable(\n",[3912,4933,4934],{"class":3914,"line":118},[3912,4935,4936],{},"    route = MainDest.UserDetails.route,\n",[3912,4938,4939],{"class":3914,"line":142},[3912,4940,4941],{},"    arguments = listOf(navArgument(MainDest.UserDetails.ARG) { type = NavType.LongType })\n",[3912,4943,4944],{"class":3914,"line":141},[3912,4945,4946],{},") { entry ->\n",[3912,4948,4949],{"class":3914,"line":3977},[3912,4950,4951],{},"    val userId = entry.arguments?.getLong(MainDest.UserDetails.ARG) ?: return@composable\n",[3912,4953,4954],{"class":3914,"line":3983},[3912,4955,4956],{},"    UserDetailsRoute(userId)\n",[3912,4958,4959],{"class":3914,"line":4011},[3912,4960,4599],{},[22,4962,4963,4966,4967,4970,4971,4974,4975,4978],{},[26,4964,4965],{},"UserDetailsRoute"," injects ",[26,4968,4969],{},"viewModel()",", collects ",[26,4972,4973],{},"uiState",", passes to pure ",[26,4976,4977],{},"UserDetailsScreen",". Add screens freely without central chaos.",[4123,4980,4495],{},{"title":117,"searchDepth":118,"depth":118,"links":4982},[4983,4984,4985,4986],{"id":4531,"depth":118,"text":4532},{"id":4719,"depth":118,"text":4720},{"id":4795,"depth":118,"text":4796},{"id":4897,"depth":118,"text":4898},[124],{"content_references":4989,"triage":4990},[],{"relevance":141,"novelty":142,"quality":141,"actionability":141,"composite":143,"reasoning":4991},"Category: Software Engineering. The article provides a practical approach to scaling navigation in Jetpack Compose, addressing a common pain point for developers managing complex app architectures. It includes specific code examples and a structured method for implementing nested graphs and layered state, making it actionable for developers looking to improve their navigation systems.","\u002Fsummaries\u002F8d5558e87957c77a-scale-compose-nav-with-nested-graphs-and-state-lay-summary","2026-05-01 20:30:17","2026-05-03 17:00:35",{"title":4521,"description":117},{"loc":4992},"8d5558e87957c77a","https:\u002F\u002Flevelup.gitconnected.com\u002Fscaling-navigation-in-jetpack-compose-from-simple-apps-to-real-world-architecture-c6cf897f5a58?source=rss----5517fd7b58a6---4","summaries\u002F8d5558e87957c77a-scale-compose-nav-with-nested-graphs-and-state-lay-summary",[158,159,5001],"dev-productivity","For apps with 20-50 screens, use one root NavHost with nested feature graphs, centralized route objects, and layered state (nav args for IDs, ViewModels for data, composables for UI) to prevent navigation fragility.",[159,5001],"MdJCmrlysKnhasneoBQPUQQjKPDk05jtmg82txx-jf4"]