Skip to content

Installation

This guide will walk you through installing Flaggy and configuring it for your application.

Prerequisites

  • .NET 6.0, 7.0, 8.0, or 9.0
  • Visual Studio 2022 or later (recommended)
  • Visual Studio Code with C# extension (alternative)
  • A database (MySQL, PostgreSQL, MS SQL) or use InMemory for development

NuGet Package Installation

Flaggy is distributed as NuGet packages. You need the core package and at least one provider.

Install Core Package

dotnet add package Flaggy

Install a Provider

Choose one of the following providers based on your storage backend:

MySQL Provider:

dotnet add package Flaggy.Provider.MySQL

PostgreSQL Provider:

dotnet add package Flaggy.Provider.PostgreSQL

MS SQL Server Provider:

dotnet add package Flaggy.Provider.MsSql

InMemory Provider (included in core):

# No additional package needed - use InMemoryFeatureFlagProvider from Flaggy

Optional Packages

Redis Caching (for distributed scenarios):

dotnet add package Flaggy.Caching.Redis

UI Dashboard:

dotnet add package Flaggy.UI

Service Configuration

Configure Flaggy in your ASP.NET Core application during startup.

InMemory Provider (Development)

The InMemory provider stores flags in memory, making it perfect for development without a database.

using Flaggy.Extensions;

var builder = WebApplication.CreateBuilder(args);

// Use InMemory provider with Memory cache
builder.Services.AddFlaggy(options =>
{
    options.UseInMemory();
    options.UseMemoryCache(TimeSpan.FromMinutes(5));
});

var app = builder.Build();
app.Run();

MySQL Provider

MySQL provider includes automatic database migration with version tracking.

using Flaggy.Extensions;

var builder = WebApplication.CreateBuilder(args);

var connectionString = builder.Configuration.GetConnectionString("DefaultConnection")
    ?? "Server=localhost;Database=myapp;User=root;Password=pass;";

// Add Flaggy with MySQL provider and Memory cache
builder.Services.AddFlaggy(options =>
{
    options.UseMySQL(
        connectionString: connectionString,
        tableName: "feature_flags",    // optional, default is "feature_flags"
        userTableName: "users",         // optional, default is "users"
        autoMigrate: true);             // optional, default is true

    options.UseMemoryCache(cacheExpiration: TimeSpan.FromMinutes(5));
});

var app = builder.Build();
app.Run();

Automatically created tables: - feature_flags - Stores your feature flags - users - Stores dashboard users with BCrypt hashed passwords - flaggy_migrations - Tracks schema version

PostgreSQL Provider

PostgreSQL provider also includes automatic migration with version tracking.

using Flaggy.Extensions;

var builder = WebApplication.CreateBuilder(args);

var connectionString = builder.Configuration.GetConnectionString("DefaultConnection")
    ?? "Host=localhost;Database=myapp;Username=postgres;Password=pass";

// Add Flaggy with PostgreSQL provider and Memory cache
builder.Services.AddFlaggy(options =>
{
    options.UsePostgreSQL(
        connectionString: connectionString,
        tableName: "feature_flags",    // optional, default is "feature_flags"
        userTableName: "users",         // optional, default is "users"
        autoMigrate: true);             // optional, default is true

    options.UseMemoryCache(cacheExpiration: TimeSpan.FromMinutes(5));
});

var app = builder.Build();
app.Run();

Automatically created tables: - feature_flags - Stores your feature flags - users - Stores dashboard users with BCrypt hashed passwords - flaggy_migrations - Tracks schema version

MS SQL Server Provider

MS SQL Server provider includes automatic migration with version tracking.

using Flaggy.Extensions;

var builder = WebApplication.CreateBuilder(args);

var connectionString = builder.Configuration.GetConnectionString("DefaultConnection")
    ?? "Server=localhost;Database=myapp;User Id=sa;Password=pass;TrustServerCertificate=True";

