[{"data":1,"prerenderedAt":1767},["ShallowReactive",2],{"docs-navigation":3,"docs:\u002Fdocs\u002Fnuxt\u002Fanalytics\u002Fcloudflare":618,"\u002Fdocs\u002Fnuxt\u002Fanalytics\u002Fcloudflare:surround":1764},[4],{"title":5,"path":6,"children":7},"Docs","\u002Fdocs",[8,316,467],{"title":9,"path":10,"children":11},"Vite","\u002Fdocs\u002Fvite",[12,30,52,63,78,100,174,183,219,238,255,273,304],{"title":13,"path":14,"description":15,"icon":16,"children":17},"Getting Started","\u002Fdocs\u002Fvite\u002Fgetting-started","Learn the ViteHub package model, pick a starting path, and get to a working feature quickly.","i-lucide-rocket",[18,22,26],{"title":19,"path":20,"description":21},"Choose a Package","\u002Fdocs\u002Fvite\u002Fgetting-started\u002Fchoose-a-package","Pick the right ViteHub feature by the job you need to solve on the server.",{"title":23,"path":24,"description":25},"Entrypoints","\u002Fdocs\u002Fvite\u002Fgetting-started\u002Fentrypoints","Understand what belongs on the package root and what each framework-specific entrypoint owns.",{"title":27,"path":28,"description":29},"Architecture","\u002Fdocs\u002Fvite\u002Fgetting-started\u002Farchitecture","How ViteHub keeps one shared feature bridge across Vite, Nitro, and Nuxt.",{"title":31,"path":32,"description":33,"icon":34,"children":35},"Database","\u002Fdocs\u002Fvite\u002Fdatabase","Set up Drizzle or Prisma with `@vitehub\u002Fdb` and explicit ORM runtime imports.","i-lucide-database",[36,40,44,48],{"title":37,"path":38,"description":39},"Drizzle","\u002Fdocs\u002Fvite\u002Fdatabase\u002Fdrizzle","Configure Drizzle with `@vitehub\u002Fdb\u002Fdrizzle`, schema discovery, and committed SQL migrations.",{"title":41,"path":42,"description":43},"Prisma","\u002Fdocs\u002Fvite\u002Fdatabase\u002Fprisma","Configure Prisma with `@vitehub\u002Fdb\u002Fprisma`, generated client output, and native Prisma migrations.",{"title":45,"path":46,"description":47},"Migrations","\u002Fdocs\u002Fvite\u002Fdatabase\u002Fmigrations","Understand when ViteHub applies committed Drizzle and Prisma migrations during development and build.",{"title":49,"path":50,"description":51},"Platform notes","\u002Fdocs\u002Fvite\u002Fdatabase\u002Fplatform-notes","Review driver defaults, hosting behavior, and current runtime limits for Drizzle and Prisma.",{"title":53,"path":54,"description":55,"icon":56,"children":57},"KV","\u002Fdocs\u002Fvite\u002Fkv","Set up key-value storage with the same provider detection used by NuxtHub.","i-lucide-database-zap",[58],{"title":59,"path":60,"description":61,"icon":62},"Usage","\u002Fdocs\u002Fvite\u002Fkv\u002Fusage","Use the KV SDK to set, get, delete, clear, and list key-value pairs.","i-lucide-code",{"title":64,"path":65,"description":66,"icon":67,"children":68},"Blob","\u002Fdocs\u002Fvite\u002Fblob","Add blob storage for images, videos, documents, and other files with `@vitehub\u002Fblob`.","i-lucide-shapes",[69,74],{"title":70,"path":71,"description":72,"icon":73},"Upload","\u002Fdocs\u002Fvite\u002Fblob\u002Fupload","Upload files with validation, simple form handlers, and multipart flows using `@vitehub\u002Fblob`.","i-lucide-upload",{"title":75,"path":76,"description":77,"icon":62},"Blob SDK","\u002Fdocs\u002Fvite\u002Fblob\u002Fusage","Store, read, list, validate, serve, and delete files with `@vitehub\u002Fblob`.",{"title":79,"path":80,"description":81,"icon":82,"children":83},"Vector","\u002Fdocs\u002Fvite\u002Fvector","Add provider-agnostic named vector indexes with similarity search.","i-lucide-scan-search",[84,90,95],{"title":85,"path":86,"description":87,"icon":88,"group":89},"Cloudflare","\u002Fdocs\u002Fvite\u002Fvector\u002Fcloudflare","Configure @vitehub\u002Fvector against Cloudflare Vectorize.","i-simple-icons-cloudflare","Providers",{"title":91,"path":92,"description":93,"icon":94,"group":89},"Postgres","\u002Fdocs\u002Fvite\u002Fvector\u002Fpostgres","Configure @vitehub\u002Fvector against a pgvector-backed Postgres database.","i-simple-icons-postgresql",{"title":96,"path":97,"description":98,"icon":99,"group":89},"Upstash","\u002Fdocs\u002Fvite\u002Fvector\u002Fupstash","Configure @vitehub\u002Fvector against the Upstash Vector HTTP API.","i-simple-icons-upstash",{"title":101,"path":102,"description":103,"icon":104,"children":105},"Queue","\u002Fdocs\u002Fvite\u002Fqueue","Send background jobs through Platformatic, Cloudflare, Vercel, Netlify, Upstash QStash, or Memory.","i-lucide-layers",[106,110,114,118,123,127,131,135,139,144,147,152,157,161,166,170],{"title":107,"path":108,"description":109},"Quickstart","\u002Fdocs\u002Fvite\u002Fqueue\u002Fquickstart","Get a first queue working locally with the memory provider.",{"title":111,"path":112,"description":113},"Runtime API","\u002Fdocs\u002Fvite\u002Fqueue\u002Fruntime-api","Reference for defineQueue, runQueue, deferQueue, getQueue, and the core Queue types.",{"title":115,"path":116,"description":117},"When to use Queue","\u002Fdocs\u002Fvite\u002Fqueue\u002Fwhen-to-use","Decide when Queue is the right primitive compared with Workflow, Cron, or inline request handling.",{"title":119,"path":120,"description":121,"group":122},"Send a job","\u002Fdocs\u002Fvite\u002Fqueue\u002Fguides\u002Fsend-a-job","Enqueue payloads with runQueue and the common delivery patterns.","Guides",{"title":124,"path":125,"description":126,"group":122},"Defer after response","\u002Fdocs\u002Fvite\u002Fqueue\u002Fguides\u002Fdefer-after-response","Use deferQueue when the queue send should happen after the current response is committed.",{"title":128,"path":129,"description":130,"group":122},"Validate payloads","\u002Fdocs\u002Fvite\u002Fqueue\u002Fguides\u002Fvalidate-payloads","Validate payloads before enqueueing and before running queue handlers.",{"title":132,"path":133,"description":134,"group":122},"Local development","\u002Fdocs\u002Fvite\u002Fqueue\u002Fguides\u002Flocal-development","Use the memory provider for local development and understand how auto-selection works.",{"title":136,"path":137,"description":138,"group":122},"Native handles","\u002Fdocs\u002Fvite\u002Fqueue\u002Fguides\u002Fnative-handles","Know when to use getQueue and provider-native methods instead of the portable runtime API.",{"title":140,"path":141,"description":142,"icon":143,"group":89},"Platformatic","\u002Fdocs\u002Fvite\u002Fqueue\u002Fproviders\u002Fplatformatic","Configure Platformatic Job Queue with local or self-hosted workers.","i-brand-platformatic",{"title":85,"path":145,"description":146,"icon":88,"group":89},"\u002Fdocs\u002Fvite\u002Fqueue\u002Fproviders\u002Fcloudflare","Configure Cloudflare Queues and process named queues in Workers.",{"title":148,"path":149,"description":150,"icon":151,"group":89},"Vercel","\u002Fdocs\u002Fvite\u002Fqueue\u002Fproviders\u002Fvercel","Configure Vercel Queue and send named jobs through Vercel.","i-simple-icons-vercel",{"title":153,"path":154,"description":155,"icon":156,"group":89},"Netlify","\u002Fdocs\u002Fvite\u002Fqueue\u002Fproviders\u002Fnetlify","Configure Netlify Async Workloads and run named queues on Netlify.","i-simple-icons-netlify",{"title":158,"path":159,"description":160,"icon":99,"group":89},"Upstash QStash","\u002Fdocs\u002Fvite\u002Fqueue\u002Fproviders\u002Fupstash-qstash","Configure Upstash QStash for queues and signed callback delivery.",{"title":162,"path":163,"description":164,"icon":165,"group":89},"Memory","\u002Fdocs\u002Fvite\u002Fqueue\u002Fproviders\u002Fmemory","Process queue jobs in-memory for local development and testing.","i-lucide-memory-stick",{"title":167,"path":168,"description":169},"Troubleshooting","\u002Fdocs\u002Fvite\u002Fqueue\u002Ftroubleshooting","Diagnose common Queue setup and runtime problems across local and hosted providers.",{"title":171,"path":172,"description":173},"Playground","\u002Fdocs\u002Fvite\u002Fqueue\u002Fplayground","Explore the existing Queue playground app and the files that show the end-to-end runtime flow.",{"title":175,"path":176,"description":177,"icon":178,"children":179},"Cache","\u002Fdocs\u002Fvite\u002Fcache","Configure Nitro cache storage for local development, Vercel, and Cloudflare deployments.","i-lucide-timer-reset",[180],{"title":59,"path":181,"description":182,"icon":62},"\u002Fdocs\u002Fvite\u002Fcache\u002Fusage","Cache routes and server functions with practical invalidation examples.",{"title":184,"path":185,"description":186,"icon":187,"children":188},"Email","\u002Fdocs\u002Fvite\u002Femail","Render markdown email files and send them through Resend, SendGrid, or Postmark.","i-lucide-mail",[189,194,199,204,209,214],{"title":190,"path":191,"description":192,"icon":193},"Frontmatter","\u002Fdocs\u002Fvite\u002Femail\u002Ffrontmatter","Define subject lines, recipients, metadata, and delivery defaults directly in the Markdown email file.","i-lucide-file-text",{"title":195,"path":196,"description":197,"icon":198},"Input Schemas","\u002Fdocs\u002Fvite\u002Femail\u002Finput-schemas","Add an embedded schema block when you want email input validation and stronger TypeScript inference.","i-brand-standard-schema",{"title":200,"path":201,"description":202,"icon":203},"i18n","\u002Fdocs\u002Fvite\u002Femail\u002Fi18n","Localize Markdown emails with locale-specific template files and ICU message formatting.","i-lucide-languages",{"title":205,"path":206,"description":207,"icon":208,"group":89},"Resend","\u002Fdocs\u002Fvite\u002Femail\u002Fresend","Configure Resend for transactional delivery and native batch sending.","i-provider-resend",{"title":210,"path":211,"description":212,"icon":213,"group":89},"SendGrid","\u002Fdocs\u002Fvite\u002Femail\u002Fsendgrid","Configure SendGrid when you need advanced delivery controls and template support.","i-provider-sendgrid",{"title":215,"path":216,"description":217,"icon":218,"group":89},"Postmark","\u002Fdocs\u002Fvite\u002Femail\u002Fpostmark","Configure Postmark for transactional streams and template-first sends.","i-provider-postmark",{"title":220,"path":221,"description":222,"icon":223,"children":224},"Workflow","\u002Fdocs\u002Fvite\u002Fworkflow","Run durable workflows on Cloudflare, Netlify, Vercel, or OpenWorkflow.","i-lucide-workflow",[225,228,231,235],{"title":85,"path":226,"description":227,"icon":88},"\u002Fdocs\u002Fvite\u002Fworkflow\u002Fcloudflare","Configure Cloudflare Workflows and inspect runs from your app.",{"title":148,"path":229,"description":230,"icon":151},"\u002Fdocs\u002Fvite\u002Fworkflow\u002Fvercel","Configure Vercel Workflow and run durable workflows on Vercel.",{"title":232,"path":233,"description":234,"icon":223},"OpenWorkflow","\u002Fdocs\u002Fvite\u002Fworkflow\u002Fopenworkflow","Connect OpenWorkflow and use your own workflow backend behind the ViteHub API.",{"title":153,"path":236,"description":237,"icon":156},"\u002Fdocs\u002Fvite\u002Fworkflow\u002Fnetlify","Configure Netlify Async Workloads and run discovered workflows on Netlify.",{"title":239,"path":240,"description":241,"icon":242,"children":243},"Cron","\u002Fdocs\u002Fvite\u002Fcron","Schedule crons with Node, Cloudflare, or Vercel.","i-lucide-list-check",[244,249,252],{"title":245,"path":246,"description":247,"icon":248},"Node","\u002Fdocs\u002Fvite\u002Fcron\u002Fnode","Configure in-process scheduling for local crons and lightweight cron tasks.","i-simple-icons-nodedotjs",{"title":85,"path":250,"description":251,"icon":88},"\u002Fdocs\u002Fvite\u002Fcron\u002Fcloudflare","Configure Cloudflare-triggered schedules for your crons.",{"title":148,"path":253,"description":254,"icon":151},"\u002Fdocs\u002Fvite\u002Fcron\u002Fvercel","Generate Vercel cron config from discovered crons.",{"title":256,"path":257,"description":258,"icon":259,"children":260},"Browser","\u002Fdocs\u002Fvite\u002Fbrowser","Run named browser automations against Playwright, Browserbase, or Cloudflare Browser Rendering.","i-lucide-monitor-play",[261,264,269],{"title":85,"path":262,"description":263,"icon":88},"\u002Fdocs\u002Fvite\u002Fbrowser\u002Fcloudflare","Configure Cloudflare Browser Rendering through the official `cloudflare` package.",{"title":265,"path":266,"description":267,"icon":268},"Browserbase","\u002Fdocs\u002Fvite\u002Fbrowser\u002Fbrowserbase","Configure Browserbase for managed CDP sessions and session-aware browser calls.","i-lucide-orbit",{"title":270,"path":271,"description":272,"icon":259},"Playwright","\u002Fdocs\u002Fvite\u002Fbrowser\u002Fplaywright","Configure remote Playwright browser sessions over a WebSocket endpoint.",{"title":274,"path":275,"description":276,"icon":277,"children":278},"Sandbox","\u002Fdocs\u002Fvite\u002Fsandbox","Run isolated sandboxes on Cloudflare Durable Objects, Cloudflare Dynamic Workers, Vercel, Deno, Docker, or locally.","i-lucide-box",[279,282,286,289,294,299],{"title":85,"path":280,"description":281,"icon":88},"\u002Fdocs\u002Fvite\u002Fsandbox\u002Fcloudflare","Configure Cloudflare Sandbox on top of Durable Objects.",{"title":283,"path":284,"description":285,"icon":88},"Cloudflare Dynamic","\u002Fdocs\u002Fvite\u002Fsandbox\u002Fcloudflare-dynamic","Configure Cloudflare Dynamic Workers with the Worker Loader API.",{"title":148,"path":287,"description":288,"icon":151},"\u002Fdocs\u002Fvite\u002Fsandbox\u002Fvercel","Configure Vercel Sandbox and run isolated sandboxes on Vercel.",{"title":290,"path":291,"description":292,"icon":293},"Deno","\u002Fdocs\u002Fvite\u002Fsandbox\u002Fdeno","Configure Deno Sandbox and run isolated sandboxes on Deno Deploy.","i-simple-icons-deno",{"title":295,"path":296,"description":297,"icon":298},"Docker","\u002Fdocs\u002Fvite\u002Fsandbox\u002Fdocker","Configure Docker Sandbox and run isolated sandboxes locally.","i-simple-icons-docker",{"title":300,"path":301,"description":302,"icon":303},"Local","\u002Fdocs\u002Fvite\u002Fsandbox\u002Flocal","Run sandboxes locally with OS-level isolation using platform primitives.","i-lucide-monitor",{"title":305,"path":306,"description":307,"icon":308,"children":309},"Analytics","\u002Fdocs\u002Fvite\u002Fanalytics","Integrate explicit analytics backends with a small shared runtime API.","i-lucide-megaphone",[310,313],{"title":148,"path":311,"description":312,"icon":151},"\u002Fdocs\u002Fvite\u002Fanalytics\u002Fvercel","Configure Vercel Analytics through the official SDK and keep a small portable runtime API.",{"title":85,"path":314,"description":315,"icon":88},"\u002Fdocs\u002Fvite\u002Fanalytics\u002Fcloudflare","Configure first-party analytics ingestion on Cloudflare and query a semantic event shape on top of Analytics Engine slots.",{"title":317,"path":318,"children":319},"Nitro","\u002Fdocs\u002Fnitro",[320,329,340,345,352,361,396,401,416,427,436,445,460],{"title":13,"path":321,"description":15,"icon":16,"children":322},"\u002Fdocs\u002Fnitro\u002Fgetting-started",[323,325,327],{"title":19,"path":324,"description":21},"\u002Fdocs\u002Fnitro\u002Fgetting-started\u002Fchoose-a-package",{"title":23,"path":326,"description":25},"\u002Fdocs\u002Fnitro\u002Fgetting-started\u002Fentrypoints",{"title":27,"path":328,"description":29},"\u002Fdocs\u002Fnitro\u002Fgetting-started\u002Farchitecture",{"title":31,"path":330,"description":33,"icon":34,"children":331},"\u002Fdocs\u002Fnitro\u002Fdatabase",[332,334,336,338],{"title":37,"path":333,"description":39},"\u002Fdocs\u002Fnitro\u002Fdatabase\u002Fdrizzle",{"title":41,"path":335,"description":43},"\u002Fdocs\u002Fnitro\u002Fdatabase\u002Fprisma",{"title":45,"path":337,"description":47},"\u002Fdocs\u002Fnitro\u002Fdatabase\u002Fmigrations",{"title":49,"path":339,"description":51},"\u002Fdocs\u002Fnitro\u002Fdatabase\u002Fplatform-notes",{"title":53,"path":341,"description":55,"icon":56,"children":342},"\u002Fdocs\u002Fnitro\u002Fkv",[343],{"title":59,"path":344,"description":61,"icon":62},"\u002Fdocs\u002Fnitro\u002Fkv\u002Fusage",{"title":64,"path":346,"description":66,"icon":67,"children":347},"\u002Fdocs\u002Fnitro\u002Fblob",[348,350],{"title":70,"path":349,"description":72,"icon":73},"\u002Fdocs\u002Fnitro\u002Fblob\u002Fupload",{"title":75,"path":351,"description":77,"icon":62},"\u002Fdocs\u002Fnitro\u002Fblob\u002Fusage",{"title":79,"path":353,"description":81,"icon":82,"children":354},"\u002Fdocs\u002Fnitro\u002Fvector",[355,357,359],{"title":85,"path":356,"description":87,"icon":88,"group":89},"\u002Fdocs\u002Fnitro\u002Fvector\u002Fcloudflare",{"title":91,"path":358,"description":93,"icon":94,"group":89},"\u002Fdocs\u002Fnitro\u002Fvector\u002Fpostgres",{"title":96,"path":360,"description":98,"icon":99,"group":89},"\u002Fdocs\u002Fnitro\u002Fvector\u002Fupstash",{"title":101,"path":362,"description":103,"icon":104,"children":363},"\u002Fdocs\u002Fnitro\u002Fqueue",[364,366,368,370,372,374,376,378,380,382,384,386,388,390,392,394],{"title":107,"path":365,"description":109},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fquickstart",{"title":111,"path":367,"description":113},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fruntime-api",{"title":115,"path":369,"description":117},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fwhen-to-use",{"title":119,"path":371,"description":121,"group":122},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fguides\u002Fsend-a-job",{"title":124,"path":373,"description":126,"group":122},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fguides\u002Fdefer-after-response",{"title":128,"path":375,"description":130,"group":122},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fguides\u002Fvalidate-payloads",{"title":132,"path":377,"description":134,"group":122},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fguides\u002Flocal-development",{"title":136,"path":379,"description":138,"group":122},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fguides\u002Fnative-handles",{"title":140,"path":381,"description":142,"icon":143,"group":89},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fproviders\u002Fplatformatic",{"title":85,"path":383,"description":146,"icon":88,"group":89},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fproviders\u002Fcloudflare",{"title":148,"path":385,"description":150,"icon":151,"group":89},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fproviders\u002Fvercel",{"title":153,"path":387,"description":155,"icon":156,"group":89},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fproviders\u002Fnetlify",{"title":158,"path":389,"description":160,"icon":99,"group":89},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fproviders\u002Fupstash-qstash",{"title":162,"path":391,"description":164,"icon":165,"group":89},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fproviders\u002Fmemory",{"title":167,"path":393,"description":169},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Ftroubleshooting",{"title":171,"path":395,"description":173},"\u002Fdocs\u002Fnitro\u002Fqueue\u002Fplayground",{"title":175,"path":397,"description":177,"icon":178,"children":398},"\u002Fdocs\u002Fnitro\u002Fcache",[399],{"title":59,"path":400,"description":182,"icon":62},"\u002Fdocs\u002Fnitro\u002Fcache\u002Fusage",{"title":184,"path":402,"description":186,"icon":187,"children":403},"\u002Fdocs\u002Fnitro\u002Femail",[404,406,408,410,412,414],{"title":190,"path":405,"description":192,"icon":193},"\u002Fdocs\u002Fnitro\u002Femail\u002Ffrontmatter",{"title":195,"path":407,"description":197,"icon":198},"\u002Fdocs\u002Fnitro\u002Femail\u002Finput-schemas",{"title":200,"path":409,"description":202,"icon":203},"\u002Fdocs\u002Fnitro\u002Femail\u002Fi18n",{"title":205,"path":411,"description":207,"icon":208,"group":89},"\u002Fdocs\u002Fnitro\u002Femail\u002Fresend",{"title":210,"path":413,"description":212,"icon":213,"group":89},"\u002Fdocs\u002Fnitro\u002Femail\u002Fsendgrid",{"title":215,"path":415,"description":217,"icon":218,"group":89},"\u002Fdocs\u002Fnitro\u002Femail\u002Fpostmark",{"title":220,"path":417,"description":222,"icon":223,"children":418},"\u002Fdocs\u002Fnitro\u002Fworkflow",[419,421,423,425],{"title":85,"path":420,"description":227,"icon":88},"\u002Fdocs\u002Fnitro\u002Fworkflow\u002Fcloudflare",{"title":148,"path":422,"description":230,"icon":151},"\u002Fdocs\u002Fnitro\u002Fworkflow\u002Fvercel",{"title":232,"path":424,"description":234,"icon":223},"\u002Fdocs\u002Fnitro\u002Fworkflow\u002Fopenworkflow",{"title":153,"path":426,"description":237,"icon":156},"\u002Fdocs\u002Fnitro\u002Fworkflow\u002Fnetlify",{"title":239,"path":428,"description":241,"icon":242,"children":429},"\u002Fdocs\u002Fnitro\u002Fcron",[430,432,434],{"title":245,"path":431,"description":247,"icon":248},"\u002Fdocs\u002Fnitro\u002Fcron\u002Fnode",{"title":85,"path":433,"description":251,"icon":88},"\u002Fdocs\u002Fnitro\u002Fcron\u002Fcloudflare",{"title":148,"path":435,"description":254,"icon":151},"\u002Fdocs\u002Fnitro\u002Fcron\u002Fvercel",{"title":256,"path":437,"description":258,"icon":259,"children":438},"\u002Fdocs\u002Fnitro\u002Fbrowser",[439,441,443],{"title":85,"path":440,"description":263,"icon":88},"\u002Fdocs\u002Fnitro\u002Fbrowser\u002Fcloudflare",{"title":265,"path":442,"description":267,"icon":268},"\u002Fdocs\u002Fnitro\u002Fbrowser\u002Fbrowserbase",{"title":270,"path":444,"description":272,"icon":259},"\u002Fdocs\u002Fnitro\u002Fbrowser\u002Fplaywright",{"title":274,"path":446,"description":276,"icon":277,"children":447},"\u002Fdocs\u002Fnitro\u002Fsandbox",[448,450,452,454,456,458],{"title":85,"path":449,"description":281,"icon":88},"\u002Fdocs\u002Fnitro\u002Fsandbox\u002Fcloudflare",{"title":283,"path":451,"description":285,"icon":88},"\u002Fdocs\u002Fnitro\u002Fsandbox\u002Fcloudflare-dynamic",{"title":148,"path":453,"description":288,"icon":151},"\u002Fdocs\u002Fnitro\u002Fsandbox\u002Fvercel",{"title":290,"path":455,"description":292,"icon":293},"\u002Fdocs\u002Fnitro\u002Fsandbox\u002Fdeno",{"title":295,"path":457,"description":297,"icon":298},"\u002Fdocs\u002Fnitro\u002Fsandbox\u002Fdocker",{"title":300,"path":459,"description":302,"icon":303},"\u002Fdocs\u002Fnitro\u002Fsandbox\u002Flocal",{"title":305,"path":461,"description":307,"icon":308,"children":462},"\u002Fdocs\u002Fnitro\u002Fanalytics",[463,465],{"title":148,"path":464,"description":312,"icon":151},"\u002Fdocs\u002Fnitro\u002Fanalytics\u002Fvercel",{"title":85,"path":466,"description":315,"icon":88},"\u002Fdocs\u002Fnitro\u002Fanalytics\u002Fcloudflare",{"title":468,"path":469,"children":470},"Nuxt","\u002Fdocs\u002Fnuxt",[471,480,491,496,503,512,547,552,567,578,587,596,611],{"title":13,"path":472,"description":15,"icon":16,"children":473},"\u002Fdocs\u002Fnuxt\u002Fgetting-started",[474,476,478],{"title":19,"path":475,"description":21},"\u002Fdocs\u002Fnuxt\u002Fgetting-started\u002Fchoose-a-package",{"title":23,"path":477,"description":25},"\u002Fdocs\u002Fnuxt\u002Fgetting-started\u002Fentrypoints",{"title":27,"path":479,"description":29},"\u002Fdocs\u002Fnuxt\u002Fgetting-started\u002Farchitecture",{"title":31,"path":481,"description":33,"icon":34,"children":482},"\u002Fdocs\u002Fnuxt\u002Fdatabase",[483,485,487,489],{"title":37,"path":484,"description":39},"\u002Fdocs\u002Fnuxt\u002Fdatabase\u002Fdrizzle",{"title":41,"path":486,"description":43},"\u002Fdocs\u002Fnuxt\u002Fdatabase\u002Fprisma",{"title":45,"path":488,"description":47},"\u002Fdocs\u002Fnuxt\u002Fdatabase\u002Fmigrations",{"title":49,"path":490,"description":51},"\u002Fdocs\u002Fnuxt\u002Fdatabase\u002Fplatform-notes",{"title":53,"path":492,"description":55,"icon":56,"children":493},"\u002Fdocs\u002Fnuxt\u002Fkv",[494],{"title":59,"path":495,"description":61,"icon":62},"\u002Fdocs\u002Fnuxt\u002Fkv\u002Fusage",{"title":64,"path":497,"description":66,"icon":67,"children":498},"\u002Fdocs\u002Fnuxt\u002Fblob",[499,501],{"title":70,"path":500,"description":72,"icon":73},"\u002Fdocs\u002Fnuxt\u002Fblob\u002Fupload",{"title":75,"path":502,"description":77,"icon":62},"\u002Fdocs\u002Fnuxt\u002Fblob\u002Fusage",{"title":79,"path":504,"description":81,"icon":82,"children":505},"\u002Fdocs\u002Fnuxt\u002Fvector",[506,508,510],{"title":85,"path":507,"description":87,"icon":88,"group":89},"\u002Fdocs\u002Fnuxt\u002Fvector\u002Fcloudflare",{"title":91,"path":509,"description":93,"icon":94,"group":89},"\u002Fdocs\u002Fnuxt\u002Fvector\u002Fpostgres",{"title":96,"path":511,"description":98,"icon":99,"group":89},"\u002Fdocs\u002Fnuxt\u002Fvector\u002Fupstash",{"title":101,"path":513,"description":103,"icon":104,"children":514},"\u002Fdocs\u002Fnuxt\u002Fqueue",[515,517,519,521,523,525,527,529,531,533,535,537,539,541,543,545],{"title":107,"path":516,"description":109},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fquickstart",{"title":111,"path":518,"description":113},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fruntime-api",{"title":115,"path":520,"description":117},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fwhen-to-use",{"title":119,"path":522,"description":121,"group":122},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fguides\u002Fsend-a-job",{"title":124,"path":524,"description":126,"group":122},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fguides\u002Fdefer-after-response",{"title":128,"path":526,"description":130,"group":122},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fguides\u002Fvalidate-payloads",{"title":132,"path":528,"description":134,"group":122},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fguides\u002Flocal-development",{"title":136,"path":530,"description":138,"group":122},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fguides\u002Fnative-handles",{"title":140,"path":532,"description":142,"icon":143,"group":89},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fproviders\u002Fplatformatic",{"title":85,"path":534,"description":146,"icon":88,"group":89},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fproviders\u002Fcloudflare",{"title":148,"path":536,"description":150,"icon":151,"group":89},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fproviders\u002Fvercel",{"title":153,"path":538,"description":155,"icon":156,"group":89},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fproviders\u002Fnetlify",{"title":158,"path":540,"description":160,"icon":99,"group":89},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fproviders\u002Fupstash-qstash",{"title":162,"path":542,"description":164,"icon":165,"group":89},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fproviders\u002Fmemory",{"title":167,"path":544,"description":169},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Ftroubleshooting",{"title":171,"path":546,"description":173},"\u002Fdocs\u002Fnuxt\u002Fqueue\u002Fplayground",{"title":175,"path":548,"description":177,"icon":178,"children":549},"\u002Fdocs\u002Fnuxt\u002Fcache",[550],{"title":59,"path":551,"description":182,"icon":62},"\u002Fdocs\u002Fnuxt\u002Fcache\u002Fusage",{"title":184,"path":553,"description":186,"icon":187,"children":554},"\u002Fdocs\u002Fnuxt\u002Femail",[555,557,559,561,563,565],{"title":190,"path":556,"description":192,"icon":193},"\u002Fdocs\u002Fnuxt\u002Femail\u002Ffrontmatter",{"title":195,"path":558,"description":197,"icon":198},"\u002Fdocs\u002Fnuxt\u002Femail\u002Finput-schemas",{"title":200,"path":560,"description":202,"icon":203},"\u002Fdocs\u002Fnuxt\u002Femail\u002Fi18n",{"title":205,"path":562,"description":207,"icon":208,"group":89},"\u002Fdocs\u002Fnuxt\u002Femail\u002Fresend",{"title":210,"path":564,"description":212,"icon":213,"group":89},"\u002Fdocs\u002Fnuxt\u002Femail\u002Fsendgrid",{"title":215,"path":566,"description":217,"icon":218,"group":89},"\u002Fdocs\u002Fnuxt\u002Femail\u002Fpostmark",{"title":220,"path":568,"description":222,"icon":223,"children":569},"\u002Fdocs\u002Fnuxt\u002Fworkflow",[570,572,574,576],{"title":85,"path":571,"description":227,"icon":88},"\u002Fdocs\u002Fnuxt\u002Fworkflow\u002Fcloudflare",{"title":148,"path":573,"description":230,"icon":151},"\u002Fdocs\u002Fnuxt\u002Fworkflow\u002Fvercel",{"title":232,"path":575,"description":234,"icon":223},"\u002Fdocs\u002Fnuxt\u002Fworkflow\u002Fopenworkflow",{"title":153,"path":577,"description":237,"icon":156},"\u002Fdocs\u002Fnuxt\u002Fworkflow\u002Fnetlify",{"title":239,"path":579,"description":241,"icon":242,"children":580},"\u002Fdocs\u002Fnuxt\u002Fcron",[581,583,585],{"title":245,"path":582,"description":247,"icon":248},"\u002Fdocs\u002Fnuxt\u002Fcron\u002Fnode",{"title":85,"path":584,"description":251,"icon":88},"\u002Fdocs\u002Fnuxt\u002Fcron\u002Fcloudflare",{"title":148,"path":586,"description":254,"icon":151},"\u002Fdocs\u002Fnuxt\u002Fcron\u002Fvercel",{"title":256,"path":588,"description":258,"icon":259,"children":589},"\u002Fdocs\u002Fnuxt\u002Fbrowser",[590,592,594],{"title":85,"path":591,"description":263,"icon":88},"\u002Fdocs\u002Fnuxt\u002Fbrowser\u002Fcloudflare",{"title":265,"path":593,"description":267,"icon":268},"\u002Fdocs\u002Fnuxt\u002Fbrowser\u002Fbrowserbase",{"title":270,"path":595,"description":272,"icon":259},"\u002Fdocs\u002Fnuxt\u002Fbrowser\u002Fplaywright",{"title":274,"path":597,"description":276,"icon":277,"children":598},"\u002Fdocs\u002Fnuxt\u002Fsandbox",[599,601,603,605,607,609],{"title":85,"path":600,"description":281,"icon":88},"\u002Fdocs\u002Fnuxt\u002Fsandbox\u002Fcloudflare",{"title":283,"path":602,"description":285,"icon":88},"\u002Fdocs\u002Fnuxt\u002Fsandbox\u002Fcloudflare-dynamic",{"title":148,"path":604,"description":288,"icon":151},"\u002Fdocs\u002Fnuxt\u002Fsandbox\u002Fvercel",{"title":290,"path":606,"description":292,"icon":293},"\u002Fdocs\u002Fnuxt\u002Fsandbox\u002Fdeno",{"title":295,"path":608,"description":297,"icon":298},"\u002Fdocs\u002Fnuxt\u002Fsandbox\u002Fdocker",{"title":300,"path":610,"description":302,"icon":303},"\u002Fdocs\u002Fnuxt\u002Fsandbox\u002Flocal",{"title":305,"path":612,"description":307,"icon":308,"children":613},"\u002Fdocs\u002Fnuxt\u002Fanalytics",[614,616],{"title":148,"path":615,"description":312,"icon":151},"\u002Fdocs\u002Fnuxt\u002Fanalytics\u002Fvercel",{"title":85,"path":617,"description":315,"icon":88},"\u002Fdocs\u002Fnuxt\u002Fanalytics\u002Fcloudflare",{"id":619,"title":620,"body":621,"description":315,"extension":1758,"meta":1759,"navigation":1760,"path":617,"seo":1761,"stem":1762,"__hash__":1763},"docs\u002Fdocs\u002Fnuxt\u002Fanalytics\u002Fcloudflare.md","Cloudflare Analytics Engine",{"type":622,"value":623,"toc":1749},"minimark",[624,633,638,644,667,671,684,826,830,836,879,883,886,1050,1054,1057,1238,1244,1367,1371,1382,1640,1643,1666,1670,1739,1745],[625,626,627,628,632],"p",{},"Use Cloudflare Analytics Engine when you want first-party ingestion on Cloudflare without managing your own event store. ViteHub keeps the public runtime API on ",[629,630,631],"code",{},"@vitehub\u002Fanalytics",", routes browser-side helpers through a generated ingestion endpoint, and writes normalized server-side events into a bound dataset.",[634,635,637],"h2",{"id":636},"before-you-start","Before you start",[625,639,640,641,643],{},"Cloudflare Analytics Engine does not need an extra npm package for ",[629,642,631],{},", but it does require a Worker binding.",[645,646,647,659,664],"ul",{},[648,649,650,651,654,655,658],"li",{},"Configure an ",[629,652,653],{},"analytics_engine_datasets"," binding in the generated Wrangler config through ",[629,656,657],{},"analytics.cloudflareAnalyticsEngine",".",[648,660,661,662,658],{},"Expect Analytics Engine to stay ingestion-focused. Querying happens through Cloudflare's SQL API, not through ",[629,663,631],{},[648,665,666],{},"Analytics Engine retains data for three months and uses sampled queries for large reads.",[634,668,670],{"id":669},"configure-cloudflare-analytics-engine","Configure Cloudflare Analytics Engine",[625,672,673,674,677,678,681,682,658],{},"Set ",[629,675,676],{},"analytics.provider"," to ",[629,679,680],{},"cloudflare-analytics-engine",", then configure the dataset under ",[629,683,657],{},[685,686,688],"fw",{"id":687},"nuxt",[689,690,696],"pre",{"className":691,"code":692,"filename":693,"language":694,"meta":695,"style":695},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineNuxtConfig({\n  modules: ['@vitehub\u002Fanalytics\u002Fnuxt'],\n  analytics: {\n    provider: 'cloudflare-analytics-engine',\n    cloudflareAnalyticsEngine: {\n      dataset: 'analytics_events',\n    },\n  },\n})\n","nuxt.config.ts","ts","",[629,697,698,722,750,761,778,788,805,811,817],{"__ignoreMap":695},[699,700,703,707,710,714,718],"span",{"class":701,"line":702},"line",1,[699,704,706],{"class":705},"s7zQu","export",[699,708,709],{"class":705}," default",[699,711,713],{"class":712},"s2Zo4"," defineNuxtConfig",[699,715,717],{"class":716},"sTEyZ","(",[699,719,721],{"class":720},"sMK4o","{\n",[699,723,725,729,732,735,738,742,744,747],{"class":701,"line":724},2,[699,726,728],{"class":727},"swJcz","  modules",[699,730,731],{"class":720},":",[699,733,734],{"class":716}," [",[699,736,737],{"class":720},"'",[699,739,741],{"class":740},"sfazB","@vitehub\u002Fanalytics\u002Fnuxt",[699,743,737],{"class":720},[699,745,746],{"class":716},"]",[699,748,749],{"class":720},",\n",[699,751,753,756,758],{"class":701,"line":752},3,[699,754,755],{"class":727},"  analytics",[699,757,731],{"class":720},[699,759,760],{"class":720}," {\n",[699,762,764,767,769,772,774,776],{"class":701,"line":763},4,[699,765,766],{"class":727},"    provider",[699,768,731],{"class":720},[699,770,771],{"class":720}," '",[699,773,680],{"class":740},[699,775,737],{"class":720},[699,777,749],{"class":720},[699,779,781,784,786],{"class":701,"line":780},5,[699,782,783],{"class":727},"    cloudflareAnalyticsEngine",[699,785,731],{"class":720},[699,787,760],{"class":720},[699,789,791,794,796,798,801,803],{"class":701,"line":790},6,[699,792,793],{"class":727},"      dataset",[699,795,731],{"class":720},[699,797,771],{"class":720},[699,799,800],{"class":740},"analytics_events",[699,802,737],{"class":720},[699,804,749],{"class":720},[699,806,808],{"class":701,"line":807},7,[699,809,810],{"class":720},"    },\n",[699,812,814],{"class":701,"line":813},8,[699,815,816],{"class":720},"  },\n",[699,818,820,823],{"class":701,"line":819},9,[699,821,822],{"class":720},"}",[699,824,825],{"class":716},")\n",[634,827,829],{"id":828},"cloudflare-specific-options","Cloudflare-specific options",[625,831,832,833,835],{},"Keep Analytics Engine settings in top-level ",[629,834,657],{}," config.",[837,838,839,852],"table",{},[840,841,842],"thead",{},[843,844,845,849],"tr",{},[846,847,848],"th",{},"Option",[846,850,851],{},"Use it for",[853,854,855,869],"tbody",{},[843,856,857,863],{},[858,859,860],"td",{},[629,861,862],{},"binding",[858,864,865,866,658],{},"Override the Worker binding name used at runtime. Defaults to ",[629,867,868],{},"ANALYTICS",[843,870,871,876],{},[858,872,873],{},[629,874,875],{},"dataset",[858,877,878],{},"Name the Analytics Engine dataset bound to the Worker. Required.",[634,880,882],{"id":881},"track-events","Track events",[625,884,885],{},"Use the shared runtime helpers on the client or the server. Browser-side calls always post to ViteHub's generated ingestion route. Server-side calls write directly to the bound Analytics Engine dataset.",[685,887,888],{"id":687},[689,889,892],{"className":691,"code":890,"filename":891,"language":694,"meta":695,"style":695},"import { group, track } from '@vitehub\u002Fanalytics'\n\nexport default defineEventHandler(async () => {\n  await group('team_123', { seats: 5 })\n  await track('signup', { plan: 'pro' })\n\n  return { ok: true }\n})\n","server\u002Fapi\u002Fsignup.post.ts",[629,893,894,924,930,953,986,1021,1025,1044],{"__ignoreMap":695},[699,895,896,899,902,905,908,911,914,917,919,921],{"class":701,"line":702},[699,897,898],{"class":705},"import",[699,900,901],{"class":720}," {",[699,903,904],{"class":716}," group",[699,906,907],{"class":720},",",[699,909,910],{"class":716}," track",[699,912,913],{"class":720}," }",[699,915,916],{"class":705}," from",[699,918,771],{"class":720},[699,920,631],{"class":740},[699,922,923],{"class":720},"'\n",[699,925,926],{"class":701,"line":724},[699,927,929],{"emptyLinePlaceholder":928},true,"\n",[699,931,932,934,936,939,941,945,948,951],{"class":701,"line":752},[699,933,706],{"class":705},[699,935,709],{"class":705},[699,937,938],{"class":712}," defineEventHandler",[699,940,717],{"class":716},[699,942,944],{"class":943},"spNyl","async",[699,946,947],{"class":720}," ()",[699,949,950],{"class":943}," =>",[699,952,760],{"class":720},[699,954,955,958,960,962,964,967,969,971,973,976,978,982,984],{"class":701,"line":763},[699,956,957],{"class":705},"  await",[699,959,904],{"class":712},[699,961,717],{"class":727},[699,963,737],{"class":720},[699,965,966],{"class":740},"team_123",[699,968,737],{"class":720},[699,970,907],{"class":720},[699,972,901],{"class":720},[699,974,975],{"class":727}," seats",[699,977,731],{"class":720},[699,979,981],{"class":980},"sbssI"," 5",[699,983,913],{"class":720},[699,985,825],{"class":727},[699,987,988,990,992,994,996,999,1001,1003,1005,1008,1010,1012,1015,1017,1019],{"class":701,"line":780},[699,989,957],{"class":705},[699,991,910],{"class":712},[699,993,717],{"class":727},[699,995,737],{"class":720},[699,997,998],{"class":740},"signup",[699,1000,737],{"class":720},[699,1002,907],{"class":720},[699,1004,901],{"class":720},[699,1006,1007],{"class":727}," plan",[699,1009,731],{"class":720},[699,1011,771],{"class":720},[699,1013,1014],{"class":740},"pro",[699,1016,737],{"class":720},[699,1018,913],{"class":720},[699,1020,825],{"class":727},[699,1022,1023],{"class":701,"line":790},[699,1024,929],{"emptyLinePlaceholder":928},[699,1026,1027,1030,1032,1035,1037,1041],{"class":701,"line":807},[699,1028,1029],{"class":705},"  return",[699,1031,901],{"class":720},[699,1033,1034],{"class":727}," ok",[699,1036,731],{"class":720},[699,1038,1040],{"class":1039},"sfNiH"," true",[699,1042,1043],{"class":720}," }\n",[699,1045,1046,1048],{"class":701,"line":813},[699,1047,822],{"class":720},[699,1049,825],{"class":716},[634,1051,1053],{"id":1052},"semantic-event-shape","Semantic event shape",[625,1055,1056],{},"Treat the raw Analytics Engine slots as a storage detail. ViteHub writes a fixed event schema for new rows and recommends querying it through semantic aliases.",[837,1058,1059,1069],{},[840,1060,1061],{},[843,1062,1063,1066],{},[846,1064,1065],{},"Semantic field",[846,1067,1068],{},"Meaning",[853,1070,1071,1089,1118,1132,1145,1161,1178,1192,1205,1224],{},[843,1072,1073,1078],{},[858,1074,1075],{},[629,1076,1077],{},"sample_key",[858,1079,1080,1081,1084,1085,1088],{},"Stable sampling key derived from ",[629,1082,1083],{},"userId",", ",[629,1086,1087],{},"groupId",", page path, event name, or operation.",[843,1090,1091,1096],{},[858,1092,1093],{},[629,1094,1095],{},"operation",[858,1097,1098,1099,1084,1102,1084,1105,1084,1108,1084,1111,1114,1115,658],{},"Helper kind such as ",[629,1100,1101],{},"track",[629,1103,1104],{},"page",[629,1106,1107],{},"identify",[629,1109,1110],{},"alias",[629,1112,1113],{},"group",", or ",[629,1116,1117],{},"reset",[843,1119,1120,1125],{},[858,1121,1122],{},[629,1123,1124],{},"event_name",[858,1126,1127,1128,1131],{},"Custom event name from ",[629,1129,1130],{},"track()",". Empty for other helpers.",[843,1133,1134,1139],{},[858,1135,1136],{},[629,1137,1138],{},"page_path",[858,1140,1141,1142,1131],{},"Page path from ",[629,1143,1144],{},"page({ path })",[843,1146,1147,1152],{},[858,1148,1149],{},[629,1150,1151],{},"runtime",[858,1153,1154,1157,1158,658],{},[629,1155,1156],{},"client"," or ",[629,1159,1160],{},"server",[843,1162,1163,1168],{},[858,1164,1165],{},[629,1166,1167],{},"subject_kind",[858,1169,1170,1084,1173,1114,1175,658],{},[629,1171,1172],{},"user",[629,1174,1113],{},[629,1176,1177],{},"none",[843,1179,1180,1185],{},[858,1181,1182],{},[629,1183,1184],{},"subject_id",[858,1186,1187,1157,1189,1191],{},[629,1188,1083],{},[629,1190,1087],{}," when present.",[843,1193,1194,1199],{},[858,1195,1196],{},[629,1197,1198],{},"schema_version",[858,1200,1201,1202,658],{},"Fixed version marker. New rows use ",[629,1203,1204],{},"v2",[843,1206,1207,1212],{},[858,1208,1209],{},[629,1210,1211],{},"metadata_json",[858,1213,1214,1215,1084,1218,1114,1221,658],{},"Remaining helper payload such as extra ",[629,1216,1217],{},"data",[629,1219,1220],{},"traits",[629,1222,1223],{},"previousId",[843,1225,1226,1231],{},[858,1227,1228],{},[629,1229,1230],{},"event_count",[858,1232,1233,1234,1237],{},"Constant ",[629,1235,1236],{},"1",", useful for counts.",[625,1239,1240,1241,1243],{},"For ",[629,1242,1204],{}," rows, the raw slot layout is:",[837,1245,1246,1255],{},[840,1247,1248],{},[843,1249,1250,1253],{},[846,1251,1252],{},"Raw slot",[846,1254,1065],{},[853,1256,1257,1268,1279,1290,1301,1312,1323,1334,1345,1356],{},[843,1258,1259,1264],{},[858,1260,1261],{},[629,1262,1263],{},"index1",[858,1265,1266],{},[629,1267,1077],{},[843,1269,1270,1275],{},[858,1271,1272],{},[629,1273,1274],{},"blob1",[858,1276,1277],{},[629,1278,1095],{},[843,1280,1281,1286],{},[858,1282,1283],{},[629,1284,1285],{},"blob2",[858,1287,1288],{},[629,1289,1124],{},[843,1291,1292,1297],{},[858,1293,1294],{},[629,1295,1296],{},"blob3",[858,1298,1299],{},[629,1300,1138],{},[843,1302,1303,1308],{},[858,1304,1305],{},[629,1306,1307],{},"blob4",[858,1309,1310],{},[629,1311,1151],{},[843,1313,1314,1319],{},[858,1315,1316],{},[629,1317,1318],{},"blob5",[858,1320,1321],{},[629,1322,1167],{},[843,1324,1325,1330],{},[858,1326,1327],{},[629,1328,1329],{},"blob6",[858,1331,1332],{},[629,1333,1184],{},[843,1335,1336,1341],{},[858,1337,1338],{},[629,1339,1340],{},"blob7",[858,1342,1343],{},[629,1344,1198],{},[843,1346,1347,1352],{},[858,1348,1349],{},[629,1350,1351],{},"blob8",[858,1353,1354],{},[629,1355,1211],{},[843,1357,1358,1363],{},[858,1359,1360],{},[629,1361,1362],{},"double1",[858,1364,1365],{},[629,1366,1230],{},[634,1368,1370],{"id":1369},"query-the-dataset","Query the dataset",[625,1372,1373,1374,1377,1378,1381],{},"ViteHub does not abstract reads. Query Analytics Engine directly through Cloudflare's SQL API, but keep one semantic ",[629,1375,1376],{},"SELECT"," as your query layer so the rest of your queries do not depend on ",[629,1379,1380],{},"blobN"," positions.",[689,1383,1387],{"className":1384,"code":1385,"language":1386,"meta":695,"style":695},"language-sql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","WITH analytics_events_semantic AS (\n  SELECT\n    index1 AS sample_key,\n    blob1 AS operation,\n    CASE\n      WHEN blob7 = 'v2' THEN blob2\n      WHEN blob1 = 'track' THEN blob2\n      ELSE ''\n    END AS event_name,\n    CASE\n      WHEN blob7 = 'v2' THEN blob3\n      WHEN blob1 = 'page' THEN blob2\n      ELSE ''\n    END AS page_path,\n    CASE\n      WHEN blob7 = 'v2' THEN blob4\n      ELSE blob3\n    END AS runtime,\n    CASE\n      WHEN blob7 = 'v2' THEN blob5\n      ELSE ''\n    END AS subject_kind,\n    CASE\n      WHEN blob7 = 'v2' THEN blob6\n      ELSE ''\n    END AS subject_id,\n    CASE\n      WHEN blob7 = 'v2' THEN blob8\n      ELSE blob4\n    END AS metadata_json,\n    CASE\n      WHEN blob7 = 'v2' THEN blob7\n      ELSE 'v1'\n    END AS schema_version,\n    double1 AS event_count\n  FROM analytics_events\n)\nSELECT\n  event_name,\n  SUM(event_count) AS events\nFROM analytics_events_semantic\nWHERE operation = 'track'\nGROUP BY event_name\nORDER BY events DESC\nLIMIT 20\n","sql",[629,1388,1389,1394,1399,1404,1409,1414,1419,1424,1429,1434,1439,1445,1451,1456,1462,1467,1473,1479,1485,1490,1496,1501,1507,1512,1518,1523,1529,1534,1540,1546,1552,1557,1563,1569,1575,1581,1587,1592,1598,1604,1610,1616,1622,1628,1634],{"__ignoreMap":695},[699,1390,1391],{"class":701,"line":702},[699,1392,1393],{},"WITH analytics_events_semantic AS (\n",[699,1395,1396],{"class":701,"line":724},[699,1397,1398],{},"  SELECT\n",[699,1400,1401],{"class":701,"line":752},[699,1402,1403],{},"    index1 AS sample_key,\n",[699,1405,1406],{"class":701,"line":763},[699,1407,1408],{},"    blob1 AS operation,\n",[699,1410,1411],{"class":701,"line":780},[699,1412,1413],{},"    CASE\n",[699,1415,1416],{"class":701,"line":790},[699,1417,1418],{},"      WHEN blob7 = 'v2' THEN blob2\n",[699,1420,1421],{"class":701,"line":807},[699,1422,1423],{},"      WHEN blob1 = 'track' THEN blob2\n",[699,1425,1426],{"class":701,"line":813},[699,1427,1428],{},"      ELSE ''\n",[699,1430,1431],{"class":701,"line":819},[699,1432,1433],{},"    END AS event_name,\n",[699,1435,1437],{"class":701,"line":1436},10,[699,1438,1413],{},[699,1440,1442],{"class":701,"line":1441},11,[699,1443,1444],{},"      WHEN blob7 = 'v2' THEN blob3\n",[699,1446,1448],{"class":701,"line":1447},12,[699,1449,1450],{},"      WHEN blob1 = 'page' THEN blob2\n",[699,1452,1454],{"class":701,"line":1453},13,[699,1455,1428],{},[699,1457,1459],{"class":701,"line":1458},14,[699,1460,1461],{},"    END AS page_path,\n",[699,1463,1465],{"class":701,"line":1464},15,[699,1466,1413],{},[699,1468,1470],{"class":701,"line":1469},16,[699,1471,1472],{},"      WHEN blob7 = 'v2' THEN blob4\n",[699,1474,1476],{"class":701,"line":1475},17,[699,1477,1478],{},"      ELSE blob3\n",[699,1480,1482],{"class":701,"line":1481},18,[699,1483,1484],{},"    END AS runtime,\n",[699,1486,1488],{"class":701,"line":1487},19,[699,1489,1413],{},[699,1491,1493],{"class":701,"line":1492},20,[699,1494,1495],{},"      WHEN blob7 = 'v2' THEN blob5\n",[699,1497,1499],{"class":701,"line":1498},21,[699,1500,1428],{},[699,1502,1504],{"class":701,"line":1503},22,[699,1505,1506],{},"    END AS subject_kind,\n",[699,1508,1510],{"class":701,"line":1509},23,[699,1511,1413],{},[699,1513,1515],{"class":701,"line":1514},24,[699,1516,1517],{},"      WHEN blob7 = 'v2' THEN blob6\n",[699,1519,1521],{"class":701,"line":1520},25,[699,1522,1428],{},[699,1524,1526],{"class":701,"line":1525},26,[699,1527,1528],{},"    END AS subject_id,\n",[699,1530,1532],{"class":701,"line":1531},27,[699,1533,1413],{},[699,1535,1537],{"class":701,"line":1536},28,[699,1538,1539],{},"      WHEN blob7 = 'v2' THEN blob8\n",[699,1541,1543],{"class":701,"line":1542},29,[699,1544,1545],{},"      ELSE blob4\n",[699,1547,1549],{"class":701,"line":1548},30,[699,1550,1551],{},"    END AS metadata_json,\n",[699,1553,1555],{"class":701,"line":1554},31,[699,1556,1413],{},[699,1558,1560],{"class":701,"line":1559},32,[699,1561,1562],{},"      WHEN blob7 = 'v2' THEN blob7\n",[699,1564,1566],{"class":701,"line":1565},33,[699,1567,1568],{},"      ELSE 'v1'\n",[699,1570,1572],{"class":701,"line":1571},34,[699,1573,1574],{},"    END AS schema_version,\n",[699,1576,1578],{"class":701,"line":1577},35,[699,1579,1580],{},"    double1 AS event_count\n",[699,1582,1584],{"class":701,"line":1583},36,[699,1585,1586],{},"  FROM analytics_events\n",[699,1588,1590],{"class":701,"line":1589},37,[699,1591,825],{},[699,1593,1595],{"class":701,"line":1594},38,[699,1596,1597],{},"SELECT\n",[699,1599,1601],{"class":701,"line":1600},39,[699,1602,1603],{},"  event_name,\n",[699,1605,1607],{"class":701,"line":1606},40,[699,1608,1609],{},"  SUM(event_count) AS events\n",[699,1611,1613],{"class":701,"line":1612},41,[699,1614,1615],{},"FROM analytics_events_semantic\n",[699,1617,1619],{"class":701,"line":1618},42,[699,1620,1621],{},"WHERE operation = 'track'\n",[699,1623,1625],{"class":701,"line":1624},43,[699,1626,1627],{},"GROUP BY event_name\n",[699,1629,1631],{"class":701,"line":1630},44,[699,1632,1633],{},"ORDER BY events DESC\n",[699,1635,1637],{"class":701,"line":1636},45,[699,1638,1639],{},"LIMIT 20\n",[625,1641,1642],{},"The compatibility layer above reads both:",[645,1644,1645,1650],{},[648,1646,1647,1649],{},[629,1648,1204],{}," rows from the current fixed slot schema",[648,1651,1652,1653,1656,1657,1659,1660,1662,1663,1665],{},"older ",[629,1654,1655],{},"v1"," rows where ",[629,1658,1285],{}," stored the event label or page path, ",[629,1661,1296],{}," stored runtime, and ",[629,1664,1307],{}," stored the JSON envelope",[634,1667,1669],{"id":1668},"what-changes-on-cloudflare","What changes on Cloudflare",[837,1671,1672,1682],{},[840,1673,1674],{},[843,1675,1676,1679],{},[846,1677,1678],{},"Concern",[846,1680,1681],{},"Behavior",[853,1683,1684,1699,1707,1715,1731],{},[843,1685,1686,1689],{},[858,1687,1688],{},"Browser ingestion",[858,1690,1691,1692,1695,1696,658],{},"Client-side helpers always post to ",[629,1693,1694],{},"\u002F_vitehub\u002Fanalytics\u002Ftrack"," or your overridden ",[629,1697,1698],{},"analytics.client.base",[843,1700,1701,1704],{},[858,1702,1703],{},"Server ingestion",[858,1705,1706],{},"Nitro writes directly to the Analytics Engine binding.",[843,1708,1709,1712],{},[858,1710,1711],{},"Storage",[858,1713,1714],{},"ViteHub does not use D1 for analytics persistence anymore.",[843,1716,1717,1720],{},[858,1718,1719],{},"Native handle",[858,1721,1722,1725,1726,1728,1729,658],{},[629,1723,1724],{},"getAnalytics().native"," exposes ",[629,1727,862],{}," and ",[629,1730,875],{},[843,1732,1733,1736],{},[858,1734,1735],{},"Querying",[858,1737,1738],{},"Reads stay in Cloudflare through the Analytics Engine SQL API.",[1740,1741,1742],"tip",{},[625,1743,1744],{},"Choose Cloudflare Analytics Engine when the app runs on Cloudflare and you want one shared event API with a first-party ingestion path.",[1746,1747,1748],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":695,"searchDepth":724,"depth":724,"links":1750},[1751,1752,1753,1754,1755,1756,1757],{"id":636,"depth":724,"text":637},{"id":669,"depth":724,"text":670},{"id":828,"depth":724,"text":829},{"id":881,"depth":724,"text":882},{"id":1052,"depth":724,"text":1053},{"id":1369,"depth":724,"text":1370},{"id":1668,"depth":724,"text":1669},"md",{"icon":88},{"title":85},{"title":620,"description":315},"docs\u002Fnuxt\u002Fanalytics\u002Fcloudflare","ttsLH7znT7GpXbFz_Mt4EZqQJFohcCtpwMxlaoKQSuc",[1765,1766],{"title":148,"path":615,"description":312},null,1775568184131]