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