[{"data":1,"prerenderedAt":4360},["ShallowReactive",2],{"navigation_docs":3,"-build-on-top-consumer-recipes":454,"-build-on-top-consumer-recipes-surround":4355},[4,35,159,201,289,352,438],{"title":5,"path":6,"stem":7,"children":8,"page":34},"Getting Started","\u002Fgetting-started","1.getting-started",[9,14,19,24,29],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Quick Start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start","i-lucide-zap",{"title":25,"path":26,"stem":27,"icon":28},"Agent Skills","\u002Fgetting-started\u002Fagent-skills","1.getting-started\u002F4.agent-skills","i-lucide-sparkles",{"title":30,"path":31,"stem":32,"icon":33},"vs Other Loggers","\u002Fgetting-started\u002Fvs-other-loggers","1.getting-started\u002F5.vs-other-loggers","i-lucide-scale",false,{"title":36,"path":37,"stem":38,"children":39,"page":34},"Logging","\u002Flogging","2.logging",[40,45,50,55,60,65,70,99,127],{"title":41,"path":42,"stem":43,"icon":44},"Overview","\u002Flogging\u002Foverview","2.logging\u002F0.overview","i-lucide-list",{"title":46,"path":47,"stem":48,"icon":49},"Simple Logging","\u002Flogging\u002Fsimple-logging","2.logging\u002F1.simple-logging","i-lucide-terminal",{"title":51,"path":52,"stem":53,"icon":54},"Wide Events","\u002Flogging\u002Fwide-events","2.logging\u002F2.wide-events","i-lucide-layers",{"title":56,"path":57,"stem":58,"icon":59},"Structured Errors","\u002Flogging\u002Fstructured-errors","2.logging\u002F3.structured-errors","i-lucide-shield-alert",{"title":61,"path":62,"stem":63,"icon":64},"Catalogs","\u002Flogging\u002Fcatalogs","2.logging\u002F4.catalogs","i-lucide-book-open",{"title":66,"path":67,"stem":68,"icon":69},"Client Logging","\u002Flogging\u002Fclient-logging","2.logging\u002F5.client-logging","i-lucide-monitor",{"title":71,"icon":72,"path":73,"stem":74,"children":75,"page":34},"AI SDK","i-simple-icons-vercel","\u002Flogging\u002Fai-sdk","2.logging\u002F6.ai-sdk",[76,79,84,89,94],{"title":41,"path":77,"stem":78,"icon":44},"\u002Flogging\u002Fai-sdk\u002Foverview","2.logging\u002F6.ai-sdk\u002F01.overview",{"title":80,"path":81,"stem":82,"icon":83},"Usage","\u002Flogging\u002Fai-sdk\u002Fusage","2.logging\u002F6.ai-sdk\u002F02.usage","i-lucide-code",{"title":85,"path":86,"stem":87,"icon":88},"Options","\u002Flogging\u002Fai-sdk\u002Foptions","2.logging\u002F6.ai-sdk\u002F03.options","i-lucide-sliders",{"title":90,"path":91,"stem":92,"icon":93},"Metadata","\u002Flogging\u002Fai-sdk\u002Fmetadata","2.logging\u002F6.ai-sdk\u002F04.metadata","i-lucide-database",{"title":95,"path":96,"stem":97,"icon":98},"Telemetry","\u002Flogging\u002Fai-sdk\u002Ftelemetry","2.logging\u002F6.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":100,"icon":101,"path":102,"stem":103,"children":104,"page":34},"Better Auth","i-simple-icons-betterauth","\u002Flogging\u002Fbetter-auth","2.logging\u002F7.better-auth",[105,108,113,118,122],{"title":41,"path":106,"stem":107,"icon":44},"\u002Flogging\u002Fbetter-auth\u002Foverview","2.logging\u002F7.better-auth\u002F01.overview",{"title":109,"path":110,"stem":111,"icon":112},"Identify User","\u002Flogging\u002Fbetter-auth\u002Fidentify-user","2.logging\u002F7.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":114,"path":115,"stem":116,"icon":117},"Middleware","\u002Flogging\u002Fbetter-auth\u002Fmiddleware","2.logging\u002F7.better-auth\u002F03.middleware","i-lucide-shield",{"title":119,"path":120,"stem":121,"icon":69},"Client Sync","\u002Flogging\u002Fbetter-auth\u002Fclient-sync","2.logging\u002F7.better-auth\u002F04.client-sync",{"title":123,"path":124,"stem":125,"icon":126},"Performance","\u002Flogging\u002Fbetter-auth\u002Fperformance","2.logging\u002F7.better-auth\u002F05.performance","i-lucide-gauge",{"title":128,"icon":129,"path":130,"stem":131,"children":132,"page":34},"Audit Logs","i-lucide-shield-check","\u002Flogging\u002Faudit","2.logging\u002F8.audit",[133,136,141,146,151,155],{"title":41,"path":134,"stem":135,"icon":44},"\u002Flogging\u002Faudit\u002Foverview","2.logging\u002F8.audit\u002F01.overview",{"title":137,"path":138,"stem":139,"icon":140},"Schema","\u002Flogging\u002Faudit\u002Fschema","2.logging\u002F8.audit\u002F02.schema","i-lucide-file-text",{"title":142,"path":143,"stem":144,"icon":145},"Recording","\u002Flogging\u002Faudit\u002Frecording","2.logging\u002F8.audit\u002F03.recording","i-lucide-pen-line",{"title":147,"path":148,"stem":149,"icon":150},"Drains","\u002Flogging\u002Faudit\u002Fpipeline","2.logging\u002F8.audit\u002F04.pipeline","i-lucide-link",{"title":152,"path":153,"stem":154,"icon":129},"Compliance","\u002Flogging\u002Faudit\u002Fcompliance","2.logging\u002F8.audit\u002F05.compliance",{"title":156,"path":157,"stem":158,"icon":64},"Recipes","\u002Flogging\u002Faudit\u002Frecipes","2.logging\u002F8.audit\u002F06.recipes",{"title":160,"path":161,"stem":162,"children":163,"page":34},"Core Concepts","\u002Fcore-concepts","3.core-concepts",[164,169,174,179,184,188,191,196],{"title":165,"path":166,"stem":167,"icon":168},"Lifecycle","\u002Fcore-concepts\u002Flifecycle","3.core-concepts\u002F0.lifecycle","i-lucide-arrow-right-left",{"title":170,"path":171,"stem":172,"icon":173},"Configuration","\u002Fcore-concepts\u002Fconfiguration","3.core-concepts\u002F1.configuration","i-lucide-settings",{"title":175,"path":176,"stem":177,"icon":178},"Sampling","\u002Fcore-concepts\u002Fsampling","3.core-concepts\u002F2.sampling","i-lucide-filter",{"title":180,"path":181,"stem":182,"icon":183},"Typed Fields","\u002Fcore-concepts\u002Ftyped-fields","3.core-concepts\u002F3.typed-fields","i-simple-icons-typescript",{"title":185,"path":186,"stem":187,"icon":129},"Best Practices","\u002Fcore-concepts\u002Fbest-practices","3.core-concepts\u002F4.best-practices",{"title":123,"path":189,"stem":190,"icon":126},"\u002Fcore-concepts\u002Fperformance","3.core-concepts\u002F5.performance",{"title":192,"path":193,"stem":194,"icon":195},"Vite Plugin","\u002Fcore-concepts\u002Fvite-plugin","3.core-concepts\u002F6.vite-plugin","i-custom-vite",{"title":197,"path":198,"stem":199,"icon":200},"Auto-Redaction","\u002Fcore-concepts\u002Fredaction","3.core-concepts\u002F7.redaction","i-lucide-eye-off",{"title":202,"path":203,"stem":204,"children":205,"page":34},"Frameworks","\u002Fframeworks","4.frameworks",[206,210,215,220,225,230,235,240,245,250,255,260,265,270,274,279,284],{"title":41,"path":207,"stem":208,"icon":209},"\u002Fframeworks\u002Foverview","4.frameworks\u002F00.overview","i-lucide-layout-grid",{"title":211,"path":212,"stem":213,"icon":214},"Nuxt","\u002Fframeworks\u002Fnuxt","4.frameworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":216,"path":217,"stem":218,"icon":219},"Next.js","\u002Fframeworks\u002Fnextjs","4.frameworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":221,"path":222,"stem":223,"icon":224},"SvelteKit","\u002Fframeworks\u002Fsveltekit","4.frameworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":226,"path":227,"stem":228,"icon":229},"Nitro","\u002Fframeworks\u002Fnitro","4.frameworks\u002F04.nitro","i-custom-nitro",{"title":231,"path":232,"stem":233,"icon":234},"TanStack Start","\u002Fframeworks\u002Ftanstack-start","4.frameworks\u002F05.tanstack-start","i-custom-tanstack",{"title":236,"path":237,"stem":238,"icon":239},"NestJS","\u002Fframeworks\u002Fnestjs","4.frameworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":241,"path":242,"stem":243,"icon":244},"Express","\u002Fframeworks\u002Fexpress","4.frameworks\u002F07.express","i-simple-icons-express",{"title":246,"path":247,"stem":248,"icon":249},"Hono","\u002Fframeworks\u002Fhono","4.frameworks\u002F08.hono","i-simple-icons-hono",{"title":251,"path":252,"stem":253,"icon":254},"Fastify","\u002Fframeworks\u002Ffastify","4.frameworks\u002F09.fastify","i-simple-icons-fastify",{"title":256,"path":257,"stem":258,"icon":259},"Elysia","\u002Fframeworks\u002Felysia","4.frameworks\u002F10.elysia","i-custom-elysia",{"title":261,"path":262,"stem":263,"icon":264},"React Router","\u002Fframeworks\u002Freact-router","4.frameworks\u002F11.react-router","i-custom-reactrouter",{"title":266,"path":267,"stem":268,"icon":269},"Cloudflare Workers","\u002Fframeworks\u002Fcloudflare-workers","4.frameworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":271,"path":272,"stem":273,"icon":183},"Standalone","\u002Fframeworks\u002Fstandalone","4.frameworks\u002F13.standalone",{"title":275,"path":276,"stem":277,"icon":278},"Astro","\u002Fframeworks\u002Fastro","4.frameworks\u002F14.astro","i-simple-icons-astro",{"title":280,"path":281,"stem":282,"icon":283},"AWS Lambda","\u002Fframeworks\u002Faws-lambda","4.frameworks\u002F16.aws-lambda","i-custom-lambda",{"title":285,"path":286,"stem":287,"icon":288},"Custom Integration","\u002Fframeworks\u002Fcustom-integration","4.frameworks\u002F17.custom-integration","i-lucide-puzzle",{"title":290,"path":291,"stem":292,"children":293,"page":34},"Build on top","\u002Fbuild-on-top","5.build-on-top",[294,297,302,307,312,316,321,326,330,334,338,342,347],{"title":41,"path":295,"stem":296,"icon":54},"\u002Fbuild-on-top\u002Foverview","5.build-on-top\u002F0.overview",{"title":298,"path":299,"stem":300,"icon":301},"In-process stream","\u002Fbuild-on-top\u002Fin-process-stream","5.build-on-top\u002F1.in-process-stream","i-lucide-radio-tower",{"title":303,"path":304,"stem":305,"icon":306},"Fanout","\u002Fbuild-on-top\u002Ffanout-and-multi-drain","5.build-on-top\u002F10.fanout-and-multi-drain","i-lucide-share-2",{"title":308,"path":309,"stem":310,"icon":311},"Identity headers","\u002Fbuild-on-top\u002Fidentity-headers","5.build-on-top\u002F11.identity-headers","i-lucide-fingerprint",{"title":313,"path":314,"stem":315,"icon":288},"Custom framework","\u002Fbuild-on-top\u002Fcustom-framework","5.build-on-top\u002F12.custom-framework",{"title":317,"path":318,"stem":319,"icon":320},"Stream server","\u002Fbuild-on-top\u002Fstream-server","5.build-on-top\u002F2.stream-server","i-lucide-radio",{"title":322,"path":323,"stem":324,"icon":325},"FS reader","\u002Fbuild-on-top\u002Ffs-reader","5.build-on-top\u002F3.fs-reader","i-lucide-folder-search",{"title":156,"path":327,"stem":328,"icon":329},"\u002Fbuild-on-top\u002Fconsumer-recipes","5.build-on-top\u002F4.consumer-recipes","i-lucide-chef-hat",{"title":331,"path":332,"stem":333,"icon":288},"Plugins","\u002Fbuild-on-top\u002Fplugins","5.build-on-top\u002F5.plugins",{"title":335,"path":336,"stem":337,"icon":28},"Custom enrichers","\u002Fbuild-on-top\u002Fcustom-enrichers","5.build-on-top\u002F6.custom-enrichers",{"title":339,"path":340,"stem":341,"icon":178},"Tail sampling","\u002Fbuild-on-top\u002Ftail-sampling","5.build-on-top\u002F7.tail-sampling",{"title":343,"path":344,"stem":345,"icon":346},"Custom drains","\u002Fbuild-on-top\u002Fcustom-drains","5.build-on-top\u002F8.custom-drains","i-lucide-code-2",{"title":348,"path":349,"stem":350,"icon":351},"Drain pipeline","\u002Fbuild-on-top\u002Fdrain-pipeline","5.build-on-top\u002F9.drain-pipeline","i-lucide-workflow",{"title":353,"path":354,"stem":355,"children":356,"page":34},"Adapters","\u002Fadapters","6.adapters",[357,360,400,415],{"title":41,"path":358,"stem":359,"icon":44},"\u002Fadapters\u002Foverview","6.adapters\u002F01.overview",{"title":361,"path":362,"stem":363,"children":364,"page":34},"Cloud destinations","\u002Fadapters\u002Fcloud","6.adapters\u002F02.cloud",[365,370,375,380,385,390,395],{"title":366,"path":367,"stem":368,"icon":369},"Axiom","\u002Fadapters\u002Fcloud\u002Faxiom","6.adapters\u002F02.cloud\u002F01.axiom","i-custom-axiom",{"title":371,"path":372,"stem":373,"icon":374},"OTLP","\u002Fadapters\u002Fcloud\u002Fotlp","6.adapters\u002F02.cloud\u002F02.otlp","i-simple-icons-opentelemetry",{"title":376,"path":377,"stem":378,"icon":379},"PostHog","\u002Fadapters\u002Fcloud\u002Fposthog","6.adapters\u002F02.cloud\u002F03.posthog","i-simple-icons-posthog",{"title":381,"path":382,"stem":383,"icon":384},"Sentry","\u002Fadapters\u002Fcloud\u002Fsentry","6.adapters\u002F02.cloud\u002F04.sentry","i-simple-icons-sentry",{"title":386,"path":387,"stem":388,"icon":389},"Better Stack","\u002Fadapters\u002Fcloud\u002Fbetter-stack","6.adapters\u002F02.cloud\u002F05.better-stack","i-simple-icons-betterstack",{"title":391,"path":392,"stem":393,"icon":394},"Datadog","\u002Fadapters\u002Fcloud\u002Fdatadog","6.adapters\u002F02.cloud\u002F06.datadog","i-simple-icons-datadog",{"title":396,"path":397,"stem":398,"icon":399},"HyperDX","\u002Fadapters\u002Fcloud\u002Fhyperdx","6.adapters\u002F02.cloud\u002F07.hyperdx","i-custom-hyperdx",{"title":401,"path":402,"stem":403,"children":404,"page":34},"Self-hosted","\u002Fadapters\u002Fself-hosted","6.adapters\u002F03.self-hosted",[405,410],{"title":406,"path":407,"stem":408,"icon":409},"File System","\u002Fadapters\u002Fself-hosted\u002Ffs","6.adapters\u002F03.self-hosted\u002F01.fs","i-lucide-hard-drive",{"title":411,"path":412,"stem":413,"icon":414},"NuxtHub","\u002Fadapters\u002Fself-hosted\u002Fnuxthub","6.adapters\u002F03.self-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":416,"path":417,"stem":418,"children":419,"page":34},"Building blocks","\u002Fadapters\u002Fbuilding-blocks","6.adapters\u002F04.building-blocks",[420,424,429,433],{"title":421,"path":422,"stem":423,"icon":351},"Pipeline","\u002Fadapters\u002Fbuilding-blocks\u002Fpipeline","6.adapters\u002F04.building-blocks\u002F01.pipeline",{"title":425,"path":426,"stem":427,"icon":428},"HTTP","\u002Fadapters\u002Fbuilding-blocks\u002Fhttp","6.adapters\u002F04.building-blocks\u002F02.http","i-lucide-globe",{"title":430,"path":431,"stem":432,"icon":83},"Custom Adapters","\u002Fadapters\u002Fbuilding-blocks\u002Fcustom","6.adapters\u002F04.building-blocks\u002F03.custom",{"title":434,"path":435,"stem":436,"icon":437},"Toolkit","\u002Fadapters\u002Fbuilding-blocks\u002Ftoolkit","6.adapters\u002F04.building-blocks\u002F04.toolkit","i-lucide-blocks",{"title":439,"path":440,"stem":441,"children":442,"page":34},"Enrichers","\u002Fenrichers","7.enrichers",[443,446,450],{"title":41,"path":444,"stem":445,"icon":28},"\u002Fenrichers\u002Foverview","7.enrichers\u002F1.overview",{"title":447,"path":448,"stem":449,"icon":288},"Built-in","\u002Fenrichers\u002Fbuilt-in","7.enrichers\u002F2.built-in",{"title":451,"path":452,"stem":453,"icon":83},"Custom","\u002Fenrichers\u002Fcustom","7.enrichers\u002F3.custom",{"id":455,"title":156,"body":456,"description":4348,"extension":4349,"links":4350,"meta":4351,"navigation":4352,"path":327,"seo":4353,"stem":328,"__hash__":4354},"docs\u002F5.build-on-top\u002F4.consumer-recipes.md",{"type":457,"value":458,"toc":4334},"minimark",[459,476,481,494,508,513,520,622,629,690,694,1665,1672,1676,2277,2281,2646,2654,2658,2663,2717,2720,2824,2837,2841,2844,3259,3269,3273,3279,3775,3779,3782,4138,4142,4145,4304,4307,4311,4331],[460,461,462,463,467,468,471,472,475],"p",{},"Real-world patterns that combine the ",[464,465,466],"a",{"href":299},"stream API",", the ",[464,469,470],{"href":318},"stream server",", and the ",[464,473,474],{"href":407},"filesystem reader",".",[477,478,480],"h2",{"id":479},"_1-build-a-minimal-devtool","1. Build a minimal devtool",[460,482,483,484,488,489,493],{},"A live event panel is essentially ",[485,486,487],"code",{},"EventSource"," + a list. Every consumer needs ",[490,491,492],"strong",{},"two"," things:",[495,496,497,501],"ol",{},[498,499,500],"li",{},"The mini stream server's URL (it's on a random port, so discovery first)",[498,502,503,504,507],{},"An SSE connection that decodes ",[485,505,506],{},"{ evlog, type, data }"," envelopes",[509,510,512],"h3",{"id":511},"url-discovery","URL discovery",[460,514,515,516,519],{},"Read ",[485,517,518],{},".evlog\u002Fstream.url"," from the project directory:",[521,522,527],"pre",{"className":523,"code":524,"language":525,"meta":526,"style":526},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { readFile } from 'node:fs\u002Fpromises'\n\nconst url = (await readFile('.evlog\u002Fstream.url', 'utf-8')).trim()\n","ts","",[485,528,529,562,569],{"__ignoreMap":526},[530,531,534,538,542,546,549,552,555,559],"span",{"class":532,"line":533},"line",1,[530,535,537],{"class":536},"s7zQu","import",[530,539,541],{"class":540},"sMK4o"," {",[530,543,545],{"class":544},"sTEyZ"," readFile",[530,547,548],{"class":540}," }",[530,550,551],{"class":536}," from",[530,553,554],{"class":540}," '",[530,556,558],{"class":557},"sfazB","node:fs\u002Fpromises",[530,560,561],{"class":540},"'\n",[530,563,565],{"class":532,"line":564},2,[530,566,568],{"emptyLinePlaceholder":567},true,"\n",[530,570,572,576,579,582,585,588,591,594,597,599,601,604,606,609,611,614,616,619],{"class":532,"line":571},3,[530,573,575],{"class":574},"spNyl","const",[530,577,578],{"class":544}," url ",[530,580,581],{"class":540},"=",[530,583,584],{"class":544}," (",[530,586,587],{"class":536},"await",[530,589,545],{"class":590},"s2Zo4",[530,592,593],{"class":544},"(",[530,595,596],{"class":540},"'",[530,598,518],{"class":557},[530,600,596],{"class":540},[530,602,603],{"class":540},",",[530,605,554],{"class":540},[530,607,608],{"class":557},"utf-8",[530,610,596],{"class":540},[530,612,613],{"class":544},"))",[530,615,475],{"class":540},[530,617,618],{"class":590},"trim",[530,620,621],{"class":544},"()\n",[460,623,624,625,628],{},"Or hit the ",[485,626,627],{},"\u002Fapi\u002F_evlog\u002Fstream-info"," endpoint from a same-origin browser tab in a Nuxt app:",[521,630,632],{"className":523,"code":631,"language":525,"meta":526,"style":526},"const { url } = await fetch('\u002Fapi\u002F_evlog\u002Fstream-info').then(r => r.json())\n",[485,633,634],{"__ignoreMap":526},[530,635,636,638,640,642,645,648,651,654,656,658,660,662,665,667,670,672,676,679,682,684,687],{"class":532,"line":533},[530,637,575],{"class":574},[530,639,541],{"class":540},[530,641,578],{"class":544},[530,643,644],{"class":540},"}",[530,646,647],{"class":540}," =",[530,649,650],{"class":536}," await",[530,652,653],{"class":590}," fetch",[530,655,593],{"class":544},[530,657,596],{"class":540},[530,659,627],{"class":557},[530,661,596],{"class":540},[530,663,664],{"class":544},")",[530,666,475],{"class":540},[530,668,669],{"class":590},"then",[530,671,593],{"class":544},[530,673,675],{"class":674},"sHdIc","r",[530,677,678],{"class":574}," =>",[530,680,681],{"class":544}," r",[530,683,475],{"class":540},[530,685,686],{"class":590},"json",[530,688,689],{"class":544},"())\n",[509,691,693],{"id":692},"vanilla-html-js-drop-into-any-page","Vanilla HTML + JS (drop into any page)",[521,695,699],{"className":696,"code":697,"language":698,"meta":526,"style":526},"language-html shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003C!doctype html>\n\u003Chtml>\n\u003Chead>\n  \u003Cmeta charset=\"utf-8\">\n  \u003Ctitle>evlog mini devtool\u003C\u002Ftitle>\n  \u003Cstyle>\n    body { font: 13px ui-sans-serif, system-ui; margin: 0; padding: 0; }\n    table { width: 100%; border-collapse: collapse; }\n    td, th { padding: 6px 10px; border-bottom: 1px solid #eee; text-align: left; }\n    .lvl-error { color: #ef4444 }\n    .lvl-warn  { color: #f59e0b }\n    .lvl-info  { color: #3b82f6 }\n  \u003C\u002Fstyle>\n\u003C\u002Fhead>\n\u003Cbody>\n  \u003Ctable id=\"t\">\n    \u003Cthead>\u003Ctr>\u003Cth>time\u003C\u002Fth>\u003Cth>level\u003C\u002Fth>\u003Cth>service\u003C\u002Fth>\u003Cth>action\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\n    \u003Ctbody>\u003C\u002Ftbody>\n  \u003C\u002Ftable>\n\n  \u003Cscript>\n    \u002F\u002F Replace with the URL printed at startup, or fetch it from \u002Fapi\u002F_evlog\u002Fstream-info\n    const STREAM_URL = 'http:\u002F\u002F127.0.0.1:51203'\n    const tbody = document.querySelector('#t tbody')\n    const es = new EventSource(STREAM_URL)\n\n    es.onmessage = (e) => {\n      const env = JSON.parse(e.data)\n      if (env.evlog !== '1') return\n      if (env.type !== 'event' && env.type !== 'replay') return\n\n      const w = env.data\n      const tr = document.createElement('tr')\n      tr.innerHTML = `\n        \u003Ctd>${new Date(w.timestamp).toLocaleTimeString()}\u003C\u002Ftd>\n        \u003Ctd class=\"lvl-${w.level}\">${w.level}\u003C\u002Ftd>\n        \u003Ctd>${w.service ?? ''}\u003C\u002Ftd>\n        \u003Ctd>${w.action ?? w.message ?? w.path ?? ''}\u003C\u002Ftd>\n      `\n      tbody.prepend(tr)\n      while (tbody.children.length > 200) tbody.lastElementChild.remove()\n    }\n  \u003C\u002Fscript>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n","html",[485,700,701,716,725,734,757,778,788,841,871,927,952,974,995,1005,1014,1024,1046,1125,1139,1148,1153,1163,1170,1188,1218,1237,1242,1267,1297,1329,1374,1379,1396,1423,1439,1475,1507,1529,1567,1573,1590,1632,1638,1647,1656],{"__ignoreMap":526},[530,702,703,706,710,713],{"class":532,"line":533},[530,704,705],{"class":540},"\u003C!",[530,707,709],{"class":708},"swJcz","doctype",[530,711,712],{"class":574}," html",[530,714,715],{"class":540},">\n",[530,717,718,721,723],{"class":532,"line":564},[530,719,720],{"class":540},"\u003C",[530,722,698],{"class":708},[530,724,715],{"class":540},[530,726,727,729,732],{"class":532,"line":571},[530,728,720],{"class":540},[530,730,731],{"class":708},"head",[530,733,715],{"class":540},[530,735,737,740,743,746,748,751,753,755],{"class":532,"line":736},4,[530,738,739],{"class":540},"  \u003C",[530,741,742],{"class":708},"meta",[530,744,745],{"class":574}," charset",[530,747,581],{"class":540},[530,749,750],{"class":540},"\"",[530,752,608],{"class":557},[530,754,750],{"class":540},[530,756,715],{"class":540},[530,758,760,762,765,768,771,774,776],{"class":532,"line":759},5,[530,761,739],{"class":540},[530,763,764],{"class":708},"title",[530,766,767],{"class":540},">",[530,769,770],{"class":544},"evlog mini devtool",[530,772,773],{"class":540},"\u003C\u002F",[530,775,764],{"class":708},[530,777,715],{"class":540},[530,779,781,783,786],{"class":532,"line":780},6,[530,782,739],{"class":540},[530,784,785],{"class":708},"style",[530,787,715],{"class":540},[530,789,791,795,797,801,804,808,811,813,816,819,822,824,827,829,832,834,836,838],{"class":532,"line":790},7,[530,792,794],{"class":793},"sBMFI","    body",[530,796,541],{"class":540},[530,798,800],{"class":799},"sqsOY"," font",[530,802,803],{"class":540},":",[530,805,807],{"class":806},"sbssI"," 13px",[530,809,810],{"class":544}," ui-sans-serif",[530,812,603],{"class":540},[530,814,815],{"class":544}," system-ui",[530,817,818],{"class":540},";",[530,820,821],{"class":799}," margin",[530,823,803],{"class":540},[530,825,826],{"class":806}," 0",[530,828,818],{"class":540},[530,830,831],{"class":799}," padding",[530,833,803],{"class":540},[530,835,826],{"class":806},[530,837,818],{"class":540},[530,839,840],{"class":540}," }\n",[530,842,844,847,849,852,854,857,859,862,864,867,869],{"class":532,"line":843},8,[530,845,846],{"class":793},"    table",[530,848,541],{"class":540},[530,850,851],{"class":799}," width",[530,853,803],{"class":540},[530,855,856],{"class":806}," 100%",[530,858,818],{"class":540},[530,860,861],{"class":799}," border-collapse",[530,863,803],{"class":540},[530,865,866],{"class":544}," collapse",[530,868,818],{"class":540},[530,870,840],{"class":540},[530,872,874,877,879,882,884,886,888,891,894,896,899,901,904,907,910,913,915,918,920,923,925],{"class":532,"line":873},9,[530,875,876],{"class":793},"    td",[530,878,603],{"class":540},[530,880,881],{"class":793}," th",[530,883,541],{"class":540},[530,885,831],{"class":799},[530,887,803],{"class":540},[530,889,890],{"class":806}," 6px",[530,892,893],{"class":806}," 10px",[530,895,818],{"class":540},[530,897,898],{"class":799}," border-bottom",[530,900,803],{"class":540},[530,902,903],{"class":806}," 1px",[530,905,906],{"class":544}," solid ",[530,908,909],{"class":540},"#",[530,911,912],{"class":544},"eee",[530,914,818],{"class":540},[530,916,917],{"class":799}," text-align",[530,919,803],{"class":540},[530,921,922],{"class":544}," left",[530,924,818],{"class":540},[530,926,840],{"class":540},[530,928,930,933,936,938,941,943,946,949],{"class":532,"line":929},10,[530,931,932],{"class":540},"    .",[530,934,935],{"class":793},"lvl-error",[530,937,541],{"class":540},[530,939,940],{"class":799}," color",[530,942,803],{"class":540},[530,944,945],{"class":540}," #",[530,947,948],{"class":544},"ef4444 ",[530,950,951],{"class":540},"}\n",[530,953,955,957,960,963,965,967,969,972],{"class":532,"line":954},11,[530,956,932],{"class":540},[530,958,959],{"class":793},"lvl-warn",[530,961,962],{"class":540},"  {",[530,964,940],{"class":799},[530,966,803],{"class":540},[530,968,945],{"class":540},[530,970,971],{"class":544},"f59e0b ",[530,973,951],{"class":540},[530,975,977,979,982,984,986,988,990,993],{"class":532,"line":976},12,[530,978,932],{"class":540},[530,980,981],{"class":793},"lvl-info",[530,983,962],{"class":540},[530,985,940],{"class":799},[530,987,803],{"class":540},[530,989,945],{"class":540},[530,991,992],{"class":544},"3b82f6 ",[530,994,951],{"class":540},[530,996,998,1001,1003],{"class":532,"line":997},13,[530,999,1000],{"class":540},"  \u003C\u002F",[530,1002,785],{"class":708},[530,1004,715],{"class":540},[530,1006,1008,1010,1012],{"class":532,"line":1007},14,[530,1009,773],{"class":540},[530,1011,731],{"class":708},[530,1013,715],{"class":540},[530,1015,1017,1019,1022],{"class":532,"line":1016},15,[530,1018,720],{"class":540},[530,1020,1021],{"class":708},"body",[530,1023,715],{"class":540},[530,1025,1027,1029,1032,1035,1037,1039,1042,1044],{"class":532,"line":1026},16,[530,1028,739],{"class":540},[530,1030,1031],{"class":708},"table",[530,1033,1034],{"class":574}," id",[530,1036,581],{"class":540},[530,1038,750],{"class":540},[530,1040,1041],{"class":557},"t",[530,1043,750],{"class":540},[530,1045,715],{"class":540},[530,1047,1049,1052,1055,1058,1061,1063,1066,1068,1071,1073,1075,1077,1079,1081,1084,1086,1088,1090,1092,1094,1097,1099,1101,1103,1105,1107,1110,1112,1114,1117,1119,1121,1123],{"class":532,"line":1048},17,[530,1050,1051],{"class":540},"    \u003C",[530,1053,1054],{"class":708},"thead",[530,1056,1057],{"class":540},">\u003C",[530,1059,1060],{"class":708},"tr",[530,1062,1057],{"class":540},[530,1064,1065],{"class":708},"th",[530,1067,767],{"class":540},[530,1069,1070],{"class":544},"time",[530,1072,773],{"class":540},[530,1074,1065],{"class":708},[530,1076,1057],{"class":540},[530,1078,1065],{"class":708},[530,1080,767],{"class":540},[530,1082,1083],{"class":544},"level",[530,1085,773],{"class":540},[530,1087,1065],{"class":708},[530,1089,1057],{"class":540},[530,1091,1065],{"class":708},[530,1093,767],{"class":540},[530,1095,1096],{"class":544},"service",[530,1098,773],{"class":540},[530,1100,1065],{"class":708},[530,1102,1057],{"class":540},[530,1104,1065],{"class":708},[530,1106,767],{"class":540},[530,1108,1109],{"class":544},"action",[530,1111,773],{"class":540},[530,1113,1065],{"class":708},[530,1115,1116],{"class":540},">\u003C\u002F",[530,1118,1060],{"class":708},[530,1120,1116],{"class":540},[530,1122,1054],{"class":708},[530,1124,715],{"class":540},[530,1126,1128,1130,1133,1135,1137],{"class":532,"line":1127},18,[530,1129,1051],{"class":540},[530,1131,1132],{"class":708},"tbody",[530,1134,1116],{"class":540},[530,1136,1132],{"class":708},[530,1138,715],{"class":540},[530,1140,1142,1144,1146],{"class":532,"line":1141},19,[530,1143,1000],{"class":540},[530,1145,1031],{"class":708},[530,1147,715],{"class":540},[530,1149,1151],{"class":532,"line":1150},20,[530,1152,568],{"emptyLinePlaceholder":567},[530,1154,1156,1158,1161],{"class":532,"line":1155},21,[530,1157,739],{"class":540},[530,1159,1160],{"class":708},"script",[530,1162,715],{"class":540},[530,1164,1166],{"class":532,"line":1165},22,[530,1167,1169],{"class":1168},"sHwdD","    \u002F\u002F Replace with the URL printed at startup, or fetch it from \u002Fapi\u002F_evlog\u002Fstream-info\n",[530,1171,1173,1176,1179,1181,1183,1186],{"class":532,"line":1172},23,[530,1174,1175],{"class":574},"    const",[530,1177,1178],{"class":544}," STREAM_URL ",[530,1180,581],{"class":540},[530,1182,554],{"class":540},[530,1184,1185],{"class":557},"http:\u002F\u002F127.0.0.1:51203",[530,1187,561],{"class":540},[530,1189,1191,1193,1196,1198,1201,1203,1206,1208,1210,1213,1215],{"class":532,"line":1190},24,[530,1192,1175],{"class":574},[530,1194,1195],{"class":544}," tbody ",[530,1197,581],{"class":540},[530,1199,1200],{"class":544}," document",[530,1202,475],{"class":540},[530,1204,1205],{"class":590},"querySelector",[530,1207,593],{"class":544},[530,1209,596],{"class":540},[530,1211,1212],{"class":557},"#t tbody",[530,1214,596],{"class":540},[530,1216,1217],{"class":544},")\n",[530,1219,1221,1223,1226,1228,1231,1234],{"class":532,"line":1220},25,[530,1222,1175],{"class":574},[530,1224,1225],{"class":544}," es ",[530,1227,581],{"class":540},[530,1229,1230],{"class":540}," new",[530,1232,1233],{"class":590}," EventSource",[530,1235,1236],{"class":544},"(STREAM_URL)\n",[530,1238,1240],{"class":532,"line":1239},26,[530,1241,568],{"emptyLinePlaceholder":567},[530,1243,1245,1248,1250,1253,1255,1257,1260,1262,1264],{"class":532,"line":1244},27,[530,1246,1247],{"class":544},"    es",[530,1249,475],{"class":540},[530,1251,1252],{"class":590},"onmessage",[530,1254,647],{"class":540},[530,1256,584],{"class":540},[530,1258,1259],{"class":674},"e",[530,1261,664],{"class":540},[530,1263,678],{"class":574},[530,1265,1266],{"class":540}," {\n",[530,1268,1270,1273,1276,1278,1281,1283,1286,1288,1290,1292,1295],{"class":532,"line":1269},28,[530,1271,1272],{"class":574},"      const",[530,1274,1275],{"class":544}," env",[530,1277,647],{"class":540},[530,1279,1280],{"class":544}," JSON",[530,1282,475],{"class":540},[530,1284,1285],{"class":590},"parse",[530,1287,593],{"class":708},[530,1289,1259],{"class":544},[530,1291,475],{"class":540},[530,1293,1294],{"class":544},"data",[530,1296,1217],{"class":708},[530,1298,1300,1303,1305,1308,1310,1313,1316,1318,1321,1323,1326],{"class":532,"line":1299},29,[530,1301,1302],{"class":536},"      if",[530,1304,584],{"class":708},[530,1306,1307],{"class":544},"env",[530,1309,475],{"class":540},[530,1311,1312],{"class":544},"evlog",[530,1314,1315],{"class":540}," !==",[530,1317,554],{"class":540},[530,1319,1320],{"class":557},"1",[530,1322,596],{"class":540},[530,1324,1325],{"class":708},") ",[530,1327,1328],{"class":536},"return\n",[530,1330,1332,1334,1336,1338,1340,1343,1345,1347,1350,1352,1355,1357,1359,1361,1363,1365,1368,1370,1372],{"class":532,"line":1331},30,[530,1333,1302],{"class":536},[530,1335,584],{"class":708},[530,1337,1307],{"class":544},[530,1339,475],{"class":540},[530,1341,1342],{"class":544},"type",[530,1344,1315],{"class":540},[530,1346,554],{"class":540},[530,1348,1349],{"class":557},"event",[530,1351,596],{"class":540},[530,1353,1354],{"class":540}," &&",[530,1356,1275],{"class":544},[530,1358,475],{"class":540},[530,1360,1342],{"class":544},[530,1362,1315],{"class":540},[530,1364,554],{"class":540},[530,1366,1367],{"class":557},"replay",[530,1369,596],{"class":540},[530,1371,1325],{"class":708},[530,1373,1328],{"class":536},[530,1375,1377],{"class":532,"line":1376},31,[530,1378,568],{"emptyLinePlaceholder":567},[530,1380,1382,1384,1387,1389,1391,1393],{"class":532,"line":1381},32,[530,1383,1272],{"class":574},[530,1385,1386],{"class":544}," w",[530,1388,647],{"class":540},[530,1390,1275],{"class":544},[530,1392,475],{"class":540},[530,1394,1395],{"class":544},"data\n",[530,1397,1399,1401,1404,1406,1408,1410,1413,1415,1417,1419,1421],{"class":532,"line":1398},33,[530,1400,1272],{"class":574},[530,1402,1403],{"class":544}," tr",[530,1405,647],{"class":540},[530,1407,1200],{"class":544},[530,1409,475],{"class":540},[530,1411,1412],{"class":590},"createElement",[530,1414,593],{"class":708},[530,1416,596],{"class":540},[530,1418,1060],{"class":557},[530,1420,596],{"class":540},[530,1422,1217],{"class":708},[530,1424,1426,1429,1431,1434,1436],{"class":532,"line":1425},34,[530,1427,1428],{"class":544},"      tr",[530,1430,475],{"class":540},[530,1432,1433],{"class":544},"innerHTML",[530,1435,647],{"class":540},[530,1437,1438],{"class":540}," `\n",[530,1440,1442,1445,1448,1451,1454,1457,1459,1462,1464,1467,1470,1472],{"class":532,"line":1441},35,[530,1443,1444],{"class":557},"        \u003Ctd>",[530,1446,1447],{"class":540},"${",[530,1449,1450],{"class":540},"new",[530,1452,1453],{"class":590}," Date",[530,1455,1456],{"class":544},"(w",[530,1458,475],{"class":540},[530,1460,1461],{"class":544},"timestamp)",[530,1463,475],{"class":540},[530,1465,1466],{"class":590},"toLocaleTimeString",[530,1468,1469],{"class":544},"()",[530,1471,644],{"class":540},[530,1473,1474],{"class":557},"\u003C\u002Ftd>\n",[530,1476,1478,1481,1483,1486,1488,1490,1492,1495,1497,1499,1501,1503,1505],{"class":532,"line":1477},36,[530,1479,1480],{"class":557},"        \u003Ctd class=\"lvl-",[530,1482,1447],{"class":540},[530,1484,1485],{"class":544},"w",[530,1487,475],{"class":540},[530,1489,1083],{"class":544},[530,1491,644],{"class":540},[530,1493,1494],{"class":557},"\">",[530,1496,1447],{"class":540},[530,1498,1485],{"class":544},[530,1500,475],{"class":540},[530,1502,1083],{"class":544},[530,1504,644],{"class":540},[530,1506,1474],{"class":557},[530,1508,1510,1512,1514,1516,1518,1521,1524,1527],{"class":532,"line":1509},37,[530,1511,1444],{"class":557},[530,1513,1447],{"class":540},[530,1515,1485],{"class":544},[530,1517,475],{"class":540},[530,1519,1520],{"class":544},"service ",[530,1522,1523],{"class":540},"??",[530,1525,1526],{"class":540}," ''}",[530,1528,1474],{"class":557},[530,1530,1532,1534,1536,1538,1540,1543,1545,1547,1549,1552,1554,1556,1558,1561,1563,1565],{"class":532,"line":1531},38,[530,1533,1444],{"class":557},[530,1535,1447],{"class":540},[530,1537,1485],{"class":544},[530,1539,475],{"class":540},[530,1541,1542],{"class":544},"action ",[530,1544,1523],{"class":540},[530,1546,1386],{"class":544},[530,1548,475],{"class":540},[530,1550,1551],{"class":544},"message ",[530,1553,1523],{"class":540},[530,1555,1386],{"class":544},[530,1557,475],{"class":540},[530,1559,1560],{"class":544},"path ",[530,1562,1523],{"class":540},[530,1564,1526],{"class":540},[530,1566,1474],{"class":557},[530,1568,1570],{"class":532,"line":1569},39,[530,1571,1572],{"class":540},"      `\n",[530,1574,1576,1579,1581,1584,1586,1588],{"class":532,"line":1575},40,[530,1577,1578],{"class":544},"      tbody",[530,1580,475],{"class":540},[530,1582,1583],{"class":590},"prepend",[530,1585,593],{"class":708},[530,1587,1060],{"class":544},[530,1589,1217],{"class":708},[530,1591,1593,1596,1598,1600,1602,1605,1607,1610,1613,1616,1618,1620,1622,1625,1627,1630],{"class":532,"line":1592},41,[530,1594,1595],{"class":536},"      while",[530,1597,584],{"class":708},[530,1599,1132],{"class":544},[530,1601,475],{"class":540},[530,1603,1604],{"class":544},"children",[530,1606,475],{"class":540},[530,1608,1609],{"class":544},"length",[530,1611,1612],{"class":540}," >",[530,1614,1615],{"class":806}," 200",[530,1617,1325],{"class":708},[530,1619,1132],{"class":544},[530,1621,475],{"class":540},[530,1623,1624],{"class":544},"lastElementChild",[530,1626,475],{"class":540},[530,1628,1629],{"class":590},"remove",[530,1631,621],{"class":708},[530,1633,1635],{"class":532,"line":1634},42,[530,1636,1637],{"class":540},"    }\n",[530,1639,1641,1643,1645],{"class":532,"line":1640},43,[530,1642,1000],{"class":540},[530,1644,1160],{"class":708},[530,1646,715],{"class":540},[530,1648,1650,1652,1654],{"class":532,"line":1649},44,[530,1651,773],{"class":540},[530,1653,1021],{"class":708},[530,1655,715],{"class":540},[530,1657,1659,1661,1663],{"class":532,"line":1658},45,[530,1660,773],{"class":540},[530,1662,698],{"class":708},[530,1664,715],{"class":540},[460,1666,1667,1668,1671],{},"Save as ",[485,1669,1670],{},"devtool.html",", open in any browser tab while your evlog-instrumented dev server is running. That's the whole MVP.",[509,1673,1675],{"id":1674},"vue-3-component","Vue 3 component",[521,1677,1681],{"className":1678,"code":1679,"language":1680,"meta":526,"style":526},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cscript setup lang=\"ts\">\nimport { onBeforeUnmount, onMounted, ref } from 'vue'\nimport type { WideEvent } from 'evlog'\n\nconst events = ref\u003CWideEvent[]>([])\nlet es: EventSource | null = null\n\nonMounted(async () => {\n  \u002F\u002F Discover URL via the same-origin info endpoint (Nuxt)\n  const { url } = await $fetch\u003C{ url: string | null }>('\u002Fapi\u002F_evlog\u002Fstream-info')\n  if (!url) return\n\n  es = new EventSource(url)\n  es.onmessage = (e) => {\n    const env = JSON.parse(e.data)\n    if (env.evlog !== '1') return\n    if (env.type === 'event' || env.type === 'replay') {\n      events.value.unshift(env.data as WideEvent)\n      if (events.value.length > 500) events.value.length = 500\n    }\n  }\n})\n\nonBeforeUnmount(() => es?.close())\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cul>\n    \u003Cli v-for=\"(e, i) in events\" :key=\"`${e.timestamp}-${i}`\">\n      \u003Ccode>{{ e.level }}\u003C\u002Fcode>\n      \u003Cstrong>{{ e.service }}\u003C\u002Fstrong>\n      \u003Cspan>{{ e.action ?? e.message ?? e.path }}\u003C\u002Fspan>\n    \u003C\u002Fli>\n  \u003C\u002Ful>\n\u003C\u002Ftemplate>\n","vue",[485,1682,1683,1705,1734,1756,1760,1784,1807,1811,1828,1833,1879,1896,1900,1917,1937,1961,1986,2029,2059,2098,2102,2107,2113,2117,2138,2146,2150,2159,2168,2200,2218,2235,2252,2261,2269],{"__ignoreMap":526},[530,1684,1685,1687,1689,1692,1695,1697,1699,1701,1703],{"class":532,"line":533},[530,1686,720],{"class":540},[530,1688,1160],{"class":708},[530,1690,1691],{"class":574}," setup",[530,1693,1694],{"class":574}," lang",[530,1696,581],{"class":540},[530,1698,750],{"class":540},[530,1700,525],{"class":557},[530,1702,750],{"class":540},[530,1704,715],{"class":540},[530,1706,1707,1709,1711,1714,1716,1719,1721,1724,1726,1728,1730,1732],{"class":532,"line":564},[530,1708,537],{"class":536},[530,1710,541],{"class":540},[530,1712,1713],{"class":544}," onBeforeUnmount",[530,1715,603],{"class":540},[530,1717,1718],{"class":544}," onMounted",[530,1720,603],{"class":540},[530,1722,1723],{"class":544}," ref",[530,1725,548],{"class":540},[530,1727,551],{"class":536},[530,1729,554],{"class":540},[530,1731,1680],{"class":557},[530,1733,561],{"class":540},[530,1735,1736,1738,1741,1743,1746,1748,1750,1752,1754],{"class":532,"line":571},[530,1737,537],{"class":536},[530,1739,1740],{"class":536}," type",[530,1742,541],{"class":540},[530,1744,1745],{"class":544}," WideEvent",[530,1747,548],{"class":540},[530,1749,551],{"class":536},[530,1751,554],{"class":540},[530,1753,1312],{"class":557},[530,1755,561],{"class":540},[530,1757,1758],{"class":532,"line":736},[530,1759,568],{"emptyLinePlaceholder":567},[530,1761,1762,1764,1767,1769,1771,1773,1776,1779,1781],{"class":532,"line":759},[530,1763,575],{"class":574},[530,1765,1766],{"class":544}," events ",[530,1768,581],{"class":540},[530,1770,1723],{"class":590},[530,1772,720],{"class":540},[530,1774,1775],{"class":793},"WideEvent",[530,1777,1778],{"class":544},"[]",[530,1780,767],{"class":540},[530,1782,1783],{"class":544},"([])\n",[530,1785,1786,1789,1792,1794,1796,1799,1802,1804],{"class":532,"line":780},[530,1787,1788],{"class":574},"let",[530,1790,1791],{"class":544}," es",[530,1793,803],{"class":540},[530,1795,1233],{"class":793},[530,1797,1798],{"class":540}," |",[530,1800,1801],{"class":793}," null",[530,1803,647],{"class":540},[530,1805,1806],{"class":540}," null\n",[530,1808,1809],{"class":532,"line":790},[530,1810,568],{"emptyLinePlaceholder":567},[530,1812,1813,1816,1818,1821,1824,1826],{"class":532,"line":843},[530,1814,1815],{"class":590},"onMounted",[530,1817,593],{"class":544},[530,1819,1820],{"class":574},"async",[530,1822,1823],{"class":540}," ()",[530,1825,678],{"class":574},[530,1827,1266],{"class":540},[530,1829,1830],{"class":532,"line":873},[530,1831,1832],{"class":1168},"  \u002F\u002F Discover URL via the same-origin info endpoint (Nuxt)\n",[530,1834,1835,1838,1840,1843,1845,1847,1849,1852,1855,1857,1859,1862,1864,1866,1869,1871,1873,1875,1877],{"class":532,"line":929},[530,1836,1837],{"class":574},"  const",[530,1839,541],{"class":540},[530,1841,1842],{"class":544}," url",[530,1844,548],{"class":540},[530,1846,647],{"class":540},[530,1848,650],{"class":536},[530,1850,1851],{"class":590}," $fetch",[530,1853,1854],{"class":540},"\u003C{",[530,1856,1842],{"class":708},[530,1858,803],{"class":540},[530,1860,1861],{"class":793}," string",[530,1863,1798],{"class":540},[530,1865,1801],{"class":793},[530,1867,1868],{"class":540}," }>",[530,1870,593],{"class":708},[530,1872,596],{"class":540},[530,1874,627],{"class":557},[530,1876,596],{"class":540},[530,1878,1217],{"class":708},[530,1880,1881,1884,1886,1889,1892,1894],{"class":532,"line":954},[530,1882,1883],{"class":536},"  if",[530,1885,584],{"class":708},[530,1887,1888],{"class":540},"!",[530,1890,1891],{"class":544},"url",[530,1893,1325],{"class":708},[530,1895,1328],{"class":536},[530,1897,1898],{"class":532,"line":976},[530,1899,568],{"emptyLinePlaceholder":567},[530,1901,1902,1905,1907,1909,1911,1913,1915],{"class":532,"line":997},[530,1903,1904],{"class":544},"  es",[530,1906,647],{"class":540},[530,1908,1230],{"class":540},[530,1910,1233],{"class":590},[530,1912,593],{"class":708},[530,1914,1891],{"class":544},[530,1916,1217],{"class":708},[530,1918,1919,1921,1923,1925,1927,1929,1931,1933,1935],{"class":532,"line":1007},[530,1920,1904],{"class":544},[530,1922,475],{"class":540},[530,1924,1252],{"class":590},[530,1926,647],{"class":540},[530,1928,584],{"class":540},[530,1930,1259],{"class":674},[530,1932,664],{"class":540},[530,1934,678],{"class":574},[530,1936,1266],{"class":540},[530,1938,1939,1941,1943,1945,1947,1949,1951,1953,1955,1957,1959],{"class":532,"line":1016},[530,1940,1175],{"class":574},[530,1942,1275],{"class":544},[530,1944,647],{"class":540},[530,1946,1280],{"class":544},[530,1948,475],{"class":540},[530,1950,1285],{"class":590},[530,1952,593],{"class":708},[530,1954,1259],{"class":544},[530,1956,475],{"class":540},[530,1958,1294],{"class":544},[530,1960,1217],{"class":708},[530,1962,1963,1966,1968,1970,1972,1974,1976,1978,1980,1982,1984],{"class":532,"line":1026},[530,1964,1965],{"class":536},"    if",[530,1967,584],{"class":708},[530,1969,1307],{"class":544},[530,1971,475],{"class":540},[530,1973,1312],{"class":544},[530,1975,1315],{"class":540},[530,1977,554],{"class":540},[530,1979,1320],{"class":557},[530,1981,596],{"class":540},[530,1983,1325],{"class":708},[530,1985,1328],{"class":536},[530,1987,1988,1990,1992,1994,1996,1998,2001,2003,2005,2007,2010,2012,2014,2016,2018,2020,2022,2024,2026],{"class":532,"line":1048},[530,1989,1965],{"class":536},[530,1991,584],{"class":708},[530,1993,1307],{"class":544},[530,1995,475],{"class":540},[530,1997,1342],{"class":544},[530,1999,2000],{"class":540}," ===",[530,2002,554],{"class":540},[530,2004,1349],{"class":557},[530,2006,596],{"class":540},[530,2008,2009],{"class":540}," ||",[530,2011,1275],{"class":544},[530,2013,475],{"class":540},[530,2015,1342],{"class":544},[530,2017,2000],{"class":540},[530,2019,554],{"class":540},[530,2021,1367],{"class":557},[530,2023,596],{"class":540},[530,2025,1325],{"class":708},[530,2027,2028],{"class":540},"{\n",[530,2030,2031,2034,2036,2039,2041,2044,2046,2048,2050,2052,2055,2057],{"class":532,"line":1127},[530,2032,2033],{"class":544},"      events",[530,2035,475],{"class":540},[530,2037,2038],{"class":544},"value",[530,2040,475],{"class":540},[530,2042,2043],{"class":590},"unshift",[530,2045,593],{"class":708},[530,2047,1307],{"class":544},[530,2049,475],{"class":540},[530,2051,1294],{"class":544},[530,2053,2054],{"class":536}," as",[530,2056,1745],{"class":793},[530,2058,1217],{"class":708},[530,2060,2061,2063,2065,2068,2070,2072,2074,2076,2078,2081,2083,2085,2087,2089,2091,2093,2095],{"class":532,"line":1141},[530,2062,1302],{"class":536},[530,2064,584],{"class":708},[530,2066,2067],{"class":544},"events",[530,2069,475],{"class":540},[530,2071,2038],{"class":544},[530,2073,475],{"class":540},[530,2075,1609],{"class":544},[530,2077,1612],{"class":540},[530,2079,2080],{"class":806}," 500",[530,2082,1325],{"class":708},[530,2084,2067],{"class":544},[530,2086,475],{"class":540},[530,2088,2038],{"class":544},[530,2090,475],{"class":540},[530,2092,1609],{"class":544},[530,2094,647],{"class":540},[530,2096,2097],{"class":806}," 500\n",[530,2099,2100],{"class":532,"line":1150},[530,2101,1637],{"class":540},[530,2103,2104],{"class":532,"line":1155},[530,2105,2106],{"class":540},"  }\n",[530,2108,2109,2111],{"class":532,"line":1165},[530,2110,644],{"class":540},[530,2112,1217],{"class":544},[530,2114,2115],{"class":532,"line":1172},[530,2116,568],{"emptyLinePlaceholder":567},[530,2118,2119,2122,2124,2126,2128,2130,2133,2136],{"class":532,"line":1190},[530,2120,2121],{"class":590},"onBeforeUnmount",[530,2123,593],{"class":544},[530,2125,1469],{"class":540},[530,2127,678],{"class":574},[530,2129,1791],{"class":544},[530,2131,2132],{"class":540},"?.",[530,2134,2135],{"class":590},"close",[530,2137,689],{"class":544},[530,2139,2140,2142,2144],{"class":532,"line":1220},[530,2141,773],{"class":540},[530,2143,1160],{"class":708},[530,2145,715],{"class":540},[530,2147,2148],{"class":532,"line":1239},[530,2149,568],{"emptyLinePlaceholder":567},[530,2151,2152,2154,2157],{"class":532,"line":1244},[530,2153,720],{"class":540},[530,2155,2156],{"class":708},"template",[530,2158,715],{"class":540},[530,2160,2161,2163,2166],{"class":532,"line":1269},[530,2162,739],{"class":540},[530,2164,2165],{"class":708},"ul",[530,2167,715],{"class":540},[530,2169,2170,2172,2174,2177,2179,2181,2184,2186,2189,2191,2193,2196,2198],{"class":532,"line":1299},[530,2171,1051],{"class":540},[530,2173,498],{"class":708},[530,2175,2176],{"class":574}," v-for",[530,2178,581],{"class":540},[530,2180,750],{"class":540},[530,2182,2183],{"class":557},"(e, i) in events",[530,2185,750],{"class":540},[530,2187,2188],{"class":574}," :key",[530,2190,581],{"class":540},[530,2192,750],{"class":540},[530,2194,2195],{"class":557},"`${e.timestamp}-${i}`",[530,2197,750],{"class":540},[530,2199,715],{"class":540},[530,2201,2202,2205,2207,2209,2212,2214,2216],{"class":532,"line":1331},[530,2203,2204],{"class":540},"      \u003C",[530,2206,485],{"class":708},[530,2208,767],{"class":540},[530,2210,2211],{"class":544},"{{ e.level }}",[530,2213,773],{"class":540},[530,2215,485],{"class":708},[530,2217,715],{"class":540},[530,2219,2220,2222,2224,2226,2229,2231,2233],{"class":532,"line":1376},[530,2221,2204],{"class":540},[530,2223,490],{"class":708},[530,2225,767],{"class":540},[530,2227,2228],{"class":544},"{{ e.service }}",[530,2230,773],{"class":540},[530,2232,490],{"class":708},[530,2234,715],{"class":540},[530,2236,2237,2239,2241,2243,2246,2248,2250],{"class":532,"line":1381},[530,2238,2204],{"class":540},[530,2240,530],{"class":708},[530,2242,767],{"class":540},[530,2244,2245],{"class":544},"{{ e.action ?? e.message ?? e.path }}",[530,2247,773],{"class":540},[530,2249,530],{"class":708},[530,2251,715],{"class":540},[530,2253,2254,2257,2259],{"class":532,"line":1398},[530,2255,2256],{"class":540},"    \u003C\u002F",[530,2258,498],{"class":708},[530,2260,715],{"class":540},[530,2262,2263,2265,2267],{"class":532,"line":1425},[530,2264,1000],{"class":540},[530,2266,2165],{"class":708},[530,2268,715],{"class":540},[530,2270,2271,2273,2275],{"class":532,"line":1441},[530,2272,773],{"class":540},[530,2274,2156],{"class":708},[530,2276,715],{"class":540},[509,2278,2280],{"id":2279},"react-hook","React hook",[521,2282,2284],{"className":523,"code":2283,"language":525,"meta":526,"style":526},"import { useEffect, useState } from 'react'\nimport type { WideEvent } from 'evlog'\n\nexport function useEvlogStream(url: string) {\n  const [events, setEvents] = useState\u003CWideEvent[]>([])\n\n  useEffect(() => {\n    if (!url) return\n    const es = new EventSource(url)\n    es.onmessage = (e) => {\n      const env = JSON.parse(e.data)\n      if (env.evlog !== '1') return\n      if (env.type === 'event' || env.type === 'replay') {\n        setEvents(prev => [env.data, ...prev].slice(0, 500))\n      }\n    }\n    return () => es.close()\n  }, [url])\n\n  return events\n}\n",[485,2285,2286,2311,2331,2335,2358,2389,2393,2406,2420,2438,2458,2482,2506,2546,2592,2597,2601,2618,2630,2634,2642],{"__ignoreMap":526},[530,2287,2288,2290,2292,2295,2297,2300,2302,2304,2306,2309],{"class":532,"line":533},[530,2289,537],{"class":536},[530,2291,541],{"class":540},[530,2293,2294],{"class":544}," useEffect",[530,2296,603],{"class":540},[530,2298,2299],{"class":544}," useState",[530,2301,548],{"class":540},[530,2303,551],{"class":536},[530,2305,554],{"class":540},[530,2307,2308],{"class":557},"react",[530,2310,561],{"class":540},[530,2312,2313,2315,2317,2319,2321,2323,2325,2327,2329],{"class":532,"line":564},[530,2314,537],{"class":536},[530,2316,1740],{"class":536},[530,2318,541],{"class":540},[530,2320,1745],{"class":544},[530,2322,548],{"class":540},[530,2324,551],{"class":536},[530,2326,554],{"class":540},[530,2328,1312],{"class":557},[530,2330,561],{"class":540},[530,2332,2333],{"class":532,"line":571},[530,2334,568],{"emptyLinePlaceholder":567},[530,2336,2337,2340,2343,2346,2348,2350,2352,2354,2356],{"class":532,"line":736},[530,2338,2339],{"class":536},"export",[530,2341,2342],{"class":574}," function",[530,2344,2345],{"class":590}," useEvlogStream",[530,2347,593],{"class":540},[530,2349,1891],{"class":674},[530,2351,803],{"class":540},[530,2353,1861],{"class":793},[530,2355,664],{"class":540},[530,2357,1266],{"class":540},[530,2359,2360,2362,2365,2367,2369,2372,2375,2377,2379,2381,2383,2385,2387],{"class":532,"line":759},[530,2361,1837],{"class":574},[530,2363,2364],{"class":540}," [",[530,2366,2067],{"class":544},[530,2368,603],{"class":540},[530,2370,2371],{"class":544}," setEvents",[530,2373,2374],{"class":540},"]",[530,2376,647],{"class":540},[530,2378,2299],{"class":590},[530,2380,720],{"class":540},[530,2382,1775],{"class":793},[530,2384,1778],{"class":708},[530,2386,767],{"class":540},[530,2388,1783],{"class":708},[530,2390,2391],{"class":532,"line":780},[530,2392,568],{"emptyLinePlaceholder":567},[530,2394,2395,2398,2400,2402,2404],{"class":532,"line":790},[530,2396,2397],{"class":590},"  useEffect",[530,2399,593],{"class":708},[530,2401,1469],{"class":540},[530,2403,678],{"class":574},[530,2405,1266],{"class":540},[530,2407,2408,2410,2412,2414,2416,2418],{"class":532,"line":843},[530,2409,1965],{"class":536},[530,2411,584],{"class":708},[530,2413,1888],{"class":540},[530,2415,1891],{"class":544},[530,2417,1325],{"class":708},[530,2419,1328],{"class":536},[530,2421,2422,2424,2426,2428,2430,2432,2434,2436],{"class":532,"line":873},[530,2423,1175],{"class":574},[530,2425,1791],{"class":544},[530,2427,647],{"class":540},[530,2429,1230],{"class":540},[530,2431,1233],{"class":590},[530,2433,593],{"class":708},[530,2435,1891],{"class":544},[530,2437,1217],{"class":708},[530,2439,2440,2442,2444,2446,2448,2450,2452,2454,2456],{"class":532,"line":929},[530,2441,1247],{"class":544},[530,2443,475],{"class":540},[530,2445,1252],{"class":590},[530,2447,647],{"class":540},[530,2449,584],{"class":540},[530,2451,1259],{"class":674},[530,2453,664],{"class":540},[530,2455,678],{"class":574},[530,2457,1266],{"class":540},[530,2459,2460,2462,2464,2466,2468,2470,2472,2474,2476,2478,2480],{"class":532,"line":954},[530,2461,1272],{"class":574},[530,2463,1275],{"class":544},[530,2465,647],{"class":540},[530,2467,1280],{"class":544},[530,2469,475],{"class":540},[530,2471,1285],{"class":590},[530,2473,593],{"class":708},[530,2475,1259],{"class":544},[530,2477,475],{"class":540},[530,2479,1294],{"class":544},[530,2481,1217],{"class":708},[530,2483,2484,2486,2488,2490,2492,2494,2496,2498,2500,2502,2504],{"class":532,"line":976},[530,2485,1302],{"class":536},[530,2487,584],{"class":708},[530,2489,1307],{"class":544},[530,2491,475],{"class":540},[530,2493,1312],{"class":544},[530,2495,1315],{"class":540},[530,2497,554],{"class":540},[530,2499,1320],{"class":557},[530,2501,596],{"class":540},[530,2503,1325],{"class":708},[530,2505,1328],{"class":536},[530,2507,2508,2510,2512,2514,2516,2518,2520,2522,2524,2526,2528,2530,2532,2534,2536,2538,2540,2542,2544],{"class":532,"line":997},[530,2509,1302],{"class":536},[530,2511,584],{"class":708},[530,2513,1307],{"class":544},[530,2515,475],{"class":540},[530,2517,1342],{"class":544},[530,2519,2000],{"class":540},[530,2521,554],{"class":540},[530,2523,1349],{"class":557},[530,2525,596],{"class":540},[530,2527,2009],{"class":540},[530,2529,1275],{"class":544},[530,2531,475],{"class":540},[530,2533,1342],{"class":544},[530,2535,2000],{"class":540},[530,2537,554],{"class":540},[530,2539,1367],{"class":557},[530,2541,596],{"class":540},[530,2543,1325],{"class":708},[530,2545,2028],{"class":540},[530,2547,2548,2551,2553,2556,2558,2560,2562,2564,2566,2568,2571,2573,2575,2577,2580,2582,2585,2587,2589],{"class":532,"line":1007},[530,2549,2550],{"class":590},"        setEvents",[530,2552,593],{"class":708},[530,2554,2555],{"class":674},"prev",[530,2557,678],{"class":574},[530,2559,2364],{"class":708},[530,2561,1307],{"class":544},[530,2563,475],{"class":540},[530,2565,1294],{"class":544},[530,2567,603],{"class":540},[530,2569,2570],{"class":540}," ...",[530,2572,2555],{"class":544},[530,2574,2374],{"class":708},[530,2576,475],{"class":540},[530,2578,2579],{"class":590},"slice",[530,2581,593],{"class":708},[530,2583,2584],{"class":806},"0",[530,2586,603],{"class":540},[530,2588,2080],{"class":806},[530,2590,2591],{"class":708},"))\n",[530,2593,2594],{"class":532,"line":1016},[530,2595,2596],{"class":540},"      }\n",[530,2598,2599],{"class":532,"line":1026},[530,2600,1637],{"class":540},[530,2602,2603,2606,2608,2610,2612,2614,2616],{"class":532,"line":1048},[530,2604,2605],{"class":536},"    return",[530,2607,1823],{"class":540},[530,2609,678],{"class":574},[530,2611,1791],{"class":544},[530,2613,475],{"class":540},[530,2615,2135],{"class":590},[530,2617,621],{"class":708},[530,2619,2620,2623,2625,2627],{"class":532,"line":1127},[530,2621,2622],{"class":540},"  },",[530,2624,2364],{"class":708},[530,2626,1891],{"class":544},[530,2628,2629],{"class":708},"])\n",[530,2631,2632],{"class":532,"line":1141},[530,2633,568],{"emptyLinePlaceholder":567},[530,2635,2636,2639],{"class":532,"line":1150},[530,2637,2638],{"class":536},"  return",[530,2640,2641],{"class":544}," events\n",[530,2643,2644],{"class":532,"line":1155},[530,2645,951],{"class":540},[460,2647,2648,2649,2651,2652,475],{},"That's the entire integration surface. No SDK, no special types beyond ",[485,2650,1775],{}," exported from ",[485,2653,1312],{},[477,2655,2657],{"id":2656},"_2-quick-cli-inspection-with-curl-jq","2. Quick CLI inspection with curl + jq",[460,2659,2660,2661,803],{},"The URL is in ",[485,2662,518],{},[521,2664,2668],{"className":2665,"code":2666,"language":2667,"meta":526,"style":526},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","URL=$(cat .evlog\u002Fstream.url)\ncurl -N \"$URL\" | jq -c 'select(.type == \"event\") | .data'\n","bash",[485,2669,2670,2686],{"__ignoreMap":526},[530,2671,2672,2675,2678,2681,2684],{"class":532,"line":533},[530,2673,2674],{"class":544},"URL",[530,2676,2677],{"class":540},"=$(",[530,2679,2680],{"class":793},"cat",[530,2682,2683],{"class":557}," .evlog\u002Fstream.url",[530,2685,1217],{"class":540},[530,2687,2688,2691,2694,2697,2700,2702,2704,2707,2710,2712,2715],{"class":532,"line":564},[530,2689,2690],{"class":793},"curl",[530,2692,2693],{"class":557}," -N",[530,2695,2696],{"class":540}," \"",[530,2698,2699],{"class":544},"$URL",[530,2701,750],{"class":540},[530,2703,1798],{"class":540},[530,2705,2706],{"class":793}," jq",[530,2708,2709],{"class":557}," -c",[530,2711,554],{"class":540},[530,2713,2714],{"class":557},"select(.type == \"event\") | .data",[530,2716,561],{"class":540},[460,2718,2719],{},"Filter on the client side as needed:",[521,2721,2723],{"className":2665,"code":2722,"language":2667,"meta":526,"style":526},"# Only errors\ncurl -sN \"$URL\" | jq -c 'select(.type == \"event\" and .data.level == \"error\") | .data'\n\n# Only one service\ncurl -sN \"$URL\" | jq -c 'select(.type == \"event\" and .data.service == \"checkout\") | .data'\n\n# Slow requests\ncurl -sN \"$URL\" | jq -c 'select(.type == \"event\" and .data.duration > 500) | .data'\n",[485,2724,2725,2730,2756,2760,2765,2790,2794,2799],{"__ignoreMap":526},[530,2726,2727],{"class":532,"line":533},[530,2728,2729],{"class":1168},"# Only errors\n",[530,2731,2732,2734,2737,2739,2741,2743,2745,2747,2749,2751,2754],{"class":532,"line":564},[530,2733,2690],{"class":793},[530,2735,2736],{"class":557}," -sN",[530,2738,2696],{"class":540},[530,2740,2699],{"class":544},[530,2742,750],{"class":540},[530,2744,1798],{"class":540},[530,2746,2706],{"class":793},[530,2748,2709],{"class":557},[530,2750,554],{"class":540},[530,2752,2753],{"class":557},"select(.type == \"event\" and .data.level == \"error\") | .data",[530,2755,561],{"class":540},[530,2757,2758],{"class":532,"line":571},[530,2759,568],{"emptyLinePlaceholder":567},[530,2761,2762],{"class":532,"line":736},[530,2763,2764],{"class":1168},"# Only one service\n",[530,2766,2767,2769,2771,2773,2775,2777,2779,2781,2783,2785,2788],{"class":532,"line":759},[530,2768,2690],{"class":793},[530,2770,2736],{"class":557},[530,2772,2696],{"class":540},[530,2774,2699],{"class":544},[530,2776,750],{"class":540},[530,2778,1798],{"class":540},[530,2780,2706],{"class":793},[530,2782,2709],{"class":557},[530,2784,554],{"class":540},[530,2786,2787],{"class":557},"select(.type == \"event\" and .data.service == \"checkout\") | .data",[530,2789,561],{"class":540},[530,2791,2792],{"class":532,"line":780},[530,2793,568],{"emptyLinePlaceholder":567},[530,2795,2796],{"class":532,"line":790},[530,2797,2798],{"class":1168},"# Slow requests\n",[530,2800,2801,2803,2805,2807,2809,2811,2813,2815,2817,2819,2822],{"class":532,"line":843},[530,2802,2690],{"class":793},[530,2804,2736],{"class":557},[530,2806,2696],{"class":540},[530,2808,2699],{"class":544},[530,2810,750],{"class":540},[530,2812,1798],{"class":540},[530,2814,2706],{"class":793},[530,2816,2709],{"class":557},[530,2818,554],{"class":540},[530,2820,2821],{"class":557},"select(.type == \"event\" and .data.duration > 500) | .data",[530,2823,561],{"class":540},[460,2825,2826,2829,2830,2832,2833,2836],{},[485,2827,2828],{},"-N"," keeps ",[485,2831,2690],{}," in streaming mode (no buffering). ",[485,2834,2835],{},"-s"," is silent.",[477,2838,2840],{"id":2839},"_3-replay-history-then-go-live","3. Replay history then go live",[460,2842,2843],{},"History on disk (filesystem drain) + live updates from the stream server = a full picture from any point in time.",[521,2845,2847],{"className":523,"code":2846,"language":525,"meta":526,"style":526},"import { readFsLogs } from 'evlog\u002Ffs'\nimport { readFile } from 'node:fs\u002Fpromises'\nimport type { WideEvent } from 'evlog'\n\nasync function bootstrap(handle: (e: WideEvent) => void) {\n  \u002F\u002F 1. Replay the last hour from `.evlog\u002Flogs\u002F`\n  const since = new Date(Date.now() - 60 * 60 * 1000)\n  for await (const event of readFsLogs({ since })) {\n    handle(event)\n  }\n\n  \u002F\u002F 2. Switch to the live SSE stream\n  const url = (await readFile('.evlog\u002Fstream.url', 'utf-8')).trim()\n  const es = new EventSource(url)\n  es.onmessage = (e) => {\n    const env = JSON.parse(e.data)\n    if (env.evlog !== '1') return\n    if (env.type === 'event' || env.type === 'replay') {\n      handle(env.data)\n    }\n  }\n  return () => es.close()\n}\n",[485,2848,2849,2869,2887,2907,2911,2946,2951,2995,3028,3039,3043,3047,3052,3090,3108,3128,3152,3176,3216,3231,3235,3239,3255],{"__ignoreMap":526},[530,2850,2851,2853,2855,2858,2860,2862,2864,2867],{"class":532,"line":533},[530,2852,537],{"class":536},[530,2854,541],{"class":540},[530,2856,2857],{"class":544}," readFsLogs",[530,2859,548],{"class":540},[530,2861,551],{"class":536},[530,2863,554],{"class":540},[530,2865,2866],{"class":557},"evlog\u002Ffs",[530,2868,561],{"class":540},[530,2870,2871,2873,2875,2877,2879,2881,2883,2885],{"class":532,"line":564},[530,2872,537],{"class":536},[530,2874,541],{"class":540},[530,2876,545],{"class":544},[530,2878,548],{"class":540},[530,2880,551],{"class":536},[530,2882,554],{"class":540},[530,2884,558],{"class":557},[530,2886,561],{"class":540},[530,2888,2889,2891,2893,2895,2897,2899,2901,2903,2905],{"class":532,"line":571},[530,2890,537],{"class":536},[530,2892,1740],{"class":536},[530,2894,541],{"class":540},[530,2896,1745],{"class":544},[530,2898,548],{"class":540},[530,2900,551],{"class":536},[530,2902,554],{"class":540},[530,2904,1312],{"class":557},[530,2906,561],{"class":540},[530,2908,2909],{"class":532,"line":736},[530,2910,568],{"emptyLinePlaceholder":567},[530,2912,2913,2915,2917,2920,2922,2925,2927,2929,2931,2933,2935,2937,2939,2942,2944],{"class":532,"line":759},[530,2914,1820],{"class":574},[530,2916,2342],{"class":574},[530,2918,2919],{"class":590}," bootstrap",[530,2921,593],{"class":540},[530,2923,2924],{"class":590},"handle",[530,2926,803],{"class":540},[530,2928,584],{"class":540},[530,2930,1259],{"class":674},[530,2932,803],{"class":540},[530,2934,1745],{"class":793},[530,2936,664],{"class":540},[530,2938,678],{"class":574},[530,2940,2941],{"class":793}," void",[530,2943,664],{"class":540},[530,2945,1266],{"class":540},[530,2947,2948],{"class":532,"line":780},[530,2949,2950],{"class":1168},"  \u002F\u002F 1. Replay the last hour from `.evlog\u002Flogs\u002F`\n",[530,2952,2953,2955,2958,2960,2962,2964,2966,2969,2971,2974,2977,2980,2983,2986,2988,2990,2993],{"class":532,"line":790},[530,2954,1837],{"class":574},[530,2956,2957],{"class":544}," since",[530,2959,647],{"class":540},[530,2961,1230],{"class":540},[530,2963,1453],{"class":590},[530,2965,593],{"class":708},[530,2967,2968],{"class":544},"Date",[530,2970,475],{"class":540},[530,2972,2973],{"class":590},"now",[530,2975,2976],{"class":708},"() ",[530,2978,2979],{"class":540},"-",[530,2981,2982],{"class":806}," 60",[530,2984,2985],{"class":540}," *",[530,2987,2982],{"class":806},[530,2989,2985],{"class":540},[530,2991,2992],{"class":806}," 1000",[530,2994,1217],{"class":708},[530,2996,2997,3000,3002,3004,3006,3009,3012,3014,3016,3019,3021,3023,3026],{"class":532,"line":843},[530,2998,2999],{"class":536},"  for",[530,3001,650],{"class":536},[530,3003,584],{"class":708},[530,3005,575],{"class":574},[530,3007,3008],{"class":544}," event",[530,3010,3011],{"class":540}," of",[530,3013,2857],{"class":590},[530,3015,593],{"class":708},[530,3017,3018],{"class":540},"{",[530,3020,2957],{"class":544},[530,3022,548],{"class":540},[530,3024,3025],{"class":708},")) ",[530,3027,2028],{"class":540},[530,3029,3030,3033,3035,3037],{"class":532,"line":873},[530,3031,3032],{"class":590},"    handle",[530,3034,593],{"class":708},[530,3036,1349],{"class":544},[530,3038,1217],{"class":708},[530,3040,3041],{"class":532,"line":929},[530,3042,2106],{"class":540},[530,3044,3045],{"class":532,"line":954},[530,3046,568],{"emptyLinePlaceholder":567},[530,3048,3049],{"class":532,"line":976},[530,3050,3051],{"class":1168},"  \u002F\u002F 2. Switch to the live SSE stream\n",[530,3053,3054,3056,3058,3060,3062,3064,3066,3068,3070,3072,3074,3076,3078,3080,3082,3084,3086,3088],{"class":532,"line":997},[530,3055,1837],{"class":574},[530,3057,1842],{"class":544},[530,3059,647],{"class":540},[530,3061,584],{"class":708},[530,3063,587],{"class":536},[530,3065,545],{"class":590},[530,3067,593],{"class":708},[530,3069,596],{"class":540},[530,3071,518],{"class":557},[530,3073,596],{"class":540},[530,3075,603],{"class":540},[530,3077,554],{"class":540},[530,3079,608],{"class":557},[530,3081,596],{"class":540},[530,3083,613],{"class":708},[530,3085,475],{"class":540},[530,3087,618],{"class":590},[530,3089,621],{"class":708},[530,3091,3092,3094,3096,3098,3100,3102,3104,3106],{"class":532,"line":1007},[530,3093,1837],{"class":574},[530,3095,1791],{"class":544},[530,3097,647],{"class":540},[530,3099,1230],{"class":540},[530,3101,1233],{"class":590},[530,3103,593],{"class":708},[530,3105,1891],{"class":544},[530,3107,1217],{"class":708},[530,3109,3110,3112,3114,3116,3118,3120,3122,3124,3126],{"class":532,"line":1016},[530,3111,1904],{"class":544},[530,3113,475],{"class":540},[530,3115,1252],{"class":590},[530,3117,647],{"class":540},[530,3119,584],{"class":540},[530,3121,1259],{"class":674},[530,3123,664],{"class":540},[530,3125,678],{"class":574},[530,3127,1266],{"class":540},[530,3129,3130,3132,3134,3136,3138,3140,3142,3144,3146,3148,3150],{"class":532,"line":1026},[530,3131,1175],{"class":574},[530,3133,1275],{"class":544},[530,3135,647],{"class":540},[530,3137,1280],{"class":544},[530,3139,475],{"class":540},[530,3141,1285],{"class":590},[530,3143,593],{"class":708},[530,3145,1259],{"class":544},[530,3147,475],{"class":540},[530,3149,1294],{"class":544},[530,3151,1217],{"class":708},[530,3153,3154,3156,3158,3160,3162,3164,3166,3168,3170,3172,3174],{"class":532,"line":1048},[530,3155,1965],{"class":536},[530,3157,584],{"class":708},[530,3159,1307],{"class":544},[530,3161,475],{"class":540},[530,3163,1312],{"class":544},[530,3165,1315],{"class":540},[530,3167,554],{"class":540},[530,3169,1320],{"class":557},[530,3171,596],{"class":540},[530,3173,1325],{"class":708},[530,3175,1328],{"class":536},[530,3177,3178,3180,3182,3184,3186,3188,3190,3192,3194,3196,3198,3200,3202,3204,3206,3208,3210,3212,3214],{"class":532,"line":1127},[530,3179,1965],{"class":536},[530,3181,584],{"class":708},[530,3183,1307],{"class":544},[530,3185,475],{"class":540},[530,3187,1342],{"class":544},[530,3189,2000],{"class":540},[530,3191,554],{"class":540},[530,3193,1349],{"class":557},[530,3195,596],{"class":540},[530,3197,2009],{"class":540},[530,3199,1275],{"class":544},[530,3201,475],{"class":540},[530,3203,1342],{"class":544},[530,3205,2000],{"class":540},[530,3207,554],{"class":540},[530,3209,1367],{"class":557},[530,3211,596],{"class":540},[530,3213,1325],{"class":708},[530,3215,2028],{"class":540},[530,3217,3218,3221,3223,3225,3227,3229],{"class":532,"line":1141},[530,3219,3220],{"class":590},"      handle",[530,3222,593],{"class":708},[530,3224,1307],{"class":544},[530,3226,475],{"class":540},[530,3228,1294],{"class":544},[530,3230,1217],{"class":708},[530,3232,3233],{"class":532,"line":1150},[530,3234,1637],{"class":540},[530,3236,3237],{"class":532,"line":1155},[530,3238,2106],{"class":540},[530,3240,3241,3243,3245,3247,3249,3251,3253],{"class":532,"line":1165},[530,3242,2638],{"class":536},[530,3244,1823],{"class":540},[530,3246,678],{"class":574},[530,3248,1791],{"class":544},[530,3250,475],{"class":540},[530,3252,2135],{"class":590},[530,3254,621],{"class":708},[530,3256,3257],{"class":532,"line":1172},[530,3258,951],{"class":540},[460,3260,3261,3264,3265,3268],{},[485,3262,3263],{},"readFsLogs"," skips files outside the date range, so the replay step is fast even if you keep weeks of history. For a tail-only mode without on-disk replay, hit the stream server with ",[485,3266,3267],{},"?since=\u003Ciso>"," to reuse the in-process ring buffer instead.",[477,3270,3272],{"id":3271},"_4-node-bun-client-fetch-readablestream","4. Node \u002F Bun client (fetch + ReadableStream)",[460,3274,3275,3276,3278],{},"Same protocol, no ",[485,3277,487],{}," polyfill needed:",[521,3280,3282],{"className":523,"code":3281,"language":525,"meta":526,"style":526},"import { readFile } from 'node:fs\u002Fpromises'\n\nconst url = (await readFile('.evlog\u002Fstream.url', 'utf-8')).trim()\nconst res = await fetch(url)\nconst reader = res.body!.getReader()\nconst decoder = new TextDecoder()\nlet buffer = ''\n\nwhile (true) {\n  const { value, done } = await reader.read()\n  if (done) break\n  buffer += decoder.decode(value, { stream: true })\n\n  let idx\n  while ((idx = buffer.indexOf('\\n\\n')) !== -1) {\n    const frame = buffer.slice(0, idx)\n    buffer = buffer.slice(idx + 2)\n    const dataLine = frame.split('\\n').find(l => l.startsWith('data:'))\n    if (!dataLine) continue\n    const env = JSON.parse(dataLine.slice(5).trim())\n    if (env.type === 'event') console.log(env.data)\n  }\n}\n",[485,3283,3284,3302,3306,3344,3360,3384,3400,3412,3416,3431,3461,3475,3511,3515,3523,3567,3593,3618,3676,3692,3727,3767,3771],{"__ignoreMap":526},[530,3285,3286,3288,3290,3292,3294,3296,3298,3300],{"class":532,"line":533},[530,3287,537],{"class":536},[530,3289,541],{"class":540},[530,3291,545],{"class":544},[530,3293,548],{"class":540},[530,3295,551],{"class":536},[530,3297,554],{"class":540},[530,3299,558],{"class":557},[530,3301,561],{"class":540},[530,3303,3304],{"class":532,"line":564},[530,3305,568],{"emptyLinePlaceholder":567},[530,3307,3308,3310,3312,3314,3316,3318,3320,3322,3324,3326,3328,3330,3332,3334,3336,3338,3340,3342],{"class":532,"line":571},[530,3309,575],{"class":574},[530,3311,578],{"class":544},[530,3313,581],{"class":540},[530,3315,584],{"class":544},[530,3317,587],{"class":536},[530,3319,545],{"class":590},[530,3321,593],{"class":544},[530,3323,596],{"class":540},[530,3325,518],{"class":557},[530,3327,596],{"class":540},[530,3329,603],{"class":540},[530,3331,554],{"class":540},[530,3333,608],{"class":557},[530,3335,596],{"class":540},[530,3337,613],{"class":544},[530,3339,475],{"class":540},[530,3341,618],{"class":590},[530,3343,621],{"class":544},[530,3345,3346,3348,3351,3353,3355,3357],{"class":532,"line":736},[530,3347,575],{"class":574},[530,3349,3350],{"class":544}," res ",[530,3352,581],{"class":540},[530,3354,650],{"class":536},[530,3356,653],{"class":590},[530,3358,3359],{"class":544},"(url)\n",[530,3361,3362,3364,3367,3369,3372,3374,3376,3379,3382],{"class":532,"line":759},[530,3363,575],{"class":574},[530,3365,3366],{"class":544}," reader ",[530,3368,581],{"class":540},[530,3370,3371],{"class":544}," res",[530,3373,475],{"class":540},[530,3375,1021],{"class":544},[530,3377,3378],{"class":540},"!.",[530,3380,3381],{"class":590},"getReader",[530,3383,621],{"class":544},[530,3385,3386,3388,3391,3393,3395,3398],{"class":532,"line":780},[530,3387,575],{"class":574},[530,3389,3390],{"class":544}," decoder ",[530,3392,581],{"class":540},[530,3394,1230],{"class":540},[530,3396,3397],{"class":590}," TextDecoder",[530,3399,621],{"class":544},[530,3401,3402,3404,3407,3409],{"class":532,"line":790},[530,3403,1788],{"class":574},[530,3405,3406],{"class":544}," buffer ",[530,3408,581],{"class":540},[530,3410,3411],{"class":540}," ''\n",[530,3413,3414],{"class":532,"line":843},[530,3415,568],{"emptyLinePlaceholder":567},[530,3417,3418,3421,3423,3427,3429],{"class":532,"line":873},[530,3419,3420],{"class":536},"while",[530,3422,584],{"class":544},[530,3424,3426],{"class":3425},"sfNiH","true",[530,3428,1325],{"class":544},[530,3430,2028],{"class":540},[530,3432,3433,3435,3437,3440,3442,3445,3447,3449,3451,3454,3456,3459],{"class":532,"line":929},[530,3434,1837],{"class":574},[530,3436,541],{"class":540},[530,3438,3439],{"class":544}," value",[530,3441,603],{"class":540},[530,3443,3444],{"class":544}," done",[530,3446,548],{"class":540},[530,3448,647],{"class":540},[530,3450,650],{"class":536},[530,3452,3453],{"class":544}," reader",[530,3455,475],{"class":540},[530,3457,3458],{"class":590},"read",[530,3460,621],{"class":708},[530,3462,3463,3465,3467,3470,3472],{"class":532,"line":954},[530,3464,1883],{"class":536},[530,3466,584],{"class":708},[530,3468,3469],{"class":544},"done",[530,3471,1325],{"class":708},[530,3473,3474],{"class":536},"break\n",[530,3476,3477,3480,3483,3486,3488,3491,3493,3495,3497,3499,3502,3504,3507,3509],{"class":532,"line":976},[530,3478,3479],{"class":544},"  buffer",[530,3481,3482],{"class":540}," +=",[530,3484,3485],{"class":544}," decoder",[530,3487,475],{"class":540},[530,3489,3490],{"class":590},"decode",[530,3492,593],{"class":708},[530,3494,2038],{"class":544},[530,3496,603],{"class":540},[530,3498,541],{"class":540},[530,3500,3501],{"class":708}," stream",[530,3503,803],{"class":540},[530,3505,3506],{"class":3425}," true",[530,3508,548],{"class":540},[530,3510,1217],{"class":708},[530,3512,3513],{"class":532,"line":997},[530,3514,568],{"emptyLinePlaceholder":567},[530,3516,3517,3520],{"class":532,"line":1007},[530,3518,3519],{"class":574},"  let",[530,3521,3522],{"class":544}," idx\n",[530,3524,3525,3528,3531,3534,3536,3539,3541,3544,3546,3548,3551,3553,3555,3558,3561,3563,3565],{"class":532,"line":1016},[530,3526,3527],{"class":536},"  while",[530,3529,3530],{"class":708}," ((",[530,3532,3533],{"class":544},"idx",[530,3535,647],{"class":540},[530,3537,3538],{"class":544}," buffer",[530,3540,475],{"class":540},[530,3542,3543],{"class":590},"indexOf",[530,3545,593],{"class":708},[530,3547,596],{"class":540},[530,3549,3550],{"class":544},"\\n\\n",[530,3552,596],{"class":540},[530,3554,3025],{"class":708},[530,3556,3557],{"class":540},"!==",[530,3559,3560],{"class":540}," -",[530,3562,1320],{"class":806},[530,3564,1325],{"class":708},[530,3566,2028],{"class":540},[530,3568,3569,3571,3574,3576,3578,3580,3582,3584,3586,3588,3591],{"class":532,"line":1026},[530,3570,1175],{"class":574},[530,3572,3573],{"class":544}," frame",[530,3575,647],{"class":540},[530,3577,3538],{"class":544},[530,3579,475],{"class":540},[530,3581,2579],{"class":590},[530,3583,593],{"class":708},[530,3585,2584],{"class":806},[530,3587,603],{"class":540},[530,3589,3590],{"class":544}," idx",[530,3592,1217],{"class":708},[530,3594,3595,3598,3600,3602,3604,3606,3608,3610,3613,3616],{"class":532,"line":1048},[530,3596,3597],{"class":544},"    buffer",[530,3599,647],{"class":540},[530,3601,3538],{"class":544},[530,3603,475],{"class":540},[530,3605,2579],{"class":590},[530,3607,593],{"class":708},[530,3609,3533],{"class":544},[530,3611,3612],{"class":540}," +",[530,3614,3615],{"class":806}," 2",[530,3617,1217],{"class":708},[530,3619,3620,3622,3625,3627,3629,3631,3634,3636,3638,3641,3643,3645,3647,3650,3652,3655,3657,3660,3662,3665,3667,3669,3672,3674],{"class":532,"line":1127},[530,3621,1175],{"class":574},[530,3623,3624],{"class":544}," dataLine",[530,3626,647],{"class":540},[530,3628,3573],{"class":544},[530,3630,475],{"class":540},[530,3632,3633],{"class":590},"split",[530,3635,593],{"class":708},[530,3637,596],{"class":540},[530,3639,3640],{"class":544},"\\n",[530,3642,596],{"class":540},[530,3644,664],{"class":708},[530,3646,475],{"class":540},[530,3648,3649],{"class":590},"find",[530,3651,593],{"class":708},[530,3653,3654],{"class":674},"l",[530,3656,678],{"class":574},[530,3658,3659],{"class":544}," l",[530,3661,475],{"class":540},[530,3663,3664],{"class":590},"startsWith",[530,3666,593],{"class":708},[530,3668,596],{"class":540},[530,3670,3671],{"class":557},"data:",[530,3673,596],{"class":540},[530,3675,2591],{"class":708},[530,3677,3678,3680,3682,3684,3687,3689],{"class":532,"line":1141},[530,3679,1965],{"class":536},[530,3681,584],{"class":708},[530,3683,1888],{"class":540},[530,3685,3686],{"class":544},"dataLine",[530,3688,1325],{"class":708},[530,3690,3691],{"class":536},"continue\n",[530,3693,3694,3696,3698,3700,3702,3704,3706,3708,3710,3712,3714,3716,3719,3721,3723,3725],{"class":532,"line":1150},[530,3695,1175],{"class":574},[530,3697,1275],{"class":544},[530,3699,647],{"class":540},[530,3701,1280],{"class":544},[530,3703,475],{"class":540},[530,3705,1285],{"class":590},[530,3707,593],{"class":708},[530,3709,3686],{"class":544},[530,3711,475],{"class":540},[530,3713,2579],{"class":590},[530,3715,593],{"class":708},[530,3717,3718],{"class":806},"5",[530,3720,664],{"class":708},[530,3722,475],{"class":540},[530,3724,618],{"class":590},[530,3726,689],{"class":708},[530,3728,3729,3731,3733,3735,3737,3739,3741,3743,3745,3747,3749,3752,3754,3757,3759,3761,3763,3765],{"class":532,"line":1155},[530,3730,1965],{"class":536},[530,3732,584],{"class":708},[530,3734,1307],{"class":544},[530,3736,475],{"class":540},[530,3738,1342],{"class":544},[530,3740,2000],{"class":540},[530,3742,554],{"class":540},[530,3744,1349],{"class":557},[530,3746,596],{"class":540},[530,3748,1325],{"class":708},[530,3750,3751],{"class":544},"console",[530,3753,475],{"class":540},[530,3755,3756],{"class":590},"log",[530,3758,593],{"class":708},[530,3760,1307],{"class":544},[530,3762,475],{"class":540},[530,3764,1294],{"class":544},[530,3766,1217],{"class":708},[530,3768,3769],{"class":532,"line":1165},[530,3770,2106],{"class":540},[530,3772,3773],{"class":532,"line":1172},[530,3774,951],{"class":540},[477,3776,3778],{"id":3777},"_5-filter-transform-aggregate-on-the-consumer","5. Filter, transform, aggregate on the consumer",[460,3780,3781],{},"Keep the server dumb — every consumer picks what it cares about:",[521,3783,3785],{"className":523,"code":3784,"language":525,"meta":526,"style":526},"\u002F\u002F Just errors\nconst errors = events.filter(e => e.level === 'error')\n\n\u002F\u002F Slow requests\nconst slowReqs = events.filter(e => typeof e.duration === 'number' && e.duration > 500)\n\n\u002F\u002F Group by service\nconst byService = Object.groupBy(events, e => e.service)\n\n\u002F\u002F Rolling error rate (last 100 events)\nconst last100 = events.slice(0, 100)\nconst errorRate = last100.filter(e => e.level === 'error').length \u002F last100.length\n\n\u002F\u002F Ad-hoc cost analytics — works because evlog\u002Fai writes ai.* fields on every AI call\nconst totalCost = events\n  .filter(e => typeof e.ai?.estimatedCost === 'number')\n  .reduce((sum, e) => sum + (e.ai?.estimatedCost as number), 0)\n",[485,3786,3787,3792,3835,3839,3844,3898,3902,3907,3940,3944,3949,3975,4028,4032,4037,4048,4085],{"__ignoreMap":526},[530,3788,3789],{"class":532,"line":533},[530,3790,3791],{"class":1168},"\u002F\u002F Just errors\n",[530,3793,3794,3796,3799,3801,3804,3806,3809,3811,3813,3815,3818,3820,3823,3826,3828,3831,3833],{"class":532,"line":564},[530,3795,575],{"class":574},[530,3797,3798],{"class":544}," errors ",[530,3800,581],{"class":540},[530,3802,3803],{"class":544}," events",[530,3805,475],{"class":540},[530,3807,3808],{"class":590},"filter",[530,3810,593],{"class":544},[530,3812,1259],{"class":674},[530,3814,678],{"class":574},[530,3816,3817],{"class":544}," e",[530,3819,475],{"class":540},[530,3821,3822],{"class":544},"level ",[530,3824,3825],{"class":540},"===",[530,3827,554],{"class":540},[530,3829,3830],{"class":557},"error",[530,3832,596],{"class":540},[530,3834,1217],{"class":544},[530,3836,3837],{"class":532,"line":571},[530,3838,568],{"emptyLinePlaceholder":567},[530,3840,3841],{"class":532,"line":736},[530,3842,3843],{"class":1168},"\u002F\u002F Slow requests\n",[530,3845,3846,3848,3851,3853,3855,3857,3859,3861,3863,3865,3868,3870,3872,3875,3877,3879,3882,3884,3886,3888,3890,3892,3894,3896],{"class":532,"line":759},[530,3847,575],{"class":574},[530,3849,3850],{"class":544}," slowReqs ",[530,3852,581],{"class":540},[530,3854,3803],{"class":544},[530,3856,475],{"class":540},[530,3858,3808],{"class":590},[530,3860,593],{"class":544},[530,3862,1259],{"class":674},[530,3864,678],{"class":574},[530,3866,3867],{"class":540}," typeof",[530,3869,3817],{"class":544},[530,3871,475],{"class":540},[530,3873,3874],{"class":544},"duration ",[530,3876,3825],{"class":540},[530,3878,554],{"class":540},[530,3880,3881],{"class":557},"number",[530,3883,596],{"class":540},[530,3885,1354],{"class":540},[530,3887,3817],{"class":544},[530,3889,475],{"class":540},[530,3891,3874],{"class":544},[530,3893,767],{"class":540},[530,3895,2080],{"class":806},[530,3897,1217],{"class":544},[530,3899,3900],{"class":532,"line":780},[530,3901,568],{"emptyLinePlaceholder":567},[530,3903,3904],{"class":532,"line":790},[530,3905,3906],{"class":1168},"\u002F\u002F Group by service\n",[530,3908,3909,3911,3914,3916,3919,3921,3924,3927,3929,3931,3933,3935,3937],{"class":532,"line":843},[530,3910,575],{"class":574},[530,3912,3913],{"class":544}," byService ",[530,3915,581],{"class":540},[530,3917,3918],{"class":544}," Object",[530,3920,475],{"class":540},[530,3922,3923],{"class":590},"groupBy",[530,3925,3926],{"class":544},"(events",[530,3928,603],{"class":540},[530,3930,3817],{"class":674},[530,3932,678],{"class":574},[530,3934,3817],{"class":544},[530,3936,475],{"class":540},[530,3938,3939],{"class":544},"service)\n",[530,3941,3942],{"class":532,"line":873},[530,3943,568],{"emptyLinePlaceholder":567},[530,3945,3946],{"class":532,"line":929},[530,3947,3948],{"class":1168},"\u002F\u002F Rolling error rate (last 100 events)\n",[530,3950,3951,3953,3956,3958,3960,3962,3964,3966,3968,3970,3973],{"class":532,"line":954},[530,3952,575],{"class":574},[530,3954,3955],{"class":544}," last100 ",[530,3957,581],{"class":540},[530,3959,3803],{"class":544},[530,3961,475],{"class":540},[530,3963,2579],{"class":590},[530,3965,593],{"class":544},[530,3967,2584],{"class":806},[530,3969,603],{"class":540},[530,3971,3972],{"class":806}," 100",[530,3974,1217],{"class":544},[530,3976,3977,3979,3982,3984,3987,3989,3991,3993,3995,3997,3999,4001,4003,4005,4007,4009,4011,4013,4015,4018,4021,4023,4025],{"class":532,"line":976},[530,3978,575],{"class":574},[530,3980,3981],{"class":544}," errorRate ",[530,3983,581],{"class":540},[530,3985,3986],{"class":544}," last100",[530,3988,475],{"class":540},[530,3990,3808],{"class":590},[530,3992,593],{"class":544},[530,3994,1259],{"class":674},[530,3996,678],{"class":574},[530,3998,3817],{"class":544},[530,4000,475],{"class":540},[530,4002,3822],{"class":544},[530,4004,3825],{"class":540},[530,4006,554],{"class":540},[530,4008,3830],{"class":557},[530,4010,596],{"class":540},[530,4012,664],{"class":544},[530,4014,475],{"class":540},[530,4016,4017],{"class":544},"length ",[530,4019,4020],{"class":540},"\u002F",[530,4022,3986],{"class":544},[530,4024,475],{"class":540},[530,4026,4027],{"class":544},"length\n",[530,4029,4030],{"class":532,"line":997},[530,4031,568],{"emptyLinePlaceholder":567},[530,4033,4034],{"class":532,"line":1007},[530,4035,4036],{"class":1168},"\u002F\u002F Ad-hoc cost analytics — works because evlog\u002Fai writes ai.* fields on every AI call\n",[530,4038,4039,4041,4044,4046],{"class":532,"line":1016},[530,4040,575],{"class":574},[530,4042,4043],{"class":544}," totalCost ",[530,4045,581],{"class":540},[530,4047,2641],{"class":544},[530,4049,4050,4053,4055,4057,4059,4061,4063,4065,4067,4070,4072,4075,4077,4079,4081,4083],{"class":532,"line":1026},[530,4051,4052],{"class":540},"  .",[530,4054,3808],{"class":590},[530,4056,593],{"class":544},[530,4058,1259],{"class":674},[530,4060,678],{"class":574},[530,4062,3867],{"class":540},[530,4064,3817],{"class":544},[530,4066,475],{"class":540},[530,4068,4069],{"class":544},"ai",[530,4071,2132],{"class":540},[530,4073,4074],{"class":544},"estimatedCost ",[530,4076,3825],{"class":540},[530,4078,554],{"class":540},[530,4080,3881],{"class":557},[530,4082,596],{"class":540},[530,4084,1217],{"class":544},[530,4086,4087,4089,4092,4094,4096,4099,4101,4103,4105,4107,4110,4113,4116,4118,4120,4122,4124,4127,4130,4132,4134,4136],{"class":532,"line":1048},[530,4088,4052],{"class":540},[530,4090,4091],{"class":590},"reduce",[530,4093,593],{"class":544},[530,4095,593],{"class":540},[530,4097,4098],{"class":674},"sum",[530,4100,603],{"class":540},[530,4102,3817],{"class":674},[530,4104,664],{"class":540},[530,4106,678],{"class":574},[530,4108,4109],{"class":544}," sum ",[530,4111,4112],{"class":540},"+",[530,4114,4115],{"class":544}," (e",[530,4117,475],{"class":540},[530,4119,4069],{"class":544},[530,4121,2132],{"class":540},[530,4123,4074],{"class":544},[530,4125,4126],{"class":536},"as",[530,4128,4129],{"class":793}," number",[530,4131,664],{"class":544},[530,4133,603],{"class":540},[530,4135,826],{"class":806},[530,4137,1217],{"class":544},[477,4139,4141],{"id":4140},"_6-self-hosted-tail-f-replacement","6. Self-hosted \"tail -f\" replacement",[460,4143,4144],{},"Skip the network entirely if the consumer runs on the same machine:",[521,4146,4148],{"className":523,"code":4147,"language":525,"meta":526,"style":526},"import { tailFsLogs } from 'evlog\u002Ffs'\n\nconst ac = new AbortController()\nprocess.on('SIGINT', () => ac.abort())\n\nfor await (const event of tailFsLogs({ signal: ac.signal })) {\n  if (event.level === 'error') notifyOps(event)\n}\n",[485,4149,4150,4169,4173,4189,4224,4228,4269,4300],{"__ignoreMap":526},[530,4151,4152,4154,4156,4159,4161,4163,4165,4167],{"class":532,"line":533},[530,4153,537],{"class":536},[530,4155,541],{"class":540},[530,4157,4158],{"class":544}," tailFsLogs",[530,4160,548],{"class":540},[530,4162,551],{"class":536},[530,4164,554],{"class":540},[530,4166,2866],{"class":557},[530,4168,561],{"class":540},[530,4170,4171],{"class":532,"line":564},[530,4172,568],{"emptyLinePlaceholder":567},[530,4174,4175,4177,4180,4182,4184,4187],{"class":532,"line":571},[530,4176,575],{"class":574},[530,4178,4179],{"class":544}," ac ",[530,4181,581],{"class":540},[530,4183,1230],{"class":540},[530,4185,4186],{"class":590}," AbortController",[530,4188,621],{"class":544},[530,4190,4191,4194,4196,4199,4201,4203,4206,4208,4210,4212,4214,4217,4219,4222],{"class":532,"line":736},[530,4192,4193],{"class":544},"process",[530,4195,475],{"class":540},[530,4197,4198],{"class":590},"on",[530,4200,593],{"class":544},[530,4202,596],{"class":540},[530,4204,4205],{"class":557},"SIGINT",[530,4207,596],{"class":540},[530,4209,603],{"class":540},[530,4211,1823],{"class":540},[530,4213,678],{"class":574},[530,4215,4216],{"class":544}," ac",[530,4218,475],{"class":540},[530,4220,4221],{"class":590},"abort",[530,4223,689],{"class":544},[530,4225,4226],{"class":532,"line":759},[530,4227,568],{"emptyLinePlaceholder":567},[530,4229,4230,4233,4235,4237,4239,4242,4245,4247,4249,4251,4254,4256,4258,4260,4263,4265,4267],{"class":532,"line":780},[530,4231,4232],{"class":536},"for",[530,4234,650],{"class":536},[530,4236,584],{"class":544},[530,4238,575],{"class":574},[530,4240,4241],{"class":544}," event ",[530,4243,4244],{"class":540},"of",[530,4246,4158],{"class":590},[530,4248,593],{"class":544},[530,4250,3018],{"class":540},[530,4252,4253],{"class":708}," signal",[530,4255,803],{"class":540},[530,4257,4216],{"class":544},[530,4259,475],{"class":540},[530,4261,4262],{"class":544},"signal ",[530,4264,644],{"class":540},[530,4266,3025],{"class":544},[530,4268,2028],{"class":540},[530,4270,4271,4273,4275,4277,4279,4281,4283,4285,4287,4289,4291,4294,4296,4298],{"class":532,"line":790},[530,4272,1883],{"class":536},[530,4274,584],{"class":708},[530,4276,1349],{"class":544},[530,4278,475],{"class":540},[530,4280,1083],{"class":544},[530,4282,2000],{"class":540},[530,4284,554],{"class":540},[530,4286,3830],{"class":557},[530,4288,596],{"class":540},[530,4290,1325],{"class":708},[530,4292,4293],{"class":590},"notifyOps",[530,4295,593],{"class":708},[530,4297,1349],{"class":544},[530,4299,1217],{"class":708},[530,4301,4302],{"class":532,"line":843},[530,4303,951],{"class":540},[460,4305,4306],{},"Works without instrumenting the running app — useful for sidecar \u002F observer processes that watch a directory.",[477,4308,4310],{"id":4309},"what-not-to-do","What not to do",[2165,4312,4313,4319,4325],{},[498,4314,4315,4318],{},[490,4316,4317],{},"Don't run the stream server on Vercel Functions \u002F Cloudflare Workers \u002F Lambda."," Each invocation is a separate isolate; subscribers in one isolate never see events emitted by other isolates. Use a real broker (Redis Streams, NATS, Pub\u002FSub) for cross-instance fan-out.",[498,4320,4321,4324],{},[490,4322,4323],{},"Don't put auth-sensitive data in wide events"," unless your evlog config redacts them. The server relays exactly what your app emitted — including any unredacted PII.",[498,4326,4327,4330],{},[490,4328,4329],{},"Don't filter at the server"," (\"only error events please\"). The server is purpose-built to be transparent. Filter on the consumer side; that way one filter doesn't starve another consumer.",[785,4332,4333],{},"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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sqsOY, html code.shiki .sqsOY{--shiki-light:#8796B0;--shiki-default:#B2CCD6;--shiki-dark:#B2CCD6}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":526,"searchDepth":564,"depth":564,"links":4335},[4336,4342,4343,4344,4345,4346,4347],{"id":479,"depth":564,"text":480,"children":4337},[4338,4339,4340,4341],{"id":511,"depth":571,"text":512},{"id":692,"depth":571,"text":693},{"id":1674,"depth":571,"text":1675},{"id":2279,"depth":571,"text":2280},{"id":2656,"depth":564,"text":2657},{"id":2839,"depth":564,"text":2840},{"id":3271,"depth":564,"text":3272},{"id":3777,"depth":564,"text":3778},{"id":4140,"depth":564,"text":4141},{"id":4309,"depth":564,"text":4310},"Concrete copy-paste recipes — build your own minimal devtool, pipe to curl + jq, replay history then go live, and aggregate on the consumer side.","md",null,{},{"title":156,"icon":329},{"title":156,"description":4348},"zchofWLfdFfVOqCBT3KpErqNgUCGN1ufgKNRH4kSyuA",[4356,4358],{"title":322,"path":323,"stem":324,"description":4357,"icon":325,"children":-1},"Replay and tail the local NDJSON drain with readFsLogs and tailFsLogs — works in-process or from any external Node tool.",{"title":331,"path":332,"stem":333,"description":4359,"icon":288,"children":-1},"definePlugin is the canonical extension contract for evlog. One plugin can opt into any subset of lifecycle hooks — enrich, drain, tail sampling, request lifecycle, client log observation.",1778340169076]