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