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