Wolbarg · v0.4.0 · Benchmarks

Measured like infrastructure.Dual-backend. Reproducible. No invented competitor timings.

Full SDK path on SQLite and PostgreSQL — startup, bulk insert, recall, embedding cache, write-time dedupe, subscribe delivery, and multi-writer concurrency. Storage suite uses mock embeddings so you see the database ceiling, not the API quota.

SQLite bulk insert @ 2k

7.51k/s

Historical · Wolbarg 0.4 mock stress suite

SQLite recall p95 @ 2k

4.83 ms

Historical · v0.4 storage suite · mock embeddings

SQLite 16 writers

8.66k/s

Historical · v0.4 same-process concurrency

Embedding cache

90% fewer calls

Historical · v0.4 repeated-ingest microbench

PG bulk insert @ 2k

4.08k/s

Historical · v0.4 local Postgres + pgvector

Fastest bulk insert

7.51k/s

SQLite remember path · 2,000 memories · mock embeds

Cache call reduction

90%

100 chunks · 20 unique · 2 passes (embedding-cache bench)

16-writer throughput

8.66k/s

SQLite same-process · p95 2.46 ms · 0 failures

Multi-process integrity

0% errors

Up to 20 OS processes writing one SQLite file (v0.4 locks)

Credibility · Two suites

Never confuse storage latency with provider latency

Transparency is the product. Wolbarg ships two benchmark suites on purpose.

Storage / v4 stress (mock)

Embeddings
Mock OpenAI-compatible embeddings
Measures
SDK + database performance (I/O, indexes, concurrency, cache, dedupe, subscribe)
Use for
Comparing SQLite vs PostgreSQL inside Wolbarg 0.4

Production / LIVE Benchmarks

Embeddings
Real embedding providers (OpenAI, etc.)
Measures
End-to-end latency including network + provider time
Use for
Estimating real app wait times — not storage ceiling

Numbers on this page are from the Storage Benchmarks suite (mock · v4-stress). The suite artifact recorded wolbarg@0.4.0; this release packages the same production-hardened path as wolbarg@0.4.0.

SQLite

Local-first memory that feels instantaneous

WAL, prepared statements, in-process vectors, FTS5 hybrid — the default for single-node agents.

Cold start

16.18 ms

Warm start

1.87 ms

Batch @ 200

5.80k/s

Bulk insert @ 2k

7.51k/s

Recall p50 @ 2k

4.12 ms

Recall p95 @ 2k

4.12 ms

8 writers

6.08k/s

16 writers

8.66k/s

32 writers

6.80k/s

Cache speedup

1.47×

Full SQLite table

BenchmarkDatasetResult
StartupCold ready()16.18 ms
StartupWarm reopen1.87 ms
rememberBatch2005,795 ops/sec
Bulk insert20007,509 ops/sec
Recallp50 @ 2k4.12 ms
Recallp95 @ 2k4.83 ms
Embedding cachespot speedup1.47×
Embedding cachecall reduction90%
Dedupe upsertexact matchaction=updated · active=1
Subscriberemember/update/forgetpass
Concurrency8 writers × 206,084 ops/sec · p95 3.05 ms
Concurrency16 writers × 208,660 ops/sec · p95 2.46 ms
Concurrency32 writers × 206,798 ops/sec · p95 22.94 ms
Mixed R/W stormstress0 failures
Multiprocess20 OS writers245 ops/sec · 0% errors · integrity OK
Concurrent exact-deduperace1 id · 11 updates

Production notes

  • Best default for local agents, CLI tools, and single-node apps.
  • WAL + BEGIN IMMEDIATE + busy retry is the 0.4 multi-writer default.
  • Same-process 16 writers hit 8.66k ops/s in this suite; multi-process p95 rises as the file serializes.
  • Use Postgres when you need cross-process subscribe() delivery.

Environment

Backend
SQLite + WAL
Platform
win32/arm64 · Node v24.13.1 · 8 CPUs
Embeddings
local-mock-openai-compatible · mock-embed

PostgreSQL

Multi-tenant memory that scales writers

pgvector HNSW, prepared statements, insert coalescing, adaptive overfetch — for shared agent fleets.

Cold start

91.39 ms

Warm start

59.89 ms

Batch @ 200

2.79k/s

Bulk insert @ 2k

4.08k/s

Recall p50 @ 2k

23.29 ms

Recall p95 @ 2k

