{"id":33918642,"url":"https://github.com/maxim-petlyuk/proteus","last_synced_at":"2026-05-28T06:43:50.216Z","repository":{"id":259427764,"uuid":"877824877","full_name":"maxim-petlyuk/proteus","owner":"maxim-petlyuk","description":"Implies flexibility in configuration management, ideal for A/B testing scenarios.","archived":false,"fork":false,"pushed_at":"2025-12-31T14:59:18.000Z","size":23492,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-03T16:56:28.032Z","etag":null,"topics":["a-b-testing","android","clevertap","configuration-management","firebase-remote-config","remote-config","remote-configs","remote-configurations"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/maxim-petlyuk.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-10-24T10:00:37.000Z","updated_at":"2025-12-31T14:59:21.000Z","dependencies_parsed_at":"2025-04-06T11:19:26.710Z","dependency_job_id":"752045f9-c681-47a0-b137-137dcb52549c","html_url":"https://github.com/maxim-petlyuk/proteus","commit_stats":null,"previous_names":["maxim-petlyuk/mock-config-lab","maxim-petlyuk/flex-config","maxim-petlyuk/proteus"],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/maxim-petlyuk/proteus","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxim-petlyuk%2Fproteus","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxim-petlyuk%2Fproteus/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxim-petlyuk%2Fproteus/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxim-petlyuk%2Fproteus/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/maxim-petlyuk","download_url":"https://codeload.github.com/maxim-petlyuk/proteus/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxim-petlyuk%2Fproteus/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33597808,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-28T02:00:06.440Z","response_time":99,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["a-b-testing","android","clevertap","configuration-management","firebase-remote-config","remote-config","remote-configs","remote-configurations"],"created_at":"2025-12-12T08:28:35.560Z","updated_at":"2026-05-28T06:43:50.209Z","avatar_url":"https://github.com/maxim-petlyuk.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"![proteus](https://raw.githubusercontent.com/maxim-petlyuk/proteus/refs/heads/main/assets/banner.png)\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/License-Apache%202.0-blue.svg\" alt=\"License\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://android-arsenal.com/api?level=23\"\u003e\u003cimg src=\"https://img.shields.io/badge/API-23%2B-brightgreen.svg?style=flat\" alt=\"API\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/maxim-petlyuk/proteus-config/actions\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/maxim-petlyuk/proteus/release-bom-only.yml?branch=main\" alt=\"Build Status\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/maxim-petlyuk/proteus/tree/main/docs\"\u003e\u003cimg src=\"https://img.shields.io/badge/docs-latest-brightgreen.svg\" alt=\"Documentation\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/maxim-petlyuk\"\u003e\u003cimg src=\"https://img.shields.io/badge/Profile-maxim--petlyuk-blue\" alt=\"Profile\"\u003e\u003c/a\u003e\u003cbr\u003e\n    \u003ca href=\"https://search.maven.org/artifact/io.github.maxim-petlyuk/proteus-core\"\u003e\u003cimg src=\"https://img.shields.io/maven-central/v/io.github.maxim-petlyuk/proteus-core.svg?label=proteus-core\" alt=\"Maven Central: proteus-core\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://search.maven.org/artifact/io.github.maxim-petlyuk/proteus-firebase\"\u003e\u003cimg src=\"https://img.shields.io/maven-central/v/io.github.maxim-petlyuk/proteus-firebase.svg?label=proteus-firebase\" alt=\"Maven Central: proteus-firebase\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://search.maven.org/artifact/io.github.maxim-petlyuk/proteus-ui\"\u003e\u003cimg src=\"https://img.shields.io/maven-central/v/io.github.maxim-petlyuk/proteus-ui.svg?label=proteus-ui\" alt=\"Maven Central: proteus-ui\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://search.maven.org/artifact/io.github.maxim-petlyuk/proteus-bom\"\u003e\u003cimg src=\"https://img.shields.io/maven-central/v/io.github.maxim-petlyuk/proteus-bom.svg?label=proteus-bom\" alt=\"Maven Central: proteus-bom\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cdiv\u003e\nProteus is an Android library for managing remote configurations with runtime override capabilities. It provides a type-safe abstraction\nlayer over remote config providers like Firebase, enabling teams to test feature flags and A/B variants instantly without server\ndeployments. The built-in Material Design 3 UI allows you to modify configurations directly on your device during development and testing.\nWith multi-module architecture and BOM support, Proteus seamlessly integrates into any Android application.\n\u003c/div\u003e\n\n## Why Proteus?\n\n**The Problem:** Testing remote configurations requires server deployments, slowing down your development cycle and making A/B testing\ntedious.\n\n**The Solution:** Proteus provides a runtime override UI that lets you instantly test any configuration scenario without waiting for backend\nchanges.\n\n**Unique Value:** Test feature flags, A/B variants, and remote configs in real-time directly on your device - no server round-trips\nrequired.\n\n## How it looks like?\n\n\u003cp align=\"center\"\u003e\n\u003cimg src=\"https://github.com/maxim-petlyuk/proteus/blob/main/assets/demo_enable_mock.gif?raw=true\" width=\"280\" alt=\"Enable mock config\"/\u003e\n\u003cimg src=\"https://github.com/maxim-petlyuk/proteus/blob/main/assets/demo_disable_mock.gif?raw=true\" width=\"280\" alt=\"Disable mock config\"/\u003e\n\u003c/p\u003e\n\n## Key Features\n\n- **Runtime Configuration Override** - Modify remote configs instantly through a polished local UI\n- **Multi-Provider Support** - Seamlessly integrate with Firebase, CleverTap, or custom providers\n- **Material Design 3** - Beautiful beige-themed UI that follows the latest design guidelines\n- **Multi-Module Architecture** - Independent versioning with BOM support for simplified dependency management\n- **Production-Ready** - Comprehensive error handling, async/await support with coroutines, and thread-safe operations\n\n## Packages\n\n| Package | Description |\n|---------|-------------|\n| [proteus-core](https://search.maven.org/artifact/io.github.maxim-petlyuk/proteus-core) | Core abstraction layer for remote configuration providers |\n| [proteus-firebase](https://search.maven.org/artifact/io.github.maxim-petlyuk/proteus-firebase) | Firebase Remote Config provider implementation |\n| [proteus-ui](https://search.maven.org/artifact/io.github.maxim-petlyuk/proteus-ui) | Material Design 3 UI for runtime configuration overrides |\n| [proteus-bom](https://search.maven.org/artifact/io.github.maxim-petlyuk/proteus-bom) | Bill of Materials for consistent version management |\n\n## Installation\n\n### Using BOM (Recommended)\n\n\u003ca href=\"https://search.maven.org/artifact/io.github.maxim-petlyuk/proteus-bom\"\u003e\u003cimg src=\"https://img.shields.io/maven-central/v/io.github.maxim-petlyuk/proteus-bom.svg?label=proteus-bom\" alt=\"Maven Central: proteus-bom\"\u003e\u003c/a\u003e\n\nThe Bill of Materials (BOM) ensures all Proteus modules use compatible versions:\n\n```toml\n[versions]\nproteus = \"$version\"\n\n[libraries]\nproteus-bom = { module = \"io.github.maxim-petlyuk:proteus-bom\", version.ref = \"proteus\" }\nproteus-core = { module = \"io.github.maxim-petlyuk:proteus-core\" }\nproteus-firebase = { module = \"io.github.maxim-petlyuk:proteus-firebase\" }\nproteus-ui = { module = \"io.github.maxim-petlyuk:proteus-ui\" }\n\n[bundles]\nproteus = [\"proteus-core\", \"proteus-firebase\", \"proteus-ui\"]\n```\n\nThen in your build.gradle.kts:\n\n```kotlin\ndependencies {\n    implementation(platform(libs.proteus.bom))\n    implementation(libs.bundles.proteus)\n}\n```\n\n### Requirements\n\n- **Minimum Android SDK**: 23\n- **Kotlin Coroutines**: Required for async operations\n- **Jetpack Compose**: Required for proteus-ui module only\n\n## Quick Start\n\nGet Proteus up and running in minutes with this minimal example:\n#### 1. Initialized first:\n\n```kotlin\nclass MainApp : Application() {\n\n    override fun onCreate() {\n        super.onCreate()\n\n        /* IMPORTANT: Initialize Firebase Remote Config BEFORE using FirebaseOnlyProviderFactory */\n\n        // Initialize Proteus with your feature definitions\n        Proteus.Builder(this)\n            .registerConfigProviderFactory(FirebaseOnlyProviderFactory())\n            .registerFeatureBookDataSource(\n                // Option A: Load from assets/features.json\n                AssetsFeatureBookDataSource(this, \"features.json\")\n                // Option B: Use runtime code\n                // StaticFeatureBookDataSource()\n            )\n            .build()\n    }\n}\n```\n\n#### 2. Build Proteus config provider\n```kotlin\nval provider = Proteus.getInstance().buildConfigProvider()\n```\n\n#### 3. Access configuration values anywhere in your app\n\n**Async Usage (Recommended):**\n```kotlin\n// In Activity/Fragment\nlifecycleScope.launch {\n    val darkModeEnabled = provider.getBoolean(\"dark_mode_enabled\")\n    val maxItems = provider.getLong(\"max_items_per_page\")\n    // Use configuration values...\n}\n```\n\n**Synchronous Usage (Legacy Compatibility):**\n```kotlin\n// For non-coroutine contexts\nval syncProvider = Proteus.getInstance().buildSynchronousConfigProvider()\nval darkModeEnabled = syncProvider.getBoolean(\"dark_mode_enabled\")\nval maxItems = syncProvider.getLong(\"max_items_per_page\")\n```\n\n#### 4. Show Proteus library UI for overriding remote config\n```kotlin\nstartActivity(Intent(this, FeatureBookActivity::class.java))\n```\n\n## Data Source Options\n\n#### Option A: JSON file in assets folder\n\nCreate `assets/features.json`:\n```json\n[\n  {\n    \"feature_key\": \"dark_mode_enabled\",\n    \"default_value\": \"false\",\n    \"value_type\": \"boolean\"\n  },\n  {\n    \"feature_key\": \"max_items_per_page\",\n    \"default_value\": \"20\",\n    \"value_type\": \"long\"\n  }\n]\n```\n\nThen register it during initialization:\n```kotlin\nProteus.Builder(this)\n    .registerConfigProviderFactory(FirebaseOnlyProviderFactory())\n    .registerFeatureBookDataSource(AssetsFeatureBookDataSource(context = this, jsonFilePath = \"features.json\"))\n    .build()\n```\n\n#### Option B: Runtime code\n\nCreate a custom data source with your feature definitions:\n\n```kotlin\nclass SampleFeatureBookDataSource : FeatureBookDataSource {\n\n    override suspend fun getFeatureBook(): Result\u003cList\u003cFeatureContext\u003c*\u003e\u003e\u003e {\n        return Result.success(\n            listOf(\n                Feature(\n                    key = \"dark_mode_enabled\",\n                    defaultValue = false,\n                    valueClass = Boolean::class\n                ),\n                Feature(\n                    key = \"max_items_per_page\",\n                    defaultValue = 20L,\n                    valueClass = Long::class\n                ),\n                Feature(\n                    key = \"api_timeout_seconds\",\n                    defaultValue = 30L,\n                    valueClass = Long::class\n                ),\n                Feature(\n                    key = \"animation_duration_multiplier\",\n                    defaultValue = 1.0,\n                    valueClass = Double::class\n                ),\n                Feature(\n                    key = \"primary_server_url\",\n                    defaultValue = \"https://api.production.com\",\n                    valueClass = String::class\n                )\n            )\n        )\n    }\n}\n```\n\nThen register it during initialization:\n```kotlin\nProteus.Builder(this)\n    .registerConfigProviderFactory(FirebaseOnlyProviderFactory())\n    .registerFeatureBookDataSource(SampleFeatureBookDataSource())\n    .build()\n```\n\n## Firebase Remote Config Migration\n\n### Before: Direct Firebase Remote Config Usage\n\n```kotlin\nclass FeatureManager(\n    private val remoteConfig : FirebaseRemoteConfig\n) {\n\n    fun isDarkModeEnabled(): Boolean {\n        return remoteConfig.getBoolean(\"dark_mode_enabled\")\n    }\n\n    fun getApiUrl(): String {\n        return remoteConfig.getString(\"primary_server_url\")\n    }\n}\n```\n\n### After: Using Proteus\n\n```kotlin\nclass FeatureManager(\n    private val configProvider: FeatureConfigProvider\n) {\n\n    // Async approach (recommended)\n    suspend fun isDarkModeEnabled(): Boolean {\n        return configProvider.getBoolean(\"dark_mode_enabled\")\n    }\n\n    // Or use synchronous wrapper for legacy code\n    fun isDarkModeEnabledSync(): Boolean {\n        val syncProvider = Proteus.getInstance().buildSynchronousConfigProvider()\n        return syncProvider.getBoolean(\"dark_mode_enabled\")\n    }\n\n    suspend fun getApiUrl(): String {\n        return configProvider.getString(\"primary_server_url\")\n    }\n}\n```\n\n### Key Benefits\n\n| Aspect | Before (Firebase only) | After (Proteus) |\n|--------|------------------------|-----------------|\n| **Testing Speed** | Minutes (Firebase Console changes) | Instant (runtime UI) |\n| **Override Capability** | None | Full runtime override |\n| **A/B Testing** | Requires Firebase Console setup | Test locally first |\n| **Debug Features** | Switch between Firebase Console \u0026 app | Visual UI directly in app |\n| **Development Workflow** | Firebase Console dependent | Independent local testing |\n\n## Core Concepts\n\n### Architecture Overview\n\nProteus uses a layered architecture with runtime override capabilities:\n\n```mermaid\ngraph TB\n    App[Your App]\n    UI[Runtime Override UI]\n    Core[Proteus Core\u003cbr/\u003eFeatureConfigProvider]\n    Mock[MockConfigProvider]\n    Storage[(SharedPreferences\u003cbr/\u003eLocal Overrides)]\n    Firebase[Firebase Remote Config]\n    CleverTap[CleverTap]\n    Custom[Custom Provider]\n\n    App --\u003e Core\n    UI --\u003e Core\n    Core --\u003e Mock\n    Mock --\u003e Storage\n    Core -.fallback.-\u003e Firebase\n    Core -.fallback.-\u003e CleverTap\n    Core -.fallback.-\u003e Custom\n\n    style App fill:#e1f5fe,stroke:#01579b,stroke-width:2px\n    style UI fill:#fff3e0,stroke:#e65100,stroke-width:2px\n    style Core fill:#f3e5f5,stroke:#4a148c,stroke-width:2px\n    style Mock fill:#fce4ec,stroke:#880e4f,stroke-width:2px\n    style Storage fill:#e8f5e9,stroke:#1b5e20,stroke-width:2px\n    style Firebase fill:#fff8e1,stroke:#f57f17,stroke-width:2px\n    style CleverTap fill:#fff8e1,stroke:#f57f17,stroke-width:2px\n    style Custom fill:#fff8e1,stroke:#f57f17,stroke-width:2px\n```\n\n### Key Components\n\n- **Proteus** - Central singleton that coordinates the entire system\n- **FeatureConfigProvider** - Type-safe interface for configuration access\n- **FeatureBookDataSource** - Defines all available features and their metadata\n- **MockConfigProvider** - Enables runtime overrides via local storage\n- **ConfigValue** - Type-safe wrapper ensuring correct value types\n\n### Provider Abstraction\n\nAll configuration providers implement a simple, type-safe interface:\n\n```kotlin\ninterface FeatureConfigProvider {\n    suspend fun getBoolean(featureKey: String): Boolean\n    suspend fun getString(featureKey: String): String\n    suspend fun getLong(featureKey: String): Long\n    suspend fun getDouble(featureKey: String): Double\n}\n```\n\n### Runtime Override Mechanism\n\nThe override mechanism follows a simple priority system:\n\n1. **Check Local Override**: First checks `MockConfigProvider` for user-overridden values\n2. **Fallback to Remote**: If no override exists, fetches from remote provider (Firebase, etc.)\n3. **Type Safety**: `ConfigValue` sealed class ensures type-safe value handling\n4. **Persistence**: Overrides are persisted in SharedPreferences across app sessions\n\n```kotlin\n// How FeatureConfigProviderImpl resolves values\nsuspend fun getBoolean(featureKey: String): Boolean {\n    return try {\n        mockConfigProvider.getBoolean(featureKey)  // Check override first\n    } catch (e: MockConfigUnavailableException) {\n        remoteProvider.getBoolean(featureKey)      // Fallback to remote\n    }\n}\n```\n\n### Feature Definition\n\nFeatures are defined with strong typing and default values:\n\n```kotlin\ndata class Feature\u003cDataType : Any\u003e(\n    val key: String,                    // Unique identifier\n    val defaultValue: DataType,         // Fallback value\n    val valueClass: KClass\u003cDataType\u003e    // Type information\n)\n\n// Example usage\nFeature(\n    key = \"dark_mode_enabled\",\n    defaultValue = false,\n    valueClass = Boolean::class\n)\n```\n\n### Configuration Lifecycle\n\n1. **Initialization**: App registers providers and data sources with `Proteus.Builder`\n2. **Feature Discovery**: `FeatureBookDataSource` provides all feature definitions\n3. **Value Resolution**: Provider checks overrides, then remote sources\n4. **Runtime Override**: UI allows instant value changes during development\n5. **Persistence**: Changes are saved and restored on next app launch\n\n## Coroutines Usage Patterns\n\nProteus supports both asynchronous (suspend functions) and synchronous APIs:\n\n### In Activities/Fragments\n```kotlin\nclass MainActivity : ComponentActivity() {\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        lifecycleScope.launch {\n            val provider = Proteus.getInstance().buildConfigProvider()\n            val isEnabled = provider.getBoolean(\"feature_enabled\")\n            // Use configuration...\n        }\n    }\n}\n```\n\n### In ViewModels\n```kotlin\nclass FeatureViewModel : ViewModel() {\n    fun loadConfiguration() {\n        viewModelScope.launch {\n            val provider = Proteus.getInstance().buildConfigProvider()\n            val config = AppConfig(\n                isEnabled = provider.getBoolean(\"feature_enabled\"),\n                timeout = provider.getLong(\"timeout_ms\")\n            )\n            // Update UI state...\n        }\n    }\n}\n```\n\n### In Compose\n```kotlin\n@Composable\nfun FeatureScreen() {\n    var isEnabled by remember { mutableStateOf(false) }\n\n    LaunchedEffect(Unit) {\n        val provider = Proteus.getInstance().buildConfigProvider()\n        isEnabled = provider.getBoolean(\"feature_enabled\")\n    }\n\n    if (isEnabled) {\n        NewFeatureContent()\n    }\n}\n```\n\n### Synchronous API (Legacy Compatibility)\n```kotlin\n// For non-coroutine contexts or legacy code\nval syncProvider = Proteus.getInstance().buildSynchronousConfigProvider()\nval isEnabled = syncProvider.getBoolean(\"feature_enabled\")\n```\n\n## Advanced Features\n\n### Custom Provider Implementation\n\nCreate your own configuration provider for any backend system:\n\n#### 1. Implement the FeatureConfigProvider Interface\n\n```kotlin\nclass CustomConfigProvider(\n    private val apiClient: YourApiClient\n) : FeatureConfigProvider {\n\n    override suspend fun getBoolean(featureKey: String): Boolean = withContext(Dispatchers.IO) {\n        apiClient.getConfig(featureKey)?.toBoolean() ?: false\n    }\n\n    override suspend fun getString(featureKey: String): String = withContext(Dispatchers.IO) {\n        apiClient.getConfig(featureKey) ?: \"\"\n    }\n\n    override suspend fun getLong(featureKey: String): Long = withContext(Dispatchers.IO) {\n        apiClient.getConfig(featureKey)?.toLongOrNull() ?: 0L\n    }\n\n    override suspend fun getDouble(featureKey: String): Double = withContext(Dispatchers.IO) {\n        apiClient.getConfig(featureKey)?.toDoubleOrNull() ?: 0.0\n    }\n}\n```\n\n#### 2. Create a Provider Factory\n\n```kotlin\nclass CustomProviderFactory(\n    private val apiClient: YourApiClient\n) : FeatureConfigProviderFactory {\n\n    private val provider = CustomConfigProvider(apiClient)\n\n    override fun getProvider(featureKey: String): FeatureConfigProvider {\n        return provider\n    }\n\n    override fun getProviderTag(featureKey: String): String {\n        return \"custom\"\n    }\n}\n```\n\n#### 3. Register with Proteus\n\n```kotlin\nProteus.Builder(context)\n    .registerConfigProviderFactory(CustomProviderFactory(apiClient))\n    .registerFeatureBookDataSource(dataSource)\n    .build()\n```\n\n#### Dependency Injection Setup\n\nUsing Hilt/Dagger for dependency injection:\n\n```kotlin\n@Module\n@InstallIn(SingletonComponent::class)\nobject ProteusModule {\n\n    @Provides\n    @Singleton\n    fun provideProteus(@ApplicationContext context: Context): Proteus {\n        return Proteus.Builder(context)\n            .registerConfigProviderFactory(FirebaseOnlyProviderFactory())\n            .registerFeatureBookDataSource(\n                AssetsFeatureBookDataSource(context, \"features.json\")\n            )\n            .build()\n    }\n\n    @Provides\n    @Singleton\n    fun provideFeatureConfigProvider(proteus: Proteus): FeatureConfigProvider {\n        return proteus.buildConfigProvider()\n    }\n}\n```\n\n### ProGuard/R8 Configuration\n\nProteus modules include consumer ProGuard rules automatically. For additional safety, you can add:\n\n```pro\n# Proteus\n-keep class io.proteus.** { *; }\n-keep class io.proteus.core.domain.** { *; }\n-keepattributes *Annotation*\n\n# Keep your custom providers\n-keep class com.yourpackage.CustomConfigProvider { *; }\n-keep class com.yourpackage.CustomProviderFactory { *; }\n```\n\n### Performance Considerations\n\n- **Caching**: Provider implementations should cache values to avoid repeated network/disk operations\n- **Lazy Loading**: Initialize Proteus in `Application.onCreate()` for immediate availability\n- **Thread Safety**: All Proteus providers are thread-safe by design\n- **Memory Usage**: Override values in SharedPreferences have minimal memory impact\n- **Network Optimization**: Batch fetch configurations when using custom API providers\n\n## Community\n\n### Contributing\n\nWe welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) for details on:\n- Code style and guidelines\n- Pull request process\n- Issue reporting\n- Development environment setup\n\n### Issues and Support\n\n- **Bug Reports**: [Create an issue](https://github.com/maxim-petlyuk/proteus/issues/new?template=bug_report.md)\n- **Feature Requests**: [Request a feature](https://github.com/maxim-petlyuk/proteus/issues/new?template=feature_request.md)\n- **Questions**: [Ask in Discussions](https://github.com/maxim-petlyuk/proteus/discussions)\n\n### Connect\n\n- **GitHub**: [@maxim-petlyuk](https://github.com/maxim-petlyuk)\n- **Issues**: [proteus/issues](https://github.com/maxim-petlyuk/proteus/issues)\n\n## Find this library useful? ⭐\n\nSupport it by joining [**stargazers**](https://github.com/maxim-petlyuk/proteus/stargazers) for this repository. ⭐\nAnd [**follow**](https://github.com/maxim-petlyuk) me for my next creations! 🤩\n\n## License\n\n```\nCopyright 2025 Maxim Petlyuk\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxim-petlyuk%2Fproteus","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmaxim-petlyuk%2Fproteus","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxim-petlyuk%2Fproteus/lists"}