[{"data":1,"prerenderedAt":1013},["ShallowReactive",2],{"navigation_docs":3,"-nuxthub-overview":191,"-nuxthub-overview-surround":1008},[4,30,65,115,132,146],{"title":5,"path":6,"stem":7,"children":8,"page":29},"Getting Started","/getting-started","1.getting-started",[9,14,19,24],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","/getting-started/introduction","1.getting-started/1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Installation","/getting-started/installation","1.getting-started/2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Quick Start","/getting-started/quick-start","1.getting-started/3.quick-start","i-lucide-zap",{"title":25,"path":26,"stem":27,"icon":28},"Agent Skills","/getting-started/agent-skills","1.getting-started/4.agent-skills","i-lucide-sparkles",false,{"title":31,"path":32,"stem":33,"children":34,"page":29},"Core Concepts","/core-concepts","2.core-concepts",[35,40,45,50,55,60],{"title":36,"path":37,"stem":38,"icon":39},"Wide Events","/core-concepts/wide-events","2.core-concepts/1.wide-events","i-lucide-layers",{"title":41,"path":42,"stem":43,"icon":44},"Structured Errors","/core-concepts/structured-errors","2.core-concepts/2.structured-errors","i-lucide-shield-alert",{"title":46,"path":47,"stem":48,"icon":49},"Best Practices","/core-concepts/best-practices","2.core-concepts/3.best-practices","i-lucide-shield-check",{"title":51,"path":52,"stem":53,"icon":54},"Typed Fields","/core-concepts/typed-fields","2.core-concepts/4.typed-fields","i-simple-icons-typescript",{"title":56,"path":57,"stem":58,"icon":59},"Sampling","/core-concepts/sampling","2.core-concepts/5.sampling","i-lucide-filter",{"title":61,"path":62,"stem":63,"icon":64},"Client Logging","/core-concepts/client-logging","2.core-concepts/6.client-logging","i-lucide-monitor",{"title":66,"path":67,"stem":68,"children":69,"page":29},"Adapters","/adapters","3.adapters",[70,75,80,85,90,95,100,105,110],{"title":71,"path":72,"stem":73,"icon":74},"Overview","/adapters/overview","3.adapters/1.overview","i-custom-plug",{"title":76,"path":77,"stem":78,"icon":79},"Axiom","/adapters/axiom","3.adapters/2.axiom","i-custom-axiom",{"title":81,"path":82,"stem":83,"icon":84},"OTLP","/adapters/otlp","3.adapters/3.otlp","i-simple-icons-opentelemetry",{"title":86,"path":87,"stem":88,"icon":89},"PostHog","/adapters/posthog","3.adapters/4.posthog","i-simple-icons-posthog",{"title":91,"path":92,"stem":93,"icon":94},"Sentry","/adapters/sentry","3.adapters/5.sentry","i-simple-icons-sentry",{"title":96,"path":97,"stem":98,"icon":99},"Better Stack","/adapters/better-stack","3.adapters/6.better-stack","i-simple-icons-betterstack",{"title":101,"path":102,"stem":103,"icon":104},"Custom Adapters","/adapters/custom","3.adapters/7.custom","i-lucide-code",{"title":106,"path":107,"stem":108,"icon":109},"Pipeline","/adapters/pipeline","3.adapters/8.pipeline","i-lucide-workflow",{"title":111,"path":112,"stem":113,"icon":114},"Browser","/adapters/browser","3.adapters/9.browser","i-lucide-globe",{"title":116,"path":117,"stem":118,"children":119,"page":29},"Enrichers","/enrichers","4.enrichers",[120,123,128],{"title":71,"path":121,"stem":122,"icon":28},"/enrichers/overview","4.enrichers/1.overview",{"title":124,"path":125,"stem":126,"icon":127},"Built-in","/enrichers/built-in","4.enrichers/2.built-in","i-lucide-puzzle",{"title":129,"path":130,"stem":131,"icon":104},"Custom","/enrichers/custom","4.enrichers/3.custom",{"title":133,"path":134,"stem":135,"children":136,"page":29},"NuxtHub","/nuxthub","5.nuxthub",[137,141],{"title":71,"path":138,"stem":139,"icon":140},"/nuxthub/overview","5.nuxthub/1.overview","i-lucide-database",{"title":142,"path":143,"stem":144,"icon":145},"Retention","/nuxthub/retention","5.nuxthub/2.retention","i-lucide-clock",{"title":147,"path":148,"stem":149,"children":150,"page":29},"Examples","/examples","6.examples",[151,156,161,166,171,176,181,186],{"title":152,"path":153,"stem":154,"icon":155},"Next.js","/examples/nextjs","6.examples/1.nextjs","i-simple-icons-nextdotjs",{"title":157,"path":158,"stem":159,"icon":160},"SvelteKit","/examples/sveltekit","6.examples/2.sveltekit","i-simple-icons-svelte",{"title":162,"path":163,"stem":164,"icon":165},"TanStack Start","/examples/tanstack-start","6.examples/3.tanstack-start","i-custom-tanstack",{"title":167,"path":168,"stem":169,"icon":170},"NestJS","/examples/nestjs","6.examples/4.nestjs","i-simple-icons-nestjs",{"title":172,"path":173,"stem":174,"icon":175},"Express","/examples/express","6.examples/5.express","i-simple-icons-express",{"title":177,"path":178,"stem":179,"icon":180},"Hono","/examples/hono","6.examples/6.hono","i-simple-icons-hono",{"title":182,"path":183,"stem":184,"icon":185},"Fastify","/examples/fastify","6.examples/7.fastify","i-simple-icons-fastify",{"title":187,"path":188,"stem":189,"icon":190},"Elysia","/examples/elysia","6.examples/8.elysia","i-custom-elysia",{"id":192,"title":193,"body":194,"description":995,"extension":996,"links":997,"meta":1004,"navigation":1005,"path":138,"seo":1006,"stem":139,"__hash__":1007},"docs/5.nuxthub/1.overview.md","NuxtHub Storage",{"type":195,"value":196,"toc":984},"minimark",[197,205,210,213,242,247,251,331,338,360,364,370,484,497,500,530,548,552,560,570,575,585,804,821,825,828,846,853,857,865,968,972,980],[198,199,200,204],"p",{},[201,202,203],"code",{},"@evlog/nuxthub"," 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.",[206,207,209],"h2",{"id":208},"why-self-hosted-logs","Why Self-Hosted Logs?",[198,211,212],{},"External logging services (Axiom, Datadog, etc.) are great for production at scale. But sometimes you want:",[214,215,216,224,230,236],"ul",{},[217,218,219,223],"li",{},[220,221,222],"strong",{},"Zero external dependencies"," — logs stored in the same database as your app",[217,225,226,229],{},[220,227,228],{},"Full data ownership"," — no third-party access to your log data",[217,231,232,235],{},[220,233,234],{},"Free tier friendly"," — no per-event pricing, just your existing database",[217,237,238,241],{},[220,239,240],{},"Development & staging"," — full log visibility without paying for a service",[198,243,244,246],{},[201,245,203],{}," works as a drop-in drain. Your existing evlog setup stays the same — you just get a database-backed storage layer on top.",[206,248,250],{"id":249},"install","Install",[252,253,254,282,299,315],"code-group",{},[255,256,262],"pre",{"className":257,"code":258,"filename":259,"language":260,"meta":261,"style":261},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm add @nuxthub/core @evlog/nuxthub\n","pnpm","bash","",[201,263,264],{"__ignoreMap":261},[265,266,269,272,276,279],"span",{"class":267,"line":268},"line",1,[265,270,259],{"class":271},"sBMFI",[265,273,275],{"class":274},"sfazB"," add",[265,277,278],{"class":274}," @nuxthub/core",[265,280,281],{"class":274}," @evlog/nuxthub\n",[255,283,286],{"className":257,"code":284,"filename":285,"language":260,"meta":261,"style":261},"npm install @nuxthub/core @evlog/nuxthub\n","npm",[201,287,288],{"__ignoreMap":261},[265,289,290,292,295,297],{"class":267,"line":268},[265,291,285],{"class":271},[265,293,294],{"class":274}," install",[265,296,278],{"class":274},[265,298,281],{"class":274},[255,300,303],{"className":257,"code":301,"filename":302,"language":260,"meta":261,"style":261},"yarn add @nuxthub/core @evlog/nuxthub\n","yarn",[201,304,305],{"__ignoreMap":261},[265,306,307,309,311,313],{"class":267,"line":268},[265,308,302],{"class":271},[265,310,275],{"class":274},[265,312,278],{"class":274},[265,314,281],{"class":274},[255,316,319],{"className":257,"code":317,"filename":318,"language":260,"meta":261,"style":261},"bun add @nuxthub/core @evlog/nuxthub\n","bun",[201,320,321],{"__ignoreMap":261},[265,322,323,325,327,329],{"class":267,"line":268},[265,324,318],{"class":271},[265,326,275],{"class":274},[265,328,278],{"class":274},[265,330,281],{"class":274},[198,332,333,334,337],{},"Or with ",[201,335,336],{},"nuxi",":",[255,339,341],{"className":257,"code":340,"language":260,"meta":261,"style":261},"npx nuxi module add @nuxthub/core @evlog/nuxthub\n",[201,342,343],{"__ignoreMap":261},[265,344,345,348,351,354,356,358],{"class":267,"line":268},[265,346,347],{"class":271},"npx",[265,349,350],{"class":274}," nuxi",[265,352,353],{"class":274}," module",[265,355,275],{"class":274},[265,357,278],{"class":274},[265,359,281],{"class":274},[206,361,363],{"id":362},"setup","Setup",[198,365,366,367,337],{},"Add the module to your ",[201,368,369],{},"nuxt.config.ts",[255,371,375],{"className":372,"code":373,"filename":369,"language":374,"meta":261,"style":261},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineNuxtConfig({\n  modules: ['@nuxthub/core', '@evlog/nuxthub'],\n\n  evlog: {\n    retention: '7d',\n  },\n})\n","typescript",[201,376,377,398,434,441,452,469,475],{"__ignoreMap":261},[265,378,379,383,386,390,394],{"class":267,"line":268},[265,380,382],{"class":381},"s7zQu","export",[265,384,385],{"class":381}," default",[265,387,389],{"class":388},"s2Zo4"," defineNuxtConfig",[265,391,393],{"class":392},"sTEyZ","(",[265,395,397],{"class":396},"sMK4o","{\n",[265,399,401,405,407,410,413,416,418,421,424,426,428,431],{"class":267,"line":400},2,[265,402,404],{"class":403},"swJcz","  modules",[265,406,337],{"class":396},[265,408,409],{"class":392}," [",[265,411,412],{"class":396},"'",[265,414,415],{"class":274},"@nuxthub/core",[265,417,412],{"class":396},[265,419,420],{"class":396},",",[265,422,423],{"class":396}," '",[265,425,203],{"class":274},[265,427,412],{"class":396},[265,429,430],{"class":392},"]",[265,432,433],{"class":396},",\n",[265,435,437],{"class":267,"line":436},3,[265,438,440],{"emptyLinePlaceholder":439},true,"\n",[265,442,444,447,449],{"class":267,"line":443},4,[265,445,446],{"class":403},"  evlog",[265,448,337],{"class":396},[265,450,451],{"class":396}," {\n",[265,453,455,458,460,462,465,467],{"class":267,"line":454},5,[265,456,457],{"class":403},"    retention",[265,459,337],{"class":396},[265,461,423],{"class":396},[265,463,464],{"class":274},"7d",[265,466,412],{"class":396},[265,468,433],{"class":396},[265,470,472],{"class":267,"line":471},6,[265,473,474],{"class":396},"  },\n",[265,476,478,481],{"class":267,"line":477},7,[265,479,480],{"class":396},"}",[265,482,483],{"class":392},")\n",[198,485,486,487,489,490,492,493,496],{},"Even if ",[201,488,203],{}," can auto-register missing modules, we recommend explicitly installing ",[201,491,415],{}," and registering it in ",[201,494,495],{},"modules"," for a clearer and more predictable setup.",[198,498,499],{},"That's it. The module automatically:",[501,502,503,513,520,527],"ol",{},[217,504,505,506,509,510,512],{},"Installs ",[201,507,508],{},"evlog/nuxt"," and ",[201,511,415],{}," if not already registered",[217,514,515,516,519],{},"Registers the ",[201,517,518],{},"evlog_events"," database schema with NuxtHub",[217,521,522,523,526],{},"Hooks into ",[201,524,525],{},"evlog:drain"," to store every event in the database",[217,528,529],{},"Schedules a cleanup task based on your retention policy",[531,532,534,537,538,544,545,547],"callout",{"color":533,"icon":13},"info",[220,535,536],{},"Prerequisites:"," Your project must use ",[539,540,133],"a",{"href":541,"rel":542},"https://hub.nuxt.com",[543],"nofollow"," with a database configured. ",[201,546,203],{}," uses Drizzle ORM to interact with the database.",[206,549,551],{"id":550},"how-it-works","How It Works",[255,553,558],{"className":554,"code":556,"language":557},[555],"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",[201,559,556],{"__ignoreMap":261},[198,561,562,563,565,566,569],{},"Every wide event emitted by evlog is stored as a row in the ",[201,564,518],{}," table. The drain plugin handles both single events and batches (when used with the ",[539,567,568],{"href":107},"pipeline",").",[571,572,574],"h3",{"id":573},"database-schema","Database Schema",[198,576,577,578,580,581,584],{},"The ",[201,579,518],{}," table stores indexed columns for fast querying and a ",[201,582,583],{},"data"," JSON column for all remaining fields:",[586,587,588,604],"table",{},[589,590,591],"thead",{},[592,593,594,598,601],"tr",{},[595,596,597],"th",{},"Column",[595,599,600],{},"Type",[595,602,603],{},"Description",[605,606,607,622,636,650,664,678,692,706,721,735,749,763,777,790],"tbody",{},[592,608,609,615,619],{},[610,611,612],"td",{},[201,613,614],{},"id",[610,616,617],{},[201,618,557],{},[610,620,621],{},"UUID primary key",[592,623,624,629,633],{},[610,625,626],{},[201,627,628],{},"timestamp",[610,630,631],{},[201,632,557],{},[610,634,635],{},"Event timestamp",[592,637,638,643,647],{},[610,639,640],{},[201,641,642],{},"level",[610,644,645],{},[201,646,557],{},[610,648,649],{},"Log level (info, warn, error, debug)",[592,651,652,657,661],{},[610,653,654],{},[201,655,656],{},"service",[610,658,659],{},[201,660,557],{},[610,662,663],{},"Service name",[592,665,666,671,675],{},[610,667,668],{},[201,669,670],{},"environment",[610,672,673],{},[201,674,557],{},[610,676,677],{},"Environment (production, staging, etc.)",[592,679,680,685,689],{},[610,681,682],{},[201,683,684],{},"method",[610,686,687],{},[201,688,557],{},[610,690,691],{},"HTTP method",[592,693,694,699,703],{},[610,695,696],{},[201,697,698],{},"path",[610,700,701],{},[201,702,557],{},[610,704,705],{},"Request path",[592,707,708,713,718],{},[610,709,710],{},[201,711,712],{},"status",[610,714,715],{},[201,716,717],{},"integer",[610,719,720],{},"HTTP status code",[592,722,723,728,732],{},[610,724,725],{},[201,726,727],{},"duration_ms",[610,729,730],{},[201,731,717],{},[610,733,734],{},"Request duration in milliseconds",[592,736,737,742,746],{},[610,738,739],{},[201,740,741],{},"request_id",[610,743,744],{},[201,745,557],{},[610,747,748],{},"Request correlation ID",[592,750,751,756,760],{},[610,752,753],{},[201,754,755],{},"source",[610,757,758],{},[201,759,557],{},[610,761,762],{},"Event source (server, client)",[592,764,765,770,774],{},[610,766,767],{},[201,768,769],{},"error",[610,771,772],{},[201,773,557],{},[610,775,776],{},"Error details (JSON string)",[592,778,779,783,787],{},[610,780,781],{},[201,782,583],{},[610,784,785],{},[201,786,557],{},[610,788,789],{},"All remaining event fields (JSON)",[592,791,792,797,801],{},[610,793,794],{},[201,795,796],{},"created_at",[610,798,799],{},[201,800,557],{},[610,802,803],{},"Row insertion timestamp",[198,805,806,807,809,810,809,812,809,814,809,816,809,818,820],{},"Indexed columns: ",[201,808,628],{},", ",[201,811,642],{},[201,813,656],{},[201,815,712],{},[201,817,741],{},[201,819,796],{},".",[571,822,824],{"id":823},"dialect-support","Dialect Support",[198,826,827],{},"The schema is automatically registered for your NuxtHub database dialect:",[214,829,830,836,841],{},[217,831,832,835],{},[220,833,834],{},"SQLite"," (default for Cloudflare D1)",[217,837,838],{},[220,839,840],{},"MySQL",[217,842,843],{},[220,844,845],{},"PostgreSQL",[198,847,848,849,852],{},"The correct schema is selected via the ",[201,850,851],{},"hub:db:schema:extend"," hook based on your NuxtHub configuration.",[206,854,856],{"id":855},"combining-with-external-adapters","Combining with External Adapters",[198,858,859,861,862,864],{},[201,860,203],{}," doesn't replace external adapters — you can use both. The module registers its own ",[201,863,525],{}," hook, so any other drain plugins you have will still work:",[255,866,869],{"className":372,"code":867,"filename":868,"language":374,"meta":261,"style":261},"import { createAxiomDrain } from 'evlog/axiom'\n\nexport default defineNitroPlugin((nitroApp) => {\n  // This runs alongside @evlog/nuxthub's built-in drain\n  nitroApp.hooks.hook('evlog:drain', createAxiomDrain())\n})\n","server/plugins/evlog-drain.ts",[201,870,871,896,900,926,932,962],{"__ignoreMap":261},[265,872,873,876,879,882,885,888,890,893],{"class":267,"line":268},[265,874,875],{"class":381},"import",[265,877,878],{"class":396}," {",[265,880,881],{"class":392}," createAxiomDrain",[265,883,884],{"class":396}," }",[265,886,887],{"class":381}," from",[265,889,423],{"class":396},[265,891,892],{"class":274},"evlog/axiom",[265,894,895],{"class":396},"'\n",[265,897,898],{"class":267,"line":400},[265,899,440],{"emptyLinePlaceholder":439},[265,901,902,904,906,909,911,913,917,920,924],{"class":267,"line":436},[265,903,382],{"class":381},[265,905,385],{"class":381},[265,907,908],{"class":388}," defineNitroPlugin",[265,910,393],{"class":392},[265,912,393],{"class":396},[265,914,916],{"class":915},"sHdIc","nitroApp",[265,918,919],{"class":396},")",[265,921,923],{"class":922},"spNyl"," =>",[265,925,451],{"class":396},[265,927,928],{"class":267,"line":443},[265,929,931],{"class":930},"sHwdD","  // This runs alongside @evlog/nuxthub's built-in drain\n",[265,933,934,937,939,942,944,947,949,951,953,955,957,959],{"class":267,"line":454},[265,935,936],{"class":392},"  nitroApp",[265,938,820],{"class":396},[265,940,941],{"class":392},"hooks",[265,943,820],{"class":396},[265,945,946],{"class":388},"hook",[265,948,393],{"class":403},[265,950,412],{"class":396},[265,952,525],{"class":274},[265,954,412],{"class":396},[265,956,420],{"class":396},[265,958,881],{"class":388},[265,960,961],{"class":403},"())\n",[265,963,964,966],{"class":267,"line":471},[265,965,480],{"class":396},[265,967,483],{"class":392},[206,969,971],{"id":970},"next-steps","Next Steps",[214,973,974],{},[217,975,976,979],{},[539,977,978],{"href":143},"Retention & Cleanup"," — Configure retention policy and cleanup scheduling",[981,982,983],"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":261,"searchDepth":400,"depth":400,"links":985},[986,987,988,989,993,994],{"id":208,"depth":400,"text":209},{"id":249,"depth":400,"text":250},{"id":362,"depth":400,"text":363},{"id":550,"depth":400,"text":551,"children":990},[991,992],{"id":573,"depth":436,"text":574},{"id":823,"depth":436,"text":824},{"id":855,"depth":400,"text":856},{"id":970,"depth":400,"text":971},"Self-hosted log retention for evlog using NuxtHub database storage. Store, query, and automatically clean up your structured logs with zero external dependencies.","md",[998,1003],{"label":133,"icon":999,"to":541,"target":1000,"color":1001,"variant":1002},"i-lucide-external-link","_blank","neutral","subtle",{"label":66,"icon":74,"to":72,"color":1001,"variant":1002},{},{"title":71,"icon":140},{"title":193,"description":995},"F5e3TvYQeqA50ikCUEtSClNVaxTBoTDzLW2Svq_BEQs",[1009,1011],{"title":129,"path":130,"stem":131,"description":1010,"icon":104,"children":-1},"Write custom enrichers to add derived context to your wide events. Add deployment metadata, tenant IDs, feature flags, or any computed data.",{"title":142,"path":143,"stem":144,"description":1012,"icon":145,"children":-1},"Configure how long logs are kept in NuxtHub and how they are automatically cleaned up with scheduled tasks, cron jobs, and retention policies.",1772901888269]