How I designed a zero-manual-entry job tracker using Spring Boot, webhooks, and LLMs

We’ve all been there: You apply for 50+ roles across LinkedIn, Indeed, and direct company portals. Within 48 hours, your inbox is a chaotic mix of "Application Received," "Technical Assessment," and "Interview Invite" emails.
Most people reach for a spreadsheet. But as an engineer, I saw a System Design challenge.
I wanted a system that was automated, intelligent, and enterprise-grade. I wanted to move from "tracking jobs" to "analyzing my career pipeline."
So, I built JobTrackerPro.
JobTrackerPro is a decoupled, full-stack ecosystem. I focused on three core pillars: Automation, Performance, and Security.
1. 🤖 AI-Driven Ingestion (The "Magic" Step)
Manual entry is where productivity dies. I engineered a pipeline that turns your inbox into a data source.

The Flow: User forwards an email --> Cloudmailin Webhook --> Spring Boot --> Google Gemini 2.0 Flash.
Fuzzy Logic: The system uses Jaccard Similarity to determine if an email is a new job or an update to an existing record (e.g., status changing from "Applied" to "Interview").
Multilingual: The AI processes emails in any language (Dutch, German, etc.) and translates the metadata to English on the fly.
2. ⚡ Latency Zero: Caching & Performance
To ensure the dashboard felt "instant," I implemented a multi-layered performance strategy:
Caffeine L2 Cache: User profiles and stats are stored in-memory, reducing database query latency to < 10ms.
Server-Side Excellence: Pagination, Searching, and Sorting are all offloaded to PostgreSQL (using Spring Data Pageable) to handle 1000+ entries without browser lag.
Java 21 Power: Using modern JVM features to keep the code concise and thread-safe.
3. ☁️ Atomic Cloud Storage
Instead of bloating the database with images, I used Cloudflare R2 (S3-compatible). I implemented Atomic Cleanup: whenever a user updates their photo, the backend automatically issues a `deleteObject command to remove the old file, keeping cloud costs at zero.
I moved away from heavy RxJS boilerplate for local state and embraced Angular 17 Signals.
Fine-grained Reactivity: Only the specific UI segments (like a progress circle) re-render when data changes.
Hybrid UI: I designed a high-density grid for Desktop and a custom Expandable Card System for Mobile, ensuring the experience is seamless on any device.
I didn't want to compromise on security. The app features:
Hybrid OAuth2: Sign in with Google/GitHub or Email/Password.
Identity Merging: A custom handler that links social identities to local accounts based on verified emails.
Stateless JWT: Secured via RS256 signing for all REST communication.
I believe in building in public. I designed a Sandbox Mode for contributors:
Mock AI: No API key? No problem. The app uses a mock service that returns realistic data for local testing.
Local Storage: Files save to a local folder instead of R2.
MailHog: Outgoing emails are trapped in a local UI for debugging.
Live Demo: https://thughari.github.io/JobTrackerPro
GitHub (Monorepo): thughari/JobTrackerPro
I’m currently looking for feedback on the AI parsing logic and looking for contributors interested in adding Google Calendar integration!
Let me know what you think in the comments! 🚀
#builders #springboot #angular #java #systemdesign #opensource
0
3
0