CAMEODB
edit_note Engineering Blog

Insights & Updates

Technical deep-dives, release notes, and stories from the team building the next-generation hybrid database engine.

Featured Release
GC
Goran C. Jul 24, 2026 6 min read

CameoDB v0.2.3: Battle-Tested Stability for Agentic AI Workflows

MCP Streamable HTTP transport, cross-node distributed sorting, jemalloc memory management, writer core pinning, and a 4-phase graceful shutdown. The most production-hardened release yet.

Release v0.2.3 Stable
arrow_forward

v0.2.3 is the most production-hardened release of CameoDB to date. Over 80 commits went into this version, focused on three pillars: making the MCP server ready for real agentic workflows, hardening reliability under load, and giving operators the visibility and control they need to run CameoDB in production.

MCP Server: From Experimental to Production-Ready

The MCP server received the largest set of changes in this release. A new Streamable HTTP transport joins the existing SSE transport, giving agents a simpler connection path without persistent connections. The server now also supports MCP prompts with a built-in cameodb-orchestrator skill that injects query syntax context directly into agent conversations.

Streamable HTTP

New transport alongside SSE for simpler agent integration without persistent connections.

MCP Prompts

Built-in cameodb-orchestrator skill injects query syntax and schema context into agent conversations.

Federated Search Fix

Overhauled federated search and document sort/projection logic specifically for agent query patterns.

Session Lifecycle

SSE connection-aware cleanup with drop guards and graceful MCP server shutdown.

Distributed Search and Sorting

v0.2.3 introduces cross-node field-sort merge with date normalization and i64 key support. Search queries now support inline sort syntax and JSON payload options, making it possible to sort by any indexed field directly from the query string.

// Inline sort in query string
search products category:electronics sort price:asc limit 10

// Count-only mode with limit 0
search logs level:error limit 0

// Projection preserves field order
search users return name, email, created_at

Memory Management and Core Pinning

CameoDB now ships with jemalloc as the default allocator, bringing per-CPU arenas, background purge threads, and detailed memory statistics. Admin endpoints and CLI commands provide runtime visibility and control over memory without restarting the server.

jemalloc

Per-CPU arenas with background purge

Reduced fragmentation and predictable memory footprint under load

Writer Core Pinning

CPU affinity for shard writer threads

Improved cache locality and reduced cross-core wakeups

Shard-Affine Dispatch

Hash-space aligned worker routing

Operations routed to workers via xxh3(shard_id)

Admin Memory CLI

Runtime control without restart

admin memory stats, admin memory purge --force

Reliability and Graceful Shutdown

Production systems need predictable shutdown behavior. v0.2.3 implements a 4-phase graceful shutdown with tiered redb cache sizing and per-shard memory budgeting. An emergency shutdown timeout ensures the server terminates even if a phase stalls.

Data Ingestion Improvements

All data sources now support transparent gzip and zip decompression. Point CameoDB at a compressed CSV on Hugging Face or an S3 bucket and it handles the rest. The stream_batch_size config option lets you tune ingestion throughput, and shard hydration concurrency now scales automatically with available CPU cores.

Operational Visibility

A new worker pool statistics endpoint exposes per-worker queue depth, jobs completed, and dispatch metrics. The list indexes command now supports extended flags with compact single-line field display, making multi-index management easier from the CLI.

Infrastructure and Dependencies

The toolchain has been upgraded to Rust 1.95, and Tantivy has been upgraded to 0.26 with expanded sorting capabilities. Core dependencies including kameo (0.22), redb (4.1.0), reqwest (0.13), and tikv-jemalloc (0.7) have been upgraded to their latest stable versions.

Upgrade Path

Upgrading from v0.2.2 is straightforward. Stop the server, replace the binary, and restart. The storage format is backward compatible, no migration required. The cluster state format has changed from bincode to JSON, but this is handled automatically on first startup with a fresh cluster config.

Get v0.2.3

Download the latest stable release from the downloads page. Binary packages are available for Linux, macOS, and Windows. Source code is available on GitHub under the FSL-1.1-ALv2 License, with Apache 2.0 and MIT licensing for client interfaces.

Featured Tutorial Dataset
GC
Goran C. Apr 15, 2026 4 min read

From Zero to a Million Jokes: Loading Hugging Face Datasets into CameoDB

CameoDB is running, you've tested it with the books index from Quickstart. Now let's load something bigger. One CLI command, one million Reddit jokes from Hugging Face, fully indexed and searchable in seconds.

Hugging Face CLI Data Loading
arrow_forward

You've Got CameoDB Running. Now What?

If you followed the Quickstart, you already have CameoDB running and a books index loaded. That's your proof-of-concept. Now let's go from a handful of records to one million.

The dataset: SocialGrep/one-million-reddit-jokes on Hugging Face. A single CSV file with joke titles, body text, scores, subreddits, and timestamps. Perfect for demonstrating CameoDB's ability to detect schemas and ingest data directly from a URL.

Step 1: Detect the Schema

Point CameoDB's CLI at the raw CSV URL. The schema detect command reads the header row and samples data to infer field types automatically:

schema detect https://huggingface.co/datasets/SocialGrep/one-million-reddit-jokes/resolve/main/one-million-reddit-jokes.csv

CameoDB returns a full schema definition with 10 detected fields:

