Gurlf is a custom configuration format and Go parsing library designed as an alternative to JSON in cases where escaping becomes a problem.
It was created to handle complex, real-world configurations (HTTP headers, cookies, request bodies, embedded JSON) without breaking readability or data integrity.
Gurlf was born from practical issues encountered while developing gurl-cli.
When adding support for cookies and complex headers, nested JSON structures had to be embedded inside JSON configs. This led to excessive escaping, unreadable configs and broken data after parsing.
Gurlf solves this by:
- Removing escaping entirely
- Treating values as raw data
- Supporting multiline values natively
Gurlf uses a simple, section-based format:
[config_name]
KEY: value
MULTILINE_KEY: `
multiline
value
without escaping
`
[\config_name][name]— start of a config section[\name]— end of a config sectionKEY: value— key-value pair- Backticks (`) allow multiline values
- No escaping rules — data is read as-is
[request_1]
ID: 1
HEADERS: Content-Type: application/json
BODY: `
{ "key": "value", "nested": { "data": "here" } }
`
COOKIE: session=abc123; path=/; domain=example.com
[\request_1]- Zero escaping — raw data is preserved
- Multiline values via backticks
- Human-readable and writable format
- Multiple config sections per file
- Type-safe unmarshalling into Go structs
- Designed for HTTP-related configurations
import "github.com/Votline/Gurlf"
// Scan config file
data, err := gurlf.ScanFile("config.gurlf")
if err != nil {
log.Fatal(err)
}
// Unmarshal section into struct
type Config struct {
ID int `gurlf:"ID"`
Body string `gurlf:"BODY"`
Headers string `gurlf:"HEADERS"`
Cookie string `gurlf:"COOKIE"`
Name string `gurlf:"config_name"` //tag for the config name without brackets: [config_name]
}
var cfg Config
err = gurlf.Unmarshal(data[0], &cfg)
if err != nil {
log.Fatal(err)
}- HTTP request definitions (headers, body, cookies)
- Configs containing embedded JSON
- Any scenario where JSON escaping hurts readability
- Tooling configs where humans write and edit files
- Prototyping request-based workflows
- Go 1.25+
- reflect (for unmarshalling)
- uber-go/zap (logging)
- Simplicity over features
- Predictable parsing
- No hidden transformations
- Minimal syntax
- Developer-friendly ergonomics