[{"data":1,"prerenderedAt":2836},["ShallowReactive",2],{"navigation_docs":3,"-use-cases-telemetry-reference":464,"-use-cases-telemetry-reference-surround":2831},[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":2819,"extension":2820,"links":2821,"meta":2827,"navigation":2828,"path":367,"seo":2829,"stem":368,"__hash__":2830},"docs\u002F4.use-cases\u002F4.telemetry\u002F04.reference.md","Telemetry Reference",{"type":468,"value":469,"toc":2803},"minimark",[470,475,479,599,603,623,626,685,688,721,726,737,1046,1049,1210,1219,1239,1243,1246,1519,1527,1531,1538,1830,1839,1845,1854,1933,1943,1947,1953,2092,2096,2192,2207,2211,2214,2223,2395,2404,2417,2423,2427,2438,2474,2567,2578,2582,2594,2733,2743,2747,2767,2777,2786,2799],[471,472,474],"h2",{"id":473},"standard-envelope","Standard envelope",[476,477,478],"p",{},"Every run shares the same shape. You do not declare per-command schemas.",[480,481,486],"pre",{"className":482,"code":483,"language":484,"meta":485,"style":485},"language-jsonc shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"event\": \"run\",\n  \"command\": \"sync\",\n  \"durationMs\": 412,\n  \"outcome\": \"success\",\n  \"flags\": { \"dryRun\": true, \"output\": true },\n  \"tool\": { \"name\": \"my-tool\", \"version\": \"1.0.0\" },\n  \"env\": {\n    \"node\": \"20.11\",\n    \"ci\": false,\n    \"provider\": null,\n    \"tty\": true,\n    \"agent\": \"cursor\"   \u002F\u002F std-env: cursor, claude, codex, … or null\n  },\n  \"machineId\": \"ab3f…\", \u002F\u002F hashed; omitted in ephemeral CI\n  \"custom\": { \"itemsSynced\": 42 }\n}\n","jsonc","",[487,488,489,497,503,509,515,521,527,533,539,545,551,557,563,572,578,587,593],"code",{"__ignoreMap":485},[490,491,494],"span",{"class":492,"line":493},"line",1,[490,495,496],{},"{\n",[490,498,500],{"class":492,"line":499},2,[490,501,502],{},"  \"event\": \"run\",\n",[490,504,506],{"class":492,"line":505},3,[490,507,508],{},"  \"command\": \"sync\",\n",[490,510,512],{"class":492,"line":511},4,[490,513,514],{},"  \"durationMs\": 412,\n",[490,516,518],{"class":492,"line":517},5,[490,519,520],{},"  \"outcome\": \"success\",\n",[490,522,524],{"class":492,"line":523},6,[490,525,526],{},"  \"flags\": { \"dryRun\": true, \"output\": true },\n",[490,528,530],{"class":492,"line":529},7,[490,531,532],{},"  \"tool\": { \"name\": \"my-tool\", \"version\": \"1.0.0\" },\n",[490,534,536],{"class":492,"line":535},8,[490,537,538],{},"  \"env\": {\n",[490,540,542],{"class":492,"line":541},9,[490,543,544],{},"    \"node\": \"20.11\",\n",[490,546,548],{"class":492,"line":547},10,[490,549,550],{},"    \"ci\": false,\n",[490,552,554],{"class":492,"line":553},11,[490,555,556],{},"    \"provider\": null,\n",[490,558,560],{"class":492,"line":559},12,[490,561,562],{},"    \"tty\": true,\n",[490,564,566,569],{"class":492,"line":565},13,[490,567,568],{},"    \"agent\": \"cursor\"",[490,570,571],{},"   \u002F\u002F std-env: cursor, claude, codex, … or null\n",[490,573,575],{"class":492,"line":574},14,[490,576,577],{},"  },\n",[490,579,581,584],{"class":492,"line":580},15,[490,582,583],{},"  \"machineId\": \"ab3f…\",",[490,585,586],{}," \u002F\u002F hashed; omitted in ephemeral CI\n",[490,588,590],{"class":492,"line":589},16,[490,591,592],{},"  \"custom\": { \"itemsSynced\": 42 }\n",[490,594,596],{"class":492,"line":595},17,[490,597,598],{},"}\n",[471,600,602],{"id":601},"extending-the-schema","Extending the schema",[476,604,605,606,610,611,614,615,618,619,622],{},"The envelope above is ",[607,608,609],"strong",{},"fixed"," — every tool sends the same top-level shape so ",[487,612,613],{},"parseIngestBody()"," and disclosure stay predictable. You do not add fields next to ",[487,616,617],{},"command"," or ",[487,620,621],{},"durationMs",".",[476,624,625],{},"Your product schema lives in two extension zones:",[627,628,629,645],"table",{},[630,631,632],"thead",{},[633,634,635,639,642],"tr",{},[636,637,638],"th",{},"Zone",[636,640,641],{},"Who sets it",[636,643,644],{},"What goes there",[646,647,648,665],"tbody",{},[633,649,650,656,662],{},[651,652,653],"td",{},[487,654,655],{},"flags",[651,657,658,659],{},"citty (auto) + ",[487,660,661],{},"collect.flags",[651,663,664],{},"CLI switches — booleans\u002Fnumbers as values, strings only when allowlisted",[633,666,667,672,682],{},[651,668,669],{},[487,670,671],{},"custom",[651,673,674,675,678,679],{},"you via ",[487,676,677],{},"telemetry.set()"," + ",[487,680,681],{},"collect.fields",[651,683,684],{},"Business counters, categorical dimensions, schema version",[476,686,687],{},"Think of it as two contracts:",[689,690,691,706],"ul",{},[692,693,694,697,698,701,702,705],"li",{},[607,695,696],{},"Transport contract"," (",[487,699,700],{},"RunEvent",") — owned by ",[487,703,704],{},"@evlog\u002Ftelemetry",", stable across tools",[692,707,708,697,711,713,714,716,717,720],{},[607,709,710],{},"Product contract",[487,712,671],{}," + declared ",[487,715,655],{},") — owned by you, declared in ",[487,718,719],{},"collect",", mirrored on the server",[722,723,725],"h3",{"id":724},"declare-your-extensions-once","Declare your extensions once",[476,727,728,729,732,733,736],{},"Everything you collect beyond the standard envelope is declared inline in the same ",[487,730,731],{},"withTelemetry()"," \u002F ",[487,734,735],{},"createTelemetry()"," call:",[480,738,743],{"className":739,"code":740,"filename":741,"language":742,"meta":485,"style":485},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","withTelemetry(command, {\n  name: 'acme-cli',\n  version: '2.1.0',\n  endpoint: 'https:\u002F\u002Ftelemetry.acme.dev\u002Fapi\u002Fingest',\n  collect: {\n    flags: {\n      format: ['json', 'yaml', 'table'],\n      target: ['staging', 'production'],\n    },\n    fields: {\n      product: ['cli', 'action', 'migrator'],\n      plan: ['free', 'pro', 'enterprise'],\n      framework: ['nuxt', 'next', 'remix'],\n    },\n  },\n})\n","src\u002Findex.ts","ts",[487,744,745,762,784,800,816,825,834,873,902,907,916,954,992,1030,1034,1038],{"__ignoreMap":485},[490,746,747,751,755,759],{"class":492,"line":493},[490,748,750],{"class":749},"s2Zo4","withTelemetry",[490,752,754],{"class":753},"sTEyZ","(command",[490,756,758],{"class":757},"sMK4o",",",[490,760,761],{"class":757}," {\n",[490,763,764,768,771,774,778,781],{"class":492,"line":499},[490,765,767],{"class":766},"swJcz","  name",[490,769,770],{"class":757},":",[490,772,773],{"class":757}," '",[490,775,777],{"class":776},"sfazB","acme-cli",[490,779,780],{"class":757},"'",[490,782,783],{"class":757},",\n",[490,785,786,789,791,793,796,798],{"class":492,"line":505},[490,787,788],{"class":766},"  version",[490,790,770],{"class":757},[490,792,773],{"class":757},[490,794,795],{"class":776},"2.1.0",[490,797,780],{"class":757},[490,799,783],{"class":757},[490,801,802,805,807,809,812,814],{"class":492,"line":511},[490,803,804],{"class":766},"  endpoint",[490,806,770],{"class":757},[490,808,773],{"class":757},[490,810,811],{"class":776},"https:\u002F\u002Ftelemetry.acme.dev\u002Fapi\u002Fingest",[490,813,780],{"class":757},[490,815,783],{"class":757},[490,817,818,821,823],{"class":492,"line":517},[490,819,820],{"class":766},"  collect",[490,822,770],{"class":757},[490,824,761],{"class":757},[490,826,827,830,832],{"class":492,"line":523},[490,828,829],{"class":766},"    flags",[490,831,770],{"class":757},[490,833,761],{"class":757},[490,835,836,839,841,844,846,849,851,853,855,858,860,862,864,866,868,871],{"class":492,"line":529},[490,837,838],{"class":766},"      format",[490,840,770],{"class":757},[490,842,843],{"class":753}," [",[490,845,780],{"class":757},[490,847,848],{"class":776},"json",[490,850,780],{"class":757},[490,852,758],{"class":757},[490,854,773],{"class":757},[490,856,857],{"class":776},"yaml",[490,859,780],{"class":757},[490,861,758],{"class":757},[490,863,773],{"class":757},[490,865,627],{"class":776},[490,867,780],{"class":757},[490,869,870],{"class":753},"]",[490,872,783],{"class":757},[490,874,875,878,880,882,884,887,889,891,893,896,898,900],{"class":492,"line":535},[490,876,877],{"class":766},"      target",[490,879,770],{"class":757},[490,881,843],{"class":753},[490,883,780],{"class":757},[490,885,886],{"class":776},"staging",[490,888,780],{"class":757},[490,890,758],{"class":757},[490,892,773],{"class":757},[490,894,895],{"class":776},"production",[490,897,780],{"class":757},[490,899,870],{"class":753},[490,901,783],{"class":757},[490,903,904],{"class":492,"line":541},[490,905,906],{"class":757},"    },\n",[490,908,909,912,914],{"class":492,"line":547},[490,910,911],{"class":766},"    fields",[490,913,770],{"class":757},[490,915,761],{"class":757},[490,917,918,921,923,925,927,930,932,934,936,939,941,943,945,948,950,952],{"class":492,"line":553},[490,919,920],{"class":766},"      product",[490,922,770],{"class":757},[490,924,843],{"class":753},[490,926,780],{"class":757},[490,928,929],{"class":776},"cli",[490,931,780],{"class":757},[490,933,758],{"class":757},[490,935,773],{"class":757},[490,937,938],{"class":776},"action",[490,940,780],{"class":757},[490,942,758],{"class":757},[490,944,773],{"class":757},[490,946,947],{"class":776},"migrator",[490,949,780],{"class":757},[490,951,870],{"class":753},[490,953,783],{"class":757},[490,955,956,959,961,963,965,968,970,972,974,977,979,981,983,986,988,990],{"class":492,"line":559},[490,957,958],{"class":766},"      plan",[490,960,770],{"class":757},[490,962,843],{"class":753},[490,964,780],{"class":757},[490,966,967],{"class":776},"free",[490,969,780],{"class":757},[490,971,758],{"class":757},[490,973,773],{"class":757},[490,975,976],{"class":776},"pro",[490,978,780],{"class":757},[490,980,758],{"class":757},[490,982,773],{"class":757},[490,984,985],{"class":776},"enterprise",[490,987,780],{"class":757},[490,989,870],{"class":753},[490,991,783],{"class":757},[490,993,994,997,999,1001,1003,1006,1008,1010,1012,1015,1017,1019,1021,1024,1026,1028],{"class":492,"line":565},[490,995,996],{"class":766},"      framework",[490,998,770],{"class":757},[490,1000,843],{"class":753},[490,1002,780],{"class":757},[490,1004,1005],{"class":776},"nuxt",[490,1007,780],{"class":757},[490,1009,758],{"class":757},[490,1011,773],{"class":757},[490,1013,1014],{"class":776},"next",[490,1016,780],{"class":757},[490,1018,758],{"class":757},[490,1020,773],{"class":757},[490,1022,1023],{"class":776},"remix",[490,1025,780],{"class":757},[490,1027,870],{"class":753},[490,1029,783],{"class":757},[490,1031,1032],{"class":492,"line":574},[490,1033,906],{"class":757},[490,1035,1036],{"class":492,"line":580},[490,1037,577],{"class":757},[490,1039,1040,1043],{"class":492,"line":589},[490,1041,1042],{"class":757},"}",[490,1044,1045],{"class":753},")\n",[476,1047,1048],{},"Inside handlers, add counters and dimensions:",[480,1050,1053],{"className":739,"code":1051,"filename":1052,"language":742,"meta":485,"style":485},"await t.run('deploy', async () => {\n  const result = await deployServices()\n  telemetry.set({\n    servicesDeployed: result.count,   \u002F\u002F number — always allowed\n    rollbackUsed: false,              \u002F\u002F boolean — always allowed\n    framework: 'nuxt',                \u002F\u002F string — allowed (in collect.fields)\n    schemaVersion: 2,                 \u002F\u002F number — version your custom shape\n  })\n})\n","src\u002Fcommands\u002Fdeploy.ts",[487,1054,1055,1093,1113,1127,1147,1163,1181,1197,1204],{"__ignoreMap":485},[490,1056,1057,1061,1064,1066,1069,1072,1074,1077,1079,1081,1085,1088,1091],{"class":492,"line":493},[490,1058,1060],{"class":1059},"s7zQu","await",[490,1062,1063],{"class":753}," t",[490,1065,622],{"class":757},[490,1067,1068],{"class":749},"run",[490,1070,1071],{"class":753},"(",[490,1073,780],{"class":757},[490,1075,1076],{"class":776},"deploy",[490,1078,780],{"class":757},[490,1080,758],{"class":757},[490,1082,1084],{"class":1083},"spNyl"," async",[490,1086,1087],{"class":757}," ()",[490,1089,1090],{"class":1083}," =>",[490,1092,761],{"class":757},[490,1094,1095,1098,1101,1104,1107,1110],{"class":492,"line":499},[490,1096,1097],{"class":1083},"  const",[490,1099,1100],{"class":753}," result",[490,1102,1103],{"class":757}," =",[490,1105,1106],{"class":1059}," await",[490,1108,1109],{"class":749}," deployServices",[490,1111,1112],{"class":766},"()\n",[490,1114,1115,1118,1120,1123,1125],{"class":492,"line":505},[490,1116,1117],{"class":753},"  telemetry",[490,1119,622],{"class":757},[490,1121,1122],{"class":749},"set",[490,1124,1071],{"class":766},[490,1126,496],{"class":757},[490,1128,1129,1132,1134,1136,1138,1141,1143],{"class":492,"line":511},[490,1130,1131],{"class":766},"    servicesDeployed",[490,1133,770],{"class":757},[490,1135,1100],{"class":753},[490,1137,622],{"class":757},[490,1139,1140],{"class":753},"count",[490,1142,758],{"class":757},[490,1144,1146],{"class":1145},"sHwdD","   \u002F\u002F number — always allowed\n",[490,1148,1149,1152,1154,1158,1160],{"class":492,"line":517},[490,1150,1151],{"class":766},"    rollbackUsed",[490,1153,770],{"class":757},[490,1155,1157],{"class":1156},"sfNiH"," false",[490,1159,758],{"class":757},[490,1161,1162],{"class":1145},"              \u002F\u002F boolean — always allowed\n",[490,1164,1165,1168,1170,1172,1174,1176,1178],{"class":492,"line":523},[490,1166,1167],{"class":766},"    framework",[490,1169,770],{"class":757},[490,1171,773],{"class":757},[490,1173,1005],{"class":776},[490,1175,780],{"class":757},[490,1177,758],{"class":757},[490,1179,1180],{"class":1145},"                \u002F\u002F string — allowed (in collect.fields)\n",[490,1182,1183,1186,1188,1192,1194],{"class":492,"line":529},[490,1184,1185],{"class":766},"    schemaVersion",[490,1187,770],{"class":757},[490,1189,1191],{"class":1190},"sbssI"," 2",[490,1193,758],{"class":757},[490,1195,1196],{"class":1145},"                 \u002F\u002F number — version your custom shape\n",[490,1198,1199,1202],{"class":492,"line":535},[490,1200,1201],{"class":757},"  }",[490,1203,1045],{"class":766},[490,1205,1206,1208],{"class":492,"line":541},[490,1207,1042],{"class":757},[490,1209,1045],{"class":753},[476,1211,1212,1213,1216,1217,622],{},"Undeclared strings are ",[607,1214,1215],{},"dropped at runtime",", never thrown. That is the privacy guarantee — no accidental paths, tokens, or free-form PII in ",[487,1218,671],{},[1220,1221,1222,1225,1226,1229,1230,1232,1233,1235,1236,1238],"note",{},[607,1223,1224],{},"Typing:"," ",[487,1227,1228],{},"TelemetryHandle.set()"," autocomplete covers declared ",[487,1231,681],{}," keys. Use the ambient ",[487,1234,677],{}," for extra numeric\u002Fboolean counters in the same run — both merge into ",[487,1237,671],{}," before the event is recorded.",[722,1240,1242],{"id":1241},"mirror-on-the-server","Mirror on the server",[476,1244,1245],{},"Your ingest handler is the second gate. Pass the same tool name and custom keys you declared on the CLI:",[480,1247,1250],{"className":739,"code":1248,"filename":1249,"language":742,"meta":485,"style":485},"import { parseIngestBody } from '@evlog\u002Ftelemetry\u002Fingest'\n\nconst ALLOWED_CUSTOM = [\n  'servicesDeployed', 'rollbackUsed', 'framework',\n  'product', 'plan', 'schemaVersion',\n  'ghaAction', 'ghaEvent',\n] as const\n\nexport async function POST(req: Request) {\n  const raw = await req.text()\n  const events = parseIngestBody(raw, {\n    allowedTools: ['acme-cli'],\n    allowedCustomKeys: { 'acme-cli': ALLOWED_CUSTOM },\n  })\n  \u002F\u002F dedupe on idempotencyKey, then persist\n}\n","app\u002Fapi\u002Ftelemetry\u002Fingest\u002Froute.ts",[487,1251,1252,1277,1283,1297,1327,1356,1376,1387,1391,1421,1442,1462,1481,1504,1510,1515],{"__ignoreMap":485},[490,1253,1254,1257,1260,1263,1266,1269,1271,1274],{"class":492,"line":493},[490,1255,1256],{"class":1059},"import",[490,1258,1259],{"class":757}," {",[490,1261,1262],{"class":753}," parseIngestBody",[490,1264,1265],{"class":757}," }",[490,1267,1268],{"class":1059}," from",[490,1270,773],{"class":757},[490,1272,1273],{"class":776},"@evlog\u002Ftelemetry\u002Fingest",[490,1275,1276],{"class":757},"'\n",[490,1278,1279],{"class":492,"line":499},[490,1280,1282],{"emptyLinePlaceholder":1281},true,"\n",[490,1284,1285,1288,1291,1294],{"class":492,"line":505},[490,1286,1287],{"class":1083},"const",[490,1289,1290],{"class":753}," ALLOWED_CUSTOM ",[490,1292,1293],{"class":757},"=",[490,1295,1296],{"class":753}," [\n",[490,1298,1299,1302,1305,1307,1309,1311,1314,1316,1318,1320,1323,1325],{"class":492,"line":511},[490,1300,1301],{"class":757},"  '",[490,1303,1304],{"class":776},"servicesDeployed",[490,1306,780],{"class":757},[490,1308,758],{"class":757},[490,1310,773],{"class":757},[490,1312,1313],{"class":776},"rollbackUsed",[490,1315,780],{"class":757},[490,1317,758],{"class":757},[490,1319,773],{"class":757},[490,1321,1322],{"class":776},"framework",[490,1324,780],{"class":757},[490,1326,783],{"class":757},[490,1328,1329,1331,1334,1336,1338,1340,1343,1345,1347,1349,1352,1354],{"class":492,"line":517},[490,1330,1301],{"class":757},[490,1332,1333],{"class":776},"product",[490,1335,780],{"class":757},[490,1337,758],{"class":757},[490,1339,773],{"class":757},[490,1341,1342],{"class":776},"plan",[490,1344,780],{"class":757},[490,1346,758],{"class":757},[490,1348,773],{"class":757},[490,1350,1351],{"class":776},"schemaVersion",[490,1353,780],{"class":757},[490,1355,783],{"class":757},[490,1357,1358,1360,1363,1365,1367,1369,1372,1374],{"class":492,"line":523},[490,1359,1301],{"class":757},[490,1361,1362],{"class":776},"ghaAction",[490,1364,780],{"class":757},[490,1366,758],{"class":757},[490,1368,773],{"class":757},[490,1370,1371],{"class":776},"ghaEvent",[490,1373,780],{"class":757},[490,1375,783],{"class":757},[490,1377,1378,1381,1384],{"class":492,"line":529},[490,1379,1380],{"class":753},"] ",[490,1382,1383],{"class":1059},"as",[490,1385,1386],{"class":1083}," const\n",[490,1388,1389],{"class":492,"line":535},[490,1390,1282],{"emptyLinePlaceholder":1281},[490,1392,1393,1396,1398,1401,1404,1406,1410,1412,1416,1419],{"class":492,"line":541},[490,1394,1395],{"class":1059},"export",[490,1397,1084],{"class":1083},[490,1399,1400],{"class":1083}," function",[490,1402,1403],{"class":749}," POST",[490,1405,1071],{"class":757},[490,1407,1409],{"class":1408},"sHdIc","req",[490,1411,770],{"class":757},[490,1413,1415],{"class":1414},"sBMFI"," Request",[490,1417,1418],{"class":757},")",[490,1420,761],{"class":757},[490,1422,1423,1425,1428,1430,1432,1435,1437,1440],{"class":492,"line":547},[490,1424,1097],{"class":1083},[490,1426,1427],{"class":753}," raw",[490,1429,1103],{"class":757},[490,1431,1106],{"class":1059},[490,1433,1434],{"class":753}," req",[490,1436,622],{"class":757},[490,1438,1439],{"class":749},"text",[490,1441,1112],{"class":766},[490,1443,1444,1446,1449,1451,1453,1455,1458,1460],{"class":492,"line":553},[490,1445,1097],{"class":1083},[490,1447,1448],{"class":753}," events",[490,1450,1103],{"class":757},[490,1452,1262],{"class":749},[490,1454,1071],{"class":766},[490,1456,1457],{"class":753},"raw",[490,1459,758],{"class":757},[490,1461,761],{"class":757},[490,1463,1464,1467,1469,1471,1473,1475,1477,1479],{"class":492,"line":559},[490,1465,1466],{"class":766},"    allowedTools",[490,1468,770],{"class":757},[490,1470,843],{"class":766},[490,1472,780],{"class":757},[490,1474,777],{"class":776},[490,1476,780],{"class":757},[490,1478,870],{"class":766},[490,1480,783],{"class":757},[490,1482,1483,1486,1488,1490,1492,1494,1496,1498,1501],{"class":492,"line":565},[490,1484,1485],{"class":766},"    allowedCustomKeys",[490,1487,770],{"class":757},[490,1489,1259],{"class":757},[490,1491,773],{"class":757},[490,1493,777],{"class":766},[490,1495,780],{"class":757},[490,1497,770],{"class":757},[490,1499,1500],{"class":753}," ALLOWED_CUSTOM",[490,1502,1503],{"class":757}," },\n",[490,1505,1506,1508],{"class":492,"line":574},[490,1507,1201],{"class":757},[490,1509,1045],{"class":766},[490,1511,1512],{"class":492,"line":580},[490,1513,1514],{"class":1145},"  \u002F\u002F dedupe on idempotencyKey, then persist\n",[490,1516,1517],{"class":492,"line":589},[490,1518,598],{"class":757},[476,1520,1521,1523,1524,1526],{},[487,1522,613],{}," strips any ",[487,1525,671],{}," key you did not list — even if a client somehow sent it.",[722,1528,1530],{"id":1529},"map-to-your-warehouse-schema","Map to your warehouse schema",[476,1532,1533,1534,1537],{},"After validation, shape the event for ",[607,1535,1536],{},"your"," database. The evlog envelope is the wire format; your tables are your choice:",[480,1539,1542],{"className":739,"code":1540,"filename":1541,"language":742,"meta":485,"style":485},"function toRow(event: RunEvent) {\n  return {\n    command: event.command,\n    duration_ms: event.durationMs,\n    outcome: event.outcome,\n    tool_version: event.tool.version,\n    format: event.flags.format,\n    target: event.flags.target,\n    services_deployed: event.custom.servicesDeployed,\n    framework: event.custom.framework,\n    plan: event.custom.plan,\n    schema_version: event.custom.schemaVersion ?? 1,\n    is_ci: event.env.ci,\n    node: event.env.node,\n    received_at: new Date(),\n  }\n}\n","lib\u002Ftelemetry-store.ts",[487,1543,1544,1566,1573,1589,1604,1620,1641,1661,1681,1700,1718,1737,1762,1783,1803,1821,1826],{"__ignoreMap":485},[490,1545,1546,1549,1552,1554,1557,1559,1562,1564],{"class":492,"line":493},[490,1547,1548],{"class":1083},"function",[490,1550,1551],{"class":749}," toRow",[490,1553,1071],{"class":757},[490,1555,1556],{"class":1408},"event",[490,1558,770],{"class":757},[490,1560,1561],{"class":1414}," RunEvent",[490,1563,1418],{"class":757},[490,1565,761],{"class":757},[490,1567,1568,1571],{"class":492,"line":499},[490,1569,1570],{"class":1059},"  return",[490,1572,761],{"class":757},[490,1574,1575,1578,1580,1583,1585,1587],{"class":492,"line":505},[490,1576,1577],{"class":766},"    command",[490,1579,770],{"class":757},[490,1581,1582],{"class":753}," event",[490,1584,622],{"class":757},[490,1586,617],{"class":753},[490,1588,783],{"class":757},[490,1590,1591,1594,1596,1598,1600,1602],{"class":492,"line":511},[490,1592,1593],{"class":766},"    duration_ms",[490,1595,770],{"class":757},[490,1597,1582],{"class":753},[490,1599,622],{"class":757},[490,1601,621],{"class":753},[490,1603,783],{"class":757},[490,1605,1606,1609,1611,1613,1615,1618],{"class":492,"line":517},[490,1607,1608],{"class":766},"    outcome",[490,1610,770],{"class":757},[490,1612,1582],{"class":753},[490,1614,622],{"class":757},[490,1616,1617],{"class":753},"outcome",[490,1619,783],{"class":757},[490,1621,1622,1625,1627,1629,1631,1634,1636,1639],{"class":492,"line":523},[490,1623,1624],{"class":766},"    tool_version",[490,1626,770],{"class":757},[490,1628,1582],{"class":753},[490,1630,622],{"class":757},[490,1632,1633],{"class":753},"tool",[490,1635,622],{"class":757},[490,1637,1638],{"class":753},"version",[490,1640,783],{"class":757},[490,1642,1643,1646,1648,1650,1652,1654,1656,1659],{"class":492,"line":529},[490,1644,1645],{"class":766},"    format",[490,1647,770],{"class":757},[490,1649,1582],{"class":753},[490,1651,622],{"class":757},[490,1653,655],{"class":753},[490,1655,622],{"class":757},[490,1657,1658],{"class":753},"format",[490,1660,783],{"class":757},[490,1662,1663,1666,1668,1670,1672,1674,1676,1679],{"class":492,"line":535},[490,1664,1665],{"class":766},"    target",[490,1667,770],{"class":757},[490,1669,1582],{"class":753},[490,1671,622],{"class":757},[490,1673,655],{"class":753},[490,1675,622],{"class":757},[490,1677,1678],{"class":753},"target",[490,1680,783],{"class":757},[490,1682,1683,1686,1688,1690,1692,1694,1696,1698],{"class":492,"line":541},[490,1684,1685],{"class":766},"    services_deployed",[490,1687,770],{"class":757},[490,1689,1582],{"class":753},[490,1691,622],{"class":757},[490,1693,671],{"class":753},[490,1695,622],{"class":757},[490,1697,1304],{"class":753},[490,1699,783],{"class":757},[490,1701,1702,1704,1706,1708,1710,1712,1714,1716],{"class":492,"line":547},[490,1703,1167],{"class":766},[490,1705,770],{"class":757},[490,1707,1582],{"class":753},[490,1709,622],{"class":757},[490,1711,671],{"class":753},[490,1713,622],{"class":757},[490,1715,1322],{"class":753},[490,1717,783],{"class":757},[490,1719,1720,1723,1725,1727,1729,1731,1733,1735],{"class":492,"line":553},[490,1721,1722],{"class":766},"    plan",[490,1724,770],{"class":757},[490,1726,1582],{"class":753},[490,1728,622],{"class":757},[490,1730,671],{"class":753},[490,1732,622],{"class":757},[490,1734,1342],{"class":753},[490,1736,783],{"class":757},[490,1738,1739,1742,1744,1746,1748,1750,1752,1754,1757,1760],{"class":492,"line":559},[490,1740,1741],{"class":766},"    schema_version",[490,1743,770],{"class":757},[490,1745,1582],{"class":753},[490,1747,622],{"class":757},[490,1749,671],{"class":753},[490,1751,622],{"class":757},[490,1753,1351],{"class":753},[490,1755,1756],{"class":757}," ??",[490,1758,1759],{"class":1190}," 1",[490,1761,783],{"class":757},[490,1763,1764,1767,1769,1771,1773,1776,1778,1781],{"class":492,"line":565},[490,1765,1766],{"class":766},"    is_ci",[490,1768,770],{"class":757},[490,1770,1582],{"class":753},[490,1772,622],{"class":757},[490,1774,1775],{"class":753},"env",[490,1777,622],{"class":757},[490,1779,1780],{"class":753},"ci",[490,1782,783],{"class":757},[490,1784,1785,1788,1790,1792,1794,1796,1798,1801],{"class":492,"line":574},[490,1786,1787],{"class":766},"    node",[490,1789,770],{"class":757},[490,1791,1582],{"class":753},[490,1793,622],{"class":757},[490,1795,1775],{"class":753},[490,1797,622],{"class":757},[490,1799,1800],{"class":753},"node",[490,1802,783],{"class":757},[490,1804,1805,1808,1810,1813,1816,1819],{"class":492,"line":580},[490,1806,1807],{"class":766},"    received_at",[490,1809,770],{"class":757},[490,1811,1812],{"class":757}," new",[490,1814,1815],{"class":749}," Date",[490,1817,1818],{"class":766},"()",[490,1820,783],{"class":757},[490,1822,1823],{"class":492,"line":589},[490,1824,1825],{"class":757},"  }\n",[490,1827,1828],{"class":492,"line":595},[490,1829,598],{"class":757},[476,1831,1832,1833,1835,1836,1838],{},"This is where a company \"modifies the schema\" in practice — not by changing ",[487,1834,700],{},", but by defining how ",[487,1837,671],{}," maps into internal analytics tables.",[722,1840,1842,1843],{"id":1841},"version-breaking-changes-in-custom","Version breaking changes in ",[487,1844,671],{},[476,1846,1847,1848,1850,1851,1853],{},"When your product counters evolve, bump a numeric ",[487,1849,1351],{}," in ",[487,1852,671],{}," (no allowlist needed) and branch in the ingest mapper:",[480,1855,1857],{"className":739,"code":1856,"language":742,"meta":485,"style":485},"const version = (event.custom.schemaVersion as number | undefined) ?? 1\nif (version === 1) return mapV1(event)\nreturn mapV2(event)\n",[487,1858,1859,1900,1924],{"__ignoreMap":485},[490,1860,1861,1863,1866,1868,1871,1873,1875,1877,1880,1882,1885,1888,1891,1894,1897],{"class":492,"line":493},[490,1862,1287],{"class":1083},[490,1864,1865],{"class":753}," version ",[490,1867,1293],{"class":757},[490,1869,1870],{"class":753}," (event",[490,1872,622],{"class":757},[490,1874,671],{"class":753},[490,1876,622],{"class":757},[490,1878,1879],{"class":753},"schemaVersion ",[490,1881,1383],{"class":1059},[490,1883,1884],{"class":1414}," number",[490,1886,1887],{"class":757}," |",[490,1889,1890],{"class":1414}," undefined",[490,1892,1893],{"class":753},") ",[490,1895,1896],{"class":757},"??",[490,1898,1899],{"class":1190}," 1\n",[490,1901,1902,1905,1908,1911,1913,1915,1918,1921],{"class":492,"line":499},[490,1903,1904],{"class":1059},"if",[490,1906,1907],{"class":753}," (version ",[490,1909,1910],{"class":757},"===",[490,1912,1759],{"class":1190},[490,1914,1893],{"class":753},[490,1916,1917],{"class":1059},"return",[490,1919,1920],{"class":749}," mapV1",[490,1922,1923],{"class":753},"(event)\n",[490,1925,1926,1928,1931],{"class":492,"line":505},[490,1927,1917],{"class":1059},[490,1929,1930],{"class":749}," mapV2",[490,1932,1923],{"class":753},[476,1934,1935,1936,1939,1940,1942],{},"Commit an updated ",[487,1937,1938],{},"TELEMETRY.md"," whenever ",[487,1941,719],{}," changes so disclosure stays aligned with releases.",[722,1944,1946],{"id":1945},"multiple-tools-one-endpoint","Multiple tools, one endpoint",[476,1948,1949,1950,770],{},"If several CLIs POST to the same ingest URL, namespace custom keys or rely on ",[487,1951,1952],{},"tool.name",[480,1954,1956],{"className":739,"code":1955,"language":742,"meta":485,"style":485},"\u002F\u002F Option A — prefix keys per product line\ntelemetry.set({ acme_product: 'cli', deployCount: 3 })\n\n\u002F\u002F Option B — separate allowedCustomKeys per tool.name in parseIngestBody\nallowedCustomKeys: {\n  'acme-cli': ['deployCount', 'framework'],\n  'acme-action': ['jobDuration', 'ghaAction', 'ghaEvent'],\n}\n",[487,1957,1958,1963,2002,2006,2011,2020,2050,2088],{"__ignoreMap":485},[490,1959,1960],{"class":492,"line":493},[490,1961,1962],{"class":1145},"\u002F\u002F Option A — prefix keys per product line\n",[490,1964,1965,1968,1970,1972,1974,1977,1980,1982,1984,1986,1988,1990,1993,1995,1998,2000],{"class":492,"line":499},[490,1966,1967],{"class":753},"telemetry",[490,1969,622],{"class":757},[490,1971,1122],{"class":749},[490,1973,1071],{"class":753},[490,1975,1976],{"class":757},"{",[490,1978,1979],{"class":766}," acme_product",[490,1981,770],{"class":757},[490,1983,773],{"class":757},[490,1985,929],{"class":776},[490,1987,780],{"class":757},[490,1989,758],{"class":757},[490,1991,1992],{"class":766}," deployCount",[490,1994,770],{"class":757},[490,1996,1997],{"class":1190}," 3",[490,1999,1265],{"class":757},[490,2001,1045],{"class":753},[490,2003,2004],{"class":492,"line":505},[490,2005,1282],{"emptyLinePlaceholder":1281},[490,2007,2008],{"class":492,"line":511},[490,2009,2010],{"class":1145},"\u002F\u002F Option B — separate allowedCustomKeys per tool.name in parseIngestBody\n",[490,2012,2013,2016,2018],{"class":492,"line":517},[490,2014,2015],{"class":1414},"allowedCustomKeys",[490,2017,770],{"class":757},[490,2019,761],{"class":757},[490,2021,2022,2024,2026,2028,2031,2033,2036,2038,2040,2042,2044,2046,2048],{"class":492,"line":523},[490,2023,1301],{"class":757},[490,2025,777],{"class":776},[490,2027,780],{"class":757},[490,2029,2030],{"class":766},": [",[490,2032,780],{"class":757},[490,2034,2035],{"class":776},"deployCount",[490,2037,780],{"class":757},[490,2039,758],{"class":757},[490,2041,773],{"class":757},[490,2043,1322],{"class":776},[490,2045,780],{"class":757},[490,2047,870],{"class":766},[490,2049,783],{"class":757},[490,2051,2052,2054,2057,2059,2061,2063,2066,2068,2070,2072,2074,2076,2078,2080,2082,2084,2086],{"class":492,"line":529},[490,2053,1301],{"class":757},[490,2055,2056],{"class":776},"acme-action",[490,2058,780],{"class":757},[490,2060,2030],{"class":766},[490,2062,780],{"class":757},[490,2064,2065],{"class":776},"jobDuration",[490,2067,780],{"class":757},[490,2069,758],{"class":757},[490,2071,773],{"class":757},[490,2073,1362],{"class":776},[490,2075,780],{"class":757},[490,2077,758],{"class":757},[490,2079,773],{"class":757},[490,2081,1371],{"class":776},[490,2083,780],{"class":757},[490,2085,870],{"class":766},[490,2087,783],{"class":757},[490,2089,2090],{"class":492,"line":535},[490,2091,598],{"class":757},[722,2093,2095],{"id":2094},"what-v1-does-not-support","What v1 does not support",[627,2097,2098,2111],{},[630,2099,2100],{},[633,2101,2102,2105,2108],{},[636,2103,2104],{},"Need",[636,2106,2107],{},"v1 answer",[636,2109,2110],{},"Workaround",[646,2112,2113,2133,2153,2170,2181],{},[633,2114,2115,2121,2124],{},[651,2116,2117,2118,1418],{},"New top-level field (",[487,2119,2120],{},"tenantId",[651,2122,2123],{},"Not on the wire",[651,2125,2126,2127,2129,2130],{},"Flat key in ",[487,2128,671],{}," + allowlist, or map server-side from ",[487,2131,2132],{},"machineId",[633,2134,2135,2141,2144],{},[651,2136,2137,2138,1418],{},"Nested objects (",[487,2139,2140],{},"custom.user.plan",[651,2142,2143],{},"Flat records only",[651,2145,2146,2147,2150,2151],{},"Flatten: ",[487,2148,2149],{},"userPlan: 'pro'"," with ",[487,2152,681],{},[633,2154,2155,2158,2161],{},[651,2156,2157],{},"Free-form strings (paths, emails)",[651,2159,2160],{},"Blocked by design",[651,2162,2163,2164,2167,2168],{},"Presence-only on flags (",[487,2165,2166],{},"output: true",") or hash before ",[487,2169,677],{},[633,2171,2172,2175,2178],{},[651,2173,2174],{},"Different schema per command",[651,2176,2177],{},"One envelope per run",[651,2179,2180],{},"Convention: only set relevant keys per command",[633,2182,2183,2186,2189],{},[651,2184,2185],{},"Transform before outbox",[651,2187,2188],{},"No hook yet",[651,2190,2191],{},"Map on the server (recommended) or see planned v2 below",[2193,2194,2195,2198,2199,2201,2202,678,2204,2206],"tip",{},[607,2196,2197],{},"Rule of thumb:"," if it is safe to print in ",[487,2200,1938],{}," and fits a closed set or a number, it belongs in ",[487,2203,719],{},[487,2205,671],{},". Everything else stays server-side.",[722,2208,2210],{"id":2209},"planned-v2-extensions","Planned v2 extensions",[476,2212,2213],{},"Not shipped yet — design targets for when the v1 extension zones are not enough:",[476,2215,2216,2222],{},[607,2217,2218,2221],{},[487,2219,2220],{},"enrich"," hook"," — run after sanitization, before the outbox append. Lets you inject computed fields without forking the package:",[480,2224,2226],{"className":739,"code":2225,"language":742,"meta":485,"style":485},"\u002F\u002F Planned API — not available in v1\ncreateTelemetry({\n  name: 'acme-cli',\n  version: '3.0.0',\n  collect: { fields: { product: ['cli', 'action'] } },\n  enrich(event) {\n    return {\n      ...event,\n      custom: {\n        ...event.custom,\n        schemaVersion: 2,\n      },\n    }\n  },\n})\n",[487,2227,2228,2233,2242,2256,2271,2313,2326,2333,2342,2351,2364,2375,2380,2385,2389],{"__ignoreMap":485},[490,2229,2230],{"class":492,"line":493},[490,2231,2232],{"class":1145},"\u002F\u002F Planned API — not available in v1\n",[490,2234,2235,2238,2240],{"class":492,"line":499},[490,2236,2237],{"class":749},"createTelemetry",[490,2239,1071],{"class":753},[490,2241,496],{"class":757},[490,2243,2244,2246,2248,2250,2252,2254],{"class":492,"line":505},[490,2245,767],{"class":766},[490,2247,770],{"class":757},[490,2249,773],{"class":757},[490,2251,777],{"class":776},[490,2253,780],{"class":757},[490,2255,783],{"class":757},[490,2257,2258,2260,2262,2264,2267,2269],{"class":492,"line":511},[490,2259,788],{"class":766},[490,2261,770],{"class":757},[490,2263,773],{"class":757},[490,2265,2266],{"class":776},"3.0.0",[490,2268,780],{"class":757},[490,2270,783],{"class":757},[490,2272,2273,2275,2277,2279,2282,2284,2286,2289,2291,2293,2295,2297,2299,2301,2303,2305,2307,2309,2311],{"class":492,"line":517},[490,2274,820],{"class":766},[490,2276,770],{"class":757},[490,2278,1259],{"class":757},[490,2280,2281],{"class":766}," fields",[490,2283,770],{"class":757},[490,2285,1259],{"class":757},[490,2287,2288],{"class":766}," product",[490,2290,770],{"class":757},[490,2292,843],{"class":753},[490,2294,780],{"class":757},[490,2296,929],{"class":776},[490,2298,780],{"class":757},[490,2300,758],{"class":757},[490,2302,773],{"class":757},[490,2304,938],{"class":776},[490,2306,780],{"class":757},[490,2308,1380],{"class":753},[490,2310,1042],{"class":757},[490,2312,1503],{"class":757},[490,2314,2315,2318,2320,2322,2324],{"class":492,"line":523},[490,2316,2317],{"class":766},"  enrich",[490,2319,1071],{"class":757},[490,2321,1556],{"class":1408},[490,2323,1418],{"class":757},[490,2325,761],{"class":757},[490,2327,2328,2331],{"class":492,"line":529},[490,2329,2330],{"class":1059},"    return",[490,2332,761],{"class":757},[490,2334,2335,2338,2340],{"class":492,"line":535},[490,2336,2337],{"class":757},"      ...",[490,2339,1556],{"class":753},[490,2341,783],{"class":757},[490,2343,2344,2347,2349],{"class":492,"line":541},[490,2345,2346],{"class":766},"      custom",[490,2348,770],{"class":757},[490,2350,761],{"class":757},[490,2352,2353,2356,2358,2360,2362],{"class":492,"line":547},[490,2354,2355],{"class":757},"        ...",[490,2357,1556],{"class":753},[490,2359,622],{"class":757},[490,2361,671],{"class":753},[490,2363,783],{"class":757},[490,2365,2366,2369,2371,2373],{"class":492,"line":553},[490,2367,2368],{"class":766},"        schemaVersion",[490,2370,770],{"class":757},[490,2372,1191],{"class":1190},[490,2374,783],{"class":757},[490,2376,2377],{"class":492,"line":559},[490,2378,2379],{"class":757},"      },\n",[490,2381,2382],{"class":492,"line":565},[490,2383,2384],{"class":757},"    }\n",[490,2386,2387],{"class":492,"line":574},[490,2388,577],{"class":757},[490,2390,2391,2393],{"class":492,"line":580},[490,2392,1042],{"class":757},[490,2394,1045],{"class":753},[476,2396,2397,2398,2400,2401,2403],{},"The hook cannot bypass sanitization rules — strings still require ",[487,2399,681],{},". Server-side ",[487,2402,2015],{}," stays the source of truth.",[476,2405,2406,2409,2410,2413,2414,622],{},[607,2407,2408],{},"Namespaced keys"," — optional ",[487,2411,2412],{},"acme.product"," convention for multi-tool endpoints without prefix collisions. Would be documented in disclosure as ",[487,2415,2416],{},"acme.product: cli | action",[476,2418,2419,2420,2422],{},"If you need one of these before v2 lands, open a discussion on the repo — the v1 path (",[487,2421,671],{}," + server mapping) covers most product analytics needs.",[471,2424,2426],{"id":2425},"privacy","Privacy",[476,2428,2429,2430,2433,2434,2437],{},"Raw ",[487,2431,2432],{},"argv"," is never read. Sanitization applies to ",[607,2435,2436],{},"citty-parsed"," flags only:",[689,2439,2440,2453,2464],{},[692,2441,2442,2445,2446,2449,2450,1418],{},[607,2443,2444],{},"Booleans \u002F numbers"," → value stored (",[487,2447,2448],{},"json: true",", ",[487,2451,2452],{},"limit: 50",[692,2454,2455,2458,2459,2461,2462],{},[607,2456,2457],{},"Strings"," → presence only (",[487,2460,2166],{},") unless allowlisted in ",[487,2463,661],{},[692,2465,2466,2470,2471,2473],{},[607,2467,2468],{},[487,2469,677],{}," → numbers and booleans always; strings only via ",[487,2472,681],{}," (undeclared values are dropped at runtime, never thrown)",[480,2475,2477],{"className":739,"code":2476,"filename":741,"language":742,"meta":485,"style":485},"collect: {\n  flags: { format: ['json', 'csv'] },           \u002F\u002F --format json → \"json\"; --format yaml → true\n  fields: { framework: ['nuxt', 'next'] },      \u002F\u002F telemetry.set({ framework: 'nuxt' }) ok\n}\n",[487,2478,2479,2487,2526,2563],{"__ignoreMap":485},[490,2480,2481,2483,2485],{"class":492,"line":493},[490,2482,719],{"class":1414},[490,2484,770],{"class":757},[490,2486,761],{"class":757},[490,2488,2489,2492,2494,2496,2499,2501,2503,2505,2507,2509,2511,2513,2516,2518,2520,2523],{"class":492,"line":499},[490,2490,2491],{"class":1414},"  flags",[490,2493,770],{"class":757},[490,2495,1259],{"class":757},[490,2497,2498],{"class":1414}," format",[490,2500,770],{"class":757},[490,2502,843],{"class":766},[490,2504,780],{"class":757},[490,2506,848],{"class":776},[490,2508,780],{"class":757},[490,2510,758],{"class":757},[490,2512,773],{"class":757},[490,2514,2515],{"class":776},"csv",[490,2517,780],{"class":757},[490,2519,1380],{"class":766},[490,2521,2522],{"class":757},"},",[490,2524,2525],{"class":1145},"           \u002F\u002F --format json → \"json\"; --format yaml → true\n",[490,2527,2528,2531,2533,2535,2538,2540,2542,2544,2546,2548,2550,2552,2554,2556,2558,2560],{"class":492,"line":505},[490,2529,2530],{"class":1414},"  fields",[490,2532,770],{"class":757},[490,2534,1259],{"class":757},[490,2536,2537],{"class":1414}," framework",[490,2539,770],{"class":757},[490,2541,843],{"class":766},[490,2543,780],{"class":757},[490,2545,1005],{"class":776},[490,2547,780],{"class":757},[490,2549,758],{"class":757},[490,2551,773],{"class":757},[490,2553,1014],{"class":776},[490,2555,780],{"class":757},[490,2557,1380],{"class":766},[490,2559,2522],{"class":757},[490,2561,2562],{"class":1145},"      \u002F\u002F telemetry.set({ framework: 'nuxt' }) ok\n",[490,2564,2565],{"class":492,"line":511},[490,2566,598],{"class":757},[476,2568,2569,2570,732,2572,2574,2575,2577],{},"Declare allowlists in the same ",[487,2571,731],{},[487,2573,735],{}," call as ",[487,2576,719],{}," — no separate config file.",[471,2579,2581],{"id":2580},"disclosure","Disclosure",[476,2583,2584,2587,2588,2590,2591,2593],{},[487,2585,2586],{},"generateDisclosure()"," produces markdown + JSON from the standard envelope plus your ",[487,2589,719],{}," extensions. Commit the output (e.g. ",[487,2592,1938],{},") so it stays in sync with releases:",[480,2595,2598],{"className":739,"code":2596,"filename":2597,"language":742,"meta":485,"style":485},"import { writeFile } from 'node:fs\u002Fpromises'\nimport { generateDisclosure } from '@evlog\u002Ftelemetry'\n\nconst { markdown } = generateDisclosure('my-tool', {\n  flags: { format: ['json', 'csv'] },\n})\n\nawait writeFile('TELEMETRY.md', markdown)\n","scripts\u002Fgenerate-disclosure.ts",[487,2599,2600,2620,2639,2643,2671,2704,2710,2714],{"__ignoreMap":485},[490,2601,2602,2604,2606,2609,2611,2613,2615,2618],{"class":492,"line":493},[490,2603,1256],{"class":1059},[490,2605,1259],{"class":757},[490,2607,2608],{"class":753}," writeFile",[490,2610,1265],{"class":757},[490,2612,1268],{"class":1059},[490,2614,773],{"class":757},[490,2616,2617],{"class":776},"node:fs\u002Fpromises",[490,2619,1276],{"class":757},[490,2621,2622,2624,2626,2629,2631,2633,2635,2637],{"class":492,"line":499},[490,2623,1256],{"class":1059},[490,2625,1259],{"class":757},[490,2627,2628],{"class":753}," generateDisclosure",[490,2630,1265],{"class":757},[490,2632,1268],{"class":1059},[490,2634,773],{"class":757},[490,2636,704],{"class":776},[490,2638,1276],{"class":757},[490,2640,2641],{"class":492,"line":505},[490,2642,1282],{"emptyLinePlaceholder":1281},[490,2644,2645,2647,2649,2652,2654,2656,2658,2660,2662,2665,2667,2669],{"class":492,"line":511},[490,2646,1287],{"class":1083},[490,2648,1259],{"class":757},[490,2650,2651],{"class":753}," markdown ",[490,2653,1042],{"class":757},[490,2655,1103],{"class":757},[490,2657,2628],{"class":749},[490,2659,1071],{"class":753},[490,2661,780],{"class":757},[490,2663,2664],{"class":776},"my-tool",[490,2666,780],{"class":757},[490,2668,758],{"class":757},[490,2670,761],{"class":757},[490,2672,2673,2675,2677,2679,2681,2683,2685,2687,2689,2691,2693,2695,2697,2699,2701],{"class":492,"line":517},[490,2674,2491],{"class":766},[490,2676,770],{"class":757},[490,2678,1259],{"class":757},[490,2680,2498],{"class":766},[490,2682,770],{"class":757},[490,2684,843],{"class":753},[490,2686,780],{"class":757},[490,2688,848],{"class":776},[490,2690,780],{"class":757},[490,2692,758],{"class":757},[490,2694,773],{"class":757},[490,2696,2515],{"class":776},[490,2698,780],{"class":757},[490,2700,1380],{"class":753},[490,2702,2703],{"class":757},"},\n",[490,2705,2706,2708],{"class":492,"line":523},[490,2707,1042],{"class":757},[490,2709,1045],{"class":753},[490,2711,2712],{"class":492,"line":529},[490,2713,1282],{"emptyLinePlaceholder":1281},[490,2715,2716,2718,2720,2722,2724,2726,2728,2730],{"class":492,"line":535},[490,2717,1060],{"class":1059},[490,2719,2608],{"class":749},[490,2721,1071],{"class":753},[490,2723,780],{"class":757},[490,2725,1938],{"class":776},[490,2727,780],{"class":757},[490,2729,758],{"class":757},[490,2731,2732],{"class":753}," markdown)\n",[476,2734,2735,2736,2739,2740,622],{},"Users can also read it at runtime via ",[487,2737,2738],{},"my-tool telemetry status"," when you wire ",[487,2741,2742],{},"defineTelemetryCommands()",[471,2744,2746],{"id":2745},"consent-and-reliability","Consent and reliability",[476,2748,2749,1225,2752,2755,2756,2759,2760,732,2763,2766],{},[607,2750,2751],{},"Opt-out priority:",[487,2753,2754],{},"DO_NOT_TRACK=1"," → ",[487,2757,2758],{},"EVLOG_TELEMETRY=0"," → persisted preference (",[487,2761,2762],{},"disableTelemetry()",[487,2764,2765],{},"telemetry disable","). Opt-out purges the undelivered outbox.",[476,2768,2769,2772,2773,2776],{},[607,2770,2771],{},"Never harms the host:"," telemetry never throws, never blocks exit; ",[487,2774,2775],{},"flush()"," has a 500ms hard cap.",[476,2778,2779,2782,2783,622],{},[607,2780,2781],{},"Outbox:"," events append locally before any network attempt. Offline machines and CI matrix jobs drain the backlog on the next invocation once your ingestion endpoint returns ",[487,2784,2785],{},"2xx",[476,2787,2788,1225,2791,2794,2795,2798],{},[607,2789,2790],{},"Endpoint:",[487,2792,2793],{},"EVLOG_TELEMETRY_ENDPOINT"," env → ",[487,2796,2797],{},"endpoint"," option baked into the CLI. Omit both during local development; ship the URL when your ingest handler is live.",[2800,2801,2802],"style",{},"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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":485,"searchDepth":499,"depth":499,"links":2804},[2805,2806,2816,2817,2818],{"id":473,"depth":499,"text":474},{"id":601,"depth":499,"text":602,"children":2807},[2808,2809,2810,2811,2813,2814,2815],{"id":724,"depth":505,"text":725},{"id":1241,"depth":505,"text":1242},{"id":1529,"depth":505,"text":1530},{"id":1841,"depth":505,"text":2812},"Version breaking changes in custom",{"id":1945,"depth":505,"text":1946},{"id":2094,"depth":505,"text":2095},{"id":2209,"depth":505,"text":2210},{"id":2425,"depth":499,"text":2426},{"id":2580,"depth":499,"text":2581},{"id":2745,"depth":499,"text":2746},"RunEvent envelope, extending the schema with collect and custom fields, privacy rules, TELEMETRY.md disclosure, and consent \u002F outbox reliability.","md",[2822,2825,2826],{"label":36,"icon":39,"to":353,"color":2823,"variant":2824},"neutral","subtle",{"label":356,"icon":359,"to":357,"color":2823,"variant":2824},{"label":361,"icon":364,"to":362,"color":2823,"variant":2824},{},{"title":366,"icon":79},{"title":466,"description":2819},"VL7A5uMG4d-BL39Yx-gwZZZEySgWJRnaS0lLG4Lyrok",[2832,2834],{"title":361,"path":362,"stem":363,"description":2833,"icon":364,"children":-1},"Build a server ingestion endpoint for @evlog\u002Ftelemetry — semi-public threat model, parseIngestBody validation, framework routes, idempotent storage, and rate limiting.",{"title":370,"path":371,"stem":372,"description":2835,"icon":373,"children":-1},"Add derived context to every wide event automatically — user agent, geo, request size, and trace context. Built-in enrichers from evlog\u002Fenrichers, plus how to compose them with your own.",1784204020386]