Hardcoded feature checks scatter across your frontend. Environment differences cause confusion. Deployments mismatch. Every new feature requires frontend updates.
The feature advertisement pattern solves this: backend advertises capabilities, frontend adapts. No feature list maintained on frontend. No environment-specific code. Just ask: “Do you have X?”
Architecture
Backend maintains a feature enum and registry. Configuration controls which features are enabled. Frontend fetches the list once at startup and checks dynamically.
┌─────────────┐ GET /api/features ┌─────────────┐
│ Frontend │────────────────────►│ Backend │
│ │◄────────────────────│ │
│ Adapts │ {features...} │ Advertises │
└─────────────┘ └─────────────┘
Backend: Define Features
# features.py
from enum import Enum
class Feature(str, Enum):
ADVANCED_SEARCH = "advanced_search"
EXPORT_PDF = "export_pdf"
BULK_OPERATIONS = "bulk_operations"
REAL_TIME_NOTIFICATIONS = "real_time_notifications"
Single source of truth. Backend only.