Backend engineer with 8+ years of experience designing and building production systems on the JVM. I work primarily with Java and Spring Boot, with a focus on distributed architectures, event-driven systems and application security.
- Domains: healthcare / medical software, retail, logistics, HR, e-commerce
- Currently: enterprise applications with Spring Boot and OpenUI5, regulated medical device software under IEC 62304, and tracking the Java 25 / Spring Boot 4 platform shift
- Architecture: microservices, event-driven systems, Domain-Driven Design, Clean & Hexagonal Architecture, CQRS, Event Sourcing, Saga pattern
- Security: Spring Security, JWT, OAuth 2.0, OpenID Connect
- Writing: technical articles on Medium
| Area | Technologies |
|---|---|
| Languages | Java, Python, Go, SQL |
| Frameworks | Spring Boot, Spring Security, Spring Batch, Spring AI |
| Messaging & Streaming | Apache Kafka, Kafka Streams, RabbitMQ, Redis Streams |
| Data | PostgreSQL, MySQL, MongoDB, Redis |
| Infrastructure | Docker, Kubernetes, Google Cloud Platform |
| Observability | Micrometer, Prometheus, Grafana |
| Testing | JUnit 5, Testcontainers, jqwik (property-based), Cucumber |
What I have been building lately — modern Java runtime features and distributed-systems primitives implemented from scratch.
| Project | What it shows | Stack |
|---|---|---|
| Structured Concurrency | Virtual threads, StructuredTaskScope with a custom Joiner, and ScopedValue in place of ThreadLocal |
Java 25, Spring Boot 4 |
| Virtual Threads | Platform vs. virtual thread behaviour under load, pinning and blocking pitfalls | Java 21+, Spring Boot |
| Stream Gatherers | Real-world use cases for the Stream Gatherers API — windowing, folding, custom intermediate operations | Java 22+ |
| Consistent Hashing | Hash ring with virtual nodes, rebalancing cost on node join/leave | Java |
| Timing Wheel | O(1) timer scheduling — the data structure behind Kafka and Netty timeouts | Java |
| Property-Based Testing | Discount rules verified with generated inputs and shrinking instead of hand-picked cases | Java, jqwik |
Reference implementations of the patterns I use in production systems.
| Project | Description | Focus |
|---|---|---|
| DDD + EDA | Domain-Driven Design combined with event-driven architecture end to end | DDD, EDA |
| Hotel Booking | Booking domain modelled with aggregates and ports/adapters | DDD, Hexagonal |
| Cargo Booking | The classic cargo domain under Clean Architecture boundaries | Clean Architecture |
| Insurance System | Policy lifecycle with use-case driven layering | Clean Architecture |
| Saga Choreography | Distributed transactions without an orchestrator, with compensating actions | Saga |
| CQRS + Event Sourcing | Command/query separation over an append-only event store | CQRS, ES |
| Project | Description | Key Technologies |
|---|---|---|
| Fraud Detection System | Real-time fraud detection over transaction streams with configurable business rules | Kafka Streams, Spring Boot |
| Kafka Microservices | Event-driven Order / Inventory / Shipping services communicating asynchronously | Kafka, Spring Boot, Docker |
| Stream Processing Patterns | Solutions and best practices for common stream-processing problems | Kafka Streams |
| Message Ordering & Partitioning | Ordering guarantees, partitioning strategies and partition management | Apache Kafka |
| Quorum Queues | Durable, highly available messaging that survives broker loss | RabbitMQ, Spring Boot |
| Redis Streams | Redis Streams as a lightweight message backbone | Redis, Spring Boot |
| Project | Description | Stack |
|---|---|---|
| Spring AI Workspace | LLM integration patterns on the JVM — prompts, tools, structured output | Spring AI |
| Agentic RAG | Retrieval-augmented generation with an agent graph controlling retrieval | LangGraph, Python |
| MCP Server | Model Context Protocol server exposing domain tools to LLM clients | MCP |
| Gemini File Search | Document grounding over the Gemini file search API | Python |
Spring Boot — core application development
- spring-boot-workspace — general Spring Boot experiments and patterns
- spring-boot-kafka-integration — Kafka producer/consumer integration
- spring-batch-workspace — batch processing pipelines
- spring-boot-monitoring-demo — metrics, health checks and observability
- springboot-tsid — time-sorted unique identifier generation
- spring-rest-client-error-handling — resilient HTTP client error handling
- resilience4j — circuit breaker, retry and rate limiter patterns
Security & Authentication
- spring-security-workspace — Spring Security configurations and patterns
- spring-security-jwt — stateless JWT authentication
- spring-security-jwt-oauth2-oidc — OAuth 2.0 and OpenID Connect flows
- spring-security-google-oauth-demo — social login integration
- spring-security-digest-auth — digest authentication
- ott-spring-security-demo — one-time token authentication
- spring-boot-oauth-demo — OAuth 2.0 authorization server setup
- vault-password-rotation — secret management and credential rotation
Messaging & Scheduling
- spring-rabbitmq-workspace — RabbitMQ exchange and queue patterns
- spring-jobrunr-workspace — background job processing
- spring-quartzscheduler-workspace — distributed job scheduling
Testing
- springboot-integration-test-example — integration testing with Testcontainers
- jqwik-discount-app — property-based testing
- bdd-demo — behaviour-driven development with Gherkin scenarios
- selenium-demo — browser automation and UI tests
Notes & Reading
- ddd-notes — Domain-Driven Design study notes
- microservices-notes — microservice architecture notes
- messaging-notes — messaging and integration patterns
- refactoring-notes — refactoring catalogue notes
- apache-kafka-in-action — book notes
- Designing_Data-Intensive_Applications_By_Martin_Kleepman — book notes
- hackerrank — algorithm exercises and problem-solving practice

