Overview
CVora Pro is a native Android AI Resume Analyzer built with Kotlin and Jetpack Compose (Material 3). Users manage multiple resumes, edit structured sections, see a live ATS-style score card with sub-scores and insights, paste a job description for keyword analysis, use AI-assisted actions (summaries, optimization, etc.), preview layouts, and export/share PDFs.
Data is stored locally with Room. The default AI implementation is LocalNlpAiService—template- and rules-based, no API keys and no cloud call for normal operation. You can replace it with your own AiResumeService implementation (OpenAI, Gemini, etc.).
Language: All first-party copy is English (res/values/strings.xml). resourceConfigurations += listOf("en") in app/build.gradle.kts keeps non-English locale folders from dependencies out of the APK so system-facing strings stay aligned with an English product build.
Privacy-friendly core path: resumes and ATS analysis run on-device. The manifest may include
INTERNET for optional remote integrations or libraries—remove or keep according to your fork and Play Console data declarations.
Complete feature catalog
Below is a buyer-facing inventory of what the shipped app provides. Use it for marketplace listings, README excerpts, and support scripts. Items reflect the default build with LocalNlpAiService and optional AdMob.
Home screen
- Resume list — All saved resumes with title and last-updated style presentation; tap to open the editor.
- Create resume — New draft with smart unique naming (avoids duplicate titles; integrates
ResumeTitles). - Delete resume — Confirmation dialog before removal.
- Loading & errors — Full-screen loading while the list loads; snackbars for recoverable errors.
- Optional banner ad — Bottom strip when
ads_banner_enabled is on; fixed height to avoid layout jump.
Resume editor — layout & navigation
- Top app bar — Back, save (with inline busy state), open preview.
- Scrollable body — ATS card, horizontally scrollable tab row, and active tab content share one vertical scroll for a continuous “SaaS” feel.
- Tabs — Personal, Education, Experience, Skills, ATS & Job via
ScrollableTabRow (swipe tabs on narrow screens). - Tab transitions —
Crossfade between tab panels with eased timing. - Background — Premium gradient behind editor content (
PremiumGradientBackground). - Save feedback — Snackbars for success, validation failures, generic save failures, and AI errors; state is consumed so messages do not repeat incorrectly.
- Optimize overlay — Full-screen
BlockingOverlay while “Fix My Resume” runs; success snackbar after completion; try/catch in ViewModel so failures clear busy state.
ATS score card & analytics (always visible above tabs)
- Overall score 0–100 — Circular ring with animated sweep; label for “ATS” style positioning.
- Sub-scores — Keyword match (only when job description is non-empty), section completeness, content quality; each with a progress bar when applicable.
- ⓘ Info dialog — Plain-language explanation of the three pillars (keyword match, sections, content quality).
- Empty job description — Keyword row shows N/A; prominent hint to paste a JD on the ATS tab; insights deduplicated so users are not spammed with the same message.
- Missing keywords — Horizontal chip row when a JD is present and gaps exist.
- Insights list — Bulleted mix of resume-quality suggestions (contact, summary, education, experience, skills) and ATS-oriented hints (measurable outcomes, action verbs, etc.).
- Loading gate —
isAnalysisReady hides misleading scores until resume data is loaded into the editor. - Glass card presentation —
GlassCard with soft shadow/glow for marketplace polish.
Personal tab
- Resume title, target role chips (9 job families), full name, email, phone, location, LinkedIn, portfolio, multi-line summary.
- Validation — Name/email rules with inline supporting text for common issues.
- AI on summary — Polish sentence, rewrite professional tone, action verbs; auto-generate from role; improve with optional “role focus” text field.
Education tab
- Zero or more entries: school, degree, field, start/end year, description; add/remove per card.
- Card-based layout with delete control.
Experience tab
- Per role: company, job title, location, dates, long description.
- AI — Polish, rewrite, verbs; generate with optional hints dialog; improve experience.
- Loading overlay on card — When an experience-level AI job runs, that card shows a focused progress state.
Skills tab
- List of skill name + level rows; add/remove.
ATS & Job tab
- Large job description field (paste posting text).
- Fix My Resume — Whole-resume optimization pipeline with global overlay and completion snackbar.
Preview screen
- Template picker — Horizontal chips to switch preview template (e.g. Classic).
- Live preview — Composable resume layout before export.
- Save PDF — Writes to user-visible storage (MediaStore
Download/CVora on API 29+, app external files on older APIs); Toast shows the saved path string. - Interstitial — After successful save, optional full-screen ad with cooldown and preference tracking (non-blocking if ad fails).
- Optional bottom banner — Same AdMob banner slot as home when enabled.
- Export busy state — Blocking overlay while PDF is generated.
Data, privacy, offline defaults
- Local-first — All resume content in Room/SQLite on device.
- No cloud account — No sign-in in the default product.
- Default AI — Pattern/template driven; no third-party LLM calls unless you swap the service.
Quick-reference grid (marketing bullets)
ATS score (0–100) Circular ring, weighted blend, animated when ready.
Keyword & JD Extract keywords, match %, missing chips, empty-JD UX.
Multi-resume Create, list, delete, smart titles.
Rich editor 5 tabs, scrollable strip, crossfade, validation.
On-device AI Summary, experience, fix resume—pluggable interface.
PDF save + path Paginated PDF, Toast with location, optional interstitial.
Demo onboarding Seed resume, sample JD, one-time auto-open.
Optional AdMob XML toggles, English-only resource packaging option.
ATS & job description
Scoring and insights are implemented in AtsScoreEngine and related analyzers.
- Overall score — Blended ATS-style 0–100 from section completeness, keyword alignment (when JD exists), and content-quality heuristics.
- Keyword match — Only active when the job description field is non-empty; compares extracted JD keywords to resume corpus (summary, skills, experience, etc.).
- Section completeness — Contact, summary, education, experience, skills.
- Content quality — Measurable outcomes, strong verbs, experience depth (heuristic).
- Empty JD — Keyword row shows N/A; yellow hint to paste a JD on the ATS tab; duplicate “paste JD” insights are suppressed.
- Loading —
isAnalysisReady is false until editor state has finished loading the resume.
First launch & demo
- Bootstrap — In
CvoraiApplication, if preferences indicate first bootstrap and the DB is empty, ResumeRepository.seedDemoResume() runs. - Sample job description — The demo uses
ResumeRepository.DEMO_JOB_DESCRIPTION so ATS keyword match works immediately. - Auto-open editor (once) —
AppPreferences tracks hasAutoOpenedDemoEditor. After resumes load on Home, the app navigates to the editor for the resume with the lowest id (usually the demo), once per install, with a short delay to reduce flicker.
To change or disable demo behavior, edit CvoraiApplication.kt, ResumeRepository.kt, HomeScreen.kt (LaunchedEffect), and AppPreferences.kt.
User guide (end users)
Step-by-step flow for job seekers using the app as shipped. Wording can be reused in in-app help or store description.
- Home — See all resumes. Tap one to edit, or use Create for a new draft (title is suggested automatically to avoid duplicates). Long-press or use delete where offered; confirm when asked.
- First launch — You may land directly in a demo resume once. Edit it or create your own; the demo illustrates ATS with a sample job description.
- Editor top — Use Back to return home, Save to persist (watch for validation messages), Preview to see print layout before PDF.
- ATS card — Stays above the tabs. Overall ring score and bars update after your resume loads. Tap ⓘ to read how keyword, section, and content scores work.
- Personal tab — Fill contact, links, summary, and pick a target role chip so tone defaults make sense. Use AI chips on the summary if you want quick rewrites (requires patience while the overlay runs).
- Education / Experience / Skills — Add blocks with the add actions; remove cards you do not need. On Experience, AI actions apply to each role; a small loading state may appear on that card.
- ATS & Job tab — Paste the full job posting text here. That enables keyword match, missing-keyword chips, and richer insights on the ATS card. If empty, the app shows N/A and hints instead of fake keyword percentages.
- Fix My Resume — Runs a whole-document optimization from the ATS tab; a full-screen blocking overlay appears until finished. Read the snackbar for success or errors.
- Preview — Switch template chips if more than one is available. Check pagination and spacing before export.
- Save PDF — From preview, save to device storage. A Toast shows where the file went (path varies by Android version). After a successful save, an interstitial ad may appear if the developer enabled it — your PDF is already saved.
- Ads — A banner may sit at the bottom of Home or Preview when enabled; it does not replace app content and uses a fixed-height area.
Requirements (product & environment)
Use this section for store listings, buyer expectations, and developer onboarding. If you change minSdk, JDK, or Gradle versions, update the tables here so documentation stays accurate.
End-user / device requirements
| Item | Value | Notes |
| Minimum Android | API 24 (Android 7.0) | minSdk = 24 in app/build.gradle.kts. |
| Target SDK | API 36 | Storage, backup, and ad-related behavior follow current platform expectations. |
| Compile SDK | 36 (with minor API level as set in Gradle) | Must match installed SDK Platform in Android Studio. |
| Recommended test range | API 24, 29, 33–36 | Covers legacy devices, scoped storage transition, and latest emulators. |
| Network | Optional for core features | Editing, Room, default AI, and ATS work offline. Needed for AdMob and any remote API you add. |
| Google Play Services | Ads only | play-services-ads when banners or interstitials are enabled. |
| UI language | English | Strings in res/values/strings.xml. Optional: resourceConfigurations += listOf("en") strips non-English dependency locales from the APK. |
Developer workstation requirements
| Item | Details |
| Android Studio | Latest stable; must support the project’s AGP (see gradle/libs.versions.toml, currently AGP 9.1.0). |
| JDK | JDK 11+ for compiling; project sets Java 11 bytecode (compileOptions in app/build.gradle.kts). Use the JDK bundled with Android Studio unless you have a specific toolchain policy. |
| Gradle | Wrapper included (gradlew); do not assume a global Gradle install version. |
| SDK components | Android SDK Platform matching compileSdk, build-tools as prompted by sync, and at least one emulator image or physical device with USB debugging. |
Functional requirements (what the shipped product does)
- Maintain multiple resumes locally (create, open, edit, delete) with persistent storage.
- Show an ATS-style overall score and sub-scores that react to resume text and optional job description.
- Provide actionable insights (completeness, keywords, writing tips) without claiming a specific employer’s ATS.
- Offer AI-assisted actions on summary, experience, and full-resume “fix” flows via pluggable
AiResumeService (default: on-device, no API key). - Preview the resume and export a multi-page PDF to user-visible storage, with a clear success path (Toast path).
- Respect AdMob configuration: master switch plus separate banner and interstitial flags; no crash when ads fail.
- On first install, optionally seed demo content and auto-open the editor once for onboarding.
Non-functional requirements
- UX: Single vertical scroll in the editor; horizontal tab row for many sections; crossfade between tabs.
- Reliability: Long-running AI and PDF operations show blocking UI; errors clear busy state.
- Maintainability: Ad unit IDs, app id, cooldown interval, and banner slot height are in XML (
admob_config.xml), not scattered as magic numbers in Kotlin. - Privacy default: No mandatory account; resume data stays on device unless you add sync.
Demo
Demo Link: https://demo.products.techrobot.in/cvora-pro/v1.0/app-debug.apk
Changelog
27 March 2026 – Version 1.0
- Initial Release