SurrealDB can be run as an embedded database within your Rust application, allowing you to use SurrealDB without running a separate server process. This is ideal for desktop applications, testing, local development, and edge computing scenarios.
Embedded database options
SurrealDB supports multiple types of embedded storage in Rust:
In-memory database (
Mem) - Fastest performance with data stored in RAM. Perfect for testing, caching, or temporary data. Data is lost when the connection closes.File-based database (
RocksDborSurrealKV) - Persistent storage on disk using RocksDB or SurrealKV storage engines. Data persists across connections and application restarts.
Quick example
use surrealdb::engine::local::Mem;
use surrealdb::Surreal;
// In-memory database
let db = Surreal::new::<Mem>(()).await?;
db.use_ns("main").use_db("main").await?;
let person = db.create("person").content(Person { name: "John Doe" }).await?;
println!("{:?}", person);
// File-based persistent database (RocksDB)
use surrealdb::engine::local::RocksDb;
let db = Surreal::new::<RocksDb>("./mydb").await?;
db.use_ns("main").use_db("main").await?;
let company = db.create("company").content(Company { name: "TechStart" }).await?;
println!("{:?}", company);Desktop apps with a web frontend
In a desktop framework such as Tauri, the interface runs in a webview and the application code in Rust. An embedded database runs inside the Rust process and does not listen on a network port, so the JavaScript SDK in the webview has nothing to connect to. There are two ways to give the interface its data:
Query from Rust. Keep the embedded database in the Rust code, and expose the queries the interface needs as Tauri commands, which the webview calls with
invoke. The database stays private to the application.Run a server. Start
surreal startas a separate process listening onlocalhost, and connect to it from both the Rust code and the JavaScript SDK. Both see the same data, at the cost of a second process to start and stop with the application.
The JavaScript SDK can also embed its own engine in the webview, but that is a separate database from the one in the Rust process.
For complete documentation, installation instructions, examples, best practices, and troubleshooting, see the Rust SDK embedding guide.