[{"data":1,"prerenderedAt":399},["ShallowReactive",2],{"navigation_docs":3,"-getting-started-configs":99,"-getting-started-configs-surround":394},[4,30],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting Started",false,"\u002Fgetting-started","1.getting-started",[10,15,20,25],{"title":11,"path":12,"stem":13,"icon":14},"Quickstart","\u002Fgetting-started\u002Fquickstart","1.getting-started\u002F1.quickstart","i-lucide-fast-forward",{"title":16,"path":17,"stem":18,"icon":19},"Core Concepts","\u002Fgetting-started\u002Fcore-concepts","1.getting-started\u002F2.core-concepts","i-lucide-workflow",{"title":21,"path":22,"stem":23,"icon":24},"Configs Anatomy","\u002Fgetting-started\u002Fconfigs","1.getting-started\u002F3.configs","i-lucide-file-cog",{"title":26,"path":27,"stem":28,"icon":29},"Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F4.architecture","i-lucide-layers",{"title":31,"defaultOpen":32,"path":33,"stem":34,"children":35,"page":6},"SDKs",true,"\u002Fsdks","2.sdks",[36,41,62,72,88],{"title":37,"path":38,"stem":39,"icon":40},"Available SDKs","\u002Fsdks\u002Favailable-sdks","2.sdks\u002F1.available-sdks","i-lucide-list",{"title":42,"icon":43,"defaultOpen":32,"path":44,"stem":45,"children":46,"page":6},"Browser SDKs","i-lucide-monitor","\u002Fsdks\u002Fbrowser","2.sdks\u002F2.browser",[47,52,57],{"title":48,"path":49,"stem":50,"icon":51},"Javascript","\u002Fsdks\u002Fbrowser\u002Fjavascript","2.sdks\u002F2.browser\u002F1.javascript","cd-logos-javascript",{"title":53,"path":54,"stem":55,"icon":56},"React","\u002Fsdks\u002Fbrowser\u002Freact","2.sdks\u002F2.browser\u002F2.react","cd-logos-react-light",{"title":58,"path":59,"stem":60,"icon":61},"Vue","\u002Fsdks\u002Fbrowser\u002Fvue","2.sdks\u002F2.browser\u002F3.vue","cd-logos-vue",{"title":63,"icon":64,"defaultOpen":32,"path":65,"stem":66,"children":67,"page":6},"Mobile SDKs","i-lucide-smartphone","\u002Fsdks\u002Fmobile","2.sdks\u002F3.mobile",[68],{"title":69,"path":70,"stem":71,"icon":56},"React Native","\u002Fsdks\u002Fmobile\u002Freact-native","2.sdks\u002F3.mobile\u002F1.react-native",{"title":73,"icon":74,"defaultOpen":32,"path":75,"stem":76,"children":77,"page":6},"Meta-framework SDKs","i-lucide-monitor-smartphone","\u002Fsdks\u002Fmeta","2.sdks\u002F4.meta",[78,83],{"title":79,"path":80,"stem":81,"icon":82},"Next.js","\u002Fsdks\u002Fmeta\u002Fnextjs","2.sdks\u002F4.meta\u002F1.nextjs","cd-logos-nextjs",{"title":84,"path":85,"stem":86,"icon":87},"Nuxt","\u002Fsdks\u002Fmeta\u002Fnuxt","2.sdks\u002F4.meta\u002F2.nuxt","cd-logos-nuxt",{"title":89,"icon":90,"defaultOpen":32,"path":91,"stem":92,"children":93,"page":6},"Server SDKs","i-lucide-server","\u002Fsdks\u002Fserver","2.sdks\u002F5.server",[94],{"title":95,"path":96,"stem":97,"icon":98},"Node.js","\u002Fsdks\u002Fserver\u002Fnode-js","2.sdks\u002F5.server\u002F1.node-js","cd-logos-nodejs",{"id":100,"title":21,"body":101,"description":387,"extension":388,"links":389,"meta":390,"navigation":391,"path":22,"seo":392,"stem":23,"__hash__":393},"docs\u002F1.getting-started\u002F3.configs.md",{"type":102,"value":103,"toc":368},"minimark",[104,109,113,118,137,141,146,150,180,184,213,217,232,236,274,278,295,299,303,308,314,318,327,337,346,350,359],[105,106,108],"h2",{"id":107},"config-attributes","Config attributes",[110,111,112],"p",{},"Configs have the following attributes:",[114,115,117],"h3",{"id":116},"key","Key",[119,120,121,125,128,131,134],"ul",{},[122,123,124],"li",{},"An identifier for the config. This is how the config will be referenced in code via the SDKs, and how it will be presented in the dashboard.",[122,126,127],{},"Must be unique across the entire project",[122,129,130],{},"Can only contain letters, numbers, periods, dashes, and underscores",[122,132,133],{},"It is recommended to follow a consistent naming convention that is descriptive",[122,135,136],{},"ConfigDirector provides the ability to safely rename the key, even for configs that actively being used. It accomplishes this by preserving both keys (the old one and the new one) until it detects the old one is no longer being used by any of the SDKs.",[114,138,140],{"id":139},"description","Description",[119,142,143],{},[122,144,145],{},"An optional description of the config. This can be a useful place to provide more context on how this config is used by applications, what its intention is, and any other useful context.",[114,147,149],{"id":148},"role","Role",[119,151,152,174],{},[122,153,154,155,158,159,163,164,163,167,170,171],{},"The ",[156,157,148],"em",{}," of this config which can be one of ",[160,161,162],"code",{},"Config",", ",[160,165,166],{},"Feature Flag",[160,168,169],{},"Experiment",", or ",[160,172,173],{},"Kill Switch",[122,175,176,177,179],{},"Each ",[156,178,148],{}," offers different defaults and properties, more on this further below",[114,181,183],{"id":182},"lifetime","Lifetime",[119,185,186,196,204],{},[122,187,188,189,192,193],{},"It can be ",[160,190,191],{},"Permanent"," or ",[160,194,195],{},"Temporary",[122,197,198,200,201,203],{},[156,199,191],{}," configs are meant for values that are planned to remain in place for the foreseeable future. ConfigDirector will not generate any notifications whenever it detects that a ",[156,202,191],{}," config may no longer be in use.",[122,205,206,207,209,210,212],{},"On the other hand, ",[156,208,195],{}," configs are meant to be used for short term values (for example a feature flag) that should be removed once it is no longer needed. ConfigDirector will track and notify when it detects a ",[156,211,195],{}," config may no longer be needed.",[114,214,216],{"id":215},"sdk-availability","SDK Availability",[119,218,219,222,229],{},[122,220,221],{},"Determines if the given config should be available to server SDKs, client SDKs, or both",[122,223,224,225,228],{},"Some config values may only be relevant to clients, in which case selecting only ",[160,226,227],{},"Client SDK"," in the availability will exclude them from server SDKs. This can help reduce the payload size which may be relevant for projects with a large number of configs and\u002For configs with large values (such as JSON and JSON schemas).",[122,230,231],{},"Conversely, some config values may only be meant for server side applications and including them in the client payload may be undesirable for a variety of reasons (payload size, publicly exposing server config data, etc)",[114,233,235],{"id":234},"type","Type",[119,237,238,241,259],{},[122,239,240],{},"Feature flags and kill switches are always boolean",[122,242,243,244,163,247,163,250,163,253,163,256],{},"Configs can be of a variety of types: ",[160,245,246],{},"Boolean",[160,248,249],{},"String",[160,251,252],{},"Integer",[160,254,255],{},"Float",[160,257,258],{},"Enum",[122,260,261,262,163,264,163,266,163,268,270,271,273],{},"Experiments can be based on: ",[160,263,246],{},[160,265,249],{},[160,267,252],{},[160,269,255],{},". Experiments are based on pre-defined variations, so the ",[160,272,258],{}," type is redundant and it's excluded from the available types.",[114,275,277],{"id":276},"constraints","Constraints",[119,279,280,289,292],{},[122,281,282,283,285,286,288],{},"Some types, like ",[160,284,252],{}," and ",[160,287,255],{},", allow for constraints to be defined",[122,290,291],{},"The constraints can be used to restrict the values that the config is allowed to return. The constraints are enforced in the dashboard and the admin API whenever targeting rules are updated.",[122,293,294],{},"Constraints can be an additional layer of safety to prevent unwanted values from being configured by mistake. For example, if a config is meant to represent a timeout value, constraints can be used to enforce the value is within an acceptable range.",[105,296,298],{"id":297},"roles","Roles",[114,300,302],{"id":301},"configs","Configs",[110,304,305,307],{},[160,306,162],{}," is the default role and what provides the most flexibility. This role is meant for any arbitrary configuration value (excluding secrets) needed by applications.",[110,309,310,311,313],{},"Because it is the all encompassing role, feature flags, kill switches, and experiments can be later converted into a ",[160,312,162],{}," role if needed.",[114,315,317],{"id":316},"feature-flags-kill-switches","Feature flags & Kill switches",[110,319,320,285,323,326],{},[156,321,322],{},"Feature Flags",[156,324,325],{},"Kill Switches"," are boolean configs that behave very similarly but have slightly different defaults and meanings.",[110,328,329,330,332,333,336],{},"A ",[160,331,166],{}," defaults to a ",[156,334,335],{},"temporary"," lifetime and it is meant for short-lived flags that will be removed once the feature is fully released.",[110,338,339,340,332,342,345],{},"On the other hand, a ",[160,341,173],{},[156,343,344],{},"permanent"," lifetime and it is mean to remain in place for the foreseeable future as a means to enable\u002Fdisable a given feature when needed.",[114,347,349],{"id":348},"experiments","Experiments",[110,351,352,353,355,356,358],{},"An ",[160,354,169],{}," is intended to provide values for testing the performance of different variations of a feature. By default it has a ",[156,357,335],{}," lifetime.",[110,360,361,363,364,367],{},[156,362,349],{}," are defined in terms of ",[156,365,366],{},"variations"," which represent each value that could be returned. Targeting rules can be defined to return different variations to different users and segments, or randomize them in a percentage rollout.",{"title":369,"searchDepth":370,"depth":370,"links":371},"",2,[372,382],{"id":107,"depth":370,"text":108,"children":373},[374,376,377,378,379,380,381],{"id":116,"depth":375,"text":117},3,{"id":139,"depth":375,"text":140},{"id":148,"depth":375,"text":149},{"id":182,"depth":375,"text":183},{"id":215,"depth":375,"text":216},{"id":234,"depth":375,"text":235},{"id":276,"depth":375,"text":277},{"id":297,"depth":370,"text":298,"children":383},[384,385,386],{"id":301,"depth":375,"text":302},{"id":316,"depth":375,"text":317},{"id":348,"depth":375,"text":349},"Detailed description of configs and their attributes and properties","md",null,{},{"icon":24},{"title":21,"description":387},"f6Z9GEgKWjpR_-FvMyPPIEY1hBt-nm7pjk154uIklRk",[395,397],{"title":16,"path":17,"stem":18,"description":396,"icon":19,"children":-1},"ConfigDirector's core concepts and data model",{"title":26,"path":27,"stem":28,"description":398,"icon":29,"children":-1},"How ConfigDirector delivers config values and updates",1781641012156]