Domain-specific languages (DSLs) have been around for decades, and show no sign of disappearing any time soon (despite the best efforts of XML, JSON and YAML on the one hand, and Ruby on the other hand). They vary enormously, since they have been designed for a wide variety of domains. But when you examine domains and DSLs that are more complex than config files, but less complex than "real" programming languages, some common design errors start to appear.
In particular, odd things start to happen when a language involves both declarative and procedural styles. This hybrid style of language is very useful, but conflicts between the two styles can be tricky to resolve. The good news is that academic computer science figured this stuff out decades ago, and language designers from C to Python to Go have used the resulting mathematical and software tools to make sane, extensible programming languages. Unfortunately, DSL designers often get away with ad-hoc techniques that ignore language theory, and their creations suffer as a result. It doesn't need to be this way.
I've been using and writing open source software since before it was called open source. Long ago, I contributed a couple of modules to Python's standard library, and one important package that everyone loves to hate (distutils). More recently, I've contributed occasional bug fixes.