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