πŸ“š envyaml - Awesome Go Library for Configuration

Go Gopher mascot for envyaml

Yaml with environment variables reader. it helps to have secrets as environment variable but load them configs as structured Yaml

🏷️ Configuration
πŸ“‚ Configuration
⭐ 0 stars
View on GitHub πŸ”—

Detailed Description of envyaml

πŸ” envYaml

Seamlessly merge YAML configuration with environment variables

Go Version codecov CI Go Report Card License Release

envYaml Logo

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

FeatureDescription
πŸ”„ Seamless IntegrationCombine YAML files with environment variables effortlessly
βœ… Required VariablesMark critical env vars as required with automatic validation
🏷️ Struct TagsUse familiar yaml and env struct tags
πŸ›‘οΈ Type SafetyFull Go type safety with automatic type conversion
πŸ“¦ Zero ConfigWorks out of the box with sensible defaults
πŸͺΆ LightweightMinimal 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
  1. Read - Parse your YAML configuration file
  2. Merge - Overlay environment variables using struct tags
  3. Validate - Ensure required variables are present
  4. 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! ❀️

  1. 🍴 Fork the repository
  2. 🌿 Create your feature branch (git checkout -b feature/amazing-feature)
  3. πŸ’Ύ Commit your changes (git commit -m 'Add amazing feature')
  4. πŸ“€ Push to the branch (git push origin feature/amazing-feature)
  5. πŸŽ‰ 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.


Made with ❀️ by Yusef Mohamadi

If this project helped you, consider giving it a ⭐!

GitHub stars GitHub forks