Most resume tools today rely on automatic scanners. I wanted to build something different: a human-driven resume review system that focuses on clarity, intent, and real feedback.
Why I Built This Feature
As a developer and someone who reviews resumes often, I noticed a gap:
- Automatic resume analyzers score keywords
- They miss career intent, role clarity, and story
- Job seekers want human feedback, not just numbers
So I decided to build a manual resume review feature inside Resumemind, using Spring Boot and Angular.
What the Feature Does
Users can:
- Submit their resume for review
- Upload a PDF file or provide a Google Drive / external link
- Receive confirmation via email
- Get reviewed manually by an admin
Admins can:
- View all submissions
- Download or preview resumes securely
- Update review status
- Respond with meaningful feedback
No AI scoring. No ATS tricks. Just real review.
High-Level Architecture
Frontend (Angular)
- Reactive forms
- File upload with validation
- URL validation (file OR link required)
- Clean UX feedback
Backend (Spring Boot)
- Multipart file handling
- Secure file storage
- Database persistence
- Email notifications
- Admin review endpoints
Backend Implementation (Spring Boot)
Handling File Uploads
I used MultipartFile with multipart/form-data:
@PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ApiResponseEntity submitReview(
@RequestParam("name") String name,
@RequestParam("email") String email,
@RequestParam(value = "file", required = false) MultipartFile file,
@RequestParam(value = "link", required = false) String link
) {
return resumeReviewService.addResumeReview(name, email, file, link);
}
File Storage Strategy
- Files are saved outside public directories
- Only PDF files allowed
- Files are accessed via a controlled API endpoint
This avoids exposing /uploads directly.
Serving PDF Files Securely
Instead of accessing files directly, I exposed them via an API:
@GetMapping("/file/{filename}")
public ResponseEntity<Resource> viewFile(@PathVariable String filename) {
Resource file = fileService.load(filename);
return ResponseEntity.ok()
.contentType(MediaType.APPLICATION_PDF)
.body(file);
}
Angular simply calls this endpoint to preview or download the file.
Frontend Implementation (Angular)
Validation Logic
- Resume file OR link is required
- Strong URL validation using regex
- File size & type checks
Example URL regex:
Validators.pattern(
/^(https?:\/\/)(www\.)?[a-zA-Z0-9-]+\.[a-zA-Z]{2,}([\/\w.-]*)*\/?$/
)
This blocks invalid inputs like:
- httpss/me.com
- httpss;\me.com
Admin Dashboard (Most Important Part)
This is where the system becomes real.
Admin features:
- List all submissions
- View resume details
- Open PDF securely
- Track review status (
NOT_REVIEWED,REVIEWED) - Respond manually
This turns the app from a tool into a service.
Email Notifications
Emails are sent when:
- A resume is submitted
- Admin receives a new review request
Why this matters:
- Builds trust
- Confirms action
- Makes the system feel alive
Security & Trust Decisions
Some important choices I made:
- Only PDFs allowed
- File size limits
- No public file exposure
- Optional anonymous submissions
- No third-party resume analysis
Trust was a feature, not an afterthought.
Lessons Learned
- Multipart handling is easy to break if content-type isn’t correct
- Swagger isn’t ideal for file uploads
- Serving files via API is safer than static paths
- UX matters just as much as backend logic
What’s Next
- Resume review responses
- Admin notes & history
- Optional paid reviews
- Resume improvement tips
Final Thoughts
Building this feature reminded me that real value comes from solving real problems.
Sometimes, manual systems are better than automated ones.
If you’re building developer tools or career platforms, don’t underestimate the power of human feedback.
🔗 Built with:
- Spring Boot
- Angular
- Resumemind
If you have a resume that you would like my team to review, just hit this link : https://resumemind.com/public/resume-review
Top comments (0)