Zero-server on PostgreSQL
The full loop — event store, projections, workflows, agents, timers, outbox — runs on the database you already trust. No proprietary server, no broker for the dev loop.
factum.store: postgresEvent sourcing × Spring × AI agents
Factum is a Spring-native framework for event-sourced microservices and AI agents — zero-server on PostgreSQL, durable workflows whose journal is the event store, and agents that survive an audit.
The golden path
One starter, a handful of annotations, a working event-sourced entity with a same-transaction projection in under 15 minutes. Domain logic stays plain Java — records, pure functions, no framework types.
And when you need to drop a layer, the functional core under the annotations is public API.
Follow the 15-minute path →@EventSourcedEntity(tag = "order")
class Order {
private boolean placed;
@Decide
List<Object> handle(PlaceOrder cmd) {
if (placed) throw new AlreadyPlaced(cmd.orderId());
return List.of(new OrderPlaced(cmd.orderId(), cmd.totalCents()));
}
@Evolve
void on(OrderPlaced e) { placed = true; }
}@Project(mode = ProjectionMode.INLINE) // same transaction → read your writes
class OrderSummaryProjection {
@On
void on(OrderPlaced e, JdbcClient db) {
db.sql("INSERT INTO order_summary (order_id, total_cents, status) "
+ "VALUES (:id, :total, 'PLACED')")
.param("id", e.orderId())
.param("total", e.totalCents())
.update();
}
}@Agent(model = "anthropic:claude-sonnet-4-6",
budget = @Budget(maxCost = "5.00 EUR"))
class ClaimTriageAgent {
@Tool(description = "Fetch the policyholder's coverage terms")
CoverageTerms coverage(String policyId) {
return coverageService.lookup(policyId);
}
@Guardrail
Verdict citationsRequired(ReserveRecommendation rec) {
return rec.citations().isEmpty()
? Verdict.block("Recommendation lacks policy citations")
: Verdict.allow();
}
}@DeciderTest(Order.class)
class OrderDeciderTest {
@Test // no Spring, no database — milliseconds
void placingTwiceIsRejected(DeciderFixture<Order> fixture) {
fixture.given(new OrderPlaced("o-42", 1999))
.when(new PlaceOrder("o-42", 1999))
.expectException(AlreadyPlaced.class);
}
}Why Factum
The full loop — event store, projections, workflows, agents, timers, outbox — runs on the database you already trust. No proprietary server, no broker for the dev loop.
factum.store: postgresEvery prompt, tool call, guardrail verdict, and human approval is an immutable event. Durable, resumable, replayable, budgeted — compliance by construction, not by retrofit.
agent.ApprovalGranted {actor, payload_hash}Durable workflow-as-code whose history IS the domain event store. Process state is queryable SQL, never an opaque blob.
ctx.awaitApproval(…)Dynamic Consistency Boundaries: the aggregate becomes a special case, and the wrong boundary becomes a reviewable diff.
@Decide(tags = {…})The framework — including production persistence — is permissively licensed for good. Enterprise sells governance, never permission to run.
LICENSE: Apache-2.0The family
The framework underneath is free under Apache-2.0. The three products built on it are source-available under BUSL-1.1 and license per user.
Core banking where the history is the product.
A Spring Boot library set that turns Factum's event-sourced foundations into working banking capability: a double-entry ledger, an ISO 20022 payments engine, financial-crime controls, syndicated lending, and reconciliation — with every balance derived from the record, never stored as truth.
factum_banking_sdkDurable execution and audit, one mechanism.
A durable, replayable agent runtime whose append-only run journal is simultaneously the recovery mechanism and the audit record — with enforced human oversight, hard boundaries at the model call, and certified journal backends.
factum_agents_frameworkOne ledger substrate, every asset.
The shared financial foundation under the Factum verticals: an asset-generalized ledger and money model designed so banking, wealth, and future verticals derive from one substrate. Early access — the design is committed, the first milestones are being built with design partners.
factum_financialThe journal
Licensing
Each product licenses per user, per month, on top of the free framework. We are onboarding early customers. Design partners license at 50% of list, locked for 24 months.
Release notes, deep dives, and migration guides — a few times a quarter, never more.