π envyaml - Awesome Go Library for Configuration

Yaml with environment variables reader. it helps to have secrets as environment variable but load them configs as structured Yaml
Detailed Description of envyaml
π envYaml
Seamlessly merge YAML configuration with environment variables
Keep your configuration clean. Keep your secrets safe.
Installation β’ Quick Start β’ Features β’ Examples β’ Contributing
π― The Problem
You love YAML for configurationβit's clean, readable, and organized. But what about sensitive data like API keys, database passwords, and tokens? Hardcoding them is a security nightmare. π±
β¨ The Solution
envYaml bridges the gap between clean YAML configuration and secure environment variable management. Reference environment variables directly in your YAML files, and envYaml handles the rest!
# config.yml - Clean and secure! π
database:
host: localhost
port: 5432
password: ${DB_PASSWORD} # Loaded from environment
api:
key: ${API_KEY} # Never committed to git
secret: ${API_SECRET} # Always secure
π Installation
go get github.com/yuseferi/envyaml@latest
Requirements: Go 1.25+
β‘ Quick Start
1. Create your YAML configuration:
# config.yml
host: localhost
port: 3606
password: ${DB_PASSWORD}
2. Define your config struct:
type Config struct {
Host string `yaml:"host" env:"HOST"`
Port int `yaml:"port" env:"PORT"`
Password string `yaml:"password" env:"DB_PASSWORD,required"`
}
3. Load and use:
package main
import (
"fmt"
"log"
"github.com/yuseferi/envyaml"
)
func main() {
var cfg Config
if err := envyaml.LoadConfig("config.yml", &cfg); err != nil {
log.Fatal(err)
}
fmt.Printf("Connected to %s:%d\n", cfg.Host, cfg.Port)
}
π¨ Features
| Feature | Description |
|---|---|
| π Seamless Integration | Combine YAML files with environment variables effortlessly |
| β Required Variables | Mark critical env vars as required with automatic validation |
| π·οΈ Struct Tags | Use familiar yaml and env struct tags |
| π‘οΈ Type Safety | Full Go type safety with automatic type conversion |
| π¦ Zero Config | Works out of the box with sensible defaults |
| πͺΆ Lightweight | Minimal dependencies, maximum performance |
π Examples
Required Environment Variables
Mark sensitive variables as required to fail fast if they're missing:
type Config struct {
Host string `yaml:"host" env:"HOST"`
Port int `yaml:"port" env:"PORT"`
Password string `yaml:"password" env:"DB_PASSWORD,required"` // π Required!
}
var cfg Config
err := envyaml.LoadConfig("config.yml", &cfg)
if err != nil {
// Error: failed to parse environment variables: env: required environment variable "DB_PASSWORD" is not set
log.Fatal(err)
}
Complete Working Example
package main
import (
"fmt"
"log"
"os"
"github.com/yuseferi/envyaml"
)
type DatabaseConfig struct {
Host string `yaml:"host" env:"DB_HOST"`
Port int `yaml:"port" env:"DB_PORT"`
Username string `yaml:"username" env:"DB_USER"`
Password string `yaml:"password" env:"DB_PASSWORD,required"`
Database string `yaml:"database" env:"DB_NAME"`
}
type Config struct {
Database DatabaseConfig `yaml:"database"`
Debug bool `yaml:"debug" env:"DEBUG"`
}
func main() {
// Set environment variables (in production, these come from your environment)
os.Setenv("DB_PASSWORD", "super_secret_password")
var cfg Config
if err := envyaml.LoadConfig("config.yml", &cfg); err != nil {
log.Fatalf("Failed to load config: %v", err)
}
fmt.Printf("Database: %s@%s:%d/%s\n",
cfg.Database.Username,
cfg.Database.Host,
cfg.Database.Port,
cfg.Database.Database,
)
}
With this config.yml:
database:
host: localhost
port: 5432
username: admin
password: ${DB_PASSWORD}
database: myapp
debug: false
Output:
Database: admin@localhost:5432/myapp
ποΈ How It Works
βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ
β YAML File β β Environment β β Go Struct β
β β β Variables β β β
β host: localhostβ β β β Host: localhostβ
β port: 3606 β βββΊ β DB_PASSWORD= β βββΊ β Port: 3606 β
β password: ${..}β β "secret123" β β Password: ... β
βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ
β β β
βββββββββββββββββββββββββ΄ββββββββββββββββββββββββ
envYaml
- Read - Parse your YAML configuration file
- Merge - Overlay environment variables using struct tags
- Validate - Ensure required variables are present
- Return - Provide a fully populated, type-safe config struct
π οΈ Development
This project uses Task for managing development tasks.
# Build the project
task build
# Run tests
task test
# Run tests with coverage
task test-coverage
# Clean generated files
task clean
# Run all tasks
task all
π€ Contributing
We love contributions! β€οΈ
- π΄ Fork the repository
- πΏ Create your feature branch (
git checkout -b feature/amazing-feature) - πΎ Commit your changes (
git commit -m 'Add amazing feature') - π€ Push to the branch (
git push origin feature/amazing-feature) - π Open a Pull Request
Please feel free to:
- π Report bugs
- π‘ Suggest new features
- π Improve documentation
- β Star the project if you find it useful!
π License
This project is licensed under the GNU General Public License v3.0 - see the LICENSE file for details.