[{"data":1,"prerenderedAt":1968},["ShallowReactive",2],{"navigation_docs":3,"-build-on-top-observers-stream-server":547,"-build-on-top-observers-stream-server-surround":1963},[4,35,159,201,289,446,531],{"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,325,346,373,400,428],{"title":41,"path":295,"stem":296,"icon":54},"\u002Fbuild-on-top\u002Foverview","5.build-on-top\u002F0.overview",{"title":298,"path":299,"stem":300,"children":301,"page":34},"Observers","\u002Fbuild-on-top\u002Fobservers","5.build-on-top\u002Fobservers",[302,306,311,316,321],{"title":41,"path":303,"stem":304,"icon":305},"\u002Fbuild-on-top\u002Fobservers\u002Foverview","5.build-on-top\u002Fobservers\u002F1.overview","i-lucide-eye",{"title":307,"path":308,"stem":309,"icon":310},"Stream API","\u002Fbuild-on-top\u002Fobservers\u002Fin-process-stream","5.build-on-top\u002Fobservers\u002F2.in-process-stream","i-lucide-radio-tower",{"title":312,"path":313,"stem":314,"icon":315},"Stream server","\u002Fbuild-on-top\u002Fobservers\u002Fstream-server","5.build-on-top\u002Fobservers\u002F3.stream-server","i-lucide-radio",{"title":317,"path":318,"stem":319,"icon":320},"FS reader","\u002Fbuild-on-top\u002Fobservers\u002Ffs-reader","5.build-on-top\u002Fobservers\u002F4.fs-reader","i-lucide-folder-search",{"title":156,"path":322,"stem":323,"icon":324},"\u002Fbuild-on-top\u002Fobservers\u002Fconsumer-recipes","5.build-on-top\u002Fobservers\u002F5.consumer-recipes","i-lucide-chef-hat",{"title":326,"path":327,"stem":328,"children":329,"page":34},"Pipeline","\u002Fbuild-on-top\u002Fpipeline","5.build-on-top\u002Fpipeline",[330,334,338,342],{"title":41,"path":331,"stem":332,"icon":333},"\u002Fbuild-on-top\u002Fpipeline\u002Foverview","5.build-on-top\u002Fpipeline\u002F1.overview","i-lucide-workflow",{"title":335,"path":336,"stem":337,"icon":288},"Plugins","\u002Fbuild-on-top\u002Fpipeline\u002Fplugins","5.build-on-top\u002Fpipeline\u002F2.plugins",{"title":339,"path":340,"stem":341,"icon":28},"Custom enrichers","\u002Fbuild-on-top\u002Fpipeline\u002Fcustom-enrichers","5.build-on-top\u002Fpipeline\u002F3.custom-enrichers",{"title":343,"path":344,"stem":345,"icon":178},"Tail sampling","\u002Fbuild-on-top\u002Fpipeline\u002Ftail-sampling","5.build-on-top\u002Fpipeline\u002F4.tail-sampling",{"title":347,"path":348,"stem":349,"children":350,"page":34},"Scenarios","\u002Fbuild-on-top\u002Fscenarios","5.build-on-top\u002Fscenarios",[351,355,359,364,368],{"title":41,"path":352,"stem":353,"icon":354},"\u002Fbuild-on-top\u002Fscenarios\u002Foverview","5.build-on-top\u002Fscenarios\u002F0.overview","i-lucide-clipboard-list",{"title":356,"path":357,"stem":358,"icon":49},"Local debugging toolkit","\u002Fbuild-on-top\u002Fscenarios\u002Flocal-debugging-toolkit","5.build-on-top\u002Fscenarios\u002F1.local-debugging-toolkit",{"title":360,"path":361,"stem":362,"icon":363},"Tenant-aware logging","\u002Fbuild-on-top\u002Fscenarios\u002Ftenant-aware-logging","5.build-on-top\u002Fscenarios\u002F2.tenant-aware-logging","i-lucide-users",{"title":365,"path":366,"stem":367,"icon":129},"Compliance audit","\u002Fbuild-on-top\u002Fscenarios\u002Fcompliance-audit","5.build-on-top\u002Fscenarios\u002F3.compliance-audit",{"title":369,"path":370,"stem":371,"icon":372},"Cross-app error vocab","\u002Fbuild-on-top\u002Fscenarios\u002Fcross-app-error-vocab","5.build-on-top\u002Fscenarios\u002F4.cross-app-error-vocab","i-lucide-book",{"title":374,"path":375,"stem":376,"children":377,"page":34},"Shared packages","\u002Fbuild-on-top\u002Fshared","5.build-on-top\u002Fshared",[378,382,386,391,395],{"title":41,"path":379,"stem":380,"icon":381},"\u002Fbuild-on-top\u002Fshared\u002Foverview","5.build-on-top\u002Fshared\u002F1.overview","i-lucide-package",{"title":383,"path":384,"stem":385,"icon":381},"Catalogs as packages","\u002Fbuild-on-top\u002Fshared\u002Fcatalogs-as-packages","5.build-on-top\u002Fshared\u002F2.catalogs-as-packages",{"title":387,"path":388,"stem":389,"icon":390},"Drains as packages","\u002Fbuild-on-top\u002Fshared\u002Fdrains-as-packages","5.build-on-top\u002Fshared\u002F3.drains-as-packages","i-lucide-package-2",{"title":392,"path":393,"stem":394,"icon":28},"Enrichers as packages","\u002Fbuild-on-top\u002Fshared\u002Fenrichers-as-packages","5.build-on-top\u002Fshared\u002F4.enrichers-as-packages",{"title":396,"path":397,"stem":398,"icon":399},"Integration as package","\u002Fbuild-on-top\u002Fshared\u002Fintegration-as-package","5.build-on-top\u002Fshared\u002F5.integration-as-package","i-lucide-package-check",{"title":401,"path":402,"stem":403,"children":404,"page":34},"Sinks","\u002Fbuild-on-top\u002Fsinks","5.build-on-top\u002Fsinks",[405,409,414,418,423],{"title":41,"path":406,"stem":407,"icon":408},"\u002Fbuild-on-top\u002Fsinks\u002Foverview","5.build-on-top\u002Fsinks\u002F1.overview","i-lucide-arrow-up-from-line",{"title":410,"path":411,"stem":412,"icon":413},"Custom drains","\u002Fbuild-on-top\u002Fsinks\u002Fcustom-drains","5.build-on-top\u002Fsinks\u002F2.custom-drains","i-lucide-code-2",{"title":415,"path":416,"stem":417,"icon":333},"Drain pipeline","\u002Fbuild-on-top\u002Fsinks\u002Fdrain-pipeline","5.build-on-top\u002Fsinks\u002F3.drain-pipeline",{"title":419,"path":420,"stem":421,"icon":422},"Identity headers","\u002Fbuild-on-top\u002Fsinks\u002Fidentity-headers","5.build-on-top\u002Fsinks\u002F4.identity-headers","i-lucide-fingerprint",{"title":424,"path":425,"stem":426,"icon":427},"Fanout","\u002Fbuild-on-top\u002Fsinks\u002Ffanout-and-multi-drain","5.build-on-top\u002Fsinks\u002F5.fanout-and-multi-drain","i-lucide-share-2",{"title":429,"path":430,"stem":431,"children":432,"page":34},"Sources","\u002Fbuild-on-top\u002Fsources","5.build-on-top\u002Fsources",[433,437,441],{"title":41,"path":434,"stem":435,"icon":436},"\u002Fbuild-on-top\u002Fsources\u002Foverview","5.build-on-top\u002Fsources\u002F1.overview","i-lucide-arrow-down-to-line",{"title":438,"path":439,"stem":440,"icon":288},"Custom framework","\u002Fbuild-on-top\u002Fsources\u002Fcustom-framework","5.build-on-top\u002Fsources\u002F2.custom-framework",{"title":442,"path":443,"stem":444,"icon":445},"Middleware toolkit","\u002Fbuild-on-top\u002Fsources\u002Fmiddleware-toolkit","5.build-on-top\u002Fsources\u002F3.middleware-toolkit","i-lucide-wrench",{"title":447,"path":448,"stem":449,"children":450,"page":34},"Adapters","\u002Fadapters","6.adapters",[451,454,494,509],{"title":41,"path":452,"stem":453,"icon":44},"\u002Fadapters\u002Foverview","6.adapters\u002F01.overview",{"title":455,"path":456,"stem":457,"children":458,"page":34},"Cloud destinations","\u002Fadapters\u002Fcloud","6.adapters\u002F02.cloud",[459,464,469,474,479,484,489],{"title":460,"path":461,"stem":462,"icon":463},"Axiom","\u002Fadapters\u002Fcloud\u002Faxiom","6.adapters\u002F02.cloud\u002F01.axiom","i-custom-axiom",{"title":465,"path":466,"stem":467,"icon":468},"OTLP","\u002Fadapters\u002Fcloud\u002Fotlp","6.adapters\u002F02.cloud\u002F02.otlp","i-simple-icons-opentelemetry",{"title":470,"path":471,"stem":472,"icon":473},"PostHog","\u002Fadapters\u002Fcloud\u002Fposthog","6.adapters\u002F02.cloud\u002F03.posthog","i-simple-icons-posthog",{"title":475,"path":476,"stem":477,"icon":478},"Sentry","\u002Fadapters\u002Fcloud\u002Fsentry","6.adapters\u002F02.cloud\u002F04.sentry","i-simple-icons-sentry",{"title":480,"path":481,"stem":482,"icon":483},"Better Stack","\u002Fadapters\u002Fcloud\u002Fbetter-stack","6.adapters\u002F02.cloud\u002F05.better-stack","i-simple-icons-betterstack",{"title":485,"path":486,"stem":487,"icon":488},"Datadog","\u002Fadapters\u002Fcloud\u002Fdatadog","6.adapters\u002F02.cloud\u002F06.datadog","i-simple-icons-datadog",{"title":490,"path":491,"stem":492,"icon":493},"HyperDX","\u002Fadapters\u002Fcloud\u002Fhyperdx","6.adapters\u002F02.cloud\u002F07.hyperdx","i-custom-hyperdx",{"title":495,"path":496,"stem":497,"children":498,"page":34},"Self-hosted","\u002Fadapters\u002Fself-hosted","6.adapters\u002F03.self-hosted",[499,504],{"title":500,"path":501,"stem":502,"icon":503},"File System","\u002Fadapters\u002Fself-hosted\u002Ffs","6.adapters\u002F03.self-hosted\u002F01.fs","i-lucide-hard-drive",{"title":505,"path":506,"stem":507,"icon":508},"NuxtHub","\u002Fadapters\u002Fself-hosted\u002Fnuxthub","6.adapters\u002F03.self-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":510,"path":511,"stem":512,"children":513,"page":34},"Building blocks","\u002Fadapters\u002Fbuilding-blocks","6.adapters\u002F04.building-blocks",[514,517,522,526],{"title":326,"path":515,"stem":516,"icon":333},"\u002Fadapters\u002Fbuilding-blocks\u002Fpipeline","6.adapters\u002F04.building-blocks\u002F01.pipeline",{"title":518,"path":519,"stem":520,"icon":521},"HTTP","\u002Fadapters\u002Fbuilding-blocks\u002Fhttp","6.adapters\u002F04.building-blocks\u002F02.http","i-lucide-globe",{"title":523,"path":524,"stem":525,"icon":83},"Custom Adapters","\u002Fadapters\u002Fbuilding-blocks\u002Fcustom","6.adapters\u002F04.building-blocks\u002F03.custom",{"title":527,"path":528,"stem":529,"icon":530},"Toolkit","\u002Fadapters\u002Fbuilding-blocks\u002Ftoolkit","6.adapters\u002F04.building-blocks\u002F04.toolkit","i-lucide-blocks",{"title":532,"path":533,"stem":534,"children":535,"page":34},"Enrichers","\u002Fenrichers","7.enrichers",[536,539,543],{"title":41,"path":537,"stem":538,"icon":28},"\u002Fenrichers\u002Foverview","7.enrichers\u002F1.overview",{"title":540,"path":541,"stem":542,"icon":288},"Built-in","\u002Fenrichers\u002Fbuilt-in","7.enrichers\u002F2.built-in",{"title":544,"path":545,"stem":546,"icon":83},"Custom","\u002Fenrichers\u002Fcustom","7.enrichers\u002F3.custom",{"id":548,"title":312,"body":549,"description":1956,"extension":1957,"links":1958,"meta":1959,"navigation":1960,"path":313,"seo":1961,"stem":314,"__hash__":1962},"docs\u002F5.build-on-top\u002Fobservers\u002F3.stream-server.md",{"type":550,"value":551,"toc":1940},"minimark",[552,566,596,602,607,614,647,657,670,674,678,777,787,851,862,870,968,1045,1048,1052,1157,1161,1174,1220,1224,1487,1500,1504,1510,1558,1561,1606,1686,1696,1700,1756,1760,1767,1773,1837,1844,1848,1851,1872,1918,1922,1936],[553,554,555,556,560,561,565],"p",{},"evlog ships a tiny HTTP server that exposes the ",[557,558,559],"a",{"href":308},"in-process stream"," over ",[562,563,564],"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.",[567,568,571,576,588],"callout",{"icon":569,"color":570},"i-lucide-alert-triangle","warning",[553,572,573],{},[562,574,575],{},"Local development and long-lived self-hosted servers only.",[553,577,578,579,582,583,582,585,587],{},"The server lives in-process. On serverless platforms (",[562,580,581],{},"Vercel Functions",", ",[562,584,266],{},[562,586,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.",[553,589,590,591,595],{},"It works perfectly in ",[592,593,594],"code",{},"pnpm dev",", on a Node \u002F Bun \u002F Deno container, on a long-lived VM, on Fly \u002F Railway \u002F Coolify-style instances.",[567,597,598,601],{"icon":13},[562,599,600],{},"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.",[603,604,606],"h2",{"id":605},"what-boots-up","What boots up",[553,608,609,610,613],{},"When you opt in, evlog calls ",[592,611,612],{},"startStreamServer()"," and:",[615,616,617,629,637,644],"ol",{},[618,619,620,621,624,625,628],"li",{},"Opens a ",[592,622,623],{},"node:http"," server bound to ",[592,626,627],{},"127.0.0.1"," on an OS-assigned ephemeral port.",[618,630,631,632,636],{},"Subscribes the SSE connections to the ",[557,633,635],{"href":634},"\u002Fbuild-on-top\u002Fobservers\u002Fin-process-stream#default-singleton","default in-process stream"," — every wide event flows through.",[618,638,639,640,643],{},"Writes the URL to ",[592,641,642],{},"\u003Ccwd>\u002F.evlog\u002Fstream.url"," so external tools can discover the port.",[618,645,646],{},"Prints a banner at startup:",[648,649,655],"pre",{"className":650,"code":652,"language":653,"meta":654},[651],"language-text","  [evlog] Stream → http:\u002F\u002F127.0.0.1:51203\n","text","",[592,656,652],{"__ignoreMap":654},[615,658,660],{"start":659},5,[618,661,662,663,582,666,669],{},"Cleans up the URL file and closes the server on ",[592,664,665],{},"SIGINT",[592,667,668],{},"SIGTERM",", and process exit.",[603,671,673],{"id":672},"per-framework","Per framework",[675,676,211],"h3",{"id":677},"nuxt",[648,679,684],{"className":680,"code":681,"filename":682,"language":683,"meta":654,"style":654},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineNuxtConfig({\n  modules: ['evlog\u002Fnuxt'],\n  evlog: {\n    stream: true,\n  },\n})\n","nuxt.config.ts","ts",[592,685,686,710,738,749,763,768],{"__ignoreMap":654},[687,688,691,695,698,702,706],"span",{"class":689,"line":690},"line",1,[687,692,694],{"class":693},"s7zQu","export",[687,696,697],{"class":693}," default",[687,699,701],{"class":700},"s2Zo4"," defineNuxtConfig",[687,703,705],{"class":704},"sTEyZ","(",[687,707,709],{"class":708},"sMK4o","{\n",[687,711,713,717,720,723,726,730,732,735],{"class":689,"line":712},2,[687,714,716],{"class":715},"swJcz","  modules",[687,718,719],{"class":708},":",[687,721,722],{"class":704}," [",[687,724,725],{"class":708},"'",[687,727,729],{"class":728},"sfazB","evlog\u002Fnuxt",[687,731,725],{"class":708},[687,733,734],{"class":704},"]",[687,736,737],{"class":708},",\n",[687,739,741,744,746],{"class":689,"line":740},3,[687,742,743],{"class":715},"  evlog",[687,745,719],{"class":708},[687,747,748],{"class":708}," {\n",[687,750,752,755,757,761],{"class":689,"line":751},4,[687,753,754],{"class":715},"    stream",[687,756,719],{"class":708},[687,758,760],{"class":759},"sfNiH"," true",[687,762,737],{"class":708},[687,764,765],{"class":689,"line":659},[687,766,767],{"class":708},"  },\n",[687,769,771,774],{"class":689,"line":770},6,[687,772,773],{"class":708},"}",[687,775,776],{"class":704},")\n",[553,778,779,780,782,783,786],{},"That's it — ",[592,781,594],{}," boots the server and prints the URL. Pass an options object instead of ",[592,784,785],{},"true"," for full control:",[648,788,790],{"className":680,"code":789,"language":683,"meta":654,"style":654},"evlog: {\n  stream: { port: 4317, token: process.env.EVLOG_STREAM_TOKEN },\n}\n",[592,791,792,802,846],{"__ignoreMap":654},[687,793,794,798,800],{"class":689,"line":690},[687,795,797],{"class":796},"sBMFI","evlog",[687,799,719],{"class":708},[687,801,748],{"class":708},[687,803,804,807,809,812,815,817,821,824,827,829,832,835,838,840,843],{"class":689,"line":712},[687,805,806],{"class":796},"  stream",[687,808,719],{"class":708},[687,810,811],{"class":708}," {",[687,813,814],{"class":796}," port",[687,816,719],{"class":708},[687,818,820],{"class":819},"sbssI"," 4317",[687,822,823],{"class":708},",",[687,825,826],{"class":796}," token",[687,828,719],{"class":708},[687,830,831],{"class":704}," process",[687,833,834],{"class":708},".",[687,836,837],{"class":704},"env",[687,839,834],{"class":708},[687,841,842],{"class":704},"EVLOG_STREAM_TOKEN",[687,844,845],{"class":708}," },\n",[687,847,848],{"class":689,"line":740},[687,849,850],{"class":708},"}\n",[553,852,853,854,857,858,861],{},"The Nuxt module also registers a tiny ",[592,855,856],{},"\u002Fapi\u002F_evlog\u002Fstream-info"," route that reads ",[592,859,860],{},".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.",[675,863,865,866,869],{"id":864},"nextjs-instrumentationts","Next.js (",[592,867,868],{},"instrumentation.ts",")",[648,871,874],{"className":680,"code":872,"filename":873,"language":683,"meta":654,"style":654},"import { defineStreamedInstrumentation } from 'evlog\u002Fnext\u002Fstream'\n\nexport const { register, onRequestError } = defineStreamedInstrumentation({\n  service: 'my-app',\n  stream: true,\n})\n","lib\u002Fevlog.ts",[592,875,876,901,907,936,952,962],{"__ignoreMap":654},[687,877,878,881,883,886,889,892,895,898],{"class":689,"line":690},[687,879,880],{"class":693},"import",[687,882,811],{"class":708},[687,884,885],{"class":704}," defineStreamedInstrumentation",[687,887,888],{"class":708}," }",[687,890,891],{"class":693}," from",[687,893,894],{"class":708}," '",[687,896,897],{"class":728},"evlog\u002Fnext\u002Fstream",[687,899,900],{"class":708},"'\n",[687,902,903],{"class":689,"line":712},[687,904,906],{"emptyLinePlaceholder":905},true,"\n",[687,908,909,911,915,917,920,922,925,927,930,932,934],{"class":689,"line":740},[687,910,694],{"class":693},[687,912,914],{"class":913},"spNyl"," const",[687,916,811],{"class":708},[687,918,919],{"class":704}," register",[687,921,823],{"class":708},[687,923,924],{"class":704}," onRequestError ",[687,926,773],{"class":708},[687,928,929],{"class":708}," =",[687,931,885],{"class":700},[687,933,705],{"class":704},[687,935,709],{"class":708},[687,937,938,941,943,945,948,950],{"class":689,"line":751},[687,939,940],{"class":715},"  service",[687,942,719],{"class":708},[687,944,894],{"class":708},[687,946,947],{"class":728},"my-app",[687,949,725],{"class":708},[687,951,737],{"class":708},[687,953,954,956,958,960],{"class":689,"line":659},[687,955,806],{"class":715},[687,957,719],{"class":708},[687,959,760],{"class":759},[687,961,737],{"class":708},[687,963,964,966],{"class":689,"line":770},[687,965,773],{"class":708},[687,967,776],{"class":704},[648,969,971],{"className":680,"code":970,"filename":868,"language":683,"meta":654,"style":654},"import { defineNodeInstrumentation } from 'evlog\u002Fnext\u002Finstrumentation'\n\nexport const { register, onRequestError } = defineNodeInstrumentation(() =>\n  import('.\u002Flib\u002Fevlog')\n)\n",[592,972,973,993,997,1025,1041],{"__ignoreMap":654},[687,974,975,977,979,982,984,986,988,991],{"class":689,"line":690},[687,976,880],{"class":693},[687,978,811],{"class":708},[687,980,981],{"class":704}," defineNodeInstrumentation",[687,983,888],{"class":708},[687,985,891],{"class":693},[687,987,894],{"class":708},[687,989,990],{"class":728},"evlog\u002Fnext\u002Finstrumentation",[687,992,900],{"class":708},[687,994,995],{"class":689,"line":712},[687,996,906],{"emptyLinePlaceholder":905},[687,998,999,1001,1003,1005,1007,1009,1011,1013,1015,1017,1019,1022],{"class":689,"line":740},[687,1000,694],{"class":693},[687,1002,914],{"class":913},[687,1004,811],{"class":708},[687,1006,919],{"class":704},[687,1008,823],{"class":708},[687,1010,924],{"class":704},[687,1012,773],{"class":708},[687,1014,929],{"class":708},[687,1016,981],{"class":700},[687,1018,705],{"class":704},[687,1020,1021],{"class":708},"()",[687,1023,1024],{"class":913}," =>\n",[687,1026,1027,1030,1032,1034,1037,1039],{"class":689,"line":751},[687,1028,1029],{"class":708},"  import",[687,1031,705],{"class":704},[687,1033,725],{"class":708},[687,1035,1036],{"class":728},".\u002Flib\u002Fevlog",[687,1038,725],{"class":708},[687,1040,776],{"class":704},[687,1042,1043],{"class":689,"line":659},[687,1044,776],{"class":704},[553,1046,1047],{},"The stream server's drain is composed with any user-provided drain so events keep flowing to your other adapters too.",[675,1049,1051],{"id":1050},"standalone-node-bun-deno-script","Standalone Node \u002F Bun \u002F Deno script",[648,1053,1055],{"className":680,"code":1054,"language":683,"meta":654,"style":654},"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",[592,1056,1057,1077,1096,1100,1119,1146,1150],{"__ignoreMap":654},[687,1058,1059,1061,1063,1066,1068,1070,1072,1075],{"class":689,"line":690},[687,1060,880],{"class":693},[687,1062,811],{"class":708},[687,1064,1065],{"class":704}," startStreamServer",[687,1067,888],{"class":708},[687,1069,891],{"class":693},[687,1071,894],{"class":708},[687,1073,1074],{"class":728},"evlog\u002Fstream",[687,1076,900],{"class":708},[687,1078,1079,1081,1083,1086,1088,1090,1092,1094],{"class":689,"line":712},[687,1080,880],{"class":693},[687,1082,811],{"class":708},[687,1084,1085],{"class":704}," initLogger",[687,1087,888],{"class":708},[687,1089,891],{"class":693},[687,1091,894],{"class":708},[687,1093,797],{"class":728},[687,1095,900],{"class":708},[687,1097,1098],{"class":689,"line":740},[687,1099,906],{"emptyLinePlaceholder":905},[687,1101,1102,1105,1108,1111,1114,1116],{"class":689,"line":751},[687,1103,1104],{"class":913},"const",[687,1106,1107],{"class":704}," server ",[687,1109,1110],{"class":708},"=",[687,1112,1113],{"class":693}," await",[687,1115,1065],{"class":700},[687,1117,1118],{"class":704},"()\n",[687,1120,1121,1124,1126,1129,1132,1134,1137,1139,1142,1144],{"class":689,"line":659},[687,1122,1123],{"class":700},"initLogger",[687,1125,705],{"class":704},[687,1127,1128],{"class":708},"{",[687,1130,1131],{"class":715}," drain",[687,1133,719],{"class":708},[687,1135,1136],{"class":704}," server",[687,1138,834],{"class":708},[687,1140,1141],{"class":704},"drain ",[687,1143,773],{"class":708},[687,1145,776],{"class":704},[687,1147,1148],{"class":689,"line":770},[687,1149,906],{"emptyLinePlaceholder":905},[687,1151,1153],{"class":689,"line":1152},7,[687,1154,1156],{"class":1155},"sHwdD","\u002F\u002F ... your script runs, devtools can subscribe ...\n",[675,1158,1160],{"id":1159},"hono-express-fastify-elysia-nestjs-sveltekit","Hono \u002F Express \u002F Fastify \u002F Elysia \u002F NestJS \u002F SvelteKit",[553,1162,1163,1164,1166,1167,1169,1170,1173],{},"These integrations work as documented in their respective ",[557,1165,202],{"href":207}," pages — no extra setup is required to use them with the stream server. The server is independent of the framework middleware: import ",[592,1168,612],{}," once at boot and pass ",[592,1171,1172],{},"server.drain"," wherever you compose your evlog drain.",[648,1175,1177],{"className":680,"code":1176,"language":683,"meta":654,"style":654},"import { startStreamServer } from 'evlog\u002Fstream'\n\nconst server = await startStreamServer()\n\u002F\u002F then plug `server.drain` into your evlog drain composer\n",[592,1178,1179,1197,1201,1215],{"__ignoreMap":654},[687,1180,1181,1183,1185,1187,1189,1191,1193,1195],{"class":689,"line":690},[687,1182,880],{"class":693},[687,1184,811],{"class":708},[687,1186,1065],{"class":704},[687,1188,888],{"class":708},[687,1190,891],{"class":693},[687,1192,894],{"class":708},[687,1194,1074],{"class":728},[687,1196,900],{"class":708},[687,1198,1199],{"class":689,"line":712},[687,1200,906],{"emptyLinePlaceholder":905},[687,1202,1203,1205,1207,1209,1211,1213],{"class":689,"line":740},[687,1204,1104],{"class":913},[687,1206,1107],{"class":704},[687,1208,1110],{"class":708},[687,1210,1113],{"class":693},[687,1212,1065],{"class":700},[687,1214,1118],{"class":704},[687,1216,1217],{"class":689,"line":751},[687,1218,1219],{"class":1155},"\u002F\u002F then plug `server.drain` into your evlog drain composer\n",[603,1221,1223],{"id":1222},"api","API",[648,1225,1227],{"className":680,"code":1226,"language":683,"meta":654,"style":654},"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",[592,1228,1229,1262,1266,1286,1301,1319,1338,1353,1369,1384,1404,1411,1416,1430,1443,1455,1468],{"__ignoreMap":654},[687,1230,1231,1233,1235,1237,1239,1242,1245,1247,1249,1252,1254,1256,1258,1260],{"class":689,"line":690},[687,1232,880],{"class":693},[687,1234,811],{"class":708},[687,1236,1065],{"class":704},[687,1238,823],{"class":708},[687,1240,1241],{"class":693}," type",[687,1243,1244],{"class":704}," StreamServer",[687,1246,823],{"class":708},[687,1248,1241],{"class":693},[687,1250,1251],{"class":704}," StreamServerOptions",[687,1253,888],{"class":708},[687,1255,891],{"class":693},[687,1257,894],{"class":708},[687,1259,1074],{"class":728},[687,1261,900],{"class":708},[687,1263,1264],{"class":689,"line":712},[687,1265,906],{"emptyLinePlaceholder":905},[687,1267,1268,1270,1272,1274,1276,1278,1280,1282,1284],{"class":689,"line":740},[687,1269,1104],{"class":913},[687,1271,1136],{"class":704},[687,1273,719],{"class":708},[687,1275,1244],{"class":796},[687,1277,929],{"class":708},[687,1279,1113],{"class":693},[687,1281,1065],{"class":700},[687,1283,705],{"class":704},[687,1285,709],{"class":708},[687,1287,1288,1291,1293,1296,1298],{"class":689,"line":751},[687,1289,1290],{"class":715},"  port",[687,1292,719],{"class":708},[687,1294,1295],{"class":819}," 0",[687,1297,823],{"class":708},[687,1299,1300],{"class":1155},"                  \u002F\u002F 0 = OS picks ephemeral port (default)\n",[687,1302,1303,1306,1308,1310,1312,1314,1316],{"class":689,"line":659},[687,1304,1305],{"class":715},"  host",[687,1307,719],{"class":708},[687,1309,894],{"class":708},[687,1311,627],{"class":728},[687,1313,725],{"class":708},[687,1315,823],{"class":708},[687,1317,1318],{"class":1155},"        \u002F\u002F default — local-only, never exposed to LAN\n",[687,1320,1321,1324,1326,1328,1331,1333,1335],{"class":689,"line":770},[687,1322,1323],{"class":715},"  token",[687,1325,719],{"class":708},[687,1327,894],{"class":708},[687,1329,1330],{"class":728},"optional-bearer",[687,1332,725],{"class":708},[687,1334,823],{"class":708},[687,1336,1337],{"class":1155}," \u002F\u002F default: none (origin check used instead)\n",[687,1339,1340,1343,1345,1348,1350],{"class":689,"line":1152},[687,1341,1342],{"class":715},"  heartbeatMs",[687,1344,719],{"class":708},[687,1346,1347],{"class":819}," 15_000",[687,1349,823],{"class":708},[687,1351,1352],{"class":1155},"      \u002F\u002F default\n",[687,1354,1356,1359,1361,1364,1366],{"class":689,"line":1355},8,[687,1357,1358],{"class":715},"  buffer",[687,1360,719],{"class":708},[687,1362,1363],{"class":819}," 500",[687,1365,823],{"class":708},[687,1367,1368],{"class":1155},"              \u002F\u002F default ring buffer size\n",[687,1370,1372,1375,1377,1379,1381],{"class":689,"line":1371},9,[687,1373,1374],{"class":715},"  banner",[687,1376,719],{"class":708},[687,1378,760],{"class":759},[687,1380,823],{"class":708},[687,1382,1383],{"class":1155},"             \u002F\u002F default — prints `[evlog] Stream → ...`\n",[687,1385,1387,1390,1392,1394,1397,1399,1401],{"class":689,"line":1386},10,[687,1388,1389],{"class":715},"  urlFileDir",[687,1391,719],{"class":708},[687,1393,894],{"class":708},[687,1395,1396],{"class":728},".evlog",[687,1398,725],{"class":708},[687,1400,823],{"class":708},[687,1402,1403],{"class":1155},"     \u002F\u002F default — false to disable .evlog\u002Fstream.url\n",[687,1405,1407,1409],{"class":689,"line":1406},11,[687,1408,773],{"class":708},[687,1410,776],{"class":704},[687,1412,1414],{"class":689,"line":1413},12,[687,1415,906],{"emptyLinePlaceholder":905},[687,1417,1419,1422,1424,1427],{"class":689,"line":1418},13,[687,1420,1421],{"class":704},"server",[687,1423,834],{"class":708},[687,1425,1426],{"class":704},"url   ",[687,1428,1429],{"class":1155},"\u002F\u002F → 'http:\u002F\u002F127.0.0.1:51203'\n",[687,1431,1433,1435,1437,1440],{"class":689,"line":1432},14,[687,1434,1421],{"class":704},[687,1436,834],{"class":708},[687,1438,1439],{"class":704},"port  ",[687,1441,1442],{"class":1155},"\u002F\u002F → 51203\n",[687,1444,1446,1448,1450,1452],{"class":689,"line":1445},15,[687,1447,1421],{"class":704},[687,1449,834],{"class":708},[687,1451,1141],{"class":704},[687,1453,1454],{"class":1155},"\u002F\u002F DrainFn — pass to nitroApp.hooks.hook('evlog:drain', drain) or initLogger({ drain })\n",[687,1456,1458,1460,1462,1465],{"class":689,"line":1457},16,[687,1459,1421],{"class":704},[687,1461,834],{"class":708},[687,1463,1464],{"class":704},"stream ",[687,1466,1467],{"class":1155},"\u002F\u002F StreamDrain (the underlying in-process pub\u002Fsub)\n",[687,1469,1471,1474,1476,1478,1481,1484],{"class":689,"line":1470},17,[687,1472,1473],{"class":693},"await",[687,1475,1136],{"class":704},[687,1477,834],{"class":708},[687,1479,1480],{"class":700},"close",[687,1482,1483],{"class":704},"() ",[687,1485,1486],{"class":1155},"\u002F\u002F stop, remove .evlog\u002Fstream.url, unsubscribe clients\n",[553,1488,1489,1491,1492,1495,1496,1499],{},[592,1490,612],{}," is ",[562,1493,1494],{},"idempotent"," — calling it again returns the same instance until ",[592,1497,1498],{},"close()"," is called.",[603,1501,1503],{"id":1502},"security","Security",[553,1505,1506,1507,1509],{},"The server binds to ",[592,1508,627],{}," by default and is unreachable from the LAN. For any non-local exposure (different host, reverse-proxy, port-forward), add a bearer token:",[648,1511,1513],{"className":680,"code":1512,"language":683,"meta":654,"style":654},"evlog: {\n  stream: {\n    token: process.env.EVLOG_STREAM_TOKEN,\n  },\n}\n",[592,1514,1515,1523,1531,1550,1554],{"__ignoreMap":654},[687,1516,1517,1519,1521],{"class":689,"line":690},[687,1518,797],{"class":796},[687,1520,719],{"class":708},[687,1522,748],{"class":708},[687,1524,1525,1527,1529],{"class":689,"line":712},[687,1526,806],{"class":796},[687,1528,719],{"class":708},[687,1530,748],{"class":708},[687,1532,1533,1536,1538,1540,1542,1544,1546,1548],{"class":689,"line":740},[687,1534,1535],{"class":796},"    token",[687,1537,719],{"class":708},[687,1539,831],{"class":704},[687,1541,834],{"class":708},[687,1543,837],{"class":704},[687,1545,834],{"class":708},[687,1547,842],{"class":704},[687,1549,737],{"class":708},[687,1551,1552],{"class":689,"line":751},[687,1553,767],{"class":708},[687,1555,1556],{"class":689,"line":659},[687,1557,850],{"class":708},[553,1559,1560],{},"Or programmatically:",[648,1562,1564],{"className":680,"code":1563,"language":683,"meta":654,"style":654},"const server = await startStreamServer({\n  token: process.env.EVLOG_STREAM_TOKEN,\n})\n",[592,1565,1566,1582,1600],{"__ignoreMap":654},[687,1567,1568,1570,1572,1574,1576,1578,1580],{"class":689,"line":690},[687,1569,1104],{"class":913},[687,1571,1107],{"class":704},[687,1573,1110],{"class":708},[687,1575,1113],{"class":693},[687,1577,1065],{"class":700},[687,1579,705],{"class":704},[687,1581,709],{"class":708},[687,1583,1584,1586,1588,1590,1592,1594,1596,1598],{"class":689,"line":712},[687,1585,1323],{"class":715},[687,1587,719],{"class":708},[687,1589,831],{"class":704},[687,1591,834],{"class":708},[687,1593,837],{"class":704},[687,1595,834],{"class":708},[687,1597,842],{"class":704},[687,1599,737],{"class":708},[687,1601,1602,1604],{"class":689,"line":740},[687,1603,773],{"class":708},[687,1605,776],{"class":704},[1607,1608,1609,1622],"table",{},[1610,1611,1612],"thead",{},[1613,1614,1615,1619],"tr",{},[1616,1617,1618],"th",{},"Mode",[1616,1620,1621],{},"Behavior",[1623,1624,1625,1640,1654,1674],"tbody",{},[1613,1626,1627,1634],{},[1628,1629,1630,1633],"td",{},[592,1631,1632],{},"token"," set",[1628,1635,1636,1639],{},[592,1637,1638],{},"Authorization: Bearer \u003Ctoken>"," is required. 401 otherwise.",[1613,1641,1642,1651],{},[1628,1643,1644,1646,1647,1650],{},[592,1645,1632],{}," unset, request has no ",[592,1648,1649],{},"Origin"," (curl, Node fetch)",[1628,1652,1653],{},"Allowed.",[1613,1655,1656,1672],{},[1628,1657,1658,1660,1661,1663,1664,582,1667,582,1669,869],{},[592,1659,1632],{}," unset, request ",[592,1662,1649],{}," is local (",[592,1665,1666],{},"localhost",[592,1668,627],{},[592,1670,1671],{},"::1",[1628,1673,1653],{},[1613,1675,1676,1683],{},[1628,1677,1678,1660,1680,1682],{},[592,1679,1632],{},[592,1681,1649],{}," is non-local",[1628,1684,1685],{},"403.",[553,1687,1688,1689,1692,1693,1695],{},"You can also override ",[592,1690,1691],{},"host",", but think twice — exposing the server beyond ",[592,1694,627],{}," without a token is unsafe. Wide events often carry user data your other adapters would normally redact.",[603,1697,1699],{"id":1698},"endpoints","Endpoints",[1607,1701,1702,1712],{},[1610,1703,1704],{},[1613,1705,1706,1709],{},[1616,1707,1708],{},"Path",[1616,1710,1711],{},"Purpose",[1623,1713,1714,1728,1742],{},[1613,1715,1716,1721],{},[1628,1717,1718],{},[592,1719,1720],{},"GET \u002F",[1628,1722,1723,1724,1727],{},"The SSE stream itself. Accepts ",[592,1725,1726],{},"?since=\u003Ciso>"," to replay buffered events.",[1613,1729,1730,1735],{},[1628,1731,1732],{},[592,1733,1734],{},"GET \u002Finfo",[1628,1736,1737,1738,1741],{},"JSON ",[592,1739,1740],{},"{ evlogVersion, bufferSize, heartbeatMs }"," — server discovery.",[1613,1743,1744,1749],{},[1628,1745,1746],{},[592,1747,1748],{},"OPTIONS *",[1628,1750,1751,1752,1755],{},"CORS preflight (the server allows ",[592,1753,1754],{},"*"," because it binds to localhost).",[603,1757,1759],{"id":1758},"wire-format","Wire format",[553,1761,1762,1763,1766],{},"Every SSE ",[592,1764,1765],{},"data:"," line is a versioned envelope:",[648,1768,1771],{"className":1769,"code":1770,"language":653,"meta":654},[651],"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",[592,1772,1770],{"__ignoreMap":654},[1607,1774,1775,1785],{},[1610,1776,1777],{},[1613,1778,1779,1782],{},[1616,1780,1781],{},"Type",[1616,1783,1784],{},"When",[1623,1786,1787,1797,1810,1820],{},[1613,1788,1789,1794],{},[1628,1790,1791],{},[592,1792,1793],{},"hello",[1628,1795,1796],{},"First frame — server version + stream config",[1613,1798,1799,1804],{},[1628,1800,1801],{},[592,1802,1803],{},"replay",[1628,1805,1806,1807],{},"Each buffered event flushed when the client passed ",[592,1808,1809],{},"?since=",[1613,1811,1812,1817],{},[1628,1813,1814],{},[592,1815,1816],{},"event",[1628,1818,1819],{},"Each new event drained after the connection opened",[1613,1821,1822,1827],{},[1628,1823,1824],{},[592,1825,1826],{},"ping",[1628,1828,1829,1830,1833,1834],{},"Heartbeat every ",[592,1831,1832],{},"heartbeatMs"," (default 15s), sent with ",[592,1835,1836],{},"event: ping",[553,1838,1839,1840,1843],{},"The ",[592,1841,1842],{},"evlog: \"1\""," discriminant is the protocol version — incompatible changes will bump it.",[603,1845,1847],{"id":1846},"discovery","Discovery",[553,1849,1850],{},"External tools (a Tauri devtool, a CLI watcher) can find the running server in two ways:",[615,1852,1853,1860],{},[618,1854,1855,1859],{},[562,1856,1857],{},[592,1858,860],{}," — read directly from the project directory. Cleaned up at process exit.",[618,1861,1862,1867,1868,1871],{},[562,1863,1864],{},[592,1865,1866],{},"GET \u002Fapi\u002F_evlog\u002Fstream-info"," (Nuxt only) — returns ",[592,1869,1870],{},"{ url }",", reads from the file.",[648,1873,1877],{"className":1874,"code":1875,"language":1876,"meta":654,"style":654},"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",[592,1878,1879,1884],{"__ignoreMap":654},[687,1880,1881],{"class":689,"line":690},[687,1882,1883],{"class":1155},"# CLI consumer\n",[687,1885,1886,1889,1892,1895,1898,1900,1903,1906,1909,1912,1915],{"class":689,"line":712},[687,1887,1888],{"class":704},"URL",[687,1890,1891],{"class":708},"=$(",[687,1893,1894],{"class":796},"cat",[687,1896,1897],{"class":728}," .evlog\u002Fstream.url",[687,1899,869],{"class":708},[687,1901,1902],{"class":708}," &&",[687,1904,1905],{"class":796}," curl",[687,1907,1908],{"class":728}," -N",[687,1910,1911],{"class":708}," \"",[687,1913,1914],{"class":704},"$URL",[687,1916,1917],{"class":708},"\"\n",[603,1919,1921],{"id":1920},"going-further","Going further",[1923,1924,1925,1931],"ul",{},[618,1926,1927,1930],{},[557,1928,1929],{"href":322},"Consumer recipes"," — copy-paste examples for browser, curl + jq, Node fetch, replay-then-live, aggregation.",[618,1932,1933,1935],{},[557,1934,307],{"href":308}," — the in-process primitive the server is built on.",[1937,1938,1939],"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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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}",{"title":654,"searchDepth":712,"depth":712,"links":1941},[1942,1943,1950,1951,1952,1953,1954,1955],{"id":605,"depth":712,"text":606},{"id":672,"depth":712,"text":673,"children":1944},[1945,1946,1948,1949],{"id":677,"depth":740,"text":211},{"id":864,"depth":740,"text":1947},"Next.js (instrumentation.ts)",{"id":1050,"depth":740,"text":1051},{"id":1159,"depth":740,"text":1160},{"id":1222,"depth":712,"text":1223},{"id":1502,"depth":712,"text":1503},{"id":1698,"depth":712,"text":1699},{"id":1758,"depth":712,"text":1759},{"id":1846,"depth":712,"text":1847},{"id":1920,"depth":712,"text":1921},"A local HTTP mini-server on its own port that exposes the in-process stream over Server-Sent Events. Strict opt-in, framework-agnostic, no app route to wire.","md",null,{},{"title":312,"icon":315},{"title":312,"description":1956},"m_cdkzY2TkADiTYYv-9JcfqiFVan9gF6iE-hAYUj1AQ",[1964,1966],{"title":307,"path":308,"stem":309,"description":1965,"icon":310,"children":-1},"Subscribe to wide events flowing through evlog, in-process, with createStreamDrain — sync listeners, async iterators, and a ring buffer.",{"title":317,"path":318,"stem":319,"description":1967,"icon":320,"children":-1},"Replay and tail the local NDJSON drain with readFsLogs and tailFsLogs — works in-process or from any external Node tool.",1778338249216]