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