Why not just go the LNDK route and use the LDK BOLT12/onion message code (which is usable directly without the rest)?
You should seriously consider this. Annoying as it is to throw away working code, this code is *annoying* in a way few things in the specs are. I really wish there was a way to use partial onions for this instead, but I can't make it work with the addition of the payload at the end (and you'd have to use exact values down each path, but that's probably ok). Even my new code doesn't do padding, delaying, dummy hops or fake node IDs like everyone would like. That will probably be in 24.11...