Omnibus is a monorepo for a bridge bidding platform built around a rule engine and event-driven architecture.
presentation/frontend-angular– Angular UI for entering a hand and viewing bid recommendationspresentation/frontend-react– React UI (experimental / alternative frontend)presentation/bff-nest– NestJS backend-for-frontend aggregating domain APIs
services/event-archive– Kafka consumer persisting domain events into Cassandraservices/bidding-engine– Spring Boot (Java 21) service with Drools rule engineservices/workflow-orchestrator– Spring Boot service orchestrating rule governance workflows (Camunda / Zeebe style)
- Docker Compose – local orchestration of the full stack
- Outbox relay (
infra/outbox-relay) – bridges local outbox events to Kafka (if enabled) - Kafka – event backbone for recommendations and rule updates
- Cassandra – durable event storage for archived domain events
- Keycloak – identity provider for admin authentication
- Prometheus – metrics scraping and monitoring
- Promtail – log shipping to observability stack
- Angular frontend sends a recommendation request to the Nest BFF.
- BFF validates and forwards the request to
bidding-engine. bidding-enginebuilds hand facts and evaluates rules in Drools.- Drools produces candidate bids and returns the best recommendation with explanation.
- Domain events are published to Kafka (recommendation + rule updates).
- Rule changes go through
workflow-orchestratorbefore being applied to the rule set. event-archiveconsumes Kafka events and persists them in Cassandra.
Run all formatters and linters:
./gradlew formatCheck formatting without modifying files:
./gradlew formatCheckRun only Detekt linter:
./gradlew lintRun all code quality checks (format + lint):
./gradlew codeQualityRun linter:
npm run lintAuto-fix linting issues:
npm run lint:fixFormat code:
npm run formatCheck formatting without modifying:
npm run format:checkRun type checking:
npm run typecheckRun all checks (lint + format + typecheck):
cd presentation/bff-nest
npm run lint:allcd services/bidding-engine
gradle bootRunSwagger UI is available at http://localhost:8080/swagger-ui.html.
cd presentation/bff-nest
npm install
npm run start:devcd presentation/frontend-angular
npm install
npm startUse Node 20 LTS for both JavaScript applications. The Spring backend uses Java 21.
docker compose up --build- main entry point:
http://localhost:8088 - frontend UI:
http://localhost:8088/ - BFF API:
http://localhost:8088/api/... - Swagger UI:
http://localhost:8088/swagger-ui.html - workflow Swagger UI:
http://localhost:8088/workflow/swagger-ui.html - bidding-engine actuator:
http://localhost:8088/actuator/... - workflow actuator:
http://localhost:8088/workflow/actuator/... - event-archive actuator:
http://localhost:8088/archive/actuator/... - Keycloak via proxy:
http://localhost:8088/keycloak/ - Prometheus via proxy:
http://localhost:8088/prometheus/
- Broker for local development:
localhost:29092 - recommendation topic:
omnibus.recommendation.produced - rule update topic:
omnibus.rule.updated
- CQL port:
localhost:9042 - keyspace:
omnibus - archived tables:
recommendations_by_dayrule_updates_by_day
- URL:
http://localhost:9090 - realm:
omnibus - frontend client:
omnibus-frontend - sample admin user:
bridge-admin / changeit
The Keycloak bootstrap admin for the server console is kcadmin / kcadmin.
- Zeebe gRPC:
localhost:26500 - Zeebe REST:
http://localhost:8089 - workflow orchestrator API:
http://localhost:8082 - workflow publish endpoint:
POST /api/v1/rule-publications
- URL:
http://localhost:9091 - Spring metrics:
http://localhost:8080/actuator/prometheus - Keycloak metrics are scraped internally from
/metrics
The initial Drools ruleset handles simple opening recommendations:
PASSwith fewer than 12 HCP1NTwith balanced 15-17 HCP1Swith 5+ spades1Hwith 5+ hearts1Dwith longer diamonds than clubs1Cotherwise
- Start the stack with
docker compose up --build. - Open the frontend at
http://localhost:8088. - Click
Login adminand sign in asbridge-admin / changeit. - Use the admin panel to list bundled and managed DRL rules.
- Save a new managed rule from the panel. Nest starts a Camunda BPMN process in
workflow-orchestrator. - Camunda runs the
validate-and-publish-rulejob worker, which callsbidding-engine. - The backend validates the rule by compiling the full Drools set before accepting it.
Managed rules are loaded together with bundled rules on each recommendation request in the current MVP.
Prometheus is configured in infra/prometheus/prometheus.yml and scrapes:
bidding-enginethrough Spring Boot Actuator Prometheus metricsworkflow-orchestratorthrough Spring Boot Actuator Prometheus metricsevent-archivethrough Spring Boot Actuator Prometheus metricskeycloakthrough the built-in metrics endpoint
Kafka is used as an asynchronous event bus next to the bidding engine, not for synchronous UI requests.
RecommendationProducedEventis emitted after the engine returns a bidRuleUpdatedEventis emitted after an admin rule is saved and validatedevent-archiveconsumes both topics and writes a durable history to Cassandra
- The previous Kotlin prototype is intentionally not carried forward here.
- This scaffold favors explicit layers and service boundaries over framework shortcuts.
- Managed rules created from the admin panel are stored in
services/bidding-engine/managed-rules.