
Capabilities
- Real-time chat
- Vector search
- Message queues
- S3 storage
Frontend
Backend
AdoptaUnPeludo
CompletedAdopta un Peludo connects shelters with people looking to adopt. Shelters publish animal profiles while adopters search, filter, save favourites and get in touch over chat. A team project with a Node backend in hexagonal architecture plus several microservices, and a React frontend deployed with Docker.
The challenge
The features that create the value — chat, notifications, email, the assistant — are exactly the ones that must never block an HTTP request or take the app down when they fail. The answer was to move them out of the core and talk to them asynchronously.
Implementation
Hexagonal architecture with microservices
The domain sits isolated behind ports and adapters, and the cross-cutting concerns — notifications, email, assistant, error monitoring — live in independent services talking over RabbitMQ.
Real-time chat and notifications
A dedicated WebSocket service keeps the adopter–shelter conversation live and pushes alerts for events like new messages or favourites, without the main API having to hold those connections.
Assistant with vector search
A LangChain-based chatbot answers questions about the platform by running similarity search over a vector database of embeddings, rather than replying from the prompt alone.
Access and refresh tokens in cookies
JWT authentication with access and refresh tokens stored in cookies and renewed by middleware, plus Auth0 with Google sign-in for both shelters and adopters.
Images on S3
Animal photos are stored in an S3 bucket and served from there, keeping the API stateless with no files bolted to the server.
React Query on the front
A React SPA on Vite and Tailwind, with React Query owning server state — caching, revalidation and loading states — instead of a global store.
The whole stack in Docker
Every service is containerised and the set comes up with a single docker compose, including seed data with over a hundred animals so you can work from minute one.