[{"data":1,"prerenderedAt":807},["ShallowReactive",2],{"navigation":3,"/docs/recipes/realtime-feed":186,"/docs/recipes/realtime-feed-surround":802},[4],{"title":5,"path":6,"stem":7,"children":8,"page":39},"Docs","/docs","docs",[9,40,60,78,100,114,158],{"title":10,"path":11,"stem":12,"children":13,"page":39},"Guide","/docs/guide","docs/1.guide",[14,19,24,29,34],{"title":15,"path":16,"stem":17,"icon":18},"Getting Started","/docs/guide/get-started","docs/1.guide/1.get-started","i-lucide-rocket",{"title":20,"path":21,"stem":22,"icon":23},"Basics","/docs/guide/basics","docs/1.guide/2.basics","i-lucide-book-open",{"title":25,"path":26,"stem":27,"icon":28},"Authentication","/docs/guide/auth","docs/1.guide/3.auth","i-lucide-shield-check",{"title":30,"path":31,"stem":32,"icon":33},"Permissions","/docs/guide/permissions","docs/1.guide/4.permissions","i-lucide-shield",{"title":35,"path":36,"stem":37,"icon":38},"Core Concepts","/docs/guide/concepts","docs/1.guide/5.concepts","i-lucide-lightbulb",false,{"title":41,"path":42,"stem":43,"children":44,"page":39},"Data Fetching","/docs/data-fetching","docs/2.data-fetching",[45,50,55],{"title":46,"path":47,"stem":48,"icon":49},"Fetching Data","/docs/data-fetching/queries","docs/2.data-fetching/1.queries","i-lucide-database",{"title":51,"path":52,"stem":53,"icon":54},"Pagination","/docs/data-fetching/pagination","docs/2.data-fetching/2.pagination","i-lucide-list",{"title":56,"path":57,"stem":58,"icon":59},"Caching & Data Reuse","/docs/data-fetching/caching-reuse","docs/2.data-fetching/3.caching-reuse","i-lucide-database-zap",{"title":61,"path":62,"stem":63,"children":64,"page":39},"Mutations","/docs/mutations","docs/3.mutations",[65,69,74],{"title":61,"path":66,"stem":67,"icon":68},"/docs/mutations/mutations","docs/3.mutations/1.mutations","i-lucide-pen-tool",{"title":70,"path":71,"stem":72,"icon":73},"Actions","/docs/mutations/actions","docs/3.mutations/2.actions","i-lucide-zap",{"title":75,"path":76,"stem":77,"icon":73},"Optimistic Updates","/docs/mutations/optimistic-updates","docs/3.mutations/3.optimistic-updates",{"title":79,"path":80,"stem":81,"children":82,"page":39},"Auth Security","/docs/auth-security","docs/4.auth-security",[83,87,91,95],{"title":84,"path":85,"stem":86,"icon":28},"Permissions Setup","/docs/auth-security/permissions-setup","docs/4.auth-security/0.permissions-setup",{"title":25,"path":88,"stem":89,"icon":90},"/docs/auth-security/authentication","docs/4.auth-security/1.authentication","i-lucide-lock",{"title":92,"path":93,"stem":94,"icon":33},"Permissions Reference","/docs/auth-security/permissions","docs/4.auth-security/2.permissions",{"title":96,"path":97,"stem":98,"icon":99},"Standard Role Template","/docs/auth-security/standard-role-template","docs/4.auth-security/3.standard-role-template","i-lucide-file-check",{"title":101,"path":102,"stem":103,"children":104,"page":39},"Server Side","/docs/server-side","docs/5.server-side",[105,110],{"title":106,"path":107,"stem":108,"icon":109},"Server Routes","/docs/server-side/server-routes","docs/5.server-side/1.server-routes","i-lucide-server",{"title":111,"path":112,"stem":113,"icon":109},"SSR & Hydration","/docs/server-side/ssr-hydration","docs/5.server-side/2.ssr-hydration",{"title":115,"path":116,"stem":117,"children":118,"page":39},"Advanced","/docs/advanced","docs/6.advanced",[119,124,129,134,139,144,149,154],{"title":120,"path":121,"stem":122,"icon":123},"Connection State","/docs/advanced/connection-state","docs/6.advanced/1.connection-state","i-lucide-wifi",{"title":125,"path":126,"stem":127,"icon":128},"Client Access","/docs/advanced/client-access","docs/6.advanced/2.client-access","i-lucide-box",{"title":130,"path":131,"stem":132,"icon":133},"Performance","/docs/advanced/performance","docs/6.advanced/3.performance","i-lucide-gauge",{"title":135,"path":136,"stem":137,"icon":138},"Error Handling","/docs/advanced/error-handling","docs/6.advanced/4.error-handling","i-lucide-alert-circle",{"title":140,"path":141,"stem":142,"icon":143},"File Storage","/docs/advanced/file-storage","docs/6.advanced/5.file-storage","i-lucide-upload",{"title":145,"path":146,"stem":147,"icon":148},"Logging","/docs/advanced/logging","docs/6.advanced/6.logging","i-lucide-scroll-text",{"title":150,"path":151,"stem":152,"icon":153},"Module Configuration","/docs/advanced/module-config","docs/6.advanced/7.module-config","i-lucide-settings",{"title":155,"path":156,"stem":157,"icon":54},"API Surface","/docs/advanced/api-surface","docs/6.advanced/8.api-surface",{"title":159,"path":160,"stem":161,"children":162,"page":39},"Recipes","/docs/recipes","docs/7.recipes",[163,168,173,178,182],{"title":164,"path":165,"stem":166,"icon":167},"Protected Dashboard","/docs/recipes/protected-dashboard","docs/7.recipes/1.protected-dashboard","i-lucide-layout-dashboard",{"title":169,"path":170,"stem":171,"icon":172},"Real-Time Feed","/docs/recipes/realtime-feed","docs/7.recipes/2.realtime-feed","i-lucide-messages-square",{"title":174,"path":175,"stem":176,"icon":177},"User Augmentation","/docs/recipes/user-augmentation","docs/7.recipes/3.user-augmentation","i-lucide-user-round-cog",{"title":179,"path":180,"stem":181,"icon":28},"Auth Guards and Permissions","/docs/recipes/auth-guards-and-permissions","docs/7.recipes/4.auth-guards-and-permissions",{"title":183,"path":184,"stem":185,"icon":73},"Instant List → Detail Navigation","/docs/recipes/instant-list-detail-cache-reuse","docs/7.recipes/5.instant-list-detail-cache-reuse",{"id":187,"title":169,"body":188,"description":794,"extension":795,"links":796,"meta":797,"navigation":798,"path":170,"seo":799,"sitemap":800,"stem":171,"__hash__":801},"docs/docs/7.recipes/2.realtime-feed.md",{"type":189,"value":190,"toc":790},"minimark",[191,196,200,753,757,786],[192,193,195],"h2",{"id":194},"goal","Goal",[197,198,199],"p",{},"Render a live-updating list and prepend optimistic items instantly.",[201,202,207],"pre",{"className":203,"code":204,"language":205,"meta":206,"style":206},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cscript setup lang=\"ts\">\nimport { api } from '~~/convex/_generated/api'\n\nconst message = ref('')\n\nconst { results, status, loadMore, isLoading } = await useConvexPaginatedQuery(\n  api.messages.listPaginated,\n  {},\n  {\n    initialNumItems: 20,\n  },\n)\n\nconst { execute: sendMessage, pending } = useConvexMutation(api.messages.send, {\n  optimisticUpdate: (localStore, args) => {\n    insertAtTop({\n      query: api.messages.listPaginated,\n      store: localStore,\n      item: {\n        _id: crypto.randomUUID(),\n        _creationTime: Date.now(),\n        text: args.text,\n        authorName: 'You',\n      },\n    })\n  },\n})\n\nasync function submit() {\n  if (!message.value.trim()) return\n  await sendMessage({ text: message.value })\n  message.value = ''\n}\n\u003C/script>\n","vue","",[208,209,210,245,274,281,305,310,351,371,377,383,398,404,409,414,458,486,497,517,530,540,561,581,598,616,622,630,635,642,647,663,693,722,737,743],"code",{"__ignoreMap":206},[211,212,215,219,223,227,230,233,236,240,242],"span",{"class":213,"line":214},"line",1,[211,216,218],{"class":217},"sMK4o","\u003C",[211,220,222],{"class":221},"swJcz","script",[211,224,226],{"class":225},"spNyl"," setup",[211,228,229],{"class":225}," lang",[211,231,232],{"class":217},"=",[211,234,235],{"class":217},"\"",[211,237,239],{"class":238},"sfazB","ts",[211,241,235],{"class":217},[211,243,244],{"class":217},">\n",[211,246,248,252,255,259,262,265,268,271],{"class":213,"line":247},2,[211,249,251],{"class":250},"s7zQu","import",[211,253,254],{"class":217}," {",[211,256,258],{"class":257},"sTEyZ"," api",[211,260,261],{"class":217}," }",[211,263,264],{"class":250}," from",[211,266,267],{"class":217}," '",[211,269,270],{"class":238},"~~/convex/_generated/api",[211,272,273],{"class":217},"'\n",[211,275,277],{"class":213,"line":276},3,[211,278,280],{"emptyLinePlaceholder":279},true,"\n",[211,282,284,287,290,292,296,299,302],{"class":213,"line":283},4,[211,285,286],{"class":225},"const",[211,288,289],{"class":257}," message ",[211,291,232],{"class":217},[211,293,295],{"class":294},"s2Zo4"," ref",[211,297,298],{"class":257},"(",[211,300,301],{"class":217},"''",[211,303,304],{"class":257},")\n",[211,306,308],{"class":213,"line":307},5,[211,309,280],{"emptyLinePlaceholder":279},[211,311,313,315,317,320,323,326,328,331,333,336,339,342,345,348],{"class":213,"line":312},6,[211,314,286],{"class":225},[211,316,254],{"class":217},[211,318,319],{"class":257}," results",[211,321,322],{"class":217},",",[211,324,325],{"class":257}," status",[211,327,322],{"class":217},[211,329,330],{"class":257}," loadMore",[211,332,322],{"class":217},[211,334,335],{"class":257}," isLoading ",[211,337,338],{"class":217},"}",[211,340,341],{"class":217}," =",[211,343,344],{"class":250}," await",[211,346,347],{"class":294}," useConvexPaginatedQuery",[211,349,350],{"class":257},"(\n",[211,352,354,357,360,363,365,368],{"class":213,"line":353},7,[211,355,356],{"class":257},"  api",[211,358,359],{"class":217},".",[211,361,362],{"class":257},"messages",[211,364,359],{"class":217},[211,366,367],{"class":257},"listPaginated",[211,369,370],{"class":217},",\n",[211,372,374],{"class":213,"line":373},8,[211,375,376],{"class":217},"  {},\n",[211,378,380],{"class":213,"line":379},9,[211,381,382],{"class":217},"  {\n",[211,384,386,389,392,396],{"class":213,"line":385},10,[211,387,388],{"class":221},"    initialNumItems",[211,390,391],{"class":217},":",[211,393,395],{"class":394},"sbssI"," 20",[211,397,370],{"class":217},[211,399,401],{"class":213,"line":400},11,[211,402,403],{"class":217},"  },\n",[211,405,407],{"class":213,"line":406},12,[211,408,304],{"class":257},[211,410,412],{"class":213,"line":411},13,[211,413,280],{"emptyLinePlaceholder":279},[211,415,417,419,421,424,426,429,431,434,436,438,441,444,446,448,450,453,455],{"class":213,"line":416},14,[211,418,286],{"class":225},[211,420,254],{"class":217},[211,422,423],{"class":221}," execute",[211,425,391],{"class":217},[211,427,428],{"class":257}," sendMessage",[211,430,322],{"class":217},[211,432,433],{"class":257}," pending ",[211,435,338],{"class":217},[211,437,341],{"class":217},[211,439,440],{"class":294}," useConvexMutation",[211,442,443],{"class":257},"(api",[211,445,359],{"class":217},[211,447,362],{"class":257},[211,449,359],{"class":217},[211,451,452],{"class":257},"send",[211,454,322],{"class":217},[211,456,457],{"class":217}," {\n",[211,459,461,464,466,469,473,475,478,481,484],{"class":213,"line":460},15,[211,462,463],{"class":294},"  optimisticUpdate",[211,465,391],{"class":217},[211,467,468],{"class":217}," (",[211,470,472],{"class":471},"sHdIc","localStore",[211,474,322],{"class":217},[211,476,477],{"class":471}," args",[211,479,480],{"class":217},")",[211,482,483],{"class":225}," =>",[211,485,457],{"class":217},[211,487,489,492,494],{"class":213,"line":488},16,[211,490,491],{"class":294},"    insertAtTop",[211,493,298],{"class":221},[211,495,496],{"class":217},"{\n",[211,498,500,503,505,507,509,511,513,515],{"class":213,"line":499},17,[211,501,502],{"class":221},"      query",[211,504,391],{"class":217},[211,506,258],{"class":257},[211,508,359],{"class":217},[211,510,362],{"class":257},[211,512,359],{"class":217},[211,514,367],{"class":257},[211,516,370],{"class":217},[211,518,520,523,525,528],{"class":213,"line":519},18,[211,521,522],{"class":221},"      store",[211,524,391],{"class":217},[211,526,527],{"class":257}," localStore",[211,529,370],{"class":217},[211,531,533,536,538],{"class":213,"line":532},19,[211,534,535],{"class":221},"      item",[211,537,391],{"class":217},[211,539,457],{"class":217},[211,541,543,546,548,551,553,556,559],{"class":213,"line":542},20,[211,544,545],{"class":221},"        _id",[211,547,391],{"class":217},[211,549,550],{"class":257}," crypto",[211,552,359],{"class":217},[211,554,555],{"class":294},"randomUUID",[211,557,558],{"class":221},"()",[211,560,370],{"class":217},[211,562,564,567,569,572,574,577,579],{"class":213,"line":563},21,[211,565,566],{"class":221},"        _creationTime",[211,568,391],{"class":217},[211,570,571],{"class":257}," Date",[211,573,359],{"class":217},[211,575,576],{"class":294},"now",[211,578,558],{"class":221},[211,580,370],{"class":217},[211,582,584,587,589,591,593,596],{"class":213,"line":583},22,[211,585,586],{"class":221},"        text",[211,588,391],{"class":217},[211,590,477],{"class":257},[211,592,359],{"class":217},[211,594,595],{"class":257},"text",[211,597,370],{"class":217},[211,599,601,604,606,608,611,614],{"class":213,"line":600},23,[211,602,603],{"class":221},"        authorName",[211,605,391],{"class":217},[211,607,267],{"class":217},[211,609,610],{"class":238},"You",[211,612,613],{"class":217},"'",[211,615,370],{"class":217},[211,617,619],{"class":213,"line":618},24,[211,620,621],{"class":217},"      },\n",[211,623,625,628],{"class":213,"line":624},25,[211,626,627],{"class":217},"    }",[211,629,304],{"class":221},[211,631,633],{"class":213,"line":632},26,[211,634,403],{"class":217},[211,636,638,640],{"class":213,"line":637},27,[211,639,338],{"class":217},[211,641,304],{"class":257},[211,643,645],{"class":213,"line":644},28,[211,646,280],{"emptyLinePlaceholder":279},[211,648,650,653,656,659,661],{"class":213,"line":649},29,[211,651,652],{"class":225},"async",[211,654,655],{"class":225}," function",[211,657,658],{"class":294}," submit",[211,660,558],{"class":217},[211,662,457],{"class":217},[211,664,666,669,671,674,677,679,682,684,687,690],{"class":213,"line":665},30,[211,667,668],{"class":250},"  if",[211,670,468],{"class":221},[211,672,673],{"class":217},"!",[211,675,676],{"class":257},"message",[211,678,359],{"class":217},[211,680,681],{"class":257},"value",[211,683,359],{"class":217},[211,685,686],{"class":294},"trim",[211,688,689],{"class":221},"()) ",[211,691,692],{"class":250},"return\n",[211,694,696,699,701,703,706,709,711,714,716,718,720],{"class":213,"line":695},31,[211,697,698],{"class":250},"  await",[211,700,428],{"class":294},[211,702,298],{"class":221},[211,704,705],{"class":217},"{",[211,707,708],{"class":221}," text",[211,710,391],{"class":217},[211,712,713],{"class":257}," message",[211,715,359],{"class":217},[211,717,681],{"class":257},[211,719,261],{"class":217},[211,721,304],{"class":221},[211,723,725,728,730,732,734],{"class":213,"line":724},32,[211,726,727],{"class":257},"  message",[211,729,359],{"class":217},[211,731,681],{"class":257},[211,733,341],{"class":217},[211,735,736],{"class":217}," ''\n",[211,738,740],{"class":213,"line":739},33,[211,741,742],{"class":217},"}\n",[211,744,746,749,751],{"class":213,"line":745},34,[211,747,748],{"class":217},"\u003C/",[211,750,222],{"class":221},[211,752,244],{"class":217},[192,754,756],{"id":755},"notes","Notes",[758,759,760,764,775],"ul",{},[761,762,763],"li",{},"Keep optimistic items minimal and shape-compatible with your query result.",[761,765,766,767,770,771,774],{},"Prefer ",[208,768,769],{},"insertAtTop"," for chat/feed timelines and ",[208,772,773],{},"insertAtBottomIfLoaded"," for append-heavy lists.",[761,776,777,778,781,782,785],{},"Use ",[208,779,780],{},"status"," / ",[208,783,784],{},"isLoading"," to render loading states without extra refs.",[787,788,789],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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":206,"searchDepth":214,"depth":247,"links":791},[792,793],{"id":194,"depth":247,"text":195},{"id":755,"depth":247,"text":756},"Build a feed/chat UI with paginated queries and optimistic inserts.","md",null,{},{"icon":172},{"title":169,"description":794},{"loc":170},"cgIFmdc5gmruLW0jd3gCqmSgKD8hszsSIwAUAbkGH5Q",[803,805],{"title":164,"path":165,"stem":166,"description":804,"icon":167,"children":-1},"Protect a dashboard page with definePageMeta and role checks.",{"title":174,"path":175,"stem":176,"description":806,"icon":177,"children":-1},"Add custom claims typing to useConvexAuth().user with module augmentation.",1772891787302]