A production-style fintech platform built with a microservices architecture. Covers authentication, wallet based payments, KYC, fraud detection, analytics, social features, webhooks, an admin console, and a tamper-proof audit log.
A Next.js web app serves both the user facing product and the admin console through the same nginx gateway.
Looking for the original version built with Express, MongoDB, RabbitMQ, and React? See the v1 branch.
- Architecture - service map, communication patterns, JWT flow
- Services - each service: endpoints, DB, Kafka topics
- Infrastructure - nginx, Kafka, Postgres, Redis, MinIO, observability
- Running - dev and production setup
| Service | Stack | Port | Description |
|---|---|---|---|
| web | Next.js 15 | 3000 | User app and admin console |
| auth | Python / FastAPI | 4001 | JWT issuance, refresh, RBAC |
| wallet | Python / FastAPI | 4002 | gRPC settlement interface |
| transactions | NestJS | 4003 | Transfers, top-ups, idempotency |
| fraud | NestJS (gRPC) | * | Real-time fraud scoring on every transaction |
| kyc | NestJS | 4004 | Document upload, tier management |
| analytics | NestJS | 4005 | Spend insights, category budgets |
| notifications | NestJS | 4006 | Persistent notifications + SSE stream |
| social | NestJS | 4007 | Contacts, money requests, bill splits |
| webhook | NestJS | 4008 | User-registered webhooks + delivery log |
| admin | NestJS | 4009 | Admin console API (user mgmt, fraud review) |
| audit | NestJS | 4010 | Immutable append-only audit log |
* fraud is gRPC-only, called internally by the transactions service.
docker compose -f docker-compose.dev.yml up -d --buildThe app is available at http://localhost. The admin console is at http://localhost/app-admin.
Create an admin user in the auth service database.
docker exec -it mint-auth uv run python /app/apps/auth/src/create_admin.py \
--email admin@mint.dev \
--password adminpass \
--name "Admin User"Migrations run automatically before each service starts. API docs are at /api-docs on every service.
Every service ships OpenTelemetry traces to a local collector, stored in Tempo and visualised in Grafana at http://localhost:4000. Trace context is propagated across HTTP, gRPC, and Kafka so a single top-up request produces one trace spanning all downstream consumers.





