Is there a size limit on transaction metadata?
If there is a limit, is it varying or fixed size?
At the moment maxTxSize = 16384 bytes (including metadata).
If we talk about the max number of characters in a 16 KB text file with UTF-8 encoding (8-bit), then this is 16384 characters, since each character weighs exactly 1 byte. This is more than enough, to describe transaction's body and add a reach metadata to it.
Here is an important note regarding Tx metadata:
There is no limit on the number of key-value pairs (except the overall transaction size limit) or on individual structured values. However, there is a limit on the size of text strings and byte strings within the structured values, which is implemented to mitigate the problem of unpleasant or illegal content being posted to the blockchain.
P.S.
During Basho era the size of Tx might be increased up to 512 KB.
Values change, so this is safe for the current parameters:
$ cardano-cli query protocol-parameters --mainnet | jq .maxTxSize
16384
But these are in flux, so you can try to be mindful of upcoming changes. Metadata is so versatile that if it didn't get larger there would probably be a way to deal with this, but it's in as much flux as many of the other pool parameters.
I don't know the best way to stay on top of these changes.