[{"data":1,"prerenderedAt":324},["ShallowReactive",2],{"docs-\u002Fdocs\u002Fcontributing":3,"docs-navigation":251},{"id":4,"title":5,"body":6,"description":244,"extension":245,"meta":246,"navTitle":5,"navigation":176,"path":247,"seo":248,"stem":249,"__hash__":250},"docs\u002Fdocs\u002F6.contributing.md","Contributing",{"type":7,"value":8,"toc":238},"minimark",[9,14,63,67,75,100,103,125,131,134,184,191,195,206,221,225,234],[10,11,13],"h2",{"id":12},"repository-layout","Repository layout",[15,16,17,25,31,43,49],"ul",{},[18,19,20,24],"li",{},[21,22,23],"code",{},"Nafas.Observability\u002F"," — the package itself.",[18,26,27,30],{},[21,28,29],{},"Nafas.Dashboard.TestHost\u002F"," — a minimal ASP.NET Core app used to manually\nverify the package end to end; not a usage example to copy patterns\nfrom.",[18,32,33,36,37,42],{},[21,34,35],{},"Nafas.Observability.Server\u002F"," — the optional standalone HTTP listener\npackage for non-ASP.NET Core apps (no Kestrel, no OWIN); see\n",[38,39,41],"a",{"href":40},"\u002Fdocs\u002Fdeployment\u002Fdesktop-apps","Desktop and other non-ASP.NET Core apps",".",[18,44,45,48],{},[21,46,47],{},"Nafas.Observability.Server.Sample\u002F"," — a WPF app demonstrating it, with a\nsettings-screen-style checkbox to enable\u002Fdisable the dashboard server,\npick its port, and choose localhost-only vs. LAN access at runtime.",[18,50,51,54,55,58,59,62],{},[21,52,53],{},"Nafas.Observability.Server.NetFrameworkSample\u002F"," — a plain ",[21,56,57],{},"net48","\nconsole app; not a usage pattern to copy, but an actual classic .NET\nFramework process used to empirically verify the whole stack rather than\njust relying on ",[21,60,61],{},"netstandard2.0","'s TFM compatibility claim.",[10,64,66],{"id":65},"local-development","Local development",[68,69,70,71,74],"p",{},"For normal use of the published package, no Node.js\u002Fnpm step is needed at\nall — the dashboard UI is already built and committed under\n",[21,72,73],{},"Nafas.Observability\u002Fwwwroot\u002F",". Just build the solution:",[76,77,82],"pre",{"className":78,"code":79,"language":80,"meta":81,"style":81},"language-bash shiki shiki-themes github-light github-dark","dotnet build nafas.observability.sln\n","bash","",[21,83,84],{"__ignoreMap":81},[85,86,89,93,97],"span",{"class":87,"line":88},"line",1,[85,90,92],{"class":91},"sScJk","dotnet",[85,94,96],{"class":95},"sZZnC"," build",[85,98,99],{"class":95}," nafas.observability.sln\n",[68,101,102],{},"To try the package locally end to end:",[76,104,106],{"className":78,"code":105,"language":80,"meta":81,"style":81},"cd Nafas.Dashboard.TestHost\ndotnet run\n",[21,107,108,117],{"__ignoreMap":81},[85,109,110,114],{"class":87,"line":88},[85,111,113],{"class":112},"sj4cs","cd",[85,115,116],{"class":95}," Nafas.Dashboard.TestHost\n",[85,118,120,122],{"class":87,"line":119},2,[85,121,92],{"class":91},[85,123,124],{"class":95}," run\n",[68,126,127,128,42],{},"then open ",[21,129,130],{},"http:\u002F\u002Flocalhost:\u003Cport>\u002Fnafas",[68,132,133],{},"To change the dashboard UI itself:",[76,135,137],{"className":78,"code":136,"language":80,"meta":81,"style":81},"cd Nafas.Observability\u002FClientApp\nnpm install        # first time only\nnpm run build       # output goes to ClientApp\u002Fdist\u002F\n\n# then replace (not merge) the contents of ..\u002Fwwwroot\u002F with dist\u002F's contents\n",[21,138,139,146,158,171,178],{"__ignoreMap":81},[85,140,141,143],{"class":87,"line":88},[85,142,113],{"class":112},[85,144,145],{"class":95}," Nafas.Observability\u002FClientApp\n",[85,147,148,151,154],{"class":87,"line":119},[85,149,150],{"class":91},"npm",[85,152,153],{"class":95}," install",[85,155,157],{"class":156},"sJ8bj","        # first time only\n",[85,159,161,163,166,168],{"class":87,"line":160},3,[85,162,150],{"class":91},[85,164,165],{"class":95}," run",[85,167,96],{"class":95},[85,169,170],{"class":156},"       # output goes to ClientApp\u002Fdist\u002F\n",[85,172,174],{"class":87,"line":173},4,[85,175,177],{"emptyLinePlaceholder":176},true,"\n",[85,179,181],{"class":87,"line":180},5,[85,182,183],{"class":156},"# then replace (not merge) the contents of ..\u002Fwwwroot\u002F with dist\u002F's contents\n",[68,185,186,187,190],{},"then ",[21,188,189],{},"dotnet build"," again so the updated files are re-embedded. The\npublish workflow does this same rebuild-and-sync step from source on\nevery release, so a tagged release never ships a stale UI.",[10,192,194],{"id":193},"status","Status",[68,196,197,201,202,205],{},[198,199,200],"strong",{},"Feature-complete for the free tier."," Logs, metrics, traces, alerting,\nthe embedded dashboard, and the standalone desktop\u002Fconsole server\n(",[21,203,204],{},"Nafas.Observability.Server",") are all shipped — no further feature work\nis planned for this scope. From here, changes to the free tier are bug\nfixes and hardening, not new capability.",[68,207,208,209,212,213,216,217,220],{},"Still pre-1.0, and that status is about proof, not scope: real ingestion,\nstorage, dashboard, and alert evaluation all work and are exercised\nthrough ",[21,210,211],{},"Nafas.Dashboard.TestHost",", but neither package has yet run in a\nreal production deployment or been through a real upgrade cycle. The\npublic API surface (",[21,214,215],{},"NafasServerOptions",", ",[21,218,219],{},"UseNafasDashboard",") is expected\nto stay stable regardless.",[10,222,224],{"id":223},"license","License",[68,226,227,233],{},[38,228,232],{"href":229,"rel":230},"https:\u002F\u002Ffsl.software",[231],"nofollow","FSL-1.1-ALv2"," — free to use, modify and redistribute\nfor any purpose other than building a competing product or service; each\nrelease converts to the Apache License, Version 2.0 two years after it\nships.",[235,236,237],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}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 .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":81,"searchDepth":119,"depth":119,"links":239},[240,241,242,243],{"id":12,"depth":119,"text":13},{"id":65,"depth":119,"text":66},{"id":193,"depth":119,"text":194},{"id":223,"depth":119,"text":224},"Repository layout, local development, project status, and license.","md",{},"\u002Fdocs\u002Fcontributing",{"title":5,"description":244},"docs\u002F6.contributing","aK-9SzK7rzpZwcQ1EXCwvYUxneutObo1uGjurCfM0Ko",[252],{"title":253,"path":254,"stem":255,"children":256,"page":-1},"Docs","\u002Fdocs","docs",[257,260,278,291,304,315,323],{"title":258,"path":254,"stem":259},"Documentation","docs\u002Findex",{"title":261,"path":262,"stem":263,"children":264,"page":277},"Getting Started","\u002Fdocs\u002Fgetting-started","docs\u002F1.getting-started",[265,269,273],{"title":266,"path":267,"stem":268},"Why Nafas","\u002Fdocs\u002Fgetting-started\u002Fwhy-nafas","docs\u002F1.getting-started\u002F1.why-nafas",{"title":270,"path":271,"stem":272},"Quick start","\u002Fdocs\u002Fgetting-started\u002Fquick-start","docs\u002F1.getting-started\u002F2.quick-start",{"title":274,"path":275,"stem":276},"Requirements","\u002Fdocs\u002Fgetting-started\u002Frequirements","docs\u002F1.getting-started\u002F3.requirements",false,{"title":279,"path":280,"stem":281,"children":282,"page":277},"How It Works","\u002Fdocs\u002Fhow-it-works","docs\u002F2.how-it-works",[283,287],{"title":284,"path":285,"stem":286},"What gets captured, and how","\u002Fdocs\u002Fhow-it-works\u002Fwhat-gets-captured","docs\u002F2.how-it-works\u002F1.what-gets-captured",{"title":288,"path":289,"stem":290},"How it's built internally","\u002Fdocs\u002Fhow-it-works\u002Finternals","docs\u002F2.how-it-works\u002F2.internals",{"title":292,"path":293,"stem":294,"children":295,"page":277},"Configuration","\u002Fdocs\u002Fconfiguration","docs\u002F3.configuration",[296,300],{"title":297,"path":298,"stem":299},"Configuration options","\u002Fdocs\u002Fconfiguration\u002Foptions","docs\u002F3.configuration\u002F1.options",{"title":301,"path":302,"stem":303},"Security","\u002Fdocs\u002Fconfiguration\u002Fsecurity","docs\u002F3.configuration\u002F2.security",{"title":305,"path":306,"stem":307,"children":308,"page":277},"Deployment","\u002Fdocs\u002Fdeployment","docs\u002F4.deployment",[309,313],{"title":310,"path":311,"stem":312},"Multi-instance deployments","\u002Fdocs\u002Fdeployment\u002Fmulti-instance","docs\u002F4.deployment\u002F1.multi-instance",{"title":41,"path":40,"stem":314},"docs\u002F4.deployment\u002F2.desktop-apps",{"title":316,"path":317,"stem":318,"children":319,"page":277},"Alerting","\u002Fdocs\u002Falerting","docs\u002F5.alerting",[320],{"title":316,"path":321,"stem":322},"\u002Fdocs\u002Falerting\u002Falert-rules","docs\u002F5.alerting\u002F1.alert-rules",{"title":5,"path":247,"stem":249},1789838144161]