v1.0.2 published · hosted validation passed · seven artifact families verified · Apache 2.0

The NoSQL database that
lives inside your JVM.

EmbedJNoSQL is a document and key-value database — plus Redis-style structures, wide-column families, and experimental vector search — in a single pure-Java JAR. No Docker. No daemon. No infrastructure.

Try live playground Admin console UI GitHub
3.1 MB Shaded JAR size
Zero External dependencies
1,172 Verified tests
Java 17+ Runtime requirement
Application.java
// One line. Zero infrastructure.
try (var db = EmbedJNoSQL.inMemory()) {

    // ── Documents with nested field queries ─────────────────────
    db.documentCollection("users")
      .insert(Document.of("name", "Alice").add("city", "Nairobi"));

    List<Document> users = db.documentCollection("users")
      .find(Query.eq("city", "Nairobi").and(Query.gte("age", 18)));

    // ── Redis-style structures ───────────────────────────────────
    db.listBucket("job-queue").rpush("tasks", "send-email", "resize-image");
    db.hashBucket("profiles").hset("u1", "tier", "GOLD");

    // ── Key-Value with TTL ───────────────────────────────────────
    db.keyValueBucket("sessions").put("tok-abc", "user-1");
    db.keyValueBucket("sessions").expire("tok-abc", Duration.ofMinutes(30));
}

One engine, four data models

EmbedJNoSQL has exactly one execution engine. Documents, Key-Value, Redis-style structures, and Wide-Column families are data models on top of the same storage substrate — no second engine to configure.

DocumentQuery.java
// Fluent document query — dotted paths, multi-operator
List<Document> orders = db
  .documentCollection("orders")
  .find(Query.eq("customer.tier", "GOLD")
    .and(Query.gte("total", 150.0))
    .sortBy("createdAt", Query.SortOrder.DESC)
    .limit(10));

// Entity-mapped fluent query
List<Product> cheap = db
  .from(Product.class)
  .where("category = ? AND price <= ?", "Peripherals", 100.0)
  .orderBy("price ASC")
  .limit(20)
  .list();
KVAndStructures.java
// Key-value with per-key TTL
db.keyValueBucket("sessions").put("tok-abc", "user-1");
db.keyValueBucket("sessions").expire("tok-abc", Duration.ofMinutes(30));

// Lists (queues)
db.listBucket("job-queue").rpush("tasks", "send-email", "resize-img");
String next = db.listBucket("job-queue").lpop("tasks");

// Sets (memberships)
db.setBucket("permissions").sadd("admin", "write", "delete", "export");
boolean can = db.setBucket("permissions").sismember("admin", "delete");

// Hashes (entity fields)
db.hashBucket("profiles").hset("u1", "tier", "GOLD");
StorageModes.java
// In-memory — tests, ephemeral state, microservices
EmbedJNoSQL db = EmbedJNoSQL.inMemory();

// File + WAL — simple local persistence (one-liner)
EmbedJNoSQL db = EmbedJNoSQL.open("./data/myapp");

// Temporary file DB — auto-cleanup on JVM exit
EmbedJNoSQL db = EmbedJNoSQL.openTemp();

// Advanced: B-Tree or LSM-Tree engine
EmbedJNoSQL db = EmbedJNoSQL.create(EmbedJNoSQL.embed()
  .storageEngine(StorageEngineType.LSM_TREE)
  .persistTo("data/myapp")
  .autoFlush(true)
  .buildConfig());
Transactions.java
// MVCC transactions — atomic across collections
try (var tx = db.beginTransaction()) {

    tx.documentCollection("accounts")
      .update("acc-1", "balance", 4750.0);
    tx.documentCollection("accounts")
      .update("acc-2", "balance", 5250.0);

    tx.commit(); // both commit, or both roll back
}

// WAL-backed persistence — open the same path after a crash
try (var db = EmbedJNoSQL.open("./data")) {
    // WAL replayed automatically — all prior commits recovered
}
Model What it gives you Best for
DocumentSchemaless JSON with predicates, sorting, paging, TTL, runtime indexes, and dotted-path nested queries.Flexible schemas, entity mapping, application state
Key-ValueString buckets with per-key TTL. Same handle as every other model.Caches, session tokens
Redis-styleLists, sets, hashes — queues, counters, and coordination primitives in-process.Queues, counters, coordination
Wide-ColumnColumn families on the shared substrate, same API as every other model.Sparse records, high-cardinality rows

Try EmbedJNoSQL in your browser

Experience embedded multi-model queries in action. Choose a preset or edit the query below, then execute against the simulated JVM in-memory engine.

QuerySnippet.java

          
Engine: IN_MEMORY
HTTP 200 OK ⏱ 0.08 ms
2 records

      

