[{"data":1,"prerenderedAt":2529},["ShallowReactive",2],{"navigation_docs":3,"-migration-guides-launchdarkly":271,"-migration-guides-launchdarkly-surround":2524},[4,10,57,83,236,256],{"title":5,"path":6,"stem":7,"icon":8,"exact":9},"Introduction","\u002F","0.index","i-lucide-book-open",true,{"title":11,"icon":12,"modifiedAt":13,"path":14,"stem":15,"children":16,"page":12},"Getting Started",false,"2026-04-30T19:15:33.000Z","\u002Fgetting-started","1.getting-started",[17,22,27,32,37,42,47,52],{"title":18,"path":19,"stem":20,"icon":21},"Quickstart","\u002Fgetting-started\u002Fquickstart","1.getting-started\u002F1.quickstart","i-lucide-fast-forward",{"title":23,"path":24,"stem":25,"icon":26},"Core Concepts","\u002Fgetting-started\u002Fcore-concepts","1.getting-started\u002F2.core-concepts","i-lucide-workflow",{"title":28,"path":29,"stem":30,"icon":31},"Configs Anatomy","\u002Fgetting-started\u002Fconfigs","1.getting-started\u002F3.configs","i-lucide-file-cog",{"title":33,"path":34,"stem":35,"icon":36},"Architecture","\u002Fgetting-started\u002Farchitecture","1.getting-started\u002F4.architecture","i-lucide-layers",{"title":38,"path":39,"stem":40,"icon":41},"JSON Schema Validation","\u002Fgetting-started\u002Fjson-schema-validation","1.getting-started\u002F5.json-schema-validation","i-lucide-braces",{"title":43,"path":44,"stem":45,"icon":46},"Testing Rules","\u002Fgetting-started\u002Ftesting-targeting-rules","1.getting-started\u002F6.testing-targeting-rules","i-lucide-flask-conical",{"title":48,"path":49,"stem":50,"icon":51},"Segments","\u002Fgetting-started\u002Fsegments","1.getting-started\u002F7.segments","i-lucide-squares-intersect",{"title":53,"path":54,"stem":55,"icon":56},"Pricing & Billing","\u002Fgetting-started\u002Fpricing-and-billing","1.getting-started\u002F8.pricing-and-billing","i-lucide-credit-card",{"title":58,"modifiedAt":59,"defaultOpen":9,"path":60,"stem":61,"children":62,"page":12},"Monitoring","2026-09-24T23:33:20.000Z","\u002Fmonitoring","2.monitoring",[63,68,73,78],{"title":64,"path":65,"stem":66,"icon":67},"Activity","\u002Fmonitoring\u002Factivity","2.monitoring\u002F1.activity","i-lucide-activity",{"title":69,"path":70,"stem":71,"icon":72},"Lifecycle","\u002Fmonitoring\u002Flifecycle","2.monitoring\u002F2.lifecycle","i-lucide-recycle",{"title":74,"path":75,"stem":76,"icon":77},"Alerts","\u002Fmonitoring\u002Falerts","2.monitoring\u002F3.alerts","i-lucide-bell",{"title":79,"path":80,"stem":81,"icon":82},"Dynamic Detection","\u002Fmonitoring\u002Fdynamic-detection","2.monitoring\u002F4.dynamic-detection","i-lucide-hat-glasses",{"title":84,"modifiedAt":59,"defaultOpen":9,"path":85,"stem":86,"children":87,"page":12},"SDKs","\u002Fsdks","3.sdks",[88,93,114,139,155,186,231],{"title":89,"path":90,"stem":91,"icon":92},"Available SDKs","\u002Fsdks\u002Favailable-sdks","3.sdks\u002F1.available-sdks","i-lucide-list",{"title":94,"modifiedAt":59,"icon":95,"defaultOpen":12,"path":96,"stem":97,"children":98,"page":12},"Browser SDKs","i-lucide-monitor","\u002Fsdks\u002Fbrowser","3.sdks\u002F2.browser",[99,104,109],{"title":100,"path":101,"stem":102,"icon":103},"Javascript","\u002Fsdks\u002Fbrowser\u002Fjavascript","3.sdks\u002F2.browser\u002F1.javascript","cd-logos-javascript",{"title":105,"path":106,"stem":107,"icon":108},"React","\u002Fsdks\u002Fbrowser\u002Freact","3.sdks\u002F2.browser\u002F2.react","cd-logos-react-light",{"title":110,"path":111,"stem":112,"icon":113},"Vue","\u002Fsdks\u002Fbrowser\u002Fvue","3.sdks\u002F2.browser\u002F3.vue","cd-logos-vue",{"title":115,"modifiedAt":59,"icon":116,"defaultOpen":12,"path":117,"stem":118,"children":119,"page":12},"Mobile SDKs","i-lucide-smartphone","\u002Fsdks\u002Fmobile","3.sdks\u002F3.mobile",[120,124,129,134],{"title":121,"path":122,"stem":123,"icon":108},"React Native","\u002Fsdks\u002Fmobile\u002Freact-native","3.sdks\u002F3.mobile\u002F1.react-native",{"title":125,"path":126,"stem":127,"icon":128},"Flutter","\u002Fsdks\u002Fmobile\u002Fflutter","3.sdks\u002F3.mobile\u002F2.flutter","cd-logos-flutter",{"title":130,"path":131,"stem":132,"icon":133},"Swift","\u002Fsdks\u002Fmobile\u002Fswift","3.sdks\u002F3.mobile\u002F3.swift","cd-logos-swift",{"title":135,"path":136,"stem":137,"icon":138},"Android","\u002Fsdks\u002Fmobile\u002Fandroid","3.sdks\u002F3.mobile\u002F4.android","cd-logos-android",{"title":140,"modifiedAt":59,"icon":141,"defaultOpen":12,"path":142,"stem":143,"children":144,"page":12},"Meta-framework SDKs","i-lucide-monitor-smartphone","\u002Fsdks\u002Fmeta","3.sdks\u002F4.meta",[145,150],{"title":146,"path":147,"stem":148,"icon":149},"Next.js","\u002Fsdks\u002Fmeta\u002Fnextjs","3.sdks\u002F4.meta\u002F1.nextjs","cd-logos-nextjs",{"title":151,"path":152,"stem":153,"icon":154},"Nuxt","\u002Fsdks\u002Fmeta\u002Fnuxt","3.sdks\u002F4.meta\u002F2.nuxt","cd-logos-nuxt",{"title":156,"modifiedAt":59,"icon":157,"defaultOpen":12,"path":158,"stem":159,"children":160,"page":12},"Server SDKs","i-lucide-server","\u002Fsdks\u002Fserver","3.sdks\u002F5.server",[161,166,171,176,181],{"title":162,"path":163,"stem":164,"icon":165},"Node.js","\u002Fsdks\u002Fserver\u002Fnode-js","3.sdks\u002F5.server\u002F1.node-js","cd-logos-nodejs",{"title":167,"path":168,"stem":169,"icon":170},"Python","\u002Fsdks\u002Fserver\u002Fpython","3.sdks\u002F5.server\u002F2.python","cd-logos-python",{"title":172,"path":173,"stem":174,"icon":175},"Java","\u002Fsdks\u002Fserver\u002Fjava","3.sdks\u002F5.server\u002F3.java","cd-logos-java",{"title":177,"path":178,"stem":179,"icon":180},".NET","\u002Fsdks\u002Fserver\u002Fdotnet","3.sdks\u002F5.server\u002F4.dotnet","cd-logos-dotnet",{"title":182,"path":183,"stem":184,"icon":185},"Go","\u002Fsdks\u002Fserver\u002Fgo","3.sdks\u002F5.server\u002F5.go","cd-logos-go",{"title":187,"modifiedAt":59,"icon":188,"defaultOpen":12,"path":189,"stem":190,"children":191},"OpenFeature Providers","cd-logos-openfeature","\u002Fsdks\u002Fopenfeature","3.sdks\u002F6.openfeature\u002Findex",[192,194,199,203,207,211,215,219,223,227],{"title":193,"path":189,"stem":190,"icon":188},"Overview",{"title":195,"path":196,"stem":197,"icon":188,"icons":198},"Web","\u002Fsdks\u002Fopenfeature\u002Fweb","3.sdks\u002F6.openfeature\u002F1.web",[188,103],{"title":130,"path":200,"stem":201,"icon":188,"icons":202},"\u002Fsdks\u002Fopenfeature\u002Fswift","3.sdks\u002F6.openfeature\u002F2.swift",[188,133],{"title":135,"path":204,"stem":205,"icon":188,"icons":206},"\u002Fsdks\u002Fopenfeature\u002Fandroid","3.sdks\u002F6.openfeature\u002F3.android",[188,138],{"title":125,"path":208,"stem":209,"icon":188,"icons":210},"\u002Fsdks\u002Fopenfeature\u002Fflutter","3.sdks\u002F6.openfeature\u002F4.flutter",[188,128],{"title":162,"path":212,"stem":213,"icon":188,"icons":214},"\u002Fsdks\u002Fopenfeature\u002Fnode-js","3.sdks\u002F6.openfeature\u002F5.node-js",[188,165],{"title":167,"path":216,"stem":217,"icon":188,"icons":218},"\u002Fsdks\u002Fopenfeature\u002Fpython","3.sdks\u002F6.openfeature\u002F6.python",[188,170],{"title":172,"path":220,"stem":221,"icon":188,"icons":222},"\u002Fsdks\u002Fopenfeature\u002Fjava","3.sdks\u002F6.openfeature\u002F7.java",[188,175],{"title":177,"path":224,"stem":225,"icon":188,"icons":226},"\u002Fsdks\u002Fopenfeature\u002Fdotnet","3.sdks\u002F6.openfeature\u002F8.dotnet",[188,180],{"title":182,"path":228,"stem":229,"icon":188,"icons":230},"\u002Fsdks\u002Fopenfeature\u002Fgo","3.sdks\u002F6.openfeature\u002F9.go",[188,185],{"title":232,"path":233,"stem":234,"icon":235},"Maven Repository","\u002Fsdks\u002Fmaven-repository","3.sdks\u002F7.maven-repository","i-lucide-package",{"title":237,"modifiedAt":59,"defaultOpen":9,"path":238,"stem":239,"children":240,"page":12},"Integrations","\u002Fintegrations","4.integrations",[241,246,251],{"title":242,"path":243,"stem":244,"icon":245},"Terraform","\u002Fintegrations\u002Fterraform","4.integrations\u002F1.terraform","cd-logos-terraform",{"title":247,"path":248,"stem":249,"icon":250},"MCP","\u002Fintegrations\u002Fmcp","4.integrations\u002F2.mcp","cd-logos-mcp",{"title":252,"path":253,"stem":254,"icon":255},"Admin API","\u002Fintegrations\u002Fadmin-api","4.integrations\u002F3.admin-api","i-lucide-blocks",{"title":257,"modifiedAt":258,"defaultOpen":9,"path":259,"stem":260,"children":261,"page":12},"Migration Guides","2026-10-16T17:57:49.000Z","\u002Fmigration-guides","5.migration-guides",[262,267],{"title":263,"path":264,"stem":265,"icon":266},"From LaunchDarkly","\u002Fmigration-guides\u002Flaunchdarkly","5.migration-guides\u002F1.launchdarkly","i-lucide-baggage-claim",{"title":268,"path":269,"stem":270,"icon":266},"From Firebase Remote Config","\u002Fmigration-guides\u002Ffirebase-remote-config","5.migration-guides\u002F2.firebase-remote-config",{"id":272,"title":273,"body":274,"description":2515,"extension":2516,"links":2517,"meta":2518,"navigation":2519,"path":264,"seo":2520,"stem":265,"__hash__":2523},"docs\u002F5.migration-guides\u002F1.launchdarkly.md","Migrating from LaunchDarkly",{"type":275,"value":276,"toc":2497},"minimark",[277,281,288,293,367,371,376,589,593,734,738,878,882,1023,1027,1030,1033,1056,1059,1096,1100,1104,1107,1110,1113,1400,1413,1617,1623,1740,1754,1758,1761,2028,2046,2276,2296,2300,2323,2327,2441,2449,2453,2456,2476,2482,2486,2493],[278,279,280],"p",{},"This guide is for teams that run feature flags on LaunchDarkly and want to move them to ConfigDirector. It maps the LaunchDarkly concepts onto ConfigDirector's, walks through recreating the flags, and shows how to switch each SDK over so that both services run side by side until you remove the LaunchDarkly one.",[278,282,283,284,287],{},"If you are new to ConfigDirector, read ",[285,286,23],"a",{"href":24}," first. It takes a few minutes and makes the mapping below easier to follow.",[289,290,292],"h2",{"id":291},"before-you-start","Before you start",[294,295,296,304,327,346],"ol",{},[297,298,299,303],"li",{},[300,301,302],"strong",{},"Pick one LaunchDarkly project to move first."," A project with a handful of flags and one or two services is a good rehearsal. Everything below is done per project.",[297,305,306,309,310,314,315,318,319,326],{},[300,307,308],{},"Make a list of the flags, with their variations and targeting."," LaunchDarkly has no flag export, but its REST API lists every flag in a project with its variations and a summary of the targeting in each environment: ",[311,312,313],"code",{},"GET \u002Fapi\u002Fv2\u002Fflags\u002F{projectKey}",", with ",[311,316,317],{},"?env=production&summary=false"," for the full rules. See the ",[285,320,325],{"href":321,"rel":322,"target":324},"https:\u002F\u002Flaunchdarkly.com\u002Fdocs\u002Fapi\u002Ffeature-flags\u002Fget-feature-flags",[323],"noopener","_blank","LaunchDarkly API documentation",". For a small project, the flag list in the LaunchDarkly dashboard is enough.",[297,328,329,332,333,337,338,341,342,345],{},[300,330,331],{},"Decide which flags not to move."," A migration is the best moment to clean up. A flag whose status is ",[334,335,336],"em",{},"launched"," or ",[334,339,340],{},"inactive"," in every environment serves one value and has nothing left to decide. Hardcode that value in the code instead of recreating the flag. Only ",[334,343,344],{},"active"," flags, and the permanent ones you still rely on, need to move.",[297,347,348,351,352,358,359,362,363,366],{},[300,349,350],{},"Create your ConfigDirector organization and project."," ",[285,353,357],{"href":354,"target":324,"rel":355},"https:\u002F\u002Fapp.configdirector.com\u002F",[323,356],"noreferrer","Sign up",", create a project, and add an environment for each LaunchDarkly environment you use. ",[311,360,361],{},"Test"," and ",[311,364,365],{},"Production"," are created for you. Mark the environments that serve real traffic as live.",[289,368,370],{"id":369},"how-the-concepts-map","How the concepts map",[372,373,375],"h3",{"id":374},"projects-environments-and-flags","Projects, environments, and flags",[377,378,379,392],"table",{},[380,381,382],"thead",{},[383,384,385,389],"tr",{},[386,387,388],"th",{},"LaunchDarkly",[386,390,391],{},"ConfigDirector",[393,394,395,406,421,450,492,504,525,541,552,559,573,581],"tbody",{},[383,396,397,401],{},[398,399,400],"td",{},"Project",[398,402,403],{},[285,404,400],{"href":405},"\u002Fgetting-started\u002Fcore-concepts#projects",[383,407,408,411],{},[398,409,410],{},"Environment",[398,412,413,416,417,420],{},[285,414,410],{"href":415},"\u002Fgetting-started\u002Fcore-concepts#environments",". A critical environment in LaunchDarkly is a ",[300,418,419],{},"live environment"," in ConfigDirector.",[383,422,423,426],{},[398,424,425],{},"Feature flag",[398,427,428,431,432,435,436,438,439,442,443,446,447,449],{},[285,429,430],{"href":29},"Config",", with a ",[300,433,434],{},"role",": ",[311,437,425],{}," for a temporary boolean, ",[311,440,441],{},"Kill switch"," for a permanent boolean, ",[311,444,445],{},"Experiment"," for variations you compare, and ",[311,448,430],{}," for everything else.",[383,451,452,455],{},[398,453,454],{},"Flag type: boolean, string, number, JSON",[398,456,457,458,435,461,464,465,464,468,337,471,464,474,477,478,464,481,484,485,488,489,491],{},"Config ",[300,459,460],{},"type",[311,462,463],{},"Boolean",", ",[311,466,467],{},"String",[311,469,470],{},"Integer",[311,472,473],{},"Float",[311,475,476],{},"JSON",". ConfigDirector also has ",[311,479,480],{},"Enum",[311,482,483],{},"URL",", and ",[311,486,487],{},"Timespan",", which validate the value as that type. A string flag with a fixed set of variations is usually an ",[311,490,480],{},".",[383,493,494,497],{},[398,495,496],{},"Variations",[398,498,499,500,503],{},"The values a config serves. Experiments define them as named ",[300,501,502],{},"variations","; other roles enter the value in each targeting rule.",[383,505,506,509],{},[398,507,508],{},"Temporary and permanent flags",[398,510,511,435,514,337,517,520,521,524],{},[300,512,513],{},"Lifetime",[311,515,516],{},"Temporary",[311,518,519],{},"Permanent",". Temporary configs are tracked through the ",[285,522,523],{"href":70},"config lifecycle",", which tells you when they have settled and can be removed.",[383,526,527,530],{},[398,528,529],{},"Flag key",[398,531,457,532,535,536,540],{},[300,533,534],{},"key",". LaunchDarkly keys are valid ConfigDirector keys, so keep them: the code change is then only the SDK call. Unlike LaunchDarkly, a key can be ",[285,537,539],{"href":538},"\u002Fgetting-started\u002Fconfigs#key","renamed safely"," later, even in production.",[383,542,543,546],{},[398,544,545],{},"Client-side SDK availability, mobile key availability",[398,547,548,551],{},[300,549,550],{},"SDK availability",": client SDKs, server SDKs, or both. Client and mobile applications both use the client SDK key.",[383,553,554,557],{},[398,555,556],{},"Tags",[398,558,556],{},[383,560,561,564],{},[398,562,563],{},"JSON Schema on a flag's variations",[398,565,566,569,570,572],{},[285,567,568],{"href":39},"JSON Schema validation"," on a ",[311,571,476],{}," config, on both pricing options. Changing the schema re-validates every value already set in every environment.",[383,574,575,578],{},[398,576,577],{},"Flag maintainer, custom properties, flag links",[398,579,580],{},"No equivalent. Put the owner in the description, or in a tag.",[383,582,583,586],{},[398,584,585],{},"Archived flag",[398,587,588],{},"Archived config. It can be restored for 30 days, and then it is purged.",[372,590,592],{"id":591},"targeting","Targeting",[377,594,595,603],{},[380,596,597],{},[383,598,599,601],{},[386,600,388],{},[386,602,391],{},[393,604,605,618,629,648,660,668,682,696,707,715,723],{},[383,606,607,610],{},[398,608,609],{},"Default rule (fallthrough)",[398,611,612,613,617],{},"The ",[285,614,616],{"href":615},"\u002Fgetting-started\u002Fcore-concepts#targeting-rules","default targeting rule",", the last rule in every environment. Its value is served when no other rule matches.",[383,619,620,623],{},[398,621,622],{},"Targeting on and off, with the off variation",[398,624,625,626,628],{},"There is no on\u002Foff switch above the rules. To turn a flag off for everyone, remove or reorder its rules so the default targeting rule serves the off value. For a switch that stays independent of the rules, create a ",[311,627,441],{}," and check it first in your code.",[383,630,631,634],{},[398,632,633],{},"Individual targets",[398,635,636,637,640,641,644,645,491],{},"A conditional rule with the condition ",[311,638,639],{},"identifier is one of"," the listed identifiers. Add a ",[311,642,643],{},"context.kind"," condition to the rule when the identifiers belong to a context kind other than ",[311,646,647],{},"user",[383,649,650,653],{},[398,651,652],{},"Rule with clauses",[398,654,655,656,659],{},"A ",[300,657,658],{},"conditional rule"," with one attribute condition per clause. Every condition of a rule must match, as in LaunchDarkly. There is no OR inside a rule: write a second rule, or use a segment, whose condition groups are combined with OR.",[383,661,662,665],{},[398,663,664],{},"Attribute operators: string, number, semver, date, regex",[398,666,667],{},"Attribute conditions read a trait as text, a number, a semantic version, a datetime, an array, or a boolean, each with its own operators. There is no regular expression operator. Text conditions are case-sensitive.",[383,669,670,673],{},[398,671,672],{},"Percentage rollout, bucketed by a chosen context kind and attribute",[398,674,655,675,678,679,491],{},[285,676,677],{"href":615},"percentage rollout",", on its own or as the value of a conditional rule. Contexts are assigned by their context kind and identifier. Choosing another attribute to bucket by is not available: evaluate with the entity you want to bucket by as the context instead, for example ",[311,680,681],{},"kind: \"organization\"",[383,683,684,687],{},[398,685,686],{},"Segment, rule-based, per environment",[398,688,655,689,692,693,491],{},[285,690,691],{"href":49},"segment",", defined once per project with one or more condition groups, used by any config in the project. An environment that needs its own definition gets an ",[300,694,695],{},"environment override",[383,697,698,701],{},[398,699,700],{},"Segment, list-based",[398,702,703,704,706],{},"Not yet available. Use a condition group with ",[311,705,639],{}," the listed identifiers; it is kept in one place and reused the same way.",[383,708,709,712],{},[398,710,711],{},"Prerequisites",[398,713,714],{},"Not available. Put the condition the prerequisite flag expressed on the dependent flag's own rules, or check both flags in code.",[383,716,717,720],{},[398,718,719],{},"Scheduled changes, approvals, guarded rollouts",[398,721,722],{},"Not available. Changes take effect as soon as they are saved.",[383,724,725,728],{},[398,726,727],{},"Test run",[398,729,612,730,733],{},[285,731,732],{"href":44},"targeting rules tester",", which evaluates saved or unsaved rules against a context and shows why each rule matched or not.",[372,735,737],{"id":736},"contexts","Contexts",[377,739,740,748],{},[380,741,742],{},[383,743,744,746],{},[386,745,388],{},[386,747,391],{},[393,749,750,760,783,806,817,840,858,870],{},[383,751,752,755],{},[398,753,754],{},"Context",[398,756,757],{},[285,758,754],{"href":759},"\u002Fgetting-started\u002Fcore-concepts#contexts",[383,761,762,774],{},[398,763,764,765,464,767,464,770,773],{},"Context kind: ",[311,766,647],{},[311,768,769],{},"organization",[311,771,772],{},"device",", custom",[398,775,776,779,780,782],{},[300,777,778],{},"Context kind",". Leaving it out means ",[311,781,647],{},". Any lowercase name of up to 64 letters, digits, dashes, or underscores works.",[383,784,785,790],{},[398,786,787,788],{},"Context ",[311,789,534],{},[398,791,792,464,795,798,799,802,803,805],{},[300,793,794],{},"Identifier",[311,796,797],{},"id"," in the SDKs. A context is identified by its kind and identifier together, so user ",[311,800,801],{},"42"," and device ",[311,804,801],{}," are different contexts.",[383,807,808,813],{},[398,809,787,810],{},[311,811,812],{},"name",[398,814,815],{},[311,816,812],{},[383,818,819,828],{},[398,820,821,822,337,825],{},"Custom attributes, such as ",[311,823,824],{},"email",[311,826,827],{},"plan",[398,829,830,833,834,337,837,491],{},[300,831,832],{},"Traits",", an arbitrary JSON object. Targeting rules address a trait with a JSON pointer, such as ",[311,835,836],{},"\u002Fplan",[311,838,839],{},"\u002Faddress\u002Fcountry",[383,841,842,847],{},[398,843,844],{},[311,845,846],{},"anonymous: true",[398,848,849,850,853,854,857],{},"An ",[300,851,852],{},"anonymous context",": a context given without an identifier, or with ",[311,855,856],{},"anonymous"," set. It is evaluated but never stored or shown in the dashboard.",[383,859,860,863],{},[398,861,862],{},"Multi-context, several kinds in one evaluation",[398,864,865,866,869],{},"Not available. Each evaluation is for one context. To target a user by their organization, copy the organization's attributes you target by into the user's traits, for example ",[311,867,868],{},"\u002Forganization\u002Fplan",". Or evaluate the config a second time with the organization as the context.",[383,871,872,875],{},[398,873,874],{},"Private attributes",[398,876,877],{},"Not available. Only put the traits your targeting rules use in the context.",[372,879,881],{"id":880},"sdks-and-delivery","SDKs and delivery",[377,883,884,892],{},[380,885,886],{},[383,887,888,890],{},[386,889,388],{},[386,891,391],{},[393,893,894,905,916,926,934,942,953,968,981,993,1008],{},[383,895,896,899],{},[398,897,898],{},"SDK key",[398,900,901,904],{},[300,902,903],{},"Server SDK key",", a secret, for server SDKs.",[383,906,907,910],{},[398,908,909],{},"Client-side ID and mobile key",[398,911,912,915],{},[300,913,914],{},"Client SDK key",", for browser and mobile SDKs. It is not secret, because client SDKs only receive evaluated values.",[383,917,918,921],{},[398,919,920],{},"Streaming by default, with polling as an option",[398,922,923,924,491],{},"The same. See ",[285,925,33],{"href":34},[383,927,928,931],{},[398,929,930],{},"Server SDKs evaluate locally",[398,932,933],{},"The same. Server SDKs receive the rules and segments and evaluate every context in memory.",[383,935,936,939],{},[398,937,938],{},"Client SDKs receive evaluated values",[398,940,941],{},"The same.",[383,943,944,947],{},[398,945,946],{},"Fallback value in code",[398,948,612,949,952],{},[300,950,951],{},"in-code default value",", passed with every read. It is returned only when the SDK cannot evaluate the config.",[383,954,955,958],{},[398,956,957],{},"Flag change listeners",[398,959,960,963,964,967],{},[311,961,962],{},"watch"," in the JavaScript SDKs, a stream or flow in the mobile SDKs, and the ",[311,965,966],{},"configsUpdated"," hook. Each SDK page shows them.",[383,969,970,973],{},[398,971,972],{},"Bootstrapping from a server-rendered payload",[398,974,975,976,362,978,980],{},"Not available in the browser SDK. The ",[285,977,146],{"href":147},[285,979,151],{"href":152}," SDKs evaluate configs during server-side rendering, so the first render carries real values.",[383,982,983,986],{},[398,984,985],{},"Relay Proxy",[398,987,988,989,992],{},"Not needed. Every SDK connects to ConfigDirector directly over streaming. A base ",[311,990,991],{},"url"," option is available for an HTTP proxy of your own.",[383,994,995,998],{},[398,996,997],{},"Test data sources",[398,999,612,1000,1003,1004,1007],{},[300,1001,1002],{},"test client"," in each SDK's testing entry point, and the in-memory providers of the OpenFeature SDKs. See ",[334,1005,1006],{},"Test your code"," on each SDK page.",[383,1009,1010,1013],{},[398,1011,1012],{},"Experimentation metrics and results",[398,1014,1015,1016,1018,1019,1022],{},"Not available. An ",[311,1017,445],{}," config serves the variations; measure them in your own analytics. Every evaluation carries a ",[311,1020,1021],{},"valueId",", a stable identifier of the value served, that you can send instead of the value itself.",[289,1024,1026],{"id":1025},"recreate-the-flags","Recreate the flags",[278,1028,1029],{},"Create the configs in ConfigDirector while the LaunchDarkly flags keep serving your applications. Nothing changes for your users until the SDKs switch over.",[278,1031,1032],{},"For each flag you decided to move:",[294,1034,1035,1038,1044,1050],{},[297,1036,1037],{},"Create a config with the same key, the role and type from the tables above, and the lifetime. Set its initial value to what LaunchDarkly serves most users in production today, so an application that reads it before its rules exist gets a safe value.",[297,1039,1040,1041,1043],{},"Set the ",[300,1042,550],{}," to match where the flag is read.",[297,1045,1046,1047,1049],{},"In each environment, recreate the targeting: individual targets as ",[311,1048,639],{}," rules, rules as conditional rules, the rollout as a percentage rollout, and the fallthrough as the default targeting rule value.",[297,1051,1052,1053,1055],{},"Check a few contexts with the ",[285,1054,732],{"href":44},". The result should be the value LaunchDarkly serves them.",[278,1057,1058],{},"There are three ways to do this:",[1060,1061,1062,1068,1086],"ul",{},[297,1063,1064,1067],{},[300,1065,1066],{},"The dashboard",", for a project with a few flags. The config form and the targeting rules editor cover everything above.",[297,1069,1070,1073,1074,1077,1078,1081,1082,1085],{},[300,1071,1072],{},"The Terraform provider",", if your LaunchDarkly flags were managed with LaunchDarkly's Terraform provider. The ",[285,1075,1076],{"href":243},"ConfigDirector Terraform provider"," has ",[311,1079,1080],{},"configdirector_config"," for the flag and ",[311,1083,1084],{},"configdirector_config_targeting_rules"," for the rules of each environment, with the same structure as the tables above. Translate the resources once and apply.",[297,1087,1088,1091,1092,1095],{},[300,1089,1090],{},"The MCP server",", for a project with many flags that you manage by hand. Connect the ",[285,1093,1094],{"href":248},"MCP server"," to your coding assistant, give it the flag list from the LaunchDarkly API, and ask it to create the configs and their targeting rules. Review what it created in the dashboard before switching any SDK.",[1097,1098,1099],"note",{},"Segments come first. Create the segments a project's rules use before the configs, and translate the LaunchDarkly segment of each environment into a project definition plus an environment override where the environments differ.",[289,1101,1103],{"id":1102},"switch-the-sdks","Switch the SDKs",[278,1105,1106],{},"Switch one application at a time. Pass the value LaunchDarkly serves today as the in-code default value, so that a config that is missing, or read before the client is ready, still gives the result users get now.",[372,1108,156],{"id":1109},"server-sdks",[278,1111,1112],{},"A Node.js service reading a flag with the LaunchDarkly server SDK:",[1114,1115,1121],"pre",{"className":1116,"code":1117,"filename":1118,"language":1119,"meta":1120,"style":1120},"language-ts shiki shiki-themes material-theme-lighter github-light github-dark","import * as LaunchDarkly from \"@launchdarkly\u002Fnode-server-sdk\";\n\nconst ldClient = LaunchDarkly.init(\"YOUR-LAUNCHDARKLY-SDK-KEY\");\nawait ldClient.waitForInitialization({ timeout: 10 });\n\nconst context = {\n  kind: \"user\",\n  key: \"user-123\",\n  name: \"Example User\",\n  email: \"user@example.com\",\n  plan: \"enterprise\",\n};\n\nconst newCheckout = await ldClient.variation(\"new-checkout\", context, false);\n","Before: LaunchDarkly","ts","",[311,1122,1123,1161,1167,1206,1242,1247,1260,1277,1294,1311,1328,1345,1351,1356],{"__ignoreMap":1120},[1124,1125,1128,1132,1136,1139,1143,1146,1150,1154,1157],"span",{"class":1126,"line":1127},"line",1,[1124,1129,1131],{"class":1130},"sVHd0","import",[1124,1133,1135],{"class":1134},"s39Yj"," *",[1124,1137,1138],{"class":1130}," as",[1124,1140,1142],{"class":1141},"su5hD"," LaunchDarkly ",[1124,1144,1145],{"class":1130},"from",[1124,1147,1149],{"class":1148},"sjJ54"," \"",[1124,1151,1153],{"class":1152},"s_sjI","@launchdarkly\u002Fnode-server-sdk",[1124,1155,1156],{"class":1148},"\"",[1124,1158,1160],{"class":1159},"sP7_E",";\n",[1124,1162,1164],{"class":1126,"line":1163},2,[1124,1165,1166],{"emptyLinePlaceholder":9},"\n",[1124,1168,1170,1174,1178,1182,1185,1187,1191,1194,1196,1199,1201,1204],{"class":1126,"line":1169},3,[1124,1171,1173],{"class":1172},"sbsja","const",[1124,1175,1177],{"class":1176},"s_hVV"," ldClient",[1124,1179,1181],{"class":1180},"smGrS"," =",[1124,1183,1184],{"class":1141}," LaunchDarkly",[1124,1186,491],{"class":1159},[1124,1188,1190],{"class":1189},"sGLFI","init",[1124,1192,1193],{"class":1141},"(",[1124,1195,1156],{"class":1148},[1124,1197,1198],{"class":1152},"YOUR-LAUNCHDARKLY-SDK-KEY",[1124,1200,1156],{"class":1148},[1124,1202,1203],{"class":1141},")",[1124,1205,1160],{"class":1159},[1124,1207,1209,1212,1214,1216,1219,1221,1224,1228,1231,1235,1238,1240],{"class":1126,"line":1208},4,[1124,1210,1211],{"class":1130},"await",[1124,1213,1177],{"class":1141},[1124,1215,491],{"class":1159},[1124,1217,1218],{"class":1189},"waitForInitialization",[1124,1220,1193],{"class":1141},[1124,1222,1223],{"class":1159},"{",[1124,1225,1227],{"class":1226},"skxfh"," timeout",[1124,1229,1230],{"class":1159},":",[1124,1232,1234],{"class":1233},"srdBf"," 10",[1124,1236,1237],{"class":1159}," }",[1124,1239,1203],{"class":1141},[1124,1241,1160],{"class":1159},[1124,1243,1245],{"class":1126,"line":1244},5,[1124,1246,1166],{"emptyLinePlaceholder":9},[1124,1248,1250,1252,1255,1257],{"class":1126,"line":1249},6,[1124,1251,1173],{"class":1172},[1124,1253,1254],{"class":1176}," context",[1124,1256,1181],{"class":1180},[1124,1258,1259],{"class":1159}," {\n",[1124,1261,1263,1266,1268,1270,1272,1274],{"class":1126,"line":1262},7,[1124,1264,1265],{"class":1226},"  kind",[1124,1267,1230],{"class":1159},[1124,1269,1149],{"class":1148},[1124,1271,647],{"class":1152},[1124,1273,1156],{"class":1148},[1124,1275,1276],{"class":1159},",\n",[1124,1278,1280,1283,1285,1287,1290,1292],{"class":1126,"line":1279},8,[1124,1281,1282],{"class":1226},"  key",[1124,1284,1230],{"class":1159},[1124,1286,1149],{"class":1148},[1124,1288,1289],{"class":1152},"user-123",[1124,1291,1156],{"class":1148},[1124,1293,1276],{"class":1159},[1124,1295,1297,1300,1302,1304,1307,1309],{"class":1126,"line":1296},9,[1124,1298,1299],{"class":1226},"  name",[1124,1301,1230],{"class":1159},[1124,1303,1149],{"class":1148},[1124,1305,1306],{"class":1152},"Example User",[1124,1308,1156],{"class":1148},[1124,1310,1276],{"class":1159},[1124,1312,1314,1317,1319,1321,1324,1326],{"class":1126,"line":1313},10,[1124,1315,1316],{"class":1226},"  email",[1124,1318,1230],{"class":1159},[1124,1320,1149],{"class":1148},[1124,1322,1323],{"class":1152},"user@example.com",[1124,1325,1156],{"class":1148},[1124,1327,1276],{"class":1159},[1124,1329,1331,1334,1336,1338,1341,1343],{"class":1126,"line":1330},11,[1124,1332,1333],{"class":1226},"  plan",[1124,1335,1230],{"class":1159},[1124,1337,1149],{"class":1148},[1124,1339,1340],{"class":1152},"enterprise",[1124,1342,1156],{"class":1148},[1124,1344,1276],{"class":1159},[1124,1346,1348],{"class":1126,"line":1347},12,[1124,1349,1350],{"class":1159},"};\n",[1124,1352,1354],{"class":1126,"line":1353},13,[1124,1355,1166],{"emptyLinePlaceholder":9},[1124,1357,1359,1361,1364,1366,1369,1371,1373,1376,1378,1380,1383,1385,1388,1390,1392,1396,1398],{"class":1126,"line":1358},14,[1124,1360,1173],{"class":1172},[1124,1362,1363],{"class":1176}," newCheckout",[1124,1365,1181],{"class":1180},[1124,1367,1368],{"class":1130}," await",[1124,1370,1177],{"class":1141},[1124,1372,491],{"class":1159},[1124,1374,1375],{"class":1189},"variation",[1124,1377,1193],{"class":1141},[1124,1379,1156],{"class":1148},[1124,1381,1382],{"class":1152},"new-checkout",[1124,1384,1156],{"class":1148},[1124,1386,1387],{"class":1159},",",[1124,1389,1254],{"class":1141},[1124,1391,1387],{"class":1159},[1124,1393,1395],{"class":1394},"syTEX"," false",[1124,1397,1203],{"class":1141},[1124,1399,1160],{"class":1159},[278,1401,1402,1403,1406,1407,1410,1411,1230],{},"The same flag with the ConfigDirector ",[285,1404,1405],{"href":163},"Node.js SDK",". The context's custom attributes move under ",[311,1408,1409],{},"traits",", and the key becomes ",[311,1412,797],{},[1114,1414,1417],{"className":1116,"code":1415,"filename":1416,"language":1119,"meta":1120,"style":1120},"import { createClient } from \"@configdirector\u002Fserver-sdk\";\n\nconst client = createClient(\"YOUR-SERVER-SDK-KEY\");\nawait client.initialize();\n\nconst context = {\n  id: \"user-123\",\n  name: \"Example User\",\n  traits: {\n    email: \"user@example.com\",\n    plan: \"enterprise\",\n  },\n};\n\nconst newCheckout = client.getValue(\"new-checkout\", false, context);\n","After: ConfigDirector",[311,1418,1419,1443,1447,1471,1487,1491,1501,1516,1530,1539,1554,1569,1574,1578,1582],{"__ignoreMap":1120},[1124,1420,1421,1423,1426,1429,1431,1434,1436,1439,1441],{"class":1126,"line":1127},[1124,1422,1131],{"class":1130},[1124,1424,1425],{"class":1159}," {",[1124,1427,1428],{"class":1141}," createClient",[1124,1430,1237],{"class":1159},[1124,1432,1433],{"class":1130}," from",[1124,1435,1149],{"class":1148},[1124,1437,1438],{"class":1152},"@configdirector\u002Fserver-sdk",[1124,1440,1156],{"class":1148},[1124,1442,1160],{"class":1159},[1124,1444,1445],{"class":1126,"line":1163},[1124,1446,1166],{"emptyLinePlaceholder":9},[1124,1448,1449,1451,1454,1456,1458,1460,1462,1465,1467,1469],{"class":1126,"line":1169},[1124,1450,1173],{"class":1172},[1124,1452,1453],{"class":1176}," client",[1124,1455,1181],{"class":1180},[1124,1457,1428],{"class":1189},[1124,1459,1193],{"class":1141},[1124,1461,1156],{"class":1148},[1124,1463,1464],{"class":1152},"YOUR-SERVER-SDK-KEY",[1124,1466,1156],{"class":1148},[1124,1468,1203],{"class":1141},[1124,1470,1160],{"class":1159},[1124,1472,1473,1475,1477,1479,1482,1485],{"class":1126,"line":1208},[1124,1474,1211],{"class":1130},[1124,1476,1453],{"class":1141},[1124,1478,491],{"class":1159},[1124,1480,1481],{"class":1189},"initialize",[1124,1483,1484],{"class":1141},"()",[1124,1486,1160],{"class":1159},[1124,1488,1489],{"class":1126,"line":1244},[1124,1490,1166],{"emptyLinePlaceholder":9},[1124,1492,1493,1495,1497,1499],{"class":1126,"line":1249},[1124,1494,1173],{"class":1172},[1124,1496,1254],{"class":1176},[1124,1498,1181],{"class":1180},[1124,1500,1259],{"class":1159},[1124,1502,1503,1506,1508,1510,1512,1514],{"class":1126,"line":1262},[1124,1504,1505],{"class":1226},"  id",[1124,1507,1230],{"class":1159},[1124,1509,1149],{"class":1148},[1124,1511,1289],{"class":1152},[1124,1513,1156],{"class":1148},[1124,1515,1276],{"class":1159},[1124,1517,1518,1520,1522,1524,1526,1528],{"class":1126,"line":1279},[1124,1519,1299],{"class":1226},[1124,1521,1230],{"class":1159},[1124,1523,1149],{"class":1148},[1124,1525,1306],{"class":1152},[1124,1527,1156],{"class":1148},[1124,1529,1276],{"class":1159},[1124,1531,1532,1535,1537],{"class":1126,"line":1296},[1124,1533,1534],{"class":1226},"  traits",[1124,1536,1230],{"class":1159},[1124,1538,1259],{"class":1159},[1124,1540,1541,1544,1546,1548,1550,1552],{"class":1126,"line":1313},[1124,1542,1543],{"class":1226},"    email",[1124,1545,1230],{"class":1159},[1124,1547,1149],{"class":1148},[1124,1549,1323],{"class":1152},[1124,1551,1156],{"class":1148},[1124,1553,1276],{"class":1159},[1124,1555,1556,1559,1561,1563,1565,1567],{"class":1126,"line":1330},[1124,1557,1558],{"class":1226},"    plan",[1124,1560,1230],{"class":1159},[1124,1562,1149],{"class":1148},[1124,1564,1340],{"class":1152},[1124,1566,1156],{"class":1148},[1124,1568,1276],{"class":1159},[1124,1570,1571],{"class":1126,"line":1347},[1124,1572,1573],{"class":1159},"  },\n",[1124,1575,1576],{"class":1126,"line":1353},[1124,1577,1350],{"class":1159},[1124,1579,1580],{"class":1126,"line":1358},[1124,1581,1166],{"emptyLinePlaceholder":9},[1124,1583,1585,1587,1589,1591,1593,1595,1598,1600,1602,1604,1606,1608,1610,1612,1615],{"class":1126,"line":1584},15,[1124,1586,1173],{"class":1172},[1124,1588,1363],{"class":1176},[1124,1590,1181],{"class":1180},[1124,1592,1453],{"class":1141},[1124,1594,491],{"class":1159},[1124,1596,1597],{"class":1189},"getValue",[1124,1599,1193],{"class":1141},[1124,1601,1156],{"class":1148},[1124,1603,1382],{"class":1152},[1124,1605,1156],{"class":1148},[1124,1607,1387],{"class":1159},[1124,1609,1395],{"class":1394},[1124,1611,1387],{"class":1159},[1124,1613,1614],{"class":1141}," context)",[1124,1616,1160],{"class":1159},[278,1618,1619,1620,1230],{},"A context of another kind sets ",[311,1621,1622],{},"kind",[1114,1624,1626],{"className":1116,"code":1625,"language":1119,"meta":1120,"style":1120},"const organization = { id: \"acme\", kind: \"organization\", name: \"Acme Inc.\", traits: { plan: \"enterprise\" } };\n\nconst newCheckout = client.getValue(\"new-checkout\", false, organization);\n",[311,1627,1628,1703,1707],{"__ignoreMap":1120},[1124,1629,1630,1632,1635,1637,1639,1642,1644,1646,1649,1651,1653,1656,1658,1660,1662,1664,1666,1669,1671,1673,1676,1678,1680,1683,1685,1687,1690,1692,1694,1696,1698,1700],{"class":1126,"line":1127},[1124,1631,1173],{"class":1172},[1124,1633,1634],{"class":1176}," organization",[1124,1636,1181],{"class":1180},[1124,1638,1425],{"class":1159},[1124,1640,1641],{"class":1226}," id",[1124,1643,1230],{"class":1159},[1124,1645,1149],{"class":1148},[1124,1647,1648],{"class":1152},"acme",[1124,1650,1156],{"class":1148},[1124,1652,1387],{"class":1159},[1124,1654,1655],{"class":1226}," kind",[1124,1657,1230],{"class":1159},[1124,1659,1149],{"class":1148},[1124,1661,769],{"class":1152},[1124,1663,1156],{"class":1148},[1124,1665,1387],{"class":1159},[1124,1667,1668],{"class":1226}," name",[1124,1670,1230],{"class":1159},[1124,1672,1149],{"class":1148},[1124,1674,1675],{"class":1152},"Acme Inc.",[1124,1677,1156],{"class":1148},[1124,1679,1387],{"class":1159},[1124,1681,1682],{"class":1226}," traits",[1124,1684,1230],{"class":1159},[1124,1686,1425],{"class":1159},[1124,1688,1689],{"class":1226}," plan",[1124,1691,1230],{"class":1159},[1124,1693,1149],{"class":1148},[1124,1695,1340],{"class":1152},[1124,1697,1156],{"class":1148},[1124,1699,1237],{"class":1159},[1124,1701,1702],{"class":1159}," };\n",[1124,1704,1705],{"class":1126,"line":1163},[1124,1706,1166],{"emptyLinePlaceholder":9},[1124,1708,1709,1711,1713,1715,1717,1719,1721,1723,1725,1727,1729,1731,1733,1735,1738],{"class":1126,"line":1169},[1124,1710,1173],{"class":1172},[1124,1712,1363],{"class":1176},[1124,1714,1181],{"class":1180},[1124,1716,1453],{"class":1141},[1124,1718,491],{"class":1159},[1124,1720,1597],{"class":1189},[1124,1722,1193],{"class":1141},[1124,1724,1156],{"class":1148},[1124,1726,1382],{"class":1152},[1124,1728,1156],{"class":1148},[1124,1730,1387],{"class":1159},[1124,1732,1395],{"class":1394},[1124,1734,1387],{"class":1159},[1124,1736,1737],{"class":1141}," organization)",[1124,1739,1160],{"class":1159},[278,1741,1742,1744,1745,464,1747,464,1749,484,1751,1753],{},[311,1743,1597],{}," is synchronous: the server SDK evaluates the rules it already holds in memory. The type of the value is the type of the in-code default value you pass, so a string flag is read with a string default and a JSON flag with an object. The ",[285,1746,167],{"href":168},[285,1748,172],{"href":173},[285,1750,177],{"href":178},[285,1752,182],{"href":183}," SDKs follow the same shape.",[372,1755,1757],{"id":1756},"browser-and-mobile-sdks","Browser and mobile SDKs",[278,1759,1760],{},"A web application with the LaunchDarkly JavaScript client SDK:",[1114,1762,1764],{"className":1116,"code":1763,"filename":1118,"language":1119,"meta":1120,"style":1120},"import * as LDClient from \"launchdarkly-js-client-sdk\";\n\nconst ldClient = LDClient.initialize(\"YOUR-CLIENT-SIDE-ID\", {\n  kind: \"user\",\n  key: \"user-123\",\n  name: \"Example User\",\n  plan: \"enterprise\",\n});\nawait ldClient.waitForInitialization(5);\n\nconst newCheckout = ldClient.variation(\"new-checkout\", false);\nldClient.on(\"change:new-checkout\", (value) => render(value));\n\nawait ldClient.identify({ kind: \"user\", key: \"user-456\" });\n",[311,1765,1766,1788,1792,1820,1834,1848,1862,1876,1885,1904,1908,1938,1979,1983],{"__ignoreMap":1120},[1124,1767,1768,1770,1772,1774,1777,1779,1781,1784,1786],{"class":1126,"line":1127},[1124,1769,1131],{"class":1130},[1124,1771,1135],{"class":1134},[1124,1773,1138],{"class":1130},[1124,1775,1776],{"class":1141}," LDClient ",[1124,1778,1145],{"class":1130},[1124,1780,1149],{"class":1148},[1124,1782,1783],{"class":1152},"launchdarkly-js-client-sdk",[1124,1785,1156],{"class":1148},[1124,1787,1160],{"class":1159},[1124,1789,1790],{"class":1126,"line":1163},[1124,1791,1166],{"emptyLinePlaceholder":9},[1124,1793,1794,1796,1798,1800,1803,1805,1807,1809,1811,1814,1816,1818],{"class":1126,"line":1169},[1124,1795,1173],{"class":1172},[1124,1797,1177],{"class":1176},[1124,1799,1181],{"class":1180},[1124,1801,1802],{"class":1141}," LDClient",[1124,1804,491],{"class":1159},[1124,1806,1481],{"class":1189},[1124,1808,1193],{"class":1141},[1124,1810,1156],{"class":1148},[1124,1812,1813],{"class":1152},"YOUR-CLIENT-SIDE-ID",[1124,1815,1156],{"class":1148},[1124,1817,1387],{"class":1159},[1124,1819,1259],{"class":1159},[1124,1821,1822,1824,1826,1828,1830,1832],{"class":1126,"line":1208},[1124,1823,1265],{"class":1226},[1124,1825,1230],{"class":1159},[1124,1827,1149],{"class":1148},[1124,1829,647],{"class":1152},[1124,1831,1156],{"class":1148},[1124,1833,1276],{"class":1159},[1124,1835,1836,1838,1840,1842,1844,1846],{"class":1126,"line":1244},[1124,1837,1282],{"class":1226},[1124,1839,1230],{"class":1159},[1124,1841,1149],{"class":1148},[1124,1843,1289],{"class":1152},[1124,1845,1156],{"class":1148},[1124,1847,1276],{"class":1159},[1124,1849,1850,1852,1854,1856,1858,1860],{"class":1126,"line":1249},[1124,1851,1299],{"class":1226},[1124,1853,1230],{"class":1159},[1124,1855,1149],{"class":1148},[1124,1857,1306],{"class":1152},[1124,1859,1156],{"class":1148},[1124,1861,1276],{"class":1159},[1124,1863,1864,1866,1868,1870,1872,1874],{"class":1126,"line":1262},[1124,1865,1333],{"class":1226},[1124,1867,1230],{"class":1159},[1124,1869,1149],{"class":1148},[1124,1871,1340],{"class":1152},[1124,1873,1156],{"class":1148},[1124,1875,1276],{"class":1159},[1124,1877,1878,1881,1883],{"class":1126,"line":1279},[1124,1879,1880],{"class":1159},"}",[1124,1882,1203],{"class":1141},[1124,1884,1160],{"class":1159},[1124,1886,1887,1889,1891,1893,1895,1897,1900,1902],{"class":1126,"line":1296},[1124,1888,1211],{"class":1130},[1124,1890,1177],{"class":1141},[1124,1892,491],{"class":1159},[1124,1894,1218],{"class":1189},[1124,1896,1193],{"class":1141},[1124,1898,1899],{"class":1233},"5",[1124,1901,1203],{"class":1141},[1124,1903,1160],{"class":1159},[1124,1905,1906],{"class":1126,"line":1313},[1124,1907,1166],{"emptyLinePlaceholder":9},[1124,1909,1910,1912,1914,1916,1918,1920,1922,1924,1926,1928,1930,1932,1934,1936],{"class":1126,"line":1330},[1124,1911,1173],{"class":1172},[1124,1913,1363],{"class":1176},[1124,1915,1181],{"class":1180},[1124,1917,1177],{"class":1141},[1124,1919,491],{"class":1159},[1124,1921,1375],{"class":1189},[1124,1923,1193],{"class":1141},[1124,1925,1156],{"class":1148},[1124,1927,1382],{"class":1152},[1124,1929,1156],{"class":1148},[1124,1931,1387],{"class":1159},[1124,1933,1395],{"class":1394},[1124,1935,1203],{"class":1141},[1124,1937,1160],{"class":1159},[1124,1939,1940,1943,1945,1948,1950,1952,1955,1957,1959,1962,1966,1968,1971,1974,1977],{"class":1126,"line":1347},[1124,1941,1942],{"class":1141},"ldClient",[1124,1944,491],{"class":1159},[1124,1946,1947],{"class":1189},"on",[1124,1949,1193],{"class":1141},[1124,1951,1156],{"class":1148},[1124,1953,1954],{"class":1152},"change:new-checkout",[1124,1956,1156],{"class":1148},[1124,1958,1387],{"class":1159},[1124,1960,1961],{"class":1159}," (",[1124,1963,1965],{"class":1964},"s99_P","value",[1124,1967,1203],{"class":1159},[1124,1969,1970],{"class":1172}," =>",[1124,1972,1973],{"class":1189}," render",[1124,1975,1976],{"class":1141},"(value))",[1124,1978,1160],{"class":1159},[1124,1980,1981],{"class":1126,"line":1353},[1124,1982,1166],{"emptyLinePlaceholder":9},[1124,1984,1985,1987,1989,1991,1994,1996,1998,2000,2002,2004,2006,2008,2010,2013,2015,2017,2020,2022,2024,2026],{"class":1126,"line":1358},[1124,1986,1211],{"class":1130},[1124,1988,1177],{"class":1141},[1124,1990,491],{"class":1159},[1124,1992,1993],{"class":1189},"identify",[1124,1995,1193],{"class":1141},[1124,1997,1223],{"class":1159},[1124,1999,1655],{"class":1226},[1124,2001,1230],{"class":1159},[1124,2003,1149],{"class":1148},[1124,2005,647],{"class":1152},[1124,2007,1156],{"class":1148},[1124,2009,1387],{"class":1159},[1124,2011,2012],{"class":1226}," key",[1124,2014,1230],{"class":1159},[1124,2016,1149],{"class":1148},[1124,2018,2019],{"class":1152},"user-456",[1124,2021,1156],{"class":1148},[1124,2023,1237],{"class":1159},[1124,2025,1203],{"class":1141},[1124,2027,1160],{"class":1159},[278,2029,2030,2031,2034,2035,2037,2038,484,2040,2042,2043,1230],{},"The same with the ConfigDirector ",[285,2032,2033],{"href":101},"JavaScript SDK",". The context is given to ",[311,2036,1481],{},", changes arrive through ",[311,2039,962],{},[311,2041,1993],{}," becomes ",[311,2044,2045],{},"updateContext",[1114,2047,2049],{"className":1116,"code":2048,"filename":1416,"language":1119,"meta":1120,"style":1120},"import { createClient } from \"@configdirector\u002Fclient-sdk\";\n\nconst client = createClient(\"YOUR-CLIENT-SDK-KEY\");\nawait client.initialize({\n  id: \"user-123\",\n  name: \"Example User\",\n  traits: { plan: \"enterprise\" },\n});\n\nconst newCheckout = client.getValue(\"new-checkout\", false);\nclient.watch(\"new-checkout\", false, (value) => render(value));\n\nawait client.updateContext({ id: \"user-456\" });\n",[311,2050,2051,2072,2076,2099,2114,2128,2142,2163,2171,2175,2205,2242,2246],{"__ignoreMap":1120},[1124,2052,2053,2055,2057,2059,2061,2063,2065,2068,2070],{"class":1126,"line":1127},[1124,2054,1131],{"class":1130},[1124,2056,1425],{"class":1159},[1124,2058,1428],{"class":1141},[1124,2060,1237],{"class":1159},[1124,2062,1433],{"class":1130},[1124,2064,1149],{"class":1148},[1124,2066,2067],{"class":1152},"@configdirector\u002Fclient-sdk",[1124,2069,1156],{"class":1148},[1124,2071,1160],{"class":1159},[1124,2073,2074],{"class":1126,"line":1163},[1124,2075,1166],{"emptyLinePlaceholder":9},[1124,2077,2078,2080,2082,2084,2086,2088,2090,2093,2095,2097],{"class":1126,"line":1169},[1124,2079,1173],{"class":1172},[1124,2081,1453],{"class":1176},[1124,2083,1181],{"class":1180},[1124,2085,1428],{"class":1189},[1124,2087,1193],{"class":1141},[1124,2089,1156],{"class":1148},[1124,2091,2092],{"class":1152},"YOUR-CLIENT-SDK-KEY",[1124,2094,1156],{"class":1148},[1124,2096,1203],{"class":1141},[1124,2098,1160],{"class":1159},[1124,2100,2101,2103,2105,2107,2109,2111],{"class":1126,"line":1208},[1124,2102,1211],{"class":1130},[1124,2104,1453],{"class":1141},[1124,2106,491],{"class":1159},[1124,2108,1481],{"class":1189},[1124,2110,1193],{"class":1141},[1124,2112,2113],{"class":1159},"{\n",[1124,2115,2116,2118,2120,2122,2124,2126],{"class":1126,"line":1244},[1124,2117,1505],{"class":1226},[1124,2119,1230],{"class":1159},[1124,2121,1149],{"class":1148},[1124,2123,1289],{"class":1152},[1124,2125,1156],{"class":1148},[1124,2127,1276],{"class":1159},[1124,2129,2130,2132,2134,2136,2138,2140],{"class":1126,"line":1249},[1124,2131,1299],{"class":1226},[1124,2133,1230],{"class":1159},[1124,2135,1149],{"class":1148},[1124,2137,1306],{"class":1152},[1124,2139,1156],{"class":1148},[1124,2141,1276],{"class":1159},[1124,2143,2144,2146,2148,2150,2152,2154,2156,2158,2160],{"class":1126,"line":1262},[1124,2145,1534],{"class":1226},[1124,2147,1230],{"class":1159},[1124,2149,1425],{"class":1159},[1124,2151,1689],{"class":1226},[1124,2153,1230],{"class":1159},[1124,2155,1149],{"class":1148},[1124,2157,1340],{"class":1152},[1124,2159,1156],{"class":1148},[1124,2161,2162],{"class":1159}," },\n",[1124,2164,2165,2167,2169],{"class":1126,"line":1279},[1124,2166,1880],{"class":1159},[1124,2168,1203],{"class":1141},[1124,2170,1160],{"class":1159},[1124,2172,2173],{"class":1126,"line":1296},[1124,2174,1166],{"emptyLinePlaceholder":9},[1124,2176,2177,2179,2181,2183,2185,2187,2189,2191,2193,2195,2197,2199,2201,2203],{"class":1126,"line":1313},[1124,2178,1173],{"class":1172},[1124,2180,1363],{"class":1176},[1124,2182,1181],{"class":1180},[1124,2184,1453],{"class":1141},[1124,2186,491],{"class":1159},[1124,2188,1597],{"class":1189},[1124,2190,1193],{"class":1141},[1124,2192,1156],{"class":1148},[1124,2194,1382],{"class":1152},[1124,2196,1156],{"class":1148},[1124,2198,1387],{"class":1159},[1124,2200,1395],{"class":1394},[1124,2202,1203],{"class":1141},[1124,2204,1160],{"class":1159},[1124,2206,2207,2210,2212,2214,2216,2218,2220,2222,2224,2226,2228,2230,2232,2234,2236,2238,2240],{"class":1126,"line":1330},[1124,2208,2209],{"class":1141},"client",[1124,2211,491],{"class":1159},[1124,2213,962],{"class":1189},[1124,2215,1193],{"class":1141},[1124,2217,1156],{"class":1148},[1124,2219,1382],{"class":1152},[1124,2221,1156],{"class":1148},[1124,2223,1387],{"class":1159},[1124,2225,1395],{"class":1394},[1124,2227,1387],{"class":1159},[1124,2229,1961],{"class":1159},[1124,2231,1965],{"class":1964},[1124,2233,1203],{"class":1159},[1124,2235,1970],{"class":1172},[1124,2237,1973],{"class":1189},[1124,2239,1976],{"class":1141},[1124,2241,1160],{"class":1159},[1124,2243,2244],{"class":1126,"line":1347},[1124,2245,1166],{"emptyLinePlaceholder":9},[1124,2247,2248,2250,2252,2254,2256,2258,2260,2262,2264,2266,2268,2270,2272,2274],{"class":1126,"line":1353},[1124,2249,1211],{"class":1130},[1124,2251,1453],{"class":1141},[1124,2253,491],{"class":1159},[1124,2255,2045],{"class":1189},[1124,2257,1193],{"class":1141},[1124,2259,1223],{"class":1159},[1124,2261,1641],{"class":1226},[1124,2263,1230],{"class":1159},[1124,2265,1149],{"class":1148},[1124,2267,2019],{"class":1152},[1124,2269,1156],{"class":1148},[1124,2271,1237],{"class":1159},[1124,2273,1203],{"class":1141},[1124,2275,1160],{"class":1159},[278,2277,2278,2280,2281,464,2283,464,2285,464,2287,464,2289,484,2291,2293,2294,491],{},[311,2279,1481],{}," resolves when the first values arrive or after its timeout, 3 seconds by default; after a timeout the client keeps connecting in the background and reads return the in-code default value until values arrive. The ",[285,2282,105],{"href":106},[285,2284,110],{"href":111},[285,2286,121],{"href":122},[285,2288,125],{"href":126},[285,2290,130],{"href":131},[285,2292,135],{"href":136}," SDKs follow the same shape, with a hook, composable, stream, or flow in place of ",[311,2295,962],{},[372,2297,2299],{"id":2298},"applications-on-openfeature","Applications on OpenFeature",[278,2301,2302,2303,2306,2307,464,2309,464,2311,484,2313,2315,2316,2318,2319,2322],{},"If your code reads flags through OpenFeature with the LaunchDarkly provider, the code does not change: register the ConfigDirector provider instead. The ",[311,2304,2305],{},"targetingKey"," becomes the context's identifier. Attributes the ConfigDirector provider reads are ",[311,2308,1622],{},[311,2310,812],{},[311,2312,1409],{},[311,2314,856],{},", so move the custom attributes your rules use into a ",[311,2317,1409],{}," attribute. See ",[285,2320,2321],{"href":189},"OpenFeature with ConfigDirector"," for the providers and the full mapping.",[372,2324,2326],{"id":2325},"which-sdk-replaces-which","Which SDK replaces which",[377,2328,2329,2339],{},[380,2330,2331],{},[383,2332,2333,2336],{},[386,2334,2335],{},"LaunchDarkly SDK",[386,2337,2338],{},"ConfigDirector SDK",[393,2340,2341,2351,2360,2368,2376,2384,2393,2401,2418,2431],{},[383,2342,2343,2346],{},[398,2344,2345],{},"JavaScript client",[398,2347,2348],{},[285,2349,2350],{"href":101},"JavaScript",[383,2352,2353,2356],{},[398,2354,2355],{},"React Web",[398,2357,2358],{},[285,2359,105],{"href":106},[383,2361,2362,2364],{},[398,2363,110],{},[398,2365,2366],{},[285,2367,110],{"href":111},[383,2369,2370,2372],{},[398,2371,121],{},[398,2373,2374],{},[285,2375,121],{"href":122},[383,2377,2378,2380],{},[398,2379,125],{},[398,2381,2382],{},[285,2383,125],{"href":126},[383,2385,2386,2389],{},[398,2387,2388],{},"iOS",[398,2390,2391],{},[285,2392,130],{"href":131},[383,2394,2395,2397],{},[398,2396,135],{},[398,2398,2399],{},[285,2400,135],{"href":136},[383,2402,2403,2406],{},[398,2404,2405],{},"Node.js server, Python, Java, .NET server, Go",[398,2407,2408,464,2410,464,2412,464,2414,464,2416],{},[285,2409,162],{"href":163},[285,2411,167],{"href":168},[285,2413,172],{"href":173},[285,2415,177],{"href":178},[285,2417,182],{"href":183},[383,2419,2420,2423],{},[398,2421,2422],{},"Next.js integration",[398,2424,2425,2427,2428,2430],{},[285,2426,146],{"href":147},". ConfigDirector also has a ",[285,2429,151],{"href":152}," SDK.",[383,2432,2433,2436],{},[398,2434,2435],{},"OpenFeature providers",[398,2437,2438,2440],{},[285,2439,2435],{"href":189}," for the web, Swift, Android, Flutter, Node.js, Python, Java, .NET, and Go",[278,2442,2443,2444,2448],{},"ConfigDirector has no SDK for Ruby, PHP, Rust, C++, Erlang, Haskell, Lua, Roku, or Electron, and no edge SDKs. If you need one of them, write to ",[285,2445,2447],{"href":2446},"mailto:sdks@configdirector.com","sdks@configdirector.com"," with the SDK you are looking for and we will let you know the projected date for its release.",[289,2450,2452],{"id":2451},"verify-then-remove-launchdarkly","Verify, then remove LaunchDarkly",[278,2454,2455],{},"Once an application reads a config from ConfigDirector:",[1060,2457,2458,2466,2473],{},[297,2459,2460,2463,2464,491],{},[300,2461,2462],{},"Evaluation Activity"," on the config shows the values being served in each environment. See ",[285,2465,2462],{"href":65},[297,2467,2468,2470,2471,491],{},[300,2469,74],{}," catch the mistakes a migration makes: a key the application asks for that does not exist, a config read with the wrong type, an in-code default value that drifts from the value served, and the default value served more often than expected. See ",[285,2472,74],{"href":75},[297,2474,2475],{},"For a flag you rolled out by percentage, the same identifier gets the same value on every evaluation, as in LaunchDarkly. The split itself is assigned afresh, so a user who was in LaunchDarkly's 10% is not necessarily in ConfigDirector's. Switch the SDK over at a point in the rollout where that is acceptable, or at 0% or 100%.",[278,2477,2478,2479,2481],{},"When every application has switched, remove the LaunchDarkly SDK and its keys from the code, and archive the flags in LaunchDarkly. From then on, the ",[285,2480,523],{"href":70}," tells you when each temporary config has settled and can be removed from the code too.",[289,2483,2485],{"id":2484},"metering","Metering",[278,2487,2488,2489,2492],{},"The two services meter different things, which matters for the bill once you are past the free allowance. LaunchDarkly counts client-side monthly active users and service connections. ConfigDirector counts client sessions, which are client SDK instances with a session that lasts up to 6 hours in a browser, service connection hours of your server SDKs, and Admin API requests. ",[285,2490,2491],{"href":54},"Pricing and billing"," explains the three and the free allowance, which applies on both pricing options.",[2494,2495,2496],"style",{},"html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .syTEX, html code.shiki .syTEX{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .s99_P, html code.shiki .s99_P{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit}",{"title":1120,"searchDepth":1163,"depth":1163,"links":2498},[2499,2500,2506,2507,2513,2514],{"id":291,"depth":1163,"text":292},{"id":369,"depth":1163,"text":370,"children":2501},[2502,2503,2504,2505],{"id":374,"depth":1169,"text":375},{"id":591,"depth":1169,"text":592},{"id":736,"depth":1169,"text":737},{"id":880,"depth":1169,"text":881},{"id":1025,"depth":1163,"text":1026},{"id":1102,"depth":1163,"text":1103,"children":2508},[2509,2510,2511,2512],{"id":1109,"depth":1169,"text":156},{"id":1756,"depth":1169,"text":1757},{"id":2298,"depth":1169,"text":2299},{"id":2325,"depth":1169,"text":2326},{"id":2451,"depth":1163,"text":2452},{"id":2484,"depth":1163,"text":2485},"Move your feature flags from LaunchDarkly to ConfigDirector. How projects, environments, flags, contexts, segments, and rollouts map, how to recreate the flags, and how to switch the SDKs over without a risky release.","md",null,{"modifiedAt":258},{"title":263,"icon":266},{"title":2521,"description":2522},"Migrating from LaunchDarkly to ConfigDirector","A step by step guide to moving feature flags from LaunchDarkly to ConfigDirector. Concept mapping, recreating flags with the dashboard, Terraform, or the MCP server, switching the SDKs, and verifying the result.","p0-baPc-DFmv8suY9GaGpwZOs7OT3gQqd6VsS5tAKXQ",[2525,2527],{"title":252,"path":253,"stem":254,"description":2526,"icon":255,"children":-1},"Manage projects, environments, configs, targeting rules, segments, and tags over HTTPS with an API token. The base URL, authentication, permissions, error responses, usage counting, the endpoints, and the OpenAPI document.",{"title":268,"path":269,"stem":270,"description":2528,"icon":266,"children":-1},"Move your remote configuration from Firebase Remote Config to ConfigDirector. How parameters, conditions, in-app defaults, and fetch and activate map, how to recreate the parameters, and how to switch the Flutter, Android, iOS, and web SDKs over.",1792183990871]