[{"data":1,"prerenderedAt":1903},["ShallowReactive",2],{"docs-navigation:en":3,"content-page:docs:V-n9Yte2vlA337Q16at9MuHOJiqJPNI_rpAekwtZCt8":651,"content-page-surround:docs:V-n9Yte2vlA337Q16at9MuHOJiqJPNI_rpAekwtZCt8":1886,"i-lucide:file":1891,"i-lucide:terminal":1895,"i-logos:nuxt-icon":1897,"i-lucide:clipboard":1901},[4,41,110,418,485,550,601,646],{"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],{"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},"Who it is for","content:docs:1.overview:2.who-it-is-for.md","1\u002F2",{"icon":25},"i-lucide-users","\u002Fdocs\u002Foverview\u002Fwho-it-is-for",{"title":28,"id":29,"canonicalKey":30,"locale":8,"draft":6,"navigation":31,"icon":32,"path":33},"Limitations and trade-offs","content:docs:1.overview:3.limitations.md","1\u002F3",{"icon":32},"i-lucide-triangle-alert","\u002Fdocs\u002Foverview\u002Flimitations",{"title":35,"id":36,"canonicalKey":37,"locale":8,"draft":6,"navigation":38,"icon":39,"path":40},"Compare Nuxt integrations","content:docs:1.overview:4.comparison.md","1\u002F4",{"icon":39},"i-lucide-scale","\u002Fdocs\u002Foverview\u002Fcomparison",{"title":42,"page":6,"canonicalKey":43,"locale":8,"id":44,"draft":6,"icon":45,"children":46},"Get started","2","content:docs:2.get-started:.navigation.yml","i-lucide-rocket",[47,54,61,68,75,82,89,96,103],{"title":48,"id":49,"canonicalKey":50,"locale":8,"draft":6,"navigation":51,"icon":52,"path":53},"Choose your path","content:docs:2.get-started:1.choose-your-path.md","2\u002F1",{"icon":52},"i-lucide-signpost","\u002Fdocs\u002Fget-started\u002Fchoose-your-path",{"title":55,"id":56,"canonicalKey":57,"locale":8,"draft":6,"navigation":58,"icon":59,"path":60},"Installation","content:docs:2.get-started:2.installation.md","2\u002F2",{"icon":59},"i-lucide-download","\u002Fdocs\u002Fget-started\u002Finstallation",{"title":62,"id":63,"canonicalKey":64,"locale":8,"draft":6,"navigation":65,"icon":66,"path":67},"First real-time page","content:docs:2.get-started:3.first-realtime-page.md","2\u002F3",{"icon":66},"i-lucide-radio","\u002Fdocs\u002Fget-started\u002Ffirst-realtime-page",{"title":69,"id":70,"canonicalKey":71,"locale":8,"draft":6,"navigation":72,"icon":73,"path":74},"Add a mutation","content:docs:2.get-started:4.add-a-mutation.md","2\u002F4",{"icon":73},"i-lucide-square-pen","\u002Fdocs\u002Fget-started\u002Fadd-a-mutation",{"title":76,"id":77,"canonicalKey":78,"locale":8,"draft":6,"navigation":79,"icon":80,"path":81},"Add authentication","content:docs:2.get-started:5.add-authentication.md","2\u002F5",{"icon":80},"i-lucide-log-in","\u002Fdocs\u002Fget-started\u002Fadd-authentication",{"title":83,"id":84,"canonicalKey":85,"locale":8,"draft":6,"navigation":86,"icon":87,"path":88},"Protect data","content:docs:2.get-started:6.protect-data.md","2\u002F6",{"icon":87},"i-lucide-shield-check","\u002Fdocs\u002Fget-started\u002Fprotect-data",{"title":90,"id":91,"canonicalKey":92,"locale":8,"draft":6,"navigation":93,"icon":94,"path":95},"Project structure","content:docs:2.get-started:7.project-structure.md","2\u002F7",{"icon":94},"i-lucide-folder-tree","\u002Fdocs\u002Fget-started\u002Fproject-structure",{"title":97,"id":98,"canonicalKey":99,"locale":8,"draft":6,"navigation":100,"icon":101,"path":102},"Next steps","content:docs:2.get-started:8.next-steps.md","2\u002F8",{"icon":101},"i-lucide-arrow-right","\u002Fdocs\u002Fget-started\u002Fnext-steps",{"title":104,"id":105,"canonicalKey":106,"locale":8,"draft":6,"navigation":107,"icon":108,"path":109},"Plain Vue and Vite","content:docs:2.get-started:9.plain-vue.md","2\u002F9",{"icon":108},"i-lucide-panels-top-left","\u002Fdocs\u002Fget-started\u002Fplain-vue",{"title":111,"page":6,"canonicalKey":112,"locale":8,"id":113,"draft":6,"icon":114,"sidebar":11,"children":115},"Build","3","content:docs:3.build:.navigation.yml","i-lucide-blocks",[116,154,199,292,324,349,388],{"title":117,"page":6,"canonicalKey":118,"locale":8,"children":119},"Queries","3\u002F1",[120,126,133,140,147],{"title":117,"id":121,"canonicalKey":122,"locale":8,"draft":6,"navigation":123,"icon":124,"path":125},"content:docs:3.build:1.queries:1.queries.md","3\u002F1\u002F1",{"icon":124},"i-lucide-database","\u002Fdocs\u002Fbuild\u002Fqueries\u002Fqueries",{"title":127,"id":128,"canonicalKey":129,"locale":8,"draft":6,"navigation":130,"icon":131,"path":132},"Reactive arguments","content:docs:3.build:1.queries:2.reactive-arguments.md","3\u002F1\u002F2",{"icon":131},"i-lucide-sliders-horizontal","\u002Fdocs\u002Fbuild\u002Fqueries\u002Freactive-arguments",{"title":134,"id":135,"canonicalKey":136,"locale":8,"draft":6,"navigation":137,"icon":138,"path":139},"Loading and stale data","content:docs:3.build:1.queries:3.loading-and-stale-data.md","3\u002F1\u002F3",{"icon":138},"i-lucide-loader-circle","\u002Fdocs\u002Fbuild\u002Fqueries\u002Floading-and-stale-data",{"title":141,"id":142,"canonicalKey":143,"locale":8,"draft":6,"navigation":144,"icon":145,"path":146},"Query execution options","content:docs:3.build:1.queries:4.ssr-options.md","3\u002F1\u002F4",{"icon":145},"i-lucide-server-cog","\u002Fdocs\u002Fbuild\u002Fqueries\u002Fssr-options",{"title":148,"id":149,"canonicalKey":150,"locale":8,"draft":6,"navigation":151,"icon":152,"path":153},"Pagination","content:docs:3.build:1.queries:6.pagination.md","3\u002F1\u002F6",{"icon":152},"i-lucide-list-plus","\u002Fdocs\u002Fbuild\u002Fqueries\u002Fpagination",{"title":155,"page":6,"canonicalKey":156,"locale":8,"children":157},"Write Data","3\u002F2",[158,164,171,178,185,192],{"title":159,"id":160,"canonicalKey":161,"locale":8,"draft":6,"navigation":162,"icon":73,"path":163},"Mutations","content:docs:3.build:2.write-data:1.mutations.md","3\u002F2\u002F1",{"icon":73},"\u002Fdocs\u002Fbuild\u002Fwrite-data\u002Fmutations",{"title":165,"id":166,"canonicalKey":167,"locale":8,"draft":6,"navigation":168,"icon":169,"path":170},"Actions","content:docs:3.build:2.write-data:2.actions.md","3\u002F2\u002F2",{"icon":169},"i-lucide-zap","\u002Fdocs\u002Fbuild\u002Fwrite-data\u002Factions",{"title":172,"id":173,"canonicalKey":174,"locale":8,"draft":6,"navigation":175,"icon":176,"path":177},"Optimistic updates","content:docs:3.build:2.write-data:3.optimistic-updates.md","3\u002F2\u002F3",{"icon":176},"i-lucide-gauge","\u002Fdocs\u002Fbuild\u002Fwrite-data\u002Foptimistic-updates",{"title":179,"id":180,"canonicalKey":181,"locale":8,"draft":6,"navigation":182,"icon":183,"path":184},"Concurrent operations","content:docs:3.build:2.write-data:4.concurrent-operations.md","3\u002F2\u002F4",{"icon":183},"i-lucide-git-fork","\u002Fdocs\u002Fbuild\u002Fwrite-data\u002Fconcurrent-operations",{"title":186,"id":187,"canonicalKey":188,"locale":8,"draft":6,"navigation":189,"icon":190,"path":191},"Form submissions","content:docs:3.build:2.write-data:5.forms.md","3\u002F2\u002F5",{"icon":190},"i-lucide-list-checks","\u002Fdocs\u002Fbuild\u002Fwrite-data\u002Fforms",{"title":193,"id":194,"canonicalKey":195,"locale":8,"draft":6,"navigation":196,"icon":197,"path":198},"Multi-step operations","content:docs:3.build:2.write-data:6.multi-step-operations.md","3\u002F2\u002F6",{"icon":197},"i-lucide-list-ordered","\u002Fdocs\u002Fbuild\u002Fwrite-data\u002Fmulti-step-operations",{"title":200,"page":6,"canonicalKey":201,"locale":8,"children":202},"Authentication","3\u002F3",[203,209,216,223,229,236,243,250,257,264,271,278,285],{"title":200,"id":204,"canonicalKey":205,"locale":8,"draft":6,"navigation":206,"icon":207,"path":208},"content:docs:3.build:3.authentication:1.overview.md","3\u002F3\u002F1",{"icon":207},"i-lucide-shield","\u002Fdocs\u002Fbuild\u002Fauthentication\u002Foverview",{"title":210,"id":211,"canonicalKey":212,"locale":8,"draft":6,"navigation":213,"icon":214,"path":215},"Better Auth setup","content:docs:3.build:3.authentication:2.better-auth-setup.md","3\u002F3\u002F2",{"icon":214},"i-lucide-settings-2","\u002Fdocs\u002Fbuild\u002Fauthentication\u002Fbetter-auth-setup",{"title":217,"id":218,"canonicalKey":219,"locale":8,"draft":6,"navigation":220,"icon":221,"path":222},"Auth state and user data","content:docs:3.build:3.authentication:3.auth-state-and-user.md","3\u002F3\u002F3",{"icon":221},"i-lucide-user-round","\u002Fdocs\u002Fbuild\u002Fauthentication\u002Fauth-state-and-user",{"title":224,"id":225,"canonicalKey":226,"locale":8,"draft":6,"navigation":227,"icon":80,"path":228},"Sign in and sign out","content:docs:3.build:3.authentication:4.sign-in-and-sign-out.md","3\u002F3\u002F4",{"icon":80},"\u002Fdocs\u002Fbuild\u002Fauthentication\u002Fsign-in-and-sign-out",{"title":230,"id":231,"canonicalKey":232,"locale":8,"draft":6,"navigation":233,"icon":234,"path":235},"Route protection","content:docs:3.build:3.authentication:5.route-protection.md","3\u002F3\u002F5",{"icon":234},"i-lucide-route","\u002Fdocs\u002Fbuild\u002Fauthentication\u002Froute-protection",{"title":237,"id":238,"canonicalKey":239,"locale":8,"draft":6,"navigation":240,"icon":241,"path":242},"Backend authorization","content:docs:3.build:3.authentication:6.backend-authorization.md","3\u002F3\u002F6",{"icon":241},"i-lucide-lock-keyhole","\u002Fdocs\u002Fbuild\u002Fauthentication\u002Fbackend-authorization",{"title":244,"id":245,"canonicalKey":246,"locale":8,"draft":6,"navigation":247,"icon":248,"path":249},"Better Auth plugins","content:docs:3.build:3.authentication:7.better-auth-plugins.md","3\u002F3\u002F7",{"icon":248},"i-lucide-plug","\u002Fdocs\u002Fbuild\u002Fauthentication\u002Fbetter-auth-plugins",{"title":251,"id":252,"canonicalKey":253,"locale":8,"draft":6,"navigation":254,"icon":255,"path":256},"Custom user fields","content:docs:3.build:3.authentication:8.custom-user-fields.md","3\u002F3\u002F8",{"icon":255},"i-lucide-user-cog","\u002Fdocs\u002Fbuild\u002Fauthentication\u002Fcustom-user-fields",{"title":258,"id":259,"canonicalKey":260,"locale":8,"draft":6,"navigation":261,"icon":262,"path":263},"User synchronization","content:docs:3.build:3.authentication:9.user-synchronization.md","3\u002F3\u002F9",{"icon":262},"i-lucide-refresh-ccw","\u002Fdocs\u002Fbuild\u002Fauthentication\u002Fuser-synchronization",{"title":265,"id":266,"canonicalKey":267,"locale":8,"draft":6,"navigation":268,"icon":269,"path":270},"Delegated OAuth and MCP","content:docs:3.build:3.authentication:10.delegated-oauth-and-mcp.md","3\u002F3\u002F10",{"icon":269},"i-lucide-bot","\u002Fdocs\u002Fbuild\u002Fauthentication\u002Fdelegated-oauth-and-mcp",{"title":272,"id":273,"canonicalKey":274,"locale":8,"draft":6,"navigation":275,"icon":276,"path":277},"Transactional auth email","content:docs:3.build:3.authentication:11.transactional-email.md","3\u002F3\u002F11",{"icon":276},"i-lucide-mail","\u002Fdocs\u002Fbuild\u002Fauthentication\u002Ftransactional-email",{"title":279,"id":280,"canonicalKey":281,"locale":8,"draft":6,"navigation":282,"icon":283,"path":284},"Social sign-in","content:docs:3.build:3.authentication:12.social-sign-in.md","3\u002F3\u002F12",{"icon":283},"i-lucide-github","\u002Fdocs\u002Fbuild\u002Fauthentication\u002Fsocial-sign-in",{"title":286,"id":287,"canonicalKey":288,"locale":8,"draft":6,"navigation":289,"icon":290,"path":291},"Better Auth plugin support","content:docs:3.build:3.authentication:13.better-auth-plugin-support.md","3\u002F3\u002F13",{"icon":290},"i-lucide-puzzle","\u002Fdocs\u002Fbuild\u002Fauthentication\u002Fbetter-auth-plugin-support",{"title":293,"page":6,"canonicalKey":294,"locale":8,"children":295},"Server","3\u002F4",[296,303,310,317],{"title":297,"id":298,"canonicalKey":299,"locale":8,"draft":6,"navigation":300,"icon":301,"path":302},"serverConvex","content:docs:3.build:4.server:1.server-convex.md","3\u002F4\u002F1",{"icon":301},"i-lucide-server","\u002Fdocs\u002Fbuild\u002Fserver\u002Fserver-convex",{"title":304,"id":305,"canonicalKey":306,"locale":8,"draft":6,"navigation":307,"icon":308,"path":309},"Server routes","content:docs:3.build:4.server:2.server-routes.md","3\u002F4\u002F2",{"icon":308},"i-lucide-waypoints","\u002Fdocs\u002Fbuild\u002Fserver\u002Fserver-routes",{"title":311,"id":312,"canonicalKey":313,"locale":8,"draft":6,"navigation":314,"icon":315,"path":316},"Webhooks and jobs","content:docs:3.build:4.server:3.webhooks-and-jobs.md","3\u002F4\u002F3",{"icon":315},"i-lucide-webhook","\u002Fdocs\u002Fbuild\u002Fserver\u002Fwebhooks-and-jobs",{"title":318,"id":319,"canonicalKey":320,"locale":8,"draft":6,"navigation":321,"icon":322,"path":323},"Credentials and server security","content:docs:3.build:4.server:4.credentials-and-security.md","3\u002F4\u002F4",{"icon":322},"i-lucide-key-round","\u002Fdocs\u002Fbuild\u002Fserver\u002Fcredentials-and-security",{"title":325,"page":6,"canonicalKey":326,"locale":8,"children":327},"Files","3\u002F5",[328,335,342],{"title":329,"id":330,"canonicalKey":331,"locale":8,"draft":6,"navigation":332,"icon":333,"path":334},"Upload files","content:docs:3.build:5.files:1.upload-files.md","3\u002F5\u002F1",{"icon":333},"i-lucide-upload","\u002Fdocs\u002Fbuild\u002Ffiles\u002Fupload-files",{"title":336,"id":337,"canonicalKey":338,"locale":8,"draft":6,"navigation":339,"icon":340,"path":341},"Storage URLs","content:docs:3.build:5.files:3.storage-urls.md","3\u002F5\u002F3",{"icon":340},"i-lucide-link","\u002Fdocs\u002Fbuild\u002Ffiles\u002Fstorage-urls",{"title":343,"id":344,"canonicalKey":345,"locale":8,"draft":6,"navigation":346,"icon":347,"path":348},"File validation and deletion","content:docs:3.build:5.files:4.validation-and-deletion.md","3\u002F5\u002F4",{"icon":347},"i-lucide-file-x","\u002Fdocs\u002Fbuild\u002Ffiles\u002Fvalidation-and-deletion",{"title":350,"page":6,"canonicalKey":351,"locale":8,"children":352},"Application Behavior","3\u002F6",[353,360,367,374,381],{"title":354,"id":355,"canonicalKey":356,"locale":8,"draft":6,"navigation":357,"icon":358,"path":359},"Connection state","content:docs:3.build:6.application-behavior:1.connection-state.md","3\u002F6\u002F1",{"icon":358},"i-lucide-wifi","\u002Fdocs\u002Fbuild\u002Fapplication-behavior\u002Fconnection-state",{"title":361,"id":362,"canonicalKey":363,"locale":8,"draft":6,"navigation":364,"icon":365,"path":366},"Error handling","content:docs:3.build:6.application-behavior:2.error-handling.md","3\u002F6\u002F2",{"icon":365},"i-lucide-circle-alert","\u002Fdocs\u002Fbuild\u002Fapplication-behavior\u002Ferror-handling",{"title":368,"id":369,"canonicalKey":370,"locale":8,"draft":6,"navigation":371,"icon":372,"path":373},"Logging","content:docs:3.build:6.application-behavior:3.logging.md","3\u002F6\u002F3",{"icon":372},"i-lucide-scroll-text","\u002Fdocs\u002Fbuild\u002Fapplication-behavior\u002Flogging",{"title":375,"id":376,"canonicalKey":377,"locale":8,"draft":6,"navigation":378,"icon":379,"path":380},"DevTools","content:docs:3.build:6.application-behavior:4.devtools.md","3\u002F6\u002F4",{"icon":379},"i-lucide-wrench","\u002Fdocs\u002Fbuild\u002Fapplication-behavior\u002Fdevtools",{"title":382,"id":383,"canonicalKey":384,"locale":8,"draft":6,"navigation":385,"icon":386,"path":387},"Performance","content:docs:3.build:6.application-behavior:5.performance.md","3\u002F6\u002F5",{"icon":386},"i-lucide-chart-no-axes-combined","\u002Fdocs\u002Fbuild\u002Fapplication-behavior\u002Fperformance",{"title":389,"page":6,"canonicalKey":390,"locale":8,"id":391,"draft":6,"icon":269,"children":392},"Agents and MCP","3\u002F7","content:docs:3.build:7.agents:.navigation.yml",[393,400,406,412],{"title":394,"id":395,"canonicalKey":396,"locale":8,"draft":6,"navigation":397,"icon":398,"path":399},"MCP on Convex","content:docs:3.build:7.agents:1.mcp.md","3\u002F7\u002F1",{"icon":398},"i-lucide-plug-zap","\u002Fdocs\u002Fbuild\u002Fagents\u002Fmcp",{"title":401,"id":402,"canonicalKey":403,"locale":8,"draft":6,"navigation":404,"icon":248,"path":405},"Add MCP to your application","content:docs:3.build:7.agents:2.mcp-application.md","3\u002F7\u002F2",{"icon":248},"\u002Fdocs\u002Fbuild\u002Fagents\u002Fmcp-application",{"title":407,"id":408,"canonicalKey":409,"locale":8,"draft":6,"navigation":410,"icon":340,"path":411},"Connect ChatGPT and Claude","content:docs:3.build:7.agents:3.connect-chatgpt-and-claude.md","3\u002F7\u002F3",{"icon":340},"\u002Fdocs\u002Fbuild\u002Fagents\u002Fconnect-chatgpt-and-claude",{"title":413,"id":414,"canonicalKey":415,"locale":8,"draft":6,"navigation":416,"icon":108,"path":417},"MCP Apps","content:docs:3.build:7.agents:4.mcp-apps.md","3\u002F7\u002F4",{"icon":108},"\u002Fdocs\u002Fbuild\u002Fagents\u002Fmcp-apps",{"title":419,"page":6,"canonicalKey":420,"locale":8,"id":421,"draft":6,"icon":422,"children":423},"Recipes","4","content:docs:4.recipes:.navigation.yml","i-lucide-cooking-pot",[424,431,438,445,452,459,466,472,478],{"title":425,"id":426,"canonicalKey":427,"locale":8,"draft":6,"navigation":428,"icon":429,"path":430},"Protected dashboard","content:docs:4.recipes:1.protected-dashboard.md","4\u002F1",{"icon":429},"i-lucide-layout-dashboard","\u002Fdocs\u002Frecipes\u002Fprotected-dashboard",{"title":432,"id":433,"canonicalKey":434,"locale":8,"draft":6,"navigation":435,"icon":436,"path":437},"Real-time feed","content:docs:4.recipes:2.realtime-feed.md","4\u002F2",{"icon":436},"i-lucide-messages-square","\u002Fdocs\u002Frecipes\u002Frealtime-feed",{"title":439,"id":440,"canonicalKey":441,"locale":8,"draft":6,"navigation":442,"icon":443,"path":444},"Optimistic todo list","content:docs:4.recipes:3.optimistic-todo-list.md","4\u002F3",{"icon":443},"i-lucide-list-todo","\u002Fdocs\u002Frecipes\u002Foptimistic-todo-list",{"title":446,"id":447,"canonicalKey":448,"locale":8,"draft":6,"navigation":449,"icon":450,"path":451},"Infinite scroll","content:docs:4.recipes:4.infinite-scroll.md","4\u002F4",{"icon":450},"i-lucide-mouse","\u002Fdocs\u002Frecipes\u002Finfinite-scroll",{"title":453,"id":454,"canonicalKey":455,"locale":8,"draft":6,"navigation":456,"icon":457,"path":458},"File upload form","content:docs:4.recipes:5.file-upload-form.md","4\u002F5",{"icon":457},"i-lucide-file-up","\u002Fdocs\u002Frecipes\u002Ffile-upload-form",{"title":460,"id":461,"canonicalKey":462,"locale":8,"draft":6,"navigation":463,"icon":464,"path":465},"Organization permissions","content:docs:4.recipes:6.organization-permissions.md","4\u002F6",{"icon":464},"i-lucide-building-2","\u002Fdocs\u002Frecipes\u002Forganization-permissions",{"title":467,"id":468,"canonicalKey":469,"locale":8,"draft":6,"navigation":470,"icon":301,"path":471},"Authenticated server route","content:docs:4.recipes:7.authenticated-server-route.md","4\u002F7",{"icon":301},"\u002Fdocs\u002Frecipes\u002Fauthenticated-server-route",{"title":473,"id":474,"canonicalKey":475,"locale":8,"draft":6,"navigation":476,"icon":108,"path":477},"Public and private data","content:docs:4.recipes:8.public-and-private-data.md","4\u002F8",{"icon":108},"\u002Fdocs\u002Frecipes\u002Fpublic-and-private-data",{"title":479,"id":480,"canonicalKey":481,"locale":8,"draft":6,"navigation":482,"icon":483,"path":484},"Test signed-in screens","content:docs:4.recipes:9.component-testing.md","4\u002F9",{"icon":483},"i-lucide-flask-conical","\u002Fdocs\u002Frecipes\u002Fcomponent-testing",{"title":486,"page":6,"canonicalKey":487,"locale":8,"id":488,"draft":6,"icon":489,"children":490},"Concepts","5","content:docs:5.concepts:.navigation.yml","i-lucide-brain",[491,497,503,510,516,523,529,536,543],{"title":492,"id":493,"canonicalKey":494,"locale":8,"draft":6,"navigation":495,"icon":489,"path":496},"Mental model","content:docs:5.concepts:1.mental-model.md","5\u002F1",{"icon":489},"\u002Fdocs\u002Fconcepts\u002Fmental-model",{"title":498,"id":499,"canonicalKey":500,"locale":8,"draft":6,"navigation":501,"icon":234,"path":502},"Request lifecycle","content:docs:5.concepts:2.request-lifecycle.md","5\u002F2",{"icon":234},"\u002Fdocs\u002Fconcepts\u002Frequest-lifecycle",{"title":504,"id":505,"canonicalKey":506,"locale":8,"draft":6,"navigation":507,"icon":508,"path":509},"SSR, hydration, and real-time","content:docs:5.concepts:3.ssr-hydration-realtime.md","5\u002F3",{"icon":508},"i-lucide-refresh-cw","\u002Fdocs\u002Fconcepts\u002Fssr-hydration-realtime",{"title":511,"id":512,"canonicalKey":513,"locale":8,"draft":6,"navigation":514,"icon":124,"path":515},"Query ownership and caching","content:docs:5.concepts:4.query-ownership-and-caching.md","5\u002F4",{"icon":124},"\u002Fdocs\u002Fconcepts\u002Fquery-ownership-and-caching",{"title":517,"id":518,"canonicalKey":519,"locale":8,"draft":6,"navigation":520,"icon":521,"path":522},"Authentication and identity","content:docs:5.concepts:5.authentication-and-identity.md","5\u002F5",{"icon":521},"i-lucide-fingerprint","\u002Fdocs\u002Fconcepts\u002Fauthentication-and-identity",{"title":524,"id":525,"canonicalKey":526,"locale":8,"draft":6,"navigation":527,"icon":108,"path":528},"Server and client boundaries","content:docs:5.concepts:6.server-and-client-boundaries.md","5\u002F6",{"icon":108},"\u002Fdocs\u002Fconcepts\u002Fserver-and-client-boundaries",{"title":530,"id":531,"canonicalKey":532,"locale":8,"draft":6,"navigation":533,"icon":534,"path":535},"Errors and failures","content:docs:5.concepts:7.errors-and-failures.md","5\u002F7",{"icon":534},"i-lucide-circle-x","\u002Fdocs\u002Fconcepts\u002Ferrors-and-failures",{"title":537,"id":538,"canonicalKey":539,"locale":8,"draft":6,"navigation":540,"icon":541,"path":542},"Design decisions","content:docs:5.concepts:8.design-decisions.md","5\u002F8",{"icon":541},"i-lucide-git-branch","\u002Fdocs\u002Fconcepts\u002Fdesign-decisions",{"title":544,"id":545,"canonicalKey":546,"locale":8,"draft":6,"navigation":547,"icon":548,"path":549},"Glossary","content:docs:5.concepts:9.glossary.md","5\u002F9",{"icon":548},"i-lucide-book-a","\u002Fdocs\u002Fconcepts\u002Fglossary",{"title":551,"page":6,"canonicalKey":552,"locale":8,"id":553,"draft":6,"icon":214,"children":554},"Operations","6","content:docs:6.operations:.navigation.yml",[555,561,568,575,581,588,594],{"title":556,"id":557,"canonicalKey":558,"locale":8,"draft":6,"navigation":559,"icon":45,"path":560},"Deployment","content:docs:6.operations:1.deployment.md","6\u002F1",{"icon":45},"\u002Fdocs\u002Foperations\u002Fdeployment",{"title":562,"id":563,"canonicalKey":564,"locale":8,"draft":6,"navigation":565,"icon":566,"path":567},"Environment variables","content:docs:6.operations:2.environment-variables.md","6\u002F2",{"icon":566},"i-lucide-variable","\u002Fdocs\u002Foperations\u002Fenvironment-variables",{"title":569,"id":570,"canonicalKey":571,"locale":8,"draft":6,"navigation":572,"icon":573,"path":574},"Deploy to Vercel","content:docs:6.operations:3.deploy-to-vercel.md","6\u002F3",{"icon":573},"i-lucide-triangle","\u002Fdocs\u002Foperations\u002Fdeploy-to-vercel",{"title":576,"id":577,"canonicalKey":578,"locale":8,"draft":6,"navigation":579,"icon":379,"path":580},"Troubleshooting","content:docs:6.operations:4.troubleshooting.md","6\u002F4",{"icon":379},"\u002Fdocs\u002Foperations\u002Ftroubleshooting",{"title":582,"id":583,"canonicalKey":584,"locale":8,"draft":6,"navigation":585,"icon":586,"path":587},"Release compatibility","content:docs:6.operations:5.release-compatibility.md","6\u002F5",{"icon":586},"i-lucide-badge-check","\u002Fdocs\u002Foperations\u002Frelease-compatibility",{"title":589,"id":590,"canonicalKey":591,"locale":8,"draft":6,"navigation":592,"icon":87,"path":593},"Security model","content:docs:6.operations:6.security-model.md","6\u002F6",{"icon":87},"\u002Fdocs\u002Foperations\u002Fsecurity-model",{"title":595,"id":596,"canonicalKey":597,"locale":8,"draft":6,"navigation":598,"icon":599,"path":600},"Upgrade to 1.0","content:docs:6.operations:7.upgrade-to-1-0.md","6\u002F7",{"icon":599},"i-lucide-arrow-up-circle","\u002Fdocs\u002Foperations\u002Fupgrade-to-1-0",{"title":602,"page":6,"canonicalKey":603,"locale":8,"id":604,"draft":6,"icon":605,"children":606},"Reference","7","content:docs:7.reference:.navigation.yml","i-lucide-braces",[607,613,619,625,632,639],{"title":608,"id":609,"canonicalKey":610,"locale":8,"draft":6,"navigation":611,"icon":605,"path":612},"Composables","content:docs:7.reference:1.composables.md","7\u002F1",{"icon":605},"\u002Fdocs\u002Freference\u002Fcomposables",{"title":614,"id":615,"canonicalKey":616,"locale":8,"draft":6,"navigation":617,"icon":301,"path":618},"Server API","content:docs:7.reference:3.server-api.md","7\u002F3",{"icon":301},"\u002Fdocs\u002Freference\u002Fserver-api",{"title":620,"id":621,"canonicalKey":622,"locale":8,"draft":6,"navigation":623,"icon":534,"path":624},"Error types","content:docs:7.reference:4.error-types.md","7\u002F4",{"icon":534},"\u002Fdocs\u002Freference\u002Ferror-types",{"title":626,"id":627,"canonicalKey":628,"locale":8,"draft":6,"navigation":629,"icon":630,"path":631},"Module configuration","content:docs:7.reference:5.module-configuration.md","7\u002F5",{"icon":630},"i-lucide-settings","\u002Fdocs\u002Freference\u002Fmodule-configuration",{"title":633,"id":634,"canonicalKey":635,"locale":8,"draft":6,"navigation":636,"icon":637,"path":638},"Package exports","content:docs:7.reference:6.package-exports.md","7\u002F6",{"icon":637},"i-lucide-package-open","\u002Fdocs\u002Freference\u002Fpackage-exports",{"title":640,"id":641,"canonicalKey":642,"locale":8,"draft":6,"navigation":643,"icon":644,"path":645},"API surface","content:docs:7.reference:7.api-surface.md","7\u002F7",{"icon":644},"i-lucide-list","\u002Fdocs\u002Freference\u002Fapi-surface",{"title":647,"id":648,"canonicalKey":649,"locale":8,"draft":6,"path":650},"Better Convex documentation","content:docs:index.md","\u002F","\u002Fdocs",{"title":569,"description":652,"navigation":653,"body":654,"type":1873,"id":570,"canonicalKey":571,"draft":6,"partial":6,"locale":8,"collection":1874,"navigationFile":6,"file":1875,"route":1881,"resolution":1883},"Run the Nuxt application on Vercel with a Convex production deployment and working authentication.",{"icon":573},{"type":655,"children":656,"toc":1860},"root",[657,673,685,692,711,797,802,808,813,1045,1074,1080,1085,1125,1137,1143,1214,1220,1251,1409,1421,1432,1621,1627,1639,1650,1666,1677,1683,1734,1746,1752,1763,1832,1848],{"type":658,"tag":659,"props":660,"children":661},"element","p",{},[662,665,671],{"type":663,"value":664},"text","This guide deploys a Nuxt application with Better Convex Nuxt and\nauthentication to Vercel. Vercel runs Nuxt. Convex runs your functions and\ndata. The example domain is ",{"type":658,"tag":666,"props":667,"children":668},"code",{},[669],{"type":663,"value":670},"https:\u002F\u002Fapp.example.com",{"type":663,"value":672},".",{"type":658,"tag":659,"props":674,"children":675},{},[676,678,683],{"type":663,"value":677},"Before you start, the application must sign in and sign out locally. Read\n",{"type":658,"tag":679,"props":680,"children":681},"a",{"href":560},[682],{"type":663,"value":556},{"type":663,"value":684}," for the general order.",{"type":658,"tag":686,"props":687,"children":689},"h2",{"id":688},"_1-deploy-convex",[690],{"type":663,"value":691},"1. Deploy Convex",{"type":658,"tag":659,"props":693,"children":694},{},[695,697,702,704,709],{"type":663,"value":696},"Do not deploy Convex from the Vercel build. The ",{"type":658,"tag":666,"props":698,"children":699},{},[700],{"type":663,"value":701},"better-convex convex",{"type":663,"value":703}," wrapper\nreads the target deployment only from ",{"type":658,"tag":666,"props":705,"children":706},{},[707],{"type":663,"value":708},".env.local",{"type":663,"value":710},", and that file does not\nexist on Vercel. Deploy Convex first, from your machine or from CI:",{"type":658,"tag":712,"props":713,"children":714},"ol",{},[715,721,747],{"type":658,"tag":716,"props":717,"children":718},"li",{},[719],{"type":663,"value":720},"Create a production deploy key in the Convex dashboard.",{"type":658,"tag":716,"props":722,"children":723},{},[724,735],{"type":658,"tag":659,"props":725,"children":726},{},[727,729,733],{"type":663,"value":728},"In a separate checkout of your repository, install the dependencies and\ncreate ",{"type":658,"tag":666,"props":730,"children":731},{},[732],{"type":663,"value":708},{"type":663,"value":734}," with only that key:",{"type":658,"tag":736,"props":737,"children":740},"pre",{"language":738,"filename":708,"class":739},"dotenv","shiki dark:dark-plus",[741],{"type":658,"tag":666,"props":742,"children":744},{"class":743},"language-dotenv",[745],{"type":663,"value":746},"CONVEX_DEPLOY_KEY=prod:your-deployment|your-key",{"type":658,"tag":716,"props":748,"children":749},{},[750,755],{"type":658,"tag":659,"props":751,"children":752},{},[753],{"type":663,"value":754},"Deploy the functions:",{"type":658,"tag":736,"props":756,"children":759},{"language":757,"class":758},"bash","shiki shiki-themes light-plus dark-plus dark:dark-plus",[760],{"type":658,"tag":666,"props":761,"children":763},{"class":762},"language-bash",[764],{"type":658,"tag":765,"props":766,"children":769},"span",{"class":767,"style":768},"line","display: inline",[770,776,782,787,792],{"type":658,"tag":765,"props":771,"children":773},{"style":772},"color:#795E26;--shiki-dark:#DCDCAA",[774],{"type":663,"value":775},"pnpm",{"type":658,"tag":765,"props":777,"children":779},{"style":778},"color:#A31515;--shiki-dark:#CE9178",[780],{"type":663,"value":781}," exec",{"type":658,"tag":765,"props":783,"children":784},{"style":778},[785],{"type":663,"value":786}," better-convex",{"type":658,"tag":765,"props":788,"children":789},{"style":778},[790],{"type":663,"value":791}," convex",{"type":658,"tag":765,"props":793,"children":794},{"style":778},[795],{"type":663,"value":796}," deploy",{"type":658,"tag":659,"props":798,"children":799},{},[800],{"type":663,"value":801},"Deploy Convex before every Vercel release that needs new or changed Convex\nfunctions.",{"type":658,"tag":686,"props":803,"children":805},{"id":804},"_2-set-the-convex-environment-variables",[806],{"type":663,"value":807},"2. Set the Convex environment variables",{"type":658,"tag":659,"props":809,"children":810},{},[811],{"type":663,"value":812},"In the same checkout, set the auth values in the Convex production deployment.\nGenerate the proxy secret in this shell, because Vercel needs the same value:",{"type":658,"tag":736,"props":814,"children":815},{"language":757,"class":758},[816],{"type":658,"tag":666,"props":817,"children":818},{"class":762},[819,871,873,912,913,985,986],{"type":658,"tag":765,"props":820,"children":821},{"class":767,"style":768},[822,828,834,840,845,850,855,860,866],{"type":658,"tag":765,"props":823,"children":825},{"style":824},"color:#0000FF;--shiki-dark:#569CD6",[826],{"type":663,"value":827},"export",{"type":658,"tag":765,"props":829,"children":831},{"style":830},"color:#001080;--shiki-dark:#9CDCFE",[832],{"type":663,"value":833}," BCN_AUTH_PROXY_IP_SECRET",{"type":658,"tag":765,"props":835,"children":837},{"style":836},"color:#000000;--shiki-dark:#D4D4D4",[838],{"type":663,"value":839},"=",{"type":658,"tag":765,"props":841,"children":842},{"style":778},[843],{"type":663,"value":844},"\"$(",{"type":658,"tag":765,"props":846,"children":847},{"style":772},[848],{"type":663,"value":849},"openssl",{"type":658,"tag":765,"props":851,"children":852},{"style":778},[853],{"type":663,"value":854}," rand ",{"type":658,"tag":765,"props":856,"children":857},{"style":824},[858],{"type":663,"value":859},"-base64",{"type":658,"tag":765,"props":861,"children":863},{"style":862},"color:#098658;--shiki-dark:#B5CEA8",[864],{"type":663,"value":865}," 32",{"type":658,"tag":765,"props":867,"children":868},{"style":778},[869],{"type":663,"value":870},")\"",{"type":663,"value":872},"\n",{"type":658,"tag":765,"props":874,"children":875},{"class":767,"style":768},[876,880,884,888,892,897,902,907],{"type":658,"tag":765,"props":877,"children":878},{"style":772},[879],{"type":663,"value":775},{"type":658,"tag":765,"props":881,"children":882},{"style":778},[883],{"type":663,"value":781},{"type":658,"tag":765,"props":885,"children":886},{"style":778},[887],{"type":663,"value":786},{"type":658,"tag":765,"props":889,"children":890},{"style":778},[891],{"type":663,"value":791},{"type":658,"tag":765,"props":893,"children":894},{"style":778},[895],{"type":663,"value":896}," env",{"type":658,"tag":765,"props":898,"children":899},{"style":778},[900],{"type":663,"value":901}," set",{"type":658,"tag":765,"props":903,"children":904},{"style":778},[905],{"type":663,"value":906}," SITE_URL",{"type":658,"tag":765,"props":908,"children":909},{"style":778},[910],{"type":663,"value":911}," https:\u002F\u002Fapp.example.com",{"type":663,"value":872},{"type":658,"tag":765,"props":914,"children":915},{"class":767,"style":768},[916,921,926,931,935,939,943,947,951,956,960,964,968,972,976,980],{"type":658,"tag":765,"props":917,"children":918},{"style":772},[919],{"type":663,"value":920},"printf",{"type":658,"tag":765,"props":922,"children":923},{"style":778},[924],{"type":663,"value":925}," '1:%s'",{"type":658,"tag":765,"props":927,"children":928},{"style":778},[929],{"type":663,"value":930}," \"$(",{"type":658,"tag":765,"props":932,"children":933},{"style":772},[934],{"type":663,"value":849},{"type":658,"tag":765,"props":936,"children":937},{"style":778},[938],{"type":663,"value":854},{"type":658,"tag":765,"props":940,"children":941},{"style":824},[942],{"type":663,"value":859},{"type":658,"tag":765,"props":944,"children":945},{"style":862},[946],{"type":663,"value":865},{"type":658,"tag":765,"props":948,"children":949},{"style":778},[950],{"type":663,"value":870},{"type":658,"tag":765,"props":952,"children":953},{"style":836},[954],{"type":663,"value":955}," | ",{"type":658,"tag":765,"props":957,"children":958},{"style":772},[959],{"type":663,"value":775},{"type":658,"tag":765,"props":961,"children":962},{"style":778},[963],{"type":663,"value":781},{"type":658,"tag":765,"props":965,"children":966},{"style":778},[967],{"type":663,"value":786},{"type":658,"tag":765,"props":969,"children":970},{"style":778},[971],{"type":663,"value":791},{"type":658,"tag":765,"props":973,"children":974},{"style":778},[975],{"type":663,"value":896},{"type":658,"tag":765,"props":977,"children":978},{"style":778},[979],{"type":663,"value":901},{"type":658,"tag":765,"props":981,"children":982},{"style":778},[983],{"type":663,"value":984}," BETTER_AUTH_SECRETS",{"type":663,"value":872},{"type":658,"tag":765,"props":987,"children":988},{"class":767,"style":768},[989,993,998,1003,1008,1013,1017,1021,1025,1029,1033,1037,1041],{"type":658,"tag":765,"props":990,"children":991},{"style":772},[992],{"type":663,"value":920},{"type":658,"tag":765,"props":994,"children":995},{"style":778},[996],{"type":663,"value":997}," '%s'",{"type":658,"tag":765,"props":999,"children":1000},{"style":778},[1001],{"type":663,"value":1002}," \"",{"type":658,"tag":765,"props":1004,"children":1005},{"style":830},[1006],{"type":663,"value":1007},"$BCN_AUTH_PROXY_IP_SECRET",{"type":658,"tag":765,"props":1009,"children":1010},{"style":778},[1011],{"type":663,"value":1012},"\"",{"type":658,"tag":765,"props":1014,"children":1015},{"style":836},[1016],{"type":663,"value":955},{"type":658,"tag":765,"props":1018,"children":1019},{"style":772},[1020],{"type":663,"value":775},{"type":658,"tag":765,"props":1022,"children":1023},{"style":778},[1024],{"type":663,"value":781},{"type":658,"tag":765,"props":1026,"children":1027},{"style":778},[1028],{"type":663,"value":786},{"type":658,"tag":765,"props":1030,"children":1031},{"style":778},[1032],{"type":663,"value":791},{"type":658,"tag":765,"props":1034,"children":1035},{"style":778},[1036],{"type":663,"value":896},{"type":658,"tag":765,"props":1038,"children":1039},{"style":778},[1040],{"type":663,"value":901},{"type":658,"tag":765,"props":1042,"children":1043},{"style":778},[1044],{"type":663,"value":833},{"type":658,"tag":659,"props":1046,"children":1047},{},[1048,1053,1055,1060,1062,1067,1069,1073],{"type":658,"tag":666,"props":1049,"children":1050},{},[1051],{"type":663,"value":1052},"SITE_URL",{"type":663,"value":1054}," is your production domain, not a ",{"type":658,"tag":666,"props":1056,"children":1057},{},[1058],{"type":663,"value":1059},"*.vercel.app",{"type":663,"value":1061}," URL. Convex sets\n",{"type":658,"tag":666,"props":1063,"children":1064},{},[1065],{"type":663,"value":1066},"CONVEX_SITE_URL",{"type":663,"value":1068}," itself as a built-in; do not set it. Add your social\nprovider secrets now, if you use them. See\n",{"type":658,"tag":679,"props":1070,"children":1071},{"href":284},[1072],{"type":663,"value":279},{"type":663,"value":672},{"type":658,"tag":686,"props":1075,"children":1077},{"id":1076},"_3-create-the-signing-key",[1078],{"type":663,"value":1079},"3. Create the signing key",{"type":658,"tag":659,"props":1081,"children":1082},{},[1083],{"type":663,"value":1084},"Run this once, before the first user signs in:",{"type":658,"tag":736,"props":1086,"children":1087},{"language":757,"class":758},[1088],{"type":658,"tag":666,"props":1089,"children":1090},{"class":762},[1091],{"type":658,"tag":765,"props":1092,"children":1093},{"class":767,"style":768},[1094,1098,1102,1106,1110,1115,1120],{"type":658,"tag":765,"props":1095,"children":1096},{"style":772},[1097],{"type":663,"value":775},{"type":658,"tag":765,"props":1099,"children":1100},{"style":778},[1101],{"type":663,"value":781},{"type":658,"tag":765,"props":1103,"children":1104},{"style":778},[1105],{"type":663,"value":786},{"type":658,"tag":765,"props":1107,"children":1108},{"style":778},[1109],{"type":663,"value":791},{"type":658,"tag":765,"props":1111,"children":1112},{"style":778},[1113],{"type":663,"value":1114}," run",{"type":658,"tag":765,"props":1116,"children":1117},{"style":778},[1118],{"type":663,"value":1119}," auth:ensureSigningKey",{"type":658,"tag":765,"props":1121,"children":1122},{"style":778},[1123],{"type":663,"value":1124}," '{}'",{"type":658,"tag":659,"props":1126,"children":1127},{},[1128,1130,1135],{"type":663,"value":1129},"Note the returned ",{"type":658,"tag":666,"props":1131,"children":1132},{},[1133],{"type":663,"value":1134},"kid",{"type":663,"value":1136},". Running the command again returns the same key.",{"type":658,"tag":686,"props":1138,"children":1140},{"id":1139},"_4-create-the-vercel-project",[1141],{"type":663,"value":1142},"4. Create the Vercel project",{"type":658,"tag":712,"props":1144,"children":1145},{},[1146,1165,1183],{"type":658,"tag":716,"props":1147,"children":1148},{},[1149,1151,1156,1158,1163],{"type":663,"value":1150},"Import the repository in Vercel. Vercel detects Nuxt and uses the Nitro\n",{"type":658,"tag":666,"props":1152,"children":1153},{},[1154],{"type":663,"value":1155},"vercel",{"type":663,"value":1157}," preset. You do not need a ",{"type":658,"tag":666,"props":1159,"children":1160},{},[1161],{"type":663,"value":1162},"vercel.json",{"type":663,"value":1164}," file.",{"type":658,"tag":716,"props":1166,"children":1167},{},[1168,1170,1175,1177,1182],{"type":663,"value":1169},"Set the build command to ",{"type":658,"tag":666,"props":1171,"children":1172},{},[1173],{"type":663,"value":1174},"nuxt build",{"type":663,"value":1176},". Vercel passes the environment\nvariables directly, so the build does not need ",{"type":658,"tag":666,"props":1178,"children":1179},{},[1180],{"type":663,"value":1181},"--dotenv .env.local",{"type":663,"value":672},{"type":658,"tag":716,"props":1184,"children":1185},{},[1186,1188,1193,1195,1201,1203,1207,1209,1213],{"type":663,"value":1187},"Add your domain, ",{"type":658,"tag":666,"props":1189,"children":1190},{},[1191],{"type":663,"value":1192},"app.example.com",{"type":663,"value":1194},", under ",{"type":658,"tag":1196,"props":1197,"children":1198},"strong",{},[1199],{"type":663,"value":1200},"Domains",{"type":663,"value":1202},". Redirect the\n",{"type":658,"tag":666,"props":1204,"children":1205},{},[1206],{"type":663,"value":1059},{"type":663,"value":1208}," production domain to it, because sign-in works only on\n",{"type":658,"tag":666,"props":1210,"children":1211},{},[1212],{"type":663,"value":1052},{"type":663,"value":672},{"type":658,"tag":686,"props":1215,"children":1217},{"id":1216},"_5-set-the-vercel-environment-variables",[1218],{"type":663,"value":1219},"5. Set the Vercel environment variables",{"type":658,"tag":659,"props":1221,"children":1222},{},[1223,1225,1230,1232,1237,1239,1243,1245,1250],{"type":663,"value":1224},"Add these variables for the ",{"type":658,"tag":1196,"props":1226,"children":1227},{},[1228],{"type":663,"value":1229},"Production",{"type":663,"value":1231}," environment. Vercel passes them to\nthe build and to the server functions. The build needs them, because\n",{"type":658,"tag":666,"props":1233,"children":1234},{},[1235],{"type":663,"value":1236},"nuxt.config.ts",{"type":663,"value":1238}," reads ",{"type":658,"tag":666,"props":1240,"children":1241},{},[1242],{"type":663,"value":1052},{"type":663,"value":1244}," and ",{"type":658,"tag":666,"props":1246,"children":1247},{},[1248],{"type":663,"value":1249},"BCN_AUTH_TRUSTED_CLIENT_IP_HEADER",{"type":663,"value":672},{"type":658,"tag":1252,"props":1253,"children":1254},"table",{},[1255,1279],{"type":658,"tag":1256,"props":1257,"children":1258},"thead",{},[1259],{"type":658,"tag":1260,"props":1261,"children":1262},"tr",{},[1263,1269,1274],{"type":658,"tag":1264,"props":1265,"children":1266},"th",{},[1267],{"type":663,"value":1268},"Variable",{"type":658,"tag":1264,"props":1270,"children":1271},{},[1272],{"type":663,"value":1273},"Value",{"type":658,"tag":1264,"props":1275,"children":1276},{},[1277],{"type":663,"value":1278},"Notes",{"type":658,"tag":1280,"props":1281,"children":1282},"tbody",{},[1283,1306,1330,1354,1380],{"type":658,"tag":1260,"props":1284,"children":1285},{},[1286,1294,1301],{"type":658,"tag":1287,"props":1288,"children":1289},"td",{},[1290],{"type":658,"tag":666,"props":1291,"children":1292},{},[1293],{"type":663,"value":1052},{"type":658,"tag":1287,"props":1295,"children":1296},{},[1297],{"type":658,"tag":666,"props":1298,"children":1299},{},[1300],{"type":663,"value":670},{"type":658,"tag":1287,"props":1302,"children":1303},{},[1304],{"type":663,"value":1305},"The same value as in Convex",{"type":658,"tag":1260,"props":1307,"children":1308},{},[1309,1317,1325],{"type":658,"tag":1287,"props":1310,"children":1311},{},[1312],{"type":658,"tag":666,"props":1313,"children":1314},{},[1315],{"type":663,"value":1316},"NUXT_PUBLIC_CONVEX_URL",{"type":658,"tag":1287,"props":1318,"children":1319},{},[1320],{"type":658,"tag":666,"props":1321,"children":1322},{},[1323],{"type":663,"value":1324},"https:\u002F\u002Fyour-deployment.convex.cloud",{"type":658,"tag":1287,"props":1326,"children":1327},{},[1328],{"type":663,"value":1329},"From the Convex dashboard",{"type":658,"tag":1260,"props":1331,"children":1332},{},[1333,1341,1349],{"type":658,"tag":1287,"props":1334,"children":1335},{},[1336],{"type":658,"tag":666,"props":1337,"children":1338},{},[1339],{"type":663,"value":1340},"NUXT_PUBLIC_CONVEX_SITE_URL",{"type":658,"tag":1287,"props":1342,"children":1343},{},[1344],{"type":658,"tag":666,"props":1345,"children":1346},{},[1347],{"type":663,"value":1348},"https:\u002F\u002Fyour-deployment.convex.site",{"type":658,"tag":1287,"props":1350,"children":1351},{},[1352],{"type":663,"value":1353},"Required when you use a custom Convex domain",{"type":658,"tag":1260,"props":1355,"children":1356},{},[1357,1365,1370],{"type":658,"tag":1287,"props":1358,"children":1359},{},[1360],{"type":658,"tag":666,"props":1361,"children":1362},{},[1363],{"type":663,"value":1364},"BCN_AUTH_PROXY_IP_SECRET",{"type":658,"tag":1287,"props":1366,"children":1367},{},[1368],{"type":663,"value":1369},"The value from step 2",{"type":658,"tag":1287,"props":1371,"children":1372},{},[1373,1375],{"type":663,"value":1374},"Mark it as ",{"type":658,"tag":1196,"props":1376,"children":1377},{},[1378],{"type":663,"value":1379},"Sensitive",{"type":658,"tag":1260,"props":1381,"children":1382},{},[1383,1390,1398],{"type":658,"tag":1287,"props":1384,"children":1385},{},[1386],{"type":658,"tag":666,"props":1387,"children":1388},{},[1389],{"type":663,"value":1249},{"type":658,"tag":1287,"props":1391,"children":1392},{},[1393],{"type":658,"tag":666,"props":1394,"children":1395},{},[1396],{"type":663,"value":1397},"x-real-ip",{"type":658,"tag":1287,"props":1399,"children":1400},{},[1401,1403],{"type":663,"value":1402},"See ",{"type":658,"tag":679,"props":1404,"children":1406},{"href":1405},"#trusted-client-ip-header",[1407],{"type":663,"value":1408},"the next section",{"type":658,"tag":659,"props":1410,"children":1411},{},[1412,1414,1419],{"type":663,"value":1413},"Do not add ",{"type":658,"tag":666,"props":1415,"children":1416},{},[1417],{"type":663,"value":1418},"BETTER_AUTH_SECRETS",{"type":663,"value":1420}," to Vercel. Only Convex needs it.",{"type":658,"tag":659,"props":1422,"children":1423},{},[1424,1426,1430],{"type":663,"value":1425},"Your ",{"type":658,"tag":666,"props":1427,"children":1428},{},[1429],{"type":663,"value":1236},{"type":663,"value":1431}," passes the values to the module:",{"type":658,"tag":736,"props":1433,"children":1435},{"language":1434,"filename":1236,"class":758},"ts",[1436],{"type":658,"tag":666,"props":1437,"children":1439},{"class":1438},"language-ts",[1440,1463,1464,1487,1488,1501,1502,1514,1515,1561,1562,1594,1595,1603,1604,1612,1613],{"type":658,"tag":765,"props":1441,"children":1442},{"class":767,"style":768},[1443,1448,1453,1458],{"type":658,"tag":765,"props":1444,"children":1446},{"style":1445},"color:#AF00DB;--shiki-dark:#C586C0",[1447],{"type":663,"value":827},{"type":658,"tag":765,"props":1449,"children":1450},{"style":1445},[1451],{"type":663,"value":1452}," default",{"type":658,"tag":765,"props":1454,"children":1455},{"style":772},[1456],{"type":663,"value":1457}," defineNuxtConfig",{"type":658,"tag":765,"props":1459,"children":1460},{"style":836},[1461],{"type":663,"value":1462},"({",{"type":663,"value":872},{"type":658,"tag":765,"props":1465,"children":1466},{"class":767,"style":768},[1467,1472,1477,1482],{"type":658,"tag":765,"props":1468,"children":1469},{"style":830},[1470],{"type":663,"value":1471},"  modules:",{"type":658,"tag":765,"props":1473,"children":1474},{"style":836},[1475],{"type":663,"value":1476}," [",{"type":658,"tag":765,"props":1478,"children":1479},{"style":778},[1480],{"type":663,"value":1481},"'@lupinum\u002Fbetter-convex-nuxt'",{"type":658,"tag":765,"props":1483,"children":1484},{"style":836},[1485],{"type":663,"value":1486},"],",{"type":663,"value":872},{"type":658,"tag":765,"props":1489,"children":1490},{"class":767,"style":768},[1491,1496],{"type":658,"tag":765,"props":1492,"children":1493},{"style":830},[1494],{"type":663,"value":1495},"  convex:",{"type":658,"tag":765,"props":1497,"children":1498},{"style":836},[1499],{"type":663,"value":1500}," {",{"type":663,"value":872},{"type":658,"tag":765,"props":1503,"children":1504},{"class":767,"style":768},[1505,1510],{"type":658,"tag":765,"props":1506,"children":1507},{"style":830},[1508],{"type":663,"value":1509},"    auth:",{"type":658,"tag":765,"props":1511,"children":1512},{"style":836},[1513],{"type":663,"value":1500},{"type":663,"value":872},{"type":658,"tag":765,"props":1516,"children":1517},{"class":767,"style":768},[1518,1523,1528,1532,1537,1541,1546,1551,1556],{"type":658,"tag":765,"props":1519,"children":1520},{"style":830},[1521],{"type":663,"value":1522},"      origin:",{"type":658,"tag":765,"props":1524,"children":1525},{"style":830},[1526],{"type":663,"value":1527}," process",{"type":658,"tag":765,"props":1529,"children":1530},{"style":836},[1531],{"type":663,"value":672},{"type":658,"tag":765,"props":1533,"children":1534},{"style":830},[1535],{"type":663,"value":1536},"env",{"type":658,"tag":765,"props":1538,"children":1539},{"style":836},[1540],{"type":663,"value":672},{"type":658,"tag":765,"props":1542,"children":1544},{"style":1543},"color:#0070C1;--shiki-dark:#4FC1FF",[1545],{"type":663,"value":1052},{"type":658,"tag":765,"props":1547,"children":1548},{"style":836},[1549],{"type":663,"value":1550}," ?? ",{"type":658,"tag":765,"props":1552,"children":1553},{"style":778},[1554],{"type":663,"value":1555},"'http:\u002F\u002Flocalhost:3000'",{"type":658,"tag":765,"props":1557,"children":1558},{"style":836},[1559],{"type":663,"value":1560},",",{"type":663,"value":872},{"type":658,"tag":765,"props":1563,"children":1564},{"class":767,"style":768},[1565,1570,1574,1578,1582,1586,1590],{"type":658,"tag":765,"props":1566,"children":1567},{"style":830},[1568],{"type":663,"value":1569},"      trustedClientIpHeader:",{"type":658,"tag":765,"props":1571,"children":1572},{"style":830},[1573],{"type":663,"value":1527},{"type":658,"tag":765,"props":1575,"children":1576},{"style":836},[1577],{"type":663,"value":672},{"type":658,"tag":765,"props":1579,"children":1580},{"style":830},[1581],{"type":663,"value":1536},{"type":658,"tag":765,"props":1583,"children":1584},{"style":836},[1585],{"type":663,"value":672},{"type":658,"tag":765,"props":1587,"children":1588},{"style":1543},[1589],{"type":663,"value":1249},{"type":658,"tag":765,"props":1591,"children":1592},{"style":836},[1593],{"type":663,"value":1560},{"type":663,"value":872},{"type":658,"tag":765,"props":1596,"children":1597},{"class":767,"style":768},[1598],{"type":658,"tag":765,"props":1599,"children":1600},{"style":836},[1601],{"type":663,"value":1602},"    },",{"type":663,"value":872},{"type":658,"tag":765,"props":1605,"children":1606},{"class":767,"style":768},[1607],{"type":658,"tag":765,"props":1608,"children":1609},{"style":836},[1610],{"type":663,"value":1611},"  },",{"type":663,"value":872},{"type":658,"tag":765,"props":1614,"children":1615},{"class":767,"style":768},[1616],{"type":658,"tag":765,"props":1617,"children":1618},{"style":836},[1619],{"type":663,"value":1620},"})",{"type":658,"tag":686,"props":1622,"children":1624},{"id":1623},"trusted-client-ip-header",[1625],{"type":663,"value":1626},"Trusted client IP header",{"type":658,"tag":659,"props":1628,"children":1629},{},[1630,1632,1637],{"type":663,"value":1631},"Better Auth limits sign-in attempts per client IP. The auth proxy reads the IP\nfrom the header in ",{"type":658,"tag":666,"props":1633,"children":1634},{},[1635],{"type":663,"value":1636},"trustedClientIpHeader",{"type":663,"value":1638},", signs it, and sends it to Convex.\nThe header must contain exactly one IP address, and clients must not be able\nto set it.",{"type":658,"tag":659,"props":1640,"children":1641},{},[1642,1644,1648],{"type":663,"value":1643},"On Vercel, use ",{"type":658,"tag":666,"props":1645,"children":1646},{},[1647],{"type":663,"value":1397},{"type":663,"value":1649},". Vercel sets it to the IP address of the client and\nreplaces any value that the client sends. Requests cannot reach your Vercel\nfunctions without passing through Vercel, so clients cannot bypass it.",{"type":658,"tag":659,"props":1651,"children":1652},{},[1653,1658,1660,1664],{"type":658,"tag":1196,"props":1654,"children":1655},{},[1656],{"type":663,"value":1657},"Warning:",{"type":663,"value":1659}," If you put another proxy or CDN in front of Vercel, ",{"type":658,"tag":666,"props":1661,"children":1662},{},[1663],{"type":663,"value":1397},{"type":663,"value":1665},"\ncontains the address of that proxy. Then every user shares one rate limit.\nUse the client IP header of that proxy instead, and block requests that do\nnot come through it.",{"type":658,"tag":659,"props":1667,"children":1668},{},[1669,1671,1676],{"type":663,"value":1670},"Without the variable, the build fails with\n",{"type":658,"tag":666,"props":1672,"children":1673},{},[1674],{"type":663,"value":1675},"auth.trustedClientIpHeader is required outside exact loopback development origins",{"type":663,"value":672},{"type":658,"tag":686,"props":1678,"children":1680},{"id":1679},"_6-deploy-and-check",[1681],{"type":663,"value":1682},"6. Deploy and check",{"type":658,"tag":712,"props":1684,"children":1685},{},[1686,1691,1709,1719,1724],{"type":658,"tag":716,"props":1687,"children":1688},{},[1689],{"type":663,"value":1690},"Deploy the production branch.",{"type":658,"tag":716,"props":1692,"children":1693},{},[1694,1696,1701,1703,1707],{"type":663,"value":1695},"Open ",{"type":658,"tag":666,"props":1697,"children":1698},{},[1699],{"type":663,"value":1700},"https:\u002F\u002Fapp.example.com\u002Fapi\u002Fauth\u002Fjwks",{"type":663,"value":1702},". Check that it lists the ",{"type":658,"tag":666,"props":1704,"children":1705},{},[1706],{"type":663,"value":1134},{"type":663,"value":1708},"\nfrom step 3.",{"type":658,"tag":716,"props":1710,"children":1711},{},[1712,1714,1718],{"type":663,"value":1713},"Sign up, sign in, reload, and sign out on ",{"type":658,"tag":666,"props":1715,"children":1716},{},[1717],{"type":663,"value":670},{"type":663,"value":672},{"type":658,"tag":716,"props":1720,"children":1721},{},[1722],{"type":663,"value":1723},"Open a page with a live query in two browsers. Change data in one and check\nthat the other updates.",{"type":658,"tag":716,"props":1725,"children":1726},{},[1727,1729,1733],{"type":663,"value":1728},"If you use MCP, connect a host as described in\n",{"type":658,"tag":679,"props":1730,"children":1731},{"href":411},[1732],{"type":663,"value":407},{"type":663,"value":672},{"type":658,"tag":659,"props":1735,"children":1736},{},[1737,1739,1744],{"type":663,"value":1738},"Do not turn on ISR or ",{"type":658,"tag":666,"props":1740,"children":1741},{},[1742],{"type":663,"value":1743},"swr",{"type":663,"value":1745}," route rules for pages that render signed-in data.\nA shared cache would show one user's page to another user.",{"type":658,"tag":686,"props":1747,"children":1749},{"id":1748},"preview-deployments",[1750],{"type":663,"value":1751},"Preview deployments",{"type":658,"tag":659,"props":1753,"children":1754},{},[1755,1757,1761],{"type":663,"value":1756},"Every Vercel preview gets its own URL. Better Auth accepts requests only from\nthe exact ",{"type":658,"tag":666,"props":1758,"children":1759},{},[1760],{"type":663,"value":1052},{"type":663,"value":1762},", so sign-in does not work on a preview URL that differs\nfrom it. Choose one of these setups:",{"type":658,"tag":659,"props":1764,"children":1765},{},[1766,1771,1773,1778,1780,1785,1787,1792,1794,1798,1800,1805,1807,1811,1813,1818,1820,1824,1826,1830],{"type":658,"tag":1196,"props":1767,"children":1768},{},[1769],{"type":663,"value":1770},"A stable staging domain with auth.",{"type":663,"value":1772}," Assign a domain such as\n",{"type":658,"tag":666,"props":1774,"children":1775},{},[1776],{"type":663,"value":1777},"staging.example.com",{"type":663,"value":1779}," to a ",{"type":658,"tag":666,"props":1781,"children":1782},{},[1783],{"type":663,"value":1784},"staging",{"type":663,"value":1786}," branch in Vercel. Create a separate\nConvex project for staging and deploy it with its own production deploy key.\nIn Vercel, add ",{"type":658,"tag":1196,"props":1788,"children":1789},{},[1790],{"type":663,"value":1791},"Preview",{"type":663,"value":1793}," environment variables for the ",{"type":658,"tag":666,"props":1795,"children":1796},{},[1797],{"type":663,"value":1784},{"type":663,"value":1799}," branch:\n",{"type":658,"tag":666,"props":1801,"children":1802},{},[1803],{"type":663,"value":1804},"SITE_URL=https:\u002F\u002Fstaging.example.com",{"type":663,"value":1806},", the staging Convex URLs, a separate\n",{"type":658,"tag":666,"props":1808,"children":1809},{},[1810],{"type":663,"value":1364},{"type":663,"value":1812},", and ",{"type":658,"tag":666,"props":1814,"children":1815},{},[1816],{"type":663,"value":1817},"BCN_AUTH_TRUSTED_CLIENT_IP_HEADER=x-real-ip",{"type":663,"value":1819},".\nIn the staging Convex deployment, set the same ",{"type":658,"tag":666,"props":1821,"children":1822},{},[1823],{"type":663,"value":1052},{"type":663,"value":1825},", a separate\n",{"type":658,"tag":666,"props":1827,"children":1828},{},[1829],{"type":663,"value":1418},{"type":663,"value":1831},", and the same proxy secret.",{"type":658,"tag":659,"props":1833,"children":1834},{},[1835,1840,1842,1846],{"type":658,"tag":1196,"props":1836,"children":1837},{},[1838],{"type":663,"value":1839},"Other previews without sign-in.",{"type":663,"value":1841}," Point their Preview variables at the\nstaging Convex deployment and staging ",{"type":658,"tag":666,"props":1843,"children":1844},{},[1845],{"type":663,"value":1052},{"type":663,"value":1847},". Pages render, but sign-in\nfails on those URLs. Protect them with Vercel Deployment Protection.",{"type":658,"tag":659,"props":1849,"children":1850},{},[1851,1853,1858],{"type":663,"value":1852},"Never point a preview at the production Convex deployment, and never reuse\nproduction secrets. ",{"type":658,"tag":666,"props":1854,"children":1855},{},[1856],{"type":663,"value":1857},"better-convex convex deploy",{"type":663,"value":1859}," accepts only a production\ndeploy key, so use a separate Convex project for staging instead of Convex\npreview deployments.",{"title":1861,"searchDepth":1862,"depth":1862,"links":1863},"",4,[1864,1866,1867,1868,1869,1870,1871,1872],{"id":688,"depth":1865,"text":691},2,{"id":804,"depth":1865,"text":807},{"id":1076,"depth":1865,"text":1079},{"id":1139,"depth":1865,"text":1142},{"id":1216,"depth":1865,"text":1219},{"id":1623,"depth":1865,"text":1626},{"id":1679,"depth":1865,"text":1682},{"id":1748,"depth":1865,"text":1751},"markdown","docs",{"source":1876,"path":1877,"stem":1878,"dir":1879,"extension":1880},"content","docs\u002F6.operations\u002F3.deploy-to-vercel.md","docs\u002F6.operations\u002F3.deploy-to-vercel","operations","md",{"requestedPath":574,"resolvedPath":574,"alternates":1882},[],{"requested":1884,"resolved":1885,"usedFallback":6},{},{"locale":8},{"previous":1887,"next":1889},{"title":562,"id":563,"canonicalKey":564,"locale":8,"draft":6,"navigation":1888,"icon":566,"path":567},{"icon":566},{"title":576,"id":577,"canonicalKey":578,"locale":8,"draft":6,"navigation":1890,"icon":379,"path":580},{"icon":379},{"left":1892,"top":1892,"width":1893,"height":1893,"rotate":1892,"vFlip":6,"hFlip":6,"body":1894},0,24,"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\"\u002F>\u003Cpath d=\"M14 2v5a1 1 0 0 0 1 1h5\"\u002F>\u003C\u002Fg>",{"left":1892,"top":1892,"width":1893,"height":1893,"rotate":1892,"vFlip":6,"hFlip":6,"body":1896},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 19h8M4 17l6-6l-6-6\"\u002F>",{"left":1892,"top":1892,"width":1898,"height":1899,"rotate":1892,"vFlip":6,"hFlip":6,"body":1900},256,168,"\u003Cpath fill=\"#00dc82\" d=\"M143.618 167.029h95.166c3.023 0 5.992-.771 8.61-2.237a16.96 16.96 0 0 0 6.302-6.115a16.3 16.3 0 0 0 2.304-8.352c0-2.932-.799-5.811-2.312-8.35L189.778 34.6a16.97 16.97 0 0 0-6.301-6.113a17.6 17.6 0 0 0-8.608-2.238c-3.023 0-5.991.772-8.609 2.238a16.96 16.96 0 0 0-6.3 6.113l-16.342 27.473l-31.95-53.724a17 17 0 0 0-6.304-6.112A17.64 17.64 0 0 0 96.754 0c-3.022 0-5.992.772-8.61 2.237a17 17 0 0 0-6.303 6.112L2.31 141.975a16.3 16.3 0 0 0-2.31 8.35c0 2.932.793 5.813 2.304 8.352a16.96 16.96 0 0 0 6.302 6.115a17.6 17.6 0 0 0 8.61 2.237h59.737c23.669 0 41.123-10.084 53.134-29.758l29.159-48.983l15.618-26.215l46.874 78.742h-62.492zm-67.64-26.24l-41.688-.01L96.782 35.796l31.181 52.492l-20.877 35.084c-7.976 12.765-17.037 17.416-31.107 17.416\"\u002F>",{"left":1892,"top":1892,"width":1893,"height":1893,"rotate":1892,"vFlip":6,"hFlip":6,"body":1902},"\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>",1790591525490]