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