Job hunting is stressful — tailoring resumes to every job description is even worse.
So I built SmartCV, a mobile app that analyzes your resume and matches it against a job description — highlighting missing skills and suggesting improvements.
Tech Stack
- Kotlin Multiplatform (KMP) → shared scoring + JD matching logic
- Jetpack Compose → Android UI
- PdfBox-Android → PDF parsing
- Custom NLP-inspired Scoring Engine → resume quality + JD keyword match
- GitHub Actions CI → build + test automation
Resume Analysis (Core Logic)
`fun analyzeResumeText(text: String): AnalysisResult {
val wordCount = text.split("\s+".toRegex()).size
val verbHits = ACTION_VERBS.count { text.contains(it, ignoreCase = true) }
val score = (verbHits * 10) + (if (wordCount in 400..900) 20 else 0)
return AnalysisResult(
overallScore = score,
signals = mapOf("Word Count" to wordCount, "Action Verbs" to verbHits),
recommendations = buildRecommendations(wordCount, verbHits)
)
}`
This checks word count, action verbs, and generates recommendations like:
“Add more quantified bullets”
“Resume is too long — trim to 2 pages”
Matching with a Job Description
val resumeTokens = tokenize(resumeText).tokens.keys.map(::stem).toSet()
val jdTokens = tokenize(jdText).tokens.keys.map(::stem).toSet()
val present = jdTokens.intersect(resumeTokens)
val matchScore = (present.size.toDouble() / jdTokens.size * 100).roundToInt()
SmartCV computes a match score (%) and highlights missing keywords.
Example: if JD requires CI/CD and DataStore but your resume doesn’t mention them → flagged as gaps.
UI (Jetpack Compose)
- Circular gauge for overall score
- Progress bars for sub-scores (word count, verbs, metrics)
- Chips for matched & missing skills
- JD Match card with missing keyword suggestions
CI/CD
- The repo ships with a GitHub Actions workflow:
- Build & test on every PR
- Assemble APK & upload as artifact
What’s Next
- Export to PDF/CSV
- Add ATS-style scoring (readability, formatting)
- Extend KMP for iOS
Links
- GitHub Repo → https://github.com/Qandil11/SmartCV-ResumeAnalyzer/tree/main
- Demo Video → https://www.youtube.com/shorts/p_aBx-PjTWk
Would love your feedback!
What other features would make this useful for developers/job seekers?
Top comments (0)