Embedded Admin UI in your JAR

Zero external servers. A rich, responsive developer console embedded directly into your application process. Inspect collections, execute queries, view WAL telemetry, and monitor health at http://localhost:8080/console.

🔒 http://localhost:8080/console
● Connected
Total Documents
42,890
Active Storage Mode
FILE + WAL
Throughput (Ops/sec)
184,200
WAL Fsync Latency
0.14 ms
Live Operations Activity 100% Health
Collection: orders (14,200 documents)
Mode: JSON / Tree
{
  "id": "ord-98241",
  "customer": {
    "name": "Alice Walker",
    "tier": "GOLD"
  },
  "items": [
    { "sku": "KB-RGB-01", "qty": 1, "price": 89.99 },
    { "sku": "MS-PRO-02", "qty": 1, "price": 65.00 }
  ],
  "total": 154.99,
  "status": "CONFIRMED"
}
Bucket / Key Type Value TTL
sessions:tok-9841 STRING "usr_7701" 28m 14s
job-queue:tasks LIST ["send-email", "generate-pdf"] persisted
profiles:u1 HASH {tier: "GOLD", locale: "en_US"} persisted
Active WAL Log File
./data/wal/segment-0042.log
Committed entries: 14,819
Fsync mode: Per-commit atomic
Crash Recovery Guarantee
✓ Deterministic WAL Replay Ready
Upon JVM restart, EmbedJNoSQL inspects the log segment and restores all committed transactions automatically.

Four storage modes, one unified API

Switch between ephemeral in-memory tests and durable production storage with a single configuration parameter. The query and collection API remains 100% identical.

IN_MEMORY
Pure Memory
Backed by ConcurrentHashMap. Zero disk I/O, microsecond latencies. Ideal for lightning-fast test suites and ephemeral microservice state.
Throughput:~3.2M ops/s
Durability:Ephemeral
Disk footprint:0 MB
FILE (WAL)
Append-Only WAL
Per-collection JSON snapshots with append-only Write-Ahead Logging. Guaranteed crash recovery upon restart with zero external processes.
Throughput:~240K ops/s
Durability:Full Crash WAL
Recovery:Automatic
B_TREE
B+ Tree Indexed
Paged B+ Tree indices over persistent records with background checkpointing. Optimized for read-intensive embedded applications and edge nodes.
Throughput:~480K ops/s
Read latency:< 0.2 ms
Workload:Read-heavy
LSM_TREE
Log-Structured Merge
In-memory Memtables, persistent SSTables, Bloom filters, and background compaction. Engineered for write-heavy telemetry and continuous ingestion.
Throughput:~720K ops/s
Compaction:Level-based
Workload:Write-heavy

Works with your stack

Auto-configuration, health indicators, and Repository support — drop one dependency, get a fully wired database bean. Existing entities annotated with Jakarta Persistence or Hibernate annotations are read as mapping hints: no JPA runtime, no JDBC driver, no rewrite.

No framework at all? One line of code is all it takes. Vert.x, Javalin, Helidon, Dropwizard — any JVM runtime works out of the box. See integration patterns ↓

EmbedJNoSQL was engineered with a zero-daemon, in-process architecture. That gives it a distinct advantage across modern Java web frameworks:

Framework Integration Style Maturity in EmbedJNoSQL Code Pattern
Spring Boot 4 / 3.4+ @AutoConfiguration, Spring Data Repositories, @Transactional First-Class Starter (embed-jnosql-spring-boot-starter) @Autowired EmbedJNoSQL db;
Quarkus 3.x CDI Extension (@ApplicationScoped), DevServices Dedicated Extension (quarkus-extension/) @Inject EmbedJNoSQL db;
Micronaut 4.x Compile-Time DI (@Factory, @Singleton) Dedicated Integration (micronaut-integration/) @Inject EmbedJNoSQL db;
Eclipse Vert.x 4.x Non-blocking / Worker dispatch (executeBlocking) Validated Pattern (demo/vertx-demo/) vertx.executeBlocking(...)
Javalin / Ktor / Helidon Lightweight programmatic injection Native (Zero Glue Code) EmbedJNoSQL.inMemory()
Spring Boot 4.x / 3.4+
Auto-configured @Autowired EmbedJNoSQL db bean, health indicator, property binding via embedjnosql.*, and full EmbedRepository support.
Eclipse JNoSQL
Native DocumentTemplate, Jakarta NoSQL entities, and EmbedNoSQLRepository with CrudRepository semantics.
Quarkus
Quarkus extension with CDI injection, Quarkus-style configuration, and native build compatibility.
Micronaut
Micronaut integration with bean factory configuration and Micronaut Data–compatible repository pattern.
Eclipse Vert.x 4.x
No starter needed — use embed-jnosql-core directly. Dispatch blocking DB calls via vertx.executeBlocking() or deploy a Worker Verticle to protect the event loop. ACID transactions work inside executeBlocking closures.
Javalin / Helidon / Dropwizard
Three-step pattern for any JVM framework: open once at startup, share the instance across threads, close on shutdown. See examples ↓
Plain Java
Zero-config. One class: EmbedJNoSQL.inMemory(). No framework required. Works in any JVM application.

