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