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