A full-stack real-time messaging application, built as both a learning project and a functional app. Inspired by the architecture of lightweight messenger apps.
Backend
- Node.js, Express, TypeScript
- MongoDB with Mongoose
- JWT authentication (httpOnly cookies)
- Zod v4 for validation
- Cloudinary (profile images), Resend (email), Arcjet (security), Sentry (error monitoring)
Frontend
- React, Vite, TypeScript
- Tailwind CSS, shadcn/ui
- TanStack Query, Zod
Infra / Tooling
- Deployed on Sevalla (Express serves the built React frontend)
- Cloudinary
- Conventional commits enforced via Husky + commitlint
- ESLint + Prettier
echo/
├── backend/ # Express API
└── frontend/ # React/Vite client
- Basic Auth (register, login, logout, profile)
- Frontend auth and main pages layout
- Real-time messaging via WebSockets (native)
- Add users for conversations by shareable id
- Profile image upload
- Messages api integration
- Unit tests coverage
- Email confirmation logic
- Two-token JWT pattern (access + refresh)
- Migration to VPS and PostgreSQL
- Docker + CI/CD pipeline
- Mobile client (React Native)
It's a deliberate deep-dive into areas I wanted to build fluency in: backend architecture, real-time systems, and production infra. The goal is to build something real while understanding the primitives, like native WebSockets and plain Node/Express before maybe migrating to Socket.io and frameworks like NestJS.