One engine. Every model. Any chip.
Every backend used to mean its own build, and every model meant its own config. That is gone. One small C++ binary now detects the model and the chip from a single header read, and picks a backend from six.
The mess before
The old way scales badly: one binary per backend, one config per model, and a detection layer that grew every time we added hardware. It worked, and it was not sustainable. The fix had to remove the per-machine decision entirely.
One parse
The trick is the Q4NX header. Every model we ship carries one, and it is read exactly once. From that single header parse, the engine knows which of 73+ models it is looking at, and what they need to run.
Six backends
The same binary then picks from six backends. The whole list fits in a header comment, so here it is:
NPU ROCm Vulkan CUDA Metal CPU
No per-backend builds. One binary, and the decision about where to run happens at load, not at compile time.
What stays in C++
Keeping the whole thing in one tiny C++ binary means the detection path has no scripting layer and no runtime dependency to fetch. One parse, one dispatch, and no moving parts in between.
The point
The number that matters is not the backend count. It is that a user's machine, whatever it contains, gets the right engine without being asked. One binary, 73+ models, six backends, and nothing between you and the result.