Your AI pipeline deserves a purpose-built persistence layer. RecallDB is an opinionated schema on top of pgvector that stores embeddings alongside rich metadata, labels, tags, and raw content — all behind a single REST API.
$ docker compose up
# API at localhost:8600, Dashboard at localhost:8601
$ curl -X PUT http://localhost:8600/v1.0/tenants/ten_default/collections/col_default/documents \
-H "Authorization: Bearer recalldbadmin" \
-d '{
"DocumentId": "readme-guide",
"ContentType": "Text",
"Content": "RecallDB stores embeddings alongside rich metadata.",
"Embeddings": [0.1, 0.2, 0.3],
"Labels": ["documentation", "guide"],
"Tags": [{"Key": "source", "Value": "readme"}]
}'
Install extensions, write migration scripts, design a schema — all before you can store your first embedding.
Documents, chunks, positions, metadata tables. Every team builds their own, and it's hard to carry forward to the next project.
REST endpoints, bearer tokens, multi-tenant isolation, RBAC. Important work, but it's undifferentiated infrastructure for your team.
The result works, but it's tightly coupled to one project — and the next project needs something slightly different.
Most vector databases focus on embeddings alone. RecallDB is the perfect partner to pgvector. It stores everything your retrieval pipeline needs to find, rank, and act on information.
Semantic similarity search via pgvector with dedicated HNSW indexing per collection. No noisy-neighbor problems.
Full text, code, tables, lists, hyperlinks, binary data, images. Your content lives right next to its embeddings.
Text, HTML, JSON, XML, CSV, SQL, code, table, and binary. Your retrieval pipeline knows what it's looking at.
Ordered document segments with document_id + position grouping. Reconstruct full documents or navigate by chunk.
Query across content, metadata (labels and key-value tags with 10 operators), and vector embeddings — all in a single compound request.
Deduplication, cache invalidation, and change detection out of the box. No extra plumbing required.
No exotic infrastructure. No proprietary lock-in. Just Postgres with the pgvector extension, wrapped in an opinionated schema and a clean REST API. Access your database directly at any time.
Each collection creates its own Postgres tables with a dedicated HNSW vector index. Labels and tags are stored in separate relational tables, keeping the vector index lean.
Tenants, users, credentials, and collections are fully scoped. One deployment serves many clients with complete data isolation between tenants.
No vendor lock-in. Use OpenAI, Cohere, Ollama, Voyage, or anything that outputs a float array. RecallDB stores and indexes them all the same.
Vector similarity, full-text relevance, or hybrid — combine with labels, tags, terms, and date filters in a single query.
// Semantic similarity search using embeddings
{
"Vector": {
"SearchType": "CosineSimilarity",
"Embeddings": [0.1, 0.2, 0.3, ...],
"MinimumScore": 0.7
},
"LabelFilter": {
"Required": ["important"]
},
"MaxResults": 10
}
// Score = vector similarity (0.0 - 1.0)
// 5 metrics: cosine, euclidean, inner product
// Ranked text search with stemming & stop words
{
"FullText": {
"Query": "OAuth2 PKCE configuration",
"SearchType": "TsRank",
"Language": "english",
"MinimumScore": 0.01
},
"SortOrder": "TextScoreDescending",
"MaxResults": 10
}
// Score = ts_rank relevance (0.0 - 1.0)
// No embeddings needed — pure lexical search
// Best of both: semantic + lexical in one query
{
"Vector": {
"SearchType": "CosineSimilarity",
"Embeddings": [0.1, 0.2, 0.3, ...]
},
"FullText": {
"Query": "OAuth2 PKCE flow",
"TextWeight": 0.3
},
"MaxResults": 10
}
// Score = 0.7 * vector + 0.3 * text
// TextWeight controls the blend ratio
5 metrics: cosine similarity, cosine distance, Euclidean similarity, Euclidean distance, inner product. Set score or distance thresholds.
PostgreSQL ts_rank scoring with stemming, stop word removal, and language support. TsRank or TsRankCd (term proximity).
Blend vector similarity and text relevance with configurable weighting. One query, both scoring models, unified results.
Boolean label filters, 10 tag operators, and case-insensitive substring matching. Combine with any search mode.
Temporal scoping with CreatedBefore/CreatedAfter. MaxResults up to 1000 with continuation tokens.
Store conversation history, knowledge base articles, and FAQ embeddings. Retrieve contextually relevant answers with compound filters on topic labels and recency.
Chunk PDFs, contracts, and reports with position tracking. Search across thousands of documents with label-scoped vector queries and tag-based metadata filters.
Persist chat history with per-session labels and user metadata tags. Retrieve relevant past exchanges with vector similarity, full-text relevance, or hybrid search and temporal filters for context-aware responses.
Store image embeddings, audio transcripts, and video descriptions alongside their raw content. Typed content categories let your pipeline handle each format correctly.
Build AI-powered features for your SaaS product. Each customer gets fully isolated tenants with their own collections, users, and credentials. One deployment, many clients.
Centralize organizational knowledge with rich metadata. Filter by department, access level, document type, and date range while leveraging semantic, full-text, or hybrid search.
Tenants, users, credentials, and collections are fully scoped.
Dedicated vector indexes with no noisy-neighbor problems.
Cosine, Euclidean, inner product — similarity and distance variants.
Vector, full-text, and hybrid search + labels + tags + terms + dates in one request.
OpenAI, Cohere, Ollama, or any float array. No vendor lock-in.
Bulk ingest documents in a single API call for high-throughput pipelines.
Manage tenants, collections, and documents visually. Search with a query builder.
Postgres + pgvector, API server, and dashboard in one command.
Typed clients for C#, Python, and JavaScript. Full CRUD and search operations with zero boilerplate.
$ curl -X POST http://localhost:8600/v1.0/tenants/ten_default/collections/col_default/search \
-H "Authorization: Bearer recalldbadmin" \
-H "Content-Type: application/json" \
-d '{
"Vector": {
"SearchType": "CosineSimilarity",
"Embeddings": [0.1, 0.2, 0.3],
"MinimumScore": 0.7
},
"LabelFilter": {
"Required": ["documentation"]
},
"Terms": {
"Required": ["metadata"]
},
"MaxResults": 10
}'
using RecallDb.Sdk;
using RecallDb.Sdk.Models;
var client = new RecallDbClient("http://localhost:8600", "recalldbadmin");
// Store a document with embeddings and metadata
await client.CreateDocumentAsync("ten_default", "col_default", new DocumentRecord
{
DocumentId = "readme-guide",
ContentType = "Text",
Content = "RecallDB stores embeddings alongside rich metadata.",
Embeddings = new List<float> { 0.1f, 0.2f, 0.3f },
Labels = new List<string> { "documentation", "guide" }
});
// Search with compound filters
SearchResult results = await client.SearchAsync("ten_default", "col_default", new SearchQuery
{
Vector = new VectorQuery
{
SearchType = "CosineSimilarity",
Embeddings = new List<float> { 0.1f, 0.2f, 0.3f },
MinimumScore = 0.7
},
MaxResults = 10
});
from recalldb_sdk import RecallDbClient
client = RecallDbClient("http://localhost:8600", "recalldbadmin")
# Store a document with embeddings and metadata
client.create_document("ten_default", "col_default", {
"DocumentId": "readme-guide",
"ContentType": "Text",
"Content": "RecallDB stores embeddings alongside rich metadata.",
"Embeddings": [0.1, 0.2, 0.3],
"Labels": ["documentation", "guide"]
})
# Search with compound filters
results = client.search("ten_default", "col_default", {
"Vector": {
"SearchType": "CosineSimilarity",
"Embeddings": [0.1, 0.2, 0.3],
"MinimumScore": 0.7
},
"MaxResults": 10
})
const { RecallDbClient } = require('recalldb-sdk');
const client = new RecallDbClient('http://localhost:8600', 'recalldbadmin');
// Store a document with embeddings and metadata
await client.createDocument('ten_default', 'col_default', {
DocumentId: 'readme-guide',
ContentType: 'Text',
Content: 'RecallDB stores embeddings alongside rich metadata.',
Embeddings: [0.1, 0.2, 0.3],
Labels: ['documentation', 'guide']
});
// Search with compound filters
const results = await client.search('ten_default', 'col_default', {
Vector: {
SearchType: 'CosineSimilarity',
Embeddings: [0.1, 0.2, 0.3],
MinimumScore: 0.7,
},
MaxResults: 10,
});
A complete REST API covering every resource in the system. Bearer token authentication, admin and user scopes, and full OpenAPI/Swagger documentation out of the box.
$ git clone https://github.com/jchristn/RecallDB.git
$ cd RecallDB/docker
$ docker compose up
Postgres + pgvector, the API server, and the React dashboard all come up together.
$ curl -X PUT \
localhost:8600/v1.0/.../documents \
-H "Authorization: Bearer recalldbadmin" \
-d '{
"DocumentId": "doc1",
"ContentType": "Text",
"Content": "Hello world",
"Embeddings": [0.1, 0.2, 0.3]
}'
A default tenant and collection are created on first boot. Start storing documents immediately.
$ curl -X POST \
localhost:8600/v1.0/.../search \
-H "Authorization: Bearer recalldbadmin" \
-d '{
"Vector": {
"SearchType": "CosineSimilarity",
"Embeddings": [0.1, 0.2, 0.3],
"MinimumScore": 0.5
},
"MaxResults": 10
}'
Combine vector similarity, full-text relevance, or hybrid search with labels, tags, terms, and date filters in a single query.
recalldbadmin
admin@recall / password
default
http://localhost:8600
http://localhost:8601
RecallDB gives you a complete persistence and retrieval architecture out of the box — so you can focus on building the features that matter.