{"id":"f29114ee-0dcd-420a-8c14-f341060ed5af","shortId":"55KLj4","kind":"skill","title":"azure-appconfiguration-ts","tagline":"Centralized configuration management with feature flags and dynamic refresh.","description":"# Azure App Configuration SDK for TypeScript\n\nCentralized configuration management with feature flags and dynamic refresh.\n\n## Installation\n\n```bash\n# Low-level CRUD SDK\nnpm install @azure/app-configuration @azure/identity\n\n# High-level provider (recommended for apps)\nnpm install @azure/app-configuration-provider @azure/identity\n\n# Feature flag management\nnpm install @microsoft/feature-management\n```\n\n## Environment Variables\n\n```bash\nAZURE_APPCONFIG_ENDPOINT=https://<your-resource>.azconfig.io\n# OR\nAZURE_APPCONFIG_CONNECTION_STRING=Endpoint=https://...;Id=...;Secret=...\n```\n\n## Authentication\n\n```typescript\nimport { AppConfigurationClient } from \"@azure/app-configuration\";\nimport { DefaultAzureCredential } from \"@azure/identity\";\n\n// DefaultAzureCredential (recommended)\nconst client = new AppConfigurationClient(\n  process.env.AZURE_APPCONFIG_ENDPOINT!,\n  new DefaultAzureCredential()\n);\n\n// Connection string\nconst client2 = new AppConfigurationClient(\n  process.env.AZURE_APPCONFIG_CONNECTION_STRING!\n);\n```\n\n## CRUD Operations\n\n### Create/Update Settings\n\n```typescript\n// Add new (fails if exists)\nawait client.addConfigurationSetting({\n  key: \"app:settings:message\",\n  value: \"Hello World\",\n  label: \"production\",\n  contentType: \"text/plain\",\n  tags: { environment: \"prod\" },\n});\n\n// Set (create or update)\nawait client.setConfigurationSetting({\n  key: \"app:settings:message\",\n  value: \"Updated value\",\n  label: \"production\",\n});\n\n// Update with optimistic concurrency\nconst existing = await client.getConfigurationSetting({ key: \"myKey\" });\nexisting.value = \"new value\";\nawait client.setConfigurationSetting(existing, { onlyIfUnchanged: true });\n```\n\n### Read Settings\n\n```typescript\n// Get single setting\nconst setting = await client.getConfigurationSetting({\n  key: \"app:settings:message\",\n  label: \"production\",  // optional\n});\nconsole.log(setting.value);\n\n// List with filters\nconst settings = client.listConfigurationSettings({\n  keyFilter: \"app:*\",\n  labelFilter: \"production\",\n});\n\nfor await (const setting of settings) {\n  console.log(`${setting.key}: ${setting.value}`);\n}\n```\n\n### Delete Settings\n\n```typescript\nawait client.deleteConfigurationSetting({\n  key: \"app:settings:message\",\n  label: \"production\",\n});\n```\n\n### Lock/Unlock (Read-Only)\n\n```typescript\n// Lock\nawait client.setReadOnly({ key: \"myKey\", label: \"prod\" }, true);\n\n// Unlock\nawait client.setReadOnly({ key: \"myKey\", label: \"prod\" }, false);\n```\n\n## App Configuration Provider\n\n### Load Configuration\n\n```typescript\nimport { load } from \"@azure/app-configuration-provider\";\nimport { DefaultAzureCredential } from \"@azure/identity\";\n\nconst appConfig = await load(\n  process.env.AZURE_APPCONFIG_ENDPOINT!,\n  new DefaultAzureCredential(),\n  {\n    selectors: [\n      { keyFilter: \"app:*\", labelFilter: \"production\" },\n    ],\n    trimKeyPrefixes: [\"app:\"],\n  }\n);\n\n// Map-style access\nconst value = appConfig.get(\"settings:message\");\n\n// Object-style access\nconst config = appConfig.constructConfigurationObject({ separator: \":\" });\nconsole.log(config.settings.message);\n```\n\n### Dynamic Refresh\n\n```typescript\nconst appConfig = await load(endpoint, credential, {\n  selectors: [{ keyFilter: \"app:*\" }],\n  refreshOptions: {\n    enabled: true,\n    refreshIntervalInMs: 30_000,  // 30 seconds\n  },\n});\n\n// Trigger refresh (non-blocking)\nappConfig.refresh();\n\n// Listen for refresh events\nconst disposer = appConfig.onRefresh(() => {\n  console.log(\"Configuration refreshed!\");\n});\n\n// Express middleware pattern\napp.use((req, res, next) => {\n  appConfig.refresh();\n  next();\n});\n```\n\n### Key Vault References\n\n```typescript\nconst appConfig = await load(endpoint, credential, {\n  selectors: [{ keyFilter: \"app:*\" }],\n  keyVaultOptions: {\n    credential: new DefaultAzureCredential(),\n    secretRefreshIntervalInMs: 7200_000,  // 2 hours\n  },\n});\n\n// Secrets are automatically resolved\nconst dbPassword = appConfig.get(\"database:password\");\n```\n\n## Feature Flags\n\n### Create Feature Flag (Low-Level)\n\n```typescript\nimport {\n  featureFlagPrefix,\n  featureFlagContentType,\n  FeatureFlagValue,\n  ConfigurationSetting,\n} from \"@azure/app-configuration\";\n\nconst flag: ConfigurationSetting<FeatureFlagValue> = {\n  key: `${featureFlagPrefix}Beta`,\n  contentType: featureFlagContentType,\n  value: {\n    id: \"Beta\",\n    enabled: true,\n    description: \"Beta feature\",\n    conditions: {\n      clientFilters: [\n        {\n          name: \"Microsoft.Targeting\",\n          parameters: {\n            Audience: {\n              Users: [\"user@example.com\"],\n              Groups: [{ Name: \"beta-testers\", RolloutPercentage: 50 }],\n              DefaultRolloutPercentage: 0,\n            },\n          },\n        },\n      ],\n    },\n  },\n};\n\nawait client.addConfigurationSetting(flag);\n```\n\n### Load and Evaluate Feature Flags\n\n```typescript\nimport { load } from \"@azure/app-configuration-provider\";\nimport {\n  ConfigurationMapFeatureFlagProvider,\n  FeatureManager,\n} from \"@microsoft/feature-management\";\n\nconst appConfig = await load(endpoint, credential, {\n  featureFlagOptions: {\n    enabled: true,\n    selectors: [{ keyFilter: \"*\" }],\n    refresh: {\n      enabled: true,\n      refreshIntervalInMs: 30_000,\n    },\n  },\n});\n\nconst featureProvider = new ConfigurationMapFeatureFlagProvider(appConfig);\nconst featureManager = new FeatureManager(featureProvider);\n\n// Simple check\nconst isEnabled = await featureManager.isEnabled(\"Beta\");\n\n// With targeting context\nconst isEnabledForUser = await featureManager.isEnabled(\"Beta\", {\n  userId: \"user@example.com\",\n  groups: [\"beta-testers\"],\n});\n```\n\n## Snapshots\n\n```typescript\n// Create snapshot\nconst snapshot = await client.beginCreateSnapshotAndWait({\n  name: \"release-v1.0\",\n  retentionPeriod: 2592000,  // 30 days\n  filters: [{ keyFilter: \"app:*\", labelFilter: \"production\" }],\n});\n\n// Get snapshot\nconst snap = await client.getSnapshot(\"release-v1.0\");\n\n// List settings in snapshot\nconst settings = client.listConfigurationSettingsForSnapshot(\"release-v1.0\");\nfor await (const setting of settings) {\n  console.log(`${setting.key}: ${setting.value}`);\n}\n\n// Archive/recover\nawait client.archiveSnapshot(\"release-v1.0\");\nawait client.recoverSnapshot(\"release-v1.0\");\n\n// Load from snapshot (provider)\nconst config = await load(endpoint, credential, {\n  selectors: [{ snapshotName: \"release-v1.0\" }],\n});\n```\n\n## Labels\n\n```typescript\n// Create settings with labels\nawait client.setConfigurationSetting({\n  key: \"database:host\",\n  value: \"dev-db.example.com\",\n  label: \"development\",\n});\n\nawait client.setConfigurationSetting({\n  key: \"database:host\",\n  value: \"prod-db.example.com\",\n  label: \"production\",\n});\n\n// Filter by label\nconst prodSettings = client.listConfigurationSettings({\n  keyFilter: \"*\",\n  labelFilter: \"production\",\n});\n\n// No label (null label)\nconst noLabelSettings = client.listConfigurationSettings({\n  labelFilter: \"\\0\",\n});\n\n// List available labels\nfor await (const label of client.listLabels()) {\n  console.log(label.name);\n}\n```\n\n## Key Types\n\n```typescript\nimport {\n  AppConfigurationClient,\n  ConfigurationSetting,\n  FeatureFlagValue,\n  SecretReferenceValue,\n  featureFlagPrefix,\n  featureFlagContentType,\n  secretReferenceContentType,\n  ListConfigurationSettingsOptions,\n} from \"@azure/app-configuration\";\n\nimport { load } from \"@azure/app-configuration-provider\";\n\nimport {\n  FeatureManager,\n  ConfigurationMapFeatureFlagProvider,\n} from \"@microsoft/feature-management\";\n```\n\n## Best Practices\n\n1. **Use provider for apps** - `@azure/app-configuration-provider` for runtime config\n2. **Use low-level for management** - `@azure/app-configuration` for CRUD operations\n3. **Enable refresh** - For dynamic configuration updates\n4. **Use labels** - Separate configurations by environment\n5. **Use snapshots** - For immutable release configurations\n6. **Sentinel pattern** - Use a sentinel key to trigger full refresh\n7. **RBAC roles** - `App Configuration Data Reader` for read-only access\n\n## When to Use\nThis skill is applicable to execute the workflow or actions described in the overview.\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.","tags":["azure","appconfiguration","antigravity","awesome","skills","sickn33","agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows"],"capabilities":["skill","source-sickn33","skill-azure-appconfiguration-ts","topic-agent-skills","topic-agentic-skills","topic-ai-agent-skills","topic-ai-agents","topic-ai-coding","topic-ai-workflows","topic-antigravity","topic-antigravity-skills","topic-claude-code","topic-claude-code-skills","topic-codex-cli","topic-codex-skills"],"categories":["antigravity-awesome-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/azure-appconfiguration-ts","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add sickn33/antigravity-awesome-skills","source_repo":"https://github.com/sickn33/antigravity-awesome-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 34928 github stars · SKILL.md body (8,355 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-24T18:50:29.247Z","embedding":null,"createdAt":"2026-04-18T21:32:10.976Z","updatedAt":"2026-04-24T18:50:29.247Z","lastSeenAt":"2026-04-24T18:50:29.247Z","tsv":"'0':405,484,503,514,530,536,552,594 '000':298,345,440 '1':631 '2':346,640 '2592000':486 '3':651 '30':297,299,439,487 '4':658 '5':665 '50':403 '6':672 '7':683 '7200':344 'access':265,274,694 'action':707 'add':108 'app':15,46,116,136,173,188,206,232,257,261,292,338,491,635,686 'app.use':320 'appconfig':61,66,89,100,247,251,285,331,425,445 'appconfig.constructconfigurationobject':277 'appconfig.get':268,354 'appconfig.onrefresh':313 'appconfig.refresh':306,324 'appconfigur':3 'appconfigurationcli':75,87,98,610 'applic':701 'archive/recover':524 'ask':745 'audienc':394 'authent':72 'automat':350 'avail':596 'await':113,133,150,157,170,192,203,217,225,248,286,332,406,426,455,463,478,498,516,525,531,543,559,568,599 'azconfig.io':63 'azur':2,14,60,65 'azure-appconfiguration-t':1 'azure/app-configuration':38,77,372,619,647 'azure/app-configuration-provider':49,241,418,623,636 'azure/identity':39,50,81,245 'bash':30,59 'best':629 'beta':378,383,387,400,457,465,470 'beta-test':399,469 'block':305 'boundari':753 'central':5,20 'check':452 'clarif':747 'clear':720 'client':85 'client.addconfigurationsetting':114,407 'client.archivesnapshot':526 'client.begincreatesnapshotandwait':479 'client.deleteconfigurationsetting':204 'client.getconfigurationsetting':151,171 'client.getsnapshot':499 'client.listconfigurationsettings':186,582,592 'client.listconfigurationsettingsforsnapshot':510 'client.listlabels':603 'client.recoversnapshot':532 'client.setconfigurationsetting':134,158,560,569 'client.setreadonly':218,226 'client2':96 'clientfilt':390 'concurr':147 'condit':389 'config':276,542,639 'config.settings.message':280 'configur':6,16,21,233,236,315,656,662,671,687 'configurationmapfeatureflagprovid':420,444,626 'configurationset':370,375,611 'connect':67,93,101 'console.log':179,197,279,314,521,604 'const':84,95,148,168,184,193,246,266,275,284,311,330,352,373,424,441,446,453,461,476,496,508,517,541,580,590,600 'contenttyp':124,379 'context':460 'creat':130,359,474,555 'create/update':105 'credenti':289,335,340,429,546 'criteria':756 'crud':34,103,649 'data':688 'databas':355,562,571 'day':488 'dbpassword':353 'defaultazurecredenti':79,82,92,243,254,342 'defaultrolloutpercentag':404 'delet':200 'describ':708,724 'descript':386 'dev-db.example.com':565 'develop':567 'dispos':312 'dynam':12,27,281,655 'enabl':294,384,431,436,652 'endpoint':62,69,90,252,288,334,428,545 'environ':57,127,664,736 'environment-specif':735 'evalu':411 'event':310 'execut':703 'exist':112,149,159 'existing.value':154 'expert':741 'express':317 'fail':110 'fals':231 'featur':9,24,51,357,360,388,412 'featureflagcontenttyp':368,380,615 'featureflagopt':430 'featureflagprefix':367,377,614 'featureflagvalu':369,612 'featuremanag':421,447,449,625 'featuremanager.isenabled':456,464 'featureprovid':442,450 'filter':183,489,577 'flag':10,25,52,358,361,374,408,413 'full':681 'get':165,494 'group':397,468 'hello':120 'high':41 'high-level':40 'host':563,572 'hour':347 'id':70,382 'immut':669 'import':74,78,238,242,366,415,419,609,620,624 'input':750 'instal':29,37,48,55 'isen':454 'isenabledforus':462 'key':115,135,152,172,205,219,227,326,376,561,570,606,678 'keyfilt':187,256,291,337,434,490,583 'keyvaultopt':339 'label':122,142,176,209,221,229,553,558,566,575,579,587,589,597,601,660 'label.name':605 'labelfilt':189,258,492,584,593 'level':33,42,364,644 'limit':712 'list':181,504,595 'listconfigurationsettingsopt':617 'listen':307 'load':235,239,249,287,333,409,416,427,537,544,621 'lock':216 'lock/unlock':211 'low':32,363,643 'low-level':31,362,642 'manag':7,22,53,646 'map':263 'map-styl':262 'match':721 'messag':118,138,175,208,270 'microsoft.targeting':392 'microsoft/feature-management':56,423,628 'middlewar':318 'miss':758 'mykey':153,220,228 'name':391,398,480 'new':86,91,97,109,155,253,341,443,448 'next':323,325 'nolabelset':591 'non':304 'non-block':303 'npm':36,47,54 'null':588 'object':272 'object-styl':271 'onlyifunchang':160 'oper':104,650 'optimist':146 'option':178 'output':730 'overview':711 'paramet':393 'password':356 'pattern':319,674 'permiss':751 'practic':630 'process.env.azure':88,99,250 'prod':128,222,230 'prod-db.example.com':574 'prodset':581 'product':123,143,177,190,210,259,493,576,585 'provid':43,234,540,633 'rbac':684 'read':162,213,692 'read-on':212,691 'reader':689 'recommend':44,83 'refer':328 'refresh':13,28,282,302,309,316,435,653,682 'refreshintervalinm':296,438 'refreshopt':293 'releas':482,501,512,528,534,550,670 'release-v1':481,500,511,527,533,549 'req':321 'requir':749 'res':322 'resolv':351 'retentionperiod':485 'review':742 'role':685 'rolloutpercentag':402 'runtim':638 'safeti':752 'scope':723 'sdk':17,35 'second':300 'secret':71,348 'secretreferencecontenttyp':616 'secretreferencevalu':613 'secretrefreshintervalinm':343 'selector':255,290,336,433,547 'sentinel':673,677 'separ':278,661 'set':106,117,129,137,163,167,169,174,185,194,196,201,207,269,505,509,518,520,556 'setting.key':198,522 'setting.value':180,199,523 'simpl':451 'singl':166 'skill':699,715 'skill-azure-appconfiguration-ts' 'snap':497 'snapshot':472,475,477,495,507,539,667 'snapshotnam':548 'source-sickn33' 'specif':737 'stop':743 'string':68,94,102 'style':264,273 'substitut':733 'success':755 'tag':126 'target':459 'task':719 'test':739 'tester':401,471 'text/plain':125 'topic-agent-skills' 'topic-agentic-skills' 'topic-ai-agent-skills' 'topic-ai-agents' 'topic-ai-coding' 'topic-ai-workflows' 'topic-antigravity' 'topic-antigravity-skills' 'topic-claude-code' 'topic-claude-code-skills' 'topic-codex-cli' 'topic-codex-skills' 'treat':728 'trigger':301,680 'trimkeyprefix':260 'true':161,223,295,385,432,437 'ts':4 'type':607 'typescript':19,73,107,164,202,215,237,283,329,365,414,473,554,608 'unlock':224 'updat':132,140,144,657 'use':632,641,659,666,675,697,713 'user':395 'user@example.com':396,467 'userid':466 'v1':483,502,513,529,535,551 'valid':738 'valu':119,139,141,156,267,381,564,573 'variabl':58 'vault':327 'workflow':705 'world':121","prices":[{"id":"fb24be73-bab2-4538-9305-a98a0adfb4b2","listingId":"f29114ee-0dcd-420a-8c14-f341060ed5af","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"sickn33","category":"antigravity-awesome-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T21:32:10.976Z"}],"sources":[{"listingId":"f29114ee-0dcd-420a-8c14-f341060ed5af","source":"github","sourceId":"sickn33/antigravity-awesome-skills/azure-appconfiguration-ts","sourceUrl":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/azure-appconfiguration-ts","isPrimary":false,"firstSeenAt":"2026-04-18T21:32:10.976Z","lastSeenAt":"2026-04-24T18:50:29.247Z"}],"details":{"listingId":"f29114ee-0dcd-420a-8c14-f341060ed5af","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sickn33","slug":"azure-appconfiguration-ts","github":{"repo":"sickn33/antigravity-awesome-skills","stars":34928,"topics":["agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows","antigravity","antigravity-skills","claude-code","claude-code-skills","codex-cli","codex-skills","cursor","cursor-skills","developer-tools","gemini-cli","gemini-skills","kiro","mcp","skill-library"],"license":"mit","html_url":"https://github.com/sickn33/antigravity-awesome-skills","pushed_at":"2026-04-24T06:41:17Z","description":"Installable GitHub library of 1,400+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections.","skill_md_sha":"fee8c1690c8ed788daa9baaad78be264698da8a0","skill_md_path":"skills/azure-appconfiguration-ts/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/azure-appconfiguration-ts"},"layout":"multi","source":"github","category":"antigravity-awesome-skills","frontmatter":{"name":"azure-appconfiguration-ts","description":"Centralized configuration management with feature flags and dynamic refresh."},"skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/azure-appconfiguration-ts"},"updatedAt":"2026-04-24T18:50:29.247Z"}}