On this page
Updated 2026-10-19
Loams has no open core: everything is Apache-2.0, and Ostrium Labs offers services around it (D1119).
Updated 2026-10-18 for Loams 0.1.0
Changed: statuses follow the Loams 0.1.0 table; Postgres (our Neon fork, D231, D820) and Loams SQL (TiDB on TiKV, D721) now ship; Graph ships and the House is experimental; durable state in clusters moved from TiDB to TiKV (D261); the binary is loams; added Learn and Opinions links.
A production AI application usually runs a small zoo of stateful systems. Each has its own cluster, replicas, upgrade cadence, security model and on-call rotation:
| What the app needs | What teams usually run | What it holds |
|---|---|---|
| Event ingest, agent traces, change data | Kafka | Raw events |
| Keyword and hybrid search | Elasticsearch | Copy 2 of the documents |
| Semantic retrieval | Qdrant, Pinecone | Copy 3: embeddings and payloads |
| Knowledge graph, GraphRAG, agent memory | Neo4j | Copy 4: entities and relations |
| Product analytics, evals, cost dashboards | ClickHouse | Copy 5 |
| Agent runs that retry, wait and resume | Temporal, or a queue plus cron plus Postgres | Workflow state, in yet another database |
| The application's own data | Postgres, Firebase, Convex | Users, sessions, settings |
Three problems follow from that table. The same entity lives in four stores glued together by connectors, so when they drift, an agent retrieves stale or contradictory context. The retrieval glue lives in application code: one "hybrid GraphRAG" lookup is BM25 in one service, nearest neighbours in another, a graph hop in a third and a fusion step in Python, and nothing can plan it as a whole. And each store replicates two or three times on block storage and runs around the clock, sized for its peak.
Loams is our answer: one platform for the data side of an AI application, built on object storage and open formats, with compute that holds nothing it cannot rebuild. This post is the first in a series that walks through each part. It says what the platform is, why object storage is the foundation, where we deliberately step off it, and exactly what exists today.
What Loams is
Loams started as a retrieval engine and grew into what we call an AI-native cloud. Its core brings retrieval, reactive state and durable execution together; around it, Loams 0.1.0 ships graphs, MySQL and Postgres, experimental ClickHouse-compatible analytics, SDKs, a console, a desktop app and a CLI. The complete tenancy layer (roles, quotas, a namespace router) is still planned. The Learn overview maps the pieces.
Stateless roles: gateway, log, query, worker. Any node can be killed.
- The retrieval engine. Collections of documents with dense and sparse vectors, full text and filters, searched with one planned hybrid query. It speaks the Qdrant API, a subset of the Elasticsearch API, Arrow Flight SQL and its own REST API. Every write lands in a log on object storage first. Part 2 covers it.
- Loams Live, a reactive application database in the style of Convex, on TiKV: documents, indexes, transactions, queries that stay live and push new results, and a change feed into search. Available in 0.1.0. Part 3.
- Durable execution (Loams Durable, available). The Resonate server, linked into the Loams binary, so the official Resonate SDKs get durable promises, retries, sleeps, schedules and human-in-the-loop gates from the same system that holds the agent's memory. Part 4.
- Functions billed on CPU time, still planned after 0.1.0: agent and backend functions that run next to the data and cost nothing while they wait on a model. Part 5.
- Jobs, still planned after 0.1.0: Celery, BullMQ, PySpark and Flink SQL workloads on Loams with a configuration change, behind one Rust API. Part 6.
- Postgres and MySQL, a proposal when this was written and available in 0.1.0: Loams Postgres (our hard fork of Neon,
loams-postgres) and Loams SQL (MySQL-compatible, on a patched TiDB over TiKV) run beside the engine on the same storage. A branch per agent workspace is still to come. Part 7. - Self-hosting with GitOps, still planned (0.1.0 self-hosts with Docker Compose over your own tailnet), and how the line between open source and the managed cloud went away. Part 8.
Why object storage
The retrieval engine's first design rule is that object storage is the only durable source of truth, and compute is stateless. We wrote about the cost side in Why a retrieval engine should live on object storage. The short version:
- Cost. Replicated block storage costs roughly $0.16 to $0.24 per effective GB-month (EBS gp3 at about $0.08, times two or three replicas). S3 Standard is about $0.023, with durability handled by the provider.
- Idle data is the common case. AI applications create an index per user, per workspace, per repository or per agent. Most are idle most of the time. In Loams, a cold namespace is a set of immutable objects. It costs its storage and nothing else until someone queries it.
- Open formats. Documents and vectors are a Lance dataset, full text is Tantivy split files, and analytics tables will be Apache Iceberg (planned; see open formats). Other engines can read them without Loams. If you leave, your data is still readable where it sits.
- Nodes you can lose. Each node holds caches and derived structures only. Killing one loses cache warmth, not data. Scaling is adding or removing stateless processes.
What made this practical is recent. S3 added conditional writes (If-None-Match and If-Match on PUT) in 2024, and GCS and Azure have equivalents, so a single object can be a compare-and-swap commit point. The Rust data stack (DataFusion, Arrow, Lance, Tantivy, object_store, foyer) matured enough to build a serving layer on. And the architecture is proven in production by closed products: turbopuffer for search, WarpStream for streams, ClickHouse Cloud and StarRocks for analytics. Loams applies this approach to vector, sparse and full-text retrieval in one engine, with graph expansion in the retrieval plan experimental in 0.1.0.
The price you pay
Object storage is slow to write to compared with a local disk. A write in Loams is acknowledged only after it is durable in the bucket: one PUT of a batched WAL object plus one metastore commit. That is tens of milliseconds, not microseconds. In exchange, an acknowledged write survives the loss of any node, and a query can read it immediately: every write returns a consistency token, and a read that carries it merges the not-yet-indexed tail of the log, so read-your-writes never waits for indexing.
Reads from a cold bucket pay object-storage round trips too. The hot tier (RAM and NVMe caches, and prebuilt HNSW graphs for hot collections) exists to make the warm path fast. Correctness never depends on it: results are identical with the hot tier on or off, and the test suite checks that.
Where Loams steps off the bucket
Not everything belongs on object storage, and we would rather say so than hide it.
- Metadata. Offsets, leases and manifest pointers change hundreds of times a second. S3 conditional PUTs cannot sustain that, so metadata lives in a metastore: embedded Raft (openraft with a redb log) by default, or TiKV in clusters. Manifest bodies stay immutable objects in the bucket; only pointers live in the metastore.
- Application data in Loams Live. An application database needs millisecond transactions over mutable rows. That is what TiKV does, with Raft replication on local disks. So Live's source of truth is TiKV, not the bucket. The Live role itself is stateless, and the design makes continuous log backup of every Live keyspace to object storage mandatory before a cluster serves traffic. When this was written that backup was designed, not built; 0.1.0's
loams upgradesnapshots TiKV (with BR or a cold copy) before every upgrade, and continuous log backup is still to come. - Durable execution and jobs state. Workflow promises and job leases are small, hot, transactional records. They live in SQLite on a single node, and in TiKV in clusters (D261 replaced the earlier TiDB path; the TiKV durable store is in progress in 0.1.0). Large payloads and results go to the bucket.
The rule we hold: the retrieval engine keeps the bucket as its only source of truth, and anything that needs OLTP transactions runs on TiKV beside it, never inside it (D130). A distributed KV is all you need argues for that split.
One tenancy model, one binary
Everything is organised by namespace. Quotas, encryption keys, cache affinity, routing and usage are per namespace (namespaces and tenancy). A namespace can hold collections and streams, one Live app and its durable workflows. The loams dev command runs every role in one process on a laptop; a cluster runs the same binary with roles split across pools.
The platform is open source under Apache-2.0. Its dependencies are held to the same bar: no AGPL, BSL, SSPL or ELv2 code is linked into the engine. Services with other licenses are only ever run unmodified as separate processes, and we say so where it matters. Since 2026-10-19 nothing is held back: there is no open core, and metering, billing and the hosted control plane are moving into the open repo now (D1119). Ostrium Labs sells services, not a paid edition.
Where this stands
Loams is being built in the open, and much of this series describes design work. Every post ends with a table like this one. Available describes implemented scope with source and test evidence. In progress identifies unfinished component or integration work. Planned means designed or proposed, with no code yet.
| Part | Status | What exists in 0.1.0 |
|---|---|---|
| Log, metastore, workers, links, crash gates | Available | WAL on object storage, openraft or TiKV metastore, exactly-once links, kill -9 tests at every commit step |
| Collections and hybrid search | Available | Lance and Tantivy under one manifest, vector, BM25 and sparse retrieval, fusion, the tail merge |
| Hot tier and cluster mode | Available | RAM and NVMe cache, HNSW artifacts, rendezvous placement, write backpressure |
| Qdrant API, Elasticsearch subset, Flight SQL | Available | Qdrant REST and gRPC, the Elasticsearch document and search APIs, Flight SQL with bulk ingest |
| Streams | Available | Native produce and fetch, idempotent produce and streaming subscribe over gRPC |
| SDKs | Available | TypeScript, Python, Go, Rust, C#, C++ and Swift, published as 0.1.0 |
| Engine auth | Available | Tailscale identity, OIDC, hashed API keys or loopback-only |
| Loams Live | Available | Transactions, indexes, live queries, deploys and many apps per engine, on TiKV |
| Loams Durable | Available | Embedded Resonate on SQLite; the TiKV durable store is in progress |
| Loams Graph | Available | GQL on Grafeo with writes on the Loams log; graph expansion for GraphRAG is experimental |
| Loams SQL and Loams Postgres | Available | MySQL on a patched TiDB over TiKV; Postgres on our Neon fork with storage on the bucket |
| Loams House, Loams Git, Studio | Experimental | ClickHouse-compatible analytics on chDB; git push and fetch to a bucket; coding agents in the console |
| Console, desktop and CLI | Available | Hosted console, Loams Desktop (Electron) and the loams CLI for Linux, macOS and Windows |
| First-party connectors | In progress | Not in the release images |
| Iceberg, Kafka wire, OTLP, roles and tenancy, MCP | Planned | Designs |
| Functions, Jobs and GitOps self-hosting | Planned | Designs; 0.1.0 self-hosts with Docker Compose |
Statuses refreshed on 2026-10-18 for Loams 0.1.0; the full table is in Running Loams 0.1.0. Platform capabilities and the roadmap explain the scope behind each status. The next post starts with the part that exists most completely: the engine.