TinyConfig 1.2.0
dotnet add package TinyConfig --version 1.2.0
NuGet\Install-Package TinyConfig -Version 1.2.0
<PackageReference Include="TinyConfig" Version="1.2.0" />
<PackageVersion Include="TinyConfig" Version="1.2.0" />
<PackageReference Include="TinyConfig" />
paket add TinyConfig --version 1.2.0
#r "nuget: TinyConfig, 1.2.0"
#:package TinyConfig@1.2.0
#addin nuget:?package=TinyConfig&version=1.2.0
#tool nuget:?package=TinyConfig&version=1.2.0
TinyConfig
The simplest way to manage configuration in .NET. One unified interface for INI, JSON, XML, and Windows Registry.
Install
PM> Install-Package TinyConfig
Or via .NET CLI:
dotnet add package TinyConfig
Quick Start
using TinyConfig;
// Pick any backend — the API is the same
var config = Config.FromFile("settings.ini"); // INI
var config = Config.FromJson("settings.json"); // JSON
var config = Config.FromXml("settings.xml"); // XML
var config = Config.FromRegistry(@"SOFTWARE\MyApp"); // Registry
API
All providers implement ITinyConfig:
// Read a value (returns default if not found)
string host = config.Get("Server", "Host", "localhost");
// Read with automatic type conversion
int port = config.Get<int>("Server", "Port", 8080);
bool debug = config.Get<bool>("App", "Debug", false);
// Auto-save: writes the default value if the key doesn't exist
string theme = config.Get("UI", "Theme", "dark", autoSave: true);
// Write a value
config.Set("Server", "Host", "192.168.0.1");
// Check if a key exists
bool exists = config.Exists("Server", "Host");
// Try to read - false when the key is missing, empty, or the text does not fit T
if (config.TryGet("Shutdown", "Everyday", out DateTime shutdown))
{
// shutdown holds a converted value
}
Providers
INI
var config = Config.FromFile("settings.ini");
config.Set("Server", "Host", "localhost");
[Server]
Host=localhost
Writing leaves the rest of the file alone. Comments, blank lines, key order and the
spacing around = stay as they were, and only the line being changed is rewritten.
A new key is added inside its section, above any trailing comment.
INI files carry no encoding declaration. A file written by the Windows
WritePrivateProfileString API is in the system ANSI code page, so pass the
encoding explicitly instead of relying on the UTF-8 default:
// .NET Core and later need the code page provider registered once
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
var config = Config.FromFile("cfg.ini", Encoding.GetEncoding(949));
JSON
Not available on the net461 build.
var config = Config.FromJson("settings.json");
config.Set("Database", "Port", 5432);
{
"Database": {
"Port": "5432"
}
}
XML
var config = Config.FromXml("settings.xml");
config.Set("Logging", "Level", "Info");
<?xml version="1.0"?>
<Config>
<Logging>
<Level>Info</Level>
</Logging>
</Config>
Windows Registry
// Default: HKEY_CURRENT_USER
var config = Config.FromRegistry(@"SOFTWARE\MyApp");
// Use a different root hive
var config = Config.FromRegistry(@"SOFTWARE\MyApp", RegistryRoot.LocalMachine);
Available RegistryRoot values: CurrentUser (default), LocalMachine, ClassesRoot, Users, CurrentConfig
Type Conversion
Get<T> converts string values using TypeDescriptor. Supports int, bool, double, float, DateTime, enum, TimeSpan, and any type with a registered TypeConverter.
var timeout = config.Get<TimeSpan>("App", "Timeout", TimeSpan.FromSeconds(30));
var mode = config.Get<MyEnum>("App", "Mode", MyEnum.Default);
If conversion fails, Get<T> returns the default value. Use TryGet<T> when a format
mismatch has to be told apart from a real default — a value stored as 210000 and read
as DateTime returns false rather than silently falling back.
Section Mapping
The first parameter (section) maps to different concepts depending on the provider:
| Provider | Section maps to |
|---|---|
| INI | [Section] header |
| JSON | Top-level object |
| XML | Child element of <Config> |
| Registry | Sub-key under root path |
Target Frameworks
netstandard2.0 and net461.
The net461 build has no NuGet dependencies. Registry and XML are part of the
framework there, so nothing is pulled in. FromJson is excluded from that build
because System.Text.Json is not part of the framework and would add eight
transitive packages.
| Build | Providers | Dependencies |
|---|---|---|
netstandard2.0 |
INI, JSON, XML, Registry | Microsoft.Win32.Registry, System.Text.Json |
net461 |
INI, XML, Registry | none |
License
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 is compatible. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETFramework 4.6.1
- No dependencies.
-
.NETStandard 2.0
- Microsoft.Win32.Registry (>= 5.0.0)
- System.Text.Json (>= 8.0.5)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.2.0 | 38 | 9/4/2026 |
| 1.2.0-test.4 | 33 | 9/4/2026 |
| 1.1.0 | 37 | 9/4/2026 |
| 1.1.0-test.3 | 34 | 9/4/2026 |
| 1.0.0 | 122 | 3/6/2026 |
| 1.0.0-test.2 | 66 | 3/6/2026 |