23.29 ms

8 writers

2.56k/s

16 writers

3.33k/s

32 writers

3.80k/s

Cache speedup

1.18×

Full PostgreSQL table

BenchmarkDatasetResult
StartupCold ready()91.39 ms
StartupWarm reopen59.89 ms
rememberBatch2002,795 ops/sec
Bulk insert20004,085 ops/sec
Recallp50 @ 2k23.29 ms
Recallp95 @ 2k141.5 ms
Embedding cachespot speedup1.18×
Dedupe upsertexact matchaction=updated · active=1
Subscribe LISTEN/NOTIFYremember/update/forgetpass
Concurrency8 writers × 202,555 ops/sec · p95 8.51 ms
Concurrency16 writers × 203,335 ops/sec · p95 9.48 ms
Concurrency32 writers × 203,802 ops/sec · p95 14.77 ms
Mixed R/W stormstress0 failures
Concurrent exact-deduperace1 id · 11 updates

Production notes

  • Best default for multi-tenant SaaS and shared agent fleets.
  • Always benchmark against local Docker — remote Neon/Supabase RTTs hide Wolbarg cost.
  • Recall p95 in this suite is higher than SQLite because search leaves the process boundary.
  • LISTEN/NOTIFY powers realtime events across workers.

Environment

Backend
Postgres + pgvector
Host
local Postgres + pgvector
Platform
win32/arm64 · Node v24.13.1 · 8 CPUs

v0.4 features

New capabilities measured in this release

Embedding cache, dedupe, subscribe, and multi-process SQLite writers — not just raw insert/search.

Embedding cache

90% fewer provider calls

Repeated-ingest microbench · embedding-cache.json

Cache spot speedup

1.47× SQLite

Hot vs cold embed path in v4 stress

Exact dedupe race

1 unique id

11 concurrent updates converge correctly

subscribe()

remember → update → forget

In-process (SQLite) · LISTEN/NOTIFY (Postgres)

OS writersThroughputp50p95p99Errors
2123.1 ops/s0.77 ms3.17 ms9.66 ms0%
5221.2 ops/s0.78 ms6.09 ms43.94 ms0%
10246.3 ops/s0.81 ms15.48 ms52.66 ms0%
20245.2 ops/s0.79 ms77.77 ms319.74 ms0%

Multi-process SQLite writers sharing one file — see Concurrency docs.

Charts

SQLite vs PostgreSQL — same machine, same suite

Bar, line, radar, and horizontal comparisons from the published dual-backend run.

Startup latency

Cold/warm ready() — milliseconds, lower is better (v0.4 mock suite).

Insert throughput

rememberBatch(200) and bulk insert 2k — ops/sec from the v0.4 stress suite.

Recall latency @ 2k

p50 and p95 semantic recall after bulk insert of 2,000 memories.

Overall performance profile

Radar normalized within this dual-backend run (higher = better).

SQLite vs PostgreSQL

Horizontal head-to-head for the metrics that matter most in this suite.

Concurrency

Same-process parallel writers (8 / 16 / 32 × 20 ops) on one client — v0.4.

Recall percentiles @ 2k

p50 vs p95 semantic recall after the 2k bulk insert.

Recall head-to-head

Same recall percentile bars for SQLite vs PostgreSQL at 2k.

Embedding cache speedup

Hot vs cold embed path on repeated texts (spot measurement in v4 suite).

Insert stages

Batch 200 vs bulk 2k throughput (ops/sec).

Multi-process SQLite p95

Separate OS processes writing one SQLite file — p95 ms by writer count (Postgres N/A).

Cache spot speedup

Dimensionless speedup (×) from the embedding-cache spot case.

Competitors

Fair comparisons only

We only place a number in a competitor latency cell when the publisher measured the same class of workload (Wolbarg-style storage/SDK path with mock or fixed embeddings). Accuracy benchmarks that include LLM judges (LoCoMo, LongMemEval, BEAM) and raw ANN engine suites (Qdrant, Weaviate) are different experiments — we cite them in footnotes but never paste them into Startup / Insert / Search cells.

Capability matrix

✅ Supported · ⚠️ Partial · ❌ No · ❓ Unknown

