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