Zero-server on PostgreSQL
The full loop — event store, projections, workflows, timers, outbox — runs on one Postgres database you already run. No proprietary server, and no broker for the dev loop.
store: PostgreSQL — the event storeJava Framework · Core
Apache-2.0The full loop — event store, projections, durable workflows, timers, outbox — on one PostgreSQL database. No proprietary server. Apache-2.0, free forever, including production persistence.
Architecture
A command and the state folded from replayed history in, new events or a rejection out — no framework types, no database calls. Events append with decision-scope optimistic concurrency: valid only if nothing matching what was read has appeared since, otherwise the runtime re-reads and re-decides.
Most Spring Boot teams hand-build the same infrastructure — an outbox, a dedup table, a state machine, an audit trail that drifts. Factum's bet: record every business decision as an immutable event, and make that record the system of truth. The rest falls out.
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; }
}@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);
}
}The mechanism
The full loop — event store, projections, workflows, timers, outbox — runs on one Postgres database you already run. No proprietary server, and no broker for the dev loop.
store: PostgreSQL — the event storeTag-based optimistic concurrency scoped to what a decision actually reads — the classic aggregate is just the special case of one tag.
concurrency: Dynamic Consistency Boundaries (DCB)Workflow-as-code on a virtual thread; the journal is ordinary tagged events in the same Postgres store — projectable with SQL.
workflows: journaled as ordinary tagged eventsEvents evolve by upcasting instead of rewriting history, and projections rebuild from the journal as a routine operation. Every convenience compiles down to a public lower layer — starter, annotations, functional core, plain Spring.
Drop a layer, never hit a wall.Every decision on the record.
Product Guide
Event sourcing that feels like Spring.
For business and technical architecture teams
Download the guideThe framework and the Factum commons libraries are permissively licensed for good. The commercial products build on this foundation.
Built on the framework
A working event-sourced entity with a same-transaction projection in under 15 minutes, on the stack you already run.