<?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: Darío Chiappello</title>
    <description>The latest articles on DEV Community by Darío Chiappello (@dariochiappello).</description>
    <link>https://dev.to/dariochiappello</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%2F629741%2F8fccf389-23b0-44f3-a2f3-b53bceaee774.jpeg</url>
      <title>DEV Community: Darío Chiappello</title>
      <link>https://dev.to/dariochiappello</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dariochiappello"/>
    <language>en</language>
    <item>
      <title>Introducing GUMP: Unified, Reactive Configuration Management for Go</title>
      <dc:creator>Darío Chiappello</dc:creator>
      <pubDate>Sat, 30 Aug 2025 08:20:09 +0000</pubDate>
      <link>https://dev.to/dariochiappello/introducing-gump-unified-reactive-configuration-management-for-go-d96</link>
      <guid>https://dev.to/dariochiappello/introducing-gump-unified-reactive-configuration-management-for-go-d96</guid>
      <description>&lt;p&gt;Configuration management in Go can get messy pretty fast.&lt;br&gt;
You start with a simple JSON file, then add environment variables, then need live reloads… and suddenly your code is full of boilerplate, manual merges, and type assertions.&lt;/p&gt;

&lt;p&gt;That’s why I built GUMP (Go Unified Management Package) — a unified, reactive, and extensible way to manage configuration in Go.&lt;/p&gt;

&lt;p&gt;✨ &lt;strong&gt;Why GUMP?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-source support&lt;/strong&gt; → JSON files, environment variables, and more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Smart merging&lt;/strong&gt; → hierarchical config merging with overrides.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-time updates&lt;/strong&gt; → automatically reload config when files change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Typed access&lt;/strong&gt; → no more interface{} headaches, just GetString, GetInt, etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Caching&lt;/strong&gt; → fast, thread-safe access with selective invalidation.&lt;/p&gt;

&lt;p&gt;It’s designed to be modular, extensible, and reliable, so you can focus on your application logic, not config plumbing.&lt;/p&gt;

&lt;p&gt;🚀 &lt;strong&gt;Quick Example&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package main

import (
    "fmt"
    "time"

    "github.com/DarioChiappello/gump/config"
)

func main() {
    cfg, err := config.NewConfigBuilder().
        AddJSONFile("base_config.json").
        AddJSONFile("overrides.json").
        AddEnv("APP_").
        Build()

    if err != nil {
        panic(err)
    }

    cachedCfg := config.NewConfigWithCache(cfg)

    watcher, _ := config.NewConfigWatcher(cachedCfg, 5*time.Second, "config.json")
    watcher.OnReload(func(c *config.Config) {
        fmt.Println("Configuration updated!")
        cachedCfg.InvalidateCache()
    })
    go watcher.Start()
    defer watcher.Stop()

    dbHost := cachedCfg.GetString("database.host", "localhost")
    dbPort := cachedCfg.GetInt("database.port", 5432)

    fmt.Printf("Connecting to %s:%d\n", dbHost, dbPort)
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s all it takes: &lt;strong&gt;multi-source loading + caching + live reloads&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;🔍 &lt;strong&gt;Advanced Features&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ConfigWatcher&lt;/strong&gt; → callbacks on file changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;EnvLoader&lt;/strong&gt; → auto-convert APP_DB_HOST → db.host.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ConfigBuilder&lt;/strong&gt; → fluent chaining API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ConfigWithCache&lt;/strong&gt; → fast access, thread-safe.&lt;/p&gt;

&lt;p&gt;You can see more examples in the README&lt;br&gt;
.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Why You Might Care&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🧩 &lt;strong&gt;Modular&lt;/strong&gt; → clean separation of logic.&lt;/p&gt;

&lt;p&gt;🔌 &lt;strong&gt;Extensible&lt;/strong&gt; → easy to add new sources or hooks.&lt;/p&gt;

&lt;p&gt;🧼 &lt;strong&gt;Readable&lt;/strong&gt; → context-aware, descriptive errors.&lt;/p&gt;

&lt;p&gt;🛡️ &lt;strong&gt;Reliable&lt;/strong&gt; → handles edge cases gracefully.&lt;/p&gt;

&lt;p&gt;⚡ &lt;strong&gt;Fast&lt;/strong&gt; → in-memory caching for high-performance access.&lt;/p&gt;

&lt;p&gt;🔄 &lt;strong&gt;Reactive&lt;/strong&gt; → instant reload on file changes.&lt;/p&gt;

&lt;p&gt;🤝 &lt;strong&gt;I’d Love Your Feedback&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is still a young project, and I’d love to hear from the Go community:&lt;/p&gt;

&lt;p&gt;Is the API intuitive?&lt;/p&gt;

&lt;p&gt;Are the defaults sensible?&lt;/p&gt;

&lt;p&gt;Any missing features you’d expect in a config library?&lt;/p&gt;

&lt;p&gt;👉 Try it out:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;go get github.com/DarioChiappello/gump
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And let me know what you think!&lt;/p&gt;

&lt;p&gt;📄 Links&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub repo&lt;/strong&gt;: &lt;a href="https://github.com/DarioChiappello/gump" rel="noopener noreferrer"&gt;github.com/DarioChiappello/gump&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;License: MIT&lt;/strong&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