FeatureWolbargMem0ZepLettaLangGraph MemoryLlamaIndexMastraChromaQdrantWeaviate
Local-first / offline⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️
Native SQLite⚠️⚠️⚠️⚠️⚠️⚠️
Native PostgreSQL⚠️⚠️⚠️⚠️⚠️
Framework-agnostic SDK⚠️⚠️
Model / provider agnostic
Semantic recall⚠️⚠️
Hybrid keyword + vector⚠️⚠️
Metadata filters⚠️⚠️⚠️⚠️
Memory compression⚠️⚠️⚠️
Write-time dedupe / upsert⚠️⚠️⚠️⚠️⚠️⚠️
Real-time change events⚠️⚠️⚠️⚠️
Embedding cache⚠️
Multi-writer concurrency hardening⚠️⚠️
Multi-tenant org scoping⚠️⚠️⚠️
First-party telemetry⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️
Checkpoints / rollback⚠️⚠️
Batch remember / recall⚠️⚠️⚠️⚠️⚠️⚠️⚠️
Document ingest pipeline⚠️⚠️⚠️⚠️⚠️⚠️⚠️
Open source⚠️
Public reproducible storage benchmarks⚠️

Storage-path latency (apples-to-apples only)

FrameworkStartupInsertSearchRetrievalHybridConcurrencyStorageOpen SourceProductionLicenseArchitecture
Wolbarg16.18 ms cold (SQLite · historical v0.4)7.51k ops/s bulk 2k (SQLite · historical v0.4)4.83 ms p95 @ 2k (SQLite · historical v0.4)4.12 ms p50 @ 2k (SQLite · historical v0.4)Covered in v4 edge suite (historical v0.4)8.66k ops/s · 16 writers (SQLite · historical v0.4)SQLite / PostgreSQLYes (MIT)PartialMITMemory SDK
Mem0Not publicly benchmarkedNot publicly benchmarkedNot publicly benchmarkedNot publicly benchmarked*Not publicly benchmarkedNot publicly benchmarkedPluggableYes (Apache-2.0)YesApache-2.0Memory platform
ZepNot publicly benchmarkedNot publicly benchmarkedNot publicly benchmarkedNot publicly benchmarked*Not publicly benchmarkedNot publicly benchmarkedGraph + vectorsPartialYesMixedTemporal graph memory
LettaNot publicly benchmarkedNot publicly benchmarkedNot publicly benchmarkedNot publicly benchmarkedNot publicly benchmarkedNot publicly benchmarkedAgent tiersYesYesApache-2.0Agent runtime
LangGraph MemoryNot publicly benchmarkedNot publicly benchmarkedNot publicly benchmarkedNot publicly benchmarkedNot publicly benchmarkedNot publicly benchmarkedPluggableYesYesMITAgent framework memory
LlamaIndexNot publicly benchmarkedNot publicly benchmarkedNot publicly benchmarkedNot publicly benchmarkedNot publicly benchmarkedNot publicly benchmarkedPluggableYesYesMITRAG framework
MastraNot publicly benchmarkedNot publicly benchmarkedNot publicly benchmarkedNot publicly benchmarkedNot publicly benchmarkedNot publicly benchmarkedFramework storesYesPartialApache-2.0TS agent framework
ChromaNot publicly benchmarkedNot publicly benchmarkedNot publicly benchmarked*Not publicly benchmarkedNot publicly benchmarkedNot publicly benchmarkedEmbedding DBYesYesApache-2.0Vector database
QdrantNot publicly benchmarkedNot publicly benchmarkedNot publicly benchmarked*Not publicly benchmarkedNot publicly benchmarkedNot publicly benchmarkedVector DBYesYesApache-2.0Vector search engine
WeaviateNot publicly benchmarkedNot publicly benchmarkedNot publicly benchmarked*Not publicly benchmarkedNot publicly benchmarkedNot publicly benchmarkedVector DBYesYesBSD-3-ClauseVector database
SupermemoryNot publicly benchmarkedNot publicly benchmarkedNot publicly benchmarkedNot publicly benchmarked*Not publicly benchmarkedNot publicly benchmarkedHosted memory APIPartialYesProprietary / mixedHosted memory
CrewAI MemoryNot publicly benchmarkedNot publicly benchmarkedNot publicly benchmarkedNot publicly benchmarkedNot publicly benchmarkedNot publicly benchmarkedFramework-integratedPartialPartialMixedMulti-agent framework
AutoGenNot publicly benchmarkedNot publicly benchmarkedNot publicly benchmarkedNot publicly benchmarkedNot publicly benchmarkedNot publicly benchmarkedFramework-dependentYesPartialMITMulti-agent framework

