[{"data":1,"prerenderedAt":520},["ShallowReactive",2],{"navigation_docs":3,"-monitoring-dynamic-detection":244,"-monitoring-dynamic-detection-surround":515},[4,51,78,229],{"title":5,"icon":6,"modifiedAt":7,"path":8,"stem":9,"children":10,"page":6},"Getting Started",false,"2026-04-30T19:15:33.000Z","\u002Fgetting-started","1.getting-started",[11,16,21,26,31,36,41,46],{"title":12,"path":13,"stem":14,"icon":15},"Quickstart","\u002Fgetting-started\u002Fquickstart","1.getting-started\u002F1.quickstart","i-lucide-fast-forward",{"title":17,"path":18,"stem":19,"icon":20},"Core Concepts","\u002Fgetting-started\u002Fcore-concepts","1.getting-started\u002F2.core-concepts","i-lucide-workflow",{"title":22,"path":23,"stem":24,"icon":25},"Configs Anatomy","\u002Fgetting-started\u002Fconfigs","1.getting-started\u002F3.configs","i-lucide-file-cog",{"title":27,"path":28,"stem":29,"icon":30},"Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F4.architecture","i-lucide-layers",{"title":32,"path":33,"stem":34,"icon":35},"JSON Schema Validation","\u002Fgetting-started\u002Fjson-schema-validation","1.getting-started\u002F5.json-schema-validation","i-lucide-braces",{"title":37,"path":38,"stem":39,"icon":40},"Testing Rules","\u002Fgetting-started\u002Ftesting-targeting-rules","1.getting-started\u002F6.testing-targeting-rules","i-lucide-flask-conical",{"title":42,"path":43,"stem":44,"icon":45},"Segments","\u002Fgetting-started\u002Fsegments","1.getting-started\u002F7.segments","i-lucide-squares-intersect",{"title":47,"path":48,"stem":49,"icon":50},"Pricing & Billing","\u002Fgetting-started\u002Fpricing-and-billing","1.getting-started\u002F8.pricing-and-billing","i-lucide-credit-card",{"title":52,"modifiedAt":53,"defaultOpen":54,"path":55,"stem":56,"children":57,"page":6},"Monitoring","2026-09-24T23:33:20.000Z",true,"\u002Fmonitoring","2.monitoring",[58,63,68,73],{"title":59,"path":60,"stem":61,"icon":62},"Activity","\u002Fmonitoring\u002Factivity","2.monitoring\u002F1.activity","i-lucide-activity",{"title":64,"path":65,"stem":66,"icon":67},"Lifecycle","\u002Fmonitoring\u002Flifecycle","2.monitoring\u002F2.lifecycle","i-lucide-recycle",{"title":69,"path":70,"stem":71,"icon":72},"Alerts","\u002Fmonitoring\u002Falerts","2.monitoring\u002F3.alerts","i-lucide-bell",{"title":74,"path":75,"stem":76,"icon":77},"Dynamic Detection","\u002Fmonitoring\u002Fdynamic-detection","2.monitoring\u002F4.dynamic-detection","i-lucide-hat-glasses",{"title":79,"modifiedAt":53,"defaultOpen":54,"path":80,"stem":81,"children":82,"page":6},"SDKs","\u002Fsdks","3.sdks",[83,88,109,134,150,181,224],{"title":84,"path":85,"stem":86,"icon":87},"Available SDKs","\u002Fsdks\u002Favailable-sdks","3.sdks\u002F1.available-sdks","i-lucide-list",{"title":89,"modifiedAt":53,"icon":90,"defaultOpen":6,"path":91,"stem":92,"children":93,"page":6},"Browser SDKs","i-lucide-monitor","\u002Fsdks\u002Fbrowser","3.sdks\u002F2.browser",[94,99,104],{"title":95,"path":96,"stem":97,"icon":98},"Javascript","\u002Fsdks\u002Fbrowser\u002Fjavascript","3.sdks\u002F2.browser\u002F1.javascript","cd-logos-javascript",{"title":100,"path":101,"stem":102,"icon":103},"React","\u002Fsdks\u002Fbrowser\u002Freact","3.sdks\u002F2.browser\u002F2.react","cd-logos-react-light",{"title":105,"path":106,"stem":107,"icon":108},"Vue","\u002Fsdks\u002Fbrowser\u002Fvue","3.sdks\u002F2.browser\u002F3.vue","cd-logos-vue",{"title":110,"modifiedAt":53,"icon":111,"defaultOpen":6,"path":112,"stem":113,"children":114,"page":6},"Mobile SDKs","i-lucide-smartphone","\u002Fsdks\u002Fmobile","3.sdks\u002F3.mobile",[115,119,124,129],{"title":116,"path":117,"stem":118,"icon":103},"React Native","\u002Fsdks\u002Fmobile\u002Freact-native","3.sdks\u002F3.mobile\u002F1.react-native",{"title":120,"path":121,"stem":122,"icon":123},"Flutter","\u002Fsdks\u002Fmobile\u002Fflutter","3.sdks\u002F3.mobile\u002F2.flutter","cd-logos-flutter",{"title":125,"path":126,"stem":127,"icon":128},"Swift","\u002Fsdks\u002Fmobile\u002Fswift","3.sdks\u002F3.mobile\u002F3.swift","cd-logos-swift",{"title":130,"path":131,"stem":132,"icon":133},"Android","\u002Fsdks\u002Fmobile\u002Fandroid","3.sdks\u002F3.mobile\u002F4.android","cd-logos-android",{"title":135,"modifiedAt":53,"icon":136,"defaultOpen":6,"path":137,"stem":138,"children":139,"page":6},"Meta-framework SDKs","i-lucide-monitor-smartphone","\u002Fsdks\u002Fmeta","3.sdks\u002F4.meta",[140,145],{"title":141,"path":142,"stem":143,"icon":144},"Next.js","\u002Fsdks\u002Fmeta\u002Fnextjs","3.sdks\u002F4.meta\u002F1.nextjs","cd-logos-nextjs",{"title":146,"path":147,"stem":148,"icon":149},"Nuxt","\u002Fsdks\u002Fmeta\u002Fnuxt","3.sdks\u002F4.meta\u002F2.nuxt","cd-logos-nuxt",{"title":151,"modifiedAt":53,"icon":152,"defaultOpen":6,"path":153,"stem":154,"children":155,"page":6},"Server SDKs","i-lucide-server","\u002Fsdks\u002Fserver","3.sdks\u002F5.server",[156,161,166,171,176],{"title":157,"path":158,"stem":159,"icon":160},"Node.js","\u002Fsdks\u002Fserver\u002Fnode-js","3.sdks\u002F5.server\u002F1.node-js","cd-logos-nodejs",{"title":162,"path":163,"stem":164,"icon":165},"Python","\u002Fsdks\u002Fserver\u002Fpython","3.sdks\u002F5.server\u002F2.python","cd-logos-python",{"title":167,"path":168,"stem":169,"icon":170},"Java","\u002Fsdks\u002Fserver\u002Fjava","3.sdks\u002F5.server\u002F3.java","cd-logos-java",{"title":172,"path":173,"stem":174,"icon":175},".NET","\u002Fsdks\u002Fserver\u002Fdotnet","3.sdks\u002F5.server\u002F4.dotnet","cd-logos-dotnet",{"title":177,"path":178,"stem":179,"icon":180},"Go","\u002Fsdks\u002Fserver\u002Fgo","3.sdks\u002F5.server\u002F5.go","cd-logos-go",{"title":182,"modifiedAt":53,"icon":183,"defaultOpen":6,"path":184,"stem":185,"children":186,"page":6},"OpenFeature Providers","cd-logos-openfeature","\u002Fsdks\u002Fopenfeature","3.sdks\u002F6.openfeature",[187,192,196,200,204,208,212,216,220],{"title":188,"path":189,"stem":190,"icon":183,"icons":191},"Web","\u002Fsdks\u002Fopenfeature\u002Fweb","3.sdks\u002F6.openfeature\u002F1.web",[183,98],{"title":125,"path":193,"stem":194,"icon":183,"icons":195},"\u002Fsdks\u002Fopenfeature\u002Fswift","3.sdks\u002F6.openfeature\u002F2.swift",[183,128],{"title":130,"path":197,"stem":198,"icon":183,"icons":199},"\u002Fsdks\u002Fopenfeature\u002Fandroid","3.sdks\u002F6.openfeature\u002F3.android",[183,133],{"title":120,"path":201,"stem":202,"icon":183,"icons":203},"\u002Fsdks\u002Fopenfeature\u002Fflutter","3.sdks\u002F6.openfeature\u002F4.flutter",[183,123],{"title":157,"path":205,"stem":206,"icon":183,"icons":207},"\u002Fsdks\u002Fopenfeature\u002Fnode-js","3.sdks\u002F6.openfeature\u002F5.node-js",[183,160],{"title":162,"path":209,"stem":210,"icon":183,"icons":211},"\u002Fsdks\u002Fopenfeature\u002Fpython","3.sdks\u002F6.openfeature\u002F6.python",[183,165],{"title":167,"path":213,"stem":214,"icon":183,"icons":215},"\u002Fsdks\u002Fopenfeature\u002Fjava","3.sdks\u002F6.openfeature\u002F7.java",[183,170],{"title":172,"path":217,"stem":218,"icon":183,"icons":219},"\u002Fsdks\u002Fopenfeature\u002Fdotnet","3.sdks\u002F6.openfeature\u002F8.dotnet",[183,175],{"title":177,"path":221,"stem":222,"icon":183,"icons":223},"\u002Fsdks\u002Fopenfeature\u002Fgo","3.sdks\u002F6.openfeature\u002F9.go",[183,180],{"title":225,"path":226,"stem":227,"icon":228},"Maven Repository","\u002Fsdks\u002Fmaven-repository","3.sdks\u002F7.maven-repository","i-lucide-package",{"title":230,"modifiedAt":53,"defaultOpen":54,"path":231,"stem":232,"children":233,"page":6},"Integrations","\u002Fintegrations","4.integrations",[234,239],{"title":235,"path":236,"stem":237,"icon":238},"Terraform","\u002Fintegrations\u002Fterraform","4.integrations\u002F1.terraform","cd-logos-terraform",{"title":240,"path":241,"stem":242,"icon":243},"MCP","\u002Fintegrations\u002Fmcp","4.integrations\u002F2.mcp","cd-logos-mcp",{"id":245,"title":74,"body":246,"description":506,"extension":507,"links":508,"meta":509,"navigation":511,"path":75,"seo":512,"stem":76,"__hash__":514},"docs\u002F2.monitoring\u002F4.dynamic-detection.md",{"type":247,"value":248,"toc":497},"minimark",[249,269,277,282,285,302,318,324,328,338,341,352,356,359,377,380,452,457,460,467,470,473,494],[250,251,252,253,258,259,263,264,268],"p",{},"Some of what ConfigDirector tells you is concluded from silence: a temporary config that your applications have stopped evaluating is ",[254,255,257],"a",{"href":256},"\u002Fmonitoring\u002Flifecycle#archive-ready-temporary-configs","ready to archive",", an old key left behind by a ",[254,260,262],{"href":261},"\u002Fgetting-started\u002Fconfigs#key","rename"," is removed once your applications stop using it, and an ",[254,265,267],{"href":266},"#application-request-alerts","alert about requests your applications make",", such as requesting a config key that does not exist, resolves once they stop. How long that silence has to last depends on how often the thing being watched usually happens. A flag that is read on every app request and then goes for two entire days without an evaluation is almost certainly gone from the code. A flag read by a weekly job that goes a week without evaluations, is simply waiting for the next job run.",[250,270,271,272,276],{},"So instead of one fixed wait for everything, ConfigDirector gives each config its own wait, called its ",[273,274,275],"strong",{},"quiet window",", based on how often it has been evaluated recently. A config that your applications read all the time gets a short window, and one read on a schedule gets a window long enough to cover the usual pause between runs, with room to spare. The window is worked out again every 30 minutes, so it follows changes in how your applications use the config. To see a temporary config's current quiet window once it has been evaluated, hover its status in the configs list.",[278,279,281],"h2",{"id":280},"an-example","An example",[250,283,284],{},"Take two temporary feature flags that have both been evaluated in production for months:",[286,287,288,296],"ul",{},[289,290,291,295],"li",{},[292,293,294],"code",{},"new-checkout"," is read by the web app on every page load, many times a minute. Its quiet window is 4 days, the shortest allowed.",[289,297,298,301],{},[292,299,300],{},"invoice-layout-v2"," is read only by a billing job that runs every Monday. A week without an evaluation is normal for it, so its quiet window is 14 days.",[250,303,304,305,307,308,311,312,314,315,317],{},"When the code that reads ",[292,306,294],{}," is removed, the flag becomes ",[273,309,310],{},"Archive Ready"," 4 days after its last evaluation. ",[292,313,300],{}," becomes ",[273,316,310],{}," only after two weeks without an evaluation, so a single skipped run does not mark it ready to archive.",[250,319,320,321,323],{},"With one fixed wait of 4 days for both, ",[292,322,300],{}," would be marked ready to archive every Friday while the job still depends on it, and archiving it would leave the next Monday's run with its in-code default value.",[278,325,327],{"id":326},"give-each-application-its-own-app-name","Give each application its own app name",[250,329,330,331,333,334,337],{},"A flag is often read by more than one application, or by more than one component within an application. Say the web app also reads ",[292,332,300],{}," all day, every day, while the billing job keeps reading it every Monday. Give the web app and the job different app names when they initialize the ConfigDirector SDK. ConfigDirector can then tell them apart and see the two distinct usage patterns, so the flag keeps the 14-day quiet window that covers the weekly job. Even after the web app stops reading the flag, it stays ",[273,335,336],{},"In use"," for as long as the job keeps running.",[250,339,340],{},"Without different app names, the web app and the job would look like a single application to ConfigDirector. The job's evaluations then mix in with the web app's constant stream, the flag looks like one that is read all the time, and it gets the 4-day quiet window. Once the web app stops reading the flag, it would be marked ready to archive between the job's runs.",[250,342,343,344,347,348,351],{},"The setting is called ",[292,345,346],{},"appName"," in most SDKs, and each ",[254,349,350],{"href":85},"SDK's page"," shows where to set it.",[278,353,355],{"id":354},"safety-limits","Safety limits",[250,357,358],{},"Every quiet window is kept between a minimum and a maximum:",[286,360,361,368],{},[289,362,363,364,367],{},"The ",[273,365,366],{},"minimum"," is the shortest the window can be, however often the config is evaluated. It is a safety margin for uses that are easy to miss, such as a daily job inside the same application as busy web traffic, whose evaluations mix in with that traffic.",[289,369,363,370,373,374,376],{},[273,371,372],{},"maximum"," is the longest the window can be, however rarely the config is evaluated. A config read only every few months, such as by a quarterly job, can become ",[273,375,310],{}," between runs, so check when it was last evaluated before you archive it.",[250,378,379],{},"Until a config has been evaluated for long enough to show its usual pace, its quiet window has a fixed length instead. A config first evaluated 3 days ago has a quiet window of 7 days, so it cannot be marked ready to archive until a week after that first evaluation.",[381,382,383,402],"table",{},[384,385,386],"thead",{},[387,388,389,393,396,399],"tr",{},[390,391,392],"th",{},"Quiet window",[390,394,395],{},"Minimum",[390,397,398],{},"Maximum",[390,400,401],{},"Until there is enough history",[403,404,405,421,437],"tbody",{},[387,406,407,412,415,418],{},[408,409,410],"td",{},[254,411,310],{"href":256},[408,413,414],{},"4 days",[408,416,417],{},"45 days",[408,419,420],{},"7 days",[387,422,423,429,432,435],{},[408,424,425],{},[254,426,428],{"href":427},"#old-keys","Old keys",[408,430,431],{},"35 days",[408,433,434],{},"None",[408,436,431],{},[387,438,439,444,447,449],{},[408,440,441],{},[254,442,443],{"href":266},"Application request alerts",[408,445,446],{},"1 hour",[408,448,420],{},[408,450,451],{},"24 hours",[250,453,454,456],{},[254,455,310],{"href":256}," explains which environments' evaluations count toward a config's quiet window.",[278,458,428],{"id":459},"old-keys",[250,461,462,463,466],{},"When you ",[254,464,465],{"href":261},"rename a config"," that is in use, its old key keeps working alongside the new one. ConfigDirector removes an old key once it has gone its quiet window without an evaluation in any environment, and your applications have evaluated a newer key since. The wait never starts before the rename, so every old key is kept for at least 35 days. If no newer key is ever evaluated, the old key stays. Old keys are checked twice a day.",[250,468,469],{},"The 35-day minimum covers jobs that run at least once a month. An old key read less often, such as by a quarterly job, can be removed between runs, so update those jobs to the new key before their next run.",[278,471,443],{"id":472},"application-request-alerts",[250,474,363,475,479,480,479,484,488,489,493],{},[254,476,478],{"href":477},"\u002Fmonitoring\u002Falerts#config-not-found","Config not found",", ",[254,481,483],{"href":482},"\u002Fmonitoring\u002Falerts#client-sdk-requested-a-server-only-config","Client SDK requested a server-only config",[254,485,487],{"href":486},"\u002Fmonitoring\u002Falerts#server-sdk-requested-a-client-only-config","Server SDK requested a client-only config"," and ",[254,490,492],{"href":491},"\u002Fmonitoring\u002Falerts#config-type-mismatch","Config type mismatch"," alerts resolve once the requests behind them stop for the alert's quiet window. That window is sized from how often those particular requests usually happened, not from how often the config is evaluated overall: a key that a nightly job keeps misspelling is requested once a day, so its alert waits about two days of silence before resolving, while an alert about a typo in a page that is loaded all day resolves about an hour after the fix ships. The alert's details show the current length of its quiet window, and the window is worked out again at every check.",[250,495,496],{},"Until the requests have been seen for a full day, the window is 24 hours. It is never shorter than 1 hour or longer than 7 days, so an alert about requests that only a weekly job makes can resolve between runs and be raised again at the next one.",{"title":498,"searchDepth":499,"depth":499,"links":500},"",2,[501,502,503,504,505],{"id":280,"depth":499,"text":281},{"id":326,"depth":499,"text":327},{"id":354,"depth":499,"text":355},{"id":459,"depth":499,"text":428},{"id":472,"depth":499,"text":443},"How ConfigDirector decides how long a config must go without evaluations before it is ready to archive, how long an old key is kept after a rename, and how long an application request alert waits before resolving, based on how often each usually happens","md",null,{"modifiedAt":510},"2026-10-12T05:25:16.000Z",{"title":74,"icon":77},{"title":74,"description":513},"Why ConfigDirector waits longer before marking a feature flag ready to archive, or resolving an alert, when a weekly job is behind it than when it happens all day, and how long each wait can be.","xMnDudPRnl6C6XYs55ErZylrwK7NsdkSG6k7vJqq3Q4",[516,518],{"title":69,"path":70,"stem":71,"description":517,"icon":72,"children":-1},"What ConfigDirector watches for in your applications' use of configs, how alerts are prioritized and delivered, and what to do about each one",{"title":84,"path":85,"stem":86,"description":519,"icon":87,"children":-1},"Browse the ConfigDirector SDKs for browsers, mobile apps, Next.js and Nuxt, servers, and OpenFeature providers",1791783864026]