The Problem
Developers and DBAs need a single, lightweight client that can connect to dozens of heterogeneous data stores without installing a full‑featured IDE for each. Maintaining separate tools for MySQL, PostgreSQL, Redis, MongoDB, DuckDB, etc., inflates disk usage and complicates automation pipelines.
What This Does
dbx packages a 20 MB cross‑platform client that speaks to >90 databases. The core runtime lives in crates/dbx-core, while language‑specific drivers are under agents/drivers/. The desktop UI is built with Tauri (src-tauri/) and a web front‑end in apps/ (React/Vue). A built‑in AI assistant and an MCP Server provide query‑assistance and remote execution, respectively.
Key files:
crates/dbx-core/src/connection.rs– abstracts connection handling and credential storage.agents/drivers/duckdb/src/lib.rs– implements the DuckDB driver exposing aconnectfunction used by the core.src-tauri/src/commands/connection_secrets.rs– bridges UI credential dialogs to the encrypted store.
The CLI lives in agents/ as a set of Go and Rust binaries (e.g., agents/drivers/cassandra-go/main.go). Running a driver binary launches the generic driver framework, which reads a JSON config, creates a connection via dbx-core, executes the user command, and returns results to the caller (CLI, UI, or MCP Server).
How It Is Wired
Execution begins at the language‑specific driver binary. For the DuckDB driver the entry point is agents/drivers/duckdb/src/main.rs → fn main().
main()parses CLI flags (viaclap) and loads a driver‑specific config (config.yamlunder the driver folder).- It calls
duckdb::driver::connect(&config), defined inagents/drivers/duckdb/src/lib.rs. connectconstructs aDbxConnectionby invokingdbx_core::connection::new()fromcrates/dbx-core/src/connection.rs.DbxConnectionresolves secrets throughcrates/dbx-core/src/connection_secrets.rs, which reads encrypted files managed bysrc-tauri/src/commands/connection_secrets.rswhen the UI is used.- The connection object creates a low‑level client (e.g.,
rusqlitefor SQLite,postgrescrate for PostgreSQL) and returns a handle. - The driver runs the requested SQL/command via
handle.execute(query), captures rows, and serialises the result as JSON to stdout or to the Tauri IPC channel.
The MCP Server (agents/mcp_server) follows a similar path but registers the driver as a gRPC service, re‑using the same DbxConnection code. The UI (apps/ → React/Vue) talks to the Tauri backend, which proxies calls to src-tauri/src/commands/*.rs. Those command files are thin wrappers that forward to the same core connection APIs, ensuring a single source of truth for credential handling and query execution.
The hub of the system is crates/dbx-core. Any change to connection pooling, secret encryption, or error handling propagates to all drivers, UI, and CLI. No circular dependencies were observed; the graph is a clear star‑shape centred on dbx-core.
How To Use It
# Clone the repository
git clone https://github.com/moses-y/dbx
cd dbx
# Build all Rust crates (requires Rust toolchain)
cargo build --release
# Build the Tauri desktop app (requires Node & cargo)
cd src-tauri
cargo tauri build # assumes `cargo-tauri` installed
# Run a driver (example: DuckDB CLI)
cd ../agents/drivers/duckdb
cargo run -- --config ../config.yaml
Setup – The project uses Cargo for Rust, Gradle (agents/build.gradle) for Go/Java interop, and a top‑level Makefile that wraps these commands (e.g., make all). Docker images are defined in .github/workflows/docker-dev.yml; a developer can also build locally with docker build -f Dockerfile ..
Configuration – Each driver expects a config.yaml in its folder containing connection parameters (host, port, user, password). Secrets are stored encrypted under crates/dbx-core/src/connection_secrets.rs and accessed through the UI or CLI prompts.
Running – The CLI entry points are the main.go or main.rs files in agents/drivers/*. The desktop UI is launched by the Tauri binary produced in src-tauri/target/release/.
Real‑World Use
A CI pipeline can spin up a lightweight DuckDB container, invoke agents/drivers/duckdb/main.rs to run migration scripts, and capture JSON output for verification:
docker run -d --name duckdb dbx/duckdb:latest
./agents/drivers/duckdb/target/release/duckdb --config agents/drivers/duckdb/config.yaml \
--query "SELECT COUNT(*) FROM users;" > result.json
jq . result.json
The same binary works locally on a developer laptop, eliminating the need for a separate DuckDB client.
Code Health & Issues
- Low – Secret‑shaped paths –
crates/dbx-core/src/connection_secrets.rsandsrc-tauri/src/commands/connection_secrets.rscontain hard‑coded paths that may expose credential files if the directory layout changes. - No LICENSE file is present; redistribution may be legally ambiguous.
- Test coverage is high (≈1,453 test files) but CI workflow (
.github/workflows/ci.yml) does not enforce coverage thresholds. - The repository lacks a top‑level
README.mdwith explicit build instructions; the current README is image‑heavy and omits command examples.
The Bottom Line
dbx delivers a genuinely lightweight, multi‑dialect client with a unified code base; its core‑centric architecture makes adding new drivers straightforward. However, secret handling needs hardening, and documentation for building/running is sparse. Ideal for teams that need a single binary to access many data stores and are comfortable extending Rust/Go driver code.