[{"data":1,"prerenderedAt":1471},["ShallowReactive",2],{"docs-navigation:en":3,"content-page:docs:WnPR9k3PaUtJC0fNS7-mcnlCFHo-AOX_m2A0P7NwApM":595,"content-page-surround:docs:WnPR9k3PaUtJC0fNS7-mcnlCFHo-AOX_m2A0P7NwApM":1459,"i-logos:typescript-icon":1464,"i-lucide:clipboard":1468},[4,55,123,191,450,509,554,590],{"title":5,"page":6,"canonicalKey":7,"locale":8,"id":9,"draft":6,"icon":10,"sidebar":11,"children":12},"Learn",false,"1","en","content:docs:1.overview:.navigation.yml","i-lucide-book-open","section",[13,20,27,34,41,48],{"title":14,"id":15,"canonicalKey":16,"locale":8,"draft":6,"navigation":17,"icon":18,"path":19},"Better Convex Nuxt","content:docs:1.overview:1.introduction.md","1\u002F1",{"icon":18},"i-lucide-orbit","\u002Fdocs\u002Foverview\u002Fintroduction",{"title":21,"id":22,"canonicalKey":23,"locale":8,"draft":6,"navigation":24,"icon":25,"path":26},"Why Better Convex Nuxt","content:docs:1.overview:2.why-better-convex-nuxt.md","1\u002F2",{"icon":25},"i-lucide-badge-check","\u002Fdocs\u002Foverview\u002Fwhy-better-convex-nuxt",{"title":28,"id":29,"canonicalKey":30,"locale":8,"draft":6,"navigation":31,"icon":32,"path":33},"Who It Is For","content:docs:1.overview:3.who-it-is-for.md","1\u002F3",{"icon":32},"i-lucide-users","\u002Fdocs\u002Foverview\u002Fwho-it-is-for",{"title":35,"id":36,"canonicalKey":37,"locale":8,"draft":6,"navigation":38,"icon":39,"path":40},"Use Cases","content:docs:1.overview:4.use-cases.md","1\u002F4",{"icon":39},"i-lucide-layout-dashboard","\u002Fdocs\u002Foverview\u002Fuse-cases",{"title":42,"id":43,"canonicalKey":44,"locale":8,"draft":6,"navigation":45,"icon":46,"path":47},"Compare Nuxt Integrations","content:docs:1.overview:5.comparison.md","1\u002F5",{"icon":46},"i-lucide-scale","\u002Fdocs\u002Foverview\u002Fcomparison",{"title":49,"id":50,"canonicalKey":51,"locale":8,"draft":6,"navigation":52,"icon":53,"path":54},"Limitations and Trade-offs","content:docs:1.overview:6.limitations.md","1\u002F6",{"icon":53},"i-lucide-triangle-alert","\u002Fdocs\u002Foverview\u002Flimitations",{"title":56,"page":6,"canonicalKey":57,"locale":8,"id":58,"draft":6,"icon":59,"children":60},"Understand","2","content:docs:2.understand:.navigation.yml","i-lucide-brain",[61,67,74,81,88,95,102,109,116],{"title":62,"id":63,"canonicalKey":64,"locale":8,"draft":6,"navigation":65,"icon":59,"path":66},"Mental Model","content:docs:2.understand:1.mental-model.md","2\u002F1",{"icon":59},"\u002Fdocs\u002Funderstand\u002Fmental-model",{"title":68,"id":69,"canonicalKey":70,"locale":8,"draft":6,"navigation":71,"icon":72,"path":73},"Request Lifecycle","content:docs:2.understand:2.request-lifecycle.md","2\u002F2",{"icon":72},"i-lucide-route","\u002Fdocs\u002Funderstand\u002Frequest-lifecycle",{"title":75,"id":76,"canonicalKey":77,"locale":8,"draft":6,"navigation":78,"icon":79,"path":80},"SSR, Hydration, and Real-Time","content:docs:2.understand:3.ssr-hydration-realtime.md","2\u002F3",{"icon":79},"i-lucide-refresh-cw","\u002Fdocs\u002Funderstand\u002Fssr-hydration-realtime",{"title":82,"id":83,"canonicalKey":84,"locale":8,"draft":6,"navigation":85,"icon":86,"path":87},"Query Ownership and Caching","content:docs:2.understand:4.query-ownership-and-caching.md","2\u002F4",{"icon":86},"i-lucide-database","\u002Fdocs\u002Funderstand\u002Fquery-ownership-and-caching",{"title":89,"id":90,"canonicalKey":91,"locale":8,"draft":6,"navigation":92,"icon":93,"path":94},"Authentication and Identity","content:docs:2.understand:5.authentication-and-identity.md","2\u002F5",{"icon":93},"i-lucide-fingerprint","\u002Fdocs\u002Funderstand\u002Fauthentication-and-identity",{"title":96,"id":97,"canonicalKey":98,"locale":8,"draft":6,"navigation":99,"icon":100,"path":101},"Server and Client Boundaries","content:docs:2.understand:6.server-and-client-boundaries.md","2\u002F6",{"icon":100},"i-lucide-panels-top-left","\u002Fdocs\u002Funderstand\u002Fserver-and-client-boundaries",{"title":103,"id":104,"canonicalKey":105,"locale":8,"draft":6,"navigation":106,"icon":107,"path":108},"Errors and Failures","content:docs:2.understand:7.errors-and-failures.md","2\u002F7",{"icon":107},"i-lucide-circle-x","\u002Fdocs\u002Funderstand\u002Ferrors-and-failures",{"title":110,"id":111,"canonicalKey":112,"locale":8,"draft":6,"navigation":113,"icon":114,"path":115},"Design Decisions","content:docs:2.understand:8.design-decisions.md","2\u002F8",{"icon":114},"i-lucide-git-branch","\u002Fdocs\u002Funderstand\u002Fdesign-decisions",{"title":117,"id":118,"canonicalKey":119,"locale":8,"draft":6,"navigation":120,"icon":121,"path":122},"Glossary","content:docs:2.understand:9.glossary.md","2\u002F9",{"icon":121},"i-lucide-book-a","\u002Fdocs\u002Funderstand\u002Fglossary",{"title":124,"page":6,"canonicalKey":125,"locale":8,"id":126,"draft":6,"icon":127,"children":128},"Get Started","3","content:docs:3.get-started:.navigation.yml","i-lucide-rocket",[129,136,143,150,157,164,171,178,185],{"title":130,"id":131,"canonicalKey":132,"locale":8,"draft":6,"navigation":133,"icon":134,"path":135},"Choose Your Path","content:docs:3.get-started:1.choose-your-path.md","3\u002F1",{"icon":134},"i-lucide-signpost","\u002Fdocs\u002Fget-started\u002Fchoose-your-path",{"title":137,"id":138,"canonicalKey":139,"locale":8,"draft":6,"navigation":140,"icon":141,"path":142},"Installation","content:docs:3.get-started:2.installation.md","3\u002F2",{"icon":141},"i-lucide-download","\u002Fdocs\u002Fget-started\u002Finstallation",{"title":144,"id":145,"canonicalKey":146,"locale":8,"draft":6,"navigation":147,"icon":148,"path":149},"First Real-Time Page","content:docs:3.get-started:3.first-realtime-page.md","3\u002F3",{"icon":148},"i-lucide-radio","\u002Fdocs\u002Fget-started\u002Ffirst-realtime-page",{"title":151,"id":152,"canonicalKey":153,"locale":8,"draft":6,"navigation":154,"icon":155,"path":156},"Add a Mutation","content:docs:3.get-started:4.add-a-mutation.md","3\u002F4",{"icon":155},"i-lucide-square-pen","\u002Fdocs\u002Fget-started\u002Fadd-a-mutation",{"title":158,"id":159,"canonicalKey":160,"locale":8,"draft":6,"navigation":161,"icon":162,"path":163},"Add Authentication","content:docs:3.get-started:5.add-authentication.md","3\u002F5",{"icon":162},"i-lucide-log-in","\u002Fdocs\u002Fget-started\u002Fadd-authentication",{"title":165,"id":166,"canonicalKey":167,"locale":8,"draft":6,"navigation":168,"icon":169,"path":170},"Protect Data","content:docs:3.get-started:6.protect-data.md","3\u002F6",{"icon":169},"i-lucide-shield-check","\u002Fdocs\u002Fget-started\u002Fprotect-data",{"title":172,"id":173,"canonicalKey":174,"locale":8,"draft":6,"navigation":175,"icon":176,"path":177},"Project Structure","content:docs:3.get-started:7.project-structure.md","3\u002F7",{"icon":176},"i-lucide-folder-tree","\u002Fdocs\u002Fget-started\u002Fproject-structure",{"title":179,"id":180,"canonicalKey":181,"locale":8,"draft":6,"navigation":182,"icon":183,"path":184},"Next Steps","content:docs:3.get-started:8.next-steps.md","3\u002F8",{"icon":183},"i-lucide-arrow-right","\u002Fdocs\u002Fget-started\u002Fnext-steps",{"title":186,"id":187,"canonicalKey":188,"locale":8,"draft":6,"navigation":189,"icon":100,"path":190},"Plain Vue and Vite","content:docs:3.get-started:9.plain-vue.md","3\u002F9",{"icon":100},"\u002Fdocs\u002Fget-started\u002Fplain-vue",{"title":192,"page":6,"canonicalKey":193,"locale":8,"id":194,"draft":6,"icon":195,"sidebar":11,"children":196},"Build","4","content:docs:4.build:.navigation.yml","i-lucide-blocks",[197,234,265,336,368,393,432],{"title":198,"page":6,"canonicalKey":199,"locale":8,"children":200},"Queries","4\u002F1",[201,206,213,220,227],{"title":198,"id":202,"canonicalKey":203,"locale":8,"draft":6,"navigation":204,"icon":86,"path":205},"content:docs:4.build:1.queries:1.queries.md","4\u002F1\u002F1",{"icon":86},"\u002Fdocs\u002Fbuild\u002Fqueries\u002Fqueries",{"title":207,"id":208,"canonicalKey":209,"locale":8,"draft":6,"navigation":210,"icon":211,"path":212},"Reactive Arguments","content:docs:4.build:1.queries:2.reactive-arguments.md","4\u002F1\u002F2",{"icon":211},"i-lucide-sliders-horizontal","\u002Fdocs\u002Fbuild\u002Fqueries\u002Freactive-arguments",{"title":214,"id":215,"canonicalKey":216,"locale":8,"draft":6,"navigation":217,"icon":218,"path":219},"Loading and Stale Data","content:docs:4.build:1.queries:3.loading-and-stale-data.md","4\u002F1\u002F3",{"icon":218},"i-lucide-loader-circle","\u002Fdocs\u002Fbuild\u002Fqueries\u002Floading-and-stale-data",{"title":221,"id":222,"canonicalKey":223,"locale":8,"draft":6,"navigation":224,"icon":225,"path":226},"Query Execution Options","content:docs:4.build:1.queries:4.ssr-options.md","4\u002F1\u002F4",{"icon":225},"i-lucide-server-cog","\u002Fdocs\u002Fbuild\u002Fqueries\u002Fssr-options",{"title":228,"id":229,"canonicalKey":230,"locale":8,"draft":6,"navigation":231,"icon":232,"path":233},"Pagination","content:docs:4.build:1.queries:6.pagination.md","4\u002F1\u002F6",{"icon":232},"i-lucide-list-plus","\u002Fdocs\u002Fbuild\u002Fqueries\u002Fpagination",{"title":235,"page":6,"canonicalKey":236,"locale":8,"children":237},"Write Data","4\u002F2",[238,244,251,258],{"title":239,"id":240,"canonicalKey":241,"locale":8,"draft":6,"navigation":242,"icon":155,"path":243},"Mutations","content:docs:4.build:2.write-data:1.mutations.md","4\u002F2\u002F1",{"icon":155},"\u002Fdocs\u002Fbuild\u002Fwrite-data\u002Fmutations",{"title":245,"id":246,"canonicalKey":247,"locale":8,"draft":6,"navigation":248,"icon":249,"path":250},"Actions","content:docs:4.build:2.write-data:2.actions.md","4\u002F2\u002F2",{"icon":249},"i-lucide-zap","\u002Fdocs\u002Fbuild\u002Fwrite-data\u002Factions",{"title":252,"id":253,"canonicalKey":254,"locale":8,"draft":6,"navigation":255,"icon":256,"path":257},"Optimistic Updates","content:docs:4.build:2.write-data:3.optimistic-updates.md","4\u002F2\u002F3",{"icon":256},"i-lucide-gauge","\u002Fdocs\u002Fbuild\u002Fwrite-data\u002Foptimistic-updates",{"title":259,"id":260,"canonicalKey":261,"locale":8,"draft":6,"navigation":262,"icon":263,"path":264},"Concurrent Operations","content:docs:4.build:2.write-data:4.concurrent-operations.md","4\u002F2\u002F4",{"icon":263},"i-lucide-git-fork","\u002Fdocs\u002Fbuild\u002Fwrite-data\u002Fconcurrent-operations",{"title":266,"page":6,"canonicalKey":267,"locale":8,"children":268},"Authentication","4\u002F3",[269,275,282,289,295,301,308,315,322,329],{"title":266,"id":270,"canonicalKey":271,"locale":8,"draft":6,"navigation":272,"icon":273,"path":274},"content:docs:4.build:3.authentication:1.overview.md","4\u002F3\u002F1",{"icon":273},"i-lucide-shield","\u002Fdocs\u002Fbuild\u002Fauthentication\u002Foverview",{"title":276,"id":277,"canonicalKey":278,"locale":8,"draft":6,"navigation":279,"icon":280,"path":281},"Better Auth Setup","content:docs:4.build:3.authentication:2.better-auth-setup.md","4\u002F3\u002F2",{"icon":280},"i-lucide-settings-2","\u002Fdocs\u002Fbuild\u002Fauthentication\u002Fbetter-auth-setup",{"title":283,"id":284,"canonicalKey":285,"locale":8,"draft":6,"navigation":286,"icon":287,"path":288},"Auth State and User Data","content:docs:4.build:3.authentication:3.auth-state-and-user.md","4\u002F3\u002F3",{"icon":287},"i-lucide-user-round","\u002Fdocs\u002Fbuild\u002Fauthentication\u002Fauth-state-and-user",{"title":290,"id":291,"canonicalKey":292,"locale":8,"draft":6,"navigation":293,"icon":162,"path":294},"Sign In and Sign Out","content:docs:4.build:3.authentication:4.sign-in-and-sign-out.md","4\u002F3\u002F4",{"icon":162},"\u002Fdocs\u002Fbuild\u002Fauthentication\u002Fsign-in-and-sign-out",{"title":296,"id":297,"canonicalKey":298,"locale":8,"draft":6,"navigation":299,"icon":72,"path":300},"Route Protection","content:docs:4.build:3.authentication:5.route-protection.md","4\u002F3\u002F5",{"icon":72},"\u002Fdocs\u002Fbuild\u002Fauthentication\u002Froute-protection",{"title":302,"id":303,"canonicalKey":304,"locale":8,"draft":6,"navigation":305,"icon":306,"path":307},"Backend Authorization","content:docs:4.build:3.authentication:6.backend-authorization.md","4\u002F3\u002F6",{"icon":306},"i-lucide-lock-keyhole","\u002Fdocs\u002Fbuild\u002Fauthentication\u002Fbackend-authorization",{"title":309,"id":310,"canonicalKey":311,"locale":8,"draft":6,"navigation":312,"icon":313,"path":314},"Better Auth Plugins","content:docs:4.build:3.authentication:7.better-auth-plugins.md","4\u002F3\u002F7",{"icon":313},"i-lucide-plug","\u002Fdocs\u002Fbuild\u002Fauthentication\u002Fbetter-auth-plugins",{"title":316,"id":317,"canonicalKey":318,"locale":8,"draft":6,"navigation":319,"icon":320,"path":321},"Custom User Fields","content:docs:4.build:3.authentication:8.custom-user-fields.md","4\u002F3\u002F8",{"icon":320},"i-lucide-user-cog","\u002Fdocs\u002Fbuild\u002Fauthentication\u002Fcustom-user-fields",{"title":323,"id":324,"canonicalKey":325,"locale":8,"draft":6,"navigation":326,"icon":327,"path":328},"User Synchronization","content:docs:4.build:3.authentication:9.user-synchronization.md","4\u002F3\u002F9",{"icon":327},"i-lucide-refresh-ccw","\u002Fdocs\u002Fbuild\u002Fauthentication\u002Fuser-synchronization",{"title":330,"id":331,"canonicalKey":332,"locale":8,"draft":6,"navigation":333,"icon":334,"path":335},"Delegated OAuth and MCP","content:docs:4.build:3.authentication:10.delegated-oauth-and-mcp.md","4\u002F3\u002F10",{"icon":334},"i-lucide-bot","\u002Fdocs\u002Fbuild\u002Fauthentication\u002Fdelegated-oauth-and-mcp",{"title":337,"page":6,"canonicalKey":338,"locale":8,"children":339},"Server","4\u002F4",[340,347,354,361],{"title":341,"id":342,"canonicalKey":343,"locale":8,"draft":6,"navigation":344,"icon":345,"path":346},"serverConvex","content:docs:4.build:4.server:1.server-convex.md","4\u002F4\u002F1",{"icon":345},"i-lucide-server","\u002Fdocs\u002Fbuild\u002Fserver\u002Fserver-convex",{"title":348,"id":349,"canonicalKey":350,"locale":8,"draft":6,"navigation":351,"icon":352,"path":353},"Server Routes","content:docs:4.build:4.server:2.server-routes.md","4\u002F4\u002F2",{"icon":352},"i-lucide-waypoints","\u002Fdocs\u002Fbuild\u002Fserver\u002Fserver-routes",{"title":355,"id":356,"canonicalKey":357,"locale":8,"draft":6,"navigation":358,"icon":359,"path":360},"Webhooks and Jobs","content:docs:4.build:4.server:3.webhooks-and-jobs.md","4\u002F4\u002F3",{"icon":359},"i-lucide-webhook","\u002Fdocs\u002Fbuild\u002Fserver\u002Fwebhooks-and-jobs",{"title":362,"id":363,"canonicalKey":364,"locale":8,"draft":6,"navigation":365,"icon":366,"path":367},"Credentials and Server Security","content:docs:4.build:4.server:4.credentials-and-security.md","4\u002F4\u002F4",{"icon":366},"i-lucide-key-round","\u002Fdocs\u002Fbuild\u002Fserver\u002Fcredentials-and-security",{"title":369,"page":6,"canonicalKey":370,"locale":8,"children":371},"Files","4\u002F5",[372,379,386],{"title":373,"id":374,"canonicalKey":375,"locale":8,"draft":6,"navigation":376,"icon":377,"path":378},"Upload Files","content:docs:4.build:5.files:1.upload-files.md","4\u002F5\u002F1",{"icon":377},"i-lucide-upload","\u002Fdocs\u002Fbuild\u002Ffiles\u002Fupload-files",{"title":380,"id":381,"canonicalKey":382,"locale":8,"draft":6,"navigation":383,"icon":384,"path":385},"Storage URLs","content:docs:4.build:5.files:3.storage-urls.md","4\u002F5\u002F3",{"icon":384},"i-lucide-link","\u002Fdocs\u002Fbuild\u002Ffiles\u002Fstorage-urls",{"title":387,"id":388,"canonicalKey":389,"locale":8,"draft":6,"navigation":390,"icon":391,"path":392},"File Validation and Deletion","content:docs:4.build:5.files:4.validation-and-deletion.md","4\u002F5\u002F4",{"icon":391},"i-lucide-file-x","\u002Fdocs\u002Fbuild\u002Ffiles\u002Fvalidation-and-deletion",{"title":394,"page":6,"canonicalKey":395,"locale":8,"children":396},"Application Behavior","4\u002F6",[397,404,411,418,425],{"title":398,"id":399,"canonicalKey":400,"locale":8,"draft":6,"navigation":401,"icon":402,"path":403},"Connection State","content:docs:4.build:6.application-behavior:1.connection-state.md","4\u002F6\u002F1",{"icon":402},"i-lucide-wifi","\u002Fdocs\u002Fbuild\u002Fapplication-behavior\u002Fconnection-state",{"title":405,"id":406,"canonicalKey":407,"locale":8,"draft":6,"navigation":408,"icon":409,"path":410},"Error Handling","content:docs:4.build:6.application-behavior:2.error-handling.md","4\u002F6\u002F2",{"icon":409},"i-lucide-circle-alert","\u002Fdocs\u002Fbuild\u002Fapplication-behavior\u002Ferror-handling",{"title":412,"id":413,"canonicalKey":414,"locale":8,"draft":6,"navigation":415,"icon":416,"path":417},"Logging","content:docs:4.build:6.application-behavior:3.logging.md","4\u002F6\u002F3",{"icon":416},"i-lucide-scroll-text","\u002Fdocs\u002Fbuild\u002Fapplication-behavior\u002Flogging",{"title":419,"id":420,"canonicalKey":421,"locale":8,"draft":6,"navigation":422,"icon":423,"path":424},"DevTools","content:docs:4.build:6.application-behavior:4.devtools.md","4\u002F6\u002F4",{"icon":423},"i-lucide-wrench","\u002Fdocs\u002Fbuild\u002Fapplication-behavior\u002Fdevtools",{"title":426,"id":427,"canonicalKey":428,"locale":8,"draft":6,"navigation":429,"icon":430,"path":431},"Performance","content:docs:4.build:6.application-behavior:5.performance.md","4\u002F6\u002F5",{"icon":430},"i-lucide-chart-no-axes-combined","\u002Fdocs\u002Fbuild\u002Fapplication-behavior\u002Fperformance",{"title":433,"page":6,"canonicalKey":434,"locale":8,"id":435,"draft":6,"icon":334,"children":436},"Agents and MCP","4\u002F7","content:docs:4.build:7.agents:.navigation.yml",[437,444],{"title":438,"id":439,"canonicalKey":440,"locale":8,"draft":6,"navigation":441,"icon":442,"path":443},"MCP on Convex","content:docs:4.build:7.agents:1.mcp.md","4\u002F7\u002F1",{"icon":442},"i-lucide-plug-zap","\u002Fdocs\u002Fbuild\u002Fagents\u002Fmcp",{"title":445,"id":446,"canonicalKey":447,"locale":8,"draft":6,"navigation":448,"icon":100,"path":449},"Vue MCP Apps","content:docs:4.build:7.agents:2.mcp-apps.md","4\u002F7\u002F2",{"icon":100},"\u002Fdocs\u002Fbuild\u002Fagents\u002Fmcp-apps",{"title":451,"page":6,"canonicalKey":452,"locale":8,"id":453,"draft":6,"icon":454,"children":455},"Recipes","5","content:docs:5.recipes:.navigation.yml","i-lucide-cooking-pot",[456,462,469,476,483,490,497,503],{"title":457,"id":458,"canonicalKey":459,"locale":8,"draft":6,"navigation":460,"icon":39,"path":461},"Protected Dashboard","content:docs:5.recipes:1.protected-dashboard.md","5\u002F1",{"icon":39},"\u002Fdocs\u002Frecipes\u002Fprotected-dashboard",{"title":463,"id":464,"canonicalKey":465,"locale":8,"draft":6,"navigation":466,"icon":467,"path":468},"Real-Time Feed","content:docs:5.recipes:2.realtime-feed.md","5\u002F2",{"icon":467},"i-lucide-messages-square","\u002Fdocs\u002Frecipes\u002Frealtime-feed",{"title":470,"id":471,"canonicalKey":472,"locale":8,"draft":6,"navigation":473,"icon":474,"path":475},"Optimistic Todo List","content:docs:5.recipes:3.optimistic-todo-list.md","5\u002F3",{"icon":474},"i-lucide-list-todo","\u002Fdocs\u002Frecipes\u002Foptimistic-todo-list",{"title":477,"id":478,"canonicalKey":479,"locale":8,"draft":6,"navigation":480,"icon":481,"path":482},"Infinite Scroll","content:docs:5.recipes:4.infinite-scroll.md","5\u002F4",{"icon":481},"i-lucide-mouse","\u002Fdocs\u002Frecipes\u002Finfinite-scroll",{"title":484,"id":485,"canonicalKey":486,"locale":8,"draft":6,"navigation":487,"icon":488,"path":489},"File Upload Form","content:docs:5.recipes:5.file-upload-form.md","5\u002F5",{"icon":488},"i-lucide-file-up","\u002Fdocs\u002Frecipes\u002Ffile-upload-form",{"title":491,"id":492,"canonicalKey":493,"locale":8,"draft":6,"navigation":494,"icon":495,"path":496},"Organization Permissions","content:docs:5.recipes:6.organization-permissions.md","5\u002F6",{"icon":495},"i-lucide-building-2","\u002Fdocs\u002Frecipes\u002Forganization-permissions",{"title":498,"id":499,"canonicalKey":500,"locale":8,"draft":6,"navigation":501,"icon":345,"path":502},"Authenticated Server Route","content:docs:5.recipes:7.authenticated-server-route.md","5\u002F7",{"icon":345},"\u002Fdocs\u002Frecipes\u002Fauthenticated-server-route",{"title":504,"id":505,"canonicalKey":506,"locale":8,"draft":6,"navigation":507,"icon":100,"path":508},"Public and Private Data","content:docs:5.recipes:8.public-and-private-data.md","5\u002F8",{"icon":100},"\u002Fdocs\u002Frecipes\u002Fpublic-and-private-data",{"title":510,"page":6,"canonicalKey":511,"locale":8,"id":512,"draft":6,"icon":513,"children":514},"Reference","6","content:docs:6.reference:.navigation.yml","i-lucide-braces",[515,521,527,533,540,547],{"title":516,"id":517,"canonicalKey":518,"locale":8,"draft":6,"navigation":519,"icon":513,"path":520},"Composables","content:docs:6.reference:1.composables.md","6\u002F1",{"icon":513},"\u002Fdocs\u002Freference\u002Fcomposables",{"title":522,"id":523,"canonicalKey":524,"locale":8,"draft":6,"navigation":525,"icon":345,"path":526},"Server API","content:docs:6.reference:3.server-api.md","6\u002F3",{"icon":345},"\u002Fdocs\u002Freference\u002Fserver-api",{"title":528,"id":529,"canonicalKey":530,"locale":8,"draft":6,"navigation":531,"icon":107,"path":532},"Error Types","content:docs:6.reference:4.error-types.md","6\u002F4",{"icon":107},"\u002Fdocs\u002Freference\u002Ferror-types",{"title":534,"id":535,"canonicalKey":536,"locale":8,"draft":6,"navigation":537,"icon":538,"path":539},"Module Configuration","content:docs:6.reference:5.module-configuration.md","6\u002F5",{"icon":538},"i-lucide-settings","\u002Fdocs\u002Freference\u002Fmodule-configuration",{"title":541,"id":542,"canonicalKey":543,"locale":8,"draft":6,"navigation":544,"icon":545,"path":546},"Package Exports","content:docs:6.reference:6.package-exports.md","6\u002F6",{"icon":545},"i-lucide-package-open","\u002Fdocs\u002Freference\u002Fpackage-exports",{"title":548,"id":549,"canonicalKey":550,"locale":8,"draft":6,"navigation":551,"icon":552,"path":553},"API Surface","content:docs:6.reference:7.api-surface.md","6\u002F7",{"icon":552},"i-lucide-list","\u002Fdocs\u002Freference\u002Fapi-surface",{"title":555,"page":6,"canonicalKey":556,"locale":8,"id":557,"draft":6,"icon":280,"children":558},"Operations","7","content:docs:7.operations:.navigation.yml",[559,566,572,578,584],{"title":560,"id":561,"canonicalKey":562,"locale":8,"draft":6,"navigation":563,"icon":564,"path":565},"Environment Variables","content:docs:7.operations:1.environment-variables.md","7\u002F1",{"icon":564},"i-lucide-variable","\u002Fdocs\u002Foperations\u002Fenvironment-variables",{"title":567,"id":568,"canonicalKey":569,"locale":8,"draft":6,"navigation":570,"icon":127,"path":571},"Deployment","content:docs:7.operations:2.deployment.md","7\u002F2",{"icon":127},"\u002Fdocs\u002Foperations\u002Fdeployment",{"title":573,"id":574,"canonicalKey":575,"locale":8,"draft":6,"navigation":576,"icon":169,"path":577},"Security Model","content:docs:7.operations:3.security-model.md","7\u002F3",{"icon":169},"\u002Fdocs\u002Foperations\u002Fsecurity-model",{"title":579,"id":580,"canonicalKey":581,"locale":8,"draft":6,"navigation":582,"icon":423,"path":583},"Troubleshooting","content:docs:7.operations:4.troubleshooting.md","7\u002F4",{"icon":423},"\u002Fdocs\u002Foperations\u002Ftroubleshooting",{"title":585,"id":586,"canonicalKey":587,"locale":8,"draft":6,"navigation":588,"icon":25,"path":589},"Release Compatibility","content:docs:7.operations:5.release-compatibility.md","7\u002F5",{"icon":25},"\u002Fdocs\u002Foperations\u002Frelease-compatibility",{"title":591,"id":592,"canonicalKey":593,"locale":8,"draft":6,"path":594},"Better Convex documentation","content:docs:index.md","\u002F","\u002Fdocs",{"title":276,"description":596,"navigation":597,"body":598,"type":1446,"id":277,"canonicalKey":278,"draft":6,"partial":6,"locale":8,"collection":1447,"navigationFile":6,"file":1448,"route":1454,"resolution":1456},"Configure Better Auth in Convex and connect it to Nuxt through the same-origin auth proxy.",{"icon":280},{"type":599,"children":600,"toc":1434},"root",[601,609,667,672,679,787,807,813,818,927,944,949,1051,1060,1066,1078,1083,1102,1114,1125,1132,1172,1183,1195,1340,1346],{"type":602,"tag":603,"props":604,"children":605},"element","p",{},[606],{"type":607,"value":608},"text","The maintained topology is:",{"type":602,"tag":610,"props":611,"children":613},"pre",{"language":607,"class":612},"shiki shiki-themes light-plus dark-plus dark:dark-plus",[614],{"type":602,"tag":615,"props":616,"children":618},"code",{"class":617},"language-text",[619,630,632,640,641,649,650,658,659],{"type":602,"tag":620,"props":621,"children":624},"span",{"class":622,"style":623},"line","display: inline",[625],{"type":602,"tag":620,"props":626,"children":627},{},[628],{"type":607,"value":629},"Browser or Nuxt SSR",{"type":607,"value":631},"\n",{"type":602,"tag":620,"props":633,"children":634},{"class":622,"style":623},[635],{"type":602,"tag":620,"props":636,"children":637},{},[638],{"type":607,"value":639},"  → same-origin \u002Fapi\u002Fauth\u002F*",{"type":607,"value":631},{"type":602,"tag":620,"props":642,"children":643},{"class":622,"style":623},[644],{"type":602,"tag":620,"props":645,"children":646},{},[647],{"type":607,"value":648},"  → Better Convex Nuxt Nitro proxy",{"type":607,"value":631},{"type":602,"tag":620,"props":651,"children":652},{"class":622,"style":623},[653],{"type":602,"tag":620,"props":654,"children":655},{},[656],{"type":607,"value":657},"  → Convex HTTP Actions site",{"type":607,"value":631},{"type":602,"tag":620,"props":660,"children":661},{"class":622,"style":623},[662],{"type":602,"tag":620,"props":663,"children":664},{},[665],{"type":607,"value":666},"  → Better Auth Convex component",{"type":602,"tag":603,"props":668,"children":669},{},[670],{"type":607,"value":671},"This keeps the session cookie on the Nuxt application origin while Better Auth data remains in Convex.",{"type":602,"tag":673,"props":674,"children":676},"h2",{"id":675},"required-files",[677],{"type":607,"value":678},"Required files",{"type":602,"tag":680,"props":681,"children":682},"table",{},[683,702],{"type":602,"tag":684,"props":685,"children":686},"thead",{},[687],{"type":602,"tag":688,"props":689,"children":690},"tr",{},[691,697],{"type":602,"tag":692,"props":693,"children":694},"th",{},[695],{"type":607,"value":696},"File",{"type":602,"tag":692,"props":698,"children":699},{},[700],{"type":607,"value":701},"Responsibility",{"type":602,"tag":703,"props":704,"children":705},"tbody",{},[706,723,739,755,771],{"type":602,"tag":688,"props":707,"children":708},{},[709,718],{"type":602,"tag":710,"props":711,"children":712},"td",{},[713],{"type":602,"tag":615,"props":714,"children":715},{},[716],{"type":607,"value":717},"convex\u002Fconvex.config.ts",{"type":602,"tag":710,"props":719,"children":720},{},[721],{"type":607,"value":722},"Register the Better Auth component",{"type":602,"tag":688,"props":724,"children":725},{},[726,734],{"type":602,"tag":710,"props":727,"children":728},{},[729],{"type":602,"tag":615,"props":730,"children":731},{},[732],{"type":607,"value":733},"convex\u002Fauth.config.ts",{"type":602,"tag":710,"props":735,"children":736},{},[737],{"type":607,"value":738},"Configure Convex JWT verification",{"type":602,"tag":688,"props":740,"children":741},{},[742,750],{"type":602,"tag":710,"props":743,"children":744},{},[745],{"type":602,"tag":615,"props":746,"children":747},{},[748],{"type":607,"value":749},"convex\u002Fauth.ts",{"type":602,"tag":710,"props":751,"children":752},{},[753],{"type":607,"value":754},"Create the component client and Better Auth factory",{"type":602,"tag":688,"props":756,"children":757},{},[758,766],{"type":602,"tag":710,"props":759,"children":760},{},[761],{"type":602,"tag":615,"props":762,"children":763},{},[764],{"type":607,"value":765},"convex\u002Fhttp.ts",{"type":602,"tag":710,"props":767,"children":768},{},[769],{"type":607,"value":770},"Register Better Auth HTTP routes lazily",{"type":602,"tag":688,"props":772,"children":773},{},[774,782],{"type":602,"tag":710,"props":775,"children":776},{},[777],{"type":602,"tag":615,"props":778,"children":779},{},[780],{"type":607,"value":781},"nuxt.config.ts",{"type":602,"tag":710,"props":783,"children":784},{},[785],{"type":607,"value":786},"Register the Nuxt module and public Convex URLs",{"type":602,"tag":603,"props":788,"children":789},{},[790,792,798,800,805],{"type":607,"value":791},"The complete minimal versions are in ",{"type":602,"tag":793,"props":794,"children":795},"a",{"href":163},[796],{"type":607,"value":797},"Add authentication",{"type":607,"value":799},". Keep them as the baseline and add product-specific Better Auth options in ",{"type":602,"tag":615,"props":801,"children":802},{},[803],{"type":607,"value":804},"createAuth",{"type":607,"value":806},".",{"type":602,"tag":673,"props":808,"children":810},{"id":809},"environment-ownership",[811],{"type":607,"value":812},"Environment ownership",{"type":602,"tag":603,"props":814,"children":815},{},[816],{"type":607,"value":817},"These values exist in the Convex environment. Set the application-owned values;\nConvex injects the deployment-owned built-in automatically:",{"type":602,"tag":680,"props":819,"children":820},{},[821,842],{"type":602,"tag":684,"props":822,"children":823},{},[824],{"type":602,"tag":688,"props":825,"children":826},{},[827,832,837],{"type":602,"tag":692,"props":828,"children":829},{},[830],{"type":607,"value":831},"Variable",{"type":602,"tag":692,"props":833,"children":834},{},[835],{"type":607,"value":836},"Ownership",{"type":602,"tag":692,"props":838,"children":839},{},[840],{"type":607,"value":841},"Purpose",{"type":602,"tag":703,"props":843,"children":844},{},[845,866,887,907],{"type":602,"tag":688,"props":846,"children":847},{},[848,856,861],{"type":602,"tag":710,"props":849,"children":850},{},[851],{"type":602,"tag":615,"props":852,"children":853},{},[854],{"type":607,"value":855},"SITE_URL",{"type":602,"tag":710,"props":857,"children":858},{},[859],{"type":607,"value":860},"Application-owned",{"type":602,"tag":710,"props":862,"children":863},{},[864],{"type":607,"value":865},"Exact Nuxt origin used by Better Auth and trusted origins",{"type":602,"tag":688,"props":867,"children":868},{},[869,877,882],{"type":602,"tag":710,"props":870,"children":871},{},[872],{"type":602,"tag":615,"props":873,"children":874},{},[875],{"type":607,"value":876},"CONVEX_SITE_URL",{"type":602,"tag":710,"props":878,"children":879},{},[880],{"type":607,"value":881},"Convex built-in",{"type":602,"tag":710,"props":883,"children":884},{},[885],{"type":607,"value":886},"Exact Convex HTTP Actions origin used as session issuer",{"type":602,"tag":688,"props":888,"children":889},{},[890,898,902],{"type":602,"tag":710,"props":891,"children":892},{},[893],{"type":602,"tag":615,"props":894,"children":895},{},[896],{"type":607,"value":897},"BETTER_AUTH_SECRETS",{"type":602,"tag":710,"props":899,"children":900},{},[901],{"type":607,"value":860},{"type":602,"tag":710,"props":903,"children":904},{},[905],{"type":607,"value":906},"Versioned Better Auth secrets, newest version first",{"type":602,"tag":688,"props":908,"children":909},{},[910,918,922],{"type":602,"tag":710,"props":911,"children":912},{},[913],{"type":602,"tag":615,"props":914,"children":915},{},[916],{"type":607,"value":917},"BCN_AUTH_PROXY_IP_SECRET",{"type":602,"tag":710,"props":919,"children":920},{},[921],{"type":607,"value":860},{"type":602,"tag":710,"props":923,"children":924},{},[925],{"type":607,"value":926},"Private Nuxt-to-Convex client-IP signing secret",{"type":602,"tag":603,"props":928,"children":929},{},[930,932,936,938,943],{"type":607,"value":931},"Do not try to override ",{"type":602,"tag":615,"props":933,"children":934},{},[935],{"type":607,"value":876},{"type":607,"value":937},". Configure Nuxt's matching public\nHTTP Actions origin through ",{"type":602,"tag":615,"props":939,"children":940},{},[941],{"type":607,"value":942},"NUXT_PUBLIC_CONVEX_SITE_URL",{"type":607,"value":806},{"type":602,"tag":603,"props":945,"children":946},{},[947],{"type":607,"value":948},"Set these for the Nuxt build\u002Fruntime:",{"type":602,"tag":680,"props":950,"children":951},{},[952,966],{"type":602,"tag":684,"props":953,"children":954},{},[955],{"type":602,"tag":688,"props":956,"children":957},{},[958,962],{"type":602,"tag":692,"props":959,"children":960},{},[961],{"type":607,"value":831},{"type":602,"tag":692,"props":963,"children":964},{},[965],{"type":607,"value":841},{"type":602,"tag":703,"props":967,"children":968},{},[969,984,1005,1020,1035],{"type":602,"tag":688,"props":970,"children":971},{},[972,979],{"type":602,"tag":710,"props":973,"children":974},{},[975],{"type":602,"tag":615,"props":976,"children":977},{},[978],{"type":607,"value":855},{"type":602,"tag":710,"props":980,"children":981},{},[982],{"type":607,"value":983},"Exact public Nuxt origin used by the proxy",{"type":602,"tag":688,"props":985,"children":986},{},[987,995],{"type":602,"tag":710,"props":988,"children":989},{},[990],{"type":602,"tag":615,"props":991,"children":992},{},[993],{"type":607,"value":994},"NUXT_PUBLIC_CONVEX_URL",{"type":602,"tag":710,"props":996,"children":997},{},[998,1000],{"type":607,"value":999},"Convex deployment URL ending in ",{"type":602,"tag":615,"props":1001,"children":1002},{},[1003],{"type":607,"value":1004},".convex.cloud",{"type":602,"tag":688,"props":1006,"children":1007},{},[1008,1015],{"type":602,"tag":710,"props":1009,"children":1010},{},[1011],{"type":602,"tag":615,"props":1012,"children":1013},{},[1014],{"type":607,"value":942},{"type":602,"tag":710,"props":1016,"children":1017},{},[1018],{"type":607,"value":1019},"Convex HTTP Actions URL; required for local\u002Fcustom domains",{"type":602,"tag":688,"props":1021,"children":1022},{},[1023,1030],{"type":602,"tag":710,"props":1024,"children":1025},{},[1026],{"type":602,"tag":615,"props":1027,"children":1028},{},[1029],{"type":607,"value":917},{"type":602,"tag":710,"props":1031,"children":1032},{},[1033],{"type":607,"value":1034},"Same private proxy secret configured in Convex",{"type":602,"tag":688,"props":1036,"children":1037},{},[1038,1046],{"type":602,"tag":710,"props":1039,"children":1040},{},[1041],{"type":602,"tag":615,"props":1042,"children":1043},{},[1044],{"type":607,"value":1045},"BCN_AUTH_TRUSTED_CLIENT_IP_HEADER",{"type":602,"tag":710,"props":1047,"children":1048},{},[1049],{"type":607,"value":1050},"Ingress-owned single-IP header; required outside loopback",{"type":602,"tag":603,"props":1052,"children":1053},{},[1054,1058],{"type":602,"tag":615,"props":1055,"children":1056},{},[1057],{"type":607,"value":855},{"type":607,"value":1059}," must be an exact origin. Use HTTPS outside loopback development. Do not include a path, query, or fragment.",{"type":602,"tag":673,"props":1061,"children":1063},{"id":1062},"proxy-behavior",[1064],{"type":607,"value":1065},"Proxy behavior",{"type":602,"tag":603,"props":1067,"children":1068},{},[1069,1071,1076],{"type":607,"value":1070},"The module owns the fixed ",{"type":602,"tag":615,"props":1072,"children":1073},{},[1074],{"type":607,"value":1075},"\u002Fapi\u002Fauth\u002F*",{"type":607,"value":1077}," path and same-origin credentials behavior. It sends one request to the configured Convex site origin and does not follow server-side redirects.",{"type":602,"tag":603,"props":1079,"children":1080},{},[1081],{"type":607,"value":1082},"OAuth and login redirects are returned to the browser. Auth-enabled applications require a Nitro-capable deployment; a purely static host cannot provide the proxy.",{"type":602,"tag":603,"props":1084,"children":1085},{},[1086,1088,1093,1095,1100],{"type":607,"value":1087},"Applications that expose delegated access use the separate ",{"type":602,"tag":793,"props":1089,"children":1090},{"href":335},[1091],{"type":607,"value":1092},"delegated OAuth and MCP profile",{"type":607,"value":1094},". It adds the official provider, verified consent UI, fixed ",{"type":602,"tag":615,"props":1096,"children":1097},{},[1098],{"type":607,"value":1099},"\u002Fmcp",{"type":607,"value":1101}," resource, provider-owned client provisioning, and live Convex authorization without adding another auth store.",{"type":602,"tag":603,"props":1103,"children":1104},{},[1105,1107,1112],{"type":607,"value":1106},"Outside exact loopback development, set ",{"type":602,"tag":615,"props":1108,"children":1109},{},[1110],{"type":607,"value":1111},"auth.trustedClientIpHeader",{"type":607,"value":1113}," to\nthe single header owned and overwritten by the trusted ingress. The proxy strips\ncaller forwarding headers and signs only that canonical address. Missing,\nmalformed, or multi-value headers fail closed before Better Auth. Never\nconfigure a header that clients can supply unchanged, and never default to a\nforwarding chain. The Nuxt origin must reject public traffic that bypasses the\ningress, either through network restrictions or independent ingress\nauthentication; otherwise a client can supply the chosen header directly.",{"type":602,"tag":603,"props":1115,"children":1116},{},[1117,1119,1123],{"type":607,"value":1118},"The signed identity is attached consistently to proxy requests, SSR token\nhydration, and request-scoped ",{"type":602,"tag":615,"props":1120,"children":1121},{},[1122],{"type":607,"value":341},{"type":607,"value":1124}," cookie exchange. There is no public\nraw cookie-exchange helper that can bypass the request boundary.",{"type":602,"tag":1126,"props":1127,"children":1129},"h3",{"id":1128},"proxy-behavior-convex-token-exchange-quota",[1130],{"type":607,"value":1131},"Convex token-exchange quota",{"type":602,"tag":603,"props":1133,"children":1134},{},[1135,1137,1142,1144,1149,1151,1156,1158,1163,1165,1170],{"type":607,"value":1136},"The public ",{"type":602,"tag":615,"props":1138,"children":1139},{},[1140],{"type":607,"value":1141},"GET \u002Fapi\u002Fauth\u002Fconvex\u002Ftoken",{"type":607,"value":1143}," exchange is normalized by Better Auth\nas ",{"type":602,"tag":615,"props":1145,"children":1146},{},[1147],{"type":607,"value":1148},"\u002Fconvex\u002Ftoken",{"type":607,"value":1150}," and has a fixed allowance of 300 requests per 10 seconds.\nThe key is the ingress-authenticated client IP plus that normalized path, so the\nquota is neither per user nor per session. Better Auth stores the counter in the\ncomponent's database-backed ",{"type":602,"tag":615,"props":1152,"children":1153},{},[1154],{"type":607,"value":1155},"rateLimit",{"type":607,"value":1157}," model, making it shared by every server\ninstance connected to the deployment. A blocked request returns ",{"type":602,"tag":615,"props":1159,"children":1160},{},[1161],{"type":607,"value":1162},"429",{"type":607,"value":1164}," with an\n",{"type":602,"tag":615,"props":1166,"children":1167},{},[1168],{"type":607,"value":1169},"X-Retry-After",{"type":607,"value":1171}," value in seconds.",{"type":602,"tag":603,"props":1173,"children":1174},{},[1175,1177,1181],{"type":607,"value":1176},"This higher route-specific allowance accommodates concurrent SSR, hydration,\nStudio, and query refreshes without weakening sign-in or OAuth token endpoints.\nIt is intentionally not configurable. Treat repeated ",{"type":602,"tag":615,"props":1178,"children":1179},{},[1180],{"type":607,"value":1162},{"type":607,"value":1182}," responses as either\nan ingress client-IP attribution error or abnormal bootstrap traffic before\nconsidering a profile change.",{"type":602,"tag":603,"props":1184,"children":1185},{},[1186,1188,1193],{"type":607,"value":1187},"The auth proxy applies fixed 1 MiB request and upstream-response bounds. These are security invariants, not application configuration. ",{"type":602,"tag":615,"props":1189,"children":1190},{},[1191],{"type":607,"value":1192},"trustedClientIpHeader",{"type":607,"value":1194}," is the only proxy-boundary input:",{"type":602,"tag":610,"props":1196,"children":1198},{"language":1197,"class":612},"ts",[1199],{"type":602,"tag":615,"props":1200,"children":1202},{"class":1201},"language-ts",[1203,1218,1219,1231,1232,1285,1286,1322,1323,1331,1332],{"type":602,"tag":620,"props":1204,"children":1205},{"class":622,"style":623},[1206,1212],{"type":602,"tag":620,"props":1207,"children":1209},{"style":1208},"color:#000000;--shiki-dark:#C8C8C8",[1210],{"type":607,"value":1211},"convex",{"type":602,"tag":620,"props":1213,"children":1215},{"style":1214},"color:#000000;--shiki-dark:#D4D4D4",[1216],{"type":607,"value":1217},": {",{"type":607,"value":631},{"type":602,"tag":620,"props":1220,"children":1221},{"class":622,"style":623},[1222,1227],{"type":602,"tag":620,"props":1223,"children":1224},{"style":1208},[1225],{"type":607,"value":1226},"  auth",{"type":602,"tag":620,"props":1228,"children":1229},{"style":1214},[1230],{"type":607,"value":1217},{"type":607,"value":631},{"type":602,"tag":620,"props":1233,"children":1234},{"class":622,"style":623},[1235,1240,1245,1251,1255,1260,1264,1269,1274,1280],{"type":602,"tag":620,"props":1236,"children":1237},{"style":1208},[1238],{"type":607,"value":1239},"    origin",{"type":602,"tag":620,"props":1241,"children":1242},{"style":1214},[1243],{"type":607,"value":1244},": ",{"type":602,"tag":620,"props":1246,"children":1248},{"style":1247},"color:#001080;--shiki-dark:#9CDCFE",[1249],{"type":607,"value":1250},"process",{"type":602,"tag":620,"props":1252,"children":1253},{"style":1214},[1254],{"type":607,"value":806},{"type":602,"tag":620,"props":1256,"children":1257},{"style":1247},[1258],{"type":607,"value":1259},"env",{"type":602,"tag":620,"props":1261,"children":1262},{"style":1214},[1263],{"type":607,"value":806},{"type":602,"tag":620,"props":1265,"children":1267},{"style":1266},"color:#0070C1;--shiki-dark:#4FC1FF",[1268],{"type":607,"value":855},{"type":602,"tag":620,"props":1270,"children":1271},{"style":1214},[1272],{"type":607,"value":1273}," ?? ",{"type":602,"tag":620,"props":1275,"children":1277},{"style":1276},"color:#A31515;--shiki-dark:#CE9178",[1278],{"type":607,"value":1279},"'http:\u002F\u002Flocalhost:3000'",{"type":602,"tag":620,"props":1281,"children":1282},{"style":1214},[1283],{"type":607,"value":1284},",",{"type":607,"value":631},{"type":602,"tag":620,"props":1287,"children":1288},{"class":622,"style":623},[1289,1294,1298,1302,1306,1310,1314,1318],{"type":602,"tag":620,"props":1290,"children":1291},{"style":1208},[1292],{"type":607,"value":1293},"    trustedClientIpHeader",{"type":602,"tag":620,"props":1295,"children":1296},{"style":1214},[1297],{"type":607,"value":1244},{"type":602,"tag":620,"props":1299,"children":1300},{"style":1247},[1301],{"type":607,"value":1250},{"type":602,"tag":620,"props":1303,"children":1304},{"style":1214},[1305],{"type":607,"value":806},{"type":602,"tag":620,"props":1307,"children":1308},{"style":1247},[1309],{"type":607,"value":1259},{"type":602,"tag":620,"props":1311,"children":1312},{"style":1214},[1313],{"type":607,"value":806},{"type":602,"tag":620,"props":1315,"children":1316},{"style":1266},[1317],{"type":607,"value":1045},{"type":602,"tag":620,"props":1319,"children":1320},{"style":1214},[1321],{"type":607,"value":1284},{"type":607,"value":631},{"type":602,"tag":620,"props":1324,"children":1325},{"class":622,"style":623},[1326],{"type":602,"tag":620,"props":1327,"children":1328},{"style":1214},[1329],{"type":607,"value":1330},"  }",{"type":607,"value":631},{"type":602,"tag":620,"props":1333,"children":1334},{"class":622,"style":623},[1335],{"type":602,"tag":620,"props":1336,"children":1337},{"style":1214},[1338],{"type":607,"value":1339},"}",{"type":602,"tag":673,"props":1341,"children":1343},{"id":1342},"production-checklist",[1344],{"type":607,"value":1345},"Production checklist",{"type":602,"tag":1347,"props":1348,"children":1349},"ul",{},[1350,1361,1366,1377,1388,1399,1404,1409,1414,1419,1424,1429],{"type":602,"tag":1351,"props":1352,"children":1353},"li",{},[1354,1356,1360],{"type":607,"value":1355},"Use an exact HTTPS ",{"type":602,"tag":615,"props":1357,"children":1358},{},[1359],{"type":607,"value":855},{"type":607,"value":806},{"type":602,"tag":1351,"props":1362,"children":1363},{},[1364],{"type":607,"value":1365},"Generate a unique production secret.",{"type":602,"tag":1351,"props":1367,"children":1368},{},[1369,1371,1375],{"type":607,"value":1370},"Keep old ",{"type":602,"tag":615,"props":1372,"children":1373},{},[1374],{"type":607,"value":897},{"type":607,"value":1376}," versions only as long as retained ciphertext needs them; test decryption before removing one.",{"type":602,"tag":1351,"props":1378,"children":1379},{},[1380,1382,1386],{"type":607,"value":1381},"Provision a separate ",{"type":602,"tag":615,"props":1383,"children":1384},{},[1385],{"type":607,"value":917},{"type":607,"value":1387}," in both Nuxt and Convex.",{"type":602,"tag":1351,"props":1389,"children":1390},{},[1391,1393,1397],{"type":607,"value":1392},"Configure an ingress-owned ",{"type":602,"tag":615,"props":1394,"children":1395},{},[1396],{"type":607,"value":1192},{"type":607,"value":1398}," outside exact loopback\ndevelopment.",{"type":602,"tag":1351,"props":1400,"children":1401},{},[1402],{"type":607,"value":1403},"Restrict the Nuxt origin to that ingress or independently authenticate\ningress requests at the origin.",{"type":602,"tag":1351,"props":1405,"children":1406},{},[1407],{"type":607,"value":1408},"Configure OAuth callback and trusted origins for the public application origin.",{"type":602,"tag":1351,"props":1410,"children":1411},{},[1412],{"type":607,"value":1413},"Configure Nuxt to target the selected deployment's exact Convex HTTP Actions URL.",{"type":602,"tag":1351,"props":1415,"children":1416},{},[1417],{"type":607,"value":1418},"Provision the initial signing key through the internal operator action before admitting auth traffic.",{"type":602,"tag":1351,"props":1420,"children":1421},{},[1422],{"type":607,"value":1423},"Keep Nuxt auth routes uncached.",{"type":602,"tag":1351,"props":1425,"children":1426},{},[1427],{"type":607,"value":1428},"Test sign-up, sign-in, reload, refresh, and sign-out in the deployed topology.",{"type":602,"tag":1351,"props":1430,"children":1431},{},[1432],{"type":607,"value":1433},"Verify protected Convex functions reject anonymous calls directly.",{"title":1435,"searchDepth":1436,"depth":1436,"links":1437},"",4,[1438,1440,1441,1445],{"id":675,"depth":1439,"text":678},2,{"id":809,"depth":1439,"text":812},{"id":1062,"depth":1439,"text":1065,"children":1442},[1443],{"id":1128,"depth":1444,"text":1131},3,{"id":1342,"depth":1439,"text":1345},"markdown","docs",{"source":1449,"path":1450,"stem":1451,"dir":1452,"extension":1453},"content","docs\u002F4.build\u002F3.authentication\u002F2.better-auth-setup.md","docs\u002F4.build\u002F3.authentication\u002F2.better-auth-setup","authentication","md",{"requestedPath":281,"resolvedPath":281,"alternates":1455},[],{"requested":1457,"resolved":1458,"usedFallback":6},{},{"locale":8},{"previous":1460,"next":1462},{"title":266,"id":270,"canonicalKey":271,"locale":8,"draft":6,"navigation":1461,"icon":273,"path":274},{"icon":273},{"title":283,"id":284,"canonicalKey":285,"locale":8,"draft":6,"navigation":1463,"icon":287,"path":288},{"icon":287},{"left":1465,"top":1465,"width":1466,"height":1466,"rotate":1465,"vFlip":6,"hFlip":6,"body":1467},0,256,"\u003Cpath fill=\"#3178c6\" d=\"M20 0h216c11.046 0 20 8.954 20 20v216c0 11.046-8.954 20-20 20H20c-11.046 0-20-8.954-20-20V20C0 8.954 8.954 0 20 0\"\u002F>\u003Cpath fill=\"#fff\" d=\"M150.518 200.475v27.62q6.738 3.453 15.938 5.179T185.849 235q9.934 0 18.874-1.899t15.678-6.257q6.738-4.359 10.669-11.394q3.93-7.033 3.93-17.391q0-7.51-2.246-13.163a30.8 30.8 0 0 0-6.479-10.055q-4.232-4.402-10.149-7.898t-13.347-6.602q-5.442-2.245-9.761-4.359t-7.342-4.316q-3.024-2.2-4.665-4.661t-1.641-5.567q0-2.848 1.468-5.135q1.469-2.288 4.147-3.927t6.565-2.547q3.887-.906 8.638-.906q3.456 0 7.299.518q3.844.517 7.732 1.597a54 54 0 0 1 7.558 2.719a41.7 41.7 0 0 1 6.781 3.797v-25.807q-6.306-2.417-13.778-3.582T198.633 107q-9.847 0-18.658 2.115q-8.811 2.114-15.506 6.602q-6.694 4.49-10.582 11.437Q150 134.102 150 143.769q0 12.342 7.127 21.06t21.638 14.759a292 292 0 0 1 10.625 4.575q4.924 2.244 8.509 4.66t5.658 5.265t2.073 6.474a9.9 9.9 0 0 1-1.296 4.963q-1.295 2.287-3.93 3.97t-6.565 2.632t-9.2.95q-8.983 0-17.794-3.151t-16.327-9.451m-46.036-68.733H140V109H41v22.742h35.345V233h28.137z\"\u002F>",{"left":1465,"top":1465,"width":1469,"height":1469,"rotate":1465,"vFlip":6,"hFlip":6,"body":1470},24,"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"8\" height=\"4\" x=\"8\" y=\"2\" rx=\"1\" ry=\"1\"\u002F>\u003Cpath d=\"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\"\u002F>\u003C\u002Fg>",1786627518652]