2:I[7012,["4765","static/chunks/4765-f5afdf8061f456f3.js","9856","static/chunks/9856-3b185291364d9bef.js","6687","static/chunks/app/docs/%5B...slug%5D/page-e07536548216bee4.js"],"MarkdownRenderer"] 4:I[9856,["4765","static/chunks/4765-f5afdf8061f456f3.js","9856","static/chunks/9856-3b185291364d9bef.js","6687","static/chunks/app/docs/%5B...slug%5D/page-e07536548216bee4.js"],""] 5:I[4126,[],""] 7:I[9630,[],""] 8:I[4278,["9856","static/chunks/9856-3b185291364d9bef.js","8172","static/chunks/8172-b3a2d6fe4ae10d40.js","3185","static/chunks/app/layout-2814fa5d15b84fe4.js"],"HeadingProvider"] 9:I[1476,["9856","static/chunks/9856-3b185291364d9bef.js","8172","static/chunks/8172-b3a2d6fe4ae10d40.js","3185","static/chunks/app/layout-2814fa5d15b84fe4.js"],"Header"] a:I[3167,["9856","static/chunks/9856-3b185291364d9bef.js","8172","static/chunks/8172-b3a2d6fe4ae10d40.js","3185","static/chunks/app/layout-2814fa5d15b84fe4.js"],"Sidebar"] b:I[7409,["9856","static/chunks/9856-3b185291364d9bef.js","8172","static/chunks/8172-b3a2d6fe4ae10d40.js","3185","static/chunks/app/layout-2814fa5d15b84fe4.js"],"PageFrame"] 3:T201b, # Feature Flags Admin Panel Guide ## Accessing Feature Flags 1. Navigate to [admin.asimo.io](https://admin.asimo.io) 2. Login with admin credentials 3. Go to **Settings** > **Feature Flags** ## Interface Overview ``` ┌─────────────────────────────────────────────────────────┐ │ Feature Flags [+ New Flag] │ ├─────────────────────────────────────────────────────────┤ │ Filter: [All Categories ▼] [Search... ] │ ├─────────────────────────────────────────────────────────┤ │ ┌─────────────────────────────────────────────────────┐│ │ │ ui.dark_mode [Toggle] ││ │ │ Enable dark mode theme ││ │ │ Type: boolean | Status: Active | Updated: Dec 04 ││ │ └─────────────────────────────────────────────────────┘│ │ ┌─────────────────────────────────────────────────────┐│ │ │ backend.rag_strategy [Edit] ││ │ │ RAG retrieval strategy selection ││ │ │ Type: string | Value: "hybrid" | Updated: Dec 03 ││ │ └─────────────────────────────────────────────────────┘│ └─────────────────────────────────────────────────────────┘ ``` ## Common Operations ### Toggle a Boolean Flag 1. Find the flag in the list 2. Click the toggle switch 3. Confirm the change 4. Change takes effect immediately ### Edit a Percentage Flag 1. Click **Edit** on the flag 2. Adjust the percentage slider (0-100%) 3. Click **Save** 4. New percentage applies to next evaluation ### Create a New Flag 1. Click **+ New Flag** 2. Select category from dropdown 3. Enter flag name (snake_case) 4. Choose type (boolean/percentage/variant/scheduled) 5. Set default value 6. Add description 7. Click **Create** ### Filter and Search - **Category filter**: Show only `ui`, `backend`, etc. - **Search**: Filter by name or description - **Status filter**: Active, deprecated, disabled ## Real-Time Updates The Admin Panel uses Server-Sent Events (SSE) for real-time flag updates: - Changes by other admins appear immediately - No page refresh needed - Connection status shown in header ## Scheduled Variant Changes The Scheduled Changes feature allows you to schedule variant weight modifications for a future time. This is useful for: - Gradual rollouts scheduled for specific times - Feature releases coordinated with marketing campaigns - A/B test phase transitions - Time-zone aware deployments ### Accessing Scheduled Changes 1. Navigate to **Settings** > **Feature Flags** 2. Click the **Scheduled Changes** tab (or click the 📅 badge on a flag with pending changes) ### Interface Overview ``` ┌─────────────────────────────────────────────────────────────┐ │ Feature Flags │ ├─────────────────────────────────────────────────────────────┤ │ [Feature Flags] [Scheduled Changes (3)] │ ├─────────────────────────────────────────────────────────────┤ │ Pending Scheduled Changes [+ New Change] │ ├─────────────────────────────────────────────────────────────┤ │ ┌─────────────────────────────────────────────────────────┐│ │ │ ui.new_feature_rollout ││ │ │ Increase variant_a to 50% ││ │ │ Scheduled: Dec 10, 2025 09:00 (America/New_York) ││ │ │ [Preview] [Edit] [Cancel] ││ │ └─────────────────────────────────────────────────────────┘│ └─────────────────────────────────────────────────────────────┘ ``` ### Creating a Scheduled Change 1. Click **+ New Change** or **Schedule** on a flag 2. Select the target flag (if not pre-selected) 3. Set the scheduled date and time 4. Choose the timezone (IANA identifier, e.g., "America/New_York") 5. Configure variant weight changes: ``` control: 30% → 20% variant_a: 70% → 80% ``` 6. Add an optional description 7. Click **Schedule Change** ### Previewing Changes Before a scheduled change is applied, you can preview its effect: 1. Click **Preview** on a scheduled change 2. View the before/after comparison: - Current variant weights - New variant weights after change - Affected user percentage ### Managing Scheduled Changes #### Edit a Pending Change 1. Click **Edit** on the scheduled change 2. Modify time, timezone, or variant weights 3. Click **Save Changes** #### Cancel a Scheduled Change 1. Click **Cancel** on the scheduled change 2. Confirm the cancellation 3. The change is marked as cancelled (kept for audit) #### Delete a Scheduled Change 1. Click the delete icon (requires admin role) 2. Confirm permanent deletion 3. The change is removed from the system ### Timezone Handling - All times are stored in UTC internally - Display time uses the selected timezone - DST transitions are handled automatically - Common timezones: UTC, America/New_York, America/Los_Angeles, Europe/London ### Pending Changes Indicator Flags with pending scheduled changes show a badge: - 📅 badge appears next to the flag name - Badge count shows number of pending changes - Click the badge to jump to Scheduled Changes tab ### RBAC Permissions | Action | Admin | Viewer | | ----------------------- | ----- | ------ | | List scheduled changes | ✅ | ✅ | | Preview changes | ✅ | ✅ | | Create scheduled change | ✅ | ❌ | | Update scheduled change | ✅ | ❌ | | Cancel scheduled change | ✅ | ❌ | | Delete scheduled change | ✅ | ❌ | ### Monitoring Prometheus metrics for scheduled changes: - `voiceassist_flag_scheduled_changes_total{status}` - Counter for applied/cancelled/skipped changes - `voiceassist_flag_scheduled_changes_pending` - Gauge for pending changes count ## Audit Trail All flag changes are logged: - Who made the change - When it occurred - Previous and new values - Environment affected View audit log: **Settings** > **Audit Logs** > Filter by "feature_flags" ## Related Documentation - [Phase 4: User Overrides](../../feature-flags/PHASE_4_USER_OVERRIDES_PLAN.md) - Per-user flag overrides for testing and debugging - [API Reference](../../api-reference/rest-api.md) - REST API endpoints for flag management - [WebSocket API](../../api-reference/voice-pipeline-ws.md) - Real-time event streaming 6:["slug","admin-guide/feature-flags/admin-panel-guide","c"] 0:["X7oMT3VrOffzp0qvbeOas",[[["",{"children":["docs",{"children":[["slug","admin-guide/feature-flags/admin-panel-guide","c"],{"children":["__PAGE__?{\"slug\":[\"admin-guide\",\"feature-flags\",\"admin-panel-guide\"]}",{}]}]}]},"$undefined","$undefined",true],["",{"children":["docs",{"children":[["slug","admin-guide/feature-flags/admin-panel-guide","c"],{"children":["__PAGE__",{},[["$L1",["$","div",null,{"children":[["$","div",null,{"className":"mb-6 flex items-center justify-between gap-4","children":[["$","div",null,{"children":[["$","p",null,{"className":"text-sm text-gray-500 dark:text-gray-400","children":"Docs / Raw"}],["$","h1",null,{"className":"text-3xl font-bold text-gray-900 dark:text-white","children":"Feature Flags Admin Panel Guide"}],["$","p",null,{"className":"text-sm text-gray-600 dark:text-gray-400","children":["Sourced from"," ",["$","code",null,{"className":"font-mono text-xs","children":["docs/","admin-guide/feature-flags/admin-panel-guide.md"]}]]}]]}],["$","a",null,{"href":"https://github.com/mohammednazmy/VoiceAssist/edit/main/docs/admin-guide/feature-flags/admin-panel-guide.md","target":"_blank","rel":"noreferrer","className":"inline-flex items-center gap-2 rounded-md border border-gray-200 dark:border-gray-700 px-3 py-1.5 text-sm text-gray-700 dark:text-gray-200 hover:border-primary-500 dark:hover:border-primary-400 hover:text-primary-700 dark:hover:text-primary-300","children":"Edit on GitHub"}]]}],["$","div",null,{"className":"rounded-lg border border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-900 p-6","children":["$","$L2",null,{"content":"$3"}]}],["$","div",null,{"className":"mt-6 flex flex-wrap gap-2 text-sm","children":[["$","$L4",null,{"href":"/reference/all-docs","className":"inline-flex items-center gap-1 rounded-md bg-gray-100 px-3 py-1 text-gray-700 hover:bg-gray-200 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700","children":"← All documentation"}],["$","$L4",null,{"href":"/","className":"inline-flex items-center gap-1 rounded-md bg-gray-100 px-3 py-1 text-gray-700 hover:bg-gray-200 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700","children":"Home"}]]}]]}],null],null],null]},[null,["$","$L5",null,{"parallelRouterKey":"children","segmentPath":["children","docs","children","$6","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined"}]],null]},[null,["$","$L5",null,{"parallelRouterKey":"children","segmentPath":["children","docs","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined"}]],null]},[[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/7f586cdbbaa33ff7.css","precedence":"next","crossOrigin":"$undefined"}]],["$","html",null,{"lang":"en","className":"h-full","children":["$","body",null,{"className":"__className_f367f3 h-full bg-white dark:bg-gray-900","children":[["$","a",null,{"href":"#main-content","className":"skip-to-content","children":"Skip to main content"}],["$","$L8",null,{"children":[["$","$L9",null,{}],["$","$La",null,{}],["$","main",null,{"id":"main-content","className":"lg:pl-64","role":"main","aria-label":"Documentation content","children":["$","$Lb",null,{"children":["$","$L5",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[]}]}]}]]}]]}]}]],null],null],["$Lc",null]]]] c:[["$","meta","0",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","1",{"charSet":"utf-8"}],["$","title","2",{"children":"Feature Flags Admin Panel Guide | Docs | VoiceAssist Docs"}],["$","meta","3",{"name":"description","content":"Using the Admin Panel to manage feature flags and scheduled variant changes"}],["$","meta","4",{"name":"keywords","content":"VoiceAssist,documentation,medical AI,voice assistant,healthcare,HIPAA,API"}],["$","meta","5",{"name":"robots","content":"index, follow"}],["$","meta","6",{"name":"googlebot","content":"index, follow"}],["$","link","7",{"rel":"canonical","href":"https://assistdocs.asimo.io"}],["$","meta","8",{"property":"og:title","content":"VoiceAssist Documentation"}],["$","meta","9",{"property":"og:description","content":"Comprehensive documentation for VoiceAssist - Enterprise Medical AI Assistant"}],["$","meta","10",{"property":"og:url","content":"https://assistdocs.asimo.io"}],["$","meta","11",{"property":"og:site_name","content":"VoiceAssist Docs"}],["$","meta","12",{"property":"og:type","content":"website"}],["$","meta","13",{"name":"twitter:card","content":"summary"}],["$","meta","14",{"name":"twitter:title","content":"VoiceAssist Documentation"}],["$","meta","15",{"name":"twitter:description","content":"Comprehensive documentation for VoiceAssist - Enterprise Medical AI Assistant"}],["$","meta","16",{"name":"next-size-adjust"}]] 1:null