Skip to content
jatin.sharma
← All projects

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

  1. Browser

  2. Caddy

    TLS, 80/443

  3. React app

    static files

  4. Express API

    private network

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