Calling it not an ORM just cause it implements a DTO is splitting hairs. It's an ORM. If you are hydrating an object that saves to storage and you are manipulating it's life cycle and then casting types between your storage primitives and your language primitives from memory to disk you are writing code that every other ORM is writing and it's not special.
As soon as you add use Ecto.Schema to your model it's an ORM.
> But it doesn't require a database and queries have to be explicit!
yea yea that's a feature of every ORM