🚀 Introducing the Kunai Sandbox UI
I'm excited to share a Kunai-related project I've been working on over the past two months: Kunai Sandbox UI – https://github.com/kunai-project/sandbox-ui
This interface builds on top of Kunai Sandbox (https://github.com/kunai-project/sandbox) and is designed to streamline malware sample analysis by providing a dedicated UI for detection engineers. Instead of competing with existing sandboxing tools, the focus is on delivering actionable, structured data that's directly usable by teams working with Kunai.
This post isn't a full walkthrough, but I’d like to share some insights into the technical choices behind the project — and why I made them.
---
🖥️ Frontend Decisions
👉 Why Vue.js 3?
This is my first time building a UI in over a decade, so I had some catching up to do. I initially explored a full-Rust stack using Leptos (https://www.leptos.dev/), but quickly ran into some issues:
- Slow development cycles due to full frontend and backend compilation on every change — painful during UI design, where rapid iteration is key
- Reactive programming in Rust felt unintuitive and heavy
- The benefits of frontend/backend integration didn’t outweigh the added complexity
- Integrating with Node.js modules is challenging and required extra work
After weighing my options and talking to friends, colleagues, and a few helpful AI agents, I switched to Vue.js 3 — and haven’t looked back.
---
🧠 Backend Decisions
👉 Why Rust?
Do I even need to say it? 😄 Rust enables fast, safe, and maintainable development — a great fit for backend programming.
💡 Web Framework
I tested both Axum (https://github.com/tokio-rs/axum) and Rocket (https://rocket.rs/). In the end, I chose Rocket because I preferred its derive macro-based model. Both are excellent — sometimes it just comes down to what feels right.
💡 ORM Framework
As the project grew, a clean database integration became essential. I first tried SQLx (https://github.com/launchbadge/sqlx), which is powerful but not a true ORM — meaning lots of manual mapping between SQL rows and Rust structs.
I then explored Diesel (https://diesel.rs/) and SeaORM (https://www.sea-ql.org/SeaORM/). After going through both tutorials, I chose SeaORM for its full-Rust experience. Diesel still requires maintaining your DB schema in SQL, which SeaORM avoids.
🔧 Putting It All Together
The frontend is compiled with a Rust build script and embedded directly into the final binary using the rust-embed crate (https://git.sr.ht/~pyrossh/rust-embed). This allows for simple, single-binary deployments.
---
Thanks for reading! I tried to keep this post brief — if you have questions or feedback, feel free to reach out!