[{"data":1,"prerenderedAt":1733},["ShallowReactive",2],{"navigation_docs":3,"-integrate-adapters-self-hosted-nuxthub":424,"-integrate-adapters-self-hosted-nuxthub-surround":1728},[4,25,75,230,338,393],{"title":5,"path":6,"stem":7,"children":8,"page":24},"Start","\u002Fstart","1.start",[9,14,19],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fstart\u002Fintroduction","1.start\u002F1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Installation","\u002Fstart\u002Finstallation","1.start\u002F2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Quick Start","\u002Fstart\u002Fquick-start","1.start\u002F3.quick-start","i-lucide-zap",false,{"title":26,"path":27,"stem":28,"children":29,"page":24},"Learn","\u002Flearn","2.learn",[30,35,40,45,50,55,60,65,70],{"title":31,"path":32,"stem":33,"icon":34},"Overview","\u002Flearn\u002Foverview","2.learn\u002F0.overview","i-lucide-list",{"title":36,"path":37,"stem":38,"icon":39},"Simple Logging","\u002Flearn\u002Fsimple-logging","2.learn\u002F1.simple-logging","i-lucide-terminal",{"title":41,"path":42,"stem":43,"icon":44},"Wide Events","\u002Flearn\u002Fwide-events","2.learn\u002F2.wide-events","i-lucide-layers",{"title":46,"path":47,"stem":48,"icon":49},"Structured Errors","\u002Flearn\u002Fstructured-errors","2.learn\u002F3.structured-errors","i-lucide-shield-alert",{"title":51,"path":52,"stem":53,"icon":54},"Lifecycle","\u002Flearn\u002Flifecycle","2.learn\u002F4.lifecycle","i-lucide-arrow-right-left",{"title":56,"path":57,"stem":58,"icon":59},"Sampling","\u002Flearn\u002Fsampling","2.learn\u002F5.sampling","i-lucide-filter",{"title":61,"path":62,"stem":63,"icon":64},"Auto-Redaction","\u002Flearn\u002Fredaction","2.learn\u002F6.redaction","i-lucide-eye-off",{"title":66,"path":67,"stem":68,"icon":69},"Typed Fields","\u002Flearn\u002Ftyped-fields","2.learn\u002F7.typed-fields","i-simple-icons-typescript",{"title":71,"path":72,"stem":73,"icon":74},"Catalogs","\u002Flearn\u002Fcatalogs","2.learn\u002F8.catalogs","i-lucide-book-open",{"title":76,"path":77,"stem":78,"children":79,"page":24},"Integrate","\u002Fintegrate","3.integrate",[80,84,147],{"title":31,"path":81,"stem":82,"icon":83},"\u002Fintegrate\u002Foverview","3.integrate\u002F0.overview","i-lucide-plug",{"title":85,"path":86,"stem":87,"children":88,"page":24},"Adapters","\u002Fintegrate\u002Fadapters","3.integrate\u002Fadapters",[89,92,132],{"title":31,"path":90,"stem":91,"icon":34},"\u002Fintegrate\u002Fadapters\u002Foverview","3.integrate\u002Fadapters\u002F01.overview",{"title":93,"path":94,"stem":95,"children":96,"page":24},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","3.integrate\u002Fadapters\u002Fcloud",[97,102,107,112,117,122,127],{"title":98,"path":99,"stem":100,"icon":101},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","3.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":103,"path":104,"stem":105,"icon":106},"OTLP","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fotlp","3.integrate\u002Fadapters\u002Fcloud\u002F02.otlp","i-simple-icons-opentelemetry",{"title":108,"path":109,"stem":110,"icon":111},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","3.integrate\u002Fadapters\u002Fcloud\u002F03.posthog","i-simple-icons-posthog",{"title":113,"path":114,"stem":115,"icon":116},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","3.integrate\u002Fadapters\u002Fcloud\u002F04.sentry","i-simple-icons-sentry",{"title":118,"path":119,"stem":120,"icon":121},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","3.integrate\u002Fadapters\u002Fcloud\u002F05.better-stack","i-simple-icons-betterstack",{"title":123,"path":124,"stem":125,"icon":126},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","3.integrate\u002Fadapters\u002Fcloud\u002F06.datadog","i-simple-icons-datadog",{"title":128,"path":129,"stem":130,"icon":131},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fhyperdx","3.integrate\u002Fadapters\u002Fcloud\u002F07.hyperdx","i-custom-hyperdx",{"title":133,"path":134,"stem":135,"children":136,"page":24},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","3.integrate\u002Fadapters\u002Fself-hosted",[137,142],{"title":138,"path":139,"stem":140,"icon":141},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","3.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":143,"path":144,"stem":145,"icon":146},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","3.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":148,"path":149,"stem":150,"children":151,"page":24},"Frameworks","\u002Fintegrate\u002Fframeworks","3.integrate\u002Fframeworks",[152,156,161,166,171,176,181,186,191,196,201,206,211,216,220,225],{"title":31,"path":153,"stem":154,"icon":155},"\u002Fintegrate\u002Fframeworks\u002Foverview","3.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":157,"path":158,"stem":159,"icon":160},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","3.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":162,"path":163,"stem":164,"icon":165},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","3.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":167,"path":168,"stem":169,"icon":170},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","3.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":172,"path":173,"stem":174,"icon":175},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","3.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":177,"path":178,"stem":179,"icon":180},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","3.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":182,"path":183,"stem":184,"icon":185},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","3.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":187,"path":188,"stem":189,"icon":190},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","3.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":192,"path":193,"stem":194,"icon":195},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","3.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":197,"path":198,"stem":199,"icon":200},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","3.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":202,"path":203,"stem":204,"icon":205},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","3.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":207,"path":208,"stem":209,"icon":210},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","3.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":212,"path":213,"stem":214,"icon":215},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","3.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":217,"path":218,"stem":219,"icon":69},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","3.integrate\u002Fframeworks\u002F13.standalone",{"title":221,"path":222,"stem":223,"icon":224},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","3.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":226,"path":227,"stem":228,"icon":229},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","3.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":231,"path":232,"stem":233,"children":234,"page":24},"Use Cases","\u002Fuse-cases","4.use-cases",[235,239,244,273,301,333],{"title":31,"path":236,"stem":237,"icon":238},"\u002Fuse-cases\u002Foverview","4.use-cases\u002F0.overview","i-lucide-list-checks",{"title":240,"path":241,"stem":242,"icon":243},"Client Logging","\u002Fuse-cases\u002Fclient-logging","4.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":245,"icon":246,"path":247,"stem":248,"children":249,"page":24},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","4.use-cases\u002F2.ai-sdk",[250,253,258,263,268],{"title":31,"path":251,"stem":252,"icon":34},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","4.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":254,"path":255,"stem":256,"icon":257},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","4.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":259,"path":260,"stem":261,"icon":262},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","4.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":264,"path":265,"stem":266,"icon":267},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","4.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":269,"path":270,"stem":271,"icon":272},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","4.use-cases\u002F2.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":274,"icon":275,"path":276,"stem":277,"children":278,"page":24},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","4.use-cases\u002F3.better-auth",[279,282,287,292,296],{"title":31,"path":280,"stem":281,"icon":34},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","4.use-cases\u002F3.better-auth\u002F01.overview",{"title":283,"path":284,"stem":285,"icon":286},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","4.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":288,"path":289,"stem":290,"icon":291},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","4.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":293,"path":294,"stem":295,"icon":243},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","4.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":297,"path":298,"stem":299,"icon":300},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","4.use-cases\u002F3.better-auth\u002F05.performance","i-lucide-gauge",{"title":302,"icon":303,"path":304,"stem":305,"children":306,"page":24},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","4.use-cases\u002F4.audit",[307,310,315,320,325,329],{"title":31,"path":308,"stem":309,"icon":34},"\u002Fuse-cases\u002Faudit\u002Foverview","4.use-cases\u002F4.audit\u002F01.overview",{"title":311,"path":312,"stem":313,"icon":314},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","4.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":316,"path":317,"stem":318,"icon":319},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","4.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":321,"path":322,"stem":323,"icon":324},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","4.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":326,"path":327,"stem":328,"icon":303},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","4.use-cases\u002F4.audit\u002F05.compliance",{"title":330,"path":331,"stem":332,"icon":74},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","4.use-cases\u002F4.audit\u002F06.recipes",{"title":334,"path":335,"stem":336,"icon":337},"Enrichers","\u002Fuse-cases\u002Fenrichers","4.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":339,"path":340,"stem":341,"children":342,"page":24},"Extend","\u002Fextend","5.extend",[343,347,352,357,362,366,370,374,378,383,388],{"title":31,"path":344,"stem":345,"icon":346},"\u002Fextend\u002Foverview","5.extend\u002F0.overview","i-lucide-blocks",{"title":348,"path":349,"stem":350,"icon":351},"Stream","\u002Fextend\u002Fstream","5.extend\u002F1.stream","i-lucide-radio-tower",{"title":353,"path":354,"stem":355,"icon":356},"Custom framework","\u002Fextend\u002Fcustom-framework","5.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":358,"path":359,"stem":360,"icon":361},"FS reader","\u002Fextend\u002Ffs-reader","5.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":330,"path":363,"stem":364,"icon":365},"\u002Fextend\u002Fconsumer-recipes","5.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":367,"path":368,"stem":369,"icon":346},"Plugins","\u002Fextend\u002Fplugins","5.extend\u002F4.plugins",{"title":371,"path":372,"stem":373,"icon":337},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","5.extend\u002F5.custom-enrichers",{"title":375,"path":376,"stem":377,"icon":59},"Tail sampling","\u002Fextend\u002Ftail-sampling","5.extend\u002F6.tail-sampling",{"title":379,"path":380,"stem":381,"icon":382},"Identity headers","\u002Fextend\u002Fidentity-headers","5.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":384,"path":385,"stem":386,"icon":387},"Custom drains","\u002Fextend\u002Fcustom-drains","5.extend\u002F8.custom-drains","i-lucide-share-2",{"title":389,"path":390,"stem":391,"icon":392},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","5.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":394,"path":395,"stem":396,"children":397,"page":24},"Reference","\u002Freference","6.reference",[398,403,406,411,415,420],{"title":399,"path":400,"stem":401,"icon":402},"Configuration","\u002Freference\u002Fconfiguration","6.reference\u002F1.configuration","i-lucide-settings",{"title":297,"path":404,"stem":405,"icon":300},"\u002Freference\u002Fperformance","6.reference\u002F2.performance",{"title":407,"path":408,"stem":409,"icon":410},"Vite Plugin","\u002Freference\u002Fvite-plugin","6.reference\u002F3.vite-plugin","i-custom-vite",{"title":412,"path":413,"stem":414,"icon":303},"Best Practices","\u002Freference\u002Fbest-practices","6.reference\u002F4.best-practices",{"title":416,"path":417,"stem":418,"icon":419},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","6.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":421,"path":422,"stem":423,"icon":337},"Agent Skills","\u002Freference\u002Fagent-skills","6.reference\u002F6.agent-skills",{"id":425,"title":426,"body":427,"description":1714,"extension":1715,"links":1716,"meta":1724,"navigation":1725,"path":144,"seo":1726,"stem":145,"__hash__":1727},"docs\u002F3.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub.md","NuxtHub Storage",{"type":428,"value":429,"toc":1696},"minimark",[430,438,485,490,493,520,525,529,609,616,639,643,649,763,776,779,809,824,828,836,846,851,861,1080,1097,1101,1104,1122,1129,1133,1141,1244,1248,1253,1256,1261,1343,1346,1409,1413,1420,1490,1499,1503,1506,1519,1526,1555,1558,1562,1573,1658,1664,1668,1675,1679,1692],[431,432,433,437],"p",{},[434,435,436],"code",{},"@evlog\u002Fnuxthub"," stores your evlog wide events directly in your NuxtHub database. No external logging service needed. Your logs live next to your data, with automatic cleanup based on a retention policy.",[439,440,443,446,471],"prompt",{":actions":441,"description":442,"icon":146},"[\"copy\",\"cursor\",\"windsurf\"]","Store evlog wide events in NuxtHub",[431,444,445],{},"Store evlog wide events in my NuxtHub database (self-hosted log retention).",[447,448,449,453,456,459,462,465,468],"ul",{},[450,451,452],"li",{},"Install both modules: pnpm add @nuxthub\u002Fcore @evlog\u002Fnuxthub",[450,454,455],{},"Add @nuxthub\u002Fcore and @evlog\u002Fnuxthub to nuxt.config.ts modules (in that order)",[450,457,458],{},"Enable hub.database = true in nuxt.config.ts",[450,460,461],{},"Configure evlog.nuxthub: { retentionDays, batchSize, ... } for retention and batching",[450,463,464],{},"Run database migrations so the wide-events table is created",[450,466,467],{},"Confirm wide events are written to my NuxtHub database after triggering a request",[450,469,470],{},"For production at scale, combine with an external drain (Axiom \u002F OTLP) for long-term storage",[431,472,473,474,480,481],{},"Docs: ",[475,476,477],"a",{"href":477,"rel":478},"https:\u002F\u002Fwww.evlog.dev\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub",[479],"nofollow","\nNuxtHub: ",[475,482,483],{"href":483,"rel":484},"https:\u002F\u002Fhub.nuxt.com",[479],[486,487,489],"h2",{"id":488},"why-self-hosted-logs","Why Self-Hosted Logs?",[431,491,492],{},"External logging services (Axiom, Datadog, etc.) are great for production at scale. But sometimes you want:",[447,494,495,502,508,514],{},[450,496,497,501],{},[498,499,500],"strong",{},"Zero external dependencies"," - logs stored in the same database as your app",[450,503,504,507],{},[498,505,506],{},"Full data ownership"," - no third-party access to your log data",[450,509,510,513],{},[498,511,512],{},"Free tier friendly"," - no per-event pricing, just your existing database",[450,515,516,519],{},[498,517,518],{},"Development & staging"," - full log visibility without paying for a service",[431,521,522,524],{},[434,523,436],{}," works as a drop-in drain. Your existing evlog setup stays the same, you just get a database-backed storage layer on top.",[486,526,528],{"id":527},"install","Install",[530,531,532,560,576,592],"code-group",{},[533,534,540],"pre",{"className":535,"code":536,"filename":537,"language":538,"meta":539,"style":539},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm add @nuxthub\u002Fcore @evlog\u002Fnuxthub\n","pnpm","bash","",[434,541,542],{"__ignoreMap":539},[543,544,547,550,554,557],"span",{"class":545,"line":546},"line",1,[543,548,537],{"class":549},"sBMFI",[543,551,553],{"class":552},"sfazB"," add",[543,555,556],{"class":552}," @nuxthub\u002Fcore",[543,558,559],{"class":552}," @evlog\u002Fnuxthub\n",[533,561,564],{"className":535,"code":562,"filename":563,"language":538,"meta":539,"style":539},"bun add @nuxthub\u002Fcore @evlog\u002Fnuxthub\n","bun",[434,565,566],{"__ignoreMap":539},[543,567,568,570,572,574],{"class":545,"line":546},[543,569,563],{"class":549},[543,571,553],{"class":552},[543,573,556],{"class":552},[543,575,559],{"class":552},[533,577,580],{"className":535,"code":578,"filename":579,"language":538,"meta":539,"style":539},"yarn add @nuxthub\u002Fcore @evlog\u002Fnuxthub\n","yarn",[434,581,582],{"__ignoreMap":539},[543,583,584,586,588,590],{"class":545,"line":546},[543,585,579],{"class":549},[543,587,553],{"class":552},[543,589,556],{"class":552},[543,591,559],{"class":552},[533,593,596],{"className":535,"code":594,"filename":595,"language":538,"meta":539,"style":539},"npm install @nuxthub\u002Fcore @evlog\u002Fnuxthub\n","npm",[434,597,598],{"__ignoreMap":539},[543,599,600,602,605,607],{"class":545,"line":546},[543,601,595],{"class":549},[543,603,604],{"class":552}," install",[543,606,556],{"class":552},[543,608,559],{"class":552},[431,610,611,612,615],{},"Or with ",[434,613,614],{},"nuxi",":",[533,617,620],{"className":535,"code":618,"filename":619,"language":538,"meta":539,"style":539},"npx nuxi module add @nuxthub\u002Fcore @evlog\u002Fnuxthub\n","Terminal",[434,621,622],{"__ignoreMap":539},[543,623,624,627,630,633,635,637],{"class":545,"line":546},[543,625,626],{"class":549},"npx",[543,628,629],{"class":552}," nuxi",[543,631,632],{"class":552}," module",[543,634,553],{"class":552},[543,636,556],{"class":552},[543,638,559],{"class":552},[486,640,642],{"id":641},"setup","Setup",[431,644,645,646,615],{},"Add the module to your ",[434,647,648],{},"nuxt.config.ts",[533,650,654],{"className":651,"code":652,"filename":648,"language":653,"meta":539,"style":539},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineNuxtConfig({\n  modules: ['@nuxthub\u002Fcore', '@evlog\u002Fnuxthub'],\n\n  evlog: {\n    retention: '7d',\n  },\n})\n","typescript",[434,655,656,677,713,720,731,748,754],{"__ignoreMap":539},[543,657,658,662,665,669,673],{"class":545,"line":546},[543,659,661],{"class":660},"s7zQu","export",[543,663,664],{"class":660}," default",[543,666,668],{"class":667},"s2Zo4"," defineNuxtConfig",[543,670,672],{"class":671},"sTEyZ","(",[543,674,676],{"class":675},"sMK4o","{\n",[543,678,680,684,686,689,692,695,697,700,703,705,707,710],{"class":545,"line":679},2,[543,681,683],{"class":682},"swJcz","  modules",[543,685,615],{"class":675},[543,687,688],{"class":671}," [",[543,690,691],{"class":675},"'",[543,693,694],{"class":552},"@nuxthub\u002Fcore",[543,696,691],{"class":675},[543,698,699],{"class":675},",",[543,701,702],{"class":675}," '",[543,704,436],{"class":552},[543,706,691],{"class":675},[543,708,709],{"class":671},"]",[543,711,712],{"class":675},",\n",[543,714,716],{"class":545,"line":715},3,[543,717,719],{"emptyLinePlaceholder":718},true,"\n",[543,721,723,726,728],{"class":545,"line":722},4,[543,724,725],{"class":682},"  evlog",[543,727,615],{"class":675},[543,729,730],{"class":675}," {\n",[543,732,734,737,739,741,744,746],{"class":545,"line":733},5,[543,735,736],{"class":682},"    retention",[543,738,615],{"class":675},[543,740,702],{"class":675},[543,742,743],{"class":552},"7d",[543,745,691],{"class":675},[543,747,712],{"class":675},[543,749,751],{"class":545,"line":750},6,[543,752,753],{"class":675},"  },\n",[543,755,757,760],{"class":545,"line":756},7,[543,758,759],{"class":675},"}",[543,761,762],{"class":671},")\n",[431,764,765,766,768,769,771,772,775],{},"Even if ",[434,767,436],{}," can auto-register missing modules, we recommend explicitly installing ",[434,770,694],{}," and registering it in ",[434,773,774],{},"modules"," for a clearer and more predictable setup.",[431,777,778],{},"That's it. The module automatically:",[780,781,782,792,799,806],"ol",{},[450,783,784,785,788,789,791],{},"Installs ",[434,786,787],{},"evlog\u002Fnuxt"," and ",[434,790,694],{}," if not already registered",[450,793,794,795,798],{},"Registers the ",[434,796,797],{},"evlog_events"," database schema with NuxtHub",[450,800,801,802,805],{},"Hooks into ",[434,803,804],{},"evlog:drain"," to store every event in the database",[450,807,808],{},"Schedules a cleanup task based on your retention policy",[810,811,813,816,817,820,821,823],"callout",{"color":812,"icon":13},"info",[498,814,815],{},"Prerequisites:"," Your project must use ",[475,818,143],{"href":483,"rel":819},[479]," with a database configured. ",[434,822,436],{}," uses Drizzle ORM to interact with the database.",[486,825,827],{"id":826},"how-it-works","How It Works",[533,829,834],{"className":830,"code":832,"language":833},[831],"language-text","Request → evlog wide event → evlog:drain hook → INSERT into evlog_events table\n                                                          ↓\n                          Cron task (automatic) → DELETE events older than retention\n","text",[434,835,832],{"__ignoreMap":539},[431,837,838,839,841,842,845],{},"Every wide event emitted by evlog is stored as a row in the ",[434,840,797],{}," table. The drain plugin handles both single events and batches (when used with the ",[475,843,844],{"href":390},"pipeline",").",[847,848,850],"h3",{"id":849},"database-schema","Database Schema",[431,852,853,854,856,857,860],{},"The ",[434,855,797],{}," table stores indexed columns for fast querying and a ",[434,858,859],{},"data"," JSON column for all remaining fields:",[862,863,864,880],"table",{},[865,866,867],"thead",{},[868,869,870,874,877],"tr",{},[871,872,873],"th",{},"Column",[871,875,876],{},"Type",[871,878,879],{},"Description",[881,882,883,898,912,926,940,954,968,982,997,1011,1025,1039,1053,1066],"tbody",{},[868,884,885,891,895],{},[886,887,888],"td",{},[434,889,890],{},"id",[886,892,893],{},[434,894,833],{},[886,896,897],{},"UUID primary key",[868,899,900,905,909],{},[886,901,902],{},[434,903,904],{},"timestamp",[886,906,907],{},[434,908,833],{},[886,910,911],{},"Event timestamp",[868,913,914,919,923],{},[886,915,916],{},[434,917,918],{},"level",[886,920,921],{},[434,922,833],{},[886,924,925],{},"Log level (info, warn, error, debug)",[868,927,928,933,937],{},[886,929,930],{},[434,931,932],{},"service",[886,934,935],{},[434,936,833],{},[886,938,939],{},"Service name",[868,941,942,947,951],{},[886,943,944],{},[434,945,946],{},"environment",[886,948,949],{},[434,950,833],{},[886,952,953],{},"Environment (production, staging, etc.)",[868,955,956,961,965],{},[886,957,958],{},[434,959,960],{},"method",[886,962,963],{},[434,964,833],{},[886,966,967],{},"HTTP method",[868,969,970,975,979],{},[886,971,972],{},[434,973,974],{},"path",[886,976,977],{},[434,978,833],{},[886,980,981],{},"Request path",[868,983,984,989,994],{},[886,985,986],{},[434,987,988],{},"status",[886,990,991],{},[434,992,993],{},"integer",[886,995,996],{},"HTTP status code",[868,998,999,1004,1008],{},[886,1000,1001],{},[434,1002,1003],{},"duration_ms",[886,1005,1006],{},[434,1007,993],{},[886,1009,1010],{},"Request duration in milliseconds",[868,1012,1013,1018,1022],{},[886,1014,1015],{},[434,1016,1017],{},"request_id",[886,1019,1020],{},[434,1021,833],{},[886,1023,1024],{},"Request correlation ID",[868,1026,1027,1032,1036],{},[886,1028,1029],{},[434,1030,1031],{},"source",[886,1033,1034],{},[434,1035,833],{},[886,1037,1038],{},"Event source (server, client)",[868,1040,1041,1046,1050],{},[886,1042,1043],{},[434,1044,1045],{},"error",[886,1047,1048],{},[434,1049,833],{},[886,1051,1052],{},"Error details (JSON string)",[868,1054,1055,1059,1063],{},[886,1056,1057],{},[434,1058,859],{},[886,1060,1061],{},[434,1062,833],{},[886,1064,1065],{},"All remaining event fields (JSON)",[868,1067,1068,1073,1077],{},[886,1069,1070],{},[434,1071,1072],{},"created_at",[886,1074,1075],{},[434,1076,833],{},[886,1078,1079],{},"Row insertion timestamp",[431,1081,1082,1083,1085,1086,1085,1088,1085,1090,1085,1092,1085,1094,1096],{},"Indexed columns: ",[434,1084,904],{},", ",[434,1087,918],{},[434,1089,932],{},[434,1091,988],{},[434,1093,1017],{},[434,1095,1072],{},".",[847,1098,1100],{"id":1099},"dialect-support","Dialect Support",[431,1102,1103],{},"The schema is automatically registered for your NuxtHub database dialect:",[447,1105,1106,1112,1117],{},[450,1107,1108,1111],{},[498,1109,1110],{},"SQLite"," (default for Cloudflare D1)",[450,1113,1114],{},[498,1115,1116],{},"MySQL",[450,1118,1119],{},[498,1120,1121],{},"PostgreSQL",[431,1123,1124,1125,1128],{},"The correct schema is selected via the ",[434,1126,1127],{},"hub:db:schema:extend"," hook based on your NuxtHub configuration.",[486,1130,1132],{"id":1131},"combining-with-external-adapters","Combining with External Adapters",[431,1134,1135,1137,1138,1140],{},[434,1136,436],{}," doesn't replace external adapters, you can use both. The module registers its own ",[434,1139,804],{}," hook, so any other drain plugins you have will still work:",[533,1142,1145],{"className":651,"code":1143,"filename":1144,"language":653,"meta":539,"style":539},"import { createAxiomDrain } from 'evlog\u002Faxiom'\n\nexport default defineNitroPlugin((nitroApp) => {\n  \u002F\u002F This runs alongside @evlog\u002Fnuxthub's built-in drain\n  nitroApp.hooks.hook('evlog:drain', createAxiomDrain())\n})\n","server\u002Fplugins\u002Fevlog-drain.ts",[434,1146,1147,1172,1176,1202,1208,1238],{"__ignoreMap":539},[543,1148,1149,1152,1155,1158,1161,1164,1166,1169],{"class":545,"line":546},[543,1150,1151],{"class":660},"import",[543,1153,1154],{"class":675}," {",[543,1156,1157],{"class":671}," createAxiomDrain",[543,1159,1160],{"class":675}," }",[543,1162,1163],{"class":660}," from",[543,1165,702],{"class":675},[543,1167,1168],{"class":552},"evlog\u002Faxiom",[543,1170,1171],{"class":675},"'\n",[543,1173,1174],{"class":545,"line":679},[543,1175,719],{"emptyLinePlaceholder":718},[543,1177,1178,1180,1182,1185,1187,1189,1193,1196,1200],{"class":545,"line":715},[543,1179,661],{"class":660},[543,1181,664],{"class":660},[543,1183,1184],{"class":667}," defineNitroPlugin",[543,1186,672],{"class":671},[543,1188,672],{"class":675},[543,1190,1192],{"class":1191},"sHdIc","nitroApp",[543,1194,1195],{"class":675},")",[543,1197,1199],{"class":1198},"spNyl"," =>",[543,1201,730],{"class":675},[543,1203,1204],{"class":545,"line":722},[543,1205,1207],{"class":1206},"sHwdD","  \u002F\u002F This runs alongside @evlog\u002Fnuxthub's built-in drain\n",[543,1209,1210,1213,1215,1218,1220,1223,1225,1227,1229,1231,1233,1235],{"class":545,"line":733},[543,1211,1212],{"class":671},"  nitroApp",[543,1214,1096],{"class":675},[543,1216,1217],{"class":671},"hooks",[543,1219,1096],{"class":675},[543,1221,1222],{"class":667},"hook",[543,1224,672],{"class":682},[543,1226,691],{"class":675},[543,1228,804],{"class":552},[543,1230,691],{"class":675},[543,1232,699],{"class":675},[543,1234,1157],{"class":667},[543,1236,1237],{"class":682},"())\n",[543,1239,1240,1242],{"class":545,"line":750},[543,1241,759],{"class":675},[543,1243,762],{"class":671},[486,1245,1247],{"id":1246},"retention","Retention",[431,1249,1250,1252],{},[434,1251,436],{}," automatically deletes old events based on your retention policy. No manual cleanup needed.",[847,1254,399],{"id":1255},"configuration",[431,1257,1258,1259,615],{},"Set the retention period in your ",[434,1260,648],{},[533,1262,1264],{"className":651,"code":1263,"filename":648,"language":653,"meta":539,"style":539},"export default defineNuxtConfig({\n  modules: ['@nuxthub\u002Fcore', '@evlog\u002Fnuxthub'],\n\n  evlog: {\n    retention: '7d', \u002F\u002F default\n  },\n})\n",[434,1265,1266,1278,1304,1308,1316,1333,1337],{"__ignoreMap":539},[543,1267,1268,1270,1272,1274,1276],{"class":545,"line":546},[543,1269,661],{"class":660},[543,1271,664],{"class":660},[543,1273,668],{"class":667},[543,1275,672],{"class":671},[543,1277,676],{"class":675},[543,1279,1280,1282,1284,1286,1288,1290,1292,1294,1296,1298,1300,1302],{"class":545,"line":679},[543,1281,683],{"class":682},[543,1283,615],{"class":675},[543,1285,688],{"class":671},[543,1287,691],{"class":675},[543,1289,694],{"class":552},[543,1291,691],{"class":675},[543,1293,699],{"class":675},[543,1295,702],{"class":675},[543,1297,436],{"class":552},[543,1299,691],{"class":675},[543,1301,709],{"class":671},[543,1303,712],{"class":675},[543,1305,1306],{"class":545,"line":715},[543,1307,719],{"emptyLinePlaceholder":718},[543,1309,1310,1312,1314],{"class":545,"line":722},[543,1311,725],{"class":682},[543,1313,615],{"class":675},[543,1315,730],{"class":675},[543,1317,1318,1320,1322,1324,1326,1328,1330],{"class":545,"line":733},[543,1319,736],{"class":682},[543,1321,615],{"class":675},[543,1323,702],{"class":675},[543,1325,743],{"class":552},[543,1327,691],{"class":675},[543,1329,699],{"class":675},[543,1331,1332],{"class":1206}," \u002F\u002F default\n",[543,1334,1335],{"class":545,"line":750},[543,1336,753],{"class":675},[543,1338,1339,1341],{"class":545,"line":756},[543,1340,759],{"class":675},[543,1342,762],{"class":671},[431,1344,1345],{},"The retention value is a number followed by a unit:",[862,1347,1348,1360],{},[865,1349,1350],{},[868,1351,1352,1355,1357],{},[871,1353,1354],{},"Unit",[871,1356,879],{},[871,1358,1359],{},"Example",[881,1361,1362,1377,1393],{},[868,1363,1364,1369,1372],{},[886,1365,1366],{},[434,1367,1368],{},"d",[886,1370,1371],{},"Days",[886,1373,1374,1376],{},[434,1375,743],{}," = 7 days",[868,1378,1379,1384,1387],{},[886,1380,1381],{},[434,1382,1383],{},"h",[886,1385,1386],{},"Hours",[886,1388,1389,1392],{},[434,1390,1391],{},"24h"," = 24 hours",[868,1394,1395,1400,1403],{},[886,1396,1397],{},[434,1398,1399],{},"m",[886,1401,1402],{},"Minutes",[886,1404,1405,1408],{},[434,1406,1407],{},"60m"," = 60 minutes",[847,1410,1412],{"id":1411},"how-cleanup-works","How Cleanup Works",[431,1414,1415,1416,1419],{},"The module registers a Nitro scheduled task (",[434,1417,1418],{},"evlog:cleanup",") that runs on a cron schedule derived from your retention value. The cron frequency is set to roughly half the retention period:",[862,1421,1422,1433],{},[865,1423,1424],{},[868,1425,1426,1428,1431],{},[871,1427,1247],{},[871,1429,1430],{},"Cron Schedule",[871,1432,879],{},[881,1434,1435,1449,1463,1477],{},[868,1436,1437,1441,1446],{},[886,1438,1439],{},[434,1440,1407],{},[886,1442,1443],{},[434,1444,1445],{},"*\u002F30 * * * *",[886,1447,1448],{},"Every 30 minutes",[868,1450,1451,1455,1460],{},[886,1452,1453],{},[434,1454,1391],{},[886,1456,1457],{},[434,1458,1459],{},"0 *\u002F12 * * *",[886,1461,1462],{},"Every 12 hours",[868,1464,1465,1469,1474],{},[886,1466,1467],{},[434,1468,743],{},[886,1470,1471],{},[434,1472,1473],{},"0 3 * * *",[886,1475,1476],{},"Daily at 3:00 AM",[868,1478,1479,1484,1488],{},[886,1480,1481],{},[434,1482,1483],{},"30d",[886,1485,1486],{},[434,1487,1473],{},[886,1489,1476],{},[431,1491,1492,1493,1495,1496,1498],{},"The cleanup task deletes all rows in ",[434,1494,797],{}," where ",[434,1497,1072],{}," is older than the retention period.",[847,1500,1502],{"id":1501},"manual-cleanup","Manual Cleanup",[431,1504,1505],{},"You can trigger cleanup manually via the API endpoint:",[533,1507,1509],{"className":535,"code":1508,"filename":619,"language":538,"meta":539,"style":539},"curl https:\u002F\u002Fyour-app.com\u002Fapi\u002F_cron\u002Fevlog-cleanup\n",[434,1510,1511],{"__ignoreMap":539},[543,1512,1513,1516],{"class":545,"line":546},[543,1514,1515],{"class":549},"curl",[543,1517,1518],{"class":552}," https:\u002F\u002Fyour-app.com\u002Fapi\u002F_cron\u002Fevlog-cleanup\n",[431,1520,1521,1522,1525],{},"If the ",[434,1523,1524],{},"CRON_SECRET"," environment variable is set, the endpoint requires a Bearer token:",[533,1527,1529],{"className":535,"code":1528,"filename":619,"language":538,"meta":539,"style":539},"curl -H \"Authorization: Bearer your-secret\" \\\n  https:\u002F\u002Fyour-app.com\u002Fapi\u002F_cron\u002Fevlog-cleanup\n",[434,1530,1531,1550],{"__ignoreMap":539},[543,1532,1533,1535,1538,1541,1544,1547],{"class":545,"line":546},[543,1534,1515],{"class":549},[543,1536,1537],{"class":552}," -H",[543,1539,1540],{"class":675}," \"",[543,1542,1543],{"class":552},"Authorization: Bearer your-secret",[543,1545,1546],{"class":675},"\"",[543,1548,1549],{"class":671}," \\\n",[543,1551,1552],{"class":545,"line":679},[543,1553,1554],{"class":552},"  https:\u002F\u002Fyour-app.com\u002Fapi\u002F_cron\u002Fevlog-cleanup\n",[431,1556,1557],{},"This is recommended for production deployments to prevent unauthorized cleanup triggers.",[847,1559,1561],{"id":1560},"vercel-cron","Vercel Cron",[431,1563,1564,1565,1568,1569,1572],{},"When installing the module with ",[434,1566,1567],{},"nuxi module add",", you'll be prompted to create a ",[434,1570,1571],{},"vercel.json"," with the appropriate cron schedule:",[533,1574,1578],{"className":1575,"code":1576,"filename":1571,"language":1577,"meta":539,"style":539},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"crons\": [\n    {\n      \"path\": \"\u002Fapi\u002F_cron\u002Fevlog-cleanup\",\n      \"schedule\": \"0 3 * * *\"\n    }\n  ]\n}\n","json",[434,1579,1580,1584,1599,1604,1624,1642,1647,1652],{"__ignoreMap":539},[543,1581,1582],{"class":545,"line":546},[543,1583,676],{"class":675},[543,1585,1586,1589,1592,1594,1596],{"class":545,"line":679},[543,1587,1588],{"class":675},"  \"",[543,1590,1591],{"class":1198},"crons",[543,1593,1546],{"class":675},[543,1595,615],{"class":675},[543,1597,1598],{"class":675}," [\n",[543,1600,1601],{"class":545,"line":715},[543,1602,1603],{"class":675},"    {\n",[543,1605,1606,1609,1611,1613,1615,1617,1620,1622],{"class":545,"line":722},[543,1607,1608],{"class":675},"      \"",[543,1610,974],{"class":549},[543,1612,1546],{"class":675},[543,1614,615],{"class":675},[543,1616,1540],{"class":675},[543,1618,1619],{"class":552},"\u002Fapi\u002F_cron\u002Fevlog-cleanup",[543,1621,1546],{"class":675},[543,1623,712],{"class":675},[543,1625,1626,1628,1631,1633,1635,1637,1639],{"class":545,"line":733},[543,1627,1608],{"class":675},[543,1629,1630],{"class":549},"schedule",[543,1632,1546],{"class":675},[543,1634,615],{"class":675},[543,1636,1540],{"class":675},[543,1638,1473],{"class":552},[543,1640,1641],{"class":675},"\"\n",[543,1643,1644],{"class":545,"line":750},[543,1645,1646],{"class":675},"    }\n",[543,1648,1649],{"class":545,"line":756},[543,1650,1651],{"class":675},"  ]\n",[543,1653,1655],{"class":545,"line":1654},8,[543,1656,1657],{"class":675},"}\n",[431,1659,1660,1661,1663],{},"On Vercel, the ",[434,1662,1524],{}," environment variable is automatically set and validated.",[847,1665,1667],{"id":1666},"cloudflare-other-platforms","Cloudflare & Other Platforms",[431,1669,1670,1671,1674],{},"On Cloudflare Workers and other platforms, the Nitro scheduled task handles cleanup automatically without any additional cron configuration. The task is registered with ",[434,1672,1673],{},"experimental.tasks"," enabled in the Nitro config.",[486,1676,1678],{"id":1677},"next-steps","Next Steps",[447,1680,1681,1686],{},[450,1682,1683,1685],{},[475,1684,85],{"href":90}," - Send logs to external services alongside NuxtHub storage",[450,1687,1688,1691],{},[475,1689,1690],{"href":390},"Pipeline"," - Batch events for better database performance",[1693,1694,1695],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":539,"searchDepth":679,"depth":679,"links":1697},[1698,1699,1700,1701,1705,1706,1713],{"id":488,"depth":679,"text":489},{"id":527,"depth":679,"text":528},{"id":641,"depth":679,"text":642},{"id":826,"depth":679,"text":827,"children":1702},[1703,1704],{"id":849,"depth":715,"text":850},{"id":1099,"depth":715,"text":1100},{"id":1131,"depth":679,"text":1132},{"id":1246,"depth":679,"text":1247,"children":1707},[1708,1709,1710,1711,1712],{"id":1255,"depth":715,"text":399},{"id":1411,"depth":715,"text":1412},{"id":1501,"depth":715,"text":1502},{"id":1560,"depth":715,"text":1561},{"id":1666,"depth":715,"text":1667},{"id":1677,"depth":679,"text":1678},"Self-hosted log retention for evlog using NuxtHub database storage. Store, query, and automatically clean up your structured logs with zero external dependencies.","md",[1717,1722],{"label":143,"icon":1718,"to":483,"target":1719,"color":1720,"variant":1721},"i-lucide-external-link","_blank","neutral","subtle",{"label":85,"icon":1723,"to":90,"color":1720,"variant":1721},"i-custom-plug",{},{"title":143,"icon":146},{"title":426,"description":1714},"9sxOXALGeQm61SRYSySS6wz7MuiYr2OMecfAcHNq_G0",[1729,1731],{"title":138,"path":139,"stem":140,"description":1730,"icon":141,"children":-1},"Write wide events to the local file system as NDJSON for local debugging, AI agent integration, and production backup.",{"title":31,"path":153,"stem":154,"description":1732,"icon":155,"children":-1},"evlog supports every major TypeScript framework. Choose your stack and get started in minutes.",1778361909954]