DEV Community

Cover image for I built ConfigWay — a runtime config editor for ASP.NET Core (my first open source project)
kododo
kododo

Posted on

I built ConfigWay — a runtime config editor for ASP.NET Core (my first open source project)

You know that moment when you tweak a feature flag or an email template prefix in appsettings.json, rebuild, redeploy, wait… and then tweak it again? I got tired of that loop. So I built something to fix it — and decided to open source it.

Meet ConfigWay — a runtime configuration editor for ASP.NET Core. It lets you view and modify your IOptions<T> values through a built-in web UI, without ever restarting the application.

This is my first open source project, and I'm genuinely excited to share it.


The problem

ASP.NET Core's configuration system is great, but once the app is running, changing a value means editing a file and restarting. For settings that need frequent tuning — timeouts, feature flags, email templates, rate limits — that cycle adds up fast.

I wanted something that:

  • works with the existing IOptions<T> pattern I already use
  • requires minimal setup
  • stores overrides in a real database so they survive restarts
  • gives me a clean UI to make changes from a browser

What ConfigWay does

ConfigWay adds a small web UI to your application. Any IOptions<T> class you register becomes an editable form — with type-aware controls (toggle for bool, dropdown for enum, array editor for collections, etc.).

Changes are applied immediately via hot-reload. No restart needed.

Here's a quick demo: kododo.dev/configway/demo


Getting started in 3 steps

1. Install the packages

dotnet add package Kododo.ConfigWay
dotnet add package Kododo.ConfigWay.UI
dotnet add package Kododo.ConfigWay.PostgreSQL  # optional — for persistence
Enter fullscreen mode Exit fullscreen mode

2. Register everything

builder.AddConfigWay(x =>
{
    x.AddOptions<EmailOptions>();
    x.AddOptions<FeatureFlagOptions>();
    x.AddUiEditor();
    x.UsePostgreSql(builder.Configuration.GetConnectionString("DefaultConnection")!);
});
Enter fullscreen mode Exit fullscreen mode

3. Mount the UI

app.UseConfigWay(); // mounts the editor at /config
Enter fullscreen mode Exit fullscreen mode

That's it. Open /config in your browser and you'll see all your registered options, editable in real time.


A few things I'm particularly happy with

It plays nicely with validation. If you already have ValidateDataAnnotations() or a custom IValidateOptions<T> wired up, ConfigWay will show validation errors in the UI and block saving until they're resolved.

Sensitive fields stay hidden. Mark any string with [DataType(DataType.Password)] and ConfigWay treats it as a secret — rendered as ●●●●●, never returned from the API, requiring an explicit reset to remove.

Reset to default. Every field has a ↩ button that appears when the stored value differs from the underlying config layer (appsettings.json, environment variable). One click removes the override and the original value takes effect — no restart.

Customizable labels. Use [Display(Name = "...", Description = "...")] to control how fields and sections appear in the UI. The Description shows up as a tooltip icon next to the label.


Architecture in a nutshell

The library is split into focused packages:

Package Role
Kododo.ConfigWay.Core Abstractions (IStore, Setting)
Kododo.ConfigWay DI registration, in-memory store, hot-reload logic
Kododo.ConfigWay.UI Embedded React SPA served from the host app
Kododo.ConfigWay.PostgreSQL PostgreSQL persistence

The UI is embedded as a resource inside the DLL — no CDN, no separate static file deployment. The PostgreSQL store creates a single configway.settings table on first startup and handles everything from there.

You can also plug in your own backend by implementing the IStore interface from Kododo.ConfigWay.Core:

builder.AddConfigWay(x =>
{
    x.Store = new MyRedisStore();
    x.AddOptions<AppOptions>();
});
Enter fullscreen mode Exit fullscreen mode

This is just the beginning

ConfigWay is my first open source project, and shipping it has been equal parts exciting and nerve-wracking. There's a lot I want to add — more storage providers, role-based field access, change history — but I wanted to get something real and useful out first.

I'm also working on more projects in the Kododo family. If this kind of thing is useful to you, I'd love it if you:

  • Starred the repo — it genuinely helps with visibility
  • 👀 Followed me on GitHub — more libraries are coming
  • 💬 Opened an issue or a discussion — feedback from real users shapes the roadmap

Thanks for reading. I hope ConfigWay saves you a few restarts. 🚀

Top comments (0)