Skip to content

FEATURE FLAGS

Feature flags allow features to be enabled or disabled without code changes, supporting gradual rollouts, A/B testing, and per-environment configuration.

All flags default to false (disabled) unless set via environment variable.

Flag (camelCase)Environment VariableRoute(s)DescriptionE2E Tests
anonymousCrimeDataVITE_FEATURE_ANONYMOUS_CRIME_DATA/map (embedded)Crowdsourced suspicious activity reporting and map markersanonymous-crime-data.spec.ts
communityQAVITE_FEATURE_COMMUNITY_QA/qa, /qa/ask, /qa/questions/:idCommunity Q&A forumcommunity-qa.spec.ts
insuranceClaimsVITE_FEATURE_INSURANCE_CLAIMS/claims, /claims/new, /claims/:idInsurance claim filing and tracking assistantinsurance-claims.spec.ts
learningHubVITE_FEATURE_LEARNING_HUB/learning-hub, /learning-hub/module/:idEducational content, courses, badges, leaderboardlearning-hub.spec.ts
mentorshipVITE_FEATURE_MENTORSHIP/mentorship, /mentorship/*Peer support mentorship programmentorship.spec.ts
multiLanguageSupportVITE_FEATURE_MULTI_LANGUAGE_SUPPORTGlobal (language selector)Multi-language UI support
recoveryProgressTrackerVITE_FEATURE_RECOVERY_PROGRESS_TRACKER/recoveryStructured recovery journey with milestones and tasksrecovery-progress.spec.ts
riskDashboardVITE_FEATURE_RISK_DASHBOARD/risk-dashboardIncident risk intelligence dashboard with area searchrisk-dashboard.spec.ts
smartNeighborhoodAlertsVITE_FEATURE_SMART_NEIGHBORHOOD_ALERTS/alertsLocation-based crime alerts and notificationssmart-neighborhood-alerts.spec.ts
smartProductRecommendationsVITE_FEATURE_SMART_PRODUCT_RECOMMENDATIONS/recommendationsAI-powered security product recommendation quizsmart-product-recommendations.spec.ts
virtualSecurityAssessmentVITE_FEATURE_VIRTUAL_SECURITY_ASSESSMENT/recovery-resources/security-assessmentAI-powered photo-analysis security assessment (page always accessible; flag gates AI tab)virtual-security-assessment.spec.ts
Terminal window
VITE_FEATURE_RISK_DASHBOARD=true
VITE_FEATURE_COMMUNITY_QA=true
VITE_FEATURE_MENTORSHIP=false

Only values of exactly true enable a flag. Anything else (false, omitted, 0) disables it. Restart the dev server after changing .env.

The Playwright test runner sets all flags to true via webServer.env in playwright.config.ts. The .env.test file does the same for local E2E runs.

import { getFeatureFlags } from '@/config/featureFlags';
const featureFlags = getFeatureFlags();
// Inside the router:
{featureFlags.riskDashboard && (
<Route path="/risk-dashboard" element={<RiskDashboardPage />} />
)}
import { isFeatureEnabled } from '@/config/featureFlags';
if (isFeatureEnabled('mentorship')) {
// show mentorship nav item
}
import { useFeatureFlag } from '@/hooks/useFeatureFlag';
function MyComponent() {
const isEnabled = useFeatureFlag('virtualSecurityAssessment');
return isEnabled ? <AiAssessment /> : <ManualChecklist />;
}
vi.mock('@/config/featureFlags', () => ({
getFeatureFlags: () => ({
riskDashboard: true,
mentorship: false,
// ... all other flags
}),
isFeatureEnabled: (flag: string) => flag === 'riskDashboard',
}));
vi.mock('@/hooks/useFeatureFlag', () => ({
useFeatureFlag: (flag: string) => flag === 'riskDashboard',
}));
  1. Add to FeatureFlags interface in packages/webapp/src/config/featureFlags.ts:
export interface FeatureFlags {
// ... existing flags
myNewFeature: boolean;
}
  1. Add to defaultFeatureFlags in the same file:
export const defaultFeatureFlags: FeatureFlags = {
// ... existing flags
myNewFeature: import.meta.env.VITE_FEATURE_MY_NEW_FEATURE === 'true',
};
  1. Add to shared-types/src/features.ts (kebab-case string literal):
export type FeatureFlag = 'my-new-feature';
// ... existing flags
  1. Add to FeatureFlagPanel.tsx metadata record so it appears in the admin panel.

  2. Add to .env.example:

Terminal window
VITE_FEATURE_MY_NEW_FEATURE=false
  1. Enable in Playwright (packages/webapp/playwright.config.ts webServer.env):
VITE_FEATURE_MY_NEW_FEATURE: 'true',
  1. Write E2E tests in e2e-tests/my-new-feature.spec.ts.

  2. Update this table.

Feature flags are build-time / deploy-time values baked in by Vite via import.meta.env. They cannot be changed at runtime without restarting the server.

There is also a FeatureFlagsContext / FeatureToggleContext that wraps the same values in React context, seeding from getFeatureFlags(). This supports runtime overrides (e.g. admin toggleFlag) on top of the env-var base, but this capability is not currently exposed in the production UI.

FilePurpose
packages/webapp/src/config/featureFlags.tsAuthoritative flag definitions and env-var loading
packages/webapp/src/hooks/useFeatureFlag.tsReact hook wrapper
packages/webapp/src/components/feature-flags/FeatureGate.tsxJSX gate component
packages/webapp/src/components/FeatureFlagPanel.tsxRead-only admin panel (all flags + descriptions)
packages/shared-types/src/features.tsShared FeatureFlag string-literal type
packages/webapp/playwright.config.tsE2E: enables all flags via webServer.env
.env.exampleTemplate showing all flag env vars (all false)