kernablekernable

Event sourcing · CQRS · Rust kernel

Business logic in any language. One kernel.

kernable stores, signs and orders every command and event. Your services decide, in any language.

curl -fsSL https://kernable.com/install.sh | shSoon

Any languageRead your own writesSigned and verifiableErasable personal dataOne binaryNo brokerCrash-testedApache-2.0
[ What changes ]

What the kernel does for you.

Your code only decides. The rest is built in.

  1. 01Polling until the read side catches up→Read your own writes
  2. 02An outbox and a message broker→The kernel delivers
  3. 03Audit tables you hope are complete→The log is the audit
  4. 04One language for every team→Any language
  5. 05Trust us→kernable verify
[ The kernel ]

Storage, ordering, trust and delivery in one process.

Your processes hold the business logic and connect over gRPC. The TypeScript, Python and Rust SDKs share one API.

  • One binary and a SQLite file. No broker, no cluster.
  • Built-in UI and metrics. See every service, event and aggregate live.
  • Crash-tested. Aborted at every crash point and fuzzed on damaged logs.
[ Code ]

A shopping cart in three files.

Submit a command and read the result straight away, with no polling.

import { Kernable, Rejected, domain } from "@kernable/sdk";

const cart = domain("shop").aggregate("cart", { items: 0, checkedOut: false });

cart.apply("ItemAdded", (state, data: { qty: number }) => { state.items += data.qty; });
cart.apply("CheckedOut", (state) => { state.checkedOut = true; });

cart.command("AddItem", (state, data: { sku: string; qty: number }) => {
  if (state.checkedOut) throw new Rejected("Cart is checked out");
  return [{ type: "ItemAdded", data }];
});

cart.command("CheckOut", (state, _data, _cmd, ctx) => {
  if (state.items === 0) throw new Rejected("Cart is empty");
  // ctx.now() and ctx.id() stay the same if the command runs again.
  return [{ type: "CheckedOut", data: { at: ctx.now().toISOString(), orderId: ctx.id() } }];
});

await new Kernable({ key: "app.key" }).worker(cart).run();

Every code example in the documentation runs against a real kernel in CI.

[ Compared ]

An application kernel, not another piece to wire up.

kernableDatabase + outbox + busEvent store databasesEvent sourcing frameworksLogs and streams
Business logic runsin your processes, any languagein your servicesin your applicationon the framework's platformin your consumers
Read your own writesbuilt inyou build ityou build itdepends on the setupyou build it
Signed, verifiable historybuilt innot built innot built innot built innot built in
Operating itone binary and a filea database and a message busa database server or clustera server or clustera cluster

Where kernable is young: one kernel per store with no failover yet, no compaction, and the API may change before 1.0.

[ Editions ]

Open core. It stays open.

The core is Apache-2.0, and that will not change.

Planned

Enterprise

On request

  • Tenancy, identity and RBAC, ready-made
  • Single sign-on and multiple nodes
  • Long-term support builds and support plans

[ Early access ]

Build on kernable before 1.0.

kernable is in private preview. Tell us what you're building, and we'll send you the binaries and the docs.