Abstraction, not syntax written by Ruud van Asseldonk
published 12 October 2025
The world is growing tired of yaml. Alternative configuration formats are making the rounds. Toml has steadily been gaining traction, in part due to tools like Cargo and adoption in the Python standard library. Json supersets (with comments, commas, and the digit 5) are flourishing, while KDL , kson and now maml promise to hit the sweet spot between friendly and simple.
While I do believe that yaml is harmful, all of the simpler formats are basically fine, and their differences are mostly superficial. The one real difference is in their data models. Most formats adopt the json data model of objects and arrays, while KDL , HCL , and e.g. Nginx adopt the XML data model of named nodes with attributes and children. The rest is just syntax. And yes, syntax does matter, but line noise is not the real problem here!
Syntax is superficial
Let’s look at an example: suppose we need to define cloud storage buckets to store backups. We want to back up two databases: Alpha and Bravo. For each we need three buckets: one for hourly, daily, and monthly backups. They should have a lifecycle policy that deletes backups after 4, 30, and 365 days. We don’t want to click around, so we’ll set this up using an infrastructure-as-code tool using the following hypothetical configuration file:
{ "buckets" : [ { "name" : "alpha-hourly" , "region" : "eu-west" , "lifecycle_policy" : { "delete_after_seconds" : 345600 } } , { "name" : "alpha-daily" , "region" : "eu-west" , "lifecycle_policy" : { "delete_after_seconds" : 2592000 } } , { "name" : "alpha-monthly" , "region" : "eu-west" , "lifecycle_policy" : { "delete_after_seconds" : 31536000 } } , { "name" : "bravo-hourly" , "region" : "us-west" , "lifecycle_policy" : { "delete_after_seconds" : 345600 } } , { "name" : "bravo-daily" , "region" : "eu-west" , "lifecycle_policy" : { "delete_after_seconds" : 259200 } } , { "name" : "bravo-monthly" , "region" : "eu-west" , "lifecycle_policy" : { "delete_after_seconds" : 31536000 } } ] }
Yes, this file would look friendlier in a different format. But the file also contains two bugs, and switching formats is not going to fix those. Can you spot them? To avoid spoilers, here’s a bit of yaml to pad the page. I’ll even throw in some comments for clarity:
buckets : - name : "alpha-hourly" region : "eu-west" lifecycle_policy : delete_after_seconds : 345600 # 4 days - name : "alpha-daily" region : "eu-west" lifecycle_policy : delete_after_seconds : 2592000 # 30 days - name : "alpha-monthly" region : "eu-west" lifecycle_policy : delete_after_seconds : 31536000 # 365 days - name : "bravo-hourly" region : "us-west" lifecycle_policy : delete_after_seconds : 345600 # 4 days - name : "bravo-daily" region : "eu-west" lifecycle_policy : delete_after_seconds : 259200 # 30 days - name : "bravo-monthly" region : "eu-west" lifecycle_policy : delete_after_seconds : 31536000 # 365 days
What’s wrong?
... continue reading