* Cells marked “Not publicly benchmarked*” may have related numbers for a different workload (accuracy evals or ANN engines). Sources below — never treated as Wolbarg storage latency.

Why

Why Wolbarg performs well

Numbers without mechanism are marketing. Here is the mechanism — kept simple.

SQLite

WAL mode

Readers never block writers. Crash recovery stays safe under concurrent agent loads.

BEGIN IMMEDIATE (0.4)

Mutating transactions take the write lock up front, then retry with backoff on SQLITE_BUSY.

In-process vector index

sqlite-vec + blob index keep ANN inside the same process — no network hop.

Embedding cache (0.4)

hash(content)+model reuse skips provider calls on repeated text — 90% fewer calls in the published microbench.

FTS5 hybrid

Keyword BM25 lives beside vectors; archived rows are dropped from FTS on archive.

Single-file ops

Backup, copy, and ship memory like any other SQLite database.

PostgreSQL

pgvector + HNSW

Approximate nearest neighbor with HNSW built lazily before the first KNN query.

LISTEN / NOTIFY (0.4)

Cross-process subscribe() delivery for multi-host agents sharing one database.

Insert coalescing

Concurrent remember() calls collapse into unnest batches; large ingest uses COPY.

Adaptive overfetch

Filtered ANN overfetches just enough to preserve recall after org / metadata filters.

Multi-tenant correctness

Organization scoping is enforced on ANN paths so shared clusters do not leak memories.

Writer scaling

Throughput keeps climbing from 8→32 writers in the v0.4 stress suite on the same machine.

Methodology

What we measured — and what we did not

What

ready(), rememberBatch, bulk insert 2k, recall p50/p95, embedding cache, dedupe, subscribe, concurrency 8/16/32, multi-process SQLite writers.

Why mock

Live API quotas fail before storage contention. Mock OpenAI-compatible embeddings isolate SDK + DB cost.

How

Fixed v4-stress workloads, controlled writer counts, published JSON/MD artifacts for SQLite and Postgres.

Limitations

  • Primary published run is v4-stress (batch 200, bulk 2k, concurrency 8/16/32). Legacy quick-scale 100/1k charts are superseded.
  • Mock embeddings isolate storage. Real OpenAI/Ollama latency dominates end-to-end recall in LIVE mode.
  • Postgres numbers are local — not managed cloud round-trips.
  • Multi-process suite is SQLite-only (separate OS processes, one file).
  • Competitor storage latencies are not published apples-to-apples — we refuse to invent them.

Hardware · published run

Date
2026-07-18T17:33:03.832Z
SDK
wolbarg@0.4.0
Suite
mock · v4-stress
Platform
win32/arm64 · Node v24.13.1 · 8 CPUs
Postgres
local Postgres + pgvector
Wall clock
1.2s · 25 rows
Are these storage benchmarks or end-to-end agent latency?
Primary numbers are Storage / v4 stress benchmarks: mock embeddings isolating the SDK + database. A separate LIVE suite measures real provider latency. Never mix the two.
Why don’t competitor latency cells have numbers?
We only fill a cell when a publisher measured the same workload class. Mem0/Zep publish accuracy (LoCoMo/LongMemEval); Qdrant/Weaviate publish ANN engine suites. Those are different experiments — we cite them instead of inventing Wolbarg-style ops/sec.
What changed in the v0.4 suite?
New coverage for embedding cache, write-time dedupe, subscribe() delivery, BEGIN IMMEDIATE concurrency, bulk 2k insert, and multi-process SQLite writers — plus dual-backend stress at 8/16/32 writers.
Why is mock mode the default?
API rate limits fail long before SQLite/Postgres contention. Mock embeddings reveal the real storage ceiling. Use LIVE spots for provider-inclusive latency.
Same-process vs multi-process concurrency?
Same-process numbers measure Node async writers on one client. Multi-process numbers measure separate OS processes sharing one SQLite file (BEGIN IMMEDIATE + retry). Compare them separately.

Downloads & reproduce

Raw reports and the suite you can run

Beautiful markdown and machine-readable JSON from the same run that powers these charts.

git clone https://github.com/wolbarg/wolbarg-benchmarks.git
cd wolbarg-benchmarks
npm install
npx tsx v4-stress.ts
npx tsx embedding-cache-bench.ts
npx tsx multiprocess-levels.ts