2 things stand out to me:
You can rename cowsay.zig to Cowsay.zig and put the struct fields directly in the file, because all Zig source files are structs.
It is against conventions in Zig to allocate memory inside a module without accepting an Allocator
parameter. It’s also generally unnecessary to perform heap allocation inside print functionality. A more ziggy implementation would figure out how to avoid heap allocation altogether in this functionality.