Black Rainbow LabsInillucent

INILLUCENT

A highly performant agentic database.

An embedded database, using a SQL syntax you're familiar with, and the power of vector embeddings for semantic search. A perfect solution for agentic systems.

Scroll

What's in the box?

  1. 01Complete SQLite dialect implementation. (Upcoming Postgres dialect option)
  2. 02Highly performant database written in Rust.
  3. 03Faster than SQLite on 110 of 116 benchmark workloads.1
  4. 04500% faster than SQLite overall.1
  5. 053300% faster on reads by key.1
  6. 0670% faster than SQLite from Python, Node and the shell.5
  7. 07300% faster than Postgres on keyword search.3
  8. 08180% faster than Postgres + pgvector for semantic search.3
  9. 09Full featured CLI and MCP toolset.
  10. 10Battle tested log and recovery.
  11. 11Comprehensive vector embedding support for semantic search.
  12. 12Single db file that supports multi process access.
Three matte black metal disks hovering in a stack, the word Inillucent engraved on the top one.

FASTER

Incredible speeds that leave other databases in the dust.
Playtime is over.

workloads faster than SQLite1
110/116
faster than SQLite1
500-3300%
faster than pgvector3
180%
less CPU utilization2
77%

100% parity with SQLite's features, plus vector database support.

  • inner joins
  • cross joins
  • left joins
  • right joins
  • full joins
  • GROUP BY
  • HAVING
  • DISTINCT
  • ORDER BY
  • UNION
  • EXCEPT
  • INTERSECT
  • recursive CTEs
  • correlated subqueries
  • RETURNING
  • upsert
  • triggers
  • foreign keys
  • STRICT tables
  • WITHOUT ROWID
  • partial indexes
  • expression indexes
  • ATTACH
  • multi file commit
  • savepoints
  • EXPLAIN QUERY PLAN
  • FTS5
  • R-Tree
  • 30 JSON functions
  • your own functions
  • your own collations
  • sqlite3 dot commands

Your SQLite queries, schemas and sqlite3 scripts run as they are. Here are a few, with the rows they return.

Walk up the org chart from one engineer to the top.

WITH RECURSIVE chain(id, name, manager_id, depth) AS (
  SELECT id, name, manager_id, 0
  FROM   engineer
  WHERE  name = 'Tom Becker'
  UNION ALL
  SELECT e.id, e.name, e.manager_id, c.depth + 1
  FROM   engineer e
  JOIN   chain c ON e.id = c.manager_id
)
SELECT depth, name FROM chain;

Returns

Rows returned by the Recursive CTE example
depthname
0Tom Becker
1Priya Shah
2Marcus Lee
3Dana Okafor

4 rows

Read the SQL docs

Better than Postgres with pgvector in nearly every aspect.

We loaded the same 185,078 passages and the same vectors into both, and ran the same queries.3

MeasurementInillucentPostgres + pgvector
Median search time0.85 ms2.32 ms
Search filtered to one source0.63 ms35.58 ms
Rows a filtered search returnsAll of themShort on 3 of 6 sources
Keyword search on IDs and file pathsrank quality (MRR)0.5460.136
Questions with no answer that get one anyway0.5%100%
Recall, as deployed1.0000.468
Exact search, every vector scanned19 ms5,506 ms
  • Inillucent better

Graded on 17 measurements: better on 15, equal on 1, inconclusive on 1, worse on none.

A command line, a shell and an MCP server.

  • inillucent

    35 commands for everything you do with a database. Add --output json to any of them and you get typed rows back.

  • inillucent-shell

    Works like sqlite3, with 63 of its 65 dot commands. Your sqlite3 scripts run.

  • inillucent-mcp

    28 tools your agent can call, so Claude Code, Codex, Cursor, etc can query a database with no code written.

The migrator, backups, imports, exports and the rest are in the docs. See every command

inillucent 0.1.7

inillucent create app.rdb

created app.rdb

inillucent --db app.rdb exec "CREATE TABLE note (id INTEGER PRIMARY KEY, body TEXT NOT NULL, v VECTOR(768))"

ok. 0 rows changed.

inillucent --db app.rdb exec "INSERT INTO note (body, v) VALUES (?1, embed(?1))" --params '["Ship the 4.13 release notes to #eng-releases"]'

ok. 1 row changed.

inillucent --db app.rdb query "SELECT id, body FROM note"

id  body
--  --------------------------------------------
1   Ship the 4.13 release notes to #eng-releases

inillucent --db app.rdb describe note

note: 3 columns, 1 row

cid  name  type         notnull  dflt_value  pk
---  ----  -----------  -------  ----------  --
0    id    INTEGER      0                    1
1    body  TEXT         1                    0
2    v     VECTOR(768)  0                    0

Use Cases

Company Knowledgebase Assistant

