← All projects

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

Android appFlutterBack-officeAngular 20CaddyHTTPSAPI GatewayJWT · country15 microservicesSpring Boot 3.4PostgreSQL 161 DB / serviceRediscacheRabbitMQoutboxStripe · CinetPaypayments
Every request goes through Caddy then the gateway; services communicate through RabbitMQ events.

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

  1. 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.

  2. 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.

  3. 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.

  4. Constraint-based travel plans

    Deterministic generation based on budget, pace and interests, with geographic clustering of activities and scheduling.

Next projectLand platform →