01 · SaaS · full lifecycle
Tasking
A task management app I designed, built, deployed and run myself, from the first schema to HTTPS in production.
Problem
I wanted a product I could carry through the entire lifecycle instead of stopping at localhost: design the data model, ship the UI, then own the deployment, reverse proxy, certificates and CI/CD.
What I built
- React + Vite + Material UI frontend, served as static files.
- Node.js / Express REST API with JWT authentication and bcrypt-hashed passwords.
- MongoDB Atlas for persistence, plus Redis.
- Dockerised frontend and API, orchestrated with Docker Compose on a Linux VPS.
Architecture
Browser
Caddy
TLS, 80/443
React app
static files
Express API
private network
MongoDB Atlas + Redis
Engineering decisions
- The API is never exposed publicly
- Only the reverse proxy publishes ports 80 and 443. The backend lives on a private Docker network, and the proxy forwards /api to it. There is one public entry point to reason about.
- Caddy for HTTPS
- Certificates are issued and renewed automatically, so TLS is infrastructure configuration instead of a recurring chore.
- Secure session handling
- JWT-based auth delivered with secure cookie settings in production, passwords hashed with bcrypt, and an explicit allowed frontend origin on the API.
- Automated deployment
- A Jenkins pipeline triggered by GitHub webhooks rebuilds and redeploys on push; PM2 and Docker Compose keep processes alive across restarts.
Technology
- React
- Vite
- Material UI
- Node.js
- Express
- MongoDB Atlas
- Redis
- JWT
- Docker
- Caddy
- Jenkins
- Linux
Result
Live at tasking.co.in and running in production on a single VPS behind Caddy with automatic HTTPS.