
CandiNote - Job Application Tracker
Full-stack SaaS to centralize job applications in a Kanban pipeline, schedule interviews, and manage a CV-enabled profile. Angular 18 frontend, Spring Boot 3 API, MongoDB, deployed with Docker and Caddy on candinote.fr.
Tech Stack
Angular
Standalone-component SPA with Material UI and CDK drag-drop Kanban
TypeScript
Type-safe frontend logic and reactive RxJS data flows
Spring Boot
REST API, security, validation, and business services (Java 21)
Java
Backend language (Java 21) with a layered, service-oriented design
MongoDB
Document store (Atlas) for users, applications, and interviews
JWT
Stateless authentication with BCrypt-hashed passwords
Docker
Multi-stage builds and Compose orchestration (backend, nginx, Caddy)
Caddy
Reverse proxy with automatic HTTPS via Let's Encrypt
Architecture
Full-stack SaaS pairing an Angular 18 standalone-component frontend (Angular Material, RxJS, CDK drag-drop) with a Spring Boot 3 REST API secured by Spring Security and JWT. Data is persisted in MongoDB (Atlas in production) across users, applications, and interviews collections with compound indexes. The stack is containerized with Docker Compose: an nginx container serves Angular and proxies /api to the backend, while Caddy acts as a reverse proxy terminating TLS with automatic Let's Encrypt certificates. Deployed on an OVH VPS with uploaded CVs stored on a Docker volume.
Key Features
- Job-application tracking SaaS with a full Kanban pipeline and drag-and-drop status updates
- Secure JWT authentication with BCrypt password hashing and stateless sessions
- CRUD for applications (company, role, status, source, salary, tags, notes, next action)
- Interview management linked to applications (type, mode, timezone-aware scheduling)
- User profile with CV upload, download, and deletion (multipart, 5 MB, PDF/DOC/DOCX)
- Dashboard with statistics plus a list view alongside the Kanban board
- Company autocomplete (Clearbit), logo resolution (logo.dev), and location search (Nominatim/OSM)
- Rate limiting with bucket4j and a normalized global error-handling layer
- Dockerized stack (Spring Boot + nginx-served Angular + Caddy) with automatic Let's Encrypt HTTPS
- Production hosting on an OVH VPS with MongoDB Atlas and a lightweight update workflow