N Northwood ERP
Welcome — let's get you started.
A self-contained event-driven microservices ERP: seven services coordinating order-to-cash, procure-to-pay, and make-to-stock through Sagas, an outbox/inbox event bus, and real Keycloak sign-in.
Tech stack
- Java 21 · Spring Boot 4.0.5 (Spring Framework 7, Jakarta EE 11) · Maven multi-module
- PostgreSQL 17 — schema-per-service in one DB (
search_path = <service>, shared per connection)
- Liquibase migrations (manually wired — Spring Boot 4 ships no auto-config)
- Spring Data JDBC — chosen over JPA for explicit aggregate boundaries
- Kafka 4.1.2 (KRaft, single broker) — JSON wire format via Jackson 3
- Keycloak 26 + Spring Security — OIDC code flow for the ERP SPA
- Testcontainers for the integration-test seam
- React 18 + Vite + Tailwind v4 ERP SPA · TanStack Query for data fetching
- OpenTelemetry + LGTM — Prometheus · Tempo · Loki · Grafana, auto-instrumented (one correlated trace per Saga)
- Terraform IaC — single-AZ EC2 running the images via
docker run, pushed to ECR
Start here
This is a hands-on demo — drive it yourself in the browser. Here's the quickest way in.
- Click "Enter the ERP" below. You'll be sent to the Keycloak sign-in screen — the demo uses real login, not a bypass.
- Sign in. Every persona's password is the same as its username. A friendly first login is
sarah / sarah — a sales clerk who can place orders and watch them fulfil end-to-end.
- Find the Demo Guide inside the app — the ? icon in the top bar — for the full cast (13 personas, each a different role) and ten step-by-step walkthroughs.
- Switch persona whenever you like: sign out (top-right) and sign back in as someone else — the UI re-reads your role automatically.
⏰
Demo hours & auto-sleep. To keep running costs down, Northwood runs on demand. Start it yourself with the button above on weekdays between 8:30 AM and 5:00 PM (Australia/Sydney) — it's ready in a few minutes. It goes back to sleep automatically after 30 minutes with no active session, and always by 6:00 PM. It stays offline on weekends.