[{"data":1,"prerenderedAt":4336},["ShallowReactive",2],{"navigation_docs":3,"-extend-consumer-recipes":500,"-extend-consumer-recipes-surround":4331},[4,30,80,118,283,415,470],{"title":5,"path":6,"stem":7,"children":8,"page":29},"Start","\u002Fstart","1.start",[9,14,19,24],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fstart\u002Fintroduction","1.start\u002F1.introduction","i-lucide-info",{"title":15,"path":16,"stem":17,"icon":18},"Why start with evlog","\u002Fstart\u002Fwhy-evlog","1.start\u002F2.why-evlog","i-lucide-rocket",{"title":20,"path":21,"stem":22,"icon":23},"Installation","\u002Fstart\u002Finstallation","1.start\u002F3.installation","i-lucide-download",{"title":25,"path":26,"stem":27,"icon":28},"Quick Start","\u002Fstart\u002Fquick-start","1.start\u002F4.quick-start","i-lucide-zap",false,{"title":31,"path":32,"stem":33,"children":34,"page":29},"Learn","\u002Flearn","2.learn",[35,40,45,50,55,60,65,70,75],{"title":36,"path":37,"stem":38,"icon":39},"Overview","\u002Flearn\u002Foverview","2.learn\u002F0.overview","i-lucide-list",{"title":41,"path":42,"stem":43,"icon":44},"Simple Logging","\u002Flearn\u002Fsimple-logging","2.learn\u002F1.simple-logging","i-lucide-terminal",{"title":46,"path":47,"stem":48,"icon":49},"Wide Events","\u002Flearn\u002Fwide-events","2.learn\u002F2.wide-events","i-lucide-layers",{"title":51,"path":52,"stem":53,"icon":54},"Structured Errors","\u002Flearn\u002Fstructured-errors","2.learn\u002F3.structured-errors","i-lucide-shield-alert",{"title":56,"path":57,"stem":58,"icon":59},"Lifecycle","\u002Flearn\u002Flifecycle","2.learn\u002F4.lifecycle","i-lucide-arrow-right-left",{"title":61,"path":62,"stem":63,"icon":64},"Sampling","\u002Flearn\u002Fsampling","2.learn\u002F5.sampling","i-lucide-filter",{"title":66,"path":67,"stem":68,"icon":69},"Auto-Redaction","\u002Flearn\u002Fredaction","2.learn\u002F6.redaction","i-lucide-eye-off",{"title":71,"path":72,"stem":73,"icon":74},"Typed Fields","\u002Flearn\u002Ftyped-fields","2.learn\u002F7.typed-fields","i-simple-icons-typescript",{"title":76,"path":77,"stem":78,"icon":79},"Catalogs","\u002Flearn\u002Fcatalogs","2.learn\u002F8.catalogs","i-lucide-book-open",{"title":81,"path":82,"stem":83,"children":84,"page":29},"CLI","\u002Fcli","3.cli",[85,88,93,98,103,108,113],{"title":36,"path":86,"stem":87,"icon":44},"\u002Fcli\u002Foverview","3.cli\u002F0.overview",{"title":89,"path":90,"stem":91,"icon":92},"map","\u002Fcli\u002Fmap","3.cli\u002F1.map","i-lucide-radar",{"title":94,"path":95,"stem":96,"icon":97},"Rules","\u002Fcli\u002Frules","3.cli\u002F2.rules","i-lucide-list-checks",{"title":99,"path":100,"stem":101,"icon":102},"Scoring","\u002Fcli\u002Fscoring","3.cli\u002F3.scoring","i-lucide-gauge",{"title":104,"path":105,"stem":106,"icon":107},"CI","\u002Fcli\u002Fci","3.cli\u002F4.ci","i-lucide-git-pull-request",{"title":109,"path":110,"stem":111,"icon":112},"doctor","\u002Fcli\u002Fdoctor","3.cli\u002F5.doctor","i-lucide-stethoscope",{"title":114,"path":115,"stem":116,"icon":117},"telemetry","\u002Fcli\u002Ftelemetry","3.cli\u002F6.telemetry","i-lucide-bar-chart-3",{"title":119,"path":120,"stem":121,"children":122,"page":29},"Integrate","\u002Fintegrate","4.integrate",[123,127,195],{"title":36,"path":124,"stem":125,"icon":126},"\u002Fintegrate\u002Foverview","4.integrate\u002F0.overview","i-lucide-plug",{"title":128,"path":129,"stem":130,"children":131,"page":29},"Adapters","\u002Fintegrate\u002Fadapters","4.integrate\u002Fadapters",[132,135,175],{"title":36,"path":133,"stem":134,"icon":39},"\u002Fintegrate\u002Fadapters\u002Foverview","4.integrate\u002Fadapters\u002F01.overview",{"title":136,"path":137,"stem":138,"children":139,"page":29},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","4.integrate\u002Fadapters\u002Fcloud",[140,145,150,155,160,165,170],{"title":141,"path":142,"stem":143,"icon":144},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","4.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":146,"path":147,"stem":148,"icon":149},"OTLP","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fotlp","4.integrate\u002Fadapters\u002Fcloud\u002F02.otlp","i-simple-icons-opentelemetry",{"title":151,"path":152,"stem":153,"icon":154},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","4.integrate\u002Fadapters\u002Fcloud\u002F03.posthog","i-simple-icons-posthog",{"title":156,"path":157,"stem":158,"icon":159},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","4.integrate\u002Fadapters\u002Fcloud\u002F04.sentry","i-simple-icons-sentry",{"title":161,"path":162,"stem":163,"icon":164},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","4.integrate\u002Fadapters\u002Fcloud\u002F05.better-stack","i-simple-icons-betterstack",{"title":166,"path":167,"stem":168,"icon":169},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","4.integrate\u002Fadapters\u002Fcloud\u002F06.datadog","i-simple-icons-datadog",{"title":171,"path":172,"stem":173,"icon":174},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fhyperdx","4.integrate\u002Fadapters\u002Fcloud\u002F07.hyperdx","i-custom-hyperdx",{"title":176,"path":177,"stem":178,"children":179,"page":29},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","4.integrate\u002Fadapters\u002Fself-hosted",[180,185,190],{"title":181,"path":182,"stem":183,"icon":184},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","4.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":186,"path":187,"stem":188,"icon":189},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","4.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":191,"path":192,"stem":193,"icon":194},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","4.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":196,"path":197,"stem":198,"children":199,"page":29},"Frameworks","\u002Fintegrate\u002Fframeworks","4.integrate\u002Fframeworks",[200,204,209,214,219,224,229,234,239,244,249,254,259,264,268,273,278],{"title":36,"path":201,"stem":202,"icon":203},"\u002Fintegrate\u002Fframeworks\u002Foverview","4.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":205,"path":206,"stem":207,"icon":208},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","4.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":210,"path":211,"stem":212,"icon":213},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","4.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":215,"path":216,"stem":217,"icon":218},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","4.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":220,"path":221,"stem":222,"icon":223},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","4.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":225,"path":226,"stem":227,"icon":228},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","4.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":230,"path":231,"stem":232,"icon":233},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","4.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":235,"path":236,"stem":237,"icon":238},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","4.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":240,"path":241,"stem":242,"icon":243},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","4.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":245,"path":246,"stem":247,"icon":248},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","4.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":250,"path":251,"stem":252,"icon":253},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","4.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":255,"path":256,"stem":257,"icon":258},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","4.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":260,"path":261,"stem":262,"icon":263},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","4.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":265,"path":266,"stem":267,"icon":74},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","4.integrate\u002Fframeworks\u002F13.standalone",{"title":269,"path":270,"stem":271,"icon":272},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","4.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":274,"path":275,"stem":276,"icon":277},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","4.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":279,"path":280,"stem":281,"icon":282},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","4.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":284,"path":285,"stem":286,"children":287,"page":29},"Use Cases","\u002Fuse-cases","5.use-cases",[288,291,296,325,352,384,405,410],{"title":36,"path":289,"stem":290,"icon":97},"\u002Fuse-cases\u002Foverview","5.use-cases\u002F0.overview",{"title":292,"path":293,"stem":294,"icon":295},"Client Logging","\u002Fuse-cases\u002Fclient-logging","5.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":297,"icon":298,"path":299,"stem":300,"children":301,"page":29},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","5.use-cases\u002F2.ai-sdk",[302,305,310,315,320],{"title":36,"path":303,"stem":304,"icon":39},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","5.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":306,"path":307,"stem":308,"icon":309},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","5.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":311,"path":312,"stem":313,"icon":314},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","5.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":316,"path":317,"stem":318,"icon":319},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","5.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":321,"path":322,"stem":323,"icon":324},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","5.use-cases\u002F2.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":326,"icon":327,"path":328,"stem":329,"children":330,"page":29},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","5.use-cases\u002F3.better-auth",[331,334,339,344,348],{"title":36,"path":332,"stem":333,"icon":39},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","5.use-cases\u002F3.better-auth\u002F01.overview",{"title":335,"path":336,"stem":337,"icon":338},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","5.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":340,"path":341,"stem":342,"icon":343},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","5.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":345,"path":346,"stem":347,"icon":295},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","5.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":349,"path":350,"stem":351,"icon":102},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","5.use-cases\u002F3.better-auth\u002F05.performance",{"title":353,"icon":354,"path":355,"stem":356,"children":357,"page":29},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","5.use-cases\u002F4.audit",[358,361,366,371,376,380],{"title":36,"path":359,"stem":360,"icon":39},"\u002Fuse-cases\u002Faudit\u002Foverview","5.use-cases\u002F4.audit\u002F01.overview",{"title":362,"path":363,"stem":364,"icon":365},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","5.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":367,"path":368,"stem":369,"icon":370},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","5.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":372,"path":373,"stem":374,"icon":375},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","5.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":377,"path":378,"stem":379,"icon":354},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","5.use-cases\u002F4.audit\u002F05.compliance",{"title":381,"path":382,"stem":383,"icon":79},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","5.use-cases\u002F4.audit\u002F06.recipes",{"title":321,"icon":102,"path":385,"stem":386,"children":387,"page":29},"\u002Fuse-cases\u002Ftelemetry","5.use-cases\u002F4.telemetry",[388,391,396,401],{"title":36,"path":389,"stem":390,"icon":39},"\u002Fuse-cases\u002Ftelemetry\u002Foverview","5.use-cases\u002F4.telemetry\u002F01.overview",{"title":392,"path":393,"stem":394,"icon":395},"Setup","\u002Fuse-cases\u002Ftelemetry\u002Fsetup","5.use-cases\u002F4.telemetry\u002F02.setup","i-lucide-wrench",{"title":397,"path":398,"stem":399,"icon":400},"Ingest","\u002Fuse-cases\u002Ftelemetry\u002Fingest","5.use-cases\u002F4.telemetry\u002F03.ingest","i-lucide-server",{"title":402,"path":403,"stem":404,"icon":79},"Reference","\u002Fuse-cases\u002Ftelemetry\u002Freference","5.use-cases\u002F4.telemetry\u002F04.reference",{"title":406,"path":407,"stem":408,"icon":409},"Enrichers","\u002Fuse-cases\u002Fenrichers","5.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":411,"path":412,"stem":413,"icon":414},"eve","\u002Fuse-cases\u002Feve","5.use-cases\u002F5.eve","i-custom-eve",{"title":416,"path":417,"stem":418,"children":419,"page":29},"Extend","\u002Fextend","6.extend",[420,424,429,434,439,443,447,451,455,460,465],{"title":36,"path":421,"stem":422,"icon":423},"\u002Fextend\u002Foverview","6.extend\u002F0.overview","i-lucide-blocks",{"title":425,"path":426,"stem":427,"icon":428},"Stream","\u002Fextend\u002Fstream","6.extend\u002F1.stream","i-lucide-radio-tower",{"title":430,"path":431,"stem":432,"icon":433},"Custom framework","\u002Fextend\u002Fcustom-framework","6.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":435,"path":436,"stem":437,"icon":438},"FS reader","\u002Fextend\u002Ffs-reader","6.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":381,"path":440,"stem":441,"icon":442},"\u002Fextend\u002Fconsumer-recipes","6.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":444,"path":445,"stem":446,"icon":423},"Plugins","\u002Fextend\u002Fplugins","6.extend\u002F4.plugins",{"title":448,"path":449,"stem":450,"icon":409},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","6.extend\u002F5.custom-enrichers",{"title":452,"path":453,"stem":454,"icon":64},"Tail sampling","\u002Fextend\u002Ftail-sampling","6.extend\u002F6.tail-sampling",{"title":456,"path":457,"stem":458,"icon":459},"Identity headers","\u002Fextend\u002Fidentity-headers","6.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":461,"path":462,"stem":463,"icon":464},"Custom drains","\u002Fextend\u002Fcustom-drains","6.extend\u002F8.custom-drains","i-lucide-share-2",{"title":466,"path":467,"stem":468,"icon":469},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","6.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":402,"path":471,"stem":472,"children":473,"page":29},"\u002Freference","7.reference",[474,479,482,487,491,496],{"title":475,"path":476,"stem":477,"icon":478},"Configuration","\u002Freference\u002Fconfiguration","7.reference\u002F1.configuration","i-lucide-settings",{"title":349,"path":480,"stem":481,"icon":102},"\u002Freference\u002Fperformance","7.reference\u002F2.performance",{"title":483,"path":484,"stem":485,"icon":486},"Vite Plugin","\u002Freference\u002Fvite-plugin","7.reference\u002F3.vite-plugin","i-custom-vite",{"title":488,"path":489,"stem":490,"icon":354},"Best Practices","\u002Freference\u002Fbest-practices","7.reference\u002F4.best-practices",{"title":492,"path":493,"stem":494,"icon":495},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","7.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":497,"path":498,"stem":499,"icon":409},"Agent Skills","\u002Freference\u002Fagent-skills","7.reference\u002F6.agent-skills",{"id":501,"title":381,"body":502,"description":4324,"extension":4325,"links":4326,"meta":4327,"navigation":4328,"path":440,"seo":4329,"stem":441,"__hash__":4330},"docs\u002F6.extend\u002F3.consumer-recipes.md",{"type":503,"value":504,"toc":4311},"minimark",[505,518,593,598,619,624,1626,1633,1637,2247,2251,2617,2625,2629,2634,2688,2691,2795,2808,2812,2815,3235,3244,3248,3254,3752,3756,3759,4115,4119,4122,4281,4284,4288,4308],[506,507,508,509,513,514,517],"p",{},"Real-world patterns that combine the ",[510,511,512],"a",{"href":426},"in-process bus and stream server"," with the ",[510,515,516],{"href":436},"filesystem reader",".",[519,520,523,526,585],"prompt",{":actions":521,"description":522,"icon":442},"[\"copy\",\"cursor\",\"claude\"]","Build a custom evlog devtool \u002F dashboard",[506,524,525],{},"Bootstrap a local devtool or dashboard that consumes evlog wide events.",[527,528,529,542,553,572,579,582],"ul",{},[530,531,532,533,537,538,541],"li",{},"Pick the source: live (stream server over SSE) or history (",[534,535,536],"code",{},"readFsLogs"," from ",[534,539,540],{},".evlog\u002Flogs",") or both (replay then live tail)",[530,543,544,545,548,549,552],{},"For SSE: discover the URL via ",[534,546,547],{},".evlog\u002Fstream.url"," or ",[534,550,551],{},"GET \u002Fapi\u002F_evlog\u002Fstream-info",", never hard-code the port",[530,554,555,556,559,560,563,564,567,568,571],{},"Open an ",[534,557,558],{},"EventSource"," and decode messages as ",[534,561,562],{},"{ evlog: '1', type, data }"," envelopes (",[534,565,566],{},"type"," is ",[534,569,570],{},"hello | event | replay | ping",")",[530,573,574,575,578],{},"For browser tabs running on a different origin from the dev server, configure CORS via the stream server ",[534,576,577],{},"cors"," option and forward credentials carefully",[530,580,581],{},"Aggregate on the consumer side (counts, latency histograms, error groups) — keep the server simple",[530,583,584],{},"Skip on serverless platforms — the stream is in-process",[506,586,587,588],{},"Docs: ",[510,589,590],{"href":590,"rel":591},"https:\u002F\u002Fwww.evlog.dev\u002Fextend\u002Fconsumer-recipes",[592],"nofollow",[594,595,597],"h2",{"id":596},"_1-build-a-minimal-devtool","1. Build a minimal devtool",[506,599,600,601,603,604,606,607,610,611,613,614,618],{},"A live event panel is essentially ",[534,602,558],{}," + a list. The full wire format and discovery rules — ",[534,605,547],{},", ",[534,608,609],{},"\u002Fapi\u002F_evlog\u002Fstream-info",", the ",[534,612,562],{}," envelope, and auth — are documented on the ",[510,615,617],{"href":616},"\u002Fextend\u002Fstream#wire-format","stream page",". Each recipe below assumes you've grabbed the URL via either of those mechanisms.",[620,621,623],"h3",{"id":622},"vanilla-html-js-drop-into-any-page","Vanilla HTML + JS (drop into any page)",[625,626,627],"code-collapse",{},[628,629,634],"pre",{"className":630,"code":631,"language":632,"meta":633,"style":633},"language-html shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003C!doctype html>\n\u003Chtml>\n\u003Chead>\n  \u003Cmeta charset=\"utf-8\">\n  \u003Ctitle>evlog mini devtool\u003C\u002Ftitle>\n  \u003Cstyle>\n    body { font: 13px ui-sans-serif, system-ui; margin: 0; padding: 0; }\n    table { width: 100%; border-collapse: collapse; }\n    td, th { padding: 6px 10px; border-bottom: 1px solid #eee; text-align: left; }\n    .lvl-error { color: #ef4444 }\n    .lvl-warn  { color: #f59e0b }\n    .lvl-info  { color: #3b82f6 }\n  \u003C\u002Fstyle>\n\u003C\u002Fhead>\n\u003Cbody>\n  \u003Ctable id=\"t\">\n    \u003Cthead>\u003Ctr>\u003Cth>time\u003C\u002Fth>\u003Cth>level\u003C\u002Fth>\u003Cth>service\u003C\u002Fth>\u003Cth>action\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\n    \u003Ctbody>\u003C\u002Ftbody>\n  \u003C\u002Ftable>\n\n  \u003Cscript>\n    \u002F\u002F Replace with the URL printed at startup, or fetch it from \u002Fapi\u002F_evlog\u002Fstream-info\n    const STREAM_URL = 'http:\u002F\u002F127.0.0.1:51203'\n    const tbody = document.querySelector('#t tbody')\n    const es = new EventSource(STREAM_URL)\n\n    es.onmessage = (e) => {\n      const env = JSON.parse(e.data)\n      if (env.evlog !== '1') return\n      if (env.type !== 'event' && env.type !== 'replay') return\n\n      const w = env.data\n      const tr = document.createElement('tr')\n      tr.innerHTML = `\n        \u003Ctd>${new Date(w.timestamp).toLocaleTimeString()}\u003C\u002Ftd>\n        \u003Ctd class=\"lvl-${w.level}\">${w.level}\u003C\u002Ftd>\n        \u003Ctd>${w.service ?? ''}\u003C\u002Ftd>\n        \u003Ctd>${w.action ?? w.message ?? w.path ?? ''}\u003C\u002Ftd>\n      `\n      tbody.prepend(tr)\n      while (tbody.children.length > 200) tbody.lastElementChild.remove()\n    }\n  \u003C\u002Fscript>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n","html","",[534,635,636,656,666,676,702,724,734,789,819,875,900,922,943,953,962,972,994,1073,1087,1096,1103,1113,1120,1140,1173,1192,1197,1226,1256,1289,1333,1338,1355,1382,1398,1435,1467,1489,1527,1533,1550,1593,1599,1608,1617],{"__ignoreMap":633},[637,638,641,645,649,653],"span",{"class":639,"line":640},"line",1,[637,642,644],{"class":643},"sMK4o","\u003C!",[637,646,648],{"class":647},"swJcz","doctype",[637,650,652],{"class":651},"spNyl"," html",[637,654,655],{"class":643},">\n",[637,657,659,662,664],{"class":639,"line":658},2,[637,660,661],{"class":643},"\u003C",[637,663,632],{"class":647},[637,665,655],{"class":643},[637,667,669,671,674],{"class":639,"line":668},3,[637,670,661],{"class":643},[637,672,673],{"class":647},"head",[637,675,655],{"class":643},[637,677,679,682,685,688,691,694,698,700],{"class":639,"line":678},4,[637,680,681],{"class":643},"  \u003C",[637,683,684],{"class":647},"meta",[637,686,687],{"class":651}," charset",[637,689,690],{"class":643},"=",[637,692,693],{"class":643},"\"",[637,695,697],{"class":696},"sfazB","utf-8",[637,699,693],{"class":643},[637,701,655],{"class":643},[637,703,705,707,710,713,717,720,722],{"class":639,"line":704},5,[637,706,681],{"class":643},[637,708,709],{"class":647},"title",[637,711,712],{"class":643},">",[637,714,716],{"class":715},"sTEyZ","evlog mini devtool",[637,718,719],{"class":643},"\u003C\u002F",[637,721,709],{"class":647},[637,723,655],{"class":643},[637,725,727,729,732],{"class":639,"line":726},6,[637,728,681],{"class":643},[637,730,731],{"class":647},"style",[637,733,655],{"class":643},[637,735,737,741,744,748,751,755,758,761,764,767,770,772,775,777,780,782,784,786],{"class":639,"line":736},7,[637,738,740],{"class":739},"sBMFI","    body",[637,742,743],{"class":643}," {",[637,745,747],{"class":746},"sqsOY"," font",[637,749,750],{"class":643},":",[637,752,754],{"class":753},"sbssI"," 13px",[637,756,757],{"class":715}," ui-sans-serif",[637,759,760],{"class":643},",",[637,762,763],{"class":715}," system-ui",[637,765,766],{"class":643},";",[637,768,769],{"class":746}," margin",[637,771,750],{"class":643},[637,773,774],{"class":753}," 0",[637,776,766],{"class":643},[637,778,779],{"class":746}," padding",[637,781,750],{"class":643},[637,783,774],{"class":753},[637,785,766],{"class":643},[637,787,788],{"class":643}," }\n",[637,790,792,795,797,800,802,805,807,810,812,815,817],{"class":639,"line":791},8,[637,793,794],{"class":739},"    table",[637,796,743],{"class":643},[637,798,799],{"class":746}," width",[637,801,750],{"class":643},[637,803,804],{"class":753}," 100%",[637,806,766],{"class":643},[637,808,809],{"class":746}," border-collapse",[637,811,750],{"class":643},[637,813,814],{"class":715}," collapse",[637,816,766],{"class":643},[637,818,788],{"class":643},[637,820,822,825,827,830,832,834,836,839,842,844,847,849,852,855,858,861,863,866,868,871,873],{"class":639,"line":821},9,[637,823,824],{"class":739},"    td",[637,826,760],{"class":643},[637,828,829],{"class":739}," th",[637,831,743],{"class":643},[637,833,779],{"class":746},[637,835,750],{"class":643},[637,837,838],{"class":753}," 6px",[637,840,841],{"class":753}," 10px",[637,843,766],{"class":643},[637,845,846],{"class":746}," border-bottom",[637,848,750],{"class":643},[637,850,851],{"class":753}," 1px",[637,853,854],{"class":715}," solid ",[637,856,857],{"class":643},"#",[637,859,860],{"class":715},"eee",[637,862,766],{"class":643},[637,864,865],{"class":746}," text-align",[637,867,750],{"class":643},[637,869,870],{"class":715}," left",[637,872,766],{"class":643},[637,874,788],{"class":643},[637,876,878,881,884,886,889,891,894,897],{"class":639,"line":877},10,[637,879,880],{"class":643},"    .",[637,882,883],{"class":739},"lvl-error",[637,885,743],{"class":643},[637,887,888],{"class":746}," color",[637,890,750],{"class":643},[637,892,893],{"class":643}," #",[637,895,896],{"class":715},"ef4444 ",[637,898,899],{"class":643},"}\n",[637,901,903,905,908,911,913,915,917,920],{"class":639,"line":902},11,[637,904,880],{"class":643},[637,906,907],{"class":739},"lvl-warn",[637,909,910],{"class":643},"  {",[637,912,888],{"class":746},[637,914,750],{"class":643},[637,916,893],{"class":643},[637,918,919],{"class":715},"f59e0b ",[637,921,899],{"class":643},[637,923,925,927,930,932,934,936,938,941],{"class":639,"line":924},12,[637,926,880],{"class":643},[637,928,929],{"class":739},"lvl-info",[637,931,910],{"class":643},[637,933,888],{"class":746},[637,935,750],{"class":643},[637,937,893],{"class":643},[637,939,940],{"class":715},"3b82f6 ",[637,942,899],{"class":643},[637,944,946,949,951],{"class":639,"line":945},13,[637,947,948],{"class":643},"  \u003C\u002F",[637,950,731],{"class":647},[637,952,655],{"class":643},[637,954,956,958,960],{"class":639,"line":955},14,[637,957,719],{"class":643},[637,959,673],{"class":647},[637,961,655],{"class":643},[637,963,965,967,970],{"class":639,"line":964},15,[637,966,661],{"class":643},[637,968,969],{"class":647},"body",[637,971,655],{"class":643},[637,973,975,977,980,983,985,987,990,992],{"class":639,"line":974},16,[637,976,681],{"class":643},[637,978,979],{"class":647},"table",[637,981,982],{"class":651}," id",[637,984,690],{"class":643},[637,986,693],{"class":643},[637,988,989],{"class":696},"t",[637,991,693],{"class":643},[637,993,655],{"class":643},[637,995,997,1000,1003,1006,1009,1011,1014,1016,1019,1021,1023,1025,1027,1029,1032,1034,1036,1038,1040,1042,1045,1047,1049,1051,1053,1055,1058,1060,1062,1065,1067,1069,1071],{"class":639,"line":996},17,[637,998,999],{"class":643},"    \u003C",[637,1001,1002],{"class":647},"thead",[637,1004,1005],{"class":643},">\u003C",[637,1007,1008],{"class":647},"tr",[637,1010,1005],{"class":643},[637,1012,1013],{"class":647},"th",[637,1015,712],{"class":643},[637,1017,1018],{"class":715},"time",[637,1020,719],{"class":643},[637,1022,1013],{"class":647},[637,1024,1005],{"class":643},[637,1026,1013],{"class":647},[637,1028,712],{"class":643},[637,1030,1031],{"class":715},"level",[637,1033,719],{"class":643},[637,1035,1013],{"class":647},[637,1037,1005],{"class":643},[637,1039,1013],{"class":647},[637,1041,712],{"class":643},[637,1043,1044],{"class":715},"service",[637,1046,719],{"class":643},[637,1048,1013],{"class":647},[637,1050,1005],{"class":643},[637,1052,1013],{"class":647},[637,1054,712],{"class":643},[637,1056,1057],{"class":715},"action",[637,1059,719],{"class":643},[637,1061,1013],{"class":647},[637,1063,1064],{"class":643},">\u003C\u002F",[637,1066,1008],{"class":647},[637,1068,1064],{"class":643},[637,1070,1002],{"class":647},[637,1072,655],{"class":643},[637,1074,1076,1078,1081,1083,1085],{"class":639,"line":1075},18,[637,1077,999],{"class":643},[637,1079,1080],{"class":647},"tbody",[637,1082,1064],{"class":643},[637,1084,1080],{"class":647},[637,1086,655],{"class":643},[637,1088,1090,1092,1094],{"class":639,"line":1089},19,[637,1091,948],{"class":643},[637,1093,979],{"class":647},[637,1095,655],{"class":643},[637,1097,1099],{"class":639,"line":1098},20,[637,1100,1102],{"emptyLinePlaceholder":1101},true,"\n",[637,1104,1106,1108,1111],{"class":639,"line":1105},21,[637,1107,681],{"class":643},[637,1109,1110],{"class":647},"script",[637,1112,655],{"class":643},[637,1114,1116],{"class":639,"line":1115},22,[637,1117,1119],{"class":1118},"sHwdD","    \u002F\u002F Replace with the URL printed at startup, or fetch it from \u002Fapi\u002F_evlog\u002Fstream-info\n",[637,1121,1123,1126,1129,1131,1134,1137],{"class":639,"line":1122},23,[637,1124,1125],{"class":651},"    const",[637,1127,1128],{"class":715}," STREAM_URL ",[637,1130,690],{"class":643},[637,1132,1133],{"class":643}," '",[637,1135,1136],{"class":696},"http:\u002F\u002F127.0.0.1:51203",[637,1138,1139],{"class":643},"'\n",[637,1141,1143,1145,1148,1150,1153,1155,1159,1162,1165,1168,1170],{"class":639,"line":1142},24,[637,1144,1125],{"class":651},[637,1146,1147],{"class":715}," tbody ",[637,1149,690],{"class":643},[637,1151,1152],{"class":715}," document",[637,1154,517],{"class":643},[637,1156,1158],{"class":1157},"s2Zo4","querySelector",[637,1160,1161],{"class":715},"(",[637,1163,1164],{"class":643},"'",[637,1166,1167],{"class":696},"#t tbody",[637,1169,1164],{"class":643},[637,1171,1172],{"class":715},")\n",[637,1174,1176,1178,1181,1183,1186,1189],{"class":639,"line":1175},25,[637,1177,1125],{"class":651},[637,1179,1180],{"class":715}," es ",[637,1182,690],{"class":643},[637,1184,1185],{"class":643}," new",[637,1187,1188],{"class":1157}," EventSource",[637,1190,1191],{"class":715},"(STREAM_URL)\n",[637,1193,1195],{"class":639,"line":1194},26,[637,1196,1102],{"emptyLinePlaceholder":1101},[637,1198,1200,1203,1205,1208,1211,1214,1218,1220,1223],{"class":639,"line":1199},27,[637,1201,1202],{"class":715},"    es",[637,1204,517],{"class":643},[637,1206,1207],{"class":1157},"onmessage",[637,1209,1210],{"class":643}," =",[637,1212,1213],{"class":643}," (",[637,1215,1217],{"class":1216},"sHdIc","e",[637,1219,571],{"class":643},[637,1221,1222],{"class":651}," =>",[637,1224,1225],{"class":643}," {\n",[637,1227,1229,1232,1235,1237,1240,1242,1245,1247,1249,1251,1254],{"class":639,"line":1228},28,[637,1230,1231],{"class":651},"      const",[637,1233,1234],{"class":715}," env",[637,1236,1210],{"class":643},[637,1238,1239],{"class":715}," JSON",[637,1241,517],{"class":643},[637,1243,1244],{"class":1157},"parse",[637,1246,1161],{"class":647},[637,1248,1217],{"class":715},[637,1250,517],{"class":643},[637,1252,1253],{"class":715},"data",[637,1255,1172],{"class":647},[637,1257,1259,1263,1265,1268,1270,1273,1276,1278,1281,1283,1286],{"class":639,"line":1258},29,[637,1260,1262],{"class":1261},"s7zQu","      if",[637,1264,1213],{"class":647},[637,1266,1267],{"class":715},"env",[637,1269,517],{"class":643},[637,1271,1272],{"class":715},"evlog",[637,1274,1275],{"class":643}," !==",[637,1277,1133],{"class":643},[637,1279,1280],{"class":696},"1",[637,1282,1164],{"class":643},[637,1284,1285],{"class":647},") ",[637,1287,1288],{"class":1261},"return\n",[637,1290,1292,1294,1296,1298,1300,1302,1304,1306,1309,1311,1314,1316,1318,1320,1322,1324,1327,1329,1331],{"class":639,"line":1291},30,[637,1293,1262],{"class":1261},[637,1295,1213],{"class":647},[637,1297,1267],{"class":715},[637,1299,517],{"class":643},[637,1301,566],{"class":715},[637,1303,1275],{"class":643},[637,1305,1133],{"class":643},[637,1307,1308],{"class":696},"event",[637,1310,1164],{"class":643},[637,1312,1313],{"class":643}," &&",[637,1315,1234],{"class":715},[637,1317,517],{"class":643},[637,1319,566],{"class":715},[637,1321,1275],{"class":643},[637,1323,1133],{"class":643},[637,1325,1326],{"class":696},"replay",[637,1328,1164],{"class":643},[637,1330,1285],{"class":647},[637,1332,1288],{"class":1261},[637,1334,1336],{"class":639,"line":1335},31,[637,1337,1102],{"emptyLinePlaceholder":1101},[637,1339,1341,1343,1346,1348,1350,1352],{"class":639,"line":1340},32,[637,1342,1231],{"class":651},[637,1344,1345],{"class":715}," w",[637,1347,1210],{"class":643},[637,1349,1234],{"class":715},[637,1351,517],{"class":643},[637,1353,1354],{"class":715},"data\n",[637,1356,1358,1360,1363,1365,1367,1369,1372,1374,1376,1378,1380],{"class":639,"line":1357},33,[637,1359,1231],{"class":651},[637,1361,1362],{"class":715}," tr",[637,1364,1210],{"class":643},[637,1366,1152],{"class":715},[637,1368,517],{"class":643},[637,1370,1371],{"class":1157},"createElement",[637,1373,1161],{"class":647},[637,1375,1164],{"class":643},[637,1377,1008],{"class":696},[637,1379,1164],{"class":643},[637,1381,1172],{"class":647},[637,1383,1385,1388,1390,1393,1395],{"class":639,"line":1384},34,[637,1386,1387],{"class":715},"      tr",[637,1389,517],{"class":643},[637,1391,1392],{"class":715},"innerHTML",[637,1394,1210],{"class":643},[637,1396,1397],{"class":643}," `\n",[637,1399,1401,1404,1407,1410,1413,1416,1418,1421,1423,1426,1429,1432],{"class":639,"line":1400},35,[637,1402,1403],{"class":696},"        \u003Ctd>",[637,1405,1406],{"class":643},"${",[637,1408,1409],{"class":643},"new",[637,1411,1412],{"class":1157}," Date",[637,1414,1415],{"class":715},"(w",[637,1417,517],{"class":643},[637,1419,1420],{"class":715},"timestamp)",[637,1422,517],{"class":643},[637,1424,1425],{"class":1157},"toLocaleTimeString",[637,1427,1428],{"class":715},"()",[637,1430,1431],{"class":643},"}",[637,1433,1434],{"class":696},"\u003C\u002Ftd>\n",[637,1436,1438,1441,1443,1446,1448,1450,1452,1455,1457,1459,1461,1463,1465],{"class":639,"line":1437},36,[637,1439,1440],{"class":696},"        \u003Ctd class=\"lvl-",[637,1442,1406],{"class":643},[637,1444,1445],{"class":715},"w",[637,1447,517],{"class":643},[637,1449,1031],{"class":715},[637,1451,1431],{"class":643},[637,1453,1454],{"class":696},"\">",[637,1456,1406],{"class":643},[637,1458,1445],{"class":715},[637,1460,517],{"class":643},[637,1462,1031],{"class":715},[637,1464,1431],{"class":643},[637,1466,1434],{"class":696},[637,1468,1470,1472,1474,1476,1478,1481,1484,1487],{"class":639,"line":1469},37,[637,1471,1403],{"class":696},[637,1473,1406],{"class":643},[637,1475,1445],{"class":715},[637,1477,517],{"class":643},[637,1479,1480],{"class":715},"service ",[637,1482,1483],{"class":643},"??",[637,1485,1486],{"class":643}," ''}",[637,1488,1434],{"class":696},[637,1490,1492,1494,1496,1498,1500,1503,1505,1507,1509,1512,1514,1516,1518,1521,1523,1525],{"class":639,"line":1491},38,[637,1493,1403],{"class":696},[637,1495,1406],{"class":643},[637,1497,1445],{"class":715},[637,1499,517],{"class":643},[637,1501,1502],{"class":715},"action ",[637,1504,1483],{"class":643},[637,1506,1345],{"class":715},[637,1508,517],{"class":643},[637,1510,1511],{"class":715},"message ",[637,1513,1483],{"class":643},[637,1515,1345],{"class":715},[637,1517,517],{"class":643},[637,1519,1520],{"class":715},"path ",[637,1522,1483],{"class":643},[637,1524,1486],{"class":643},[637,1526,1434],{"class":696},[637,1528,1530],{"class":639,"line":1529},39,[637,1531,1532],{"class":643},"      `\n",[637,1534,1536,1539,1541,1544,1546,1548],{"class":639,"line":1535},40,[637,1537,1538],{"class":715},"      tbody",[637,1540,517],{"class":643},[637,1542,1543],{"class":1157},"prepend",[637,1545,1161],{"class":647},[637,1547,1008],{"class":715},[637,1549,1172],{"class":647},[637,1551,1553,1556,1558,1560,1562,1565,1567,1570,1573,1576,1578,1580,1582,1585,1587,1590],{"class":639,"line":1552},41,[637,1554,1555],{"class":1261},"      while",[637,1557,1213],{"class":647},[637,1559,1080],{"class":715},[637,1561,517],{"class":643},[637,1563,1564],{"class":715},"children",[637,1566,517],{"class":643},[637,1568,1569],{"class":715},"length",[637,1571,1572],{"class":643}," >",[637,1574,1575],{"class":753}," 200",[637,1577,1285],{"class":647},[637,1579,1080],{"class":715},[637,1581,517],{"class":643},[637,1583,1584],{"class":715},"lastElementChild",[637,1586,517],{"class":643},[637,1588,1589],{"class":1157},"remove",[637,1591,1592],{"class":647},"()\n",[637,1594,1596],{"class":639,"line":1595},42,[637,1597,1598],{"class":643},"    }\n",[637,1600,1602,1604,1606],{"class":639,"line":1601},43,[637,1603,948],{"class":643},[637,1605,1110],{"class":647},[637,1607,655],{"class":643},[637,1609,1611,1613,1615],{"class":639,"line":1610},44,[637,1612,719],{"class":643},[637,1614,969],{"class":647},[637,1616,655],{"class":643},[637,1618,1620,1622,1624],{"class":639,"line":1619},45,[637,1621,719],{"class":643},[637,1623,632],{"class":647},[637,1625,655],{"class":643},[506,1627,1628,1629,1632],{},"Save as ",[534,1630,1631],{},"devtool.html",", open in any browser tab while your evlog-instrumented dev server is running. That's the whole MVP.",[620,1634,1636],{"id":1635},"vue-3-component","Vue 3 component",[625,1638,1639],{},[628,1640,1644],{"className":1641,"code":1642,"language":1643,"meta":633,"style":633},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cscript setup lang=\"ts\">\nimport { onBeforeUnmount, onMounted, ref } from 'vue'\nimport type { WideEvent } from 'evlog'\n\nconst events = ref\u003CWideEvent[]>([])\nlet es: EventSource | null = null\n\nonMounted(async () => {\n  \u002F\u002F Discover URL via the same-origin info endpoint (Nuxt)\n  const { url } = await $fetch\u003C{ url: string | null }>('\u002Fapi\u002F_evlog\u002Fstream-info')\n  if (!url) return\n\n  es = new EventSource(url)\n  es.onmessage = (e) => {\n    const env = JSON.parse(e.data)\n    if (env.evlog !== '1') return\n    if (env.type === 'event' || env.type === 'replay') {\n      events.value.unshift(env.data as WideEvent)\n      if (events.value.length > 500) events.value.length = 500\n    }\n  }\n})\n\nonBeforeUnmount(() => es?.close())\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cul>\n    \u003Cli v-for=\"(e, i) in events\" :key=\"`${e.timestamp}-${i}`\">\n      \u003Ccode>{{ e.level }}\u003C\u002Fcode>\n      \u003Cstrong>{{ e.service }}\u003C\u002Fstrong>\n      \u003Cspan>{{ e.action ?? e.message ?? e.path }}\u003C\u002Fspan>\n    \u003C\u002Fli>\n  \u003C\u002Ful>\n\u003C\u002Ftemplate>\n","vue",[534,1645,1646,1669,1701,1723,1727,1752,1775,1779,1796,1801,1848,1865,1869,1886,1906,1930,1955,1998,2028,2067,2071,2076,2082,2086,2108,2116,2120,2129,2137,2169,2187,2205,2222,2231,2239],{"__ignoreMap":633},[637,1647,1648,1650,1652,1655,1658,1660,1662,1665,1667],{"class":639,"line":640},[637,1649,661],{"class":643},[637,1651,1110],{"class":647},[637,1653,1654],{"class":651}," setup",[637,1656,1657],{"class":651}," lang",[637,1659,690],{"class":643},[637,1661,693],{"class":643},[637,1663,1664],{"class":696},"ts",[637,1666,693],{"class":643},[637,1668,655],{"class":643},[637,1670,1671,1674,1676,1679,1681,1684,1686,1689,1692,1695,1697,1699],{"class":639,"line":658},[637,1672,1673],{"class":1261},"import",[637,1675,743],{"class":643},[637,1677,1678],{"class":715}," onBeforeUnmount",[637,1680,760],{"class":643},[637,1682,1683],{"class":715}," onMounted",[637,1685,760],{"class":643},[637,1687,1688],{"class":715}," ref",[637,1690,1691],{"class":643}," }",[637,1693,1694],{"class":1261}," from",[637,1696,1133],{"class":643},[637,1698,1643],{"class":696},[637,1700,1139],{"class":643},[637,1702,1703,1705,1708,1710,1713,1715,1717,1719,1721],{"class":639,"line":668},[637,1704,1673],{"class":1261},[637,1706,1707],{"class":1261}," type",[637,1709,743],{"class":643},[637,1711,1712],{"class":715}," WideEvent",[637,1714,1691],{"class":643},[637,1716,1694],{"class":1261},[637,1718,1133],{"class":643},[637,1720,1272],{"class":696},[637,1722,1139],{"class":643},[637,1724,1725],{"class":639,"line":678},[637,1726,1102],{"emptyLinePlaceholder":1101},[637,1728,1729,1732,1735,1737,1739,1741,1744,1747,1749],{"class":639,"line":704},[637,1730,1731],{"class":651},"const",[637,1733,1734],{"class":715}," events ",[637,1736,690],{"class":643},[637,1738,1688],{"class":1157},[637,1740,661],{"class":643},[637,1742,1743],{"class":739},"WideEvent",[637,1745,1746],{"class":715},"[]",[637,1748,712],{"class":643},[637,1750,1751],{"class":715},"([])\n",[637,1753,1754,1757,1760,1762,1764,1767,1770,1772],{"class":639,"line":726},[637,1755,1756],{"class":651},"let",[637,1758,1759],{"class":715}," es",[637,1761,750],{"class":643},[637,1763,1188],{"class":739},[637,1765,1766],{"class":643}," |",[637,1768,1769],{"class":739}," null",[637,1771,1210],{"class":643},[637,1773,1774],{"class":643}," null\n",[637,1776,1777],{"class":639,"line":736},[637,1778,1102],{"emptyLinePlaceholder":1101},[637,1780,1781,1784,1786,1789,1792,1794],{"class":639,"line":791},[637,1782,1783],{"class":1157},"onMounted",[637,1785,1161],{"class":715},[637,1787,1788],{"class":651},"async",[637,1790,1791],{"class":643}," ()",[637,1793,1222],{"class":651},[637,1795,1225],{"class":643},[637,1797,1798],{"class":639,"line":821},[637,1799,1800],{"class":1118},"  \u002F\u002F Discover URL via the same-origin info endpoint (Nuxt)\n",[637,1802,1803,1806,1808,1811,1813,1815,1818,1821,1824,1826,1828,1831,1833,1835,1838,1840,1842,1844,1846],{"class":639,"line":877},[637,1804,1805],{"class":651},"  const",[637,1807,743],{"class":643},[637,1809,1810],{"class":715}," url",[637,1812,1691],{"class":643},[637,1814,1210],{"class":643},[637,1816,1817],{"class":1261}," await",[637,1819,1820],{"class":1157}," $fetch",[637,1822,1823],{"class":643},"\u003C{",[637,1825,1810],{"class":647},[637,1827,750],{"class":643},[637,1829,1830],{"class":739}," string",[637,1832,1766],{"class":643},[637,1834,1769],{"class":739},[637,1836,1837],{"class":643}," }>",[637,1839,1161],{"class":647},[637,1841,1164],{"class":643},[637,1843,609],{"class":696},[637,1845,1164],{"class":643},[637,1847,1172],{"class":647},[637,1849,1850,1853,1855,1858,1861,1863],{"class":639,"line":902},[637,1851,1852],{"class":1261},"  if",[637,1854,1213],{"class":647},[637,1856,1857],{"class":643},"!",[637,1859,1860],{"class":715},"url",[637,1862,1285],{"class":647},[637,1864,1288],{"class":1261},[637,1866,1867],{"class":639,"line":924},[637,1868,1102],{"emptyLinePlaceholder":1101},[637,1870,1871,1874,1876,1878,1880,1882,1884],{"class":639,"line":945},[637,1872,1873],{"class":715},"  es",[637,1875,1210],{"class":643},[637,1877,1185],{"class":643},[637,1879,1188],{"class":1157},[637,1881,1161],{"class":647},[637,1883,1860],{"class":715},[637,1885,1172],{"class":647},[637,1887,1888,1890,1892,1894,1896,1898,1900,1902,1904],{"class":639,"line":955},[637,1889,1873],{"class":715},[637,1891,517],{"class":643},[637,1893,1207],{"class":1157},[637,1895,1210],{"class":643},[637,1897,1213],{"class":643},[637,1899,1217],{"class":1216},[637,1901,571],{"class":643},[637,1903,1222],{"class":651},[637,1905,1225],{"class":643},[637,1907,1908,1910,1912,1914,1916,1918,1920,1922,1924,1926,1928],{"class":639,"line":964},[637,1909,1125],{"class":651},[637,1911,1234],{"class":715},[637,1913,1210],{"class":643},[637,1915,1239],{"class":715},[637,1917,517],{"class":643},[637,1919,1244],{"class":1157},[637,1921,1161],{"class":647},[637,1923,1217],{"class":715},[637,1925,517],{"class":643},[637,1927,1253],{"class":715},[637,1929,1172],{"class":647},[637,1931,1932,1935,1937,1939,1941,1943,1945,1947,1949,1951,1953],{"class":639,"line":974},[637,1933,1934],{"class":1261},"    if",[637,1936,1213],{"class":647},[637,1938,1267],{"class":715},[637,1940,517],{"class":643},[637,1942,1272],{"class":715},[637,1944,1275],{"class":643},[637,1946,1133],{"class":643},[637,1948,1280],{"class":696},[637,1950,1164],{"class":643},[637,1952,1285],{"class":647},[637,1954,1288],{"class":1261},[637,1956,1957,1959,1961,1963,1965,1967,1970,1972,1974,1976,1979,1981,1983,1985,1987,1989,1991,1993,1995],{"class":639,"line":996},[637,1958,1934],{"class":1261},[637,1960,1213],{"class":647},[637,1962,1267],{"class":715},[637,1964,517],{"class":643},[637,1966,566],{"class":715},[637,1968,1969],{"class":643}," ===",[637,1971,1133],{"class":643},[637,1973,1308],{"class":696},[637,1975,1164],{"class":643},[637,1977,1978],{"class":643}," ||",[637,1980,1234],{"class":715},[637,1982,517],{"class":643},[637,1984,566],{"class":715},[637,1986,1969],{"class":643},[637,1988,1133],{"class":643},[637,1990,1326],{"class":696},[637,1992,1164],{"class":643},[637,1994,1285],{"class":647},[637,1996,1997],{"class":643},"{\n",[637,1999,2000,2003,2005,2008,2010,2013,2015,2017,2019,2021,2024,2026],{"class":639,"line":1075},[637,2001,2002],{"class":715},"      events",[637,2004,517],{"class":643},[637,2006,2007],{"class":715},"value",[637,2009,517],{"class":643},[637,2011,2012],{"class":1157},"unshift",[637,2014,1161],{"class":647},[637,2016,1267],{"class":715},[637,2018,517],{"class":643},[637,2020,1253],{"class":715},[637,2022,2023],{"class":1261}," as",[637,2025,1712],{"class":739},[637,2027,1172],{"class":647},[637,2029,2030,2032,2034,2037,2039,2041,2043,2045,2047,2050,2052,2054,2056,2058,2060,2062,2064],{"class":639,"line":1089},[637,2031,1262],{"class":1261},[637,2033,1213],{"class":647},[637,2035,2036],{"class":715},"events",[637,2038,517],{"class":643},[637,2040,2007],{"class":715},[637,2042,517],{"class":643},[637,2044,1569],{"class":715},[637,2046,1572],{"class":643},[637,2048,2049],{"class":753}," 500",[637,2051,1285],{"class":647},[637,2053,2036],{"class":715},[637,2055,517],{"class":643},[637,2057,2007],{"class":715},[637,2059,517],{"class":643},[637,2061,1569],{"class":715},[637,2063,1210],{"class":643},[637,2065,2066],{"class":753}," 500\n",[637,2068,2069],{"class":639,"line":1098},[637,2070,1598],{"class":643},[637,2072,2073],{"class":639,"line":1105},[637,2074,2075],{"class":643},"  }\n",[637,2077,2078,2080],{"class":639,"line":1115},[637,2079,1431],{"class":643},[637,2081,1172],{"class":715},[637,2083,2084],{"class":639,"line":1122},[637,2085,1102],{"emptyLinePlaceholder":1101},[637,2087,2088,2091,2093,2095,2097,2099,2102,2105],{"class":639,"line":1142},[637,2089,2090],{"class":1157},"onBeforeUnmount",[637,2092,1161],{"class":715},[637,2094,1428],{"class":643},[637,2096,1222],{"class":651},[637,2098,1759],{"class":715},[637,2100,2101],{"class":643},"?.",[637,2103,2104],{"class":1157},"close",[637,2106,2107],{"class":715},"())\n",[637,2109,2110,2112,2114],{"class":639,"line":1175},[637,2111,719],{"class":643},[637,2113,1110],{"class":647},[637,2115,655],{"class":643},[637,2117,2118],{"class":639,"line":1194},[637,2119,1102],{"emptyLinePlaceholder":1101},[637,2121,2122,2124,2127],{"class":639,"line":1199},[637,2123,661],{"class":643},[637,2125,2126],{"class":647},"template",[637,2128,655],{"class":643},[637,2130,2131,2133,2135],{"class":639,"line":1228},[637,2132,681],{"class":643},[637,2134,527],{"class":647},[637,2136,655],{"class":643},[637,2138,2139,2141,2143,2146,2148,2150,2153,2155,2158,2160,2162,2165,2167],{"class":639,"line":1258},[637,2140,999],{"class":643},[637,2142,530],{"class":647},[637,2144,2145],{"class":651}," v-for",[637,2147,690],{"class":643},[637,2149,693],{"class":643},[637,2151,2152],{"class":696},"(e, i) in events",[637,2154,693],{"class":643},[637,2156,2157],{"class":651}," :key",[637,2159,690],{"class":643},[637,2161,693],{"class":643},[637,2163,2164],{"class":696},"`${e.timestamp}-${i}`",[637,2166,693],{"class":643},[637,2168,655],{"class":643},[637,2170,2171,2174,2176,2178,2181,2183,2185],{"class":639,"line":1291},[637,2172,2173],{"class":643},"      \u003C",[637,2175,534],{"class":647},[637,2177,712],{"class":643},[637,2179,2180],{"class":715},"{{ e.level }}",[637,2182,719],{"class":643},[637,2184,534],{"class":647},[637,2186,655],{"class":643},[637,2188,2189,2191,2194,2196,2199,2201,2203],{"class":639,"line":1335},[637,2190,2173],{"class":643},[637,2192,2193],{"class":647},"strong",[637,2195,712],{"class":643},[637,2197,2198],{"class":715},"{{ e.service }}",[637,2200,719],{"class":643},[637,2202,2193],{"class":647},[637,2204,655],{"class":643},[637,2206,2207,2209,2211,2213,2216,2218,2220],{"class":639,"line":1340},[637,2208,2173],{"class":643},[637,2210,637],{"class":647},[637,2212,712],{"class":643},[637,2214,2215],{"class":715},"{{ e.action ?? e.message ?? e.path }}",[637,2217,719],{"class":643},[637,2219,637],{"class":647},[637,2221,655],{"class":643},[637,2223,2224,2227,2229],{"class":639,"line":1357},[637,2225,2226],{"class":643},"    \u003C\u002F",[637,2228,530],{"class":647},[637,2230,655],{"class":643},[637,2232,2233,2235,2237],{"class":639,"line":1384},[637,2234,948],{"class":643},[637,2236,527],{"class":647},[637,2238,655],{"class":643},[637,2240,2241,2243,2245],{"class":639,"line":1400},[637,2242,719],{"class":643},[637,2244,2126],{"class":647},[637,2246,655],{"class":643},[620,2248,2250],{"id":2249},"react-hook","React hook",[628,2252,2255],{"className":2253,"code":2254,"language":1664,"meta":633,"style":633},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { useEffect, useState } from 'react'\nimport type { WideEvent } from 'evlog'\n\nexport function useEvlogStream(url: string) {\n  const [events, setEvents] = useState\u003CWideEvent[]>([])\n\n  useEffect(() => {\n    if (!url) return\n    const es = new EventSource(url)\n    es.onmessage = (e) => {\n      const env = JSON.parse(e.data)\n      if (env.evlog !== '1') return\n      if (env.type === 'event' || env.type === 'replay') {\n        setEvents(prev => [env.data, ...prev].slice(0, 500))\n      }\n    }\n    return () => es.close()\n  }, [url])\n\n  return events\n}\n",[534,2256,2257,2282,2302,2306,2329,2360,2364,2377,2391,2409,2429,2453,2477,2517,2563,2568,2572,2589,2601,2605,2613],{"__ignoreMap":633},[637,2258,2259,2261,2263,2266,2268,2271,2273,2275,2277,2280],{"class":639,"line":640},[637,2260,1673],{"class":1261},[637,2262,743],{"class":643},[637,2264,2265],{"class":715}," useEffect",[637,2267,760],{"class":643},[637,2269,2270],{"class":715}," useState",[637,2272,1691],{"class":643},[637,2274,1694],{"class":1261},[637,2276,1133],{"class":643},[637,2278,2279],{"class":696},"react",[637,2281,1139],{"class":643},[637,2283,2284,2286,2288,2290,2292,2294,2296,2298,2300],{"class":639,"line":658},[637,2285,1673],{"class":1261},[637,2287,1707],{"class":1261},[637,2289,743],{"class":643},[637,2291,1712],{"class":715},[637,2293,1691],{"class":643},[637,2295,1694],{"class":1261},[637,2297,1133],{"class":643},[637,2299,1272],{"class":696},[637,2301,1139],{"class":643},[637,2303,2304],{"class":639,"line":668},[637,2305,1102],{"emptyLinePlaceholder":1101},[637,2307,2308,2311,2314,2317,2319,2321,2323,2325,2327],{"class":639,"line":678},[637,2309,2310],{"class":1261},"export",[637,2312,2313],{"class":651}," function",[637,2315,2316],{"class":1157}," useEvlogStream",[637,2318,1161],{"class":643},[637,2320,1860],{"class":1216},[637,2322,750],{"class":643},[637,2324,1830],{"class":739},[637,2326,571],{"class":643},[637,2328,1225],{"class":643},[637,2330,2331,2333,2336,2338,2340,2343,2346,2348,2350,2352,2354,2356,2358],{"class":639,"line":704},[637,2332,1805],{"class":651},[637,2334,2335],{"class":643}," [",[637,2337,2036],{"class":715},[637,2339,760],{"class":643},[637,2341,2342],{"class":715}," setEvents",[637,2344,2345],{"class":643},"]",[637,2347,1210],{"class":643},[637,2349,2270],{"class":1157},[637,2351,661],{"class":643},[637,2353,1743],{"class":739},[637,2355,1746],{"class":647},[637,2357,712],{"class":643},[637,2359,1751],{"class":647},[637,2361,2362],{"class":639,"line":726},[637,2363,1102],{"emptyLinePlaceholder":1101},[637,2365,2366,2369,2371,2373,2375],{"class":639,"line":736},[637,2367,2368],{"class":1157},"  useEffect",[637,2370,1161],{"class":647},[637,2372,1428],{"class":643},[637,2374,1222],{"class":651},[637,2376,1225],{"class":643},[637,2378,2379,2381,2383,2385,2387,2389],{"class":639,"line":791},[637,2380,1934],{"class":1261},[637,2382,1213],{"class":647},[637,2384,1857],{"class":643},[637,2386,1860],{"class":715},[637,2388,1285],{"class":647},[637,2390,1288],{"class":1261},[637,2392,2393,2395,2397,2399,2401,2403,2405,2407],{"class":639,"line":821},[637,2394,1125],{"class":651},[637,2396,1759],{"class":715},[637,2398,1210],{"class":643},[637,2400,1185],{"class":643},[637,2402,1188],{"class":1157},[637,2404,1161],{"class":647},[637,2406,1860],{"class":715},[637,2408,1172],{"class":647},[637,2410,2411,2413,2415,2417,2419,2421,2423,2425,2427],{"class":639,"line":877},[637,2412,1202],{"class":715},[637,2414,517],{"class":643},[637,2416,1207],{"class":1157},[637,2418,1210],{"class":643},[637,2420,1213],{"class":643},[637,2422,1217],{"class":1216},[637,2424,571],{"class":643},[637,2426,1222],{"class":651},[637,2428,1225],{"class":643},[637,2430,2431,2433,2435,2437,2439,2441,2443,2445,2447,2449,2451],{"class":639,"line":902},[637,2432,1231],{"class":651},[637,2434,1234],{"class":715},[637,2436,1210],{"class":643},[637,2438,1239],{"class":715},[637,2440,517],{"class":643},[637,2442,1244],{"class":1157},[637,2444,1161],{"class":647},[637,2446,1217],{"class":715},[637,2448,517],{"class":643},[637,2450,1253],{"class":715},[637,2452,1172],{"class":647},[637,2454,2455,2457,2459,2461,2463,2465,2467,2469,2471,2473,2475],{"class":639,"line":924},[637,2456,1262],{"class":1261},[637,2458,1213],{"class":647},[637,2460,1267],{"class":715},[637,2462,517],{"class":643},[637,2464,1272],{"class":715},[637,2466,1275],{"class":643},[637,2468,1133],{"class":643},[637,2470,1280],{"class":696},[637,2472,1164],{"class":643},[637,2474,1285],{"class":647},[637,2476,1288],{"class":1261},[637,2478,2479,2481,2483,2485,2487,2489,2491,2493,2495,2497,2499,2501,2503,2505,2507,2509,2511,2513,2515],{"class":639,"line":945},[637,2480,1262],{"class":1261},[637,2482,1213],{"class":647},[637,2484,1267],{"class":715},[637,2486,517],{"class":643},[637,2488,566],{"class":715},[637,2490,1969],{"class":643},[637,2492,1133],{"class":643},[637,2494,1308],{"class":696},[637,2496,1164],{"class":643},[637,2498,1978],{"class":643},[637,2500,1234],{"class":715},[637,2502,517],{"class":643},[637,2504,566],{"class":715},[637,2506,1969],{"class":643},[637,2508,1133],{"class":643},[637,2510,1326],{"class":696},[637,2512,1164],{"class":643},[637,2514,1285],{"class":647},[637,2516,1997],{"class":643},[637,2518,2519,2522,2524,2527,2529,2531,2533,2535,2537,2539,2542,2544,2546,2548,2551,2553,2556,2558,2560],{"class":639,"line":955},[637,2520,2521],{"class":1157},"        setEvents",[637,2523,1161],{"class":647},[637,2525,2526],{"class":1216},"prev",[637,2528,1222],{"class":651},[637,2530,2335],{"class":647},[637,2532,1267],{"class":715},[637,2534,517],{"class":643},[637,2536,1253],{"class":715},[637,2538,760],{"class":643},[637,2540,2541],{"class":643}," ...",[637,2543,2526],{"class":715},[637,2545,2345],{"class":647},[637,2547,517],{"class":643},[637,2549,2550],{"class":1157},"slice",[637,2552,1161],{"class":647},[637,2554,2555],{"class":753},"0",[637,2557,760],{"class":643},[637,2559,2049],{"class":753},[637,2561,2562],{"class":647},"))\n",[637,2564,2565],{"class":639,"line":964},[637,2566,2567],{"class":643},"      }\n",[637,2569,2570],{"class":639,"line":974},[637,2571,1598],{"class":643},[637,2573,2574,2577,2579,2581,2583,2585,2587],{"class":639,"line":996},[637,2575,2576],{"class":1261},"    return",[637,2578,1791],{"class":643},[637,2580,1222],{"class":651},[637,2582,1759],{"class":715},[637,2584,517],{"class":643},[637,2586,2104],{"class":1157},[637,2588,1592],{"class":647},[637,2590,2591,2594,2596,2598],{"class":639,"line":1075},[637,2592,2593],{"class":643},"  },",[637,2595,2335],{"class":647},[637,2597,1860],{"class":715},[637,2599,2600],{"class":647},"])\n",[637,2602,2603],{"class":639,"line":1089},[637,2604,1102],{"emptyLinePlaceholder":1101},[637,2606,2607,2610],{"class":639,"line":1098},[637,2608,2609],{"class":1261},"  return",[637,2611,2612],{"class":715}," events\n",[637,2614,2615],{"class":639,"line":1105},[637,2616,899],{"class":643},[506,2618,2619,2620,2622,2623,517],{},"That's the entire integration surface. No SDK, no special types beyond ",[534,2621,1743],{}," exported from ",[534,2624,1272],{},[594,2626,2628],{"id":2627},"_2-quick-cli-inspection-with-curl-jq","2. Quick CLI inspection with curl + jq",[506,2630,2631,2632,750],{},"The URL is in ",[534,2633,547],{},[628,2635,2639],{"className":2636,"code":2637,"language":2638,"meta":633,"style":633},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","URL=$(cat .evlog\u002Fstream.url)\ncurl -N \"$URL\" | jq -c 'select(.type == \"event\") | .data'\n","bash",[534,2640,2641,2657],{"__ignoreMap":633},[637,2642,2643,2646,2649,2652,2655],{"class":639,"line":640},[637,2644,2645],{"class":715},"URL",[637,2647,2648],{"class":643},"=$(",[637,2650,2651],{"class":739},"cat",[637,2653,2654],{"class":696}," .evlog\u002Fstream.url",[637,2656,1172],{"class":643},[637,2658,2659,2662,2665,2668,2671,2673,2675,2678,2681,2683,2686],{"class":639,"line":658},[637,2660,2661],{"class":739},"curl",[637,2663,2664],{"class":696}," -N",[637,2666,2667],{"class":643}," \"",[637,2669,2670],{"class":715},"$URL",[637,2672,693],{"class":643},[637,2674,1766],{"class":643},[637,2676,2677],{"class":739}," jq",[637,2679,2680],{"class":696}," -c",[637,2682,1133],{"class":643},[637,2684,2685],{"class":696},"select(.type == \"event\") | .data",[637,2687,1139],{"class":643},[506,2689,2690],{},"Filter on the client side as needed:",[628,2692,2694],{"className":2636,"code":2693,"language":2638,"meta":633,"style":633},"# Only errors\ncurl -sN \"$URL\" | jq -c 'select(.type == \"event\" and .data.level == \"error\") | .data'\n\n# Only one service\ncurl -sN \"$URL\" | jq -c 'select(.type == \"event\" and .data.service == \"checkout\") | .data'\n\n# Slow requests\ncurl -sN \"$URL\" | jq -c 'select(.type == \"event\" and .data.duration > 500) | .data'\n",[534,2695,2696,2701,2727,2731,2736,2761,2765,2770],{"__ignoreMap":633},[637,2697,2698],{"class":639,"line":640},[637,2699,2700],{"class":1118},"# Only errors\n",[637,2702,2703,2705,2708,2710,2712,2714,2716,2718,2720,2722,2725],{"class":639,"line":658},[637,2704,2661],{"class":739},[637,2706,2707],{"class":696}," -sN",[637,2709,2667],{"class":643},[637,2711,2670],{"class":715},[637,2713,693],{"class":643},[637,2715,1766],{"class":643},[637,2717,2677],{"class":739},[637,2719,2680],{"class":696},[637,2721,1133],{"class":643},[637,2723,2724],{"class":696},"select(.type == \"event\" and .data.level == \"error\") | .data",[637,2726,1139],{"class":643},[637,2728,2729],{"class":639,"line":668},[637,2730,1102],{"emptyLinePlaceholder":1101},[637,2732,2733],{"class":639,"line":678},[637,2734,2735],{"class":1118},"# Only one service\n",[637,2737,2738,2740,2742,2744,2746,2748,2750,2752,2754,2756,2759],{"class":639,"line":704},[637,2739,2661],{"class":739},[637,2741,2707],{"class":696},[637,2743,2667],{"class":643},[637,2745,2670],{"class":715},[637,2747,693],{"class":643},[637,2749,1766],{"class":643},[637,2751,2677],{"class":739},[637,2753,2680],{"class":696},[637,2755,1133],{"class":643},[637,2757,2758],{"class":696},"select(.type == \"event\" and .data.service == \"checkout\") | .data",[637,2760,1139],{"class":643},[637,2762,2763],{"class":639,"line":726},[637,2764,1102],{"emptyLinePlaceholder":1101},[637,2766,2767],{"class":639,"line":736},[637,2768,2769],{"class":1118},"# Slow requests\n",[637,2771,2772,2774,2776,2778,2780,2782,2784,2786,2788,2790,2793],{"class":639,"line":791},[637,2773,2661],{"class":739},[637,2775,2707],{"class":696},[637,2777,2667],{"class":643},[637,2779,2670],{"class":715},[637,2781,693],{"class":643},[637,2783,1766],{"class":643},[637,2785,2677],{"class":739},[637,2787,2680],{"class":696},[637,2789,1133],{"class":643},[637,2791,2792],{"class":696},"select(.type == \"event\" and .data.duration > 500) | .data",[637,2794,1139],{"class":643},[506,2796,2797,2800,2801,2803,2804,2807],{},[534,2798,2799],{},"-N"," keeps ",[534,2802,2661],{}," in streaming mode (no buffering). ",[534,2805,2806],{},"-s"," is silent.",[594,2809,2811],{"id":2810},"_3-replay-history-then-go-live","3. Replay history then go live",[506,2813,2814],{},"History on disk (filesystem drain) + live updates from the stream server = a full picture from any point in time.",[628,2816,2818],{"className":2253,"code":2817,"language":1664,"meta":633,"style":633},"import { readFsLogs } from 'evlog\u002Ffs'\nimport { readFile } from 'node:fs\u002Fpromises'\nimport type { WideEvent } from 'evlog'\n\nasync function bootstrap(handle: (e: WideEvent) => void) {\n  \u002F\u002F 1. Replay the last hour from `.evlog\u002Flogs\u002F`\n  const since = new Date(Date.now() - 60 * 60 * 1000)\n  for await (const event of readFsLogs({ since })) {\n    handle(event)\n  }\n\n  \u002F\u002F 2. Switch to the live SSE stream\n  const url = (await readFile('.evlog\u002Fstream.url', 'utf-8')).trim()\n  const es = new EventSource(url)\n  es.onmessage = (e) => {\n    const env = JSON.parse(e.data)\n    if (env.evlog !== '1') return\n    if (env.type === 'event' || env.type === 'replay') {\n      handle(env.data)\n    }\n  }\n  return () => es.close()\n}\n",[534,2819,2820,2840,2860,2880,2884,2919,2924,2968,3001,3012,3016,3020,3025,3066,3084,3104,3128,3152,3192,3207,3211,3215,3231],{"__ignoreMap":633},[637,2821,2822,2824,2826,2829,2831,2833,2835,2838],{"class":639,"line":640},[637,2823,1673],{"class":1261},[637,2825,743],{"class":643},[637,2827,2828],{"class":715}," readFsLogs",[637,2830,1691],{"class":643},[637,2832,1694],{"class":1261},[637,2834,1133],{"class":643},[637,2836,2837],{"class":696},"evlog\u002Ffs",[637,2839,1139],{"class":643},[637,2841,2842,2844,2846,2849,2851,2853,2855,2858],{"class":639,"line":658},[637,2843,1673],{"class":1261},[637,2845,743],{"class":643},[637,2847,2848],{"class":715}," readFile",[637,2850,1691],{"class":643},[637,2852,1694],{"class":1261},[637,2854,1133],{"class":643},[637,2856,2857],{"class":696},"node:fs\u002Fpromises",[637,2859,1139],{"class":643},[637,2861,2862,2864,2866,2868,2870,2872,2874,2876,2878],{"class":639,"line":668},[637,2863,1673],{"class":1261},[637,2865,1707],{"class":1261},[637,2867,743],{"class":643},[637,2869,1712],{"class":715},[637,2871,1691],{"class":643},[637,2873,1694],{"class":1261},[637,2875,1133],{"class":643},[637,2877,1272],{"class":696},[637,2879,1139],{"class":643},[637,2881,2882],{"class":639,"line":678},[637,2883,1102],{"emptyLinePlaceholder":1101},[637,2885,2886,2888,2890,2893,2895,2898,2900,2902,2904,2906,2908,2910,2912,2915,2917],{"class":639,"line":704},[637,2887,1788],{"class":651},[637,2889,2313],{"class":651},[637,2891,2892],{"class":1157}," bootstrap",[637,2894,1161],{"class":643},[637,2896,2897],{"class":1157},"handle",[637,2899,750],{"class":643},[637,2901,1213],{"class":643},[637,2903,1217],{"class":1216},[637,2905,750],{"class":643},[637,2907,1712],{"class":739},[637,2909,571],{"class":643},[637,2911,1222],{"class":651},[637,2913,2914],{"class":739}," void",[637,2916,571],{"class":643},[637,2918,1225],{"class":643},[637,2920,2921],{"class":639,"line":726},[637,2922,2923],{"class":1118},"  \u002F\u002F 1. Replay the last hour from `.evlog\u002Flogs\u002F`\n",[637,2925,2926,2928,2931,2933,2935,2937,2939,2942,2944,2947,2950,2953,2956,2959,2961,2963,2966],{"class":639,"line":736},[637,2927,1805],{"class":651},[637,2929,2930],{"class":715}," since",[637,2932,1210],{"class":643},[637,2934,1185],{"class":643},[637,2936,1412],{"class":1157},[637,2938,1161],{"class":647},[637,2940,2941],{"class":715},"Date",[637,2943,517],{"class":643},[637,2945,2946],{"class":1157},"now",[637,2948,2949],{"class":647},"() ",[637,2951,2952],{"class":643},"-",[637,2954,2955],{"class":753}," 60",[637,2957,2958],{"class":643}," *",[637,2960,2955],{"class":753},[637,2962,2958],{"class":643},[637,2964,2965],{"class":753}," 1000",[637,2967,1172],{"class":647},[637,2969,2970,2973,2975,2977,2979,2982,2985,2987,2989,2992,2994,2996,2999],{"class":639,"line":791},[637,2971,2972],{"class":1261},"  for",[637,2974,1817],{"class":1261},[637,2976,1213],{"class":647},[637,2978,1731],{"class":651},[637,2980,2981],{"class":715}," event",[637,2983,2984],{"class":643}," of",[637,2986,2828],{"class":1157},[637,2988,1161],{"class":647},[637,2990,2991],{"class":643},"{",[637,2993,2930],{"class":715},[637,2995,1691],{"class":643},[637,2997,2998],{"class":647},")) ",[637,3000,1997],{"class":643},[637,3002,3003,3006,3008,3010],{"class":639,"line":821},[637,3004,3005],{"class":1157},"    handle",[637,3007,1161],{"class":647},[637,3009,1308],{"class":715},[637,3011,1172],{"class":647},[637,3013,3014],{"class":639,"line":877},[637,3015,2075],{"class":643},[637,3017,3018],{"class":639,"line":902},[637,3019,1102],{"emptyLinePlaceholder":1101},[637,3021,3022],{"class":639,"line":924},[637,3023,3024],{"class":1118},"  \u002F\u002F 2. Switch to the live SSE stream\n",[637,3026,3027,3029,3031,3033,3035,3038,3040,3042,3044,3046,3048,3050,3052,3054,3056,3059,3061,3064],{"class":639,"line":945},[637,3028,1805],{"class":651},[637,3030,1810],{"class":715},[637,3032,1210],{"class":643},[637,3034,1213],{"class":647},[637,3036,3037],{"class":1261},"await",[637,3039,2848],{"class":1157},[637,3041,1161],{"class":647},[637,3043,1164],{"class":643},[637,3045,547],{"class":696},[637,3047,1164],{"class":643},[637,3049,760],{"class":643},[637,3051,1133],{"class":643},[637,3053,697],{"class":696},[637,3055,1164],{"class":643},[637,3057,3058],{"class":647},"))",[637,3060,517],{"class":643},[637,3062,3063],{"class":1157},"trim",[637,3065,1592],{"class":647},[637,3067,3068,3070,3072,3074,3076,3078,3080,3082],{"class":639,"line":955},[637,3069,1805],{"class":651},[637,3071,1759],{"class":715},[637,3073,1210],{"class":643},[637,3075,1185],{"class":643},[637,3077,1188],{"class":1157},[637,3079,1161],{"class":647},[637,3081,1860],{"class":715},[637,3083,1172],{"class":647},[637,3085,3086,3088,3090,3092,3094,3096,3098,3100,3102],{"class":639,"line":964},[637,3087,1873],{"class":715},[637,3089,517],{"class":643},[637,3091,1207],{"class":1157},[637,3093,1210],{"class":643},[637,3095,1213],{"class":643},[637,3097,1217],{"class":1216},[637,3099,571],{"class":643},[637,3101,1222],{"class":651},[637,3103,1225],{"class":643},[637,3105,3106,3108,3110,3112,3114,3116,3118,3120,3122,3124,3126],{"class":639,"line":974},[637,3107,1125],{"class":651},[637,3109,1234],{"class":715},[637,3111,1210],{"class":643},[637,3113,1239],{"class":715},[637,3115,517],{"class":643},[637,3117,1244],{"class":1157},[637,3119,1161],{"class":647},[637,3121,1217],{"class":715},[637,3123,517],{"class":643},[637,3125,1253],{"class":715},[637,3127,1172],{"class":647},[637,3129,3130,3132,3134,3136,3138,3140,3142,3144,3146,3148,3150],{"class":639,"line":996},[637,3131,1934],{"class":1261},[637,3133,1213],{"class":647},[637,3135,1267],{"class":715},[637,3137,517],{"class":643},[637,3139,1272],{"class":715},[637,3141,1275],{"class":643},[637,3143,1133],{"class":643},[637,3145,1280],{"class":696},[637,3147,1164],{"class":643},[637,3149,1285],{"class":647},[637,3151,1288],{"class":1261},[637,3153,3154,3156,3158,3160,3162,3164,3166,3168,3170,3172,3174,3176,3178,3180,3182,3184,3186,3188,3190],{"class":639,"line":1075},[637,3155,1934],{"class":1261},[637,3157,1213],{"class":647},[637,3159,1267],{"class":715},[637,3161,517],{"class":643},[637,3163,566],{"class":715},[637,3165,1969],{"class":643},[637,3167,1133],{"class":643},[637,3169,1308],{"class":696},[637,3171,1164],{"class":643},[637,3173,1978],{"class":643},[637,3175,1234],{"class":715},[637,3177,517],{"class":643},[637,3179,566],{"class":715},[637,3181,1969],{"class":643},[637,3183,1133],{"class":643},[637,3185,1326],{"class":696},[637,3187,1164],{"class":643},[637,3189,1285],{"class":647},[637,3191,1997],{"class":643},[637,3193,3194,3197,3199,3201,3203,3205],{"class":639,"line":1089},[637,3195,3196],{"class":1157},"      handle",[637,3198,1161],{"class":647},[637,3200,1267],{"class":715},[637,3202,517],{"class":643},[637,3204,1253],{"class":715},[637,3206,1172],{"class":647},[637,3208,3209],{"class":639,"line":1098},[637,3210,1598],{"class":643},[637,3212,3213],{"class":639,"line":1105},[637,3214,2075],{"class":643},[637,3216,3217,3219,3221,3223,3225,3227,3229],{"class":639,"line":1115},[637,3218,2609],{"class":1261},[637,3220,1791],{"class":643},[637,3222,1222],{"class":651},[637,3224,1759],{"class":715},[637,3226,517],{"class":643},[637,3228,2104],{"class":1157},[637,3230,1592],{"class":647},[637,3232,3233],{"class":639,"line":1122},[637,3234,899],{"class":643},[506,3236,3237,3239,3240,3243],{},[534,3238,536],{}," skips files outside the date range, so the replay step is fast even if you keep weeks of history. For a tail-only mode without on-disk replay, hit the stream server with ",[534,3241,3242],{},"?since=\u003Ciso>"," to reuse the in-process ring buffer instead.",[594,3245,3247],{"id":3246},"_4-node-bun-client-fetch-readablestream","4. Node \u002F Bun client (fetch + ReadableStream)",[506,3249,3250,3251,3253],{},"Same protocol, no ",[534,3252,558],{}," polyfill needed:",[628,3255,3257],{"className":2253,"code":3256,"language":1664,"meta":633,"style":633},"import { readFile } from 'node:fs\u002Fpromises'\n\nconst url = (await readFile('.evlog\u002Fstream.url', 'utf-8')).trim()\nconst res = await fetch(url)\nconst reader = res.body!.getReader()\nconst decoder = new TextDecoder()\nlet buffer = ''\n\nwhile (true) {\n  const { value, done } = await reader.read()\n  if (done) break\n  buffer += decoder.decode(value, { stream: true })\n\n  let idx\n  while ((idx = buffer.indexOf('\\n\\n')) !== -1) {\n    const frame = buffer.slice(0, idx)\n    buffer = buffer.slice(idx + 2)\n    const dataLine = frame.split('\\n').find(l => l.startsWith('data:'))\n    if (!dataLine) continue\n    const env = JSON.parse(dataLine.slice(5).trim())\n    if (env.type === 'event') console.log(env.data)\n  }\n}\n",[534,3258,3259,3277,3281,3320,3337,3361,3377,3389,3393,3408,3438,3452,3488,3492,3500,3544,3570,3595,3653,3669,3704,3744,3748],{"__ignoreMap":633},[637,3260,3261,3263,3265,3267,3269,3271,3273,3275],{"class":639,"line":640},[637,3262,1673],{"class":1261},[637,3264,743],{"class":643},[637,3266,2848],{"class":715},[637,3268,1691],{"class":643},[637,3270,1694],{"class":1261},[637,3272,1133],{"class":643},[637,3274,2857],{"class":696},[637,3276,1139],{"class":643},[637,3278,3279],{"class":639,"line":658},[637,3280,1102],{"emptyLinePlaceholder":1101},[637,3282,3283,3285,3288,3290,3292,3294,3296,3298,3300,3302,3304,3306,3308,3310,3312,3314,3316,3318],{"class":639,"line":668},[637,3284,1731],{"class":651},[637,3286,3287],{"class":715}," url ",[637,3289,690],{"class":643},[637,3291,1213],{"class":715},[637,3293,3037],{"class":1261},[637,3295,2848],{"class":1157},[637,3297,1161],{"class":715},[637,3299,1164],{"class":643},[637,3301,547],{"class":696},[637,3303,1164],{"class":643},[637,3305,760],{"class":643},[637,3307,1133],{"class":643},[637,3309,697],{"class":696},[637,3311,1164],{"class":643},[637,3313,3058],{"class":715},[637,3315,517],{"class":643},[637,3317,3063],{"class":1157},[637,3319,1592],{"class":715},[637,3321,3322,3324,3327,3329,3331,3334],{"class":639,"line":678},[637,3323,1731],{"class":651},[637,3325,3326],{"class":715}," res ",[637,3328,690],{"class":643},[637,3330,1817],{"class":1261},[637,3332,3333],{"class":1157}," fetch",[637,3335,3336],{"class":715},"(url)\n",[637,3338,3339,3341,3344,3346,3349,3351,3353,3356,3359],{"class":639,"line":704},[637,3340,1731],{"class":651},[637,3342,3343],{"class":715}," reader ",[637,3345,690],{"class":643},[637,3347,3348],{"class":715}," res",[637,3350,517],{"class":643},[637,3352,969],{"class":715},[637,3354,3355],{"class":643},"!.",[637,3357,3358],{"class":1157},"getReader",[637,3360,1592],{"class":715},[637,3362,3363,3365,3368,3370,3372,3375],{"class":639,"line":726},[637,3364,1731],{"class":651},[637,3366,3367],{"class":715}," decoder ",[637,3369,690],{"class":643},[637,3371,1185],{"class":643},[637,3373,3374],{"class":1157}," TextDecoder",[637,3376,1592],{"class":715},[637,3378,3379,3381,3384,3386],{"class":639,"line":736},[637,3380,1756],{"class":651},[637,3382,3383],{"class":715}," buffer ",[637,3385,690],{"class":643},[637,3387,3388],{"class":643}," ''\n",[637,3390,3391],{"class":639,"line":791},[637,3392,1102],{"emptyLinePlaceholder":1101},[637,3394,3395,3398,3400,3404,3406],{"class":639,"line":821},[637,3396,3397],{"class":1261},"while",[637,3399,1213],{"class":715},[637,3401,3403],{"class":3402},"sfNiH","true",[637,3405,1285],{"class":715},[637,3407,1997],{"class":643},[637,3409,3410,3412,3414,3417,3419,3422,3424,3426,3428,3431,3433,3436],{"class":639,"line":877},[637,3411,1805],{"class":651},[637,3413,743],{"class":643},[637,3415,3416],{"class":715}," value",[637,3418,760],{"class":643},[637,3420,3421],{"class":715}," done",[637,3423,1691],{"class":643},[637,3425,1210],{"class":643},[637,3427,1817],{"class":1261},[637,3429,3430],{"class":715}," reader",[637,3432,517],{"class":643},[637,3434,3435],{"class":1157},"read",[637,3437,1592],{"class":647},[637,3439,3440,3442,3444,3447,3449],{"class":639,"line":902},[637,3441,1852],{"class":1261},[637,3443,1213],{"class":647},[637,3445,3446],{"class":715},"done",[637,3448,1285],{"class":647},[637,3450,3451],{"class":1261},"break\n",[637,3453,3454,3457,3460,3463,3465,3468,3470,3472,3474,3476,3479,3481,3484,3486],{"class":639,"line":924},[637,3455,3456],{"class":715},"  buffer",[637,3458,3459],{"class":643}," +=",[637,3461,3462],{"class":715}," decoder",[637,3464,517],{"class":643},[637,3466,3467],{"class":1157},"decode",[637,3469,1161],{"class":647},[637,3471,2007],{"class":715},[637,3473,760],{"class":643},[637,3475,743],{"class":643},[637,3477,3478],{"class":647}," stream",[637,3480,750],{"class":643},[637,3482,3483],{"class":3402}," true",[637,3485,1691],{"class":643},[637,3487,1172],{"class":647},[637,3489,3490],{"class":639,"line":945},[637,3491,1102],{"emptyLinePlaceholder":1101},[637,3493,3494,3497],{"class":639,"line":955},[637,3495,3496],{"class":651},"  let",[637,3498,3499],{"class":715}," idx\n",[637,3501,3502,3505,3508,3511,3513,3516,3518,3521,3523,3525,3528,3530,3532,3535,3538,3540,3542],{"class":639,"line":964},[637,3503,3504],{"class":1261},"  while",[637,3506,3507],{"class":647}," ((",[637,3509,3510],{"class":715},"idx",[637,3512,1210],{"class":643},[637,3514,3515],{"class":715}," buffer",[637,3517,517],{"class":643},[637,3519,3520],{"class":1157},"indexOf",[637,3522,1161],{"class":647},[637,3524,1164],{"class":643},[637,3526,3527],{"class":715},"\\n\\n",[637,3529,1164],{"class":643},[637,3531,2998],{"class":647},[637,3533,3534],{"class":643},"!==",[637,3536,3537],{"class":643}," -",[637,3539,1280],{"class":753},[637,3541,1285],{"class":647},[637,3543,1997],{"class":643},[637,3545,3546,3548,3551,3553,3555,3557,3559,3561,3563,3565,3568],{"class":639,"line":974},[637,3547,1125],{"class":651},[637,3549,3550],{"class":715}," frame",[637,3552,1210],{"class":643},[637,3554,3515],{"class":715},[637,3556,517],{"class":643},[637,3558,2550],{"class":1157},[637,3560,1161],{"class":647},[637,3562,2555],{"class":753},[637,3564,760],{"class":643},[637,3566,3567],{"class":715}," idx",[637,3569,1172],{"class":647},[637,3571,3572,3575,3577,3579,3581,3583,3585,3587,3590,3593],{"class":639,"line":996},[637,3573,3574],{"class":715},"    buffer",[637,3576,1210],{"class":643},[637,3578,3515],{"class":715},[637,3580,517],{"class":643},[637,3582,2550],{"class":1157},[637,3584,1161],{"class":647},[637,3586,3510],{"class":715},[637,3588,3589],{"class":643}," +",[637,3591,3592],{"class":753}," 2",[637,3594,1172],{"class":647},[637,3596,3597,3599,3602,3604,3606,3608,3611,3613,3615,3618,3620,3622,3624,3627,3629,3632,3634,3637,3639,3642,3644,3646,3649,3651],{"class":639,"line":1075},[637,3598,1125],{"class":651},[637,3600,3601],{"class":715}," dataLine",[637,3603,1210],{"class":643},[637,3605,3550],{"class":715},[637,3607,517],{"class":643},[637,3609,3610],{"class":1157},"split",[637,3612,1161],{"class":647},[637,3614,1164],{"class":643},[637,3616,3617],{"class":715},"\\n",[637,3619,1164],{"class":643},[637,3621,571],{"class":647},[637,3623,517],{"class":643},[637,3625,3626],{"class":1157},"find",[637,3628,1161],{"class":647},[637,3630,3631],{"class":1216},"l",[637,3633,1222],{"class":651},[637,3635,3636],{"class":715}," l",[637,3638,517],{"class":643},[637,3640,3641],{"class":1157},"startsWith",[637,3643,1161],{"class":647},[637,3645,1164],{"class":643},[637,3647,3648],{"class":696},"data:",[637,3650,1164],{"class":643},[637,3652,2562],{"class":647},[637,3654,3655,3657,3659,3661,3664,3666],{"class":639,"line":1089},[637,3656,1934],{"class":1261},[637,3658,1213],{"class":647},[637,3660,1857],{"class":643},[637,3662,3663],{"class":715},"dataLine",[637,3665,1285],{"class":647},[637,3667,3668],{"class":1261},"continue\n",[637,3670,3671,3673,3675,3677,3679,3681,3683,3685,3687,3689,3691,3693,3696,3698,3700,3702],{"class":639,"line":1098},[637,3672,1125],{"class":651},[637,3674,1234],{"class":715},[637,3676,1210],{"class":643},[637,3678,1239],{"class":715},[637,3680,517],{"class":643},[637,3682,1244],{"class":1157},[637,3684,1161],{"class":647},[637,3686,3663],{"class":715},[637,3688,517],{"class":643},[637,3690,2550],{"class":1157},[637,3692,1161],{"class":647},[637,3694,3695],{"class":753},"5",[637,3697,571],{"class":647},[637,3699,517],{"class":643},[637,3701,3063],{"class":1157},[637,3703,2107],{"class":647},[637,3705,3706,3708,3710,3712,3714,3716,3718,3720,3722,3724,3726,3729,3731,3734,3736,3738,3740,3742],{"class":639,"line":1105},[637,3707,1934],{"class":1261},[637,3709,1213],{"class":647},[637,3711,1267],{"class":715},[637,3713,517],{"class":643},[637,3715,566],{"class":715},[637,3717,1969],{"class":643},[637,3719,1133],{"class":643},[637,3721,1308],{"class":696},[637,3723,1164],{"class":643},[637,3725,1285],{"class":647},[637,3727,3728],{"class":715},"console",[637,3730,517],{"class":643},[637,3732,3733],{"class":1157},"log",[637,3735,1161],{"class":647},[637,3737,1267],{"class":715},[637,3739,517],{"class":643},[637,3741,1253],{"class":715},[637,3743,1172],{"class":647},[637,3745,3746],{"class":639,"line":1115},[637,3747,2075],{"class":643},[637,3749,3750],{"class":639,"line":1122},[637,3751,899],{"class":643},[594,3753,3755],{"id":3754},"_5-filter-transform-aggregate-on-the-consumer","5. Filter, transform, aggregate on the consumer",[506,3757,3758],{},"Keep the server dumb — every consumer picks what it cares about:",[628,3760,3762],{"className":2253,"code":3761,"language":1664,"meta":633,"style":633},"\u002F\u002F Just errors\nconst errors = events.filter(e => e.level === 'error')\n\n\u002F\u002F Slow requests\nconst slowReqs = events.filter(e => typeof e.duration === 'number' && e.duration > 500)\n\n\u002F\u002F Group by service\nconst byService = Object.groupBy(events, e => e.service)\n\n\u002F\u002F Rolling error rate (last 100 events)\nconst last100 = events.slice(0, 100)\nconst errorRate = last100.filter(e => e.level === 'error').length \u002F last100.length\n\n\u002F\u002F Ad-hoc cost analytics — works because evlog\u002Fai writes ai.* fields on every AI call\nconst totalCost = events\n  .filter(e => typeof e.ai?.estimatedCost === 'number')\n  .reduce((sum, e) => sum + (e.ai?.estimatedCost as number), 0)\n",[534,3763,3764,3769,3812,3816,3821,3875,3879,3884,3917,3921,3926,3952,4005,4009,4014,4025,4062],{"__ignoreMap":633},[637,3765,3766],{"class":639,"line":640},[637,3767,3768],{"class":1118},"\u002F\u002F Just errors\n",[637,3770,3771,3773,3776,3778,3781,3783,3786,3788,3790,3792,3795,3797,3800,3803,3805,3808,3810],{"class":639,"line":658},[637,3772,1731],{"class":651},[637,3774,3775],{"class":715}," errors ",[637,3777,690],{"class":643},[637,3779,3780],{"class":715}," events",[637,3782,517],{"class":643},[637,3784,3785],{"class":1157},"filter",[637,3787,1161],{"class":715},[637,3789,1217],{"class":1216},[637,3791,1222],{"class":651},[637,3793,3794],{"class":715}," e",[637,3796,517],{"class":643},[637,3798,3799],{"class":715},"level ",[637,3801,3802],{"class":643},"===",[637,3804,1133],{"class":643},[637,3806,3807],{"class":696},"error",[637,3809,1164],{"class":643},[637,3811,1172],{"class":715},[637,3813,3814],{"class":639,"line":668},[637,3815,1102],{"emptyLinePlaceholder":1101},[637,3817,3818],{"class":639,"line":678},[637,3819,3820],{"class":1118},"\u002F\u002F Slow requests\n",[637,3822,3823,3825,3828,3830,3832,3834,3836,3838,3840,3842,3845,3847,3849,3852,3854,3856,3859,3861,3863,3865,3867,3869,3871,3873],{"class":639,"line":704},[637,3824,1731],{"class":651},[637,3826,3827],{"class":715}," slowReqs ",[637,3829,690],{"class":643},[637,3831,3780],{"class":715},[637,3833,517],{"class":643},[637,3835,3785],{"class":1157},[637,3837,1161],{"class":715},[637,3839,1217],{"class":1216},[637,3841,1222],{"class":651},[637,3843,3844],{"class":643}," typeof",[637,3846,3794],{"class":715},[637,3848,517],{"class":643},[637,3850,3851],{"class":715},"duration ",[637,3853,3802],{"class":643},[637,3855,1133],{"class":643},[637,3857,3858],{"class":696},"number",[637,3860,1164],{"class":643},[637,3862,1313],{"class":643},[637,3864,3794],{"class":715},[637,3866,517],{"class":643},[637,3868,3851],{"class":715},[637,3870,712],{"class":643},[637,3872,2049],{"class":753},[637,3874,1172],{"class":715},[637,3876,3877],{"class":639,"line":726},[637,3878,1102],{"emptyLinePlaceholder":1101},[637,3880,3881],{"class":639,"line":736},[637,3882,3883],{"class":1118},"\u002F\u002F Group by service\n",[637,3885,3886,3888,3891,3893,3896,3898,3901,3904,3906,3908,3910,3912,3914],{"class":639,"line":791},[637,3887,1731],{"class":651},[637,3889,3890],{"class":715}," byService ",[637,3892,690],{"class":643},[637,3894,3895],{"class":715}," Object",[637,3897,517],{"class":643},[637,3899,3900],{"class":1157},"groupBy",[637,3902,3903],{"class":715},"(events",[637,3905,760],{"class":643},[637,3907,3794],{"class":1216},[637,3909,1222],{"class":651},[637,3911,3794],{"class":715},[637,3913,517],{"class":643},[637,3915,3916],{"class":715},"service)\n",[637,3918,3919],{"class":639,"line":821},[637,3920,1102],{"emptyLinePlaceholder":1101},[637,3922,3923],{"class":639,"line":877},[637,3924,3925],{"class":1118},"\u002F\u002F Rolling error rate (last 100 events)\n",[637,3927,3928,3930,3933,3935,3937,3939,3941,3943,3945,3947,3950],{"class":639,"line":902},[637,3929,1731],{"class":651},[637,3931,3932],{"class":715}," last100 ",[637,3934,690],{"class":643},[637,3936,3780],{"class":715},[637,3938,517],{"class":643},[637,3940,2550],{"class":1157},[637,3942,1161],{"class":715},[637,3944,2555],{"class":753},[637,3946,760],{"class":643},[637,3948,3949],{"class":753}," 100",[637,3951,1172],{"class":715},[637,3953,3954,3956,3959,3961,3964,3966,3968,3970,3972,3974,3976,3978,3980,3982,3984,3986,3988,3990,3992,3995,3998,4000,4002],{"class":639,"line":924},[637,3955,1731],{"class":651},[637,3957,3958],{"class":715}," errorRate ",[637,3960,690],{"class":643},[637,3962,3963],{"class":715}," last100",[637,3965,517],{"class":643},[637,3967,3785],{"class":1157},[637,3969,1161],{"class":715},[637,3971,1217],{"class":1216},[637,3973,1222],{"class":651},[637,3975,3794],{"class":715},[637,3977,517],{"class":643},[637,3979,3799],{"class":715},[637,3981,3802],{"class":643},[637,3983,1133],{"class":643},[637,3985,3807],{"class":696},[637,3987,1164],{"class":643},[637,3989,571],{"class":715},[637,3991,517],{"class":643},[637,3993,3994],{"class":715},"length ",[637,3996,3997],{"class":643},"\u002F",[637,3999,3963],{"class":715},[637,4001,517],{"class":643},[637,4003,4004],{"class":715},"length\n",[637,4006,4007],{"class":639,"line":945},[637,4008,1102],{"emptyLinePlaceholder":1101},[637,4010,4011],{"class":639,"line":955},[637,4012,4013],{"class":1118},"\u002F\u002F Ad-hoc cost analytics — works because evlog\u002Fai writes ai.* fields on every AI call\n",[637,4015,4016,4018,4021,4023],{"class":639,"line":964},[637,4017,1731],{"class":651},[637,4019,4020],{"class":715}," totalCost ",[637,4022,690],{"class":643},[637,4024,2612],{"class":715},[637,4026,4027,4030,4032,4034,4036,4038,4040,4042,4044,4047,4049,4052,4054,4056,4058,4060],{"class":639,"line":974},[637,4028,4029],{"class":643},"  .",[637,4031,3785],{"class":1157},[637,4033,1161],{"class":715},[637,4035,1217],{"class":1216},[637,4037,1222],{"class":651},[637,4039,3844],{"class":643},[637,4041,3794],{"class":715},[637,4043,517],{"class":643},[637,4045,4046],{"class":715},"ai",[637,4048,2101],{"class":643},[637,4050,4051],{"class":715},"estimatedCost ",[637,4053,3802],{"class":643},[637,4055,1133],{"class":643},[637,4057,3858],{"class":696},[637,4059,1164],{"class":643},[637,4061,1172],{"class":715},[637,4063,4064,4066,4069,4071,4073,4076,4078,4080,4082,4084,4087,4090,4093,4095,4097,4099,4101,4104,4107,4109,4111,4113],{"class":639,"line":996},[637,4065,4029],{"class":643},[637,4067,4068],{"class":1157},"reduce",[637,4070,1161],{"class":715},[637,4072,1161],{"class":643},[637,4074,4075],{"class":1216},"sum",[637,4077,760],{"class":643},[637,4079,3794],{"class":1216},[637,4081,571],{"class":643},[637,4083,1222],{"class":651},[637,4085,4086],{"class":715}," sum ",[637,4088,4089],{"class":643},"+",[637,4091,4092],{"class":715}," (e",[637,4094,517],{"class":643},[637,4096,4046],{"class":715},[637,4098,2101],{"class":643},[637,4100,4051],{"class":715},[637,4102,4103],{"class":1261},"as",[637,4105,4106],{"class":739}," number",[637,4108,571],{"class":715},[637,4110,760],{"class":643},[637,4112,774],{"class":753},[637,4114,1172],{"class":715},[594,4116,4118],{"id":4117},"_6-self-hosted-tail-f-replacement","6. Self-hosted \"tail -f\" replacement",[506,4120,4121],{},"Skip the network entirely if the consumer runs on the same machine:",[628,4123,4125],{"className":2253,"code":4124,"language":1664,"meta":633,"style":633},"import { tailFsLogs } from 'evlog\u002Ffs'\n\nconst ac = new AbortController()\nprocess.on('SIGINT', () => ac.abort())\n\nfor await (const event of tailFsLogs({ signal: ac.signal })) {\n  if (event.level === 'error') notifyOps(event)\n}\n",[534,4126,4127,4146,4150,4166,4201,4205,4246,4277],{"__ignoreMap":633},[637,4128,4129,4131,4133,4136,4138,4140,4142,4144],{"class":639,"line":640},[637,4130,1673],{"class":1261},[637,4132,743],{"class":643},[637,4134,4135],{"class":715}," tailFsLogs",[637,4137,1691],{"class":643},[637,4139,1694],{"class":1261},[637,4141,1133],{"class":643},[637,4143,2837],{"class":696},[637,4145,1139],{"class":643},[637,4147,4148],{"class":639,"line":658},[637,4149,1102],{"emptyLinePlaceholder":1101},[637,4151,4152,4154,4157,4159,4161,4164],{"class":639,"line":668},[637,4153,1731],{"class":651},[637,4155,4156],{"class":715}," ac ",[637,4158,690],{"class":643},[637,4160,1185],{"class":643},[637,4162,4163],{"class":1157}," AbortController",[637,4165,1592],{"class":715},[637,4167,4168,4171,4173,4176,4178,4180,4183,4185,4187,4189,4191,4194,4196,4199],{"class":639,"line":678},[637,4169,4170],{"class":715},"process",[637,4172,517],{"class":643},[637,4174,4175],{"class":1157},"on",[637,4177,1161],{"class":715},[637,4179,1164],{"class":643},[637,4181,4182],{"class":696},"SIGINT",[637,4184,1164],{"class":643},[637,4186,760],{"class":643},[637,4188,1791],{"class":643},[637,4190,1222],{"class":651},[637,4192,4193],{"class":715}," ac",[637,4195,517],{"class":643},[637,4197,4198],{"class":1157},"abort",[637,4200,2107],{"class":715},[637,4202,4203],{"class":639,"line":704},[637,4204,1102],{"emptyLinePlaceholder":1101},[637,4206,4207,4210,4212,4214,4216,4219,4222,4224,4226,4228,4231,4233,4235,4237,4240,4242,4244],{"class":639,"line":726},[637,4208,4209],{"class":1261},"for",[637,4211,1817],{"class":1261},[637,4213,1213],{"class":715},[637,4215,1731],{"class":651},[637,4217,4218],{"class":715}," event ",[637,4220,4221],{"class":643},"of",[637,4223,4135],{"class":1157},[637,4225,1161],{"class":715},[637,4227,2991],{"class":643},[637,4229,4230],{"class":647}," signal",[637,4232,750],{"class":643},[637,4234,4193],{"class":715},[637,4236,517],{"class":643},[637,4238,4239],{"class":715},"signal ",[637,4241,1431],{"class":643},[637,4243,2998],{"class":715},[637,4245,1997],{"class":643},[637,4247,4248,4250,4252,4254,4256,4258,4260,4262,4264,4266,4268,4271,4273,4275],{"class":639,"line":736},[637,4249,1852],{"class":1261},[637,4251,1213],{"class":647},[637,4253,1308],{"class":715},[637,4255,517],{"class":643},[637,4257,1031],{"class":715},[637,4259,1969],{"class":643},[637,4261,1133],{"class":643},[637,4263,3807],{"class":696},[637,4265,1164],{"class":643},[637,4267,1285],{"class":647},[637,4269,4270],{"class":1157},"notifyOps",[637,4272,1161],{"class":647},[637,4274,1308],{"class":715},[637,4276,1172],{"class":647},[637,4278,4279],{"class":639,"line":791},[637,4280,899],{"class":643},[506,4282,4283],{},"Works without instrumenting the running app — useful for sidecar \u002F observer processes that watch a directory.",[594,4285,4287],{"id":4286},"what-not-to-do","What not to do",[527,4289,4290,4296,4302],{},[530,4291,4292,4295],{},[2193,4293,4294],{},"Don't run the stream server on Vercel Functions \u002F Cloudflare Workers \u002F Lambda."," Each invocation is a separate isolate; subscribers in one isolate never see events emitted by other isolates. Use a real broker (Redis Streams, NATS, Pub\u002FSub) for cross-instance fan-out.",[530,4297,4298,4301],{},[2193,4299,4300],{},"Don't put auth-sensitive data in wide events"," unless your evlog config redacts them. The server relays exactly what your app emitted — including any unredacted PII.",[530,4303,4304,4307],{},[2193,4305,4306],{},"Don't filter at the server"," (\"only error events please\"). The server is purpose-built to be transparent. Filter on the consumer side; that way one filter doesn't starve another consumer.",[731,4309,4310],{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sqsOY, html code.shiki .sqsOY{--shiki-light:#8796B0;--shiki-default:#B2CCD6;--shiki-dark:#B2CCD6}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":633,"searchDepth":658,"depth":658,"links":4312},[4313,4318,4319,4320,4321,4322,4323],{"id":596,"depth":658,"text":597,"children":4314},[4315,4316,4317],{"id":622,"depth":668,"text":623},{"id":1635,"depth":668,"text":1636},{"id":2249,"depth":668,"text":2250},{"id":2627,"depth":658,"text":2628},{"id":2810,"depth":658,"text":2811},{"id":3246,"depth":658,"text":3247},{"id":3754,"depth":658,"text":3755},{"id":4117,"depth":658,"text":4118},{"id":4286,"depth":658,"text":4287},"Concrete copy-paste recipes — build your own minimal devtool, pipe to curl + jq, replay history then go live, and aggregate on the consumer side.","md",null,{},{"title":381,"icon":442},{"title":381,"description":4324},"dsdzs4cirQ9eOCQ0hXtlheWkWzi4gTmyIugySDsuRk8",[4332,4334],{"title":435,"path":436,"stem":437,"description":4333,"icon":438,"children":-1},"Replay and tail the local NDJSON drain with readFsLogs and tailFsLogs — works in-process or from any external Node tool, survives restarts.",{"title":444,"path":445,"stem":446,"description":4335,"icon":423,"children":-1},"definePlugin is the canonical extension point for evlog — opt into any subset of setup, onRequestStart, enrich, keep, drain, onRequestFinish, onClientLog, extendLogger from a single cohesive object.",1785016757697]