Hi, I'm new around here! I've been building a small runtime for distributed applications in Rust, based on WASM with Wasmtime as the core component: https://github.com/GianIac/numax
I would be really happy if anyone could give me their opinion on this and maybe provide me with some feedback !
Hi gianiac, thank you for sharing! Please don't hesitate to report any issues you're running into, or ask questions here :slight_smile:
and to ask one myself: what made you go with your own ABI instead of using the Component Model and WIT for your APIs? Was there something you need that's not expressible with the Component Model? Because otherwise it seems like that'd give you a lot of things for free (and across a wide range of languages) that you currently have to do manually
Till Schneidereit ha scritto:
and to ask one myself: what made you go with your own ABI instead of using the Component Model and WIT for your APIs? Was there something you need that's not expressible with the Component Model? Because otherwise it seems like that'd give you a lot of things for free (and across a wide range of languages) that you currently have to do manually
Hi Till, thanks for the question and honestly, it's one I hadn't considered at all when designing the host API. I went with the raw ptr/len ABI because it was the most straightforward path to get things working, especially since guest modules use #![no_std] and the Component Model toolchain for that target is still rough.
But your point is interesting enough that I'd like to ask directly: how would you approach it? Given that numax has a custom semantic layer on top (CRDT ops that trigger async broadcast to peers), where would you draw the line between what WIT can express and what still needs to live in the runtime? And would you start with WIT as documentation/spec first, keeping the current ABI underneath, or go straight for a full Component Model guest?
given that you're using wasmtime as the runtime, I think going straight to Component Model might be easiest, honestly. On where to draw the line, I don't think I have a particularly well informed opinion. Maybe providing the CRDT ops as WIT imports, with the broadcasting on the host side? In principle it might be possible to do that in guest as well, but at least I'd recommend doing it in a different component, because otherwise it has to exist for all language toolchains—which is exactly what you'd ideally avoid
Thanks for your input; it was a very fruitful exchange. I'll definitely keep it in mind for future releases!
Last updated: Jun 01 2026 at 09:49 UTC