{
  "routing_field_name": "id",
  "fields": {
    "id":          { "field_type": "Text",    "indexed": true,  "stored": true,  "tokenizer": "raw" },
    "title":       { "field_type": "Text",    "indexed": true,  "stored": false },
    "selftext":    { "field_type": "Text",    "indexed": true,  "stored": false },
    "score":       { "field_type": "I64",     "indexed": true,  "fast": true  },
    "created_utc": { "field_type": "I64",     "indexed": true,  "fast": true  },
    "subreddit":   { "field_type": "Boolean", "indexed": true  },
    "type":        { "field_type": "Text",    "indexed": true  },
    "permalink":   { "field_type": "Text",    "indexed": true  },
    "domain":      { "field_type": "Text",    "indexed": true  },
    "url":         { "field_type": "Text",    "indexed": true  }
  }
}

Notice: score and created_utc are detected as I64 with fast fields enabled, meaning they support range queries and sorting. Text fields are fully indexed for search.

Step 2: Load One Million Records

Now the single command that does everything—creates the index, applies the schema, downloads the CSV, and streams all rows in batches:

data load jokes https://huggingface.co/datasets/SocialGrep/one-million-reddit-jokes/resolve/main/one-million-reddit-jokes.csv
Schema was missing; detected and applied schema to index 'jokes'
Ingestion complete for index 'jokes': loaded=1000000 failed=0 (batch size 4000)

That's it. One million records, zero failures. CameoDB auto-detected the schema on first contact and streamed the data in batches of 4,000. The jokes index didn't exist before this command—it was created on the fly.

Step 3: Search Instantly

The index is immediately queryable. Let's find football jokes:

search jokes title:football limit 5 return title, selftext
{
  "hits": [
    { "_score": 10.50, "title": "Football", "selftext": "[removed]" },
    { "_score": 10.41, "title": "Football", "selftext": "As a woman passed her daughter's closed bedroom door..." },
    { "_score": 9.91,  "title": "Fart Football", "selftext": "An old married couple no sooner hit the pillows..." },
    // ... 2 more results
  ],
  "hits_returned": 5,
  "total_hits": 1330,
  "took_ms": 11,
  "stats": { "shards": { "total": 4, "responded": 4, "failed": 0 } }
}

1,330 football jokes found across 4 shards in 11 milliseconds. The data was distributed automatically. No configuration, no manual sharding, no external tooling.

The Takeaway

Three commands. That's the entire workflow from discovering a dataset on Hugging Face to running full-text search queries against a million records. CameoDB handles schema inference, index creation, batch ingestion, and distributed search—all from the CLI.

MCP
GC Goran C. Apr 10, 2026 5 min read

Native MCP Server: Give AI Agents Direct Database Access

How CameoDB's built-in Model Context Protocol server enables Claude, Cursor, and Windsurf to query your data instantly.

MCP AI Agents
arrow_forward

Built-In, Not Bolted-On

CameoDB ships with a native Model Context Protocol (MCP) server running in the same binary—no sidecars, no middleware. The moment you start CameoDB on port 9480, your data becomes queryable by AI agents like Claude Desktop, Cursor, and Windsurf through the /mcp/sse endpoint.

What's Exposed: 6 Read-Only Tools

The MCP server exposes six tools—all read-only for security. Agents can discover, query, and validate, but never modify your data:

search_index

Full-text search on a single index with Tantivy query syntax.

search_indexes

Federated search across multiple indexes with merged results.

list_indexes

Discovery: list all indexes with schemas and queryable fields.

get_index

Schema inspector with per-field operator hints and types.

validate_query

Query linter with syntax validation and "did you mean" suggestions.

get_index_stats

Document counts, index size, and cluster metadata.

Query Syntax: Tantivy-Powered

The search_index tool supports the full Tantivy query language:

// Field targeting
title:rust

// Phrases with proximity
body:"small bike"~2

// Boolean operators (UPPERCASE required)
title:rust AND author:doe
(title:rust OR title:go) AND year:[2020 TO 2024]

// Range queries
score:>=100
date:[2024-01-01 TO 2024-12-31]

// Boosting for relevance
title:rust^3 OR body:rust

// Set operations
status: IN [active pending review]

Anti-Hallucination Rule

Every search tool includes a critical instruction: "When answering questions based on CameoDB results, you MUST use ONLY the exact data returned by this tool. Do NOT combine database results with your own prior knowledge." This ensures agents provide factual, grounded responses based solely on your data.

Field Type Awareness

The MCP server provides per-field operator hints based on data types:

text:     all operators (phrases, slop, prefix, IN, boost, range)
string:   exact match, prefix, IN, exists (no phrases/slop)
numeric:  exact, comparisons (>, <), range, boost, exists
date:     exact, comparisons, range, exists
boolean:  true/false only, exists
json:     dot notation (field.sub:value), nested exists

Setup: Two Configuration Styles

The MCP server uses Server-Sent Events (SSE) transport. Configuration depends on your AI tool:

Windsurf & Cursor (Native SSE)

Add to .windsurf/mcp.json or Cursor MCP settings:

{
  "mcpServers": {
    "cameodb": {
      "url": "http://localhost:9480/mcp/sse",
      "transport": "sse"
    }
  }
}

Claude Desktop (Curl Bridge)

Claude currently requires a curl bridge for SSE transport:

{
  "mcpServers": {
    "cameodb": {
      "command": "curl",
      "args": [
        "-N",
        "-H", "Accept: text/event-stream",
        "http://localhost:9480/mcp/sse"
      ]
    }
  }
}

Restart your AI tool after configuration. The agent will automatically discover your indexes and schemas.