Skip to content

Commit 04af52d

Browse files
committed
Update documentation: comparison pages and guides
1 parent fbb15b7 commit 04af52d

18 files changed

Lines changed: 5387 additions & 3 deletions

docs/comparison/envconfig.md

Lines changed: 260 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,260 @@
1+
<script type="application/ld+json">
2+
{
3+
"@context": "https://schema.org",
4+
"@type": "ComparisonChart",
5+
"name": "confkit vs envconfig",
6+
"description": "Feature comparison between confkit and envconfig Go libraries for environment variable configuration",
7+
"itemListElement": [
8+
{
9+
"@type": "SoftwareApplication",
10+
"name": "confkit",
11+
"url": "https://github.com/MimoJanra/confkit",
12+
"applicationCategory": "ConfigurationManagement"
13+
},
14+
{
15+
"@type": "SoftwareApplication",
16+
"name": "envconfig",
17+
"url": "https://github.com/kelseyhightower/envconfig",
18+
"applicationCategory": "ConfigurationManagement"
19+
}
20+
]
21+
}
22+
</script>
23+
24+
# confkit vs envconfig
25+
26+
confkit is a type-safe configuration toolkit for Go projects that want struct-based config loading, defaults, validation, source merging, and secret redaction. envconfig is a lightweight library that parses struct tags to load configuration from environment variables.
27+
28+
## Key Differences
29+
30+
### Scope
31+
32+
**confkit:** Full configuration toolkit — multiple sources, validation, defaults, secret redaction, all built-in.
33+
34+
```go
35+
cfg, err := confkit.Load[Config](
36+
confkit.FromYAML("config.yaml"),
37+
confkit.FromEnv(),
38+
confkit.FromFlags(),
39+
)
40+
```
41+
42+
**envconfig:** Environment variables only — no files, no validation, no defaults in the library.
43+
44+
```go
45+
var cfg Config
46+
err := envconfig.Process("APP", &cfg)
47+
// Only reads from os.Getenv(), no other sources
48+
```
49+
50+
### Defaults
51+
52+
**confkit:** Via struct tags.
53+
54+
```go
55+
type Config struct {
56+
Port int `env:"PORT" default:"8080"`
57+
}
58+
```
59+
60+
**envconfig:** No built-in defaults — you set zero values or post-process.
61+
62+
```go
63+
type Config struct {
64+
Port int `envconfig:"PORT"` // No default support
65+
}
66+
// Must manually set defaults after parsing
67+
```
68+
69+
### Validation
70+
71+
**confkit:** Built-in validation rules.
72+
73+
```go
74+
type Config struct {
75+
Port int `env:"PORT" validate:"min=1,max=65535"`
76+
}
77+
```
78+
79+
**envconfig:** No built-in validation — you write custom code.
80+
81+
```go
82+
var cfg Config
83+
envconfig.Process("APP", &cfg)
84+
if cfg.Port < 1 || cfg.Port > 65535 {
85+
return fmt.Errorf("port out of range")
86+
}
87+
```
88+
89+
### Error Messages
90+
91+
**confkit:** Structured, human-readable errors with context.
92+
93+
```
94+
Invalid configuration:
95+
96+
Database.Port
97+
error: must be between 1 and 65535
98+
source: env (DATABASE_PORT)
99+
```
100+
101+
**envconfig:** Basic Go errors, less context.
102+
103+
```
104+
port: parsing "invalid": invalid syntax
105+
```
106+
107+
### Secret Redaction
108+
109+
**confkit:** Automatic via `secret:"true"` tag.
110+
111+
```go
112+
type Config struct {
113+
Password string `env:"DB_PASSWORD" secret:"true"`
114+
}
115+
// Errors and dumps automatically redact this field
116+
```
117+
118+
**envconfig:** No secret redaction — passwords appear in error messages.
119+
120+
### Multi-Source Loading
121+
122+
**confkit:** Mix YAML, env, flags, Kubernetes, AWS, Vault, etc. with explicit precedence.
123+
124+
```go
125+
cfg, err := confkit.Load[Config](
126+
confkit.FromYAML("defaults.yaml"),
127+
confkit.FromEnv(),
128+
)
129+
```
130+
131+
**envconfig:** Environment variables only. To combine sources, you write custom code.
132+
133+
```go
134+
// No built-in support; load each source separately and merge manually
135+
```
136+
137+
### Struct Prefixes
138+
139+
**confkit:** Via struct tags — any nesting level.
140+
141+
```go
142+
type Config struct {
143+
DB struct {
144+
Host string `env:"HOST"`
145+
} `prefix:"DB_"`
146+
}
147+
// Reads DB_HOST from env
148+
```
149+
150+
**envconfig:** Also supports prefixes, similar approach.
151+
152+
```go
153+
type Config struct {
154+
DB struct {
155+
Host string `envconfig:"HOST"`
156+
} `envconfig:"DB"`
157+
}
158+
```
159+
160+
### Type Support
161+
162+
**confkit:** Primitives, slices, time.Duration, nested structs, custom parsers.
163+
164+
**envconfig:** Primitives, slices, basic types. Similar but narrower.
165+
166+
## When to Use confkit
167+
168+
- You need multiple sources (YAML, env, flags, cloud)
169+
- You want defaults and validation built-in
170+
- You care about error messages and debugging
171+
- You use cloud sources (Vault, AWS, Kubernetes)
172+
- You need secret redaction
173+
- You want a single struct to describe your entire config
174+
175+
## When to Use envconfig
176+
177+
- You only care about environment variables
178+
- You want the absolute smallest library for env parsing
179+
- Your config is simple (no defaults, no validation)
180+
- You're OK writing validation code yourself
181+
- You don't need cloud sources
182+
183+
## Feature Comparison Table
184+
185+
| | confkit | envconfig |
186+
|--------------------------|:-------:|:---------:|
187+
| **Typed struct loading** |||
188+
| **Environment variables** |||
189+
| **YAML/JSON/TOML files** |||
190+
| **CLI flags** |||
191+
| **Defaults via tags** |||
192+
| **Built-in validation** |||
193+
| **Secret redaction** |||
194+
| **Cloud sources** | optional ||
195+
| **Error context** || ⚠️ |
196+
| **Struct prefixes** |||
197+
| **Multi-source merging** |||
198+
| **Lightweight** |||
199+
200+
## Migration Path
201+
202+
If you're moving from envconfig to confkit:
203+
204+
1. Keep your struct definitions as-is
205+
2. Add support for other sources:
206+
```go
207+
confkit.Load[Config](
208+
confkit.FromEnv(),
209+
// Add YAML, flags, etc.
210+
)
211+
```
212+
3. Add `default` tags:
213+
```go
214+
type Config struct {
215+
Port int `env:"PORT" default:"8080"`
216+
}
217+
```
218+
4. Add `validate` tags:
219+
```go
220+
type Config struct {
221+
Port int `env:"PORT" validate:"min=1,max=65535"`
222+
}
223+
```
224+
5. Replace `envconfig.Process()` with `confkit.Load[T]()`
225+
226+
## Library Size & Dependencies
227+
228+
| Library | Dependencies | Binary overhead |
229+
|------------|:------------:|:---------------:|
230+
| confkit | yaml.v3, go-toml/v2 | ~500KB (core) |
231+
| envconfig | stdlib only | ~100KB |
232+
233+
confkit adds dependencies for YAML and TOML support; envconfig is pure stdlib.
234+
235+
For cloud sources, confkit lets you opt-in. envconfig has no cloud support.
236+
237+
## Use Case Example
238+
239+
**Simple CLI tool:** envconfig is perfect.
240+
241+
```go
242+
type Config struct {
243+
ApiKey string `envconfig:"API_KEY"`
244+
}
245+
```
246+
247+
**Production service with config files, env overrides, validation, and Vault:** confkit.
248+
249+
```go
250+
cfg, err := confkit.Load[Config](
251+
confkit.FromYAML("config.yaml"),
252+
confkit.FromEnv(),
253+
vault.FromVault(...), // optional
254+
)
255+
```
256+
257+
## Maturity
258+
259+
- **envconfig:** Lightweight, stable, minimal changes
260+
- **confkit:** Production-ready v0.5.0, actively developed with cloud integrations

0 commit comments

Comments
 (0)