An open API service indexing awesome lists of open source software.

https://github.com/zenkiet/ngx-feature-proxy

Angular feature flag library with Unleash integration, provides reactive programing, type-safe feature flag management with zero-configuration setup.
https://github.com/zenkiet/ngx-feature-proxy

angular bem dashboard feature-flags library reactive-programming rxjs scss tool unleash

Last synced: 6 days ago
JSON representation

Angular feature flag library with Unleash integration, provides reactive programing, type-safe feature flag management with zero-configuration setup.

Awesome Lists containing this project

README

          

# ๐Ÿš€ ngx-feature-proxy

Icon

[![npm version](https://img.shields.io/npm/v/ngx-feature-proxy?style=flat-square&logo=npm&logoColor=white)](https://www.npmjs.com/package/ngx-feature-proxy)
[![npm downloads](https://img.shields.io/npm/dm/ngx-feature-proxy?style=flat-square&logo=npm&logoColor=white)](https://www.npmjs.com/package/ngx-feature-proxy)
[![npm bundle size](https://img.shields.io/bundlephobia/min/ngx-feature-proxy?style=flat-square&logo=npm&logoColor=white)](https://www.npmjs.com/package/ngx-feature-proxy)
[![npm type definitions](https://img.shields.io/npm/types/ngx-feature-proxy?style=flat-square&logo=typescript&logoColor=white)](https://www.npmjs.com/package/ngx-feature-proxy)

[![GitHub issues](https://img.shields.io/github/issues/zenkiet/ngx-feature-proxy?style=flat-square&logo=github)](https://github.com/zenkiet/ngx-feature-proxy/issues)
[![GitHub stars](https://img.shields.io/github/stars/zenkiet/ngx-feature-proxy?style=flat-square&logo=github)](https://github.com/zenkiet/ngx-feature-proxy/stargazers)
[![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/zenkiet/ngx-feature-proxy/release.yml?style=flat-square&logo=github)](https://github.com/zenkiet/ngx-feature-proxy/actions)
[![License](https://img.shields.io/github/license/zenkiet/ngx-feature-proxy?style=flat-square)](LICENSE)

**๐ŸŽฏ Type-safe Angular Feature Flag Library with Unleash Integration**

_Reactive programming โ€ข Zero-configuration setup โ€ข Enterprise-ready_

[๐Ÿ“ฆ NPM](https://www.npmjs.com/package/ngx-feature-proxy) โ€ข [๐Ÿš€ Quick Start](#-quick-start) โ€ข [๐Ÿ’ฌ Discussions](https://github.com/zenkiet/ngx-feature-proxy/discussions)

[![Demo](https://img.youtube.com/vi/K-2rLjG7qyQ/maxresdefault.jpg)](https://youtu.be/K-2rLjG7qyQ)

---

## ๐Ÿ“‘ Table of Contents

- [๐ŸŒŸ Features](#-features)
- [๐Ÿ“– What is Unleash?](#-what-is-unleash)
- [๐Ÿ—๏ธ Architecture](#๏ธ-architecture)
- [๐Ÿš€ Quick Start](#-quick-start)
- [๐Ÿ“ฆ Installation](#-installation)
- [โš™๏ธ Basic Setup](#๏ธ-basic-setup)
- [๐ŸŽฏ Your First Feature Flag](#-your-first-feature-flag)
- [๐ŸŽฎ Usage Guide](#-usage-guide)
- [๐Ÿ”ง Service Usage](#-service-usage)
- [๐ŸŽจ Directive Usage](#-directive-usage)
- [๐ŸŽฏ Simple Feature Check](#-simple-feature-check)
- [๐ŸŽฏ Complex Feature Check](#-complex-feature-check)
- [๐Ÿ›ก๏ธ Route Guards](#๏ธ-route-guards)
- [๐ŸŽช Advanced Guard Patterns](#-advanced-guard-patterns)
- [๐Ÿณ Docker Setup with Unleash](#-docker-setup-with-unleash)
- [๐Ÿณ Complete Docker Compose Setup](#-complete-docker-compose-setup)
- [๐ŸŒ Access Your Unleash](#-access-your-unleash)
- [๐Ÿค Contributing](#-contributing)
- [๐Ÿ› Bug Reports](#-bug-reports)
- [โœจ Feature Requests](#-feature-requests)
- [๐Ÿ› ๏ธ Development Workflow](#๏ธ-development-workflow)
- [๐Ÿ“ Commit Convention](#-commit-convention)
- [๐Ÿ“„ License](#-license)
- [๐Ÿ™ Acknowledgments](#-acknowledgments)
- [๐Ÿ“ž Support](#-support)
- [๐Ÿค Get Help \& Connect](#-get-help--connect)
- [๐Ÿ“Š Project Stats](#-project-stats)
- [๐ŸŒŸ Ready to get started?](#-ready-to-get-started)

---

## ๐ŸŒŸ Features

| Feature | Description |
| -------------------------- | -------------------------------------------- |
| ๐Ÿž **Debug Tool** | Built-in debug info for easy troubleshooting |
| โœจ **Type-Safe** | Full TypeScript support with strict typing |
| ๐Ÿš€ **Performance** | Optimized with caching and smart updates |
| ๐Ÿ›ก๏ธ **Route Protection** | Support for guards to protect routes |
| ๐ŸŽจ **Template Directives** | Declarative feature flag usage in templates |
| ๐Ÿ”ง **Flexible** | Support for complex feature flag expressions |
| ๐ŸŒ **Enterprise Ready** | Can be deployed in large-scale applications |

## ๐Ÿ“– What is Unleash?

Unleash is an open-source feature flag management platform that enables you to:

| Capability | Benefit |
| -------------------------- | ------------------------------------------------------------------ |
| ๐ŸŽ›๏ธ **Toggle Features** | Enable/disable features instantly without deployments |
| ๐ŸŽฏ **Targeted Rollouts** | Gradual feature rollouts to specific user segments |
| ๐Ÿงช **A/B Testing** | Run experiments with different feature variants |
| ๐Ÿ“Š **Analytics** | Track feature usage and performance metrics |
| ๐Ÿ”’ **Enterprise Security** | Role-based access control and audit logs |
| ๐ŸŒ **Multi-Environment** | Separate feature configurations for **develop/staging/production** |

---

## ๐Ÿ—๏ธ Architecture

```mermaid
graph TB
subgraph APP["๐Ÿ“ฑ Angular Application (Frontend)"]
COMP["๐Ÿงฉ Components"]
SERV["โš™๏ธ FeatureProxyService
- Manage Feature Flags
- Check Access"]
DIR["โœจ FeatureProxy Directive
- Show/Hide UI based on Flags"]
GUARD["๐Ÿ” FeatureProxy Guards
- Protect Routes"]
SIGNAL["๐Ÿ”„ Signal State
- Reactive Updates"]
end

subgraph UNLEASH["๐Ÿš€ Unleash Infrastructure"]
PROXY["๐Ÿ“ก Unleash Proxy
- HTTP/WebSocket
- Real-time Updates"]
SERVER["๐ŸŽ›๏ธ Unleash Server
- Control Panel
- Manage Features"]
DB["๐Ÿ’พ PostgreSQL
- Data Storage
- Persistence"]
end

subgraph USERS["๐Ÿ‘ฅ Users"]
ENDUSER["๐Ÿ‘ค End Users
- Use Application"]
DEVOPS["โš™๏ธ DevOps Team
- Manage Flags"]
end

%% Application Internal Flow
COMP -->|"use"| SERV
COMP -->|"use"| DIR
COMP -->|"use"| GUARD
SERV -->|"update"| SIGNAL
DIR -->|"check"| SERV
GUARD -->|"verify"| SERV

%% Communication with Unleash
SERV <-->|"๐Ÿ“ก HTTP/WebSocket
- Request Flags
- Real-time Sync"| PROXY
PROXY <-->|"๐Ÿ”„ Sync Flags
- Pull Configuration"| SERVER
SERVER <-->|"๐Ÿ’พ Read/Write
- Feature Data"| DB

%% User Interactions
ENDUSER -->|"๐Ÿ–ฑ๏ธ Interactions
- Trigger Features"| COMP
DEVOPS -->|"โš™๏ธ Toggle
- Manage Flags"| SERVER

%% Styling
classDef angular fill:#DD0031,stroke:#333,stroke-width:2px,color:#fff,font-size:12px
classDef unleash fill:#7C3AED,stroke:#333,stroke-width:2px,color:#fff,font-size:12px
classDef users fill:#059669,stroke:#333,stroke-width:2px,color:#fff,font-size:12px

class COMP,SERV,DIR,GUARD,SIGNAL angular
class PROXY,SERVER,DB unleash
class ENDUSER,DEVOPS users
```

**๐Ÿ”„ How it Works:**

1. **๐ŸŽฏ Feature Definition**: DevOps team defines feature flags in Unleash Server
2. **๐Ÿ“ก Real-time Sync**: Unleash Proxy pulls configurations and serves them via HTTP/WebSocket
3. **๐Ÿ”ง Angular Integration**: ngx-feature-proxy connects to Unleash Proxy using unleash-proxy-client
4. **๐Ÿ“Š Reactive Updates**: Service uses Angular signals to provide real-time feature flag state
5. **๐ŸŽจ Template Magic**: Directives and guards automatically react to feature flag changes
6. **๐Ÿ‘ค User Experience**: End users see features toggled instantly without page refreshes

---

## ๐Ÿš€ Quick Start

### ๐Ÿ“ฆ Installation

```bash
# ๐Ÿš€ Install the library
npm install ngx-feature-proxy
```

### โš™๏ธ Basic Setup

```typescript
// ๐Ÿ“ src/main.ts
import { bootstrapApplication } from '@angular/platform-browser';
import { provideFeatureProxy } from 'ngx-feature-proxy';
import { AppComponent } from './app/app.component';

bootstrapApplication(AppComponent, {
providers: [
// ๐ŸŽฏ Configure feature proxy
provideFeatureProxy({
url: 'http://localhost:3000/api/proxy', // ๐ŸŒ Your Unleash proxy URL
clientKey: 'your-client-key', // ๐Ÿ”‘ Your client key
appName: 'my-angular-app', // ๐Ÿ“ฑ Your app name

// ๐ŸŽ›๏ธ Optional: Advanced configuration
context: {
environment: 'development',
},
refreshInterval: 30, // โฑ๏ธ Refresh interval in seconds
metricsInterval: 60, // ๐Ÿ“Š Metrics interval in seconds
debug: true, // ๐Ÿž Enable debug mode
}),
// ... other providers
],
});
```

### ๐ŸŽฏ Your First Feature Flag

```typescript
// ๐Ÿ“ src/app/app.component.ts
import { Component, inject } from '@angular/core';
import { FeatureProxyService } from 'ngx-feature-proxy';

@Component({
selector: 'app-root',
template: `



๐Ÿ†• Welcome to the new dashboard!



๐Ÿš€ Access to premium beta features!


@if (isNewfeatureProxy) {
โœจ Try New Feature
}



๐Ÿ”„ Ready: {{ $state().ready }}


โฐ Last Update: {{ $state().lastUpdate | date: 'medium' }}




`,
standalone: true,
imports: [FeatureProxyDirective],
})
export class AppComponent {
private featureService = inject(FeatureProxyService);

// ๐ŸŽฏ Direct feature check
isNewFeatureEnabled = this.featureService.isEnabled('newFeature');

// ๐Ÿ“Š Reactive state
$state = this.featureService.$state;

tryNewFeature() {
console.log('๐Ÿš€ New feature activated!');
}
}
```

---

## ๐ŸŽฎ Usage Guide

### ๐Ÿ”ง Service Usage

The `FeatureProxyService` is the core of the library, providing programmatic access to feature flags:

```typescript
import { Component, inject, computed, effect } from '@angular/core';
import { FeatureProxyService } from 'ngx-feature-proxy';

@Component({
selector: 'app-feature-demo',
template: `





{{ $state().ready ? '๐ŸŸข Connected' : '๐ŸŸก Connecting...' }}

๐Ÿ“… Last update: {{ $state().lastUpdate | date: 'short' }}




๐Ÿ†• Beta Features


Status: {{ betaEnabled ? 'โœ… Enabled' : 'โŒ Disabled' }}



Try Beta Feature



๐Ÿ’Ž Premium Feature


Variant: {{ premiumVariant.name }}



Theme: {{ premiumVariant.payload.value }}




`,
standalone: true,
})
export class FeatureDemoComponent {
private featureService = inject(FeatureProxyService);

// ๐Ÿ“Š Reactive state
$state = this.featureService.$state;

// ๐ŸŽฏ Simple feature check
betaEnabled = computed(() => this.featureService.isEnabled('betaFeatures'));

// ๐ŸŽญ Get variant with payload
premiumVariant = computed(() => this.featureService.getVariant('premiumTheme'));

// ๐Ÿ”„ Complex feature expression
advancedMode = computed(() =>
this.featureService.features('premiumUser && (betaAccess || adminMode)')
);

constructor() {
// ๐Ÿ‘‚ React to impression events
effect(() => {
const impression = this.featureService.$impression();
if (impression.eventType === 'isEnabled') {
console.log('๐ŸŽฏ Feature accessed:', impression.featureName);
}
});
}

useBetaFeature() {
console.log('๐Ÿงช Beta feature activated!');
}

// ๐Ÿ”„ Update user context
async updateUserContext(userId: string) {
await this.featureService.updateContext({ userId }).toPromise();
console.log('๐Ÿ‘ค User context updated');
}

// ๐Ÿ“ก Manual refresh
async refreshFlags() {
await this.featureService.refresh().toPromise();
console.log('๐Ÿ”„ Feature flags refreshed');
}
}
```

### ๐ŸŽจ Directive Usage

The `*featureEnabled` directive provides declarative feature flag control in templates:

#### ๐ŸŽฏ Simple Feature Check

```html

๐Ÿ†• Welcome to the new dashboard!

```

#### ๐ŸŽฏ Complex Feature Check

```html


๐Ÿš€ Access to premium beta features!

```

### ๐Ÿ›ก๏ธ Route Guards

Protect your routes with feature flag-based guards:

```typescript
import { Routes } from '@angular/router';
import { featureProxyGuard } from 'ngx-feature-proxy';

export const routes: Routes = [
{
path: 'dashboard',
loadComponent: () => import('./dashboard/dashboard.component'),
canActivate: [
// ๐ŸŽฏ Simple feature guard
featureProxyGuard({
expression: 'newDashboard',
redirectTo: '/legacy-dashboard',
}),
],
},
{
path: 'admin',
loadChildren: () => import('./admin/admin.routes'),
canActivate: [
// ๐Ÿ›ก๏ธ Complex permission guard
featureProxyGuard({
expression: 'adminAccess && (betaTester || superUser)',
redirectTo: '/not-authorized',
}),
],
},
{
path: 'user',
loadComponent: () => import('./user/user.component'),
canActivate: [
// ๐Ÿ‘ค User-specific feature guard
featureProxyGuard({
condition: (service) => service.isEnabled('userFeatures') && service.getVariant('userTier').name === 'gold',
redirectTo: '/upgrade',
}),
],
}
{
path: 'premium',
loadChildren: () => import('./premium/premium.routes'),
canActivateChild: [
// ๐Ÿ’Ž Premium feature guard for child routes
featureProxyGuard({
expression: 'premiumUser && validSubscription',
redirectTo: '/subscribe',
}),
],
},
];
```

#### ๐ŸŽช Advanced Guard Patterns

```typescript
// ๐Ÿ”ง Custom guard with complex logic
export const premiumGuard = featureProxyGuard({
condition: (service) => {
const isPremium = service.isEnabled('premiumUser');
const isValidSubscription = service.isEnabled('validSubscription');
const variant = service.getVariant('premiumTier');

return isPremium && isValidSubscription && ['gold', 'platinum'].includes(variant.name);
},
redirectTo: '/upgrade',
});

// ๐ŸŒ Geo-based feature guard
export const geoFeatureGuard = featureProxyGuard({
condition: (service) => {
return service.features('featureEnabled && (region_US || region_EU)');
},
redirectTo: '/geo-restricted',
});

// ๐Ÿ“ฑ Device-specific guard
export const mobileFeatureGuard = featureProxyGuard({
condition: (service) => {
const isMobile = service.getVariant('deviceType').name === 'mobile';
return isMobile && service.isEnabled('mobileFeatures');
},
redirectTo: '/desktop-only',
});
```

---

## ๐Ÿณ Docker Setup with Unleash

### ๐Ÿณ Complete Docker Compose Setup

Create a `docker-compose.yml` file for a complete Unleash setup:

```yaml
# ๐Ÿณ docker-compose.yml
services:
unleash:
image: unleashorg/unleash-server:${UNLEASH_VERSION:-6}
container_name: unleash
restart: ${RESTART_POLICY:-unless-stopped}
ports:
- '4242:4242'
networks:
- unleash_net
environment:
# ๐Ÿ—„๏ธ Database configuration
DATABASE_URL: 'postgres://postgres:${UNLEASH_DATABASE_PASSWORD:-unleash}@unleash-db/postgres'
DATABASE_SSL: 'false'

# ๐Ÿ“Š Logging and performance
LOG_LEVEL: 'warn'

# ๐Ÿ”‘ API tokens (generate secure tokens for production)
INIT_FRONTEND_API_TOKENS: ${INIT_FRONTEND_API_TOKENS:-*:*.unleash-insecure-frontend-api-token}
INIT_BACKEND_API_TOKENS: ${INIT_BACKEND_API_TOKENS:-*:*.unleash-insecure-api-token}

# ๐ŸŒ Server configuration
UNLEASH_URL: 'https://${UNLEASH_DOMAIN:-localhost:4242}'

# ๐Ÿ‘ค Default admin credentials
UNLEASH_DEFAULT_ADMIN_PASSWORD: ${UNLEASH_DEFAULT_ADMIN_PASSWORD:-admin123}
UNLEASH_DEFAULT_ADMIN_USERNAME: ${UNLEASH_DEFAULT_ADMIN_USERNAME:-admin}

# โšก Performance optimizations
UNLEASH_PROXY_SECRETS: ${UNLEASH_PROXY_SECRETS:-some-secret}
depends_on:
unleash-db:
condition: service_healthy
healthcheck:
test: wget --no-verbose --tries=1 --spider http://localhost:4242/health || exit 1
interval: 1s
timeout: 1m
retries: 5
start_period: 15s
volumes:
# ๐Ÿ“ Optional: Custom configuration
- ./unleash-config:/opt/unleash/config:ro

unleash-db:
image: postgres:17-alpine
container_name: unleash-db
restart: ${RESTART_POLICY:-unless-stopped}
volumes:
- ${DATA_PATH:-./data}/unleash/postgresql/data:/var/lib/postgresql/data
expose:
- '5432'
networks:
- unleash_net
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=${UNLEASH_DATABASE_PASSWORD:-unleash123}
healthcheck:
test: ['CMD', 'pg_isready', '--username=postgres', '--host=127.0.0.1', '--port=5432']
interval: 2s
timeout: 1m
retries: 5
start_period: 10s

# ๐Ÿš€ Optional: Unleash Proxy (for better performance)
unleash-proxy:
image: unleashorg/unleash-proxy:latest
container_name: unleash-proxy
restart: ${RESTART_POLICY:-unless-stopped}
ports:
- '3000:3000'
networks:
- unleash_net
environment:
UNLEASH_URL: 'http://unleash:4242/api'
UNLEASH_API_TOKEN: ${INIT_BACKEND_API_TOKENS:-*:*.unleash-insecure-api-token}
UNLEASH_APP_NAME: 'unleash-proxy'
UNLEASH_INSTANCE_ID: 'unleash-proxy-1'
depends_on:
unleash:
condition: service_healthy

networks:
unleash_net:
driver: bridge

volumes:
unleash_data:
driver: local
```

Create a `.env` file for easy configuration:

```bash
# ๐Ÿ“ .env
# ๐Ÿณ Docker configuration
UNLEASH_VERSION=5.7
RESTART_POLICY=unless-stopped
DATA_PATH=./data

# ๐ŸŒ Domain and URLs
UNLEASH_DOMAIN=localhost:4242

# ๐Ÿ—„๏ธ Database
UNLEASH_DATABASE_PASSWORD=unleash123

# ๐Ÿ‘ค Admin credentials (CHANGE IN PRODUCTION!)
UNLEASH_DEFAULT_ADMIN_USERNAME=admin
UNLEASH_DEFAULT_ADMIN_PASSWORD=admin123

# ๐Ÿ”‘ API Tokens (GENERATE SECURE TOKENS FOR PRODUCTION!)
INIT_FRONTEND_API_TOKENS=*:development.unleash-insecure-frontend-api-token
INIT_BACKEND_API_TOKENS=*:development.unleash-insecure-api-token
UNLEASH_PROXY_SECRETS=proxy-secret-123

# ๐ŸŽฏ Optional: Context fields
UNLEASH_CONTEXT_FIELDS=userId,sessionId,environment,region
```

Commands to manage the Docker setup:

```bash
# ๐Ÿƒ Start the stack
docker-compose up -d

# ๐Ÿ“Š View logs
docker-compose logs -f unleash

# ๐Ÿ” Check health
docker-compose ps

# ๐Ÿ—‘๏ธ Clean up
docker-compose down -v

# ๐Ÿ“ˆ Scale proxy (for high traffic)
docker-compose up -d --scale unleash-proxy=3
```

### ๐ŸŒ Access Your Unleash

After running `docker-compose up -d`:

- **๐ŸŽ›๏ธ Unleash Dashboard**: http://localhost:4242
- **๐Ÿ”‘ Login**: admin / admin123 (or your configured credentials)
- **โšก Proxy Endpoint**: http://localhost:3000/proxy
- **๐Ÿ“Š Health Check**: http://localhost:4242/health

---

## ๐Ÿค Contributing

We welcome contributions! Here's how you can help:

### ๐Ÿ› Bug Reports

1. ๐Ÿ” Search existing issues
2. ๐Ÿ“ Create detailed bug report
3. ๐Ÿท๏ธ Use appropriate labels

### โœจ Feature Requests

1. ๐Ÿ’ก Discuss in GitHub Discussions
2. ๐Ÿ“‹ Create feature request issue
3. ๐Ÿš€ Submit pull request

### ๐Ÿ› ๏ธ Development Workflow

```bash
# ๐Ÿด Fork and clone
git clone https://github.com/your-username/ngx-feature-proxy.git
cd ngx-feature-proxy

# ๐ŸŒฟ Create feature branch
git checkout -b feat/amazing-feature

# โœ… Commit changes
git commit -m "โœจ Add amazing feature"

# ๐Ÿš€ Push and create PR
git push origin feat/amazing-feature
```

### ๐Ÿ“ Commit Convention

We use [Conventional Commits](https://www.conventionalcommits.org/):

- `โœจ feat:` New features
- `๐Ÿ› fix:` Bug fixes
- `๐Ÿ“š docs:` Documentation
- `๐ŸŽจ style:` Code formatting
- `โ™ป๏ธ refactor:` Code restructuring
- `๐Ÿš€ perf:` Performance improvements
- `๐Ÿšจ test:` Testing
- `๐Ÿ”ง chore:` Maintenance

---

## ๐Ÿ“„ License

This project is licensed under the **MIT License** - see the [LICENSE](LICENSE) file for details.

```
MIT License

Copyright (c) 2025 Kiet Le

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
```

---

## ๐Ÿ™ Acknowledgments

This project wouldn't be possible without these amazing technologies:

Angular

Angular

The best Framework ever

RxJS

RxJS

Reactive Programming

Unleash

Unleash

Feature Flag Management

Docker

Docker

Containerization

---

## ๐Ÿ“ž Support

### ๐Ÿค Get Help & Connect

[![Email](https://img.shields.io/badge/Email-zenkiet0906%40gmail.com-red?style=for-the-badge&logo=gmail&logoColor=white)](mailto:zenkiet0906@gmail.com)
[![GitHub Issues](https://img.shields.io/badge/Issues-GitHub-green?style=for-the-badge&logo=github&logoColor=white)](https://github.com/zenkiet/ngx-feature-proxy/issues)
[![Discussions](https://img.shields.io/badge/Discussions-GitHub-blue?style=for-the-badge&logo=github&logoColor=white)](https://github.com/zenkiet/ngx-feature-proxy/discussions)
[![Docker Hub](https://img.shields.io/badge/Docker-Hub-blue?style=for-the-badge&logo=docker&logoColor=white)](https://hub.docker.com/r/zenkiet/ngx-feature-proxy)

### ๐Ÿ“Š Project Stats

![GitHub contributors](https://img.shields.io/github/contributors/zenkiet/ngx-feature-proxy?style=flat-square)
![GitHub last commit](https://img.shields.io/github/last-commit/zenkiet/ngx-feature-proxy?style=flat-square)
![GitHub repo size](https://img.shields.io/github/repo-size/zenkiet/ngx-feature-proxy?style=flat-square)

---

### ๐ŸŒŸ Ready to get started?

**[๐Ÿ“ฆ Install Now](https://www.npmjs.com/package/ngx-feature-proxy) โ€ข [๐Ÿ“– View Docs](#-table-of-contents) โ€ข [๐Ÿ’ฌ Join Discussion](https://github.com/zenkiet/ngx-feature-proxy/discussions)**

---

**โญ If this project helped you, please consider giving it a star! โญ**

_Made with โค๏ธ by [ZenKiet](https://github.com/zenkiet)_