How tamim662/ai-job-tracker works
1. This is a two-tier single-user application: a Spring Boot 3.3 backend in backend/ and a React 18 + Vite frontend in frontend/. The frontend is a browser client; the backend is the only API server and owns all business logic, persistence, security, and external API calls.
2. The backend is organized by classic layered boundaries: controller exposes REST endpoints, service contains orchestration and integration logic, repository handles Spring Data JPA access, entity defines the database model, and dto shapes request/response payloads. JobTrackerApplication is the Spring Boot entry point.
3. Authentication is intentionally simple and state-free. AuthController plus JwtUtil and JwtAuthFilter implement JWT-based login for a single set of credentials from environment variables. SecurityConfig and CorsConfig define the protected API surface and browser access rules; there is no public registration or multi-tenant user model.
4. The core domain is the job pipeline stored in PostgreSQL through JPA and Flyway. Main entities include Job, Application, Resume, CoverLetter, GeneratedMessage, JobMatch, CompanyResearch, and UserProfile. Flyway migrations in src/main/resources/db/migration create and evolve the schema, including later additions for company research and profile templates.
5. The main user workflow starts with profile and document setup. ResumeController and CoverLetterController manage uploaded source documents, while UserProfileController stores the user’s identity, job preferences, and default outreach templates. These saved inputs become the source material for all later AI-generated content.
6. Job discovery is split into structured search and broader web search. JobSearchController and AdzunaService query Adzuna for Australia-specific listings, while TavilyService supports web search across sites like Seek, LinkedIn, and Indeed. The backend returns paginated search DTOs, and the frontend renders them on the Jobs page.
7. Matching and ATS analysis are a distinct subsystem. KeywordMatcher performs local resume-to-job keyword scoring for instant match percentages, while AtsMatchService performs a deeper analysis using Groq. This separation means the app can show immediate local scoring without an API call, then run a heavier scan only when the user starts an application.
8. The “apply” flow is centered on job persistence and generated artifacts. JobController saves selected jobs into the user’s job list, updates status transitions, and exposes details for the My Jobs view. From there, MessageController and CoverLetterController generate job-specific outreach or application text, and GeneratedMessage records those outputs for later reuse.
9. AI integrations are split by purpose rather than by vendor. ClaudeService is used for adapted writing tasks like cover letters, HR emails, LinkedIn messages, and company research synthesis. GroqService handles ATS-style scoring and gap analysis. CompanyResearchService and MessageGenerationService orchestrate these calls and turn raw model output into structured DTOs.
10. File ingestion and storage are handled separately from text processing. FileParserService extracts text from uploaded PDF/DOCX files, S3Service manages optional object storage, and S3Config wires the AWS bucket settings. The extracted text feeds matching and AI generation; the stored file itself is preserved externally when S3 is enabled.
11. The frontend is a routed SPA with a small auth state boundary. AuthContext holds login state, PrivateRoute protects authenticated views, and axios.js centralizes API access with JWT handling. Pages map closely to backend domains: Dashboard, Jobs, Resumes, Cover Letters, and Profile, with ApplyModal acting as the main workflow surface for job actions.
12. The dashboard and jobs views are the two main operational surfaces. Dashboard aggregates stats from the backend into pipeline counts and recent activity, while Jobs drives search, save/apply actions, status updates, ATS results, and generated message access. This creates a single end-to-end flow from discovery to application tracking.
13. Infrastructure is meant to be self-hosted and mostly local. PostgreSQL runs via docker-compose.yml or AWS RDS, backend configuration comes from .env / application.yml, and optional S3 is used for document storage. External dependencies are limited to the needed APIs: Anthropic, Groq, Adzuna, and Tavily.
14. Tests mirror the main architectural boundaries. Backend controller tests cover the API layer, and service tests such as FileParserServiceTest validate key non-HTTP logic. That suggests the repo’s main correctness boundaries are the REST contract, the document parsing pipeline, and the AI/job orchestration services.
Main entry points: App.jsx App shell · JobService.java Services · JobController.java REST API · JobTrackerApplication.java Spring Boot
Components 19
Frontend
React browser client and routed UI
- App shell · Routed browser client
frontend/src/App.jsx - Auth state · Login state and route protection
frontend/src/contexts/AuthContext.jsx - API client · JWT-aware backend access
frontend/src/api/axios.js - Dashboard · Pipeline summary and recent activity
frontend/src/pages/DashboardPage.jsx - Jobs · Search, save, and apply workflow
frontend/src/pages/JobsPage.jsx - Profile · Identity, preferences, and templates
frontend/src/pages/ProfilePage.jsx - Docs pages · Resume and cover-letter views
frontend/src/pages/ResumesPage.jsx - Apply modal · Job action surface
frontend/src/components/ApplyModal.jsx
Backend
Spring Boot API, domain logic, and persistence
- Spring Boot · Application bootstrap
backend/src/main/java/com/jobtracker/JobTrackerApplication.java - Config · CORS, REST client, Anthropic, and S3 wiring
backend/src/main/java/com/jobtracker/config/CorsConfig.java - Auth stack · Login endpoint and JWT filter/util
backend/src/main/java/com/jobtracker/security/JwtAuthFilter.java - REST API · Endpoints for jobs, documents, profile, search, and AI actions
backend/src/main/java/com/jobtracker/controller/JobController.java - Services · Orchestration, integrations, and document workflows
backend/src/main/java/com/jobtracker/service/JobService.java - Matching · Local keyword scoring and ATS analysis
backend/src/main/java/com/jobtracker/util/KeywordMatcher.java - Domain model · Jobs, applications, resumes, messages, profiles, and research
backend/src/main/java/com/jobtracker/entity/Job.java - DTOs · Request and response shapes
backend/src/main/java/com/jobtracker/dto/JobDto.java
Infrastructure
Database, migrations, and external integrations
- PostgreSQL · Primary persistence store
backend/src/main/resources/db/migration/V1__init_schema.sql - Flyway · Schema evolution for research and profile templates
backend/src/main/resources/db/migration/V2__add_company_research.sql - External APIs · Anthropic, Groq, Adzuna, Tavily, and optional S3
backend/src/main/java/com/jobtracker/config/AnthropicConfig.java
Connections 20
- App shell → Auth state: uses · UI gates authenticated routes
- App shell → API client: calls · Browser requests go through shared client
- App shell → Dashboard: routes · Main operational surface
- App shell → Jobs: routes · Search and application workflow
- App shell → Profile: routes · Profile and template management
- App shell → Docs pages: routes · Resume and cover-letter pages
- Jobs → Apply modal: opens · Job actions are centered here
- API client → REST API: HTTP · Authenticated API access
- Spring Boot → Config: wires · Bootstraps application configuration
- Spring Boot → Auth stack: wires · Bootstraps security
- Spring Boot → REST API: starts · Exposes REST surface
- REST API → Services: delegates · Controllers hand off orchestration
- REST API → Auth stack: protected by · JWT login and protected API surface
- Services → Domain model: reads/writes · Persists jobs, profiles, documents, and results
- Services → DTOs: maps · Transforms request and response payloads
- Services → Matching: scores · Uses local and AI-backed job matching
- Services → External APIs: calls · Claude, Groq, job search, and web research providers
- Services → PostgreSQL: persists · Stores tracked jobs and generated artifacts
- Domain model → PostgreSQL: maps to · JPA entities map to PostgreSQL
- Flyway → PostgreSQL: evolves · Flyway creates and updates schema