Framework integration patterns

EmbedJNoSQL is a plain Java library — no bytecode agent, no annotation processor, no CDI container needed. Every framework integration follows the same lifecycle contract.

EmbedJNoSQL is synchronous and in-process. The single rule for Vert.x: never call it directly from the event loop. Wrap with executeBlocking() in route handlers, or deploy as a Worker Verticle for batch/event-bus workloads.

Pattern 1 — executeBlocking (route handlers)
public class ProductVerticle extends AbstractVerticle {
    private EmbedJNoSQL db;
    private DocumentCollection products;

    @Override
    public void start(Promise<Void> startPromise) {
        // ✅ Safe — called once at startup, not on the hot event loop
        db = EmbedJNoSQL.create(EmbedJNoSQLConfig.builder()
            .storageEngine(IN_MEMORY).buildConfig());
        products = db.documentCollection("products");

        Router router = Router.router(vertx);
        router.get("/api/products").handler(this::getAll);
        vertx.createHttpServer().requestHandler(router).listen(8080)
            .onSuccess(s -> startPromise.complete());
    }

    private void getAll(RoutingContext ctx) {
        // ⚠️  executeBlocking keeps the event loop free
        vertx.<List<Product>>executeBlocking(() ->
            products.findAll().stream().map(Product::fromDocument).toList()
        ).onSuccess(list -> ctx.response()
            .putHeader("content-type", "application/json")
            .end(Json.encode(list)))
         .onFailure(ctx::fail);
    }
}
Pattern 2 — Worker Verticle (event-bus / batch)
public class DbWorkerVerticle extends AbstractVerticle {
    private EmbedJNoSQL db;

    @Override
    public void start() {
        db = EmbedJNoSQL.open("./data/myapp");
        vertx.eventBus().<JsonObject>consumer("db.products.upsert", msg -> {
            try {
                Product p = msg.body().mapTo(Product.class);
                db.documentCollection("products").insert(p.toDocument());
                msg.reply(new JsonObject().put("status", "ok"));
            } catch (Exception e) { msg.fail(500, e.getMessage()); }
        });
    }
    @Override
    public void stop() { if (db != null) db.close(); }
}

// Deploy as a worker (thread-pool isolated)
vertx.deployVerticle(new DbWorkerVerticle(),
    new DeploymentOptions().setWorker(true));
🔷 Vert.x Rule EmbedJNoSQL is synchronous. Always wrap calls in executeBlocking() inside route handlers, or use a Worker Verticle for event-bus consumers.

The empty quadrant

For two decades, Java developers had two choices: embed H2 or SQLite (relational only), or spin up heavy external containers (MongoDB, Redis, Cassandra).

EmbedJNoSQL fills the missing quadrant: pure embedded, zero-infrastructure convenience with modern multi-model NoSQL flexibility.

✓ Zero Docker in tests ✓ No Testcontainers ✓ In-process latency ✓ WAL crash recovery
Embedded · Relational
H2 / SQLite / Derby
Great for SQL relational tests, but rigid schema migrations and no native JSON/Key-Value.
Relational only
Embedded · Multi-Model
EmbedJNoSQL ✦
Documents, Key-Value, Redis-style structures, and Wide-Column in one embedded engine. No SQL, no server.
You are here
Client/Server · Relational
PostgreSQL / MySQL
Full enterprise RDBMS — requires Docker or cloud servers for every environment.
Daemon required
Client/Server · NoSQL
MongoDB / Redis / Cassandra
Fast, but requires Testcontainers, open ports, and memory overhead in CI.
Docker required

Principles, not features

EmbedJNoSQL is opinionated about what it refuses to be. Every decision follows from the same constraint: it must run inside your JVM with nothing else running.

🚫
No Infrastructure Tax
No Docker socket, no network port, no daemon, no OS service. The database starts when your JVM starts and stops when your JVM stops.
🔍
Honest Claims Only
Every feature claim has a verified test behind it. Known limitations — power-loss durability, vector search experimental status — are stated plainly, not buried.
☕
Pure JVM
Three mandatory runtime dependencies: Jackson, SLF4J API. Everything else — Spring, Quarkus, Hibernate — is optional scope. No native libraries, no JNI.
🎯
NoSQL Only
No SQL engine, no JDBC driver, no dual-engine selector. The product is one thing: an embedded multi-model NoSQL database. Stated clearly in every release note.
🧪
Test-First Reliability
1,172 tests passed across the core engine, first-party modules, and demo projects. Maven Central publication and signature verification are in progress.
🔒
Secure by Default
The console HTTP server is opt-in. Authentication, session management, and rate limiting are built in. No console starts unless you explicitly enable it.

