Skip to content

Releases: rust-dd/react-native-qdrant-edge

v0.3.1

29 May 06:39
d43b146

Choose a tag to compare

Patch release — restores Android support by picking up the upstream qdrant-edge 0.7.1 release that contains the WAL flock fix (qdrant/qdrant#9226).

What's fixed

  • Android shard creation no longer fails with try_lock() not supported. Upstream qdrant-edge 0.7.1's WAL initializer now uses fs4::FileExt::try_lock(dir.file())? (a direct flock(LOCK_EX | LOCK_NB) syscall, which Android supports) instead of stdlib File::try_lock (gated to a fixed target_os list that excluded Android, returning ErrorKind::Unsupported).

Full Changelog: v0.3.0...v0.3.1

v0.3.0 — qdrant-edge 0.7.0, BM25, hybrid search, facets, snapshots (iOS only)

28 May 18:37
5fe631f

Choose a tag to compare

Major releaseqdrant-edge upstream bumped 0.6.0 → 0.7.0 and we now expose every public capability the upstream crate offers. TypeScript API is additive — existing 0.2.x call sites compile and behave unchanged.

⚠️ Android status: the library builds and links on Android, but createShard / loadShard currently fails at runtime because upstream qdrant-edge 0.7.0 calls Rust stdlib File::try_lock, and the stdlib gate in library/std/src/sys/fs/unix.rs excludes target_os = "android" (returns ErrorKind::Unsupported, "try_lock() not supported"). 0.2.x worked because qdrant-edge 0.6.x used fs4::try_lock_exclusive (raw flock syscall) which Android supports. Fix has to land in qdrant-edge upstream; the binding has nothing to patch FFI-side. Use 0.2.x for Android until 0.3.x picks up the upstream patch. iOS is fully verified on this release.

Highlights

  • BM25 on-device sparse embedding (createBm25, embedQuery / embedDocument) — produce sparse vectors from raw text with the full server tokenizer pipeline (language, stopwords, Snowball stemming, ASCII folding, min/max token length). No external embedding model required.
  • Hybrid search via prefetch + fusion (rrf / dbsf), with arbitrary nested prefetches and per-source RRF weights.
  • Sparse and multi-vector upsert + search (the README always claimed these; only the dense path was wired previously).
  • Advanced query modes: recommend (best-score / sum-scores), discover, context, order_by, sample, mmr.
  • Faceting (shard.facet({ key, limit?, filter?, exact? })).
  • Snapshot interop with cloud Qdrant: snapshotManifest(), unpackSnapshot, recoverPartialSnapshot.
  • Dynamic vector slots: createVectorName / deleteVectorName at runtime.
  • Runtime config setters: setHnswConfig, setVectorHnswConfig, setOptimizersConfig.
  • Mobile-tuned WAL options (wal_options on EdgeConfig, plus mobileWalDefaults() helper).
  • UUID and u64 point IDs alongside each other; PointId = number | string.
  • Filter-based payload opssetPayloadOp, overwritePayloadOp, deletePayloadOp, clearPayload accept { payload?, keys?, points?, filter?, key? }.
  • Three new example screens: BM25 + hybrid demo, facet bar-chart by country, MMR diversity slider.

Fixes

  • Runtime crash on FFI errorssearch / query / retrieve / scroll / info previously returned {"error": "..."} JSON through the C++ bridge unchanged; the TS layer parsed that as the success type and crashed downstream on .map. Now the Rust side returns null + sets last_error, the C++ throws a JS Error, and a new QdrantError / asQdrantError pair gives structured access on the TS side.
  • SparseModifier wire format — TS type was 'None' | 'Idf' (capitalized); upstream serde format is snake_case 'none' | 'idf'. Never triggered in 0.2.x because the example never used sparse vectors.
  • Android build: macOS strip on ELF archivesscripts/build-android.sh ran macOS strip on the Linux/Android .a archives, corrupting the GNU ar format. Cargo's profile.release.strip = "symbols" already does the right thing.
  • Android build: React Gradle codegen scope — without an explicit react { libraryName, codegenJavaPackageName, jsRootDir } block, the Gradle plugin scanned every codegen-spec package in the app's node_modules and bundled all of them into our AAR, then D8 hit duplicate *ViewManagerDelegate types when the real owner (e.g. react-native-screens) also shipped them.

Migration from 0.2.x

Mostly additive on the TS side:

  • Point.id and IDs in deletePoints / retrieve widen from number to number | string. Existing numeric IDs keep working.
  • Point.vector and SearchRequest.vector widen to accept sparse { indices, values } and multi [[…]]. Dense literals still match.
  • Shard.setPayload(pointId, payload, key?) gains an optional 3rd argument and accepts string IDs. Existing call sites unchanged.

Upstream behavior change: with optimizers.prevent_unoptimized: true, points written to unoptimized segments above indexing_threshold are now persisted as deferred — excluded from reads/search until you call shard.optimize(). Previously the option blocked the write entirely.

Full Changelog: v0.2.0...v0.3.0

v0.2.0

30 Mar 00:28
f9d25a4

Choose a tag to compare

  • Full React hooks API: useShard, useUpsert, useDelete, useSearch, useQuery, useRetrieve, useScroll, useCount, useShardInfo
  • Example app with 3 tabs: Basic CRUD, Emoji Similarity Search, Benchmark
  • Automated Rust build on npm install / expo prebuild / native build
  • Prebuilt binaries included in npm package (no Rust toolchain required)
  • parking_lot::Mutex for better FFI performance
  • Auto-generated C headers via cbindgen

v0.1.0

28 Mar 22:45
32ddf4f

Choose a tag to compare

react-native-qdrant-edge v0.1.0

Embedded vector search for React Native powered by Qdrant Edge (Rust) and Nitro Modules.

Highlights

  • In-process HNSW vector search on iOS and Android -- no server, fully offline
  • Prebuilt native binaries included (no Rust toolchain required)
  • Expo and bare React Native support
  • Full React hooks API

API

  • createShard / loadShard -- create or reload persistent vector stores
  • upsert / deletePoints / setPayload -- data operations
  • search / query -- nearest-neighbor and advanced search with filtering
  • retrieve / scroll / count -- retrieval and pagination
  • flush / optimize / close -- lifecycle management
  • React hooks: useShard, useUpsert, useDelete, useSearch, useQuery, useRetrieve, useScroll, useCount, useShardInfo

Install

npm install react-native-qdrant-edge react-native-nitro-modules

Supported platforms

  • iOS arm64 (device) + arm64/x86_64 (simulator)
  • Android arm64-v8a + x86_64