[{"data":1,"prerenderedAt":1651},["ShallowReactive",2],{"navigation_docs":3,"-build-on-top-stream-server":429,"-build-on-top-stream-server-surround":1646},[4,35,159,201,289,326,413],{"title":5,"path":6,"stem":7,"children":8,"page":34},"Getting Started","\u002Fgetting-started","1.getting-started",[9,14,19,24,29],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":20,"path":21,"stem":22,"icon":23},"Quick Start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start","i-lucide-zap",{"title":25,"path":26,"stem":27,"icon":28},"Agent Skills","\u002Fgetting-started\u002Fagent-skills","1.getting-started\u002F4.agent-skills","i-lucide-sparkles",{"title":30,"path":31,"stem":32,"icon":33},"vs Other Loggers","\u002Fgetting-started\u002Fvs-other-loggers","1.getting-started\u002F5.vs-other-loggers","i-lucide-scale",false,{"title":36,"path":37,"stem":38,"children":39,"page":34},"Logging","\u002Flogging","2.logging",[40,45,50,55,60,65,70,99,127],{"title":41,"path":42,"stem":43,"icon":44},"Overview","\u002Flogging\u002Foverview","2.logging\u002F0.overview","i-lucide-list",{"title":46,"path":47,"stem":48,"icon":49},"Simple Logging","\u002Flogging\u002Fsimple-logging","2.logging\u002F1.simple-logging","i-lucide-terminal",{"title":51,"path":52,"stem":53,"icon":54},"Wide Events","\u002Flogging\u002Fwide-events","2.logging\u002F2.wide-events","i-lucide-layers",{"title":56,"path":57,"stem":58,"icon":59},"Structured Errors","\u002Flogging\u002Fstructured-errors","2.logging\u002F3.structured-errors","i-lucide-shield-alert",{"title":61,"path":62,"stem":63,"icon":64},"Catalogs","\u002Flogging\u002Fcatalogs","2.logging\u002F4.catalogs","i-lucide-book-open",{"title":66,"path":67,"stem":68,"icon":69},"Client Logging","\u002Flogging\u002Fclient-logging","2.logging\u002F5.client-logging","i-lucide-monitor",{"title":71,"icon":72,"path":73,"stem":74,"children":75,"page":34},"AI SDK","i-simple-icons-vercel","\u002Flogging\u002Fai-sdk","2.logging\u002F6.ai-sdk",[76,79,84,89,94],{"title":41,"path":77,"stem":78,"icon":44},"\u002Flogging\u002Fai-sdk\u002Foverview","2.logging\u002F6.ai-sdk\u002F01.overview",{"title":80,"path":81,"stem":82,"icon":83},"Usage","\u002Flogging\u002Fai-sdk\u002Fusage","2.logging\u002F6.ai-sdk\u002F02.usage","i-lucide-code",{"title":85,"path":86,"stem":87,"icon":88},"Options","\u002Flogging\u002Fai-sdk\u002Foptions","2.logging\u002F6.ai-sdk\u002F03.options","i-lucide-sliders",{"title":90,"path":91,"stem":92,"icon":93},"Metadata","\u002Flogging\u002Fai-sdk\u002Fmetadata","2.logging\u002F6.ai-sdk\u002F04.metadata","i-lucide-database",{"title":95,"path":96,"stem":97,"icon":98},"Telemetry","\u002Flogging\u002Fai-sdk\u002Ftelemetry","2.logging\u002F6.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":100,"icon":101,"path":102,"stem":103,"children":104,"page":34},"Better Auth","i-simple-icons-betterauth","\u002Flogging\u002Fbetter-auth","2.logging\u002F7.better-auth",[105,108,113,118,122],{"title":41,"path":106,"stem":107,"icon":44},"\u002Flogging\u002Fbetter-auth\u002Foverview","2.logging\u002F7.better-auth\u002F01.overview",{"title":109,"path":110,"stem":111,"icon":112},"Identify User","\u002Flogging\u002Fbetter-auth\u002Fidentify-user","2.logging\u002F7.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":114,"path":115,"stem":116,"icon":117},"Middleware","\u002Flogging\u002Fbetter-auth\u002Fmiddleware","2.logging\u002F7.better-auth\u002F03.middleware","i-lucide-shield",{"title":119,"path":120,"stem":121,"icon":69},"Client Sync","\u002Flogging\u002Fbetter-auth\u002Fclient-sync","2.logging\u002F7.better-auth\u002F04.client-sync",{"title":123,"path":124,"stem":125,"icon":126},"Performance","\u002Flogging\u002Fbetter-auth\u002Fperformance","2.logging\u002F7.better-auth\u002F05.performance","i-lucide-gauge",{"title":128,"icon":129,"path":130,"stem":131,"children":132,"page":34},"Audit Logs","i-lucide-shield-check","\u002Flogging\u002Faudit","2.logging\u002F8.audit",[133,136,141,146,151,155],{"title":41,"path":134,"stem":135,"icon":44},"\u002Flogging\u002Faudit\u002Foverview","2.logging\u002F8.audit\u002F01.overview",{"title":137,"path":138,"stem":139,"icon":140},"Schema","\u002Flogging\u002Faudit\u002Fschema","2.logging\u002F8.audit\u002F02.schema","i-lucide-file-text",{"title":142,"path":143,"stem":144,"icon":145},"Recording","\u002Flogging\u002Faudit\u002Frecording","2.logging\u002F8.audit\u002F03.recording","i-lucide-pen-line",{"title":147,"path":148,"stem":149,"icon":150},"Drains","\u002Flogging\u002Faudit\u002Fpipeline","2.logging\u002F8.audit\u002F04.pipeline","i-lucide-link",{"title":152,"path":153,"stem":154,"icon":129},"Compliance","\u002Flogging\u002Faudit\u002Fcompliance","2.logging\u002F8.audit\u002F05.compliance",{"title":156,"path":157,"stem":158,"icon":64},"Recipes","\u002Flogging\u002Faudit\u002Frecipes","2.logging\u002F8.audit\u002F06.recipes",{"title":160,"path":161,"stem":162,"children":163,"page":34},"Core Concepts","\u002Fcore-concepts","3.core-concepts",[164,169,174,179,184,188,191,196],{"title":165,"path":166,"stem":167,"icon":168},"Lifecycle","\u002Fcore-concepts\u002Flifecycle","3.core-concepts\u002F0.lifecycle","i-lucide-arrow-right-left",{"title":170,"path":171,"stem":172,"icon":173},"Configuration","\u002Fcore-concepts\u002Fconfiguration","3.core-concepts\u002F1.configuration","i-lucide-settings",{"title":175,"path":176,"stem":177,"icon":178},"Sampling","\u002Fcore-concepts\u002Fsampling","3.core-concepts\u002F2.sampling","i-lucide-filter",{"title":180,"path":181,"stem":182,"icon":183},"Typed Fields","\u002Fcore-concepts\u002Ftyped-fields","3.core-concepts\u002F3.typed-fields","i-simple-icons-typescript",{"title":185,"path":186,"stem":187,"icon":129},"Best Practices","\u002Fcore-concepts\u002Fbest-practices","3.core-concepts\u002F4.best-practices",{"title":123,"path":189,"stem":190,"icon":126},"\u002Fcore-concepts\u002Fperformance","3.core-concepts\u002F5.performance",{"title":192,"path":193,"stem":194,"icon":195},"Vite Plugin","\u002Fcore-concepts\u002Fvite-plugin","3.core-concepts\u002F6.vite-plugin","i-custom-vite",{"title":197,"path":198,"stem":199,"icon":200},"Auto-Redaction","\u002Fcore-concepts\u002Fredaction","3.core-concepts\u002F7.redaction","i-lucide-eye-off",{"title":202,"path":203,"stem":204,"children":205,"page":34},"Frameworks","\u002Fframeworks","4.frameworks",[206,210,215,220,225,230,235,240,245,250,255,260,265,270,274,279,284],{"title":41,"path":207,"stem":208,"icon":209},"\u002Fframeworks\u002Foverview","4.frameworks\u002F00.overview","i-lucide-layout-grid",{"title":211,"path":212,"stem":213,"icon":214},"Nuxt","\u002Fframeworks\u002Fnuxt","4.frameworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":216,"path":217,"stem":218,"icon":219},"Next.js","\u002Fframeworks\u002Fnextjs","4.frameworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":221,"path":222,"stem":223,"icon":224},"SvelteKit","\u002Fframeworks\u002Fsveltekit","4.frameworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":226,"path":227,"stem":228,"icon":229},"Nitro","\u002Fframeworks\u002Fnitro","4.frameworks\u002F04.nitro","i-custom-nitro",{"title":231,"path":232,"stem":233,"icon":234},"TanStack Start","\u002Fframeworks\u002Ftanstack-start","4.frameworks\u002F05.tanstack-start","i-custom-tanstack",{"title":236,"path":237,"stem":238,"icon":239},"NestJS","\u002Fframeworks\u002Fnestjs","4.frameworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":241,"path":242,"stem":243,"icon":244},"Express","\u002Fframeworks\u002Fexpress","4.frameworks\u002F07.express","i-simple-icons-express",{"title":246,"path":247,"stem":248,"icon":249},"Hono","\u002Fframeworks\u002Fhono","4.frameworks\u002F08.hono","i-simple-icons-hono",{"title":251,"path":252,"stem":253,"icon":254},"Fastify","\u002Fframeworks\u002Ffastify","4.frameworks\u002F09.fastify","i-simple-icons-fastify",{"title":256,"path":257,"stem":258,"icon":259},"Elysia","\u002Fframeworks\u002Felysia","4.frameworks\u002F10.elysia","i-custom-elysia",{"title":261,"path":262,"stem":263,"icon":264},"React Router","\u002Fframeworks\u002Freact-router","4.frameworks\u002F11.react-router","i-custom-reactrouter",{"title":266,"path":267,"stem":268,"icon":269},"Cloudflare Workers","\u002Fframeworks\u002Fcloudflare-workers","4.frameworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":271,"path":272,"stem":273,"icon":183},"Standalone","\u002Fframeworks\u002Fstandalone","4.frameworks\u002F13.standalone",{"title":275,"path":276,"stem":277,"icon":278},"Astro","\u002Fframeworks\u002Fastro","4.frameworks\u002F14.astro","i-simple-icons-astro",{"title":280,"path":281,"stem":282,"icon":283},"AWS Lambda","\u002Fframeworks\u002Faws-lambda","4.frameworks\u002F16.aws-lambda","i-custom-lambda",{"title":285,"path":286,"stem":287,"icon":288},"Custom Integration","\u002Fframeworks\u002Fcustom-integration","4.frameworks\u002F17.custom-integration","i-lucide-puzzle",{"title":290,"path":291,"stem":292,"children":293,"page":34},"Build on top","\u002Fbuild-on-top","5.build-on-top",[294,297,302,307,312,317,321],{"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 API","\u002Fbuild-on-top\u002Fstream-api","5.build-on-top\u002F1.stream-api","i-lucide-radio-tower",{"title":303,"path":304,"stem":305,"icon":306},"Stream server","\u002Fbuild-on-top\u002Fstream-server","5.build-on-top\u002F2.stream-server","i-lucide-radio",{"title":308,"path":309,"stem":310,"icon":311},"FS reader","\u002Fbuild-on-top\u002Ffs-reader","5.build-on-top\u002F3.fs-reader","i-lucide-folder-search",{"title":313,"path":314,"stem":315,"icon":316},"Identity headers","\u002Fbuild-on-top\u002Fidentity-headers","5.build-on-top\u002F4.identity-headers","i-lucide-fingerprint",{"title":156,"path":318,"stem":319,"icon":320},"\u002Fbuild-on-top\u002Frecipes","5.build-on-top\u002F5.recipes","i-lucide-chef-hat",{"title":322,"path":323,"stem":324,"icon":325},"Catalogs as packages","\u002Fbuild-on-top\u002Fcatalogs-as-packages","5.build-on-top\u002F6.catalogs-as-packages","i-lucide-package",{"title":327,"path":328,"stem":329,"children":330,"page":34},"Adapters","\u002Fadapters","6.adapters",[331,334,374,389],{"title":41,"path":332,"stem":333,"icon":44},"\u002Fadapters\u002Foverview","6.adapters\u002F01.overview",{"title":335,"path":336,"stem":337,"children":338,"page":34},"Cloud destinations","\u002Fadapters\u002Fcloud","6.adapters\u002F02.cloud",[339,344,349,354,359,364,369],{"title":340,"path":341,"stem":342,"icon":343},"Axiom","\u002Fadapters\u002Fcloud\u002Faxiom","6.adapters\u002F02.cloud\u002F01.axiom","i-custom-axiom",{"title":345,"path":346,"stem":347,"icon":348},"OTLP","\u002Fadapters\u002Fcloud\u002Fotlp","6.adapters\u002F02.cloud\u002F02.otlp","i-simple-icons-opentelemetry",{"title":350,"path":351,"stem":352,"icon":353},"PostHog","\u002Fadapters\u002Fcloud\u002Fposthog","6.adapters\u002F02.cloud\u002F03.posthog","i-simple-icons-posthog",{"title":355,"path":356,"stem":357,"icon":358},"Sentry","\u002Fadapters\u002Fcloud\u002Fsentry","6.adapters\u002F02.cloud\u002F04.sentry","i-simple-icons-sentry",{"title":360,"path":361,"stem":362,"icon":363},"Better Stack","\u002Fadapters\u002Fcloud\u002Fbetter-stack","6.adapters\u002F02.cloud\u002F05.better-stack","i-simple-icons-betterstack",{"title":365,"path":366,"stem":367,"icon":368},"Datadog","\u002Fadapters\u002Fcloud\u002Fdatadog","6.adapters\u002F02.cloud\u002F06.datadog","i-simple-icons-datadog",{"title":370,"path":371,"stem":372,"icon":373},"HyperDX","\u002Fadapters\u002Fcloud\u002Fhyperdx","6.adapters\u002F02.cloud\u002F07.hyperdx","i-custom-hyperdx",{"title":375,"path":376,"stem":377,"children":378,"page":34},"Self-hosted","\u002Fadapters\u002Fself-hosted","6.adapters\u002F03.self-hosted",[379,384],{"title":380,"path":381,"stem":382,"icon":383},"File System","\u002Fadapters\u002Fself-hosted\u002Ffs","6.adapters\u002F03.self-hosted\u002F01.fs","i-lucide-hard-drive",{"title":385,"path":386,"stem":387,"icon":388},"NuxtHub","\u002Fadapters\u002Fself-hosted\u002Fnuxthub","6.adapters\u002F03.self-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":390,"path":391,"stem":392,"children":393,"page":34},"Building blocks","\u002Fadapters\u002Fbuilding-blocks","6.adapters\u002F04.building-blocks",[394,399,404,408],{"title":395,"path":396,"stem":397,"icon":398},"Pipeline","\u002Fadapters\u002Fbuilding-blocks\u002Fpipeline","6.adapters\u002F04.building-blocks\u002F01.pipeline","i-lucide-workflow",{"title":400,"path":401,"stem":402,"icon":403},"HTTP","\u002Fadapters\u002Fbuilding-blocks\u002Fhttp","6.adapters\u002F04.building-blocks\u002F02.http","i-lucide-globe",{"title":405,"path":406,"stem":407,"icon":83},"Custom Adapters","\u002Fadapters\u002Fbuilding-blocks\u002Fcustom","6.adapters\u002F04.building-blocks\u002F03.custom",{"title":409,"path":410,"stem":411,"icon":412},"Toolkit","\u002Fadapters\u002Fbuilding-blocks\u002Ftoolkit","6.adapters\u002F04.building-blocks\u002F04.toolkit","i-lucide-blocks",{"title":414,"path":415,"stem":416,"children":417,"page":34},"Enrichers","\u002Fenrichers","7.enrichers",[418,421,425],{"title":41,"path":419,"stem":420,"icon":28},"\u002Fenrichers\u002Foverview","7.enrichers\u002F1.overview",{"title":422,"path":423,"stem":424,"icon":288},"Built-in","\u002Fenrichers\u002Fbuilt-in","7.enrichers\u002F2.built-in",{"title":426,"path":427,"stem":428,"icon":83},"Custom","\u002Fenrichers\u002Fcustom","7.enrichers\u002F3.custom",{"id":430,"title":303,"body":431,"description":1639,"extension":1640,"links":1641,"meta":1642,"navigation":1643,"path":304,"seo":1644,"stem":305,"__hash__":1645},"docs\u002F5.build-on-top\u002F2.stream-server.md",{"type":432,"value":433,"toc":1623},"minimark",[434,448,478,483,490,523,533,546,550,555,631,634,688,699,707,802,879,882,886,991,995,1005,1009,1273,1286,1290,1352,1356,1363,1369,1433,1440,1444,1518,1528,1532,1535,1556,1602,1606,1619],[435,436,437,438,442,443,447],"p",{},"evlog ships a tiny HTTP server that exposes the ",[439,440,441],"a",{"href":299},"in-process stream"," over ",[444,445,446],"strong",{},"Server-Sent Events",". It runs in the same Node process as your app, on its own ephemeral port — your API surface is untouched, and any consumer (browser tab, CLI, Tauri\u002FElectron devtool) can subscribe.",[449,450,453,458,470],"callout",{"color":451,"icon":452},"warning","i-lucide-alert-triangle",[435,454,455],{},[444,456,457],{},"Local development and long-lived self-hosted servers only.",[435,459,460,461,464,465,464,467,469],{},"The server lives in-process. On serverless platforms (",[444,462,463],{},"Vercel Functions",", ",[444,466,266],{},[444,468,280],{},"…), each invocation is isolated, so a subscriber on one isolate would never see events emitted from another. Use a real broker (Redis Streams, NATS, Pub\u002FSub…) for cross-instance fan-out.",[435,471,472,473,477],{},"It works perfectly in ",[474,475,476],"code",{},"pnpm dev",", on a Node \u002F Bun \u002F Deno container, on a long-lived VM, on Fly \u002F Railway \u002F Coolify-style instances.",[479,480,482],"h2",{"id":481},"what-boots-up","What boots up",[435,484,485,486,489],{},"When the stream is enabled, evlog calls ",[474,487,488],{},"startStreamServer()"," and:",[491,492,493,505,513,520],"ol",{},[494,495,496,497,500,501,504],"li",{},"Opens a ",[474,498,499],{},"node:http"," server bound to ",[474,502,503],{},"127.0.0.1"," on an OS-assigned ephemeral port.",[494,506,507,508,512],{},"Subscribes the SSE connections to the ",[439,509,511],{"href":510},"\u002Fbuild-on-top\u002Fstream-api#default-singleton","default in-process stream"," — every wide event flows through.",[494,514,515,516,519],{},"Writes the URL to ",[474,517,518],{},"\u003Ccwd>\u002F.evlog\u002Fstream.url"," so external tools can discover the port.",[494,521,522],{},"Prints a banner at startup:",[524,525,531],"pre",{"className":526,"code":528,"language":529,"meta":530},[527],"language-text","  [evlog] Stream → http:\u002F\u002F127.0.0.1:51203\n","text","",[474,532,528],{"__ignoreMap":530},[491,534,536],{"start":535},5,[494,537,538,539,464,542,545],{},"Cleans up the URL file and closes the server on ",[474,540,541],{},"SIGINT",[474,543,544],{},"SIGTERM",", and process exit.",[479,547,549],{"id":548},"per-framework","Per framework",[551,552,554],"h3",{"id":553},"nuxt-zero-config-in-dev","Nuxt — zero config in dev",[524,556,561],{"className":557,"code":558,"filename":559,"language":560,"meta":530,"style":530},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineNuxtConfig({\n  modules: ['evlog\u002Fnuxt'],\n  \u002F\u002F stream auto-on in dev — banner appears at `pnpm dev`\n})\n","nuxt.config.ts","ts",[474,562,563,587,615,622],{"__ignoreMap":530},[564,565,568,572,575,579,583],"span",{"class":566,"line":567},"line",1,[564,569,571],{"class":570},"s7zQu","export",[564,573,574],{"class":570}," default",[564,576,578],{"class":577},"s2Zo4"," defineNuxtConfig",[564,580,582],{"class":581},"sTEyZ","(",[564,584,586],{"class":585},"sMK4o","{\n",[564,588,590,594,597,600,603,607,609,612],{"class":566,"line":589},2,[564,591,593],{"class":592},"swJcz","  modules",[564,595,596],{"class":585},":",[564,598,599],{"class":581}," [",[564,601,602],{"class":585},"'",[564,604,606],{"class":605},"sfazB","evlog\u002Fnuxt",[564,608,602],{"class":585},[564,610,611],{"class":581},"]",[564,613,614],{"class":585},",\n",[564,616,618],{"class":566,"line":617},3,[564,619,621],{"class":620},"sHwdD","  \u002F\u002F stream auto-on in dev — banner appears at `pnpm dev`\n",[564,623,625,628],{"class":566,"line":624},4,[564,626,627],{"class":585},"}",[564,629,630],{"class":581},")\n",[435,632,633],{},"To override:",[524,635,637],{"className":557,"code":636,"language":560,"meta":530,"style":530},"evlog: {\n  stream: true,                                   \u002F\u002F force-enable in dev AND prod\n  \u002F\u002F stream: false,                               \u002F\u002F explicit off\n  \u002F\u002F stream: { port: 4317, token: '...' },        \u002F\u002F custom config\n}\n",[474,638,639,650,667,675,683],{"__ignoreMap":530},[564,640,641,645,647],{"class":566,"line":567},[564,642,644],{"class":643},"sBMFI","evlog",[564,646,596],{"class":585},[564,648,649],{"class":585}," {\n",[564,651,652,655,657,661,664],{"class":566,"line":589},[564,653,654],{"class":643},"  stream",[564,656,596],{"class":585},[564,658,660],{"class":659},"sfNiH"," true",[564,662,663],{"class":585},",",[564,665,666],{"class":620},"                                   \u002F\u002F force-enable in dev AND prod\n",[564,668,669,672],{"class":566,"line":617},[564,670,671],{"class":620},"  \u002F\u002F stream: false,",[564,673,674],{"class":620},"                               \u002F\u002F explicit off\n",[564,676,677,680],{"class":566,"line":624},[564,678,679],{"class":620},"  \u002F\u002F stream: { port: 4317, token: '...' },",[564,681,682],{"class":620},"        \u002F\u002F custom config\n",[564,684,685],{"class":566,"line":535},[564,686,687],{"class":585},"}\n",[435,689,690,691,694,695,698],{},"The Nuxt module also registers a tiny ",[474,692,693],{},"\u002Fapi\u002F_evlog\u002Fstream-info"," route that reads ",[474,696,697],{},".evlog\u002Fstream.url"," and returns the URL — useful when the consumer is a page on the same Nuxt app and needs to discover the mini-server's ephemeral port.",[551,700,702,703,706],{"id":701},"nextjs-instrumentationts","Next.js (",[474,704,705],{},"instrumentation.ts",")",[524,708,711],{"className":557,"code":709,"filename":710,"language":560,"meta":530,"style":530},"import { defineStreamedInstrumentation } from 'evlog\u002Fnext\u002Fstream'\n\nexport const { register, onRequestError } = defineStreamedInstrumentation({\n  service: 'my-app',\n  \u002F\u002F stream auto-on when NODE_ENV === 'development'\n})\n","lib\u002Fevlog.ts",[474,712,713,739,745,774,790,795],{"__ignoreMap":530},[564,714,715,718,721,724,727,730,733,736],{"class":566,"line":567},[564,716,717],{"class":570},"import",[564,719,720],{"class":585}," {",[564,722,723],{"class":581}," defineStreamedInstrumentation",[564,725,726],{"class":585}," }",[564,728,729],{"class":570}," from",[564,731,732],{"class":585}," '",[564,734,735],{"class":605},"evlog\u002Fnext\u002Fstream",[564,737,738],{"class":585},"'\n",[564,740,741],{"class":566,"line":589},[564,742,744],{"emptyLinePlaceholder":743},true,"\n",[564,746,747,749,753,755,758,760,763,765,768,770,772],{"class":566,"line":617},[564,748,571],{"class":570},[564,750,752],{"class":751},"spNyl"," const",[564,754,720],{"class":585},[564,756,757],{"class":581}," register",[564,759,663],{"class":585},[564,761,762],{"class":581}," onRequestError ",[564,764,627],{"class":585},[564,766,767],{"class":585}," =",[564,769,723],{"class":577},[564,771,582],{"class":581},[564,773,586],{"class":585},[564,775,776,779,781,783,786,788],{"class":566,"line":624},[564,777,778],{"class":592},"  service",[564,780,596],{"class":585},[564,782,732],{"class":585},[564,784,785],{"class":605},"my-app",[564,787,602],{"class":585},[564,789,614],{"class":585},[564,791,792],{"class":566,"line":535},[564,793,794],{"class":620},"  \u002F\u002F stream auto-on when NODE_ENV === 'development'\n",[564,796,798,800],{"class":566,"line":797},6,[564,799,627],{"class":585},[564,801,630],{"class":581},[524,803,805],{"className":557,"code":804,"filename":705,"language":560,"meta":530,"style":530},"import { defineNodeInstrumentation } from 'evlog\u002Fnext\u002Finstrumentation'\n\nexport const { register, onRequestError } = defineNodeInstrumentation(() =>\n  import('.\u002Flib\u002Fevlog')\n)\n",[474,806,807,827,831,859,875],{"__ignoreMap":530},[564,808,809,811,813,816,818,820,822,825],{"class":566,"line":567},[564,810,717],{"class":570},[564,812,720],{"class":585},[564,814,815],{"class":581}," defineNodeInstrumentation",[564,817,726],{"class":585},[564,819,729],{"class":570},[564,821,732],{"class":585},[564,823,824],{"class":605},"evlog\u002Fnext\u002Finstrumentation",[564,826,738],{"class":585},[564,828,829],{"class":566,"line":589},[564,830,744],{"emptyLinePlaceholder":743},[564,832,833,835,837,839,841,843,845,847,849,851,853,856],{"class":566,"line":617},[564,834,571],{"class":570},[564,836,752],{"class":751},[564,838,720],{"class":585},[564,840,757],{"class":581},[564,842,663],{"class":585},[564,844,762],{"class":581},[564,846,627],{"class":585},[564,848,767],{"class":585},[564,850,815],{"class":577},[564,852,582],{"class":581},[564,854,855],{"class":585},"()",[564,857,858],{"class":751}," =>\n",[564,860,861,864,866,868,871,873],{"class":566,"line":624},[564,862,863],{"class":585},"  import",[564,865,582],{"class":581},[564,867,602],{"class":585},[564,869,870],{"class":605},".\u002Flib\u002Fevlog",[564,872,602],{"class":585},[564,874,630],{"class":581},[564,876,877],{"class":566,"line":535},[564,878,630],{"class":581},[435,880,881],{},"In dev, the same banner prints when Next boots the Node runtime. The stream server's drain is composed with any user-provided drain so events keep flowing to your other adapters too.",[551,883,885],{"id":884},"standalone-node-bun-deno-script","Standalone Node \u002F Bun \u002F Deno script",[524,887,889],{"className":557,"code":888,"language":560,"meta":530,"style":530},"import { startStreamServer } from 'evlog\u002Fstream'\nimport { initLogger } from 'evlog'\n\nconst server = await startStreamServer()\ninitLogger({ drain: server.drain })\n\n\u002F\u002F ... your script runs, devtools can subscribe ...\n",[474,890,891,911,930,934,953,981,985],{"__ignoreMap":530},[564,892,893,895,897,900,902,904,906,909],{"class":566,"line":567},[564,894,717],{"class":570},[564,896,720],{"class":585},[564,898,899],{"class":581}," startStreamServer",[564,901,726],{"class":585},[564,903,729],{"class":570},[564,905,732],{"class":585},[564,907,908],{"class":605},"evlog\u002Fstream",[564,910,738],{"class":585},[564,912,913,915,917,920,922,924,926,928],{"class":566,"line":589},[564,914,717],{"class":570},[564,916,720],{"class":585},[564,918,919],{"class":581}," initLogger",[564,921,726],{"class":585},[564,923,729],{"class":570},[564,925,732],{"class":585},[564,927,644],{"class":605},[564,929,738],{"class":585},[564,931,932],{"class":566,"line":617},[564,933,744],{"emptyLinePlaceholder":743},[564,935,936,939,942,945,948,950],{"class":566,"line":624},[564,937,938],{"class":751},"const",[564,940,941],{"class":581}," server ",[564,943,944],{"class":585},"=",[564,946,947],{"class":570}," await",[564,949,899],{"class":577},[564,951,952],{"class":581},"()\n",[564,954,955,958,960,963,966,968,971,974,977,979],{"class":566,"line":535},[564,956,957],{"class":577},"initLogger",[564,959,582],{"class":581},[564,961,962],{"class":585},"{",[564,964,965],{"class":592}," drain",[564,967,596],{"class":585},[564,969,970],{"class":581}," server",[564,972,973],{"class":585},".",[564,975,976],{"class":581},"drain ",[564,978,627],{"class":585},[564,980,630],{"class":581},[564,982,983],{"class":566,"line":797},[564,984,744],{"emptyLinePlaceholder":743},[564,986,988],{"class":566,"line":987},7,[564,989,990],{"class":620},"\u002F\u002F ... your script runs, devtools can subscribe ...\n",[551,992,994],{"id":993},"hono-express-fastify-elysia-nestjs-sveltekit","Hono \u002F Express \u002F Fastify \u002F Elysia \u002F NestJS \u002F SvelteKit",[435,996,997,998,1000,1001,1004],{},"There's no auto-wiring for these frameworks yet. The 3-line manual setup is the same as the standalone Node case — call ",[474,999,488],{}," once during boot and pass ",[474,1002,1003],{},"server.drain"," wherever you compose your evlog drain.",[479,1006,1008],{"id":1007},"api","API",[524,1010,1012],{"className":557,"code":1011,"language":560,"meta":530,"style":530},"import { startStreamServer, type StreamServer, type StreamServerOptions } from 'evlog\u002Fstream'\n\nconst server: StreamServer = await startStreamServer({\n  port: 0,                  \u002F\u002F 0 = OS picks ephemeral port (default)\n  host: '127.0.0.1',        \u002F\u002F default — local-only, never exposed to LAN\n  token: 'optional-bearer', \u002F\u002F default: none (origin check used instead)\n  heartbeatMs: 15_000,      \u002F\u002F default\n  buffer: 500,              \u002F\u002F default ring buffer size\n  banner: true,             \u002F\u002F default — prints `[evlog] Stream → ...`\n  urlFileDir: '.evlog',     \u002F\u002F default — false to disable .evlog\u002Fstream.url\n})\n\nserver.url   \u002F\u002F → 'http:\u002F\u002F127.0.0.1:51203'\nserver.port  \u002F\u002F → 51203\nserver.drain \u002F\u002F DrainFn — pass to nitroApp.hooks.hook('evlog:drain', drain) or initLogger({ drain })\nserver.stream \u002F\u002F StreamDrain (the underlying in-process pub\u002Fsub)\nawait server.close() \u002F\u002F stop, remove .evlog\u002Fstream.url, unsubscribe clients\n",[474,1013,1014,1047,1051,1071,1087,1105,1124,1139,1155,1170,1190,1197,1202,1216,1229,1241,1254],{"__ignoreMap":530},[564,1015,1016,1018,1020,1022,1024,1027,1030,1032,1034,1037,1039,1041,1043,1045],{"class":566,"line":567},[564,1017,717],{"class":570},[564,1019,720],{"class":585},[564,1021,899],{"class":581},[564,1023,663],{"class":585},[564,1025,1026],{"class":570}," type",[564,1028,1029],{"class":581}," StreamServer",[564,1031,663],{"class":585},[564,1033,1026],{"class":570},[564,1035,1036],{"class":581}," StreamServerOptions",[564,1038,726],{"class":585},[564,1040,729],{"class":570},[564,1042,732],{"class":585},[564,1044,908],{"class":605},[564,1046,738],{"class":585},[564,1048,1049],{"class":566,"line":589},[564,1050,744],{"emptyLinePlaceholder":743},[564,1052,1053,1055,1057,1059,1061,1063,1065,1067,1069],{"class":566,"line":617},[564,1054,938],{"class":751},[564,1056,970],{"class":581},[564,1058,596],{"class":585},[564,1060,1029],{"class":643},[564,1062,767],{"class":585},[564,1064,947],{"class":570},[564,1066,899],{"class":577},[564,1068,582],{"class":581},[564,1070,586],{"class":585},[564,1072,1073,1076,1078,1082,1084],{"class":566,"line":624},[564,1074,1075],{"class":592},"  port",[564,1077,596],{"class":585},[564,1079,1081],{"class":1080},"sbssI"," 0",[564,1083,663],{"class":585},[564,1085,1086],{"class":620},"                  \u002F\u002F 0 = OS picks ephemeral port (default)\n",[564,1088,1089,1092,1094,1096,1098,1100,1102],{"class":566,"line":535},[564,1090,1091],{"class":592},"  host",[564,1093,596],{"class":585},[564,1095,732],{"class":585},[564,1097,503],{"class":605},[564,1099,602],{"class":585},[564,1101,663],{"class":585},[564,1103,1104],{"class":620},"        \u002F\u002F default — local-only, never exposed to LAN\n",[564,1106,1107,1110,1112,1114,1117,1119,1121],{"class":566,"line":797},[564,1108,1109],{"class":592},"  token",[564,1111,596],{"class":585},[564,1113,732],{"class":585},[564,1115,1116],{"class":605},"optional-bearer",[564,1118,602],{"class":585},[564,1120,663],{"class":585},[564,1122,1123],{"class":620}," \u002F\u002F default: none (origin check used instead)\n",[564,1125,1126,1129,1131,1134,1136],{"class":566,"line":987},[564,1127,1128],{"class":592},"  heartbeatMs",[564,1130,596],{"class":585},[564,1132,1133],{"class":1080}," 15_000",[564,1135,663],{"class":585},[564,1137,1138],{"class":620},"      \u002F\u002F default\n",[564,1140,1142,1145,1147,1150,1152],{"class":566,"line":1141},8,[564,1143,1144],{"class":592},"  buffer",[564,1146,596],{"class":585},[564,1148,1149],{"class":1080}," 500",[564,1151,663],{"class":585},[564,1153,1154],{"class":620},"              \u002F\u002F default ring buffer size\n",[564,1156,1158,1161,1163,1165,1167],{"class":566,"line":1157},9,[564,1159,1160],{"class":592},"  banner",[564,1162,596],{"class":585},[564,1164,660],{"class":659},[564,1166,663],{"class":585},[564,1168,1169],{"class":620},"             \u002F\u002F default — prints `[evlog] Stream → ...`\n",[564,1171,1173,1176,1178,1180,1183,1185,1187],{"class":566,"line":1172},10,[564,1174,1175],{"class":592},"  urlFileDir",[564,1177,596],{"class":585},[564,1179,732],{"class":585},[564,1181,1182],{"class":605},".evlog",[564,1184,602],{"class":585},[564,1186,663],{"class":585},[564,1188,1189],{"class":620},"     \u002F\u002F default — false to disable .evlog\u002Fstream.url\n",[564,1191,1193,1195],{"class":566,"line":1192},11,[564,1194,627],{"class":585},[564,1196,630],{"class":581},[564,1198,1200],{"class":566,"line":1199},12,[564,1201,744],{"emptyLinePlaceholder":743},[564,1203,1205,1208,1210,1213],{"class":566,"line":1204},13,[564,1206,1207],{"class":581},"server",[564,1209,973],{"class":585},[564,1211,1212],{"class":581},"url   ",[564,1214,1215],{"class":620},"\u002F\u002F → 'http:\u002F\u002F127.0.0.1:51203'\n",[564,1217,1219,1221,1223,1226],{"class":566,"line":1218},14,[564,1220,1207],{"class":581},[564,1222,973],{"class":585},[564,1224,1225],{"class":581},"port  ",[564,1227,1228],{"class":620},"\u002F\u002F → 51203\n",[564,1230,1232,1234,1236,1238],{"class":566,"line":1231},15,[564,1233,1207],{"class":581},[564,1235,973],{"class":585},[564,1237,976],{"class":581},[564,1239,1240],{"class":620},"\u002F\u002F DrainFn — pass to nitroApp.hooks.hook('evlog:drain', drain) or initLogger({ drain })\n",[564,1242,1244,1246,1248,1251],{"class":566,"line":1243},16,[564,1245,1207],{"class":581},[564,1247,973],{"class":585},[564,1249,1250],{"class":581},"stream ",[564,1252,1253],{"class":620},"\u002F\u002F StreamDrain (the underlying in-process pub\u002Fsub)\n",[564,1255,1257,1260,1262,1264,1267,1270],{"class":566,"line":1256},17,[564,1258,1259],{"class":570},"await",[564,1261,970],{"class":581},[564,1263,973],{"class":585},[564,1265,1266],{"class":577},"close",[564,1268,1269],{"class":581},"() ",[564,1271,1272],{"class":620},"\u002F\u002F stop, remove .evlog\u002Fstream.url, unsubscribe clients\n",[435,1274,1275,1277,1278,1281,1282,1285],{},[474,1276,488],{}," is ",[444,1279,1280],{},"idempotent"," — calling it again returns the same instance until ",[474,1283,1284],{},"close()"," is called.",[479,1287,1289],{"id":1288},"endpoints","Endpoints",[1291,1292,1293,1306],"table",{},[1294,1295,1296],"thead",{},[1297,1298,1299,1303],"tr",{},[1300,1301,1302],"th",{},"Path",[1300,1304,1305],{},"Purpose",[1307,1308,1309,1324,1338],"tbody",{},[1297,1310,1311,1317],{},[1312,1313,1314],"td",{},[474,1315,1316],{},"GET \u002F",[1312,1318,1319,1320,1323],{},"The SSE stream itself. Accepts ",[474,1321,1322],{},"?since=\u003Ciso>"," to replay buffered events.",[1297,1325,1326,1331],{},[1312,1327,1328],{},[474,1329,1330],{},"GET \u002Finfo",[1312,1332,1333,1334,1337],{},"JSON ",[474,1335,1336],{},"{ evlogVersion, bufferSize, heartbeatMs }"," — server discovery.",[1297,1339,1340,1345],{},[1312,1341,1342],{},[474,1343,1344],{},"OPTIONS *",[1312,1346,1347,1348,1351],{},"CORS preflight (the server allows ",[474,1349,1350],{},"*"," because it binds to localhost).",[479,1353,1355],{"id":1354},"wire-format","Wire format",[435,1357,1358,1359,1362],{},"Every SSE ",[474,1360,1361],{},"data:"," line is a versioned envelope:",[524,1364,1367],{"className":1365,"code":1366,"language":529,"meta":530},[527],"data: {\"evlog\":\"1\",\"type\":\"hello\",\"data\":{\"evlogVersion\":\"2.16.0\",\"bufferSize\":500,\"heartbeatMs\":15000}}\n\ndata: {\"evlog\":\"1\",\"type\":\"replay\",\"data\":{...wide event...}}\n\ndata: {\"evlog\":\"1\",\"type\":\"event\",\"data\":{...wide event...}}\n\nevent: ping\ndata: {\"evlog\":\"1\",\"type\":\"ping\",\"data\":{\"t\":1730000000000}}\n",[474,1368,1366],{"__ignoreMap":530},[1291,1370,1371,1381],{},[1294,1372,1373],{},[1297,1374,1375,1378],{},[1300,1376,1377],{},"Type",[1300,1379,1380],{},"When",[1307,1382,1383,1393,1406,1416],{},[1297,1384,1385,1390],{},[1312,1386,1387],{},[474,1388,1389],{},"hello",[1312,1391,1392],{},"First frame — server version + stream config",[1297,1394,1395,1400],{},[1312,1396,1397],{},[474,1398,1399],{},"replay",[1312,1401,1402,1403],{},"Each buffered event flushed when the client passed ",[474,1404,1405],{},"?since=",[1297,1407,1408,1413],{},[1312,1409,1410],{},[474,1411,1412],{},"event",[1312,1414,1415],{},"Each new event drained after the connection opened",[1297,1417,1418,1423],{},[1312,1419,1420],{},[474,1421,1422],{},"ping",[1312,1424,1425,1426,1429,1430],{},"Heartbeat every ",[474,1427,1428],{},"heartbeatMs"," (default 15s), sent with ",[474,1431,1432],{},"event: ping",[435,1434,1435,1436,1439],{},"The ",[474,1437,1438],{},"evlog: \"1\""," discriminant is the protocol version — incompatible changes will bump it.",[479,1441,1443],{"id":1442},"auth-model","Auth model",[1291,1445,1446,1456],{},[1294,1447,1448],{},[1297,1449,1450,1453],{},[1300,1451,1452],{},"Mode",[1300,1454,1455],{},"Behavior",[1307,1457,1458,1472,1486,1506],{},[1297,1459,1460,1466],{},[1312,1461,1462,1465],{},[474,1463,1464],{},"token"," set",[1312,1467,1468,1471],{},[474,1469,1470],{},"Authorization: Bearer \u003Ctoken>"," is required. 401 otherwise.",[1297,1473,1474,1483],{},[1312,1475,1476,1478,1479,1482],{},[474,1477,1464],{}," unset, request has no ",[474,1480,1481],{},"Origin"," (curl, Node fetch)",[1312,1484,1485],{},"Allowed.",[1297,1487,1488,1504],{},[1312,1489,1490,1492,1493,1495,1496,464,1499,464,1501,706],{},[474,1491,1464],{}," unset, request ",[474,1494,1481],{}," is local (",[474,1497,1498],{},"localhost",[474,1500,503],{},[474,1502,1503],{},"::1",[1312,1505,1485],{},[1297,1507,1508,1515],{},[1312,1509,1510,1492,1512,1514],{},[474,1511,1464],{},[474,1513,1481],{}," is non-local",[1312,1516,1517],{},"403.",[435,1519,1520,1521,1523,1524,1527],{},"The server binds to ",[474,1522,503],{}," by default — non-local hosts can't reach it at all unless you override ",[474,1525,1526],{},"host",". The token is only useful when you intentionally expose the server to a wider network.",[479,1529,1531],{"id":1530},"discovery","Discovery",[435,1533,1534],{},"External tools (a Tauri devtool, a CLI watcher) can find the running server in two ways:",[491,1536,1537,1544],{},[494,1538,1539,1543],{},[444,1540,1541],{},[474,1542,697],{}," — read directly from the project directory. Cleaned up at process exit.",[494,1545,1546,1551,1552,1555],{},[444,1547,1548],{},[474,1549,1550],{},"GET \u002Fapi\u002F_evlog\u002Fstream-info"," (Nuxt only) — returns ",[474,1553,1554],{},"{ url }",", reads from the file.",[524,1557,1561],{"className":1558,"code":1559,"language":1560,"meta":530,"style":530},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# CLI consumer\nURL=$(cat .evlog\u002Fstream.url) && curl -N \"$URL\"\n","bash",[474,1562,1563,1568],{"__ignoreMap":530},[564,1564,1565],{"class":566,"line":567},[564,1566,1567],{"class":620},"# CLI consumer\n",[564,1569,1570,1573,1576,1579,1582,1584,1587,1590,1593,1596,1599],{"class":566,"line":589},[564,1571,1572],{"class":581},"URL",[564,1574,1575],{"class":585},"=$(",[564,1577,1578],{"class":643},"cat",[564,1580,1581],{"class":605}," .evlog\u002Fstream.url",[564,1583,706],{"class":585},[564,1585,1586],{"class":585}," &&",[564,1588,1589],{"class":643}," curl",[564,1591,1592],{"class":605}," -N",[564,1594,1595],{"class":585}," \"",[564,1597,1598],{"class":581},"$URL",[564,1600,1601],{"class":585},"\"\n",[479,1603,1605],{"id":1604},"going-further","Going further",[1607,1608,1609,1614],"ul",{},[494,1610,1611,1613],{},[439,1612,156],{"href":318}," — copy-paste examples for browser, curl + jq, Node fetch, replay-then-live, aggregation.",[494,1615,1616,1618],{},[439,1617,298],{"href":299}," — the in-process primitive the server is built on.",[1620,1621,1622],"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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":530,"searchDepth":589,"depth":589,"links":1624},[1625,1626,1633,1634,1635,1636,1637,1638],{"id":481,"depth":589,"text":482},{"id":548,"depth":589,"text":549,"children":1627},[1628,1629,1631,1632],{"id":553,"depth":617,"text":554},{"id":701,"depth":617,"text":1630},"Next.js (instrumentation.ts)",{"id":884,"depth":617,"text":885},{"id":993,"depth":617,"text":994},{"id":1007,"depth":589,"text":1008},{"id":1288,"depth":589,"text":1289},{"id":1354,"depth":589,"text":1355},{"id":1442,"depth":589,"text":1443},{"id":1530,"depth":589,"text":1531},{"id":1604,"depth":589,"text":1605},"A local HTTP mini-server on its own port that exposes the in-process stream over Server-Sent Events. Framework-agnostic, auto-started in dev, no app route to wire.","md",null,{},{"title":303,"icon":306},{"title":303,"description":1639},"fmXUyQKvh8iuCRQVCiCo0tabjgLFhmTrUL-2mNKWkGc",[1647,1649],{"title":298,"path":299,"stem":300,"description":1648,"icon":301,"children":-1},"Subscribe to wide events flowing through evlog, in-process, with createStreamDrain — sync listeners, async iterators, and a ring buffer.",{"title":308,"path":309,"stem":310,"description":1650,"icon":311,"children":-1},"Replay and tail the local NDJSON drain with readFsLogs and tailFsLogs — works in-process or from any external Node tool.",1778335585092]