Ready in under 60 seconds

Clone, install, then add a single dependency to your build file.

Maven Central Distribution: All seven v1.0.2 artifacts and their required signatures are published and verified. Hosted validation gates passed. See the release notes. Demo applications are validation consumers, not release artifacts.
<dependency>
    <groupId>io.github.kael-tombo</groupId>
    <artifactId>embed-jnosql-core</artifactId>
    <version>1.0.2</version>
</dependency>
implementation('io.github.kael-tombo:embed-jnosql-core:1.0.2')
<dependency>
    <groupId>io.github.kael-tombo</groupId>
    <artifactId>embed-jnosql-spring-boot-starter</artifactId>
    <version>1.0.2</version>
</dependency>
// Eclipse JNoSQL / Jakarta NoSQL DocumentTemplate
EmbedJNoSQL db = EmbedJNoSQL.inMemory();
DocumentTemplate template = new EclipseDocumentTemplate(db);

// Persist Jakarta NoSQL entities directly
User saved = template.insert(new User("u1", "Alice"));
Optional<User> found = template.find(User.class, "u1");
<dependency>
    <groupId>io.github.kael-tombo</groupId>
    <artifactId>embed-jnosql-quarkus-extension-runtime</artifactId>
    <version>1.0.2</version>
</dependency>
<dependency>
    <groupId>io.github.kael-tombo</groupId>
    <artifactId>embedjnosql-micronaut-integration</artifactId>
    <version>1.0.2</version>
</dependency>

20 runnable demos, one feature each

Every demo is a standalone Maven project with a runnable main class and a JUnit suite — clone the repo, run mvn test, and the feature is proven against a live engine.

01
Document CRUD
Insert, findById, update, deleteById round-trip
Documents
02
Native Query Predicates
$eq $ne $gt $in $regex $exists $and $or, between, sort, paging
Documents
03
Nested Field Queries
Dotted-path queries (address.city, tags.0) across all operators
Documents
04
Secondary Indexes
createIndex, index-backed point lookups, dropIndex
Documents
05
TTL Expiry
Document, KV-bucket and column TTL; expired reads as absent
Core
06
Key-Value Buckets
put/get, TTL, atomic counters, atomic batch put/get
Core
07
Redis-Style Lists
FIFO queues, stacks, RPOPLPUSH hand-off, negative indexing
Redis-like
08
Redis-Style Sets
SADD/SREM/SMEMBERS/SMOVE/SCARD, random sampling
Redis-like
09
Redis-Style Hashes
HSET/HGET/HGETALL/HDEL, field-level semantics
Redis-like
10
Wide-Column Families
Sparse rows, column-slice pagination, prefix scans, column TTL
Core
11
MVCC Transactions
Staged writes, read-your-own-writes, commit vs rollback
Core
12
Aggregation Pipeline
group/count/sum/avg/min/max over the JVM via streams
Documents
13
SQL-to-NoSQL Migration
Denormalizing join tables into document aggregates; nested queries replace JOINs
Documents
14
Event Bus
BEFORE/AFTER insert-update-delete lifecycle listeners
Core
15
Metrics
Operation counters, snapshot(), reset()
Core
16
Backup & Restore
gzip JSON snapshot of every collection, restore into a fresh database
Core
17
CDC Change Feed
Typed CDC events (INSERT/UPDATE/DELETE), event log, listeners
Core
18
Text Search
Scored term search + Levenshtein fuzzy matching
Search
19
Vector Search
HNSW k-NN over float vectors, add/remove/search (experimental)
Search
20
Durability & Recovery
B_TREE persistence + WAL recovery across a restart, index survival
Core
Framework demos too: Spring Boot, Quarkus, Micronaut, Vert.x — browse demo/ on GitHub →

Write code. Not infrastructure.

EmbedJNoSQL embeds everything. You focus purely on your domain logic — documents, keys, and data structures available in one line of Java.

Star on GitHub Quick start → Changelog

🛑 Where EmbedJNoSQL stops

This is a NoSQL database: no SQL engine, no JDBC driver, no relational schema. Documents are schemaless unless you register validation rules. A stored reference is an id you resolve yourself — never an enforced foreign key. Vector search and Kafka CDC are experimental. We say so plainly, in the README and in every release note.