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