moss on Hex.pm) brings semantic search to Elixir
applications. Documents are embedded and queried on-device through a
high-performance Rust core, with optional cloud sync. The SDK ships built-in
embedding models, hybrid (semantic + keyword) search, and per-session indexing
for real-time workflows.
Requirements
- Elixir 1.15 or higher
- OTP 26 or higher
- Valid Moss project credentials (
project_idandproject_key)
Install
Addmoss to your dependencies in mix.exs:
project_id and project_key.
Two ways to search
The Elixir SDK exposes two entry points:Moss.Client- the entry point. Construct it with your credentials, manage cloud indexes, and load indexes into memory for fast local querying.Moss.Session- a local, in-session index. Index documents in memory during a live workflow with no cloud round trips, then push to the cloud when done.
Moss.Inference. See Inference.
Load before query
Querying always runs against an index that has been loaded into memory. CallMoss.Client.load_index/3 first,
then Moss.Client.query/4.
Queries run entirely in-memory with no network round trip. There is no query
path that runs without first loading the index (or opening a session).
Quick start
Create a client, create and populate a cloud index, load it, and query:Sessions
For real-time indexing during live workflows (voice AI agents, chat), open a session. Documents are indexed in memory with no cloud round trip, and you can push the index to the cloud when done:Moss.Session.save_to_disk/2 and
restore it in a later run with
Moss.Session.load_from_disk/3.
Open the restoring session with auto_load_on_init: false so it downloads no index.
(Elixir moss 1.6.0+)
The cache path is optional. Without one, the snapshot goes in sessions/<project id>/ under
the client’s :cache_path, else under the MOSS_SESSION_CACHE_PATH environment variable,
else under moss in the default cache directory (~/.cache/moss on macOS and Linux,
%LOCALAPPDATA%\moss on Windows). (Elixir moss 1.8.0+)
Models
Two built-in embedding models run entirely in the Rust core:moss-minilm- lightweight, optimized for speed (the default).moss-mediumlm- higher accuracy with reasonable performance.
model_id: "custom" to supply your own pre-computed embeddings via
DocumentInfo.embedding. With a custom model, each
document must set embedding, and queries must pass an embedding: option.
Errors
Every{:error, reason} from the SDK carries a %Moss.Error{}. Match on its
code atom, such as :not_found or :network, not on the message. detail holds the native
error text for logs, and load_indexes/3 reports each failed name’s code in failed_codes.
The one exception is Moss.Client.session/3
with a :server_name that is already registered, which returns GenServer’s
{:error, {:already_started, pid}}. (Elixir moss 1.5.0+)