PHPackages                             ericdowell/feature-toggle - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Database &amp; ORM](/categories/database)
4. /
5. ericdowell/feature-toggle

ActiveLibrary[Database &amp; ORM](/categories/database)

ericdowell/feature-toggle
=========================

Simple feature toggle api for Laravel applications.

v1.12.0(1y ago)3763↓33.3%[1 issues](https://github.com/ericdowell/feature-toggle/issues)MITPHPPHP ^7.2.5|^8.0

Since Aug 10Pushed 1y ago1 watchersCompare

[ Source](https://github.com/ericdowell/feature-toggle)[ Packagist](https://packagist.org/packages/ericdowell/feature-toggle)[ RSS](/packages/ericdowell-feature-toggle/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (10)Dependencies (4)Versions (30)Used By (0)

Feature Toggles
===============

[](#feature-toggles)

[![CircleCI](https://camo.githubusercontent.com/843f09a2b989bf1b610aa3e2f7ba14bcdaf576389231486d5f1a67a4f5acbec5/68747470733a2f2f636972636c6563692e636f6d2f67682f65726963646f77656c6c2f666561747572652d746f67676c652e7376673f7374796c653d737667)](https://circleci.com/gh/ericdowell/feature-toggle)[![StyleCI](https://camo.githubusercontent.com/9d371d3da14d0719f5879c4b941736d8466e76b7441affc800776a53f35e5a8c/68747470733a2f2f6769746875622e7374796c6563692e696f2f7265706f732f3230313534343433362f736869656c643f6272616e63683d6d6173746572)](https://github.styleci.io/repos/201544436)[![Test Coverage](https://camo.githubusercontent.com/e222e865729824f23c31cc53bcba5ffb01e94f4f0ff604fafc3d74d5e2f38da4/68747470733a2f2f6170692e636f6465636c696d6174652e636f6d2f76312f6261646765732f37386137366233333062623836353463343466662f746573745f636f766572616765)](https://codeclimate.com/github/ericdowell/feature-toggle/test_coverage)[![Maintainability](https://camo.githubusercontent.com/3fc7c15a5e8473e030077174a41740be7988be8cbcc322a9567d575ad1d83604/68747470733a2f2f6170692e636f6465636c696d6174652e636f6d2f76312f6261646765732f37386137366233333062623836353463343466662f6d61696e7461696e6162696c697479)](https://codeclimate.com/github/ericdowell/feature-toggle/maintainability)

[![License](https://camo.githubusercontent.com/8c1a5067793b820021080ef44d0700b65d0161d948152c206b465b4bfecbe439/68747470733a2f2f706f7365722e707567782e6f72672f65726963646f77656c6c2f666561747572652d746f67676c652f6c6963656e73653f666f726d61743d666c61742d737175617265)](https://packagist.org/packages/ericdowell/feature-toggle)[![Latest Stable Version](https://camo.githubusercontent.com/8345d7c156d052bc29aa2668080d11c3cace015f8eb5f0c5ba2394d940ef66e3/68747470733a2f2f706f7365722e707567782e6f72672f65726963646f77656c6c2f666561747572652d746f67676c652f76657273696f6e3f666f726d61743d666c61742d737175617265)](https://packagist.org/packages/ericdowell/feature-toggle)[![Latest Unstable Version](https://camo.githubusercontent.com/d80b7d5645fd021307916246f8633d5aaa5cc076e14e6e4f86bdcc4d044f6d92/68747470733a2f2f706f7365722e707567782e6f72672f65726963646f77656c6c2f666561747572652d746f67676c652f762f756e737461626c653f666f726d61743d666c61742d737175617265)](https://packagist.org/packages/ericdowell/feature-toggle)[![Total Downloads](https://camo.githubusercontent.com/f29165b75d5881a443397113ed0b79b1fc2d08aeddab43cfce42cc5b1fe4c29c/68747470733a2f2f706f7365722e707567782e6f72672f65726963646f77656c6c2f666561747572652d746f67676c652f646f776e6c6f6164733f666f726d61743d666c61742d737175617265)](https://packagist.org/packages/ericdowell/feature-toggle)

A simple feature toggle api for Laravel applications.

Table of Contents
-----------------

[](#table-of-contents)

- [Installation](#installation)
- [Testing](#testing)
- [Usage](#usage)
    - [Toggle Booting](#toggle-booting)
    - [Helper Functions](#helper-functions)
    - [Use with Laravel Blade Custom Directive](#use-with-laravel-blade-custom-directive)
    - [Use with Laravel Middleware](#use-with-laravel-middleware)
    - [Use with Laravel Task Scheduling](#use-with-laravel-task-scheduling)
    - [Use with Laravel Validation](#use-with-laravel-validation)
        - [Simple String](#simple-string)
        - [Via Illuminate\\Validation\\Rule](#via-illuminatevalidationrule)
        - [requiredIfRule Method on FeatureToggleApi](#requiredifrule-method-on-featuretoggleapi)
- [Toggle Providers](#toggle-providers)
    - [Add Additional Toggle Providers](#add-additional-toggle-providers)
    - [Local Feature Toggles](#local-feature-toggles)
        - [Toggle Parsing](#toggle-parsing)
    - [Conditional Feature Toggles](#conditional-feature-toggles)
    - [Eloquent Feature Toggles](#eloquent-feature-toggles)
        - [Database Migration](#database-migration)
        - [Eloquent Model](#eloquent-model)
    - [QueryString Toggle Provider](#querystring-toggle-provider)
        - [Configure Query String Keys](#configure-query-string-keys)
        - [Add Api Key Authorization](#add-api-key-authorization)
    - [Redis Toggle Provider](#redis-toggle-provider)
    - [Session Toggle Provider](#session-toggle-provider)
- [Frontend Feature Toggle Api](#frontend-feature-toggle-api)
- [Road Map](#road-map)

Installation
------------

[](#installation)

Install using composer by running:

```
composer require ericdowell/feature-toggle ^1.11
```

Publish the `feature-toggle.php` config file by running:

```
php artisan vendor:publish --tag="feature-toggle-config"
```

Testing
-------

[](#testing)

Run `composer test`.

Usage
-----

[](#usage)

If a feature toggle is not defined then `isActive` will return `false`.

Toggle Booting
--------------

[](#toggle-booting)

The Feature Toggle Api will pull all possible toggles at the boot of the application. This design allows there to be one database/cache/redis query instead of possibly many calls. This only becomes a problem if there're 100s of feature toggles.

Be mindful of how many database toggles are setup at given time, instead setup or move toggles to the local provider in `config/feature-toggle.php`.

### Helper Functions

[](#helper-functions)

`feature_toggle_api`:

```
if (feature_toggle_api()->isActive('Example')) {
    // do something
}
```

Or a shorter function that does the same as above called `feature_toggle`:

```
if (feature_toggle('Example')) {
    // do something
}
```

The `feature_toggle` function also allows a second parameter to be passed to allow for checking if the toggle is active (`true`) or if it is inactive (`false`):

```
if (feature_toggle('Example', false)) {
    // do something when toggle is inactive
}
// OR
if (feature_toggle('Example', 'off')) {
    // do something when toggle is inactive
}
```

The second parameter will parse as the local toggle does, read more in the [Toggle Parsing](#toggle-parsing) section to learn more.

### Use with Laravel Blade Custom Directive

[](#use-with-laravel-blade-custom-directive)

This custom directive uses the `feature_toggle` helper function directly, you can expect the same behavior:

```
@featureToggle('Example')
    // do something
@endfeatureToggle
```

Or if you'd like to check if the `Example` is inactive then you may pass a falsy value as the second parameter:

```
// returns true if toggle is inactive
@featureToggle('Example', false)
    // do something
@endfeatureToggle
// OR
@featureToggle('Example', 'off')
    // do something
@endfeatureToggle
```

Or you can use the normal `@if` blade directive and call `feature_toggle` function directly:

```
@if(feature_toggle('Example'))
    // do something
@endif
// OR
@if(feature_toggle('Example', 'off'))
    // do something
@endif
```

### Use with Laravel Middleware

[](#use-with-laravel-middleware)

The middleware signature is as follows:

```
featureToggle:{name},{status},{abort}

```

Where `status` and `abort` are optional parameters. `status` will default to `true` (truthy) and `abort` will default to `404` status code. `name` is required.

**Examples:**

```
use Illuminate\Support\Facades\Route;

// Passing all three parameters, changing abort to 403 status code.
Route::get('user/billing')->middleware('featureToggle:subscription,true,403')->uses('User\\BillingController@index')->name('billing.index');
// Passing two parameters.
Route::get('user/subscribe')->middleware('featureToggle:subscription,true')->uses('User\\SubscribeController@index')->name('subscribe.index');
// Passing just the name.
Route::get('user/trial')->middleware('featureToggle:trial')->uses('User\\TrialController@index')->name('trial.index');
```

### Use with Laravel Task Scheduling

[](#use-with-laravel-task-scheduling)

You can use the built-in `when` function in combination with the `feature_toggle` helper function in the `app/Console/Kernel.php``schedule` method.

```
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    protected function schedule(Schedule $schedule)
    {
        $schedule->command('inspire')
                 ->hourly()
                 ->when(feature_toggle('Inspire Command'));
    }
}
```

### Use with Laravel Validation

[](#use-with-laravel-validation)

There are three ways you can use the validation logic:

- Simple String
- Via `Illuminate\Validation\Rule`
- `requiredIfRule` Method on `FeatureToggleApi`

#### Simple String

[](#simple-string)

Use the normal simple string signature via `required_if_feature`:

```
required_if_feature:{name},{status}

```

Where `status` is an optional parameter. `status` will default to `true` (truthy). `name` parameter is required.

```
use Illuminate\Support\Facades\Validator;

Validator::make(request()->all(), [
    'phone' => 'required_if_feature:Require phone',
]);

Validator::make(request()->all(), [
    'phone' => 'required_if_feature:Require phone,on',
]);
```

#### Via Illuminate\\Validation\\Rule

[](#via-illuminatevalidationrule)

A macro method has been added to the `Rule` class called `requiredIfFeature`:

```
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

Validator::make(request()->all(), [
    'phone' => Rule::requiredIfFeature('Require phone'),
]);

Validator::make(request()->all(), [
    'phone' => Rule::requiredIfFeature('Require phone', true),
]);
```

#### requiredIfRule Method on FeatureToggleApi

[](#requiredifrule-method-on-featuretoggleapi)

You may also use the `requiredIfRule` method on the `FeatureToggleApi`/`feature_toggle_api` Facade or helper function:

```
use FeatureToggle\Facades\FeatureToggleApi;
use Illuminate\Support\Facades\Validator;

Validator::make(request()->all(), [
    'phone' => FeatureToggleApi::requiredIfRule('Require phone'),
]);

Validator::make(request()->all(), [
    'phone' => feature_toggle_api()->requiredIfRule('Require phone', true),
]);
```

Toggle Providers
----------------

[](#toggle-providers)

The default feature toggle providers are as follows:

- `conditional`
- `eloquent`
- `local` (config)
- `querystring`
- `redis`
- `session`

You can pass the `feature_toggle_api` helper function one of the above strings to get the toggle provider:

```
$redisProvider = feature_toggle_api('redis');
// return false
$redisProvider->isActive('Example Off');

$sessionProvider = feature_toggle_api('session');
// return false
$sessionProvider->isActive('Example False');
```

Or you can access each toggle provider via:

- `feature_toggle_api()->getConditionalProvider()`
- `feature_toggle_api()->getEloquentProvider()`
- `feature_toggle_api()->getLocalProvider()`
- `feature_toggle_api()->getQueryStringProvider()`
- `feature_toggle_api()->getRedisProvider()`
- `feature_toggle_api()->getSessionProvider()`

E.g.

```
$localProvider = feature_toggle_api()->getLocalProvider();
// return false
$localProvider->isActive('Example');

// Returns by reference.
$conditionalProvider = feature_toggle_api()->getConditionalProvider();
$conditionalProvider->setToggle('Example', function() { return true; });
// return true
$conditionalProvider->isActive('Example');

// Request ?feature=Example
$queryStringProvider = feature_toggle_api()->getQueryStringProvider();
// return true
$queryStringProvider->isActive('Example');

$eloquentProvider = feature_toggle_api()->getEloquentProvider();
// return false
$eloquentProvider->isActive('Example');
```

If you would like to set the `providers` in code you may call the following in the `boot` method of your `AppServiceProvider`:

```
feature_toggle_api()->setProviders([
    [
        'driver' => 'conditional',
    ],
    [
        'driver' => 'eloquent',
    ],
]);
```

### Add Additional Toggle Providers

[](#add-additional-toggle-providers)

You may add additional custom toggle providers or override the default toggle providers by adding them to the `drivers`key within `config/feature-toggle.php`:

```
return [
    'drivers' => [
        'local' => \App\FeatureToggle\LocalToggleProvider::class,
        'redis' => \App\FeatureToggle\RedisToggleProvider::class,
        'session' => \App\FeatureToggle\SessionToggleProvider::class,
    ],
];
```

Then just add them in the order you'd like them to be checked within `providers` as you would the defaults:

```
return [
    'providers' => [
        [
            'driver' => 'session',
        ],
        [
            'driver' => 'conditional',
        ],
        [
            'driver' => 'redis',
        ],
        [
            'driver' => 'local',
        ],
    ],
];
```

### Local Feature Toggles

[](#local-feature-toggles)

To add new toggle(s) you will need to update the published `config/feature-toggles.php` file:

```
return [
    // ...
    'toggles' => [
        'Example' => env('FEATURE_EXAMPLE'),
        'Show Something' => env('FEATURE_SHOW_SOMETHING'),
    ],
];
```

#### Toggle Parsing

[](#toggle-parsing)

The value passed from the `.env` file or set directly within config file can be:

- A `boolean`: `true`/`false`
- An `int` version of `boolean`: `1`/`0`
- Finally all supported values of [filter\_var($value, FILTER\_VALIDATE\_BOOLEAN)](https://www.php.net/manual/en/filter.filters.validate.php)

### Conditional Feature Toggles

[](#conditional-feature-toggles)

To add new conditional toggle(s) you will need to call `feature_toggle_api()->setConditional` method:

```
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;

// calling conditional function is deferred by default
feature_toggle_api()->setConditional('Example', function (Request $request) {
    $user = $request->user();
    return $user instanceof \App\User && $user->email === 'johndoe@example.com';
});

// OR call right away by passing false as $defer parameter
feature_toggle_api()->setConditional('Example', function () {
    return Cache::get('feature:example');
}, false);
```

**NOTE:** The function passed to `setConditional` does not get called right away by default, it is deferred to allow the Laravel app to bootstrap User/Session information. The conditional function is only called once and the value is cached to help prevent expensive operations from being recalculated when adding additional conditional toggles. Because of this design it is best to define these in `AppServiceProvider@boot` or in a `FeatureToggleServiceProvider@boot` that you create.

### Eloquent Feature Toggles

[](#eloquent-feature-toggles)

To use the `eloquent` driver you will need to update the `feature-toggle` config or `setProviders` method call, place the following within the `providers` key:

```
[
    'providers' => [
        [
            'driver' => 'eloquent',
        ],
    ],
];
```

OR

```
feature_toggle_api()->setProviders([
    [
        'driver' => 'conditional',
    ],
    [
        'driver' => 'eloquent',
    ],
    [
        'driver' => 'local',
    ],
]);
```

**NOTE:** Be sure to place this value in the order you would like it to be prioritized by the feature toggle api.

#### Database Migration

[](#database-migration)

By default the migration for `feature_toggles` is not loaded, to load this you can update the `options` key within `feature-toggle` config setting the `useMigrations` value to `true`:

```
return [
    'options' => [
        'useMigrations' => true,
    ],
];
```

If you would like to set the `useMigrations` in code you may call the following in the `register` method of your `AppServiceProvider`:

```
use FeatureToggle\Api;

Api::useMigrations();
```

You may also publish the `migrations` to your application by running the following:

```
php artisan vendor:publish --tag="feature-toggle-migrations"
```

Once you've used one of the methods above, you can run the following command to update your database with the `feature_toggles` migration(s):

```
php artisan migrate
```

#### Eloquent Model

[](#eloquent-model)

If you would like to use a different eloquent model you may do so by adding `model` to the config file:

```
return [
    'providers' => [
        [
            'driver' => 'eloquent',
            'model' => \App\FeatureToggle::class
        ],
    ],
];
```

### QueryString Toggle Provider

[](#querystring-toggle-provider)

To use the `querystring` driver you will need to update the `feature-toggle` config or `setProviders` method call, place the following within the `providers` key:

```
[
    'providers' => [
        [
            'driver' => 'querystring',
        ],
    ],
];
```

When making a request to your application you may now use the following query strings to make feature toggles active/inactive:

- `feature`
- `feature_off`

e.g. `http://localhost/?feature=Example&feature_off[]=Example%20Off&feature_off[]=Example%20Query%20String`

The following example will result in `Example` as active and `Example Off`/`Example Query String` as inactive. **NOTE:**This will only be true if the `querystring` provider is placed above other toggle providers that haven't already defined these feature toggles.

#### Configure Query String Keys

[](#configure-query-string-keys)

If you'd like to configure what the `active`/`inactive` feature toggle input keys are you may add `activeKey`and `inactiveKey` to config file.

Below is an example of configuring the query string keys as `active` and `inactive`:

```
return [
    'providers' => [
        [
            'driver' => 'querystring',
            'activeKey' => 'active',
            'inactiveKey' => 'inactive',
        ],
    ],
];
```

#### Add Api Key Authorization

[](#add-api-key-authorization)

To keep users or bad actors from enabling/disabling feature toggles via the `querystring` toggle provider you may configure the driver with a `token`/api key. By default the query string input is configured as `feature_token`, but this can be also be configured to any value.

```
return [
    'providers' => [
        [
            'driver' => 'querystring',
            'apiKey' => env('FEATURE_TOGGLE_API_KEY'),
            // Optionally change to something different.
            // 'apiInputKey' => 'feature_toggle_api_token',
        ],
    ],
];
```

### Redis Toggle Provider

[](#redis-toggle-provider)

To use the `redis` driver you will need to update the `feature-toggle` config or `setProviders` method call, place the following within the `providers` key:

```
[
    'providers' => [
        [
            'driver' => 'redis',
        ],
    ],
];
```

There are three options that can be configured:

- `key`, defaults to `feature_toggles`
- `prefix`, defaults to `null`
- `connection`, defaults to `default`

```
return [
    'providers' => [
        [
            'driver' => 'redis',
            'key' => 'toggles', // Optional, otherwise 'feature_toggles'
            'prefix' => 'feature', // Optional
            'connection' => 'toggles', // Must match key in database.redis.{connection}
        ],
    ],
];
```

Current implementation requires the array of toggles to be serialized in redis, you can use `Illuminate\Cache\RedisStore` `forever` method to persist toggle values.

### Session Toggle Provider

[](#session-toggle-provider)

To use the `session` driver you will need to update the `feature-toggle` config or `setProviders` method call, place the following within the `providers` key:

```
[
    'providers' => [
        [
            'driver' => 'session',
        ],
    ],
];
```

Frontend Feature Toggle Api
---------------------------

[](#frontend-feature-toggle-api)

Place the following in your main layout blade template in the `` tag.

```

    window.activeToggles = Object.freeze({!! feature_toggle_api()->activeTogglesToJson() !!});

```

Then create a new js file within `resources/js` called `featureToggle.js`:

```
const toggles = Object.keys(window.activeToggles || {})

export const featureToggle = (name, checkActive = true) =>
    checkActive ? toggles.includes(name) : !toggles.includes(name)
```

Expose on the `window` within `app.js`:

```
import { featureToggle } from './featureToggle'

// ...

window.featureToggle = featureToggle
```

and/or simply use `featureToggle` within your other js files:

```
import { featureToggle } from './featureToggle'

if (featureToggle('Example')) {
    // do something about it.
}
```

and/or create a `Feature` component that uses `featureToggle.js`:

```
// Feature.js
import { featureToggle } from './featureToggle'

export const Feature = ({ name, active: checkActive = true, children }) => {
    return featureToggle(name, checkActive) && children
}
```

```
// App.js
import React, { Component, Fragment } from 'react'
import { Feature } from './Feature'

class App extends Component {
    render() {
        return (

                   Nothing to see here!

        )
    }
}
```

Road Map
--------

[](#road-map)

### v1.x

[](#v1x)

- Local Feature Toggles via Config.
- Conditionally Enable/Disable Feature Toggles e.g. Authorization.
- Eloquent Feature Toggles.
- Query String Feature Toggles.
- Integrate toggles into:
    - Blade
    - Middleware
    - Validation

### v2.x

[](#v2x)

- Create/update toggles via common contract interface.
- Create Command to create/update toggles to be active/inactive.
- Classmap Feature Toggles (FeatureToggleServiceProvider similar to AuthServiceProvider $policies).

###  Health Score

39

—

LowBetter than 86% of packages

Maintenance37

Infrequent updates — may be unmaintained

Popularity21

Limited adoption so far

Community10

Small or concentrated contributor base

Maturity74

Established project with proven stability

 Bus Factor1

Top contributor holds 99.1% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~72 days

Recently: every ~454 days

Total

29

Last Release

443d ago

PHP version history (4 changes)v1.0.0PHP ^7.1.3

v1.1.0PHP ^7.2

v1.9.3PHP ^7.2.5

v1.9.4PHP ^7.2.5|^8.0

### Community

Maintainers

![](https://www.gravatar.com/avatar/36dcfe7b751e13acba5f9fb7821737b913263f69b9ea6063c7ac94fcbd4a8608?d=identicon)[ericdowell](/maintainers/ericdowell)

---

Top Contributors

[![ericdowell](https://avatars.githubusercontent.com/u/525506?v=4)](https://github.com/ericdowell "ericdowell (209 commits)")[![sneakylenny](https://avatars.githubusercontent.com/u/60601502?v=4)](https://github.com/sneakylenny "sneakylenny (1 commits)")[![StyleCIBot](https://avatars.githubusercontent.com/u/11048387?v=4)](https://github.com/StyleCIBot "StyleCIBot (1 commits)")

---

Tags

conditional-togglesdatabasedatabase-togglesfeaturefeature-flagfeature-flagsfeature-togglefeature-togglesfeatureslaravellocal-togglesquerystring-togglesredisredis-togglestoggle-providerstoggleslaraveldatabaselaravel-packageredisfeature-flagsfeature-togglesfeaturestogglestoggle-providerlocal-togglesconditional-togglesdatabase-togglesquerystring-togglesredis-toggles

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/ericdowell-feature-toggle/health.svg)

```
[![Health](https://phpackages.com/badges/ericdowell-feature-toggle/health.svg)](https://phpackages.com/packages/ericdowell-feature-toggle)
```

###  Alternatives

[illuminate/database

The Illuminate Database package.

2.8k52.4M9.4k](/packages/illuminate-database)[spiritix/lada-cache

A Redis based, automated and scalable database caching layer for Laravel

591444.8k2](/packages/spiritix-lada-cache)[cybercog/laravel-clickhouse

ClickHouse migrations for Laravel

163166.8k](/packages/cybercog-laravel-clickhouse)[ymigval/laravel-model-cache

Laravel package for caching Eloquent model queries

7642.2k3](/packages/ymigval-laravel-model-cache)[illuminatech/config

Provides support for Laravel application runtime configuration managed in persistent storage

14921.0k1](/packages/illuminatech-config)[toponepercent/baum

Baum is an implementation of the Nested Set pattern for Eloquent models.

3154.7k](/packages/toponepercent-baum)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
