Only the domain model
Commands decide, events evolve the state, and the compiler binds both at build time: no reflection and no infrastructure code.
Write only the domain model, and get a system you can run in production.





Open-source engineering recognition
A command function of the quickstart's bank account decides a withdrawal against the current state:
@OnCommand(produces = [Withdrawn::class])
fun onCommand(command: Withdraw): Decision = when {
command.amount <= 0 ->
Decision.reject(Rejections.INVALID_AMOUNT, "${command.amount} is not positive.")
command.amount > state.balance ->
Decision.reject(Rejections.INSUFFICIENT_BALANCE, "The balance is ${state.balance}.")
else -> Decision.events(Withdrawn(command.amount))
}Its test says it in the same terms, given events, when a command, expect events and state, with no server:
@Test
fun `a withdrawal the balance does not cover is rejected`() = aggregateSpec(model, id = "alice") {
given(AccountOpened("Alice"), Deposited(100))
whenCommand(Withdraw(150)) { expectRejected(Account.Rejections.INSUFFICIENT_BALANCE) }
whenCommand(Withdraw(30)) {
expectEvents(Withdrawn(30))
expectState { balance.assert().isEqualTo(70) }
}
}From that model, without more code, the service gets an HTTP route for each command, a state read and snapshot queries, an OpenAPI document, a Manifest from which wow-generator generates a typed TypeScript client, and its rejections as application/problem+json with their error codes.
| You want to | Start with |
|---|---|
| Decide whether Wow fits your system | How Wow works, then the glossary |
| Write a service | Quick start, then deciding and evolving |
| Call a service from a TypeScript front end | TypeScript client |
| Run services in production | Identity, tenancy and access, then subscriptions, failures and replay |
| Analyze the data | Read models, then the workbench |
Wow received the KaiCode’26 Excellent Award. The official results highlighted its modular DDD/CQRS design, disciplined multi-reviewer code review, Testcontainers-based integration testing, enforced test coverage thresholds, Detekt static analysis, bilingual documentation, and long history of semantically versioned releases on Maven Central.