RESEARCH PROTOTYPE // RUST

measured before it is marketed.

filtered vector search is often described as a database problem long before anyone measures the work a real query does. qenlo starts with the measurement: an embedded rust prototype testing if exact gpu search beats cpu by 2× at p95, with the actual adapter named in every run.

Research Gate 2× P95 Latency
Predeclared Gate 1,000,000 × 768
Filter Selectivity 1% Eligible Rows
Query Protocol Batch 1 · k = 10
01.

the question

Filtered vector search is often described as a database problem long before anyone measures the work a real query does. Qenlo starts with the measurement.

It is a Rust research prototype for native applications that embed dense-vector search directly in the client. The engine indexes pre-computed embeddings; it does not generate them, transform tensors, or run neural inference. Those belong to the runtime that produced the vectors.

The current bet is narrow: on a repeatable 1m × 768, 1%-eligible, batch-1, k=10 workload, can an exact GPU path beat the strongest qualifying CPU path by 2× at P95 without giving up recall or correct filtering? Until that run exists, GPU acceleration is an experiment, not a claim.

02.

what’s in here

A modular workspace partitioned strictly by responsibility. The baseline is deliberately plain: portable exact CPU search with no C++ or GPU build requirement.

qenlo-core zero-dep crate

Canonical records, unit-normalized float32 vectors, BTree-indexed predicate filtering (user_id, timestamp), and exact cosine search with deterministic ID tie-breaking.

qenlo async client crate

Async embedded collection API, ExecutionReport telemetry, durable snapshot serialization with tombstone tracking, and optional USearch & wgpu acceleration backends.

qenlo-bench oracle & metrics

Independent float64 correctness oracle, nearest-rank P95/P99 latency calculations, synthetic metadata distributions, and OpenTelemetry HTTP/protobuf export examples.

qenlo-browser developer UI & TUI

Claude Code-style terminal browser, embedded zero-dependency local Web UI, and Tauri v2 desktop application for visual inspection and vector query testing.

03.

qenloDB browser

Radical transparency for vector collections. Inspect canonical rows, tombstones, and WAL compaction across TUI, Web, and Desktop interfaces.

Why this DB browser exists: Just as DB Browser for SQLite demystified local relational databases, QenloDB Browser eliminates the black-box nature of vector search. Inspect raw normalized float components, verify compound metadata filters prior to ranking, observe tombstone markers and WAL segment compaction, and evaluate SIMD/GPU latency breakdowns without external daemon infrastructure.
Claude Code-Style TUI terminal interface

Interactive terminal application with vim navigation (j/k, Enter), compound filters, similarity score meters (████████░░ 0.9541), and Claude Code command prompt (:open, :search, :flush).

Embedded Local Web UI http://127.0.0.1:3456

Zero-dependency single-page application served directly from the compiled binary. Browse records, test query vectors interactively, and inspect on-disk .qdb, .wal, and HEAD files.

Tauri v2 Desktop App native desktop

Cross-platform native desktop GUI in apps/desktop with OS folder dialogs, native window chrome, and direct connection to the underlying Rust storage engine.

download latest binary releases read browser documentation
04.

execution paths & telemetry

Optional backends are explicit because a feature flag should tell the truth about the toolchain it brings along.

Path Algorithm Filter Execution Intent & Toolchain
CPU (default) Exact cosine Ordered metadata indexes Correctness baseline · zero external C++/GPU dependencies
usearch HNSW Graph predicate Approximate comparison · requires C++ compiler / toolchain
gpu-wgpu Exact cosine CPU mask, eligible rows, or GPU predicate Acceleration research · requires native Vulkan/DX12/Metal driver

Every search returns an ExecutionReport: requested and actual backend, algorithm, filtering path, rebuild state, phase timings, transfer sizes, and a fallback reason where one exists. That is there so a fast-looking result has to explain itself.

qenlo/src/lib.rs • ExecutionReport struct
pub struct ExecutionReport {
    pub requested_backend: BackendSelection,
    pub actual_backend: BackendKind,
    pub algorithm: Algorithm,
    pub filter_execution: FilterExecution,
    pub index_generation: u64,
    pub rebuilt: bool,
    pub fallback_reason: Option<String>,
    pub total_duration: Duration,
    pub phases: PhaseTimings, // preparation, upload, dispatch, execution, readback, selection
    pub upload_bytes: Measurement<u64>,
    pub readback_bytes: Measurement<u64>,
    pub dispatch_count: Measurement<u32>,
    pub qenlo_allocation_bytes: Measurement<u64>,
    pub candidates: Measurement<u64>,
    pub results: usize,
}
05.

research status

Current milestone records what has been built, measured, and still needs a larger machine before it can be evaluated.

Area Current State Notes
Exact CPU search & metadata filtering Implemented & Tested Deterministic tie-breaking, BTree range scans
USearch filtered ANN path Implemented Windows toolchain workaround documented
wgpu device smoke tests Implemented & Tested Vulkan & DX12 compute dispatch
Dataset preparation & competitor benchmarks 100k × 384 Measured DTU AG News vectors; USearch and native Chroma replay retained
2× P95 gate evaluation 1m × 768 Untested 100k × 384 RTX 4050 GPU predicate: 5.14× vs Qenlo exact CPU; gate still open
Native runtime acceptance Windows DX12/Vulkan RTX 4050 plus Intel UHD hybrid host, and a separate Intel Arc Vulkan quick/soak submission
Measured snapshot: On the real 100k × 384 all-row cell, the NVIDIA GeForce RTX 4050 Laptop GPU exact predicate path recorded 3.2404 ms P95 versus 16.6567 ms for Qenlo exact CPU, with 0.99998 recall and zero filter violations. A separate Intel Arc Vulkan soak run recorded exact GPU P95 of 4.444 ms versus exact CPU P95 of 16.486 ms, with Recall@10 = 1.0. These are device-specific observations, not universal claims. The 1m × 768 gate remains untested.
06.

get running

You need the Rust toolchain declared in rust-toolchain.toml. Clone the repository and run the portable suite:

Portable CPU test suite
git clone https://github.com/a3ro-dev/qenlo.git
cd qenlo
cargo test --workspace --no-default-features

Build the optional paths only when you are ready for their dependencies. On a hybrid machine, check the reported adapter after a GPU run; this host has Intel UHD Graphics and NVIDIA GeForce RTX 4050 Laptop GPU, and the retained measurements use the NVIDIA discrete adapter.

Optional backends & benchmarks
# wgpu exact-search path
cargo test -p qenlo --features gpu-wgpu

# USearch / C++ path
cargo test -p qenlo --features usearch

# benchmark crate and OTLP example
cargo check -p qenlo-bench --all-features --examples

On Windows, if MSVC 14.29 crashes in USearch's numkong dependency, clang-cl is a verified local workaround:

Windows clang-cl workaround
$env:CC = 'clang-cl'
$env:CXX = 'clang-cl'
cargo test -p qenlo --features usearch
copied to clipboard