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