// Add Flaggy with MS SQL provider and Memory cache
builder.Services.AddFlaggy(options =>
{
    options.UseMsSql(
        connectionString: connectionString,
        tableName: "feature_flags",    // optional, default is "feature_flags"
        userTableName: "users",         // optional, default is "users"
        autoMigrate: true);             // optional, default is true

    options.UseMemoryCache(cacheExpiration: TimeSpan.FromMinutes(5));
});

var app = builder.Build();
app.Run();

Automatically created tables: - feature_flags - Stores your feature flags - users - Stores dashboard users with BCrypt hashed passwords - flaggy_migrations - Tracks schema version

UI Dashboard Setup

The Flaggy dashboard provides a web interface to manage your feature flags and users.

Install Dashboard Package

dotnet add package Flaggy.UI

Configure Dashboard

Add the dashboard middleware to your application:

using Flaggy.Extensions;
using Flaggy.UI.Extensions;

var builder = WebApplication.CreateBuilder(args);

// Configure your provider
builder.Services.AddFlaggy(options =>
{
    options.UseMySQL(connectionString);
    options.UseMemoryCache(TimeSpan.FromMinutes(5));
});

var app = builder.Build();

// Add Flaggy UI Dashboard
app.UseFlaggyUI(options =>
{
    options.RoutePrefix = "/flaggy";           // optional, default is "/flaggy"
    options.RequireAuthorization = false;       // optional, default is false
});

app.Run();

Access the Dashboard

Navigate to your configured route in your browser:

https://localhost:5001/flaggy

Create Dashboard Users

You can create dashboard users programmatically at startup:

using Flaggy.Extensions;
using Flaggy.Models;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddFlaggy(options =>
{
    options.UseMySQL(connectionString);
    options.UseMemoryCache(TimeSpan.FromMinutes(5));
});

var app = builder.Build();

// Seed default users
await app.SeedDashboardUsersAsync(
    new User { Username = "admin", Password = "admin123" },
    new User { Username = "operator", Password = "operator123" }
);

app.UseFlaggyUI();
app.Run();

Custom Authorization

Implement custom authorization logic for the dashboard:

app.UseFlaggyUI(options =>
{
    options.RoutePrefix = "/admin/flags";
    options.RequireAuthorization = true;
    options.AuthorizationFilter = context =>
    {
        // Custom authorization logic
        return context.User.IsInRole("Admin");
    };
});

Redis Caching Setup

For distributed scenarios across multiple servers, configure Redis caching.

Configure Redis Caching

using Flaggy.Extensions;

var builder = WebApplication.CreateBuilder(args);

// Configure MySQL provider with Redis caching
builder.Services.AddFlaggy(options =>
{
    options.UseMySQL(connectionString);
    options.UseRedisCache(
        redisConnectionString: "localhost:6379",
        cacheExpiration: TimeSpan.FromMinutes(10),
        redisDatabase: 0);  // optional, default is 0
});

var app = builder.Build();
app.Run();

Redis Connection String Formats

Flaggy supports various Redis connection string formats:

// No authentication
redisConnectionString: "localhost:6379"

// With password
redisConnectionString: "localhost:6379,password=mypassword"

// With username and password (Redis 6+)
redisConnectionString: "localhost:6379,user=myuser,password=mypassword"

// With SSL/TLS
redisConnectionString: "localhost:6380,ssl=true,password=mypassword"

// Multiple hosts (cluster)
redisConnectionString: "server1:6379,server2:6379,server3:6379,password=pass"

Complete Example with Redis

using Flaggy.Extensions;
using Flaggy.UI.Extensions;

var builder = WebApplication.CreateBuilder(args);

var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
var redisConnectionString = builder.Configuration.GetConnectionString("Redis");

// Configure PostgreSQL provider with Redis caching
builder.Services.AddFlaggy(options =>
{
    options.UsePostgreSQL(connectionString);
    options.UseRedisCache(
        redisConnectionString: redisConnectionString ?? "localhost:6379,password=redis123",
        cacheExpiration: TimeSpan.FromMinutes(15));
});

