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