Personal project 2026
Ewô
Multi-country travel booking: web, mobile and 15 microservices.
- Role
- Designed and built solo: architecture, back end, back office, mobile app, CI/CD and deployment.
- Status
- In development · private repository, access on request
- Stack
- Java 21
- Spring Boot 3.4
- Spring Cloud Gateway
- Eureka
- PostgreSQL 16
- Redis
- RabbitMQ
- Angular 20
- Flutter
- Docker
- GitHub Actions
- Caddy
- Prometheus
- Grafana
Ewô lets travellers book activities, accommodation, transport or full packages from local partners, pay by card or Mobile Money, and get a day-by-day travel plan. Each country has its own catalogue, currency and payment methods.
Architecture
What I built
- 15 Spring Boot 3.4 / Java 21 microservices behind a Spring Cloud Gateway, with Eureka discovery and one PostgreSQL database per service.
- Multi-tenant: 5 countries live (Côte d’Ivoire, Senegal, Benin, Cameroon, France), each with its own currency (XOF, XAF, EUR).
- Angular 20 back office (signals, Material) and Flutter Android app (Riverpod, GoRouter).
- JUnit / Testcontainers, Jest and Flutter tests run by GitHub Actions on every push; Docker images published automatically.
- Prometheus / Grafana monitoring, automatic HTTPS with Caddy, deployment setup for a Raspberry Pi 4.
Technical decisions
Booking → payment saga
Prices are recalculated server-side and stock is reserved atomically. Payment goes through Stripe (cards) or CinetPay (Mobile Money); on failure, a refund is triggered automatically.
Outbox and idempotent consumers
Events are written in the same transaction as the data (outbox pattern), published to RabbitMQ and consumed idempotently: no message lost, none processed twice.
Security at the gateway
Single entry point: the gateway validates the JWT, strips any identity header sent by the client, resolves the country and blocks internal routes.
Constraint-based travel plans
Deterministic generation based on budget, pace and interests, with geographic clustering of activities and scheduling.