var app = builder.Build();
app.UseFlaggyUI();
app.Run();

User Management Configuration

Flaggy includes built-in user management for dashboard access with secure password hashing.

User Model

Users have the following properties:

  • Id - Unique identifier (auto-generated)
  • Username - Unique username for login
  • PasswordHash - BCrypt hashed password (never stored in plain text)
  • CreatedAt - User creation timestamp

Create Users Programmatically

using Flaggy.Abstractions;
using Flaggy.Extensions;
using Flaggy.Models;
using Flaggy.UI.Extensions;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddFlaggy(options =>
{
    options.UseMySQL(connectionString);
    options.UseMemoryCache(TimeSpan.FromMinutes(5));
});

var app = builder.Build();

// Create users at startup
var userProvider = app.Services.GetRequiredService<IUserProvider>();

await userProvider.CreateUserAsync(new User
{
    Username = "admin",
    Password = "SecurePassword123!" // Will be hashed with BCrypt
});

await userProvider.CreateUserAsync(new User
{
    Username = "operator",
    Password = "OperatorPass456!"
});

app.UseFlaggyUI();
app.Run();

Authenticate Users

The dashboard uses automatic authentication:

// Users authenticate via the dashboard login form
// The system automatically:
// 1. Verifies username exists
// 2. Compares provided password with stored BCrypt hash
// 3. Creates secure session
// 4. Grants dashboard access

User Management via Dashboard

Once the dashboard is running, you can:

  1. Create new users through the admin interface
  2. Change user passwords
  3. Delete users
  4. Manage user permissions

Environment Configuration

It's recommended to use appsettings.json for configuration:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=localhost;Database=myapp;User=root;Password=pass;",
    "Redis": "localhost:6379,password=redis123"
  },
  "Flaggy": {
    "CacheExpiration": "00:05:00",
    "AutoMigrate": true,
    "TableName": "feature_flags",
    "UserTableName": "users"
  }
}

Then in Program.cs:

using Flaggy.Extensions;

var builder = WebApplication.CreateBuilder(args);

var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
var cacheExpiration = TimeSpan.Parse(
    builder.Configuration["Flaggy:CacheExpiration"] ?? "00:05:00"
);

builder.Services.AddFlaggy(options =>
{
    options.UseMySQL(connectionString);
    options.UseMemoryCache(cacheExpiration);
});

var app = builder.Build();
app.Run();

Verification

To verify Flaggy is installed and configured correctly:

using Flaggy.Abstractions;
using Flaggy.Extensions;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddFlaggy(options =>
{
    options.UseMySQL(connectionString);
    options.UseMemoryCache(TimeSpan.FromMinutes(5));
});

var app = builder.Build();

// Verify service is registered
app.MapGet("/health/flaggy", async (IFeatureFlagService flagService) =>
{
    var flags = await flagService.GetAllFlagsAsync();
    return Results.Ok(new { message = "Flaggy is running", flagCount = flags.Count() });
});

app.Run();

Navigate to https://localhost:5001/health/flaggy and you should see a response with the flag count.

Troubleshooting

Database Connection Issues

If you get connection errors, verify:

  1. Database is running - Ensure your database server is accessible
  2. Connection string is correct - Test with a database client
  3. Credentials are valid - Verify username and password
  4. Database exists - Flaggy will create tables but not the database

Migration Issues

If auto-migration fails:

  1. Check logs - Look for specific migration error messages
  2. Set autoMigrate: false - For manual control of schema
  3. Verify schema - Ensure previous migrations applied successfully

Redis Connection Issues

If Redis caching isn't working:

  1. Redis is running - Verify Redis server is accessible
  2. Connection string format - Check syntax for your authentication
  3. Firewall rules - Ensure network access to Redis port (usually 6379)

Next Steps