What's done and what's next.
Crucible is active development, not a closed one-off. Below: everything already in the engine, what I'm working on now, and the on-device use cases the runtime is being aimed at.
Shipped
6 itemsshipped
C++17 core with custom tensor class
Row-major flat memory, shape/stride bookkeeping, Eigen-backed matmul and conv2d.
shipped
Hand-written ONNX protobuf decoder
Reads .onnx binary wire format without protoc. Varint, length-delimited fields, embedded tensors.
shipped
Kahn's algorithm graph executor
Topological sort over the DAG, ready-set scheduling, deterministic execution order.
shipped
20-operator native engine, checked against ONNX Runtime
Conv, pooling, BatchNormalization, Gemm and activations — enough for ResNet18 and MobileNetV2 — with a 70-case parity suite against ONNX Runtime.
shipped
Small Rust WASM runtime
A separate pure-Rust interpreter (MatMul, Add, Relu, Sigmoid, Softmax) built with wasm-bindgen; runs the fraud model in the browser.
shipped
C ABI, Python module and HTTP server
Shared library with a C interface (used by the Rust CLI), a pybind11 module, and a FastAPI server with per-user model registry.
In progress
0 itemsPlanned
7 itemsplanned
Close the performance gap with ONNX Runtime
Single-threaded, Crucible is currently several times slower than ONNX Runtime on ResNet18 / MobileNetV2. Threading and faster conv paths are next.
planned
Native ↔ WASM parity harness
Automatically compare the two runtimes' outputs on the models they both support.
planned
Quantized int8 MatMul path
Symmetric per-tensor quantization for smaller models.
planned
Biometric matching (face embeddings)
On-device MobileFaceNet inference; cosine similarity in the tab, no biometric data uploaded.
planned
Document OCR (CRNN)
Client-side ID/receipt OCR — pixels never leave the device, only extracted fields cross the wire.
planned
WebGPU backend
Optional GPU kernels for the larger conv-heavy models; keep WASM as the always-available fallback.
planned
Streaming model loader
Range-request the .onnx from CDN and start executing before the full file has landed.