<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jawwad A. Ayyubi</title>
    <description>The latest articles on DEV Community by Jawwad A. Ayyubi (@jawwad_aayyubi_558561b5).</description>
    <link>https://dev.to/jawwad_aayyubi_558561b5</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2962710%2F5bbf24e5-172b-4f8c-9600-60a17cf6894a.jpg</url>
      <title>DEV Community: Jawwad A. Ayyubi</title>
      <link>https://dev.to/jawwad_aayyubi_558561b5</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jawwad_aayyubi_558561b5"/>
    <language>en</language>
    <item>
      <title>I built a browser-based GUI for managing appsettings.json in .NET — now on NuGet</title>
      <dc:creator>Jawwad A. Ayyubi</dc:creator>
      <pubDate>Mon, 06 Apr 2026 12:21:44 +0000</pubDate>
      <link>https://dev.to/jawwad_aayyubi_558561b5/i-built-a-browser-based-gui-for-managing-appsettingsjson-in-net-now-on-nuget-645</link>
      <guid>https://dev.to/jawwad_aayyubi_558561b5/i-built-a-browser-based-gui-for-managing-appsettingsjson-in-net-now-on-nuget-645</guid>
      <description>&lt;p&gt;Introducing&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Codekali.Net.Config.UI&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;v1.1.6  —  Now on NuGet&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A browser-based GUI for managing appsettings.json in any .NET solution&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Problem&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Managing appsettings.json files across Development, Staging, and Production environments is one of those tasks that never gets easier. You're manually editing JSON, hunting for the right key across multiple files, or copy-pasting values between environments while hoping you don't break anything.&lt;/p&gt;

&lt;p&gt;Codekali.Net.Config.UI solves this with a plug-and-play .NET middleware library that gives you a browser-based configuration editor directly inside your running app. One NuGet package, one line of middleware, no extra infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Setup is Genuinely One Line&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Install the package:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;dotnet add package Codekali.Net.Config.UI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Register and activate in Program.cs:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;p&gt;// Program.cs&lt;/p&gt;
&lt;p&gt;builder.Services.AddConfigUI();&lt;/p&gt;
&lt;p&gt;app.UseConfigUI();&lt;/p&gt;

&lt;p&gt;// Open your browser:&lt;/p&gt;
&lt;p&gt;// &lt;a href="https://localhost:5001/config-ui" rel="noopener noreferrer"&gt;https://localhost:5001/config-ui&lt;/a&gt;&lt;/p&gt;
&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What It Does&lt;/strong&gt;
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;🌳  Tree view editor&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;Entire appsettings rendered as an expandable tree. Double-click any value to edit inline.&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;🔢  Full array support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Expand arrays, append items, remove by index. CorsSettings, AllowedHosts, feature flags — all editable.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;✏️  Monaco raw editor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;VS Code engine with syntax highlighting, bracket matching, JSON validation, and Ctrl+S to save.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;💬  Comment preservation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;// and /* */ comments survive every Add, Update, Delete, and Save Raw operation via positional string surgery.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;⇄  Move / Copy keys&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Select keys from Development and copy or move them to Production in one click. Includes conflict detection.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;⊞  Side-by-side diff&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Compare any two appsettings files — see what's different, what's identical, and what's missing.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;🔄  Hot reload detection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Banner notification when a file changes on disk externally. Tree view reloads automatically.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;🙈  Sensitive value masking&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Keys containing password, secret, token, apikey masked by default. Reveal with one click.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;🔐  Security guards&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Returns 404 outside allowed environments. Optional access token or full ASP.NET Core Authorization policy.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;🌙  Dark / Light mode&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full theme toggle. Monaco editor syncs with the page theme.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Configuration&lt;/strong&gt;
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;p&gt;builder.Services.AddConfigUI(options =&amp;gt;&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;/code&gt;options.PathPrefix             = "/config-ui";&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;/code&gt;options.AccessToken            = "your-secret-token";  // simple token auth&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;/code&gt;options.AuthorizationPolicy    = "ConfigUIAccess";      // or ASP.NET Core policy&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;/code&gt;options.AllowedEnvironments    = ["Development", "Staging"];&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;/code&gt;options.MaskSensitiveValues    = true;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;/code&gt;options.ReadOnly               = false;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;/code&gt;options.EnableAutoToken        = false;                  // auto-generate on first run&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;/code&gt;options.EnableHotReloadDetection = true;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;/code&gt;options.ConfigDirectory        = null;                   // defaults to CWD&lt;/p&gt;
&lt;p&gt;});&lt;/p&gt;
&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Authorization policy example&lt;/strong&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;p&gt;builder.Services.AddAuthorization(o =&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;/code&gt;o.AddPolicy("ConfigUIAccess", p =&amp;gt; p.RequireRole("Admin")));&lt;/p&gt;

