Queen Nduji, SWE
AtlasBank dashboard showing account balance and navigation
AtlasBank

A personal project modeling a banking system as event-driven microservices: an API gateway fronting Customer, Account, Transaction, Card, Ledger, Notification, and Statement services, OAuth2/OIDC via Keycloak, async messaging through RabbitMQ, database-per-service on PostgreSQL, and centralized structured logging with Serilog and Seq, all containerized with Docker Compose. Live at atlasbank.dev with a React and TypeScript frontend for opening accounts, moving money, issuing cards, and pulling statements.

CommerceCore product catalog page with category filters
CommerceCore

A personal project building a full ecommerce platform as 8 independently deployable .NET 10 microservices (Auth, Catalog, Inventory, Cart, Order, Payment, Shipping, Notification) behind a YARP API Gateway, each using Clean Architecture and CQRS via MediatR. Order Service orchestrates the checkout saga across Inventory, Payment, and Shipping, with Kafka and Schema Registry (Avro) driving the async event flow between services. Every service is instrumented with OpenTelemetry, shipping traces to Jaeger and correlated logs to Kibana/Elasticsearch. Payments, shipping, and notifications hit real third-party APIs in test mode (Stripe, EasyPost, Resend, Twilio) rather than mocks. Live at commercecore.app with a storefront for browsing the catalog and completing checkout.

PayFlow payment gateway architecture diagram
PayFlow

A work-in-progress personal project building a .NET 10 payment gateway that treats distributed-systems failure modes as first-class design concerns: a MassTransit saga (Fraud → Authorization → Ledger) with a transactional outbox and a compensating VoidAuthorization if the ledger post fails after authorization already succeeded, idempotency enforced by a database unique constraint rather than a check-then-act race, and a double-entry ledger whose balances are derived, never stored. Authorization calls a mock card network behind a Polly timeout/retry/circuit-breaker policy with configurable fault injection, so the resilience logic is actually exercisable, not just present. Every service ships OpenTelemetry traces, metrics, and logs, correlated by span ID across Tempo, Prometheus, and Loki in Grafana. Built in phases, each a working increment; architecture decisions are written up as ADRs along the way. Backend-only so far, so this card shows the system architecture rather than a UI.