Load your Confluence pages, Slack threads, JIRA tickets and Figma notes into one table, with an embedding for each. Give your agent one tool that searches it by meaning. The inillucent client library is a normal import and a normal query, in Rust with the driver crate and in TypeScript with the npm package.

  1. You

    What changed in the last production deploy?

  2. Agent calls a tool

    search_knowledgebase("latest production deploy notes")

  3. Inillucent returns
    • slack#eng-releases2026-09-22
    • confluenceRelease notes 4.122026-09-16
    • confluenceChangelog, August2026-09-01
  4. Agent

    4.13 went out to production on September 22 (#eng-releases). It includes the ledger migration, and the rollback plan is in the runbook if it misbehaves. The deploy before that was 4.12 on September 16, with the new checkout flow, faster search indexing and two fixes to the billing export (Release notes 4.12).

cargo add inillucent-driver inillucent-engine \
  --git https://github.com/Black-Rainbow-Labs/Inillucent \
  --features inillucent-engine/embed
cargo add serde_json
cargo add reqwest --features blocking,json

src/main.rs

use inillucent_driver::{Database, Value};
use serde_json::{json, Value as Json};

type Error = Box<dyn std::error::Error>;

/// Finds the five documents closest in meaning to the text.
fn search_knowledgebase(db: &Database, text: &str) -> Result<Json, Error> {
    let rows = db.session().query(
        "SELECT source, title, body, written
           FROM doc
          ORDER BY vector_distance_cos(v, embed('search_query: ' || ?1))
          LIMIT 5",
        &[Value::Text(text.into())],
        5,
    )?;
    let docs: Vec<Json> = rows
        .rows
        .iter()
        .map(|row| json!({ "source": row[0].text(), "title": row[1].text(), "body": row[2].text(), "written": row[3].text() }))
        .collect();
    Ok(json!(docs))
}

/// Answers a question, letting the model search as often as it needs.
fn ask(db: &Database, question: &str) -> Result<String, Error> {
    let client = reqwest::blocking::Client::new();
    let key = std::env::var("ANTHROPIC_API_KEY")?;
    let tools = json!([{
        "name": "search_knowledgebase",
        "description": "Search Confluence, Slack, JIRA and Figma by meaning.",
        "input_schema": {
            "type": "object",
            "properties": { "query": { "type": "string" } },
            "required": ["query"]
        }
    }]);
    let mut messages = vec![json!({ "role": "user", "content": question })];
    loop {
        let response: Json = client
            .post("https://api.anthropic.com/v1/messages")
            .header("x-api-key", &key)
            .header("anthropic-version", "2023-06-01")
            .json(&json!({
                "model": "claude-opus-5",
                "max_tokens": 16000,
                "system": "Answer from the knowledge base. Cite your sources.",
                "tools": tools,
                "messages": messages,
            }))
            .send()?
            .json()?;
        let content = response["content"].as_array().cloned().unwrap_or_default();
        if response["stop_reason"] != "tool_use" {
            return Ok(content.iter().filter_map(|block| block["text"].as_str()).collect());
        }
        messages.push(json!({ "role": "assistant", "content": content }));
        let mut results = Vec::new();
        for block in content.iter().filter(|block| block["type"] == "tool_use") {
            let text = block["input"]["query"].as_str().unwrap_or_default();
            let rows = search_knowledgebase(db, text)?;
            results.push(json!({ "type": "tool_result", "tool_use_id": block["id"], "content": rows.to_string() }));
        }
        messages.push(json!({ "role": "user", "content": results }));
    }
}

fn main() -> Result<(), Error> {
    let db = Database::open("company.rdb")?;
    println!("{}", ask(&db, "What changed in the last production deploy?")?);
    Ok(())
}

Install

Pick your system. The one line install gets the right build for your machine and puts it on your PATH, and it doesn't need admin rights.

Inillucent for Windows

Version 2.8.1

Install with one line in PowerShell

irm https://inillucent.com/downloads/install.ps1 | iex

Or download a file

Inillucent for macOS

Version 2.8.1

Install with one line in Terminal

curl -fsSL https://inillucent.com/downloads/install.sh | sh

Or download a file

Inillucent for Linux

Version 2.8.1

Install with one line in Terminal

curl -fsSL https://inillucent.com/downloads/install.sh | sh

Or download a file

Or use your package manager

  • Homebrew
    brew install black-rainbow-labs/inillucent/inillucent
  • npm
    npm install -g inillucent
  • pip
    pip install inillucent
  • cargo
    cargo install inillucent-cli
  • Go
    go install github.com/Black-Rainbow-Labs/Inillucent/packages/go/cmd/inillucent-install@latest && inillucent-install
  • Composer
    composer require black-rainbow-labs/inillucent && vendor/bin/inillucent-install

Or have your agent do it

Paste this into Claude Code, Codex, Cursor or any agent that can fetch a page and run a command.

Download and install Inillucent on this machine. It is an embedded SQL database with vector and keyword search, in one file, with an MCP server.

1. Fetch https://inillucent.com/install.md and follow the steps for my operating system.
2. Confirm it worked by running `inillucent --version`.
3. Register the MCP server with this agent using the MCP section of that page.
4. Then tell me the version you installed, where the four programs are, and the command that creates my first database.