&lt;p&gt;app.UseConfigUI(options =&amp;gt; options.AuthorizationPolicy = "ConfigUIAccess");&lt;/p&gt;
&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;IOptions reload guidance&lt;/strong&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;⚠  Changes take effect at runtime only when consuming code uses IOptionsSnapshot or IOptionsMonitor. Plain IOptions snapshots at startup and ignores file changes.&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Security&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The middleware returns &lt;strong&gt;404&lt;/strong&gt; when accessed outside an allowed environment — it does not leak its existence. For non-development use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set AllowedEnvironments explicitly&lt;/li&gt;
&lt;li&gt;Always set an AccessToken or AuthorizationPolicy&lt;/li&gt;
&lt;li&gt;Host behind a VPN or internal network for Staging&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Platform-Specific Tips for Sharing This Post&lt;/strong&gt;
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Platform&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Tip&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reddit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Lead with the problem. Keep it conversational. Link GitHub first. Add a screenshot or demo GIF at the top. Post to r/dotnet and r/csharp.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dev.to&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Use the post as-is. Add a cover image. Tags: dotnet, csharp, webdev, productivity.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Medium&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Add a hero image, expand the Problem section slightly. Use the canonical link back to your GitHub.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;LinkedIn&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cut to 3 short paragraphs. Remove code blocks. End with a question: "What other .NET tooling pain points are worth solving?"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Twitter / X&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"One NuGet package, one line of middleware. Browser-based appsettings.json editor for .NET. Preserves comments, supports arrays, Monaco editor. #dotnet #csharp"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;NuGet Package Details&lt;/strong&gt;
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Target&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Notes&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;net8.0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full ASP.NET Core FrameworkRef. Supports Identity Authorization.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;netstandard2.1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Compatible with any ASP.NET Core 3.0+ host.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Links&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;NuGet: &lt;a href="https://www.nuget.org/packages/Codekali.Net.Config.UI" rel="noopener noreferrer"&gt;https://www.nuget.org/packages/Codekali.Net.Config.UI&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub: &lt;a href="https://github.com/Codekali/Codekali.Net.Config.UI" rel="noopener noreferrer"&gt;https://github.com/Codekali/Codekali.Net.Config.UI&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Docs: &lt;a href="https://codekali.github.io/Codekali.NET.Config.UI/" rel="noopener noreferrer"&gt;https://codekali.github.io/Codekali.NET.Config.UI/&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What's Next&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;v1.2&lt;/strong&gt;  Versioned backup system with one-click restore, full backup history panel, and change audit log&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;v1.3&lt;/strong&gt;  JSON Schema validation engine with inline error markers in tree view and Monaco editor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;v2.0&lt;/strong&gt;  AI-assisted value suggestions — context-aware LLM recommendations based on key name and config hierarchy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;v3.0&lt;/strong&gt;  Global CLI tool: dotnet tool install -g codekali-config — manage any project directory without installing the NuGet package&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If this is useful to you, a &lt;strong&gt;GitHub star&lt;/strong&gt; goes a long way with discoverability. Feedback and bug reports welcome — this is v1.1 and edge cases are expected.&lt;/p&gt;

&lt;p&gt;Codekali.Net.Config.UI  —  github.com/Codekali&lt;br&gt;
nuget.org/packages/Codekali.Net.Config.UI   github.com/Codekali &lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>csharp</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
