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