[{"data":1,"prerenderedAt":1302},["ShallowReactive",2],{"navigation_docs":3,"-use-cases-telemetry-overview":533,"-use-cases-telemetry-overview-surround":1297},[4,29,76,122,304,436,495],{"title":5,"path":6,"stem":7,"children":8,"page":28},"Start","\u002Fstart","1.start",[9,13,18,23],{"title":10,"path":11,"stem":12},"Introduction","\u002Fstart\u002Fintroduction","1.start\u002F1.introduction",{"title":14,"path":15,"stem":16,"icon":17},"Why start with evlog","\u002Fstart\u002Fwhy-evlog","1.start\u002F2.why-evlog","i-lucide-rocket",{"title":19,"path":20,"stem":21,"icon":22},"Installation","\u002Fstart\u002Finstallation","1.start\u002F3.installation","i-lucide-download",{"title":24,"path":25,"stem":26,"icon":27},"Quick Start","\u002Fstart\u002Fquick-start","1.start\u002F4.quick-start","i-lucide-zap",false,{"title":30,"path":31,"stem":32,"children":33,"page":28},"Learn","\u002Flearn","2.learn",[34,38,43,48,53,58,62,67,72],{"title":35,"path":36,"stem":37},"Learn evlog","\u002Flearn\u002Foverview","2.learn\u002F0.overview",{"title":39,"path":40,"stem":41,"icon":42},"Simple Logging","\u002Flearn\u002Fsimple-logging","2.learn\u002F1.simple-logging","i-lucide-terminal",{"title":44,"path":45,"stem":46,"icon":47},"Wide Events","\u002Flearn\u002Fwide-events","2.learn\u002F2.wide-events","i-lucide-layers",{"title":49,"path":50,"stem":51,"icon":52},"Structured Errors","\u002Flearn\u002Fstructured-errors","2.learn\u002F3.structured-errors","i-lucide-shield-alert",{"title":54,"path":55,"stem":56,"icon":57},"Lifecycle","\u002Flearn\u002Flifecycle","2.learn\u002F4.lifecycle","i-lucide-arrow-right-left",{"title":59,"path":60,"stem":61},"Sampling","\u002Flearn\u002Fsampling","2.learn\u002F5.sampling",{"title":63,"path":64,"stem":65,"icon":66},"Auto-Redaction","\u002Flearn\u002Fredaction","2.learn\u002F6.redaction","i-lucide-eye-off",{"title":68,"path":69,"stem":70,"icon":71},"Typed Fields","\u002Flearn\u002Ftyped-fields","2.learn\u002F7.typed-fields","i-simple-icons-typescript",{"title":73,"path":74,"stem":75},"Catalogs","\u002Flearn\u002Fcatalogs","2.learn\u002F8.catalogs",{"title":77,"path":78,"stem":79,"children":80,"page":28},"CLI","\u002Fcli","3.cli",[81,85,90,95,99,103,108,113,118],{"title":82,"path":83,"stem":84},"evlog CLI","\u002Fcli\u002Foverview","3.cli\u002F0.overview",{"title":86,"path":87,"stem":88,"icon":89},"init","\u002Fcli\u002Finit","3.cli\u002F1.init","i-lucide-wand-sparkles",{"title":91,"path":92,"stem":93,"icon":94},"map","\u002Fcli\u002Fmap","3.cli\u002F2.map","i-lucide-radar",{"title":96,"path":97,"stem":98},"Map rules","\u002Fcli\u002Frules","3.cli\u002F3.rules",{"title":100,"path":101,"stem":102},"Map scoring","\u002Fcli\u002Fscoring","3.cli\u002F4.scoring",{"title":104,"path":105,"stem":106,"icon":107},"CI","\u002Fcli\u002Fci","3.cli\u002F5.ci","i-lucide-git-pull-request",{"title":109,"path":110,"stem":111,"icon":112},"doctor","\u002Fcli\u002Fdoctor","3.cli\u002F6.doctor","i-lucide-stethoscope",{"title":114,"path":115,"stem":116,"icon":117},"telemetry","\u002Fcli\u002Ftelemetry","3.cli\u002F7.telemetry","i-lucide-bar-chart-3",{"title":119,"path":120,"stem":121},"evlog agents","\u002Fcli\u002Fagents","3.cli\u002F8.agents",{"title":123,"path":124,"stem":125,"children":126,"page":28},"Integrate","\u002Fintegrate","4.integrate",[127,132,216],{"title":128,"path":129,"stem":130,"icon":131},"Overview","\u002Fintegrate\u002Foverview","4.integrate\u002F0.overview","i-lucide-plug",{"title":133,"path":134,"stem":135,"children":136,"page":28},"Adapters","\u002Fintegrate\u002Fadapters","4.integrate\u002Fadapters",[137,141,171,196],{"title":128,"path":138,"stem":139,"icon":140},"\u002Fintegrate\u002Fadapters\u002Foverview","4.integrate\u002Fadapters\u002F01.overview","i-lucide-list",{"title":142,"path":143,"stem":144,"children":145,"page":28},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","4.integrate\u002Fadapters\u002Fcloud",[146,151,156,161,166],{"title":147,"path":148,"stem":149,"icon":150},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","4.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":152,"path":153,"stem":154,"icon":155},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","4.integrate\u002Fadapters\u002Fcloud\u002F02.posthog","i-simple-icons-posthog",{"title":157,"path":158,"stem":159,"icon":160},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","4.integrate\u002Fadapters\u002Fcloud\u002F03.sentry","i-simple-icons-sentry",{"title":162,"path":163,"stem":164,"icon":165},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","4.integrate\u002Fadapters\u002Fcloud\u002F04.better-stack","i-simple-icons-betterstack",{"title":167,"path":168,"stem":169,"icon":170},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","4.integrate\u002Fadapters\u002Fcloud\u002F05.datadog","i-simple-icons-datadog",{"title":172,"path":173,"stem":174,"children":175,"page":28},"Cloud or Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fhybrid","4.integrate\u002Fadapters\u002Fhybrid",[176,181,186,191],{"title":177,"path":178,"stem":179,"icon":180},"Grafana Loki","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Floki","4.integrate\u002Fadapters\u002Fhybrid\u002F01.loki","i-simple-icons-grafana",{"title":182,"path":183,"stem":184,"icon":185},"ClickHouse","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fclickhouse","4.integrate\u002Fadapters\u002Fhybrid\u002F02.clickhouse","i-simple-icons-clickhouse",{"title":187,"path":188,"stem":189,"icon":190},"OTLP","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fotlp","4.integrate\u002Fadapters\u002Fhybrid\u002F03.otlp","i-simple-icons-opentelemetry",{"title":192,"path":193,"stem":194,"icon":195},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fhybrid\u002Fhyperdx","4.integrate\u002Fadapters\u002Fhybrid\u002F04.hyperdx","i-custom-hyperdx",{"title":197,"path":198,"stem":199,"children":200,"page":28},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","4.integrate\u002Fadapters\u002Fself-hosted",[201,206,211],{"title":202,"path":203,"stem":204,"icon":205},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","4.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":207,"path":208,"stem":209,"icon":210},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","4.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":212,"path":213,"stem":214,"icon":215},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","4.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":217,"path":218,"stem":219,"children":220,"page":28},"Frameworks","\u002Fintegrate\u002Fframeworks","4.integrate\u002Fframeworks",[221,225,230,235,240,245,250,255,260,265,270,275,280,285,289,294,299],{"title":128,"path":222,"stem":223,"icon":224},"\u002Fintegrate\u002Fframeworks\u002Foverview","4.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":226,"path":227,"stem":228,"icon":229},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","4.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":231,"path":232,"stem":233,"icon":234},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","4.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":236,"path":237,"stem":238,"icon":239},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","4.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":241,"path":242,"stem":243,"icon":244},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","4.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":246,"path":247,"stem":248,"icon":249},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","4.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":251,"path":252,"stem":253,"icon":254},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","4.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":256,"path":257,"stem":258,"icon":259},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","4.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":261,"path":262,"stem":263,"icon":264},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","4.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":266,"path":267,"stem":268,"icon":269},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","4.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":271,"path":272,"stem":273,"icon":274},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","4.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":276,"path":277,"stem":278,"icon":279},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","4.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":281,"path":282,"stem":283,"icon":284},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","4.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":286,"path":287,"stem":288,"icon":71},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","4.integrate\u002Fframeworks\u002F13.standalone",{"title":290,"path":291,"stem":292,"icon":293},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","4.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":295,"path":296,"stem":297,"icon":298},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","4.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":300,"path":301,"stem":302,"icon":303},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","4.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":305,"path":306,"stem":307,"children":308,"page":28},"Use Cases","\u002Fuse-cases","5.use-cases",[309,312,317,346,374,407,427,432],{"title":305,"path":310,"stem":311},"\u002Fuse-cases\u002Foverview","5.use-cases\u002F0.overview",{"title":313,"path":314,"stem":315,"icon":316},"Client Logging","\u002Fuse-cases\u002Fclient-logging","5.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":318,"icon":319,"path":320,"stem":321,"children":322,"page":28},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","5.use-cases\u002F2.ai-sdk",[323,326,331,336,341],{"title":128,"path":324,"stem":325,"icon":140},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","5.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":327,"path":328,"stem":329,"icon":330},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","5.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":332,"path":333,"stem":334,"icon":335},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","5.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":337,"path":338,"stem":339,"icon":340},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","5.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":342,"path":343,"stem":344,"icon":345},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","5.use-cases\u002F2.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":347,"icon":348,"path":349,"stem":350,"children":351,"page":28},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","5.use-cases\u002F3.better-auth",[352,355,360,365,369],{"title":128,"path":353,"stem":354,"icon":140},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","5.use-cases\u002F3.better-auth\u002F01.overview",{"title":356,"path":357,"stem":358,"icon":359},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","5.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":361,"path":362,"stem":363,"icon":364},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","5.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":366,"path":367,"stem":368,"icon":316},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","5.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":370,"path":371,"stem":372,"icon":373},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","5.use-cases\u002F3.better-auth\u002F05.performance","i-lucide-gauge",{"title":375,"icon":376,"path":377,"stem":378,"children":379,"page":28},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","5.use-cases\u002F4.audit",[380,383,388,393,398,402],{"title":128,"path":381,"stem":382,"icon":140},"\u002Fuse-cases\u002Faudit\u002Foverview","5.use-cases\u002F4.audit\u002F01.overview",{"title":384,"path":385,"stem":386,"icon":387},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","5.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":389,"path":390,"stem":391,"icon":392},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","5.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":394,"path":395,"stem":396,"icon":397},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","5.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":399,"path":400,"stem":401,"icon":376},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","5.use-cases\u002F4.audit\u002F05.compliance",{"title":403,"path":404,"stem":405,"icon":406},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","5.use-cases\u002F4.audit\u002F06.recipes","i-lucide-book-open",{"title":342,"icon":373,"path":408,"stem":409,"children":410,"page":28},"\u002Fuse-cases\u002Ftelemetry","5.use-cases\u002F4.telemetry",[411,414,419,423],{"title":128,"path":412,"stem":413,"icon":140},"\u002Fuse-cases\u002Ftelemetry\u002Foverview","5.use-cases\u002F4.telemetry\u002F01.overview",{"title":415,"path":416,"stem":417,"icon":418},"Setup","\u002Fuse-cases\u002Ftelemetry\u002Fsetup","5.use-cases\u002F4.telemetry\u002F02.setup","i-lucide-wrench",{"title":420,"path":421,"stem":422},"Telemetry Ingest","\u002Fuse-cases\u002Ftelemetry\u002Fingest","5.use-cases\u002F4.telemetry\u002F03.ingest",{"title":424,"path":425,"stem":426,"icon":406},"Reference","\u002Fuse-cases\u002Ftelemetry\u002Freference","5.use-cases\u002F4.telemetry\u002F04.reference",{"title":428,"path":429,"stem":430,"icon":431},"Enrichers","\u002Fuse-cases\u002Fenrichers","5.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":433,"path":434,"stem":435},"eve","\u002Fuse-cases\u002Feve","5.use-cases\u002F5.eve",{"title":437,"path":438,"stem":439,"children":440,"page":28},"Extend","\u002Fextend","6.extend",[441,445,450,455,459,464,468,472,476,481,486,491],{"title":128,"path":442,"stem":443,"icon":444},"\u002Fextend\u002Foverview","6.extend\u002F0.overview","i-lucide-blocks",{"title":446,"path":447,"stem":448,"icon":449},"Stream","\u002Fextend\u002Fstream","6.extend\u002F1.stream","i-lucide-radio-tower",{"title":451,"path":452,"stem":453,"icon":454},"Custom framework","\u002Fextend\u002Fcustom-framework","6.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":456,"path":457,"stem":458,"icon":449},"Diagnostics channel","\u002Fextend\u002Fdiagnostics-channel","6.extend\u002F11.diagnostics-channel",{"title":460,"path":461,"stem":462,"icon":463},"FS reader","\u002Fextend\u002Ffs-reader","6.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":403,"path":465,"stem":466,"icon":467},"\u002Fextend\u002Fconsumer-recipes","6.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":469,"path":470,"stem":471},"Plugins","\u002Fextend\u002Fplugins","6.extend\u002F4.plugins",{"title":473,"path":474,"stem":475,"icon":431},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","6.extend\u002F5.custom-enrichers",{"title":477,"path":478,"stem":479,"icon":480},"Tail sampling","\u002Fextend\u002Ftail-sampling","6.extend\u002F6.tail-sampling","i-lucide-filter",{"title":482,"path":483,"stem":484,"icon":485},"Identity headers","\u002Fextend\u002Fidentity-headers","6.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":487,"path":488,"stem":489,"icon":490},"Custom drains","\u002Fextend\u002Fcustom-drains","6.extend\u002F8.custom-drains","i-lucide-share-2",{"title":492,"path":493,"stem":494},"Drain Pipeline","\u002Fextend\u002Fdrain-pipeline","6.extend\u002F9.drain-pipeline",{"title":424,"path":496,"stem":497,"children":498,"page":28},"\u002Freference","7.reference",[499,503,508,511,516,520,525,529],{"title":128,"path":500,"stem":501,"icon":502},"\u002Freference\u002Foverview","7.reference\u002F0.overview","i-lucide-book-marked",{"title":504,"path":505,"stem":506,"icon":507},"Configuration","\u002Freference\u002Fconfiguration","7.reference\u002F1.configuration","i-lucide-settings",{"title":370,"path":509,"stem":510,"icon":373},"\u002Freference\u002Fperformance","7.reference\u002F2.performance",{"title":512,"path":513,"stem":514,"icon":515},"Vite Plugin","\u002Freference\u002Fvite-plugin","7.reference\u002F3.vite-plugin","i-custom-vite",{"title":517,"path":518,"stem":519,"icon":376},"Best Practices","\u002Freference\u002Fbest-practices","7.reference\u002F4.best-practices",{"title":521,"path":522,"stem":523,"icon":524},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","7.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":526,"path":527,"stem":528,"icon":431},"Agent Skills","\u002Freference\u002Fagent-skills","7.reference\u002F6.agent-skills",{"title":530,"path":531,"stem":532},"Log cost","\u002Freference\u002Fcost","7.reference\u002F7.cost",{"id":534,"title":114,"body":535,"description":1285,"extension":1286,"links":1287,"meta":1293,"navigation":1294,"path":412,"seo":1295,"stem":413,"__hash__":1296},"docs\u002F5.use-cases\u002F4.telemetry\u002F01.overview.md",{"type":536,"value":537,"toc":1273},"minimark",[538,559,630,641,806,811,826,898,906,909,913,916,921,1003,1007,1097,1104,1108,1153,1157,1160,1210,1213,1236,1240,1269],[539,540,541,545,546,553,554,558],"p",{},[542,543,544],"code",{},"@evlog\u002Ftelemetry"," brings ",[547,548,552],"a",{"href":549,"rel":550},"https:\u002F\u002Fevlog.dev",[551],"nofollow","evlog","'s wide-event model to tools that run on other people's machines: CLIs, GitHub Actions, dev scripts, and CI jobs. Same philosophy as HTTP logging: ",[555,556,557],"strong",{},"one command execution → one structured event",", not a stream of analytics calls.",[560,561,562,587,601,615],"code-group",{},[563,564,570],"pre",{"className":565,"code":566,"filename":567,"language":568,"meta":569,"style":569},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pnpm add @evlog\u002Ftelemetry\n","pnpm","bash","",[542,571,572],{"__ignoreMap":569},[573,574,577,580,584],"span",{"class":575,"line":576},"line",1,[573,578,567],{"class":579},"sBMFI",[573,581,583],{"class":582},"sfazB"," add",[573,585,586],{"class":582}," @evlog\u002Ftelemetry\n",[563,588,591],{"className":565,"code":589,"filename":590,"language":568,"meta":569,"style":569},"bun add @evlog\u002Ftelemetry\n","bun",[542,592,593],{"__ignoreMap":569},[573,594,595,597,599],{"class":575,"line":576},[573,596,590],{"class":579},[573,598,583],{"class":582},[573,600,586],{"class":582},[563,602,605],{"className":565,"code":603,"filename":604,"language":568,"meta":569,"style":569},"yarn add @evlog\u002Ftelemetry\n","yarn",[542,606,607],{"__ignoreMap":569},[573,608,609,611,613],{"class":575,"line":576},[573,610,604],{"class":579},[573,612,583],{"class":582},[573,614,586],{"class":582},[563,616,619],{"className":565,"code":617,"filename":618,"language":568,"meta":569,"style":569},"npm install @evlog\u002Ftelemetry\n","npm",[542,620,621],{"__ignoreMap":569},[573,622,623,625,628],{"class":575,"line":576},[573,624,618],{"class":579},[573,626,627],{"class":582}," install",[573,629,586],{"class":582},[539,631,632,633,636,637,640],{},"You get command name, sanitized flags, duration, and outcome automatically. Call ",[542,634,635],{},"telemetry.set()"," only when you have extra counters, numbers and booleans by default. Raw ",[542,638,639],{},"argv"," is never read; disclosure is generated from your runtime config so it cannot drift from what you actually collect.",[642,643,646,649,799],"prompt",{":actions":644,"description":645,"icon":373},"[\"copy\",\"cursor\",\"claude\"]","Add anonymous telemetry to my CLI or script",[539,647,648],{},"Add privacy-respecting telemetry to my CLI, script, or GitHub Action with @evlog\u002Ftelemetry.",[650,651,652,668,675,689,699,717,731,744,750,761,772],"ul",{},[653,654,655,656,659,660,663,664,667],"li",{},"Detect my entrypoint: citty CLI (",[542,657,658],{},"withTelemetry","), standalone script (",[542,661,662],{},"createTelemetry","), or GitHub Actions (",[542,665,666],{},"createGitHubActionsTelemetry",")",[653,669,670,671,674],{},"Install: ",[542,672,673],{},"pnpm add @evlog\u002Ftelemetry"," (or npm\u002Fyarn\u002Fbun)",[653,676,677,678,681,682,685,686],{},"Citty: wrap the root command in ",[542,679,680],{},"withTelemetry()"," in ",[542,683,684],{},"src\u002Findex.ts"," and add ",[542,687,688],{},"defineTelemetryCommands({ name: TOOL })",[653,690,691,692,695,696],{},"Script \u002F migrator: ",[542,693,694],{},"createTelemetry({ name, version })"," and wrap each logical unit with ",[542,697,698],{},"t.run('command', fn)",[653,700,701,702,705,706,709,710,713,714],{},"GitHub Actions: ",[542,703,704],{},"createGitHubActionsTelemetry()",". Only ",[542,707,708],{},"GITHUB_ACTION"," \u002F ",[542,711,712],{},"GITHUB_EVENT_NAME"," are injected into ",[542,715,716],{},"custom",[653,718,719,720,709,723,726,727,730],{},"Declare ",[542,721,722],{},"collect.flags",[542,724,725],{},"collect.fields"," for any string values you need beyond the ",[542,728,729],{},"\"\u003Cset>\""," marker",[653,732,733,734,736,737,739,740],{},"Put your product schema in ",[542,735,716],{}," via ",[542,738,635],{},", see ",[547,741,743],{"href":742},"\u002Fuse-cases\u002Ftelemetry\u002Freference#extending-the-schema","Extending the schema",[653,745,746,747,749],{},"Call ",[542,748,635],{}," for business counters (numbers\u002Fbooleans) inside handlers or helpers on the same async stack",[653,751,752,753,756,757,760],{},"Run ",[542,754,755],{},"generateDisclosure()"," and commit ",[542,758,759],{},"TELEMETRY.md"," beside the tool",[653,762,763,764,767,768,771],{},"Bake an ingestion URL in ",[542,765,766],{},"endpoint"," (or ",[542,769,770],{},"EVLOG_TELEMETRY_ENDPOINT","). The local outbox is a buffer, not the destination",[653,773,774,775,778,779,782,783,786,787,790,791,794,795,798],{},"Ship ",[542,776,777],{},"POST \u002Fapi\u002Ftelemetry\u002Fingest"," on my app: use ",[542,780,781],{},"parseIngestBody()"," from ",[542,784,785],{},"@evlog\u002Ftelemetry\u002Fingest"," with ",[542,788,789],{},"allowedTools"," + ",[542,792,793],{},"allowedCustomKeys",", dedupe on ",[542,796,797],{},"idempotencyKey",", return 204 on success",[539,800,801,802],{},"Docs: ",[547,803,804],{"href":804,"rel":805},"https:\u002F\u002Fwww.evlog.dev\u002Fuse-cases\u002Ftelemetry\u002Foverview",[551],[807,808,810],"h2",{"id":809},"from-cli-to-your-backend","From CLI to your backend",[539,812,813,814,817,818,821,822,825],{},"The disk outbox (",[542,815,816],{},"~\u002F.config\u002F{toolName}\u002Ftelemetry\u002Foutbox.ndjson",") is a ",[555,819,820],{},"reliability buffer",", not where telemetry lives long-term. Each run appends one event locally, then the HTTP drain POSTs the backlog to ",[555,823,824],{},"your"," ingestion endpoint. Short-lived CI jobs and offline machines drain on the next invocation.",[827,828,829,839,850,858,868,879,888],"ol",{},[653,830,831,834,835,838],{},[555,832,833],{},"Run",": ",[542,836,837],{},"my-tool doctor"," executes on the user's machine",[653,840,841,834,844,846,847],{},[555,842,843],{},"Capture",[542,845,544],{}," sanitizes flags, checks consent, and records one ",[542,848,849],{},"RunEvent",[653,851,852,855,856],{},[555,853,854],{},"Buffer",": the event appends to ",[542,857,816],{},[653,859,860,863,864,867],{},[555,861,862],{},"Send",": on flush, POST ",[542,865,866],{},"{ events: RunEvent[] }"," to your ingest URL",[653,869,870,834,873,875,876,667],{},[555,871,872],{},"Validate",[542,874,781],{}," allowlists tools and custom keys (",[547,877,878],{"href":421},"Ingest",[653,880,881,884,885,887],{},[555,882,883],{},"Store",": dedupe on ",[542,886,797],{},", then DB \u002F warehouse \u002F evlog drain",[653,889,890,893,894,897],{},[555,891,892],{},"Ack",": on ",[542,895,896],{},"2xx",", delivered keys are removed from the outbox",[563,899,904],{"className":900,"code":902,"language":903,"meta":569},[901],"language-text","CLI → @evlog\u002Ftelemetry → outbox.ndjson → POST \u002Fingest → validate → store\n","text",[542,905,902],{"__ignoreMap":569},[539,907,908],{},"Nothing is sent until you configure an endpoint and the server returns a success status. Until then, events stay in the outbox (or are purged on opt-out).",[807,910,912],{"id":911},"why-install-it","Why install it",[539,914,915],{},"You can wire anonymous usage telemetry yourself: outbox file, consent flags, flag sanitization, disclosure markdown, ingest validation, first-run notice. Or you add one dependency and get the evlog playbook baked in.",[917,918,920],"h3",{"id":919},"what-you-get-for-28-kb","What you get for ~28 KB",[922,923,924,935],"table",{},[925,926,927],"thead",{},[928,929,930,933],"tr",{},[931,932],"th",{},[931,934],{},[936,937,938,955,970,990],"tbody",{},[928,939,940,946],{},[941,942,943],"td",{},[555,944,945],{},"Published size",[941,947,948,949,951,952,954],{},"~28 KB ESM (",[542,950,544],{},"), ~8.6 KB gzip — standalone, no dependency on ",[542,953,552],{}," core",[928,956,957,962],{},[941,958,959],{},[555,960,961],{},"Server ingest only",[941,963,964,966,967,969],{},[542,965,785],{}," ~5 KB (~1.7 KB gzip) — ",[542,968,781],{}," without pulling citty wiring into your API",[928,971,972,977],{},[941,973,974],{},[555,975,976],{},"Runtime deps",[941,978,979,790,982,985,986,989],{},[542,980,981],{},"citty",[542,983,984],{},"std-env"," only — both ",[542,987,988],{},"sideEffects: false",", tree-shakeable ESM",[928,991,992,997],{},[941,993,994],{},[555,995,996],{},"Node",[941,998,999,1000,1002],{},"18+ · ESM · ",[542,1001,988],{}," on the package",[917,1004,1006],{"id":1005},"fits-wherever-your-code-runs","Fits wherever your code runs",[922,1008,1009,1022],{},[925,1010,1011],{},[928,1012,1013,1016,1019],{},[931,1014,1015],{},"Surface",[931,1017,1018],{},"Entry",[931,1020,1021],{},"Lines of integration",[936,1023,1024,1042,1060,1081],{},[928,1025,1026,1031,1036],{},[941,1027,1028],{},[555,1029,1030],{},"citty CLI",[941,1032,1033,1035],{},[542,1034,680],{}," on the root command",[941,1037,1038,1039],{},"One wrapper + optional ",[542,1040,1041],{},"defineTelemetryCommands()",[928,1043,1044,1049,1057],{},[941,1045,1046],{},[555,1047,1048],{},"Script \u002F migrator",[941,1050,1051,790,1054],{},[542,1052,1053],{},"createTelemetry()",[542,1055,1056],{},"t.run()",[941,1058,1059],{},"Wrap each logical run",[928,1061,1062,1067,1071],{},[941,1063,1064],{},[555,1065,1066],{},"GitHub Actions",[941,1068,1069],{},[542,1070,704],{},[941,1072,1073,1074,709,1077,1080],{},"Same as script; ",[542,1075,1076],{},"ghaAction",[542,1078,1079],{},"ghaEvent"," auto-injected",[928,1082,1083,1088,1094],{},[941,1084,1085],{},[555,1086,1087],{},"Your API (ingest)",[941,1089,1090,782,1092],{},[542,1091,781],{},[542,1093,785],{},[941,1095,1096],{},"One validator + one POST route",[539,1098,1099,1100,1103],{},"No framework lock-in. No PostHog \u002F Segment \u002F custom analytics SDK. No second schema to maintain, since disclosure is generated from the same ",[542,1101,1102],{},"collect"," config the CLI uses at runtime.",[917,1105,1107],{"id":1106},"what-you-skip-building","What you skip building",[650,1109,1110,1115,1124,1127,1135,1138,1144,1147],{},[653,1111,1112,1113,667],{},"Privacy-safe flag capture (never reads raw ",[542,1114,639],{},[653,1116,1117,709,1120,1123],{},[542,1118,1119],{},"DO_NOT_TRACK",[542,1121,1122],{},"EVLOG_TELEMETRY"," \u002F persisted opt-out with outbox purge",[653,1125,1126],{},"Disk outbox with lockfile, stale-lock recovery, and backlog drain",[653,1128,1129,1130,790,1132,667],{},"Auto-generated disclosure (",[542,1131,759],{},[542,1133,1134],{},"telemetry status",[653,1136,1137],{},"First-run notice with opt-out instructions",[653,1139,1140,1141,1143],{},"Typed ",[542,1142,635],{}," with allowlisted string fields",[653,1145,1146],{},"Server-side ingest validation aligned with the CLI envelope",[653,1148,1149,1150],{},"Hard guarantee: ",[555,1151,1152],{},"telemetry never throws, never blocks exit",[917,1154,1156],{"id":1155},"the-payoff","The payoff",[539,1158,1159],{},"Once ingest is live you can answer product questions that CLI authors usually guess at:",[650,1161,1162,1173,1184,1191,1198],{},[653,1163,1164,1165,1167,1168,1167,1171,667],{},"Which commands are actually used (",[542,1166,109],{}," vs ",[542,1169,1170],{},"sync",[542,1172,1134],{},[653,1174,1175,1176,1179,1180,1183],{},"Where runs fail (",[542,1177,1178],{},"outcome",", ",[542,1181,1182],{},"errorCode",", version breakdown)",[653,1185,1186,1187,1190],{},"How long operations take (",[542,1188,1189],{},"durationMs"," per command)",[653,1192,1193,1194,1197],{},"Which versions are still in the wild (",[542,1195,1196],{},"tool.version"," on every event)",[653,1199,1200,1201,1179,1204,1179,1207,667],{},"Whether CI or local dev dominates (",[542,1202,1203],{},"env.ci",[542,1205,1206],{},"env.agent",[542,1208,1209],{},"env.tty",[539,1211,1212],{},"All from one wide event per run, the same mental model as evlog on the server, without bolting a browser analytics stack onto a terminal tool.",[1214,1215,1218,1219,834,1226,1179,1229,1232,1233,1235],"callout",{"color":1216,"icon":1217},"neutral","i-lucide-package","Try it locally: ",[547,1220,1223],{"href":1221,"rel":1222},"https:\u002F\u002Fgithub.com\u002FHugoRCD\u002Fevlog\u002Ftree\u002Fmain\u002Fexamples\u002Ftelemetry-playground",[551],[542,1224,1225],{},"examples\u002Ftelemetry-playground",[542,1227,1228],{},"pnpm run cli -- doctor",[542,1230,1231],{},"EVLOG_TELEMETRY_DEBUG=1"," to inspect payloads, ",[542,1234,1134],{}," for disclosure.",[807,1237,1239],{"id":1238},"see-also","See also",[650,1241,1242,1247,1252,1257,1263],{},[653,1243,1244,1246],{},[547,1245,415],{"href":416},": citty, scripts, GitHub Actions, delivery config",[653,1248,1249,1251],{},[547,1250,878],{"href":421},": server endpoint, validation, storage",[653,1253,1254,1256],{},[547,1255,424],{"href":425},": envelope, schema extensions, disclosure, consent",[653,1258,1259,1262],{},[547,1260,1261],{"href":381},"Audit",": wide events for security-sensitive actions",[653,1264,1265,1268],{},[547,1266,1267],{"href":493},"Drain pipeline",": forward ingested events into Axiom, Datadog, OTLP, or a custom store",[1270,1271,1272],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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);}",{"title":569,"searchDepth":1274,"depth":1274,"links":1275},2,[1276,1277,1284],{"id":809,"depth":1274,"text":810},{"id":911,"depth":1274,"text":912,"children":1278},[1279,1281,1282,1283],{"id":919,"depth":1280,"text":920},3,{"id":1005,"depth":1280,"text":1006},{"id":1106,"depth":1280,"text":1107},{"id":1155,"depth":1280,"text":1156},{"id":1238,"depth":1274,"text":1239},"One event per run for CLIs and automation, with privacy-safe flags, consent, an outbox, and disclosure generated from the same config.","md",[1288,1290,1292],{"label":415,"icon":418,"to":416,"color":1216,"variant":1289},"subtle",{"label":878,"icon":1291,"to":421,"color":1216,"variant":1289},"i-lucide-server",{"label":424,"icon":406,"to":425,"color":1216,"variant":1289},{},{"title":128,"icon":140},{"title":114,"description":1285},"AxDuOU1FdLRQg54Mv-z255mpOH-cqTcIzq2DPCj0tsQ",[1298,1300],{"title":403,"path":404,"stem":405,"description":1299,"icon":406,"children":-1},"File system, Axiom, and Postgres recipes for audit logs, plus mockAudit for tests and the full API reference.",{"title":415,"path":416,"stem":417,"description":1301,"icon":418,"children":-1},"Wire @evlog\u002Ftelemetry into citty CLIs, standalone scripts, and GitHub Actions — delivery config, automatic flag capture, telemetry.set(), and debug mode.",1786806598560]