Table of Contents
- CL Booster - AI-Powered Cover Letter Generator
CL Booster is an intelligent cover letter generation tool that leverages AI to create personalized, professional cover letters tailored to each job application. The system solves the "lose-lose" dilemma faced by job seekers: manual writing is incredibly time-consuming, but generic AI output is often low-quality, robotic, or fails to address specific job nuances. Built for global job seekers looking to increase their interview conversion rates, the application is powered by Java 21+, Spring Boot 3.5+, Vaadin Flow 24.9+, and Google Gemini AI. The project was developed over 8 sprints × 2 weeks using Agile/Scrum methodology.
- Vision statement: "Our vision is to make the job application process more dynamic and high-quality. By providing software that facilitates the creation of tailored cover letters for diverse positions, we aim to empower users to apply more effectively and efficiently using specialized AI functionalities."
- Main goals: Increase hiring success rate by 30%, streamline the cover letter creation process for efficiency, and increase job application volume by 15% through smart automation.
- Key features:
- Profile Management — Create, view, and update a comprehensive user profile
- Resume Vault — Upload and manage different versions of resumes tailored to various industries or roles
- AI Context Scanner — Use advanced AI to scan resumes and target job descriptions to extract key selling points
- Application History — A timestamped log of generated cover letters paired with their respective job positions
- LinkedIn Integration — Sync the app profile directly with a user's LinkedIn profile for seamless data entry
- Definition of success: Balancing speed with bespoke quality to save time while increasing the quality of job applications.
- Development methodology: Agile / Scrum
- Sprint length: 2 weeks
- Overview of all 8 sprints:
| Sprint | Focus Area |
|---|---|
| Sprint 1 | Project Planning & Vision — foundational planning artifacts, backlog creation, vision validation, risk/scope definition |
| Sprint 2 | Requirements & Database — data design, ER diagram, database implementation, unit testing strategy |
| Sprint 3 | UI Implementation & CI — Vaadin UI framework, JaCoCo coverage goals, CI/CD pipeline (Build, Test, Coverage) |
| Sprint 4 | Docker Containerization — containerized services, Docker Hub deployment, installer creation |
| Sprint 5 | UI Localization & Kubernetes — multilingual support (6 languages), RTL/LTR layout handling |
| Sprint 6 | Database Localization — schema updates for multilingual content, code review and refactoring |
| Sprint 7 | Quality Assurance — SonarQube analysis, heuristic evaluation, UAT, performance testing |
| Sprint 8 | Documentation & Finalization — polishing documentation, finalizing repository structure |
The first sprint focused on establishing the foundational planning artifacts and defining the project's direction. Key activities included:
- Project plan summary: Defined the overall project scope, timeline, and resource allocation for the 16-week development cycle
- Backlog creation: Created the initial product backlog in Jira with user stories covering resume scanning, cover letter generation, profile management, LinkedIn integration, export functionality, ATS compliance, history management, and quality requirements
- Vision validation: Developed and validated the product vision statement through team collaboration
- Risk and scope definition: Identified key risks, defined project boundaries, and established success criteria
- Technology selection: Chose the technology stack (Java, Spring Boot, Vaadin, MariaDB, Google Gemini AI)
- Use case diagram: Designed the high-level use case diagram capturing system actors and their interactions
📄 Sprint 1 Review Report | Project Vision
This sprint focused on defining system requirements, data design, and establishing the database foundation.
- Functional requirements summary: Captured core requirements including resume parsing, information extraction, LLM-based cover letter generation, form auto-filling, PDF/DOCX export, and user authentication (register/login)
- Use Case Diagram: Designed to illustrate system actors and their interactions with the system
- ER Diagram: Developed the Entity-Relationship model for Users, Profiles, Cover Letters, and Settings
- Database technology: MariaDB selected as the primary database with JDBC connectivity
- Database implementation overview: Schema created, migrated, and tested with DAO and service layers
- Unit testing strategy: JUnit test framework integrated with JaCoCo for code coverage reporting
📄 Sprint 2 Planning Report | Sprint 2 Review Report
Diagrams:
This sprint focused on implementing the user interface and setting up continuous integration automation.
- UI framework and design approach: Built a complete graphical user interface using Vaadin Flow framework with server-side Java UI components and database interaction
- Screens implemented: Registration/Login, Dashboard, Profile Management, Resume Upload/Scanning, Cover Letter Generation Wizard, History
- Code coverage goals and tools: Integrated JaCoCo HTML coverage reports with a target of comprehensive code coverage across all layers
- Jenkins pipeline description:
- Build: Automatic Maven build triggered on code commits to the main branch
- Test: JUnit test execution with detailed reporting
- Coverage: JaCoCo coverage report generation and publishing
- Docker preparation: Dockerfile created and Docker Compose configured for local development testing
Diagrams:
This sprint focused on containerizing the application services to ensure reproducible environments and easy deployment.
- Purpose of Docker in the project: Ensured consistent environments across development, testing, and production, eliminated "works on my machine" issues, and simplified deployment
- Services containerized: Web Application (Spring Boot + Vaadin) and MariaDB database
- Dockerfile and compose overview: Multi-stage Dockerfile for optimized image size; Docker Compose configuration for local development with both services
- How containers are used: Docker image built and tested locally, pushed to Docker Hub (
timo2233/clboost), and shared with classmates for feedback; app setup installer created for Windows distribution - Additional features: History access functionality implemented for viewing and managing previously generated cover letters; resume text extraction library integrated for improved parsing
📄 Sprint 4 Planning Report | Sprint 4 Review Report
This sprint focused on making the application globally accessible through multilingual support.
- Supported UI languages: English (en), Finnish (fi), Portuguese (pt), Chinese (zh), Urdu (ur), Persian (fa)
- Localization approach: Java
ResourceBundle-based localization system integrated with Vaadin'sI18NProviderinterface; all static UI text externalized to.propertiesresource files; dynamic locale switching with session-based locale persistence - RTL/LTR layout support: Right-to-left (RTL) layout support implemented for Urdu and Persian using
dir="rtl"attribute on<html>element; Vaadin auto-flipsAppLayoutdrawer position, navbar order, and component flow direction; custom CSS overrides for cards, forms, navigation items, and toggle switches - Kubernetes usage (prepared but not fully deployed): Application structure prepared for scalable container orchestration; deployment strategy documented for future scaling
📄 Sprint 5 Planning Report | Sprint 5 Review Report
This sprint extended localization down to the database level.
- Language- or region-specific data handling: Designed and implemented a localization strategy for database content to store multilingual data entries
- Migration or schema changes: Updated ER diagram to accommodate multilingual content; configured UTF-8 encoding and locale settings for proper character support across all languages
- Validation approach: Validated data retrieval and display across all supported languages (Portuguese, Chinese, Urdu, Persian, English)
- Code quality improvements: Conducted static code analysis using SonarQube; identified and resolved code violations, complexity issues, redundant logic, and potential bugs; code clean-up and refactoring for improved readability and maintainability
- Acceptance test planning: Defined functional requirements, performance expectations, and usability standards for the acceptance phase
- Architecture documentation: Updated ER Diagram, Sequence Diagram, and UML diagrams
Diagrams:
📄 Sprint 6 Planning Report | Sprint 6 Review Report
Reports:
This sprint ensured project robustness through comprehensive testing and quality analysis.
- SonarQube usage and metrics: Configured Jenkins integration with SonarQube static code analysis; achieved Grade A across all quality metrics including cyclomatic complexity, code smells, duplications, and security hotspots
- Code quality goals: All code quality gates passed with Grade A (minimum Grade B required); successful build and Docker deployment through Jenkins pipeline
- JMeter test scenarios: Performance test plan created at
tests/performance/clboost_performance.jmxsimulating 10 concurrent users performing typical navigation (landing, login, dashboard, editor, history) with 5 iterations and 2-second think times - Functional and non-functional testing:
- Functional testing: Comprehensive test plan with unit tests, integration tests, and regression tests for all user stories; detailed bug tracking table with resolution status
- Heuristic evaluation: Usability assessment conducted following lecture instructions
- User Acceptance Testing (UAT): Conducted based on Sprint 6 acceptance criteria with results documented
📄 Sprint 7 Planning Report | Sprint 7 Review Report
Reports:
This final sprint focused on polishing all project documentation and finalizing the system.
- Technical documentation: Maintained and updated repository structure with accurate documentation across all modules; finalized developer setup instructions
- User documentation: Updated README with comprehensive setup, usage, and testing guides; created localization documentation with language spreadsheets
- API documentation: Documented backend service interfaces, DAO patterns, and AI pipeline integration
- Final system architecture: Complete architecture encompassing all implemented features including AI pipeline, localization framework, CI/CD pipeline, and database layer
- Java 21+
- Maven 3.6+
- Docker & Docker Compose
- Google Gemini API key (get one here) or Google cloud project ID
- Clone the repository:
git clone https://github.com/Lion504/CLboost cd cl-booster - Copy the environment template and fill in your API key:
cp .env.example .env # Edit .env — add your GEMINI_API_KEY and GOOGLE_PROJECT_ID
Option A - Docker Compose (recommended):
docker-compose up -dOption B - Pull from Docker Hub:
docker pull timo2233/clboost:latest
docker run -d -p 8080:8080 --name clboost-app \
-e GEMINI_API_KEY=your_api_key \
-e DB_HOST=db \
-e DB_PORT=3306 \
-e DB_NAME=CL_generator \
-e DB_USERNAME=root \
-e DB_PASSWORD=password \
timo2233/clboost:v1.0.4Option C - Build and run locally:
docker build -t clboost-app .
docker run -d -p 8080:8080 --name clboost-app \
-e GEMINI_API_KEY=your_api_key \
-e DB_HOST=db \
-e DB_PORT=3306 \
-e DB_NAME=CL_generator \
-e DB_USERNAME=root \
-e DB_PASSWORD=password \
clboost-appOpen your browser and navigate to http://localhost:8080. The application will load the landing page where you can register a new account or log in.
Execute the following command to run all unit tests:
mvn clean testRun the full verification to generate JaCoCo coverage reports:
mvn clean verifyThe HTML coverage report is then accessible at target/site/jacoco/index.html.
CLboost includes an Apache JMeter test plan for load testing the web application.
Test plan location: tests/performance/clboost_performance.jmx
Test scenarios: Simulates 10 concurrent users performing typical navigation (landing, login, dashboard, editor, history, etc.) with 5 iterations and 2-second think times.
Running performance tests locally:
- Install JMeter 5.6.3+ (download)
- Start the application (Docker or
mvn spring-boot:run) on port 8080 - Execute the test:
jmeter -n -t tests/performance/clboost_performance.jmx -l result.jtl -Jport=8080 -e -o report/
- View the report: Open
report/index.htmlin a browser
CI integration: Performance tests are part of the Jenkins pipeline (Jenkinsfile), running automatically on every build.
cl-booster/
├── src/
│ └── main/
│ ├── frontend/ # Frontend assets (themes, styles)
│ ├── java/com/clbooster/
│ │ ├── aiservice/ # AIService, Exporter, Parser
│ │ └── app/
│ │ ├── backend/ # DAO, services, security, i18n
│ │ └── views/ # All Vaadin UI views
│ └── resources/ # application.properties, translations
├── tests/ # Performance test plans (JMeter)
├── installer/ # Windows installer and setup scripts
├── documentation/ # Sprint reports, diagrams, localization docs
├── uploads/ # Runtime file storage (resumes, cover letters)
├── docker-compose.yml # Docker Compose configuration
├── Dockerfile # Multi-stage Docker build
├── Jenkinsfile # CI/CD pipeline definition
└── pom.xml # Maven build configuration
- 5-step wizard — job details → resume import → skills → summary → inline editor
- AI generation — Google Gemini writes personalized cover letters using your profile + resume
- 3 tone styles — Professional, Creative, Storyteller
- Resume manager — upload, preview, download, delete resumes
- History — browse, re-edit, and export past cover letters
- Multi-language UI — English, Finnish, Chinese, Urdu, Persian, Portuguese
- Export — DOCX and PDF from the editor
- Spring Boot 3.5+ — application framework
- Vaadin Flow 24.9+ — server-side Java UI
- Spring AI — Google Gemini integration
- MariaDB — database infrastructure prepared (uncomment in
application.propertiesto activate) - File storage —
uploads/directory for resumes and cover letters
- User profile fetched from
ProfileDAO - Latest uploaded resume parsed by
Parser - Combined context sent to
AIService→ Gemini API - Result rendered in inline step-5 editor
- Auto-saved as
.docxtouploads/coverletters/
- Docker — containerization
- GitHub Actions — CI/CD pipeline
- Maven — build automation
- spring-dotenv —
.envfile support
CL Booster uses a Java ResourceBundle-based localization system integrated with Vaadin's I18NProvider interface for seamless server-side UI translation.
UI Views (DashboardView, HistoryView, etc.)
│ translate("key", params)
▼
TranslationService.java (implements I18NProvider)
- Resolves locale: session → user settings → default
- Loads ResourceBundle for the active locale
- Falls back to English if a key is missing
- Formats {0}, {1} placeholders via MessageFormat
│ ResourceBundle.getBundle()
▼
messages*.properties (en, fi, zh, ur, fa, pt)
| Language | Code | File | Script | Direction |
|---|---|---|---|---|
| English | en |
messages.properties |
Latin | LTR |
| Finnish | fi |
messages_fi.properties |
Latin | LTR |
| Portuguese | pt |
messages_pt.properties |
Latin | LTR |
| Chinese | zh |
messages_zh.properties |
Han (CJK) | LTR |
| Urdu | ur |
messages_ur.properties |
Arabic | RTL |
| Persian | fa |
messages_fa.properties |
Arabic | RTL |
Urdu (اردو) and Persian (فارسی) use right-to-left (RTL) text direction. The application handles RTL through three layers:
dirattribute —TranslationService.setCurrentLocale()setsdir="rtl"on the<html>element whenever an RTL language (fa, ur, ar, he) is selected- Vaadin auto-flip — Vaadin Flow 24.9+ reads
dir="rtl"and automatically flipsAppLayoutdrawer position, navbar order, and component flow direction - Custom CSS overrides —
styles.cssadds RTL-specific rules for cards, forms, navigation items, toggle switches, and animations
- Sidebar drawer position (left ↔ right)
- Form label/input alignment
- Navigation menu order
- Table column order
- Button group ordering
- Toggle switch thumb position (uses CSS
inset-inline-start/end)
RTL languages use Arabic-script fonts with cascading fallbacks: Noto Sans Arabic → Noto Nastaliq Urdu → Vazirmatn → system defaults.
- Launch the application
- Open Settings → Language
- Select فارسی (Persian) or اردو (Urdu)
- Verify: sidebar moves right, all text aligns right, toggle switches flip, no overlapping or clipped content
- Switch back to English — verify everything flips back to LTR
- How to run unit tests: Run
mvn clean test - Test coverage access: Run
mvn clean verifyto generate the JaCoCo coverage report, accessible attarget/site/jacoco/index.html.
SonarQube provides continuous inspection of code quality, security, and maintainability.
Quick Start with Docker
# Start SonarQube container (runs on http://localhost:9000)
docker run -d --name sonarqube \
-p 9000:9000 \
sonarqube:lts-community
# Wait ~2 minutes for startup, then access:
# http://localhost:9000 | admin / adminRun Analysis
# Full build with tests + coverage + Sonar analysis
mvn clean verify sonar:sonar
# Or run analysis only (skip tests)
mvn compile sonar:sonarCLboost includes an Apache JMeter test plan for load testing the web application, helping evaluate responsiveness and stability under concurrent user load.
tests/performance/clboost_performance.jmx
- Simulates 10 concurrent users performing typical navigation (landing, login, dashboard, editor, history, etc.)
- Each user performs 5 iterations with a 2-second think time between requests.
- Both public and protected pages are tested; protected pages return redirects for anonymous users (expected).
-
Install JMeter 5.6.3+ and ensure
jmeteris on yourPATH.
Download: https://jmeter.apache.org/download_jmeter.cgi -
Start the application (Docker or
mvn spring-boot:run) on port8080(or adjust). -
Execute the test:
jmeter -n -t tests/performance/clboost_performance.jmx -l result.jtl -Jport=8080 -e -o report/- View the report: Open
report/index.htmlin a browser.
Performance tests are part of the Jenkins pipeline (Jenkinsfile). The Performance Test stage runs automatically on every build against a running test environment. Results are archived as build artifacts.
- Avg – average response time (ms). Aim for < 2000ms.
- Err % – error rate. Should be ≤ 5% (5xx responses or assertion failures).
- Throughput – requests/second; higher is better.
See dev_instructions.md for full setup, CLI usage, Docker, and deployment details.
- Wang Yongzhi — Frontend & DevOps Lead (Vaadin UI, Docker, CI/CD, Localization)
- Taysa Abinader — Project Manager & QA Lead (Scrum Master, Documentation, Testing, Heuristic Evaluation)
- Tamseela Mahmood — Backend & QA (Authentication, Database, Code Coverage, UAT)
- Kiavash Montazeri — Integration & Testing (Docker, LinkedIn API, PDF Libraries, Functional Testing)
- Course: Software Engineering Project 1 (TX00EY27-3011) & Software Engineering Project 2 (TX00EY30-3011), Spring 2026
This project is licensed under the MIT License — see LICENSE.md for details.
- Vaadin for the excellent web framework
- Spring Boot for the application framework
- Google Gemini for the AI capabilities
Made with ❤️ using Vaadin + Spring Boot

