[{"data":1,"prerenderedAt":1391},["ShallowReactive",2],{"navigation_docs":3,"-cli-map":500,"-cli-map-surround":1386},[4,30,80,118,283,415,470],{"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},"CLI","\u002Fcli","3.cli",[85,88,93,98,103,108,113],{"title":36,"path":86,"stem":87,"icon":44},"\u002Fcli\u002Foverview","3.cli\u002F0.overview",{"title":89,"path":90,"stem":91,"icon":92},"map","\u002Fcli\u002Fmap","3.cli\u002F1.map","i-lucide-radar",{"title":94,"path":95,"stem":96,"icon":97},"Rules","\u002Fcli\u002Frules","3.cli\u002F2.rules","i-lucide-list-checks",{"title":99,"path":100,"stem":101,"icon":102},"Scoring","\u002Fcli\u002Fscoring","3.cli\u002F3.scoring","i-lucide-gauge",{"title":104,"path":105,"stem":106,"icon":107},"CI","\u002Fcli\u002Fci","3.cli\u002F4.ci","i-lucide-git-pull-request",{"title":109,"path":110,"stem":111,"icon":112},"doctor","\u002Fcli\u002Fdoctor","3.cli\u002F5.doctor","i-lucide-stethoscope",{"title":114,"path":115,"stem":116,"icon":117},"telemetry","\u002Fcli\u002Ftelemetry","3.cli\u002F6.telemetry","i-lucide-bar-chart-3",{"title":119,"path":120,"stem":121,"children":122,"page":29},"Integrate","\u002Fintegrate","4.integrate",[123,127,195],{"title":36,"path":124,"stem":125,"icon":126},"\u002Fintegrate\u002Foverview","4.integrate\u002F0.overview","i-lucide-plug",{"title":128,"path":129,"stem":130,"children":131,"page":29},"Adapters","\u002Fintegrate\u002Fadapters","4.integrate\u002Fadapters",[132,135,175],{"title":36,"path":133,"stem":134,"icon":39},"\u002Fintegrate\u002Fadapters\u002Foverview","4.integrate\u002Fadapters\u002F01.overview",{"title":136,"path":137,"stem":138,"children":139,"page":29},"Cloud","\u002Fintegrate\u002Fadapters\u002Fcloud","4.integrate\u002Fadapters\u002Fcloud",[140,145,150,155,160,165,170],{"title":141,"path":142,"stem":143,"icon":144},"Axiom","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Faxiom","4.integrate\u002Fadapters\u002Fcloud\u002F01.axiom","i-custom-axiom",{"title":146,"path":147,"stem":148,"icon":149},"OTLP","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fotlp","4.integrate\u002Fadapters\u002Fcloud\u002F02.otlp","i-simple-icons-opentelemetry",{"title":151,"path":152,"stem":153,"icon":154},"PostHog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fposthog","4.integrate\u002Fadapters\u002Fcloud\u002F03.posthog","i-simple-icons-posthog",{"title":156,"path":157,"stem":158,"icon":159},"Sentry","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fsentry","4.integrate\u002Fadapters\u002Fcloud\u002F04.sentry","i-simple-icons-sentry",{"title":161,"path":162,"stem":163,"icon":164},"Better Stack","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fbetter-stack","4.integrate\u002Fadapters\u002Fcloud\u002F05.better-stack","i-simple-icons-betterstack",{"title":166,"path":167,"stem":168,"icon":169},"Datadog","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fdatadog","4.integrate\u002Fadapters\u002Fcloud\u002F06.datadog","i-simple-icons-datadog",{"title":171,"path":172,"stem":173,"icon":174},"HyperDX","\u002Fintegrate\u002Fadapters\u002Fcloud\u002Fhyperdx","4.integrate\u002Fadapters\u002Fcloud\u002F07.hyperdx","i-custom-hyperdx",{"title":176,"path":177,"stem":178,"children":179,"page":29},"Self-Hosted","\u002Fintegrate\u002Fadapters\u002Fself-hosted","4.integrate\u002Fadapters\u002Fself-hosted",[180,185,190],{"title":181,"path":182,"stem":183,"icon":184},"File System","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Ffs","4.integrate\u002Fadapters\u002Fself-hosted\u002F01.fs","i-lucide-hard-drive",{"title":186,"path":187,"stem":188,"icon":189},"NuxtHub","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fnuxthub","4.integrate\u002Fadapters\u002Fself-hosted\u002F02.nuxthub","i-simple-icons-nuxt",{"title":191,"path":192,"stem":193,"icon":194},"Memory","\u002Fintegrate\u002Fadapters\u002Fself-hosted\u002Fmemory","4.integrate\u002Fadapters\u002Fself-hosted\u002F03.memory","i-lucide-cpu",{"title":196,"path":197,"stem":198,"children":199,"page":29},"Frameworks","\u002Fintegrate\u002Fframeworks","4.integrate\u002Fframeworks",[200,204,209,214,219,224,229,234,239,244,249,254,259,264,268,273,278],{"title":36,"path":201,"stem":202,"icon":203},"\u002Fintegrate\u002Fframeworks\u002Foverview","4.integrate\u002Fframeworks\u002F00.overview","i-lucide-layout-grid",{"title":205,"path":206,"stem":207,"icon":208},"Nuxt","\u002Fintegrate\u002Fframeworks\u002Fnuxt","4.integrate\u002Fframeworks\u002F01.nuxt","i-simple-icons-nuxtdotjs",{"title":210,"path":211,"stem":212,"icon":213},"Next.js","\u002Fintegrate\u002Fframeworks\u002Fnextjs","4.integrate\u002Fframeworks\u002F02.nextjs","i-simple-icons-nextdotjs",{"title":215,"path":216,"stem":217,"icon":218},"SvelteKit","\u002Fintegrate\u002Fframeworks\u002Fsveltekit","4.integrate\u002Fframeworks\u002F03.sveltekit","i-simple-icons-svelte",{"title":220,"path":221,"stem":222,"icon":223},"Nitro","\u002Fintegrate\u002Fframeworks\u002Fnitro","4.integrate\u002Fframeworks\u002F04.nitro","i-custom-nitro",{"title":225,"path":226,"stem":227,"icon":228},"TanStack Start","\u002Fintegrate\u002Fframeworks\u002Ftanstack-start","4.integrate\u002Fframeworks\u002F05.tanstack-start","i-custom-tanstack",{"title":230,"path":231,"stem":232,"icon":233},"NestJS","\u002Fintegrate\u002Fframeworks\u002Fnestjs","4.integrate\u002Fframeworks\u002F06.nestjs","i-simple-icons-nestjs",{"title":235,"path":236,"stem":237,"icon":238},"Express","\u002Fintegrate\u002Fframeworks\u002Fexpress","4.integrate\u002Fframeworks\u002F07.express","i-simple-icons-express",{"title":240,"path":241,"stem":242,"icon":243},"Hono","\u002Fintegrate\u002Fframeworks\u002Fhono","4.integrate\u002Fframeworks\u002F08.hono","i-simple-icons-hono",{"title":245,"path":246,"stem":247,"icon":248},"Fastify","\u002Fintegrate\u002Fframeworks\u002Ffastify","4.integrate\u002Fframeworks\u002F09.fastify","i-simple-icons-fastify",{"title":250,"path":251,"stem":252,"icon":253},"Elysia","\u002Fintegrate\u002Fframeworks\u002Felysia","4.integrate\u002Fframeworks\u002F10.elysia","i-custom-elysia",{"title":255,"path":256,"stem":257,"icon":258},"React Router","\u002Fintegrate\u002Fframeworks\u002Freact-router","4.integrate\u002Fframeworks\u002F11.react-router","i-custom-reactrouter",{"title":260,"path":261,"stem":262,"icon":263},"Cloudflare Workers","\u002Fintegrate\u002Fframeworks\u002Fcloudflare-workers","4.integrate\u002Fframeworks\u002F12.cloudflare-workers","i-simple-icons-cloudflare",{"title":265,"path":266,"stem":267,"icon":74},"Standalone","\u002Fintegrate\u002Fframeworks\u002Fstandalone","4.integrate\u002Fframeworks\u002F13.standalone",{"title":269,"path":270,"stem":271,"icon":272},"Astro","\u002Fintegrate\u002Fframeworks\u002Fastro","4.integrate\u002Fframeworks\u002F14.astro","i-simple-icons-astro",{"title":274,"path":275,"stem":276,"icon":277},"oRPC","\u002Fintegrate\u002Fframeworks\u002Forpc","4.integrate\u002Fframeworks\u002F15.orpc","i-lucide-network",{"title":279,"path":280,"stem":281,"icon":282},"AWS Lambda","\u002Fintegrate\u002Fframeworks\u002Faws-lambda","4.integrate\u002Fframeworks\u002F16.aws-lambda","i-custom-lambda",{"title":284,"path":285,"stem":286,"children":287,"page":29},"Use Cases","\u002Fuse-cases","5.use-cases",[288,291,296,325,352,384,405,410],{"title":36,"path":289,"stem":290,"icon":97},"\u002Fuse-cases\u002Foverview","5.use-cases\u002F0.overview",{"title":292,"path":293,"stem":294,"icon":295},"Client Logging","\u002Fuse-cases\u002Fclient-logging","5.use-cases\u002F1.client-logging","i-lucide-monitor",{"title":297,"icon":298,"path":299,"stem":300,"children":301,"page":29},"AI SDK","i-simple-icons-vercel","\u002Fuse-cases\u002Fai-sdk","5.use-cases\u002F2.ai-sdk",[302,305,310,315,320],{"title":36,"path":303,"stem":304,"icon":39},"\u002Fuse-cases\u002Fai-sdk\u002Foverview","5.use-cases\u002F2.ai-sdk\u002F01.overview",{"title":306,"path":307,"stem":308,"icon":309},"Usage","\u002Fuse-cases\u002Fai-sdk\u002Fusage","5.use-cases\u002F2.ai-sdk\u002F02.usage","i-lucide-code",{"title":311,"path":312,"stem":313,"icon":314},"Options","\u002Fuse-cases\u002Fai-sdk\u002Foptions","5.use-cases\u002F2.ai-sdk\u002F03.options","i-lucide-sliders",{"title":316,"path":317,"stem":318,"icon":319},"Metadata","\u002Fuse-cases\u002Fai-sdk\u002Fmetadata","5.use-cases\u002F2.ai-sdk\u002F04.metadata","i-lucide-database",{"title":321,"path":322,"stem":323,"icon":324},"Telemetry","\u002Fuse-cases\u002Fai-sdk\u002Ftelemetry","5.use-cases\u002F2.ai-sdk\u002F05.telemetry","i-lucide-activity",{"title":326,"icon":327,"path":328,"stem":329,"children":330,"page":29},"Better Auth","i-simple-icons-betterauth","\u002Fuse-cases\u002Fbetter-auth","5.use-cases\u002F3.better-auth",[331,334,339,344,348],{"title":36,"path":332,"stem":333,"icon":39},"\u002Fuse-cases\u002Fbetter-auth\u002Foverview","5.use-cases\u002F3.better-auth\u002F01.overview",{"title":335,"path":336,"stem":337,"icon":338},"Identify User","\u002Fuse-cases\u002Fbetter-auth\u002Fidentify-user","5.use-cases\u002F3.better-auth\u002F02.identify-user","i-lucide-user-check",{"title":340,"path":341,"stem":342,"icon":343},"Middleware","\u002Fuse-cases\u002Fbetter-auth\u002Fmiddleware","5.use-cases\u002F3.better-auth\u002F03.middleware","i-lucide-shield",{"title":345,"path":346,"stem":347,"icon":295},"Client Sync","\u002Fuse-cases\u002Fbetter-auth\u002Fclient-sync","5.use-cases\u002F3.better-auth\u002F04.client-sync",{"title":349,"path":350,"stem":351,"icon":102},"Performance","\u002Fuse-cases\u002Fbetter-auth\u002Fperformance","5.use-cases\u002F3.better-auth\u002F05.performance",{"title":353,"icon":354,"path":355,"stem":356,"children":357,"page":29},"Audit Logs","i-lucide-shield-check","\u002Fuse-cases\u002Faudit","5.use-cases\u002F4.audit",[358,361,366,371,376,380],{"title":36,"path":359,"stem":360,"icon":39},"\u002Fuse-cases\u002Faudit\u002Foverview","5.use-cases\u002F4.audit\u002F01.overview",{"title":362,"path":363,"stem":364,"icon":365},"Schema","\u002Fuse-cases\u002Faudit\u002Fschema","5.use-cases\u002F4.audit\u002F02.schema","i-lucide-file-text",{"title":367,"path":368,"stem":369,"icon":370},"Recording","\u002Fuse-cases\u002Faudit\u002Frecording","5.use-cases\u002F4.audit\u002F03.recording","i-lucide-pen-line",{"title":372,"path":373,"stem":374,"icon":375},"Drains","\u002Fuse-cases\u002Faudit\u002Fpipeline","5.use-cases\u002F4.audit\u002F04.pipeline","i-lucide-link",{"title":377,"path":378,"stem":379,"icon":354},"Compliance","\u002Fuse-cases\u002Faudit\u002Fcompliance","5.use-cases\u002F4.audit\u002F05.compliance",{"title":381,"path":382,"stem":383,"icon":79},"Recipes","\u002Fuse-cases\u002Faudit\u002Frecipes","5.use-cases\u002F4.audit\u002F06.recipes",{"title":321,"icon":102,"path":385,"stem":386,"children":387,"page":29},"\u002Fuse-cases\u002Ftelemetry","5.use-cases\u002F4.telemetry",[388,391,396,401],{"title":36,"path":389,"stem":390,"icon":39},"\u002Fuse-cases\u002Ftelemetry\u002Foverview","5.use-cases\u002F4.telemetry\u002F01.overview",{"title":392,"path":393,"stem":394,"icon":395},"Setup","\u002Fuse-cases\u002Ftelemetry\u002Fsetup","5.use-cases\u002F4.telemetry\u002F02.setup","i-lucide-wrench",{"title":397,"path":398,"stem":399,"icon":400},"Ingest","\u002Fuse-cases\u002Ftelemetry\u002Fingest","5.use-cases\u002F4.telemetry\u002F03.ingest","i-lucide-server",{"title":402,"path":403,"stem":404,"icon":79},"Reference","\u002Fuse-cases\u002Ftelemetry\u002Freference","5.use-cases\u002F4.telemetry\u002F04.reference",{"title":406,"path":407,"stem":408,"icon":409},"Enrichers","\u002Fuse-cases\u002Fenrichers","5.use-cases\u002F5.enrichers","i-lucide-sparkles",{"title":411,"path":412,"stem":413,"icon":414},"eve","\u002Fuse-cases\u002Feve","5.use-cases\u002F5.eve","i-custom-eve",{"title":416,"path":417,"stem":418,"children":419,"page":29},"Extend","\u002Fextend","6.extend",[420,424,429,434,439,443,447,451,455,460,465],{"title":36,"path":421,"stem":422,"icon":423},"\u002Fextend\u002Foverview","6.extend\u002F0.overview","i-lucide-blocks",{"title":425,"path":426,"stem":427,"icon":428},"Stream","\u002Fextend\u002Fstream","6.extend\u002F1.stream","i-lucide-radio-tower",{"title":430,"path":431,"stem":432,"icon":433},"Custom framework","\u002Fextend\u002Fcustom-framework","6.extend\u002F10.custom-framework","i-lucide-puzzle",{"title":435,"path":436,"stem":437,"icon":438},"FS reader","\u002Fextend\u002Ffs-reader","6.extend\u002F2.fs-reader","i-lucide-folder-search",{"title":381,"path":440,"stem":441,"icon":442},"\u002Fextend\u002Fconsumer-recipes","6.extend\u002F3.consumer-recipes","i-lucide-chef-hat",{"title":444,"path":445,"stem":446,"icon":423},"Plugins","\u002Fextend\u002Fplugins","6.extend\u002F4.plugins",{"title":448,"path":449,"stem":450,"icon":409},"Custom enrichers","\u002Fextend\u002Fcustom-enrichers","6.extend\u002F5.custom-enrichers",{"title":452,"path":453,"stem":454,"icon":64},"Tail sampling","\u002Fextend\u002Ftail-sampling","6.extend\u002F6.tail-sampling",{"title":456,"path":457,"stem":458,"icon":459},"Identity headers","\u002Fextend\u002Fidentity-headers","6.extend\u002F7.identity-headers","i-lucide-fingerprint",{"title":461,"path":462,"stem":463,"icon":464},"Custom drains","\u002Fextend\u002Fcustom-drains","6.extend\u002F8.custom-drains","i-lucide-share-2",{"title":466,"path":467,"stem":468,"icon":469},"Drain pipeline","\u002Fextend\u002Fdrain-pipeline","6.extend\u002F9.drain-pipeline","i-lucide-workflow",{"title":402,"path":471,"stem":472,"children":473,"page":29},"\u002Freference","7.reference",[474,479,482,487,491,496],{"title":475,"path":476,"stem":477,"icon":478},"Configuration","\u002Freference\u002Fconfiguration","7.reference\u002F1.configuration","i-lucide-settings",{"title":349,"path":480,"stem":481,"icon":102},"\u002Freference\u002Fperformance","7.reference\u002F2.performance",{"title":483,"path":484,"stem":485,"icon":486},"Vite Plugin","\u002Freference\u002Fvite-plugin","7.reference\u002F3.vite-plugin","i-custom-vite",{"title":488,"path":489,"stem":490,"icon":354},"Best Practices","\u002Freference\u002Fbest-practices","7.reference\u002F4.best-practices",{"title":492,"path":493,"stem":494,"icon":495},"vs Other Loggers","\u002Freference\u002Fvs-other-loggers","7.reference\u002F5.vs-other-loggers","i-lucide-scale",{"title":497,"path":498,"stem":499,"icon":409},"Agent Skills","\u002Freference\u002Fagent-skills","7.reference\u002F6.agent-skills",{"id":501,"title":502,"body":503,"description":1376,"extension":1377,"links":1378,"meta":1382,"navigation":1383,"path":90,"seo":1384,"stem":91,"__hash__":1385},"docs\u002F3.cli\u002F1.map.md","evlog map",{"type":504,"value":505,"toc":1356},"minimark",[506,517,520,523,546,560,623,628,631,642,645,650,666,669,676,680,687,739,746,750,753,772,776,783,787,790,797,808,812,826,830,833,837,843,850,872,876,879,911,920,923,959,963,970,998,1023,1046,1054,1058,1061,1122,1130,1134,1268,1271,1280,1291,1295,1298,1332,1335,1352],[507,508,509,512,513],"p",{},[510,511,502],"code",{}," reads your project on disk and answers one question: ",[514,515,516],"strong",{},"if something goes wrong in production tonight, which parts of this app will be able to tell you why?",[507,518,519],{},"It finds every entry point — API handlers, pages that fetch, middleware, scheduled jobs, server actions — checks each one for wide-event coverage, scores it, and names the three worth fixing first. Nothing runs, nothing is instrumented, no traffic is needed: it is static analysis over your source.",[521,522],"map-scan-flow",{},[524,525,531],"pre",{"className":526,"code":527,"filename":528,"language":529,"meta":530,"style":530},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","evlog map\n","Terminal","bash","",[510,532,533],{"__ignoreMap":530},[534,535,538,542],"span",{"class":536,"line":537},"line",1,[534,539,541],{"class":540},"sBMFI","evlog",[534,543,545],{"class":544},"sfazB"," map\n",[547,548,550,553,554,559],"warning",{"icon":549},"i-lucide-flask-conical",[514,551,552],{},"Early days."," The foundation is solid — AST-based, tested, with a versioned JSON contract — but the rule set is young and only four frameworks have adapters. A release that sharpens a rule can change a verdict on code you did not touch, so ",[555,556,558],"a",{"href":557},"\u002Fcli\u002Fci#pin-the-version","pin the CLI version"," if you gate a pull request on the score.",[561,562,565,572,610],"prompt",{":actions":563,"description":564,"icon":92},"[\"copy\",\"cursor\",\"claude\"]","Raise my evlog map score",[507,566,567,568,571],{},"Run ",[510,569,570],{},"npx @evlog\u002Fcli map"," in this project and read the report.",[573,574,575,579,586,604],"ul",{},[576,577,578],"li",{},"Fix the entry points listed under FIX FIRST, in order",[576,580,581,582,585],{},"For each one, run ",[510,583,584],{},"npx @evlog\u002Fcli map \u003Cfile>"," first to see the suggested shape",[576,587,588,589,592,593,592,596,599,600,603],{},"Keep the changes minimal: add ",[510,590,591],{},"useLogger()",", ",[510,594,595],{},"log.set()",[510,597,598],{},"log.audit()",", or ",[510,601,602],{},"createError({ why, fix })"," where the report says they are missing",[576,605,606,607,609],{},"Re-run ",[510,608,570],{}," and confirm the score went up",[507,611,612,613,618,619],{},"Docs: ",[555,614,615],{"href":615,"rel":616},"https:\u002F\u002Fwww.evlog.dev\u002Fcli\u002Fmap",[617],"nofollow","\nRules: ",[555,620,621],{"href":621,"rel":622},"https:\u002F\u002Fwww.evlog.dev\u002Fcli\u002Frules",[617],[624,625,627],"h2",{"id":626},"the-report","The report",[507,629,630],{},"This is a real run against the evlog playground, a Nuxt app with 29 entry points:",[632,633,634],"code-collapse",{},[524,635,640],{"className":636,"code":638,"filename":502,"language":639,"meta":530},[637],"language-text","▀▀█ █▀▀   score \u002F100              evlog-playground · Nuxt\n  █ █▀█   ▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▱▱▱▱▱    29 entry points scanned\n  ▀ ▀▀▀   good                    ▂▂▂▃▃▃▃▃▄▆▆▆▆▆███████████████\n\nCOVERAGE\n● API handlers       ▰▰▰▰▰▰▰▰▱▱   79  13 of 28 have gaps\n● Middleware & jobs  ▰▰▰▰▰▱▱▱▱▱   45  run without any logging\n● Money & auth       ▰▰▰▰▰▰▰▱▱▱   71  missing audit trails\n\nFIX FIRST\n1. ANY    \u002Fapi\u002Fauth\u002F:all* A — touches auth and logs nothing\n   server\u002Fapi\u002Fauth\u002F[...all].ts:1 · evlog.dev\u002Flearn\u002Fwide-events\n2. GET    \u002Fapi\u002Ftest\u002Fcatalog\u002Fpayment-declined $ — moves money with no audit trail\n   server\u002Fapi\u002Ftest\u002Fcatalog\u002Fpayment-declined.get.ts:11 · evlog.dev\u002Fuse-cases\u002Faudit\u002Foverview\n3. POST   \u002Fapi\u002Fauth\u002Flogin A — missing log.audit\n   server\u002Fapi\u002Fauth\u002Flogin.post.ts:1 · evlog.dev\u002Fuse-cases\u002Faudit\u002Foverview\n\nTHEN\n· add useLogger + log.set to \u002Fapi\u002Ftest\u002Fbrowser-ingest +4\n· add log.audit to \u002Fapi\u002Fpayment\u002Fprocess, \u002Fapi\u002Ftest\u002Fbetter-auth\u002Fwhoami\n· add log.set to \u002Fapi\u002Faudit\u002Fdeny\n· add log.set + createError({ why, fix }) to \u002Fapi\u002Faudit\u002Fwith-audit\n· add useLogger + log.set + createError({ why, fix }) to \u002Fapi\u002Ftest\u002Fh3-error\n· add createError({ why, fix }) to \u002Fapi\u002Ftest\u002Ftail-sampling\u002Ferror\n\n✓ Already solid: \u002Fapi\u002Faudit\u002Fcatalog\u002Finvoice-refund +14\n▲ 76 → 86 by fixing the 3 above\n\n────────────────────────────\nevlog.map.json updated · how this score works → evlog.dev\u002Fcli\u002Fscoring\n▸ evlog map --all every entry point · evlog map \u003Cfile> inspect one\n  --min-score 80 CI gate\n","text",[510,641,638],{"__ignoreMap":530},[507,643,644],{},"Read from the top down, each block answers a different question.",[646,647,649],"h3",{"id":648},"the-score","The score",[507,651,652,653,592,656,592,659,599,662,665],{},"The big digits are the global score out of 100: a weighted average of every entry point, where money and auth routes count double and pages count half. The word underneath is its grade — ",[510,654,655],{},"excellent",[510,657,658],{},"good",[510,660,661],{},"needs work",[510,663,664],{},"at risk",".",[507,667,668],{},"The row of blocks on the right is every entry point in the project, worst on the left, best on the right. A wall of tall blocks on the right with a few short ones on the left is a healthy app with a handful of blind spots. A flat low row is an app with no instrumentation at all. On a large project the row is sampled down to the width of your terminal, showing the worst entry point in each bucket.",[670,671,673,674,665],"callout",{"color":672,"icon":102},"neutral","The full calculation — per-rule weights, route weighting, and grade thresholds — is on ",[555,675,99],{"href":100},[646,677,679],{"id":678},"coverage","Coverage",[507,681,682,683,686],{},"Where the score comes from, grouped the way you think about your app rather than by rule. Areas only appear when the project has them: a Nuxt app with no ",[510,684,685],{},"pages\u002F"," never shows a Pages row.",[688,689,690,703],"table",{},[691,692,693],"thead",{},[694,695,696,700],"tr",{},[697,698,699],"th",{},"Area",[697,701,702],{},"What it covers",[704,705,706,715,723,731],"tbody",{},[694,707,708,712],{},[709,710,711],"td",{},"API handlers",[709,713,714],{},"Server route handlers",[694,716,717,720],{},[709,718,719],{},"Pages",[709,721,722],{},"Pages that fetch data server-side",[694,724,725,728],{},[709,726,727],{},"Middleware & jobs",[709,729,730],{},"Middleware, scheduled tasks, server actions",[694,732,733,736],{},[709,734,735],{},"Money & auth",[709,737,738],{},"Every entry point the sensitivity classifier flagged, wherever it lives",[507,740,741,742,745],{},"Money & auth deliberately overlaps the other rows. It is the group where a missing event costs the most, so it gets its own line and a ",[510,743,744],{},"⚠"," marker when it scores below the app as a whole.",[646,747,749],{"id":748},"fix-first","Fix first",[507,751,752],{},"The three entry points with the most to gain, sensitive ones first, worst score first. Each gets the method, the path, a sensitivity marker, a sentence naming the actual problem, and the file, the line, and a docs link for the rule that failed.",[507,754,755,758,759,762,763,766,767,771],{},[510,756,757],{},"$"," is money, ",[510,760,761],{},"A"," is auth, ",[510,764,765],{},"@"," is PII. These come from the ",[555,768,770],{"href":769},"\u002Fcli\u002Fscoring#sensitivity","sensitivity classifier",", and a flagged entry point is held to one extra requirement: an audit trail.",[646,773,775],{"id":774},"then","Then",[507,777,778,779,782],{},"Everything else with a gap, batched by the fix rather than listed one entry point per line. ",[510,780,781],{},"add useLogger + log.set to \u002Fapi\u002Ftest\u002Fbrowser-ingest +4"," means five entry points need the same two lines, so you can work through them in one pass.",[646,784,786],{"id":785},"going-further","Going further",[507,788,789],{},"A separate section that only appears when the project already uses an evlog feature that an entry point is not benefiting from:",[524,791,795],{"className":792,"code":793,"filename":794,"language":639,"meta":530},[637],"GOING FURTHER\nyou already use these — your app could get more out of them\n+ Should these duplicated errors become catalog entries? — 2 entry points\n   server\u002Fapi\u002Forders\u002F[id].get.ts:4 · evlog.dev\u002Flearn\u002Fcatalogs\nSuggestions never change the score.\n","Excerpt",[510,796,793],{"__ignoreMap":530},[507,798,799,800,803,804,665],{},"These are suggestions, not gaps. They are gated on evidence that the feature is already in use somewhere in the project, they are never counted as failures, and a ",[510,801,802],{},"--min-score"," gate can never fail because of one. See ",[555,805,807],{"href":806},"\u002Fcli\u002Frules#opportunities","opportunities",[646,809,811],{"id":810},"the-last-two-lines","The last two lines",[507,813,814,817,818,821,822,825],{},[510,815,816],{},"✓ Already solid"," names entry points with nothing left to fix, so a good app gets told so. ",[510,819,820],{},"▲ 76 → 86 by fixing the 3 above"," is the score you would land on if you fixed exactly what is under ",[514,823,824],{},"FIX FIRST"," — the reason to start there rather than anywhere else.",[624,827,829],{"id":828},"three-views","Three views",[507,831,832],{},"The default report answers \"how am I doing\". Two flags answer the other two questions you will have.",[646,834,836],{"id":835},"every-entry-point","Every entry point",[507,838,839,842],{},[510,840,841],{},"--all"," prints the check matrix: one row per entry point, worst first, grouped by directory.",[524,844,848],{"className":845,"code":846,"filename":847,"language":639,"meta":530},[637],"evlog-playground · Nuxt · 76\u002F100 · 29 entry points, worst first\n\n                                            log   ctx   err   audit catch fetch\nserver\u002F\n├─ api\u002Fauth\u002F[...all].ts   ▰▰▱▱▱▱▱▱▱▱  20 A  ●     ●     ·     ●     ·     ·\n├─ …ment-declined.get.ts  ▰▰▱▱▱▱▱▱▱▱  20 $  ●     ●     ●     ●     ·     ·\n├─ …test\u002Fh3-error.get.ts  ▰▰▰▱▱▱▱▱▱▱  25    ●     ●     ●     ·     ·     ·\n├─ …owser-ingest.post.ts  ▰▰▰▰▰▱▱▱▱▱  45    ●     ●     ·     ·     ·     ·\n├─ …t\u002Fwith-audit.post.ts  ▰▰▰▰▰▰▰▱▱▱  65    ●     ●     ●     ·     ●     ·\n├─ …i\u002Fauth\u002Flogin.post.ts  ▰▰▰▰▰▰▰▰▱▱  75 A  ●     ●     ·     ●     ·     ·\n├─ …ampling\u002Ferror.get.ts  ▰▰▰▰▰▰▰▰▱▱  80    ●     ●     ●     ·     ·     ·\n└─ …st\u002Fwide-event.get.ts  ▰▰▰▰▰▰▰▰▰▰ 100    ●     ●     ·     ·     ·     ·\n\n● covered   ● gap   ·  not applicable   $ money   A auth   @ pii\nwhat each column checks → evlog.dev\u002Fcli\u002Frules\n","evlog map --all (trimmed)",[510,849,846],{"__ignoreMap":530},[507,851,852,853,856,857,860,861,864,865,869,870,665],{},"One column per rule, in the order they cost points. A dot means the rule does not apply here — a handler that throws nothing is not asked whether its errors carry ",[510,854,855],{},"why"," and ",[510,858,859],{},"fix",", and that is a dot rather than a free pass. A hollow ",[510,862,863],{},"○"," is a check you ",[555,866,868],{"href":867},"\u002Fcli\u002Frules#disabling-a-check","disabled with a comment",". Every column is explained on ",[555,871,94],{"href":95},[646,873,875],{"id":874},"one-entry-point","One entry point",[507,877,878],{},"Pass a route or a file path to get the full explanation of a single entry point:",[524,880,882],{"className":526,"code":881,"filename":528,"language":529,"meta":530,"style":530},"evlog map server\u002Fapi\u002Fauth\u002Flogin.post.ts\n# or by route\nevlog map \u002Fapi\u002Fauth\u002Flogin\n",[510,883,884,894,901],{"__ignoreMap":530},[534,885,886,888,891],{"class":536,"line":537},[534,887,541],{"class":540},[534,889,890],{"class":544}," map",[534,892,893],{"class":544}," server\u002Fapi\u002Fauth\u002Flogin.post.ts\n",[534,895,897],{"class":536,"line":896},2,[534,898,900],{"class":899},"sHwdD","# or by route\n",[534,902,904,906,908],{"class":536,"line":903},3,[534,905,541],{"class":540},[534,907,890],{"class":544},[534,909,910],{"class":544}," \u002Fapi\u002Fauth\u002Flogin\n",[632,912,913],{},[524,914,918],{"className":915,"code":916,"filename":917,"language":639,"meta":530},[637],"POST   \u002Fapi\u002Fauth\u002Flogin A   ▰▰▰▰▰▰▰▰▱▱ 75\u002F100\nserver\u002Fapi\u002Fauth\u002Flogin.post.ts · Nuxt\n\nWHY THIS FILE IS SCANNED\n▍ POST \u002Fapi\u002Fauth\u002Flogin — server handler\n\nFLAGGED SENSITIVE BECAUSE\n▍ auth: path says \"auth\"\n\nCHECKS\n✓ useLogger  wide event emitted per request\n✓ log.set    context attached with log.set()\n✗ log.audit  sensitive action with no audit trail  evlog.dev\u002Fuse-cases\u002Faudit\u002Foverview\n\nSUGGESTED SHAPE — Nuxt\n│ export default defineEventHandler(async (event) => {\n│   log.audit({\n│     action: 'auth.login',\n│     actor: { type: 'user', id: user.id },\n│   })\n│ })\n\n▲ fixing this entry point: 75 → 100\n","evlog map server\u002Fapi\u002Fauth\u002Flogin.post.ts",[510,919,916],{"__ignoreMap":530},[507,921,922],{},"Four things worth noting:",[573,924,925,931,937,951],{},[576,926,927,930],{},[514,928,929],{},"Why this file is scanned"," says what the CLI thinks this file is. If that is wrong, everything below it is wrong, and this is where you see it.",[576,932,933,936],{},[514,934,935],{},"Flagged sensitive because"," shows the exact reason, so a false positive is one line to spot instead of a mystery.",[576,938,939,942,943,946,947,950],{},[514,940,941],{},"Suggested shape"," is composed from the rules that actually failed, in your framework's idiom. The audit action is read off the route — ",[510,944,945],{},"\u002Fapi\u002Fauth\u002Flogin"," suggests ",[510,948,949],{},"auth.login",", not a placeholder.",[576,952,953,954,958],{},"When every requirement passes but there are suggestions left, the verdict splits in two: nothing to fix, and ",[955,956,957],"em",{},"n"," things left to gain.",[624,960,962],{"id":961},"what-counts-as-an-entry-point","What counts as an entry point",[507,964,965,966,969],{},"Detection is per framework, from the file layout. ",[510,967,968],{},"--framework"," overrides it when detection guesses wrong.",[971,972,973,979,985,992],"code-group",{},[524,974,977],{"className":975,"code":976,"filename":205,"language":639,"meta":530},[637],"server\u002Fapi\u002F**        → API handler, path prefixed \u002Fapi, method from the filename suffix\nserver\u002Froutes\u002F**     → API handler, path as written\npages\u002F**\u002F*.vue       → page\nserver\u002Fmiddleware\u002F** → middleware\nserver\u002Ftasks\u002F**      → scheduled job\n",[510,978,976],{"__ignoreMap":530},[524,980,983],{"className":981,"code":982,"filename":220,"language":639,"meta":530},[637],"routes\u002F**      → API handler, path as written\napi\u002F**         → API handler, path prefixed \u002Fapi\nmiddleware\u002F**  → middleware\n",[510,984,982],{"__ignoreMap":530},[524,986,990],{"className":987,"code":988,"filename":989,"language":639,"meta":530},[637],"app\u002F**\u002Froute.ts   → one API handler per exported HTTP method (GET, POST, …)\napp\u002F**\u002Fpage.tsx   → page\nmiddleware.ts     → middleware\n\"use server\" file → one server action per exported function\n","Next.js App Router",[510,991,988],{"__ignoreMap":530},[524,993,996],{"className":994,"code":995,"filename":225,"language":639,"meta":530},[637],"src\u002Froutes\u002F** → API handler when the route declares server handlers or createServerFn,\n                page otherwise. __root files are skipped.\n",[510,997,995],{"__ignoreMap":530},[507,999,1000,1001,856,1004,1007,1008,1011,1012,1015,1016,1019,1020,665],{},"Both ",[510,1002,1003],{},"app\u002F",[510,1005,1006],{},"src\u002Fapp\u002F"," are supported for Next.js, and ",[510,1009,1010],{},"src\u002Fmiddleware.ts"," alongside ",[510,1013,1014],{},"middleware.ts",". A ",[510,1017,1018],{},"route.ts"," with no HTTP method exports is listed once with the method ",[510,1021,1022],{},"ANY",[507,1024,1025,1026,592,1028,592,1031,592,1034,1037,1038,1041,1042,1045],{},"Kinds show up in the report as ",[510,1027,1022],{},[510,1029,1030],{},"PAGE",[510,1032,1033],{},"MID",[510,1035,1036],{},"ACT"," (server action), ",[510,1039,1040],{},"CRON",", and ",[510,1043,1044],{},"WS",", or as the HTTP method when the entry point has one.",[670,1047,1049,1050,1053],{"color":672,"icon":1048},"i-lucide-shield-off","evlog's own client-log ingest endpoints are exempt. They are plumbing, not app code, so every rule reports ",[510,1051,1052],{},"n\u002Fa"," for them rather than failing.",[624,1055,1057],{"id":1056},"when-a-verdict-is-wrong","When a verdict is wrong",[507,1059,1060],{},"A check you disagree with should cost you one comment, not your CI gate:",[524,1062,1067],{"className":1063,"code":1064,"filename":1065,"language":1066,"meta":530,"style":530},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F evlog-map-disable-next-line wide-event, context -- liveness probe, deliberately silent\nexport default defineEventHandler(() => ({ ok: true }))\n","server\u002Fapi\u002Fhealth.get.ts","ts",[510,1068,1069,1074],{"__ignoreMap":530},[534,1070,1071],{"class":536,"line":537},[534,1072,1073],{"class":899},"\u002F\u002F evlog-map-disable-next-line wide-event, context -- liveness probe, deliberately silent\n",[534,1075,1076,1080,1083,1087,1091,1095,1099,1102,1105,1109,1112,1116,1119],{"class":536,"line":896},[534,1077,1079],{"class":1078},"s7zQu","export",[534,1081,1082],{"class":1078}," default",[534,1084,1086],{"class":1085},"s2Zo4"," defineEventHandler",[534,1088,1090],{"class":1089},"sTEyZ","(",[534,1092,1094],{"class":1093},"sMK4o","()",[534,1096,1098],{"class":1097},"spNyl"," =>",[534,1100,1101],{"class":1089}," (",[534,1103,1104],{"class":1093},"{",[534,1106,1108],{"class":1107},"swJcz"," ok",[534,1110,1111],{"class":1093},":",[534,1113,1115],{"class":1114},"sfNiH"," true",[534,1117,1118],{"class":1093}," }",[534,1120,1121],{"class":1089},"))\n",[507,1123,1124,1125,1127,1128,665],{},"The check becomes ",[510,1126,1052],{}," with your reason attached, so it stops costing score — and the report says how many checks the project has disabled, so a high score never hides an app that logs nothing. Full syntax on ",[555,1129,94],{"href":867},[624,1131,1133],{"id":1132},"flags","Flags",[688,1135,1136,1149],{},[691,1137,1138],{},[694,1139,1140,1143,1146],{},[697,1141,1142],{},"Flag",[697,1144,1145],{},"Default",[697,1147,1148],{},"What it does",[704,1150,1151,1164,1176,1190,1215,1231,1243,1256],{},[694,1152,1153,1158,1161],{},[709,1154,1155],{},[510,1156,1157],{},"\u003Centry>",[709,1159,1160],{},"—",[709,1162,1163],{},"Inspect one entry point, by route path or file path",[694,1165,1166,1170,1173],{},[709,1167,1168],{},[510,1169,841],{},[709,1171,1172],{},"off",[709,1174,1175],{},"Every entry point as a check matrix",[694,1177,1178,1183,1185],{},[709,1179,1180],{},[510,1181,1182],{},"--min-score \u003Cn>",[709,1184,1172],{},[709,1186,1187,1188],{},"Exit 1 when the global score is below ",[510,1189,957],{},[694,1191,1192,1197,1200],{},[709,1193,1194],{},[510,1195,1196],{},"--framework \u003Cname>",[709,1198,1199],{},"detected",[709,1201,1202,1203,592,1206,592,1209,599,1212],{},"Force ",[510,1204,1205],{},"nuxt",[510,1207,1208],{},"nitro",[510,1210,1211],{},"next",[510,1213,1214],{},"tanstack-start",[694,1216,1217,1222,1225],{},[709,1218,1219],{},[510,1220,1221],{},"--no-write",[709,1223,1224],{},"writes",[709,1226,1227,1228],{},"Skip writing ",[510,1229,1230],{},"evlog.map.json",[694,1232,1233,1238,1240],{},[709,1234,1235],{},[510,1236,1237],{},"--verbose",[709,1239,1172],{},[709,1241,1242],{},"Show per-file parse warnings",[694,1244,1245,1250,1253],{},[709,1246,1247],{},[510,1248,1249],{},"--cwd \u003Cdir>",[709,1251,1252],{},"current",[709,1254,1255],{},"Scan another directory",[694,1257,1258,1263,1265],{},[709,1259,1260],{},[510,1261,1262],{},"--json",[709,1264,1172],{},[709,1266,1267],{},"The full map as JSON on stdout",[624,1269,1230],{"id":1270},"evlogmapjson",[507,1272,1273,1274,1276,1277,1279],{},"Every run writes ",[510,1275,1230],{}," to the project root: the score, the framework, and every entry point with its checks, its suggestions, its sensitivity, and its own score. It is the same data ",[510,1278,1262],{}," prints.",[507,1281,1282,1283,1285,1286,1290],{},"Use ",[510,1284,1221],{}," when you do not want the file — CI runs, or a quick look at somebody else's project. The file is a build artifact, so ",[555,1287,1289],{"href":1288},"\u002Fcli\u002Fci#the-map-file","gitignore it"," unless you have a reason to track it.",[624,1292,1294],{"id":1293},"what-it-will-not-tell-you","What it will not tell you",[507,1296,1297],{},"Static analysis has limits, and knowing them is the difference between trusting the score and being annoyed by it.",[573,1299,1300,1306,1316,1322],{},[576,1301,1302,1305],{},[514,1303,1304],{},"It reads code, not traffic."," An entry point can score 100 and still emit useless events at runtime if the context it attaches is wrong. The score says the shape is there.",[576,1307,1308,1311,1312,1315],{},[514,1309,1310],{},"It follows imports one hop."," Helpers re-exported through a local module are resolved — ",[510,1313,1314],{},"import { useLogger } from '@\u002Flib\u002Fevlog'"," counts — but a logger passed through three layers of your own abstraction may not be recognised.",[576,1317,1318,1321],{},[514,1319,1320],{},"Four frameworks."," Nuxt, Nitro, Next.js App Router, and TanStack Start have adapters. Other frameworks that evlog integrates with are not scanned yet.",[576,1323,1324,1327,1328,1331],{},[514,1325,1326],{},"Sensitivity is a heuristic."," It reads imports and route paths. ",[510,1329,1330],{},"evlog map \u003Cfile>"," always shows the reason, so a wrong call is visible rather than silent.",[624,1333,1334],{"id":1211},"Next",[573,1336,1337,1342,1347],{},[576,1338,1339,1341],{},[555,1340,94],{"href":95}," — every check, what satisfies it, and the exact fix",[576,1343,1344,1346],{},[555,1345,99],{"href":100}," — weights, grades, and the sensitivity classifier",[576,1348,1349,1351],{},[555,1350,104],{"href":105}," — gate a pull request on the score",[1353,1354,1355],"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);}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 .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 .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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":530,"searchDepth":896,"depth":896,"links":1357},[1358,1366,1370,1371,1372,1373,1374,1375],{"id":626,"depth":896,"text":627,"children":1359},[1360,1361,1362,1363,1364,1365],{"id":648,"depth":903,"text":649},{"id":678,"depth":903,"text":679},{"id":748,"depth":903,"text":749},{"id":774,"depth":903,"text":775},{"id":785,"depth":903,"text":786},{"id":810,"depth":903,"text":811},{"id":828,"depth":896,"text":829,"children":1367},[1368,1369],{"id":835,"depth":903,"text":836},{"id":874,"depth":903,"text":875},{"id":961,"depth":896,"text":962},{"id":1056,"depth":896,"text":1057},{"id":1132,"depth":896,"text":1133},{"id":1270,"depth":896,"text":1230},{"id":1293,"depth":896,"text":1294},{"id":1211,"depth":896,"text":1334},"A static observability score for your app, Lighthouse-style. Scans every entry point in a Nuxt, Nitro, Next.js, or TanStack Start project, scores wide-event coverage, and names the entry points to fix first.","md",[1379,1381],{"label":94,"icon":97,"to":95,"color":672,"variant":1380},"subtle",{"label":99,"icon":102,"to":100,"color":672,"variant":1380},{},{"title":89,"icon":92},{"title":502,"description":1376},"rXBt1OcozHSDGkWRCJZwPnszVH9V66N9ku9mbolYnCs",[1387,1389],{"title":36,"path":86,"stem":87,"description":1388,"icon":44,"children":-1},"The evlog command line — map your app's observability coverage, diagnose your setup, and control telemetry. Install, global flags, output streams, exit codes, and monorepo behaviour.",{"title":94,"path":95,"stem":96,"description":1390,"icon":97,"children":-1},"Every check evlog map runs — the six requirements that move the score, the four suggestions that never do, what satisfies each one, and how evlog helpers are recognised in your code.",1785016732733]