[{"data":1,"prerenderedAt":1979},["ShallowReactive",2],{"navigation_docs":3,"-build-on-top-stream":427,"-build-on-top-stream-surround":1974},[4,35,159,201,289,324,411],{"title":5,"path":6,"stem":7,"children":8,"page":34},"Getting Started","\u002Fgetting-started","1.getting-started",[9,14,19,24,29],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Quick Start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start","i-lucide-zap",{"title":25,"path":26,"stem":27,"icon":28},"Agent Skills","\u002Fgetting-started\u002Fagent-skills","1.getting-started\u002F4.agent-skills","i-lucide-sparkles",{"title":30,"path":31,"stem":32,"icon":33},"vs Other Loggers","\u002Fgetting-started\u002Fvs-other-loggers","1.getting-started\u002F5.vs-other-loggers","i-lucide-scale",false,{"title":36,"path":37,"stem":38,"children":39,"page":34},"Logging","\u002Flogging","2.logging",[40,45,50,55,60,65,70,99,127],{"title":41,"path":42,"stem":43,"icon":44},"Overview","\u002Flogging\u002Foverview","2.logging\u002F0.overview","i-lucide-list",{"title":46,"path":47,"stem":48,"icon":49},"Simple Logging","\u002Flogging\u002Fsimple-logging","2.logging\u002F1.simple-logging","i-lucide-terminal",{"title":51,"path":52,"stem":53,"icon":54},"Wide Events","\u002Flogging\u002Fwide-events","2.logging\u002F2.wide-events","i-lucide-layers",{"title":56,"path":57,"stem":58,"icon":59},"Structured Errors","\u002Flogging\u002Fstructured-errors","2.logging\u002F3.structured-errors","i-lucide-shield-alert",{"title":61,"path":62,"stem":63,"icon":64},"Catalogs","\u002Flogging\u002Fcatalogs","2.logging\u002F4.catalogs","i-lucide-book-open",{"title":66,"path":67,"stem":68,"icon":69},"Client Logging","\u002Flogging\u002Fclient-logging","2.logging\u002F5.client-logging","i-lucide-monitor",{"title":71,"icon":72,"path":73,"stem":74,"children":75,"page":34},"AI SDK","i-simple-icons-vercel","\u002Flogging\u002Fai-sdk","2.logging\u002F6.ai-sdk",[76,79,84,89,94],{"title":41,"path":77,"stem":78,"icon":44},"\u002Flogging\u002Fai-sdk\u002Foverview","2.logging\u002F6.ai-sdk\u002F01.overview",{"title":80,"path":81,"stem":82,"icon":83},"Usage","\u002Flogging\u002Fai-sdk\u002Fusage","2.logging\u002F6.ai-sdk\u002F02.usage","i-lucide-code",{"title":85,"path":86,"stem":87,"icon":88},"Options","\u002Flogging\u002Fai-sdk\u002Foptions","2.logging\u002F6.ai-sdk\u002F03.options","i-lucide-sliders",{"title":90,"path":91,"stem":92,"icon":93},"Metadata","\u002Flogging\u002Fai-sdk\u002Fmetadata","2.logging\u002F6.ai-sdk\u002F04.metadata","i-lucide-database",{"title":95,"path":96,"stem":97,"icon":98},"Telemetry","\u002Flogging\u002Fai-sdk\u002Ftelemetry","2.logging\u002F6.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":100,"icon":101,"path":102,"stem":103,"children":104,"page":34},"Better Auth","i-simple-icons-betterauth","\u002Flogging\u002Fbetter-auth","2.logging\u002F7.better-auth",[105,108,113,118,122],{"title":41,"path":106,"stem":107,"icon":44},"\u002Flogging\u002Fbetter-auth\u002Foverview","2.logging\u002F7.better-auth\u002F01.overview",{"title":109,"path":110,"stem":111,"icon":112},"Identify User","\u002Flogging\u002Fbetter-auth\u002Fidentify-user","2.logging\u002F7.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":114,"path":115,"stem":116,"icon":117},"Middleware","\u002Flogging\u002Fbetter-auth\u002Fmiddleware","2.logging\u002F7.better-auth\u002F03.middleware","i-lucide-shield",{"title":119,"path":120,"stem":121,"icon":69},"Client Sync","\u002Flogging\u002Fbetter-auth\u002Fclient-sync","2.logging\u002F7.better-auth\u002F04.client-sync",{"title":123,"path":124,"stem":125,"icon":126},"Performance","\u002Flogging\u002Fbetter-auth\u002Fperformance","2.logging\u002F7.better-auth\u002F05.performance","i-lucide-gauge",{"title":128,"icon":129,"path":130,"stem":131,"children":132,"page":34},"Audit Logs","i-lucide-shield-check","\u002Flogging\u002Faudit","2.logging\u002F8.audit",[133,136,141,146,151,155],{"title":41,"path":134,"stem":135,"icon":44},"\u002Flogging\u002Faudit\u002Foverview","2.logging\u002F8.audit\u002F01.overview",{"title":137,"path":138,"stem":139,"icon":140},"Schema","\u002Flogging\u002Faudit\u002Fschema","2.logging\u002F8.audit\u002F02.schema","i-lucide-file-text",{"title":142,"path":143,"stem":144,"icon":145},"Recording","\u002Flogging\u002Faudit\u002Frecording","2.logging\u002F8.audit\u002F03.recording","i-lucide-pen-line",{"title":147,"path":148,"stem":149,"icon":150},"Drains","\u002Flogging\u002Faudit\u002Fpipeline","2.logging\u002F8.audit\u002F04.pipeline","i-lucide-link",{"title":152,"path":153,"stem":154,"icon":129},"Compliance","\u002Flogging\u002Faudit\u002Fcompliance","2.logging\u002F8.audit\u002F05.compliance",{"title":156,"path":157,"stem":158,"icon":64},"Recipes","\u002Flogging\u002Faudit\u002Frecipes","2.logging\u002F8.audit\u002F06.recipes",{"title":160,"path":161,"stem":162,"children":163,"page":34},"Core Concepts","\u002Fcore-concepts","3.core-concepts",[164,169,174,179,184,188,191,196],{"title":165,"path":166,"stem":167,"icon":168},"Lifecycle","\u002Fcore-concepts\u002Flifecycle","3.core-concepts\u002F0.lifecycle","i-lucide-arrow-right-left",{"title":170,"path":171,"stem":172,"icon":173},"Configuration","\u002Fcore-concepts\u002Fconfiguration","3.core-concepts\u002F1.configuration","i-lucide-settings",{"title":175,"path":176,"stem":177,"icon":178},"Sampling","\u002Fcore-concepts\u002Fsampling","3.core-concepts\u002F2.sampling","i-lucide-filter",{"title":180,"path":181,"stem":182,"icon":183},"Typed Fields","\u002Fcore-concepts\u002Ftyped-fields","3.core-concepts\u002F3.typed-fields","i-simple-icons-typescript",{"title":185,"path":186,"stem":187,"icon":129},"Best Practices","\u002Fcore-concepts\u002Fbest-practices","3.core-concepts\u002F4.best-practices",{"title":123,"path":189,"stem":190,"icon":126},"\u002Fcore-concepts\u002Fperformance","3.core-concepts\u002F5.performance",{"title":192,"path":193,"stem":194,"icon":195},"Vite Plugin","\u002Fcore-concepts\u002Fvite-plugin","3.core-concepts\u002F6.vite-plugin","i-custom-vite",{"title":197,"path":198,"stem":199,"icon":200},"Auto-Redaction","\u002Fcore-concepts\u002Fredaction","3.core-concepts\u002F7.redaction","i-lucide-eye-off",{"title":202,"path":203,"stem":204,"children":205,"page":34},"Frameworks","\u002Fframeworks","4.frameworks",[206,210,215,220,225,230,235,240,245,250,255,260,265,270,274,279,284],{"title":41,"path":207,"stem":208,"icon":209},"\u002Fframeworks\u002Foverview","4.frameworks\u002F00.overview","i-lucide-layout-grid",{"title":211,"path":212,"stem":213,"icon":214},"Nuxt","\u002Fframeworks\u002Fnuxt","4.frameworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":216,"path":217,"stem":218,"icon":219},"Next.js","\u002Fframeworks\u002Fnextjs","4.frameworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":221,"path":222,"stem":223,"icon":224},"SvelteKit","\u002Fframeworks\u002Fsveltekit","4.frameworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":226,"path":227,"stem":228,"icon":229},"Nitro","\u002Fframeworks\u002Fnitro","4.frameworks\u002F04.nitro","i-custom-nitro",{"title":231,"path":232,"stem":233,"icon":234},"TanStack Start","\u002Fframeworks\u002Ftanstack-start","4.frameworks\u002F05.tanstack-start","i-custom-tanstack",{"title":236,"path":237,"stem":238,"icon":239},"NestJS","\u002Fframeworks\u002Fnestjs","4.frameworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":241,"path":242,"stem":243,"icon":244},"Express","\u002Fframeworks\u002Fexpress","4.frameworks\u002F07.express","i-simple-icons-express",{"title":246,"path":247,"stem":248,"icon":249},"Hono","\u002Fframeworks\u002Fhono","4.frameworks\u002F08.hono","i-simple-icons-hono",{"title":251,"path":252,"stem":253,"icon":254},"Fastify","\u002Fframeworks\u002Ffastify","4.frameworks\u002F09.fastify","i-simple-icons-fastify",{"title":256,"path":257,"stem":258,"icon":259},"Elysia","\u002Fframeworks\u002Felysia","4.frameworks\u002F10.elysia","i-custom-elysia",{"title":261,"path":262,"stem":263,"icon":264},"React Router","\u002Fframeworks\u002Freact-router","4.frameworks\u002F11.react-router","i-custom-reactrouter",{"title":266,"path":267,"stem":268,"icon":269},"Cloudflare Workers","\u002Fframeworks\u002Fcloudflare-workers","4.frameworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":271,"path":272,"stem":273,"icon":183},"Standalone","\u002Fframeworks\u002Fstandalone","4.frameworks\u002F13.standalone",{"title":275,"path":276,"stem":277,"icon":278},"Astro","\u002Fframeworks\u002Fastro","4.frameworks\u002F14.astro","i-simple-icons-astro",{"title":280,"path":281,"stem":282,"icon":283},"AWS Lambda","\u002Fframeworks\u002Faws-lambda","4.frameworks\u002F16.aws-lambda","i-custom-lambda",{"title":285,"path":286,"stem":287,"icon":288},"Custom Integration","\u002Fframeworks\u002Fcustom-integration","4.frameworks\u002F17.custom-integration","i-lucide-puzzle",{"title":290,"path":291,"stem":292,"children":293,"page":34},"Build on top","\u002Fbuild-on-top","5.build-on-top",[294,297,302,307,311,315,320],{"title":41,"path":295,"stem":296,"icon":54},"\u002Fbuild-on-top\u002Foverview","5.build-on-top\u002F0.overview",{"title":298,"path":299,"stem":300,"icon":301},"Stream","\u002Fbuild-on-top\u002Fstream","5.build-on-top\u002F1.stream","i-lucide-radio-tower",{"title":303,"path":304,"stem":305,"icon":306},"FS reader","\u002Fbuild-on-top\u002Ffs-reader","5.build-on-top\u002F2.fs-reader","i-lucide-folder-search",{"title":156,"path":308,"stem":309,"icon":310},"\u002Fbuild-on-top\u002Fconsumer-recipes","5.build-on-top\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":312,"path":313,"stem":314,"icon":288},"Pipeline extension","\u002Fbuild-on-top\u002Fpipeline-extension","5.build-on-top\u002F4.pipeline-extension",{"title":316,"path":317,"stem":318,"icon":319},"Sinks","\u002Fbuild-on-top\u002Fsinks","5.build-on-top\u002F5.sinks","i-lucide-share-2",{"title":321,"path":322,"stem":323,"icon":288},"Framework integration","\u002Fbuild-on-top\u002Fframework-integration","5.build-on-top\u002F6.framework-integration",{"title":325,"path":326,"stem":327,"children":328,"page":34},"Adapters","\u002Fadapters","6.adapters",[329,332,372,387],{"title":41,"path":330,"stem":331,"icon":44},"\u002Fadapters\u002Foverview","6.adapters\u002F01.overview",{"title":333,"path":334,"stem":335,"children":336,"page":34},"Cloud destinations","\u002Fadapters\u002Fcloud","6.adapters\u002F02.cloud",[337,342,347,352,357,362,367],{"title":338,"path":339,"stem":340,"icon":341},"Axiom","\u002Fadapters\u002Fcloud\u002Faxiom","6.adapters\u002F02.cloud\u002F01.axiom","i-custom-axiom",{"title":343,"path":344,"stem":345,"icon":346},"OTLP","\u002Fadapters\u002Fcloud\u002Fotlp","6.adapters\u002F02.cloud\u002F02.otlp","i-simple-icons-opentelemetry",{"title":348,"path":349,"stem":350,"icon":351},"PostHog","\u002Fadapters\u002Fcloud\u002Fposthog","6.adapters\u002F02.cloud\u002F03.posthog","i-simple-icons-posthog",{"title":353,"path":354,"stem":355,"icon":356},"Sentry","\u002Fadapters\u002Fcloud\u002Fsentry","6.adapters\u002F02.cloud\u002F04.sentry","i-simple-icons-sentry",{"title":358,"path":359,"stem":360,"icon":361},"Better Stack","\u002Fadapters\u002Fcloud\u002Fbetter-stack","6.adapters\u002F02.cloud\u002F05.better-stack","i-simple-icons-betterstack",{"title":363,"path":364,"stem":365,"icon":366},"Datadog","\u002Fadapters\u002Fcloud\u002Fdatadog","6.adapters\u002F02.cloud\u002F06.datadog","i-simple-icons-datadog",{"title":368,"path":369,"stem":370,"icon":371},"HyperDX","\u002Fadapters\u002Fcloud\u002Fhyperdx","6.adapters\u002F02.cloud\u002F07.hyperdx","i-custom-hyperdx",{"title":373,"path":374,"stem":375,"children":376,"page":34},"Self-hosted","\u002Fadapters\u002Fself-hosted","6.adapters\u002F03.self-hosted",[377,382],{"title":378,"path":379,"stem":380,"icon":381},"File System","\u002Fadapters\u002Fself-hosted\u002Ffs","6.adapters\u002F03.self-hosted\u002F01.fs","i-lucide-hard-drive",{"title":383,"path":384,"stem":385,"icon":386},"NuxtHub","\u002Fadapters\u002Fself-hosted\u002Fnuxthub","6.adapters\u002F03.self-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":388,"path":389,"stem":390,"children":391,"page":34},"Building blocks","\u002Fadapters\u002Fbuilding-blocks","6.adapters\u002F04.building-blocks",[392,397,402,406],{"title":393,"path":394,"stem":395,"icon":396},"Pipeline","\u002Fadapters\u002Fbuilding-blocks\u002Fpipeline","6.adapters\u002F04.building-blocks\u002F01.pipeline","i-lucide-workflow",{"title":398,"path":399,"stem":400,"icon":401},"HTTP","\u002Fadapters\u002Fbuilding-blocks\u002Fhttp","6.adapters\u002F04.building-blocks\u002F02.http","i-lucide-globe",{"title":403,"path":404,"stem":405,"icon":83},"Custom Adapters","\u002Fadapters\u002Fbuilding-blocks\u002Fcustom","6.adapters\u002F04.building-blocks\u002F03.custom",{"title":407,"path":408,"stem":409,"icon":410},"Toolkit","\u002Fadapters\u002Fbuilding-blocks\u002Ftoolkit","6.adapters\u002F04.building-blocks\u002F04.toolkit","i-lucide-blocks",{"title":412,"path":413,"stem":414,"children":415,"page":34},"Enrichers","\u002Fenrichers","7.enrichers",[416,419,423],{"title":41,"path":417,"stem":418,"icon":28},"\u002Fenrichers\u002Foverview","7.enrichers\u002F1.overview",{"title":420,"path":421,"stem":422,"icon":288},"Built-in","\u002Fenrichers\u002Fbuilt-in","7.enrichers\u002F2.built-in",{"title":424,"path":425,"stem":426,"icon":83},"Custom","\u002Fenrichers\u002Fcustom","7.enrichers\u002F3.custom",{"id":428,"title":298,"body":429,"description":1967,"extension":1968,"links":1969,"meta":1970,"navigation":1971,"path":299,"seo":1972,"stem":300,"__hash__":1973},"docs\u002F5.build-on-top\u002F1.stream.md",{"type":430,"value":431,"toc":1954},"minimark",[432,441,465,480,484,487,492,569,888,892,979,988,992,995,1004,1010,1080,1084,1090,1128,1131,1135,1404,1417,1421,1424,1440,1443,1515,1518,1573,1577,1583,1671,1837,1841,1933,1937,1950],[433,434,435,436,440],"p",{},"evlog ships a ",[437,438,439],"strong",{},"stream primitive"," so any local consumer can subscribe to wide events without re-implementing a drain. There are two layers, building on each other:",[442,443,444,456],"ul",{},[445,446,447,450,451,455],"li",{},[437,448,449],{},"In-process bus"," — ",[452,453,454],"code",{},"createStreamDrain()",", the canonical pub\u002Fsub. Sync listeners, async iterators, ring-buffered replay.",[445,457,458,450,461,464],{},[437,459,460],{},"Network bridge",[452,462,463],{},"startStreamServer()",", an opt-in HTTP mini-server that exposes the in-process bus over Server-Sent Events for browsers, CLIs, or external devtools.",[466,467,468,471,472,475,476,479],"callout",{"icon":117},[437,469,470],{},"Local-only by design."," Both layers live inside a single Node \u002F Bun \u002F Deno process. They work in ",[452,473,474],{},"pnpm dev",", on long-lived self-hosted servers, on VMs and containers (Fly, Railway, Coolify…). They do ",[437,477,478],{},"not"," work on serverless platforms (Vercel Functions, Cloudflare Workers, AWS Lambda) — each invocation is an isolated process. Use a real broker (Redis Streams, NATS, Pub\u002FSub) for cross-instance fan-out there.",[481,482,449],"h2",{"id":483},"in-process-bus",[485,486],"stream-bus",{},[433,488,489,491],{},[452,490,454],{}," is just a drain. Register it on the evlog drain hook and subscribe to events as they're emitted — no HTTP, no serialization, no extra hops.",[493,494,497,500,560],"prompt",{":actions":495,"description":496,"icon":301},"[\"copy\",\"cursor\",\"windsurf\"]","Subscribe to wide events in-process",[433,498,499],{},"Wire an in-process subscriber on top of evlog's stream drain.",[442,501,502,513,528,539,546,557],{},[445,503,504,505,508,509,512],{},"Import ",[452,506,507],{},"createStreamDrain"," from ",[452,510,511],{},"evlog\u002Fstream"," and call it once at app boot",[445,514,515,516,519,520,523,524,527],{},"Register the returned ",[452,517,518],{},"drain"," on the evlog drain hook for my framework (Nitro: ",[452,521,522],{},"nitroApp.hooks.hook('evlog:drain', stream.drain)","; Next\u002Fstandalone: pass to ",[452,525,526],{},"initLogger({ drain })",")",[445,529,530,531,534,535,538],{},"Subscribe with ",[452,532,533],{},"stream.subscribe((event) => ...)"," for sync listeners or ",[452,536,537],{},"for await (const event of stream.events())"," for async iteration",[445,540,541,542,545],{},"Seed history for late subscribers with ",[452,543,544],{},"stream.recent()"," (snapshot of the ring buffer) before opening the live iterator",[445,547,548,549,552,553,556],{},"Tune ",[452,550,551],{},"buffer"," for replay history and ",[452,554,555],{},"perSubscriberQueue"," for slow-consumer backpressure",[445,558,559],{},"Skip on serverless platforms — the stream is in-process, isolated invocations won't share it",[433,561,562,563],{},"Docs: ",[564,565,566],"a",{"href":566,"rel":567},"https:\u002F\u002Fwww.evlog.dev\u002Fbuild-on-top\u002Fstream",[568],"nofollow",[570,571,576],"pre",{"className":572,"code":573,"language":574,"meta":575,"style":575},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { createStreamDrain } from 'evlog\u002Fstream'\n\nconst stream = createStreamDrain({ buffer: 200 })\n\nnitroApp.hooks.hook('evlog:drain', stream.drain)\n\nconst off = stream.subscribe((event) => {\n  if (event.level === 'error') notify(event)\n})\noff()\n\nfor (const past of stream.recent()) {\n  bootstrap(past)\n}\nfor await (const event of stream.events()) {\n  bootstrap(event)\n}\n","ts","",[452,577,578,610,617,655,660,698,703,736,774,782,791,796,825,838,844,872,883],{"__ignoreMap":575},[579,580,583,587,591,595,598,601,604,607],"span",{"class":581,"line":582},"line",1,[579,584,586],{"class":585},"s7zQu","import",[579,588,590],{"class":589},"sMK4o"," {",[579,592,594],{"class":593},"sTEyZ"," createStreamDrain",[579,596,597],{"class":589}," }",[579,599,600],{"class":585}," from",[579,602,603],{"class":589}," '",[579,605,511],{"class":606},"sfazB",[579,608,609],{"class":589},"'\n",[579,611,613],{"class":581,"line":612},2,[579,614,616],{"emptyLinePlaceholder":615},true,"\n",[579,618,620,624,627,630,633,636,639,643,646,650,652],{"class":581,"line":619},3,[579,621,623],{"class":622},"spNyl","const",[579,625,626],{"class":593}," stream ",[579,628,629],{"class":589},"=",[579,631,594],{"class":632},"s2Zo4",[579,634,635],{"class":593},"(",[579,637,638],{"class":589},"{",[579,640,642],{"class":641},"swJcz"," buffer",[579,644,645],{"class":589},":",[579,647,649],{"class":648},"sbssI"," 200",[579,651,597],{"class":589},[579,653,654],{"class":593},")\n",[579,656,658],{"class":581,"line":657},4,[579,659,616],{"emptyLinePlaceholder":615},[579,661,663,666,669,672,674,677,679,682,685,687,690,693,695],{"class":581,"line":662},5,[579,664,665],{"class":593},"nitroApp",[579,667,668],{"class":589},".",[579,670,671],{"class":593},"hooks",[579,673,668],{"class":589},[579,675,676],{"class":632},"hook",[579,678,635],{"class":593},[579,680,681],{"class":589},"'",[579,683,684],{"class":606},"evlog:drain",[579,686,681],{"class":589},[579,688,689],{"class":589},",",[579,691,692],{"class":593}," stream",[579,694,668],{"class":589},[579,696,697],{"class":593},"drain)\n",[579,699,701],{"class":581,"line":700},6,[579,702,616],{"emptyLinePlaceholder":615},[579,704,706,708,711,713,715,717,720,722,724,728,730,733],{"class":581,"line":705},7,[579,707,623],{"class":622},[579,709,710],{"class":593}," off ",[579,712,629],{"class":589},[579,714,692],{"class":593},[579,716,668],{"class":589},[579,718,719],{"class":632},"subscribe",[579,721,635],{"class":593},[579,723,635],{"class":589},[579,725,727],{"class":726},"sHdIc","event",[579,729,527],{"class":589},[579,731,732],{"class":622}," =>",[579,734,735],{"class":589}," {\n",[579,737,739,742,745,747,749,752,755,757,760,762,765,768,770,772],{"class":581,"line":738},8,[579,740,741],{"class":585},"  if",[579,743,744],{"class":641}," (",[579,746,727],{"class":593},[579,748,668],{"class":589},[579,750,751],{"class":593},"level",[579,753,754],{"class":589}," ===",[579,756,603],{"class":589},[579,758,759],{"class":606},"error",[579,761,681],{"class":589},[579,763,764],{"class":641},") ",[579,766,767],{"class":632},"notify",[579,769,635],{"class":641},[579,771,727],{"class":593},[579,773,654],{"class":641},[579,775,777,780],{"class":581,"line":776},9,[579,778,779],{"class":589},"}",[579,781,654],{"class":593},[579,783,785,788],{"class":581,"line":784},10,[579,786,787],{"class":632},"off",[579,789,790],{"class":593},"()\n",[579,792,794],{"class":581,"line":793},11,[579,795,616],{"emptyLinePlaceholder":615},[579,797,799,802,804,806,809,812,814,816,819,822],{"class":581,"line":798},12,[579,800,801],{"class":585},"for",[579,803,744],{"class":593},[579,805,623],{"class":622},[579,807,808],{"class":593}," past ",[579,810,811],{"class":589},"of",[579,813,692],{"class":593},[579,815,668],{"class":589},[579,817,818],{"class":632},"recent",[579,820,821],{"class":593},"()) ",[579,823,824],{"class":589},"{\n",[579,826,828,831,833,836],{"class":581,"line":827},13,[579,829,830],{"class":632},"  bootstrap",[579,832,635],{"class":641},[579,834,835],{"class":593},"past",[579,837,654],{"class":641},[579,839,841],{"class":581,"line":840},14,[579,842,843],{"class":589},"}\n",[579,845,847,849,852,854,856,859,861,863,865,868,870],{"class":581,"line":846},15,[579,848,801],{"class":585},[579,850,851],{"class":585}," await",[579,853,744],{"class":593},[579,855,623],{"class":622},[579,857,858],{"class":593}," event ",[579,860,811],{"class":589},[579,862,692],{"class":593},[579,864,668],{"class":589},[579,866,867],{"class":632},"events",[579,869,821],{"class":593},[579,871,824],{"class":589},[579,873,875,877,879,881],{"class":581,"line":874},16,[579,876,830],{"class":632},[579,878,635],{"class":641},[579,880,727],{"class":593},[579,882,654],{"class":641},[579,884,886],{"class":581,"line":885},17,[579,887,843],{"class":589},[889,890,85],"h3",{"id":891},"options",[893,894,895,911],"table",{},[896,897,898],"thead",{},[899,900,901,905,908],"tr",{},[902,903,904],"th",{},"Option",[902,906,907],{},"Type",[902,909,910],{},"Description",[912,913,914,940,960],"tbody",{},[899,915,916,921,926],{},[917,918,919],"td",{},[452,920,551],{},[917,922,923],{},[452,924,925],{},"number",[917,927,928,929,932,933,936,937,668],{},"Ring-buffer size for ",[452,930,931],{},"recent()"," snapshots. Set to ",[452,934,935],{},"0"," to disable. Default: ",[452,938,939],{},"500",[899,941,942,946,950],{},[917,943,944],{},[452,945,555],{},[917,947,948],{},[452,949,925],{},[917,951,952,953,956,957,668],{},"Max queued events per ",[452,954,955],{},"events()"," async iterator before the oldest are dropped. The drain itself is never blocked. Default: ",[452,958,959],{},"1000",[899,961,962,967,972],{},[917,963,964],{},[452,965,966],{},"filter",[917,968,969],{},[452,970,971],{},"(event) => boolean",[917,973,974,975,978],{},"Optional predicate run on each drained event — return ",[452,976,977],{},"false"," to skip the event entirely (neither buffered nor delivered).",[433,980,981,984,985,987],{},[452,982,983],{},"stream.drain(events)"," accepts either a single event or a batch. ",[452,986,544],{}," returns a snapshot of the buffered events (oldest first, most recent last) for ad-hoc inspection or to seed a UI panel.",[481,989,991],{"id":990},"network-bridge-stream-server","Network bridge — stream server",[993,994],"sse-wire",{},[433,996,997,999,1000,1003],{},[452,998,463],{}," boots a tiny ",[452,1001,1002],{},"node:http"," server in the same process as your app, on its own ephemeral port, and exposes the in-process bus over Server-Sent Events. Any consumer (browser tab, CLI, Tauri\u002FElectron devtool) can subscribe — your application API is untouched.",[466,1005,1006,1009],{"icon":117},[437,1007,1008],{},"Strict opt-in."," Nothing starts unless you set the option explicitly. There is no auto-enable in dev — the server only boots when you ask for it.",[493,1011,1014,1017,1075],{":actions":495,"description":1012,"icon":1013},"Expose the evlog stream over SSE","i-lucide-radio",[433,1015,1016],{},"Turn on the local stream server so I can subscribe to wide events from a browser tab, CLI, or Tauri\u002FElectron devtool.",[442,1018,1019,1043,1050,1061,1072],{},[445,1020,1021,1022,1025,1026,1029,1030,1025,1033,1036,1037,1039,1040,1042],{},"Detect my framework and opt in explicitly (Nuxt: ",[452,1023,1024],{},"evlog.stream: true"," in ",[452,1027,1028],{},"nuxt.config.ts","; Next.js: ",[452,1031,1032],{},"defineStreamedInstrumentation({ stream: true })",[452,1034,1035],{},"instrumentation.ts","; Hono\u002FExpress\u002FFastify\u002FElysia\u002Fstandalone: call ",[452,1038,463],{}," once at boot and register the returned ",[452,1041,518],{}," on the evlog drain hook)",[445,1044,1045,1046,1049],{},"Never enable in production by default; gate it behind ",[452,1047,1048],{},"process.env.NODE_ENV !== 'production'"," or a feature flag",[445,1051,1052,1053,1056,1057,1060],{},"For shared dev environments, set ",[452,1054,1055],{},"token: process.env.EVLOG_STREAM_TOKEN"," and have the consumer send it as ",[452,1058,1059],{},"Authorization: Bearer \u003Ctoken>"," on every request",[445,1062,1063,1064,1067,1068,1071],{},"Discover the URL from ",[452,1065,1066],{},".evlog\u002Fstream.url"," (or ",[452,1069,1070],{},"\u002Fapi\u002F_evlog\u002Fstream-info"," on Nuxt) — never hard-code the port, it's ephemeral",[445,1073,1074],{},"Skip on serverless platforms — the server is in-process",[433,1076,562,1077],{},[564,1078,566],{"href":566,"rel":1079},[568],[889,1081,1083],{"id":1082},"what-boots-up","What boots up",[433,1085,1086,1087,1089],{},"When you opt in, evlog calls ",[452,1088,463],{}," and:",[1091,1092,1093,1096,1106,1111,1114,1117],"ol",{},[445,1094,1095],{},"Picks an ephemeral free port (or the one you specify)",[445,1097,1098,1099,1101,1102,1105],{},"Spins a tiny ",[452,1100,1002],{}," server on ",[452,1103,1104],{},"127.0.0.1"," (or your host)",[445,1107,1108,1109],{},"Writes the discovered URL to ",[452,1110,1066],{},[445,1112,1113],{},"Prints a one-line banner in the server console",[445,1115,1116],{},"Hooks the in-process stream drain into the evlog pipeline",[445,1118,1119,1120,1123,1124,1127],{},"Exposes ",[452,1121,1122],{},"GET \u002F"," for the SSE stream and ",[452,1125,1126],{},"GET \u002Finfo"," for handshake metadata",[433,1129,1130],{},"On shutdown (SIGINT \u002F SIGTERM \u002F process exit) the server cleans up listeners and removes the URL file.",[889,1132,1134],{"id":1133},"per-framework-opt-in","Per-framework opt-in",[1136,1137,1138,1220,1289],"code-group",{},[570,1139,1141],{"className":572,"code":1140,"filename":1028,"language":574,"meta":575,"style":575},"export default defineNuxtConfig({\n  modules: ['evlog\u002Fnuxt'],\n  evlog: {\n    stream: true,\n    \u002F\u002F or: stream: { port: 4444, token: process.env.EVLOG_STREAM_TOKEN }\n  },\n})\n",[452,1142,1143,1158,1181,1190,1203,1209,1214],{"__ignoreMap":575},[579,1144,1145,1148,1151,1154,1156],{"class":581,"line":582},[579,1146,1147],{"class":585},"export",[579,1149,1150],{"class":585}," default",[579,1152,1153],{"class":632}," defineNuxtConfig",[579,1155,635],{"class":593},[579,1157,824],{"class":589},[579,1159,1160,1163,1165,1168,1170,1173,1175,1178],{"class":581,"line":612},[579,1161,1162],{"class":641},"  modules",[579,1164,645],{"class":589},[579,1166,1167],{"class":593}," [",[579,1169,681],{"class":589},[579,1171,1172],{"class":606},"evlog\u002Fnuxt",[579,1174,681],{"class":589},[579,1176,1177],{"class":593},"]",[579,1179,1180],{"class":589},",\n",[579,1182,1183,1186,1188],{"class":581,"line":619},[579,1184,1185],{"class":641},"  evlog",[579,1187,645],{"class":589},[579,1189,735],{"class":589},[579,1191,1192,1195,1197,1201],{"class":581,"line":657},[579,1193,1194],{"class":641},"    stream",[579,1196,645],{"class":589},[579,1198,1200],{"class":1199},"sfNiH"," true",[579,1202,1180],{"class":589},[579,1204,1205],{"class":581,"line":662},[579,1206,1208],{"class":1207},"sHwdD","    \u002F\u002F or: stream: { port: 4444, token: process.env.EVLOG_STREAM_TOKEN }\n",[579,1210,1211],{"class":581,"line":700},[579,1212,1213],{"class":589},"  },\n",[579,1215,1216,1218],{"class":581,"line":705},[579,1217,779],{"class":589},[579,1219,654],{"class":593},[570,1221,1223],{"className":572,"code":1222,"filename":1035,"language":574,"meta":575,"style":575},"import { defineStreamedInstrumentation } from 'evlog\u002Fnext\u002Fstream'\n\nexport const { register } = defineStreamedInstrumentation({\n  stream: true,\n})\n",[452,1224,1225,1245,1249,1272,1283],{"__ignoreMap":575},[579,1226,1227,1229,1231,1234,1236,1238,1240,1243],{"class":581,"line":582},[579,1228,586],{"class":585},[579,1230,590],{"class":589},[579,1232,1233],{"class":593}," defineStreamedInstrumentation",[579,1235,597],{"class":589},[579,1237,600],{"class":585},[579,1239,603],{"class":589},[579,1241,1242],{"class":606},"evlog\u002Fnext\u002Fstream",[579,1244,609],{"class":589},[579,1246,1247],{"class":581,"line":612},[579,1248,616],{"emptyLinePlaceholder":615},[579,1250,1251,1253,1256,1258,1261,1263,1266,1268,1270],{"class":581,"line":619},[579,1252,1147],{"class":585},[579,1254,1255],{"class":622}," const",[579,1257,590],{"class":589},[579,1259,1260],{"class":593}," register ",[579,1262,779],{"class":589},[579,1264,1265],{"class":589}," =",[579,1267,1233],{"class":632},[579,1269,635],{"class":593},[579,1271,824],{"class":589},[579,1273,1274,1277,1279,1281],{"class":581,"line":657},[579,1275,1276],{"class":641},"  stream",[579,1278,645],{"class":589},[579,1280,1200],{"class":1199},[579,1282,1180],{"class":589},[579,1284,1285,1287],{"class":581,"line":662},[579,1286,779],{"class":589},[579,1288,654],{"class":593},[570,1290,1293],{"className":572,"code":1291,"filename":1292,"language":574,"meta":575,"style":575},"import { startStreamServer } from 'evlog\u002Fstream'\n\nif (process.env.NODE_ENV !== 'production' && process.env.EVLOG_STREAM === '1') {\n  const { drain } = await startStreamServer()\n  \u002F\u002F Plug `drain` into the evlog drain hook for your framework\n}\n","Hono \u002F Express \u002F Fastify \u002F standalone",[452,1294,1295,1314,1318,1375,1395,1400],{"__ignoreMap":575},[579,1296,1297,1299,1301,1304,1306,1308,1310,1312],{"class":581,"line":582},[579,1298,586],{"class":585},[579,1300,590],{"class":589},[579,1302,1303],{"class":593}," startStreamServer",[579,1305,597],{"class":589},[579,1307,600],{"class":585},[579,1309,603],{"class":589},[579,1311,511],{"class":606},[579,1313,609],{"class":589},[579,1315,1316],{"class":581,"line":612},[579,1317,616],{"emptyLinePlaceholder":615},[579,1319,1320,1323,1326,1328,1331,1333,1336,1339,1341,1344,1346,1349,1352,1354,1356,1358,1361,1364,1366,1369,1371,1373],{"class":581,"line":619},[579,1321,1322],{"class":585},"if",[579,1324,1325],{"class":593}," (process",[579,1327,668],{"class":589},[579,1329,1330],{"class":593},"env",[579,1332,668],{"class":589},[579,1334,1335],{"class":593},"NODE_ENV ",[579,1337,1338],{"class":589},"!==",[579,1340,603],{"class":589},[579,1342,1343],{"class":606},"production",[579,1345,681],{"class":589},[579,1347,1348],{"class":589}," &&",[579,1350,1351],{"class":593}," process",[579,1353,668],{"class":589},[579,1355,1330],{"class":593},[579,1357,668],{"class":589},[579,1359,1360],{"class":593},"EVLOG_STREAM ",[579,1362,1363],{"class":589},"===",[579,1365,603],{"class":589},[579,1367,1368],{"class":606},"1",[579,1370,681],{"class":589},[579,1372,764],{"class":593},[579,1374,824],{"class":589},[579,1376,1377,1380,1382,1385,1387,1389,1391,1393],{"class":581,"line":657},[579,1378,1379],{"class":622},"  const",[579,1381,590],{"class":589},[579,1383,1384],{"class":593}," drain",[579,1386,597],{"class":589},[579,1388,1265],{"class":589},[579,1390,851],{"class":585},[579,1392,1303],{"class":632},[579,1394,790],{"class":641},[579,1396,1397],{"class":581,"line":662},[579,1398,1399],{"class":1207},"  \u002F\u002F Plug `drain` into the evlog drain hook for your framework\n",[579,1401,1402],{"class":581,"line":700},[579,1403,843],{"class":589},[433,1405,1406,1407,1409,1410,1413,1414,1416],{},"The Hono \u002F Express \u002F Fastify integrations don't need a \"feature PR\" — ",[452,1408,463],{}," is ",[437,1411,1412],{},"orthogonal"," to your framework. You boot it once and connect its ",[452,1415,518],{}," to the evlog pipeline like any other drain.",[889,1418,1420],{"id":1419},"discovery","Discovery",[433,1422,1423],{},"The mini-server runs on a random port, so any consumer must discover it.",[570,1425,1427],{"className":572,"code":1426,"filename":1066,"language":574,"meta":575,"style":575},"http:\u002F\u002F127.0.0.1:53942\n",[452,1428,1429],{"__ignoreMap":575},[579,1430,1431,1435,1437],{"class":581,"line":582},[579,1432,1434],{"class":1433},"sBMFI","http",[579,1436,645],{"class":589},[579,1438,1439],{"class":1207},"\u002F\u002F127.0.0.1:53942\n",[433,1441,1442],{},"Read directly from disk:",[570,1444,1446],{"className":572,"code":1445,"language":574,"meta":575,"style":575},"import { readFile } from 'node:fs\u002Fpromises'\n\nconst url = (await readFile('.evlog\u002Fstream.url', 'utf-8')).trim()\n",[452,1447,1448,1468,1472],{"__ignoreMap":575},[579,1449,1450,1452,1454,1457,1459,1461,1463,1466],{"class":581,"line":582},[579,1451,586],{"class":585},[579,1453,590],{"class":589},[579,1455,1456],{"class":593}," readFile",[579,1458,597],{"class":589},[579,1460,600],{"class":585},[579,1462,603],{"class":589},[579,1464,1465],{"class":606},"node:fs\u002Fpromises",[579,1467,609],{"class":589},[579,1469,1470],{"class":581,"line":612},[579,1471,616],{"emptyLinePlaceholder":615},[579,1473,1474,1476,1479,1481,1483,1486,1488,1490,1492,1494,1496,1498,1500,1503,1505,1508,1510,1513],{"class":581,"line":619},[579,1475,623],{"class":622},[579,1477,1478],{"class":593}," url ",[579,1480,629],{"class":589},[579,1482,744],{"class":593},[579,1484,1485],{"class":585},"await",[579,1487,1456],{"class":632},[579,1489,635],{"class":593},[579,1491,681],{"class":589},[579,1493,1066],{"class":606},[579,1495,681],{"class":589},[579,1497,689],{"class":589},[579,1499,603],{"class":589},[579,1501,1502],{"class":606},"utf-8",[579,1504,681],{"class":589},[579,1506,1507],{"class":593},"))",[579,1509,668],{"class":589},[579,1511,1512],{"class":632},"trim",[579,1514,790],{"class":593},[433,1516,1517],{},"Or — for same-origin browser tabs in a Nuxt app — hit the discovery route:",[570,1519,1521],{"className":572,"code":1520,"language":574,"meta":575,"style":575},"const { url } = await fetch('\u002Fapi\u002F_evlog\u002Fstream-info').then(r => r.json())\n",[452,1522,1523],{"__ignoreMap":575},[579,1524,1525,1527,1529,1531,1533,1535,1537,1540,1542,1544,1546,1548,1550,1552,1555,1557,1560,1562,1565,1567,1570],{"class":581,"line":582},[579,1526,623],{"class":622},[579,1528,590],{"class":589},[579,1530,1478],{"class":593},[579,1532,779],{"class":589},[579,1534,1265],{"class":589},[579,1536,851],{"class":585},[579,1538,1539],{"class":632}," fetch",[579,1541,635],{"class":593},[579,1543,681],{"class":589},[579,1545,1070],{"class":606},[579,1547,681],{"class":589},[579,1549,527],{"class":593},[579,1551,668],{"class":589},[579,1553,1554],{"class":632},"then",[579,1556,635],{"class":593},[579,1558,1559],{"class":726},"r",[579,1561,732],{"class":622},[579,1563,1564],{"class":593}," r",[579,1566,668],{"class":589},[579,1568,1569],{"class":632},"json",[579,1571,1572],{"class":593},"())\n",[889,1574,1576],{"id":1575},"wire-format","Wire format",[433,1578,1579,1580,645],{},"Every SSE message has the shape ",[452,1581,1582],{},"{ evlog: '1', type, data }",[893,1584,1585,1602],{},[896,1586,1587],{},[899,1588,1589,1594,1597],{},[902,1590,1591],{},[452,1592,1593],{},"type",[902,1595,1596],{},"When",[902,1598,1599],{},[452,1600,1601],{},"data",[912,1603,1604,1619,1640,1653],{},[899,1605,1606,1611,1614],{},[917,1607,1608],{},[452,1609,1610],{},"hello",[917,1612,1613],{},"First frame after connect",[917,1615,1616],{},[452,1617,1618],{},"{ evlogVersion, bufferSize, heartbeatMs }",[899,1620,1621,1626,1635],{},[917,1622,1623],{},[452,1624,1625],{},"replay",[917,1627,1628,1629,1631,1632],{},"Right after ",[452,1630,1610],{},", replays buffered events when the consumer passed ",[452,1633,1634],{},"?since=\u003Ciso>",[917,1636,1637],{},[452,1638,1639],{},"WideEvent",[899,1641,1642,1646,1649],{},[917,1643,1644],{},[452,1645,727],{},[917,1647,1648],{},"Every emitted event after that",[917,1650,1651],{},[452,1652,1639],{},[899,1654,1655,1660,1666],{},[917,1656,1657],{},[452,1658,1659],{},"ping",[917,1661,1662,1663,527],{},"Heartbeat (default every 15s, configurable via ",[452,1664,1665],{},"heartbeatMs",[917,1667,1668],{},[452,1669,1670],{},"{ ts: number }",[570,1672,1675],{"className":572,"code":1673,"filename":1674,"language":574,"meta":575,"style":575},"const { url } = await fetch('\u002Fapi\u002F_evlog\u002Fstream-info').then(r => r.json())\nconst es = new EventSource(url)\n\nes.onmessage = (msg) => {\n  const { type, data } = JSON.parse(msg.data)\n  if (type === 'event') events.push(data)\n}\n","Browser consumer",[452,1676,1677,1721,1739,1743,1766,1802,1833],{"__ignoreMap":575},[579,1678,1679,1681,1683,1685,1687,1689,1691,1693,1695,1697,1699,1701,1703,1705,1707,1709,1711,1713,1715,1717,1719],{"class":581,"line":582},[579,1680,623],{"class":622},[579,1682,590],{"class":589},[579,1684,1478],{"class":593},[579,1686,779],{"class":589},[579,1688,1265],{"class":589},[579,1690,851],{"class":585},[579,1692,1539],{"class":632},[579,1694,635],{"class":593},[579,1696,681],{"class":589},[579,1698,1070],{"class":606},[579,1700,681],{"class":589},[579,1702,527],{"class":593},[579,1704,668],{"class":589},[579,1706,1554],{"class":632},[579,1708,635],{"class":593},[579,1710,1559],{"class":726},[579,1712,732],{"class":622},[579,1714,1564],{"class":593},[579,1716,668],{"class":589},[579,1718,1569],{"class":632},[579,1720,1572],{"class":593},[579,1722,1723,1725,1728,1730,1733,1736],{"class":581,"line":612},[579,1724,623],{"class":622},[579,1726,1727],{"class":593}," es ",[579,1729,629],{"class":589},[579,1731,1732],{"class":589}," new",[579,1734,1735],{"class":632}," EventSource",[579,1737,1738],{"class":593},"(url)\n",[579,1740,1741],{"class":581,"line":619},[579,1742,616],{"emptyLinePlaceholder":615},[579,1744,1745,1748,1750,1753,1755,1757,1760,1762,1764],{"class":581,"line":657},[579,1746,1747],{"class":593},"es",[579,1749,668],{"class":589},[579,1751,1752],{"class":632},"onmessage",[579,1754,1265],{"class":589},[579,1756,744],{"class":589},[579,1758,1759],{"class":726},"msg",[579,1761,527],{"class":589},[579,1763,732],{"class":622},[579,1765,735],{"class":589},[579,1767,1768,1770,1772,1775,1777,1780,1782,1784,1787,1789,1792,1794,1796,1798,1800],{"class":581,"line":662},[579,1769,1379],{"class":622},[579,1771,590],{"class":589},[579,1773,1774],{"class":593}," type",[579,1776,689],{"class":589},[579,1778,1779],{"class":593}," data",[579,1781,597],{"class":589},[579,1783,1265],{"class":589},[579,1785,1786],{"class":593}," JSON",[579,1788,668],{"class":589},[579,1790,1791],{"class":632},"parse",[579,1793,635],{"class":641},[579,1795,1759],{"class":593},[579,1797,668],{"class":589},[579,1799,1601],{"class":593},[579,1801,654],{"class":641},[579,1803,1804,1806,1808,1810,1812,1814,1816,1818,1820,1822,1824,1827,1829,1831],{"class":581,"line":700},[579,1805,741],{"class":585},[579,1807,744],{"class":641},[579,1809,1593],{"class":593},[579,1811,754],{"class":589},[579,1813,603],{"class":589},[579,1815,727],{"class":606},[579,1817,681],{"class":589},[579,1819,764],{"class":641},[579,1821,867],{"class":593},[579,1823,668],{"class":589},[579,1825,1826],{"class":632},"push",[579,1828,635],{"class":641},[579,1830,1601],{"class":593},[579,1832,654],{"class":641},[579,1834,1835],{"class":581,"line":705},[579,1836,843],{"class":589},[889,1838,1840],{"id":1839},"auth-cors","Auth + CORS",[893,1842,1843,1852],{},[896,1844,1845],{},[899,1846,1847,1849],{},[902,1848,904],{},[902,1850,1851],{},"Behavior",[912,1853,1854,1867,1889,1906,1919],{},[899,1855,1856,1861],{},[917,1857,1858],{},[452,1859,1860],{},"token",[917,1862,1863,1864,1866],{},"When set, the server requires ",[452,1865,1059],{}," on every request and 401s otherwise.",[899,1868,1869,1872],{},[917,1870,1871],{},"(no token)",[917,1873,1874,1875,1878,1879,1881,1882,1881,1885,1888],{},"Connections are accepted only when there is no ",[452,1876,1877],{},"Origin"," header or the origin host is local (",[452,1880,1104],{}," \u002F ",[452,1883,1884],{},"localhost",[452,1886,1887],{},"[::1]","). Other origins receive 403.",[899,1890,1891,1896],{},[917,1892,1893],{},[452,1894,1895],{},"host",[917,1897,1898,1899,1901,1902,1905],{},"Default ",[452,1900,1104],{}," — never reachable from the LAN. Override to ",[452,1903,1904],{},"0.0.0.0"," only with a token set.",[899,1907,1908,1912],{},[917,1909,1910],{},[452,1911,1665],{},[917,1913,1914,1915,1918],{},"Heartbeat interval (default ",[452,1916,1917],{},"15000",").",[899,1920,1921,1925],{},[917,1922,1923],{},[452,1924,551],{},[917,1926,1927,1928,1930,1931,668],{},"Ring buffer kept on the underlying default stream — replayed for late-joining clients via ",[452,1929,1634],{},". Default ",[452,1932,939],{},[481,1934,1936],{"id":1935},"going-further","Going further",[442,1938,1939,1944],{},[445,1940,1941,1943],{},[564,1942,303],{"href":304}," — replay or tail historic NDJSON files (cross-process, survives restarts)",[445,1945,1946,1949],{},[564,1947,1948],{"href":308},"Consumer recipes"," — build a minimal devtool, pipe to curl + jq, replay history then go live",[1951,1952,1953],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":575,"searchDepth":612,"depth":612,"links":1955},[1956,1959,1966],{"id":483,"depth":612,"text":449,"children":1957},[1958],{"id":891,"depth":619,"text":85},{"id":990,"depth":612,"text":991,"children":1960},[1961,1962,1963,1964,1965],{"id":1082,"depth":619,"text":1083},{"id":1133,"depth":619,"text":1134},{"id":1419,"depth":619,"text":1420},{"id":1575,"depth":619,"text":1576},{"id":1839,"depth":619,"text":1840},{"id":1935,"depth":612,"text":1936},"Subscribe to wide events flowing through evlog — in-process with createStreamDrain, or over the network with the local SSE stream server.","md",null,{},{"title":298,"icon":301},{"title":298,"description":1967},"QnDEpswgj4pJ-Tu_WTOwXnth-YRZUeXSYO59Y6Z9xGg",[1975,1977],{"title":41,"path":295,"stem":296,"description":1976,"icon":54,"children":-1},"Live event observation, custom drains, plugins, custom enrichers, framework integration — everything you can wire on top of the evlog pipeline.",{"title":303,"path":304,"stem":305,"description":1978,"icon":306,"children":-1},"Replay and tail the local NDJSON drain with readFsLogs and tailFsLogs — works in-process or from any external Node tool, survives restarts.",1778349127049]