My pet peeve in software is "magic defaults", I hate them. So much confusion, so many hours debugging.

To be clear, I love software with the principle of "polished and opinionated defaults, but the option to override". E.g. zed works fabulous out of the box (the love of my live, vim, the opposite) Gnome is simple, user friendly and focused (much like Apple). Stuff that Just Works.

No, my frustration lies in lower level defaults.

Some library that has a (20 mins of grepping and spelunking in python libs ...)

`self.base_url: str = base_url or os.getenv('PROXY_URL', 'http://localhost:4000')`

Or a class that does `constructor(timeout:number=2000)`

Or the settings.rs that has
`let dir = std::env::var("DIR_VAR").unwrap_or_else(|_| "/etc/foo/".to_string());`

I very much prefer expliciness.

* Offer a .env.example, compose.yml or settings.json with all those defaults set. Keep them out of the codebase. Keep them together in one place.
* Document all settings. AI agents are well suited to create/update that conf.md from your code+config files
* Let the app crash on startup when values are missing. Privide good errors instead of silent defaults
* Also let it crash for invalid (out of range, wrong type) values.
But please, realize that a well-intentioned `default="localhost:4000"` may look like a service to a fellow dev, it is a guaranteed wasted afternoon for another fellow dev(ops) who cannot figure out why their 0.0.0.0:8080 isn't used.