[{"data":1,"prerenderedAt":1969},["ShallowReactive",2],{"navigation_docs":3,"-build-on-top-recipes":421,"-build-on-top-recipes-surround":1964},[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":1957,"extension":1958,"links":1959,"meta":1960,"navigation":1961,"path":315,"seo":1962,"stem":316,"__hash__":1963},"docs\u002F5.build-on-top\u002F4.recipes.md",{"type":424,"value":425,"toc":1949},"minimark",[426,451,456,467,470,817,823,827,830,870,873,977,990,994,997,1358,1367,1371,1374,1736,1742,1746,1749,1915,1918,1922,1945],[427,428,429,430,434,435,437,438,441,442,446,447,450],"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,445],"code",{},"readFsLogs"," \u002F ",[443,448,449],{},"tailFsLogs",").",[452,453,455],"h2",{"id":454},"_1-build-a-minimal-devtool","1. Build a minimal devtool",[427,457,458,459,462,463,466],{},"A live event panel is ~30 lines of ",[443,460,461],{},"EventSource"," glue + a virtual table. The Nuxt playground page (",[443,464,465],{},"apps\u002Fplayground\u002Fapp\u002Fpages\u002Fstream.vue",") is exactly that — fork it, restyle, ship.",[427,468,469],{},"The minimum-viable shape, framework-agnostic:",[471,472,477],"pre",{"className":473,"code":474,"language":475,"meta":476,"style":476},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const events: WideEvent[] = []\nconst es = new EventSource('\u002Fapi\u002F_evlog\u002Fstream')\n\nes.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.unshift(env.data)\n    if (events.length > 500) events.length = 500\n    render()\n  }\n}\n\nes.addEventListener('ping', () => {\n  \u002F\u002F heartbeat — connection alive\n})\n","ts","",[443,478,479,509,541,548,578,609,643,690,711,747,756,762,768,773,802,809],{"__ignoreMap":476},[480,481,484,488,492,496,500,503,506],"span",{"class":482,"line":483},"line",1,[480,485,487],{"class":486},"spNyl","const",[480,489,491],{"class":490},"sTEyZ"," events",[480,493,495],{"class":494},"sMK4o",":",[480,497,499],{"class":498},"sBMFI"," WideEvent",[480,501,502],{"class":490},"[] ",[480,504,505],{"class":494},"=",[480,507,508],{"class":490}," []\n",[480,510,512,514,517,519,522,526,529,532,536,538],{"class":482,"line":511},2,[480,513,487],{"class":486},[480,515,516],{"class":490}," es ",[480,518,505],{"class":494},[480,520,521],{"class":494}," new",[480,523,525],{"class":524},"s2Zo4"," EventSource",[480,527,528],{"class":490},"(",[480,530,531],{"class":494},"'",[480,533,535],{"class":534},"sfazB","\u002Fapi\u002F_evlog\u002Fstream",[480,537,531],{"class":494},[480,539,540],{"class":490},")\n",[480,542,544],{"class":482,"line":543},3,[480,545,547],{"emptyLinePlaceholder":546},true,"\n",[480,549,551,554,557,560,563,565,569,572,575],{"class":482,"line":550},4,[480,552,553],{"class":490},"es",[480,555,556],{"class":494},".",[480,558,559],{"class":524},"onmessage",[480,561,562],{"class":494}," =",[480,564,441],{"class":494},[480,566,568],{"class":567},"sHdIc","e",[480,570,571],{"class":494},")",[480,573,574],{"class":486}," =>",[480,576,577],{"class":494}," {\n",[480,579,581,584,587,589,592,594,597,600,602,604,607],{"class":482,"line":580},5,[480,582,583],{"class":486},"  const",[480,585,586],{"class":490}," env",[480,588,562],{"class":494},[480,590,591],{"class":490}," JSON",[480,593,556],{"class":494},[480,595,596],{"class":524},"parse",[480,598,528],{"class":599},"swJcz",[480,601,568],{"class":490},[480,603,556],{"class":494},[480,605,606],{"class":490},"data",[480,608,540],{"class":599},[480,610,612,616,618,621,623,626,629,632,635,637,640],{"class":482,"line":611},6,[480,613,615],{"class":614},"s7zQu","  if",[480,617,441],{"class":599},[480,619,620],{"class":490},"env",[480,622,556],{"class":494},[480,624,625],{"class":490},"evlog",[480,627,628],{"class":494}," !==",[480,630,631],{"class":494}," '",[480,633,634],{"class":534},"1",[480,636,531],{"class":494},[480,638,639],{"class":599},") ",[480,641,642],{"class":614},"return\n",[480,644,646,648,650,652,654,657,660,662,665,667,670,672,674,676,678,680,683,685,687],{"class":482,"line":645},7,[480,647,615],{"class":614},[480,649,441],{"class":599},[480,651,620],{"class":490},[480,653,556],{"class":494},[480,655,656],{"class":490},"type",[480,658,659],{"class":494}," ===",[480,661,631],{"class":494},[480,663,664],{"class":534},"event",[480,666,531],{"class":494},[480,668,669],{"class":494}," ||",[480,671,586],{"class":490},[480,673,556],{"class":494},[480,675,656],{"class":490},[480,677,659],{"class":494},[480,679,631],{"class":494},[480,681,682],{"class":534},"replay",[480,684,531],{"class":494},[480,686,639],{"class":599},[480,688,689],{"class":494},"{\n",[480,691,693,696,698,701,703,705,707,709],{"class":482,"line":692},8,[480,694,695],{"class":490},"    events",[480,697,556],{"class":494},[480,699,700],{"class":524},"unshift",[480,702,528],{"class":599},[480,704,620],{"class":490},[480,706,556],{"class":494},[480,708,606],{"class":490},[480,710,540],{"class":599},[480,712,714,717,719,722,724,727,730,734,736,738,740,742,744],{"class":482,"line":713},9,[480,715,716],{"class":614},"    if",[480,718,441],{"class":599},[480,720,721],{"class":490},"events",[480,723,556],{"class":494},[480,725,726],{"class":490},"length",[480,728,729],{"class":494}," >",[480,731,733],{"class":732},"sbssI"," 500",[480,735,639],{"class":599},[480,737,721],{"class":490},[480,739,556],{"class":494},[480,741,726],{"class":490},[480,743,562],{"class":494},[480,745,746],{"class":732}," 500\n",[480,748,750,753],{"class":482,"line":749},10,[480,751,752],{"class":524},"    render",[480,754,755],{"class":599},"()\n",[480,757,759],{"class":482,"line":758},11,[480,760,761],{"class":494},"  }\n",[480,763,765],{"class":482,"line":764},12,[480,766,767],{"class":494},"}\n",[480,769,771],{"class":482,"line":770},13,[480,772,547],{"emptyLinePlaceholder":546},[480,774,776,778,780,783,785,787,790,792,795,798,800],{"class":482,"line":775},14,[480,777,553],{"class":490},[480,779,556],{"class":494},[480,781,782],{"class":524},"addEventListener",[480,784,528],{"class":490},[480,786,531],{"class":494},[480,788,789],{"class":534},"ping",[480,791,531],{"class":494},[480,793,794],{"class":494},",",[480,796,797],{"class":494}," ()",[480,799,574],{"class":486},[480,801,577],{"class":494},[480,803,805],{"class":482,"line":804},15,[480,806,808],{"class":807},"sHwdD","  \u002F\u002F heartbeat — connection alive\n",[480,810,812,815],{"class":482,"line":811},16,[480,813,814],{"class":494},"}",[480,816,540],{"class":490},[427,818,819,820,822],{},"Build whatever UI you want around ",[443,821,721],{},". React, Vue, Solid, vanilla. Nothing in evlog is opinionated about your renderer.",[452,824,826],{"id":825},"_2-quick-cli-inspection-with-curl-jq","2. Quick CLI inspection with curl + jq",[427,828,829],{},"When you SSH into a self-hosted box, no UI needed:",[471,831,835],{"className":832,"code":833,"language":834,"meta":476,"style":476},"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",[443,836,837,851],{"__ignoreMap":476},[480,838,839,842,845,848],{"class":482,"line":483},[480,840,841],{"class":498},"curl",[480,843,844],{"class":534}," -N",[480,846,847],{"class":534}," http:\u002F\u002Flocalhost:3000\u002Fapi\u002F_evlog\u002Fstream",[480,849,850],{"class":490}," \\\n",[480,852,853,856,859,862,864,867],{"class":482,"line":511},[480,854,855],{"class":494},"  |",[480,857,858],{"class":498}," jq",[480,860,861],{"class":534}," -c",[480,863,631],{"class":494},[480,865,866],{"class":534},"select(.type == \"event\") | .data",[480,868,869],{"class":494},"'\n",[427,871,872],{},"Filter on the client side as needed:",[471,874,876],{"className":832,"code":875,"language":834,"meta":476,"style":476},"# 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",[443,877,878,883,894,909,913,918,928,943,947,952,962],{"__ignoreMap":476},[480,879,880],{"class":482,"line":483},[480,881,882],{"class":807},"# Only errors\n",[480,884,885,887,890,892],{"class":482,"line":511},[480,886,841],{"class":498},[480,888,889],{"class":534}," -sN",[480,891,847],{"class":534},[480,893,850],{"class":490},[480,895,896,898,900,902,904,907],{"class":482,"line":543},[480,897,855],{"class":494},[480,899,858],{"class":498},[480,901,861],{"class":534},[480,903,631],{"class":494},[480,905,906],{"class":534},"select(.type == \"event\" and .data.level == \"error\") | .data",[480,908,869],{"class":494},[480,910,911],{"class":482,"line":550},[480,912,547],{"emptyLinePlaceholder":546},[480,914,915],{"class":482,"line":580},[480,916,917],{"class":807},"# Only one service\n",[480,919,920,922,924,926],{"class":482,"line":611},[480,921,841],{"class":498},[480,923,889],{"class":534},[480,925,847],{"class":534},[480,927,850],{"class":490},[480,929,930,932,934,936,938,941],{"class":482,"line":645},[480,931,855],{"class":494},[480,933,858],{"class":498},[480,935,861],{"class":534},[480,937,631],{"class":494},[480,939,940],{"class":534},"select(.type == \"event\" and .data.service == \"checkout\") | .data",[480,942,869],{"class":494},[480,944,945],{"class":482,"line":692},[480,946,547],{"emptyLinePlaceholder":546},[480,948,949],{"class":482,"line":713},[480,950,951],{"class":807},"# Slow requests\n",[480,953,954,956,958,960],{"class":482,"line":749},[480,955,841],{"class":498},[480,957,889],{"class":534},[480,959,847],{"class":534},[480,961,850],{"class":490},[480,963,964,966,968,970,972,975],{"class":482,"line":758},[480,965,855],{"class":494},[480,967,858],{"class":498},[480,969,861],{"class":534},[480,971,631],{"class":494},[480,973,974],{"class":534},"select(.type == \"event\" and .data.duration > 500) | .data",[480,976,869],{"class":494},[427,978,979,982,983,985,986,989],{},[443,980,981],{},"-N"," keeps ",[443,984,841],{}," in streaming mode (no buffering). ",[443,987,988],{},"-s"," is silent.",[452,991,993],{"id":992},"_3-replay-history-then-go-live","3. Replay history then go live",[427,995,996],{},"History on disk (filesystem drain) + live updates from the SSE bridge = a full picture from any point in time.",[471,998,1000],{"className":473,"code":999,"language":475,"meta":476,"style":476},"import { readFsLogs } from 'evlog\u002Ffs'\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('\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",[443,1001,1002,1026,1030,1067,1072,1117,1151,1162,1166,1170,1175,1198,1219,1244,1268,1308,1323,1329,1334,1353],{"__ignoreMap":476},[480,1003,1004,1007,1010,1013,1016,1019,1021,1024],{"class":482,"line":483},[480,1005,1006],{"class":614},"import",[480,1008,1009],{"class":494}," {",[480,1011,1012],{"class":490}," readFsLogs",[480,1014,1015],{"class":494}," }",[480,1017,1018],{"class":614}," from",[480,1020,631],{"class":494},[480,1022,1023],{"class":534},"evlog\u002Ffs",[480,1025,869],{"class":494},[480,1027,1028],{"class":482,"line":511},[480,1029,547],{"emptyLinePlaceholder":546},[480,1031,1032,1035,1038,1041,1043,1046,1048,1050,1052,1054,1056,1058,1060,1063,1065],{"class":482,"line":543},[480,1033,1034],{"class":486},"async",[480,1036,1037],{"class":486}," function",[480,1039,1040],{"class":524}," bootstrap",[480,1042,528],{"class":494},[480,1044,1045],{"class":524},"handle",[480,1047,495],{"class":494},[480,1049,441],{"class":494},[480,1051,568],{"class":567},[480,1053,495],{"class":494},[480,1055,499],{"class":498},[480,1057,571],{"class":494},[480,1059,574],{"class":486},[480,1061,1062],{"class":498}," void",[480,1064,571],{"class":494},[480,1066,577],{"class":494},[480,1068,1069],{"class":482,"line":550},[480,1070,1071],{"class":807},"  \u002F\u002F 1. Replay the last hour from `.evlog\u002Flogs\u002F`\n",[480,1073,1074,1076,1079,1081,1083,1086,1088,1091,1093,1096,1099,1102,1105,1108,1110,1112,1115],{"class":482,"line":580},[480,1075,583],{"class":486},[480,1077,1078],{"class":490}," since",[480,1080,562],{"class":494},[480,1082,521],{"class":494},[480,1084,1085],{"class":524}," Date",[480,1087,528],{"class":599},[480,1089,1090],{"class":490},"Date",[480,1092,556],{"class":494},[480,1094,1095],{"class":524},"now",[480,1097,1098],{"class":599},"() ",[480,1100,1101],{"class":494},"-",[480,1103,1104],{"class":732}," 60",[480,1106,1107],{"class":494}," *",[480,1109,1104],{"class":732},[480,1111,1107],{"class":494},[480,1113,1114],{"class":732}," 1000",[480,1116,540],{"class":599},[480,1118,1119,1122,1125,1127,1129,1132,1135,1137,1139,1142,1144,1146,1149],{"class":482,"line":611},[480,1120,1121],{"class":614},"  for",[480,1123,1124],{"class":614}," await",[480,1126,441],{"class":599},[480,1128,487],{"class":486},[480,1130,1131],{"class":490}," event",[480,1133,1134],{"class":494}," of",[480,1136,1012],{"class":524},[480,1138,528],{"class":599},[480,1140,1141],{"class":494},"{",[480,1143,1078],{"class":490},[480,1145,1015],{"class":494},[480,1147,1148],{"class":599},")) ",[480,1150,689],{"class":494},[480,1152,1153,1156,1158,1160],{"class":482,"line":645},[480,1154,1155],{"class":524},"    handle",[480,1157,528],{"class":599},[480,1159,664],{"class":490},[480,1161,540],{"class":599},[480,1163,1164],{"class":482,"line":692},[480,1165,761],{"class":494},[480,1167,1168],{"class":482,"line":713},[480,1169,547],{"emptyLinePlaceholder":546},[480,1171,1172],{"class":482,"line":749},[480,1173,1174],{"class":807},"  \u002F\u002F 2. Switch to the live SSE stream\n",[480,1176,1177,1179,1182,1184,1186,1188,1190,1192,1194,1196],{"class":482,"line":758},[480,1178,583],{"class":486},[480,1180,1181],{"class":490}," es",[480,1183,562],{"class":494},[480,1185,521],{"class":494},[480,1187,525],{"class":524},[480,1189,528],{"class":599},[480,1191,531],{"class":494},[480,1193,535],{"class":534},[480,1195,531],{"class":494},[480,1197,540],{"class":599},[480,1199,1200,1203,1205,1207,1209,1211,1213,1215,1217],{"class":482,"line":764},[480,1201,1202],{"class":490},"  es",[480,1204,556],{"class":494},[480,1206,559],{"class":524},[480,1208,562],{"class":494},[480,1210,441],{"class":494},[480,1212,568],{"class":567},[480,1214,571],{"class":494},[480,1216,574],{"class":486},[480,1218,577],{"class":494},[480,1220,1221,1224,1226,1228,1230,1232,1234,1236,1238,1240,1242],{"class":482,"line":770},[480,1222,1223],{"class":486},"    const",[480,1225,586],{"class":490},[480,1227,562],{"class":494},[480,1229,591],{"class":490},[480,1231,556],{"class":494},[480,1233,596],{"class":524},[480,1235,528],{"class":599},[480,1237,568],{"class":490},[480,1239,556],{"class":494},[480,1241,606],{"class":490},[480,1243,540],{"class":599},[480,1245,1246,1248,1250,1252,1254,1256,1258,1260,1262,1264,1266],{"class":482,"line":775},[480,1247,716],{"class":614},[480,1249,441],{"class":599},[480,1251,620],{"class":490},[480,1253,556],{"class":494},[480,1255,625],{"class":490},[480,1257,628],{"class":494},[480,1259,631],{"class":494},[480,1261,634],{"class":534},[480,1263,531],{"class":494},[480,1265,639],{"class":599},[480,1267,642],{"class":614},[480,1269,1270,1272,1274,1276,1278,1280,1282,1284,1286,1288,1290,1292,1294,1296,1298,1300,1302,1304,1306],{"class":482,"line":804},[480,1271,716],{"class":614},[480,1273,441],{"class":599},[480,1275,620],{"class":490},[480,1277,556],{"class":494},[480,1279,656],{"class":490},[480,1281,659],{"class":494},[480,1283,631],{"class":494},[480,1285,664],{"class":534},[480,1287,531],{"class":494},[480,1289,669],{"class":494},[480,1291,586],{"class":490},[480,1293,556],{"class":494},[480,1295,656],{"class":490},[480,1297,659],{"class":494},[480,1299,631],{"class":494},[480,1301,682],{"class":534},[480,1303,531],{"class":494},[480,1305,639],{"class":599},[480,1307,689],{"class":494},[480,1309,1310,1313,1315,1317,1319,1321],{"class":482,"line":811},[480,1311,1312],{"class":524},"      handle",[480,1314,528],{"class":599},[480,1316,620],{"class":490},[480,1318,556],{"class":494},[480,1320,606],{"class":490},[480,1322,540],{"class":599},[480,1324,1326],{"class":482,"line":1325},17,[480,1327,1328],{"class":494},"    }\n",[480,1330,1332],{"class":482,"line":1331},18,[480,1333,761],{"class":494},[480,1335,1337,1340,1342,1344,1346,1348,1351],{"class":482,"line":1336},19,[480,1338,1339],{"class":614},"  return",[480,1341,797],{"class":494},[480,1343,574],{"class":486},[480,1345,1181],{"class":490},[480,1347,556],{"class":494},[480,1349,1350],{"class":524},"close",[480,1352,755],{"class":599},[480,1354,1356],{"class":482,"line":1355},20,[480,1357,767],{"class":494},[427,1359,1360,1362,1363,1366],{},[443,1361,445],{}," 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 ",[443,1364,1365],{},"?since=\u003Ciso>"," to reuse the in-process ring buffer instead.",[452,1368,1370],{"id":1369},"_4-filter-transform-aggregate-on-the-consumer","4. Filter, transform, aggregate on the consumer",[427,1372,1373],{},"Keep the bridge dumb — every consumer picks what it cares about:",[471,1375,1377],{"className":473,"code":1376,"language":475,"meta":476,"style":476},"\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",[443,1378,1379,1384,1426,1430,1435,1491,1495,1500,1533,1537,1542,1570,1623,1627,1632,1644,1682],{"__ignoreMap":476},[480,1380,1381],{"class":482,"line":483},[480,1382,1383],{"class":807},"\u002F\u002F Just errors\n",[480,1385,1386,1388,1391,1393,1395,1397,1400,1402,1404,1406,1409,1411,1414,1417,1419,1422,1424],{"class":482,"line":511},[480,1387,487],{"class":486},[480,1389,1390],{"class":490}," errors ",[480,1392,505],{"class":494},[480,1394,491],{"class":490},[480,1396,556],{"class":494},[480,1398,1399],{"class":524},"filter",[480,1401,528],{"class":490},[480,1403,568],{"class":567},[480,1405,574],{"class":486},[480,1407,1408],{"class":490}," e",[480,1410,556],{"class":494},[480,1412,1413],{"class":490},"level ",[480,1415,1416],{"class":494},"===",[480,1418,631],{"class":494},[480,1420,1421],{"class":534},"error",[480,1423,531],{"class":494},[480,1425,540],{"class":490},[480,1427,1428],{"class":482,"line":543},[480,1429,547],{"emptyLinePlaceholder":546},[480,1431,1432],{"class":482,"line":550},[480,1433,1434],{"class":807},"\u002F\u002F Slow requests\n",[480,1436,1437,1439,1442,1444,1446,1448,1450,1452,1454,1456,1459,1461,1463,1466,1468,1470,1473,1475,1478,1480,1482,1484,1487,1489],{"class":482,"line":580},[480,1438,487],{"class":486},[480,1440,1441],{"class":490}," slowReqs ",[480,1443,505],{"class":494},[480,1445,491],{"class":490},[480,1447,556],{"class":494},[480,1449,1399],{"class":524},[480,1451,528],{"class":490},[480,1453,568],{"class":567},[480,1455,574],{"class":486},[480,1457,1458],{"class":494}," typeof",[480,1460,1408],{"class":490},[480,1462,556],{"class":494},[480,1464,1465],{"class":490},"duration ",[480,1467,1416],{"class":494},[480,1469,631],{"class":494},[480,1471,1472],{"class":534},"number",[480,1474,531],{"class":494},[480,1476,1477],{"class":494}," &&",[480,1479,1408],{"class":490},[480,1481,556],{"class":494},[480,1483,1465],{"class":490},[480,1485,1486],{"class":494},">",[480,1488,733],{"class":732},[480,1490,540],{"class":490},[480,1492,1493],{"class":482,"line":611},[480,1494,547],{"emptyLinePlaceholder":546},[480,1496,1497],{"class":482,"line":645},[480,1498,1499],{"class":807},"\u002F\u002F Group by service\n",[480,1501,1502,1504,1507,1509,1512,1514,1517,1520,1522,1524,1526,1528,1530],{"class":482,"line":692},[480,1503,487],{"class":486},[480,1505,1506],{"class":490}," byService ",[480,1508,505],{"class":494},[480,1510,1511],{"class":490}," Object",[480,1513,556],{"class":494},[480,1515,1516],{"class":524},"groupBy",[480,1518,1519],{"class":490},"(events",[480,1521,794],{"class":494},[480,1523,1408],{"class":567},[480,1525,574],{"class":486},[480,1527,1408],{"class":490},[480,1529,556],{"class":494},[480,1531,1532],{"class":490},"service)\n",[480,1534,1535],{"class":482,"line":713},[480,1536,547],{"emptyLinePlaceholder":546},[480,1538,1539],{"class":482,"line":749},[480,1540,1541],{"class":807},"\u002F\u002F Rolling error rate (last 100 events)\n",[480,1543,1544,1546,1549,1551,1553,1555,1558,1560,1563,1565,1568],{"class":482,"line":758},[480,1545,487],{"class":486},[480,1547,1548],{"class":490}," last100 ",[480,1550,505],{"class":494},[480,1552,491],{"class":490},[480,1554,556],{"class":494},[480,1556,1557],{"class":524},"slice",[480,1559,528],{"class":490},[480,1561,1562],{"class":732},"0",[480,1564,794],{"class":494},[480,1566,1567],{"class":732}," 100",[480,1569,540],{"class":490},[480,1571,1572,1574,1577,1579,1582,1584,1586,1588,1590,1592,1594,1596,1598,1600,1602,1604,1606,1608,1610,1613,1616,1618,1620],{"class":482,"line":764},[480,1573,487],{"class":486},[480,1575,1576],{"class":490}," errorRate ",[480,1578,505],{"class":494},[480,1580,1581],{"class":490}," last100",[480,1583,556],{"class":494},[480,1585,1399],{"class":524},[480,1587,528],{"class":490},[480,1589,568],{"class":567},[480,1591,574],{"class":486},[480,1593,1408],{"class":490},[480,1595,556],{"class":494},[480,1597,1413],{"class":490},[480,1599,1416],{"class":494},[480,1601,631],{"class":494},[480,1603,1421],{"class":534},[480,1605,531],{"class":494},[480,1607,571],{"class":490},[480,1609,556],{"class":494},[480,1611,1612],{"class":490},"length ",[480,1614,1615],{"class":494},"\u002F",[480,1617,1581],{"class":490},[480,1619,556],{"class":494},[480,1621,1622],{"class":490},"length\n",[480,1624,1625],{"class":482,"line":770},[480,1626,547],{"emptyLinePlaceholder":546},[480,1628,1629],{"class":482,"line":775},[480,1630,1631],{"class":807},"\u002F\u002F Ad-hoc cost analytics — works because evlog\u002Fai writes ai.* fields on every AI call\n",[480,1633,1634,1636,1639,1641],{"class":482,"line":804},[480,1635,487],{"class":486},[480,1637,1638],{"class":490}," totalCost ",[480,1640,505],{"class":494},[480,1642,1643],{"class":490}," events\n",[480,1645,1646,1649,1651,1653,1655,1657,1659,1661,1663,1666,1669,1672,1674,1676,1678,1680],{"class":482,"line":811},[480,1647,1648],{"class":494},"  .",[480,1650,1399],{"class":524},[480,1652,528],{"class":490},[480,1654,568],{"class":567},[480,1656,574],{"class":486},[480,1658,1458],{"class":494},[480,1660,1408],{"class":490},[480,1662,556],{"class":494},[480,1664,1665],{"class":490},"ai",[480,1667,1668],{"class":494},"?.",[480,1670,1671],{"class":490},"estimatedCost ",[480,1673,1416],{"class":494},[480,1675,631],{"class":494},[480,1677,1472],{"class":534},[480,1679,531],{"class":494},[480,1681,540],{"class":490},[480,1683,1684,1686,1689,1691,1693,1696,1698,1700,1702,1704,1707,1710,1713,1715,1717,1719,1721,1724,1727,1729,1731,1734],{"class":482,"line":1325},[480,1685,1648],{"class":494},[480,1687,1688],{"class":524},"reduce",[480,1690,528],{"class":490},[480,1692,528],{"class":494},[480,1694,1695],{"class":567},"sum",[480,1697,794],{"class":494},[480,1699,1408],{"class":567},[480,1701,571],{"class":494},[480,1703,574],{"class":486},[480,1705,1706],{"class":490}," sum ",[480,1708,1709],{"class":494},"+",[480,1711,1712],{"class":490}," (e",[480,1714,556],{"class":494},[480,1716,1665],{"class":490},[480,1718,1668],{"class":494},[480,1720,1671],{"class":490},[480,1722,1723],{"class":614},"as",[480,1725,1726],{"class":498}," number",[480,1728,571],{"class":490},[480,1730,794],{"class":494},[480,1732,1733],{"class":732}," 0",[480,1735,540],{"class":490},[427,1737,1738,1739,1741],{},"For complex transforms (rolling windows, percentiles, derived series), use a lib (rxjs, observable, anything async-iterator-friendly) on top of the same ",[443,1740,461],{}," source.",[452,1743,1745],{"id":1744},"_5-self-hosted-tail-f-replacement","5. Self-hosted \"tail -f\" replacement",[427,1747,1748],{},"Skip the SSE bridge entirely if the consumer runs on the same machine:",[471,1750,1752],{"className":473,"code":1751,"language":475,"meta":476,"style":476},"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",[443,1753,1754,1773,1777,1793,1829,1833,1874,1879,1911],{"__ignoreMap":476},[480,1755,1756,1758,1760,1763,1765,1767,1769,1771],{"class":482,"line":483},[480,1757,1006],{"class":614},[480,1759,1009],{"class":494},[480,1761,1762],{"class":490}," tailFsLogs",[480,1764,1015],{"class":494},[480,1766,1018],{"class":614},[480,1768,631],{"class":494},[480,1770,1023],{"class":534},[480,1772,869],{"class":494},[480,1774,1775],{"class":482,"line":511},[480,1776,547],{"emptyLinePlaceholder":546},[480,1778,1779,1781,1784,1786,1788,1791],{"class":482,"line":543},[480,1780,487],{"class":486},[480,1782,1783],{"class":490}," ac ",[480,1785,505],{"class":494},[480,1787,521],{"class":494},[480,1789,1790],{"class":524}," AbortController",[480,1792,755],{"class":490},[480,1794,1795,1798,1800,1803,1805,1807,1810,1812,1814,1816,1818,1821,1823,1826],{"class":482,"line":550},[480,1796,1797],{"class":490},"process",[480,1799,556],{"class":494},[480,1801,1802],{"class":524},"on",[480,1804,528],{"class":490},[480,1806,531],{"class":494},[480,1808,1809],{"class":534},"SIGINT",[480,1811,531],{"class":494},[480,1813,794],{"class":494},[480,1815,797],{"class":494},[480,1817,574],{"class":486},[480,1819,1820],{"class":490}," ac",[480,1822,556],{"class":494},[480,1824,1825],{"class":524},"abort",[480,1827,1828],{"class":490},"())\n",[480,1830,1831],{"class":482,"line":580},[480,1832,547],{"emptyLinePlaceholder":546},[480,1834,1835,1838,1840,1842,1844,1847,1850,1852,1854,1856,1859,1861,1863,1865,1868,1870,1872],{"class":482,"line":611},[480,1836,1837],{"class":614},"for",[480,1839,1124],{"class":614},[480,1841,441],{"class":490},[480,1843,487],{"class":486},[480,1845,1846],{"class":490}," event ",[480,1848,1849],{"class":494},"of",[480,1851,1762],{"class":524},[480,1853,528],{"class":490},[480,1855,1141],{"class":494},[480,1857,1858],{"class":599}," signal",[480,1860,495],{"class":494},[480,1862,1820],{"class":490},[480,1864,556],{"class":494},[480,1866,1867],{"class":490},"signal ",[480,1869,814],{"class":494},[480,1871,1148],{"class":490},[480,1873,689],{"class":494},[480,1875,1876],{"class":482,"line":645},[480,1877,1878],{"class":807},"  \u002F\u002F Process every wide event as it lands on disk\n",[480,1880,1881,1883,1885,1887,1889,1892,1894,1896,1898,1900,1902,1905,1907,1909],{"class":482,"line":692},[480,1882,615],{"class":614},[480,1884,441],{"class":599},[480,1886,664],{"class":490},[480,1888,556],{"class":494},[480,1890,1891],{"class":490},"level",[480,1893,659],{"class":494},[480,1895,631],{"class":494},[480,1897,1421],{"class":534},[480,1899,531],{"class":494},[480,1901,639],{"class":599},[480,1903,1904],{"class":524},"notifyOps",[480,1906,528],{"class":599},[480,1908,664],{"class":490},[480,1910,540],{"class":599},[480,1912,1913],{"class":482,"line":713},[480,1914,767],{"class":494},[427,1916,1917],{},"Works without instrumenting the running app — useful for sidecar \u002F observer processes that watch a directory.",[452,1919,1921],{"id":1920},"what-not-to-do","What not to do",[1923,1924,1925,1933,1939],"ul",{},[1926,1927,1928,1932],"li",{},[1929,1930,1931],"strong",{},"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.",[1926,1934,1935,1938],{},[1929,1936,1937],{},"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.",[1926,1940,1941,1944],{},[1929,1942,1943],{},"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.",[1946,1947,1948],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .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 .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 .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);}",{"title":476,"searchDepth":511,"depth":511,"links":1950},[1951,1952,1953,1954,1955,1956],{"id":454,"depth":511,"text":455},{"id":825,"depth":511,"text":826},{"id":992,"depth":511,"text":993},{"id":1369,"depth":511,"text":1370},{"id":1744,"depth":511,"text":1745},{"id":1920,"depth":511,"text":1921},"Concrete copy-paste recipes built on top of the in-process stream and the SSE bridge — devtools, curl one-liners, replay-then-live, and consumer-side analytics.","md",null,{},{"title":156,"icon":317},{"title":156,"description":1957},"y_ZZHOU7kvPv7zlIptRjWUEhTSBhTbdogN3yTV8ClVY",[1965,1967],{"title":310,"path":311,"stem":312,"description":1966,"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":1968,"icon":44,"children":-1},"Send your logs to external services with evlog adapters. Built-in support for popular observability platforms and custom destinations.",1778330173596]