Download Latest Version semlith-v0.51.1-x86_64-pc-windows-msvc.zip (24.5 MB)
Home / v0.2.0
Name Modified Size InfoDownloads / Week
Parent folder
semlith-v0.2.0-aarch64-apple-darwin.tar.gz 2026-07-29 12.7 MB
semlith-v0.2.0-aarch64-unknown-linux-gnu.tar.gz 2026-07-29 15.4 MB
semlith-v0.2.0-x86_64-pc-windows-msvc.zip 2026-07-29 11.5 MB
semlith-v0.2.0-x86_64-unknown-linux-gnu.tar.gz 2026-07-29 14.1 MB
SHA256SUMS 2026-07-29 444 Bytes
README.md 2026-07-29 4.8 kB
Semlith 0.2.0 source code.tar.gz 2026-07-29 75.1 kB
Semlith 0.2.0 source code.zip 2026-07-29 88.1 kB
Totals: 8 Items   53.9 MB 0

Removes three of the four limitations 0.1.0 shipped with, cuts peak indexing memory to a third, and changes the default embedding model.

Changed

  • New default embedding model: granite-embedding-small-english-r2, int8. Replaces BGESmallENV15 for newly created stores. On a 6260-chunk benchmark of mixed Rust, Markdown and TypeScript it scored 16.00 code MRR@10 against BGE-small's 14.84, in a 52 MB download instead of 133 MB, at the same query latency. It is 384-dimensional, so the index geometry is unchanged.

Existing stores are not affected and are not migrated. A store keeps the model it was built with, because vectors from two models are not comparable. To move an existing store onto the new default, delete the store directory and re-index.

  • Search is now hybrid. Every query consults SQLite FTS5 for literal terms alongside the vector index, and the two rankings are fused by reciprocal rank. There is no flag: dense-only search cannot reliably find an exact identifier, which is one of the most common things asked of a code corpus. Existing stores have their keyword index built on first open, which costs no re-embedding.

The score on a hit is now a fusion score rather than a cosine similarity. It orders results within one query and means nothing across queries.

  • ONNX Runtime thread count is chosen rather than defaulted. On Apple silicon it is the performance-core count; elsewhere the full core count. ONNX Runtime synchronises threads per operator, so one thread on an efficiency core paces the whole batch — measured 16.5 chunks/sec at four threads against 13.9 at eight on a 4P+4E M1. Override with SEMLITH_EMBED_THREADS.

  • Minimum supported Rust version is now 1.89, for std::fs::File::try_lock.

Added

  • One writer per store. An index run holds an OS advisory lock on the store for its duration. A second run exits non-zero naming the process that holds it, instead of interleaving writes until the vector index and the database disagree. The kernel releases the lock if the process dies, so an interrupted run leaves nothing to clean up and no stale file to delete by hand.

  • semlith models lists the new default alongside fastembed's built-in models.

Fixed

  • A release whose git tag disagrees with Cargo.toml now fails the release build instead of publishing binaries labelled with a version they were not built from.

Performance

Measured on a 4P+4E Apple Silicon laptop with 8 GB of RAM, over corpora of mixed Rust, Markdown and TypeScript.

store warm query, p50 indexing peak RSS
1.2k chunks 2.7 ms 27.6 chunks/sec 600 MB
9.9k chunks 5.4 ms 24.3 chunks/sec 637 MB
105k chunks 22.7 ms 23.5 chunks/sec 595 MB
  • Peak indexing memory is now roughly 600 MB and no longer grows with the corpus, against ~1.7 GB in 0.1.0. Across a 1.2k, 9.9k and 105k chunk corpus it varies by 7 percent, and the largest corpus uses the least. Two causes: embedding batches were being flushed once per file rather than once per batch, so a single large file could hold thousands of chunks in memory; and the batch size itself was three times larger than it needed to be.
  • Indexing throughput is up from ~13 to ~23 chunks/sec, from sizing the ONNX Runtime thread pool to the machine's performance cores.
  • Retrieval quality, measured end to end through the binary over a 6527-chunk corpus with 1809 self-labelled queries:
code MRR@10 docs MRR@10
0.1.0 (BGE-small, dense only) 14.84 15.09
0.2.0 (granite int8, dense only) 16.00 14.08
0.2.0 as shipped (granite int8 + FTS5) 17.90 15.62

The model change alone would have regressed prose retrieval. Keyword fusion more than recovers it, which is why the two ship together.

Library API

semlith is a published crate, so these are breaking changes to its Rust API. The library API is unstable before 1.0 and changes with the minor version.

  • DEFAULT_MODEL: EmbeddingModel is replaced by default_model() -> Model.
  • Semlith::open takes Option<Model> rather than Option<EmbeddingModel>, and Semlith::model returns &Model. Model is an enum over fastembed's built-ins and the new default, which is not one of them.
  • New modules: embed (model identity and loading) and lock (store locking).

Install

Download the archive for your platform, unpack it, and put semlith on your PATH. Linux builds need OpenBLAS at runtime (apt-get install libopenblas-dev or your distribution's equivalent). Intel macOS has no prebuilt binary: ONNX Runtime no longer publishes x86_64 macOS builds.

Verify a download against SHA256SUMS before running it.

Source: README.md, updated 2026-07-29