Feature Management
Codename: Mystique — The Shapeshifter. Changes app behavior instantly without redeploying.
Feature flags and A/B testing for the A.R.C. Framework.
Overview
The feature management layer provides:
- Feature flags and toggles
- Gradual rollouts
- A/B testing and experiments
- User targeting
- Kill switches for emergency rollback
Unleash - Feature Flags
Feature flag management for gradual rollouts and A/B testing.
Overview
Unleash provides:
- Feature flags and toggles
- Gradual rollouts
- A/B testing
- User targeting
- Kill switches
- Environment-based flags
Ports
- 4242 - Web UI and API
Configuration
See .env.example for configuration options.
Key Features
- Gradual Rollout - Roll out features to percentage of users
- User Targeting - Target specific users or groups
- Strategy-based - Multiple activation strategies
- Environment Support - Separate flags per environment
- SDKs - Client libraries for many languages
- Audit Trail - Track flag changes
Environment Variables
See .env.example for configuration options.
Key Variables:
UNLEASH_URL=http://unleash:4242
UNLEASH_API_TOKEN=<your-api-token>
DATABASE_URL=postgres://... # For persistence
Usage
Start Service
make up-stack
# or
docker compose -f docker-compose.yml -f docker-compose.stack.yml up unleash
Access Web UI
open http://localhost:4242
First-Time Setup
- Access http://localhost:4242
- Login with default credentials (check Unleash docs)
- Create API tokens
- Create feature flags
- Configure strategies
Feature Flag Patterns
1. Kill Switch
Enable/disable feature instantly without deployment
Use case: Emergency rollback
2. Gradual Rollout
Release to 10% → 25% → 50% → 100% of users
Use case: Safe feature deployment
3. User Targeting
Enable for specific users or user properties
Use case: Beta testing, VIP features
4. A/B Testing
Split users into variants A and B
Use case: Experiment with different approaches
5. Environment Flags
Different flag states per environment
Use case: Test in staging before production
Client Libraries
Go
import "github.com/Unleash/unleash-client-go/v4"
unleash.Initialize(
unleash.WithUrl("http://localhost:4242/api"),
unleash.WithAppName("my-service"),
unleash.WithInstanceId("instance-1"),
)
if unleash.IsEnabled("new-feature") {
// New feature code
} else {
// Old code
}
// With context
ctx := context.Context{
UserId: "user-123",
Properties: map[string]string{
"plan": "premium",
},
}
if unleash.IsEnabled("premium-feature", unleash.WithContext(ctx)) {
// Premium feature
}
Python
from UnleashClient import UnleashClient
client = UnleashClient(
url="http://localhost:4242/api",
app_name="my-service",
instance_id="instance-1"
)
client.initialize_client()
if client.is_enabled("new-feature"):
# New feature code
else:
# Old code
# With context
context = {
"userId": "user-123",
"properties": {"plan": "premium"}
}
if client.is_enabled("premium-feature", context):
# Premium feature
JavaScript/Node
const { initialize } = require('unleash-client');
const unleash = initialize({
url: 'http://localhost:4242/api',
appName: 'my-service',
instanceId: 'instance-1',
});
unleash.on('ready', () => {
if (unleash.isEnabled('new-feature')) {
// New feature code
}
});
// With context
const context = {
userId: 'user-123',
properties: { plan: 'premium' },
};
if (unleash.isEnabled('premium-feature', context)) {
// Premium feature
}
Activation Strategies
Standard Strategy
On/off for all users in environment
Flexible Rollout
Percentage-based gradual rollout
0% → 10% → 25% → 50% → 100%
User IDs
Target specific user IDs
userIds: user-1, user-2, user-3
Remote Address (IP)
Target specific IP addresses or ranges
Custom Strategy
Define your own strategy logic
Best Practices
1. Naming Convention
Format: domain-feature-action
Examples:
✅ agent-reasoning-enable-gpt4
✅ payment-checkout-show-paypal
✅ ui-dashboard-display-analytics
2. Strategy Selection
- Kill Switch - Use standard strategy
- Gradual Rollout - Use flexible rollout
- Beta Testing - Use user IDs or properties
- Regional - Use remote address or custom strategy
3. Flag Lifecycle
1. Create flag (off in all environments)
2. Enable in development
3. Test thoroughly
4. Enable in staging
5. Gradual rollout in production (10% → 100%)
6. Remove flag after stabilization
4. Clean Up Old Flags
Remove flags after:
- Feature is 100% rolled out
- Flag has been stable for 1-2 weeks
- Update code to remove flag checks
Monitoring
Key Metrics
- Flag evaluation count
- Variant distribution
- Toggle state changes
- API response times
Metrics API
# Get all toggles
curl http://localhost:4242/api/admin/features
# Get specific toggle
curl http://localhost:4242/api/admin/features/my-feature
# Get metrics
curl http://localhost:4242/api/admin/metrics/features/my-feature
Production Notes
- Persistence - Use external Postgres for flag storage
- High Availability - Deploy multiple Unleash instances
- Client Caching - SDKs cache flags locally
- API Tokens - Use separate tokens per environment
- Audit Trail - Monitor who changes flags
- Documentation - Document each flag's purpose
- Cleanup - Remove obsolete flags regularly
Integration with Observability
Send Flag Evaluations to Telemetry
// Add custom attribute to spans
if unleash.IsEnabled("new-feature") {
span.SetAttribute("feature.new-feature", true)
}
// Log flag evaluation
logger.Info("feature evaluated",
"feature", "new-feature",
"enabled", unleash.IsEnabled("new-feature"),
"user", userId)
Troubleshooting
Flag Not Updating
- Check client cache refresh interval (default: 15s)
- Verify API token has correct permissions
- Check network connectivity to Unleash server
- Review Unleash logs for errors
Inconsistent Flag States
- Verify environment configuration
- Check strategy configuration
- Review context being sent (userId, properties)
- Test with Unleash playground
Alternatives
If Unleash doesn't fit your needs:
- LaunchDarkly - SaaS, enterprise features
- Split - SaaS, A/B testing focused
- Flagsmith - Open-source, similar to Unleash
- GrowthBook - Open-source, experiment-focused
- Flipt - Lightweight, self-hosted