Upload your CV Β· Paste a job URL Β· Pick a country Β· Get a perfectly matched CV in seconds.
- What is FlashApply?
- Features
- Interface
- Scores explained
- Premium model
- Architecture
- Project structure
- Components
- External services
- Data contracts
FlashApply is a Streamlit application that helps you adapt your CV to any job offer β automatically.
It analyses the gap between your CV and a target role, rewrites it using an LLM, and ensures the result conforms to the hiring norms of the target country. The full PDF export is unlocked via a one-time Stripe payment. Everything else is free to preview.
| Feature | Description | |
|---|---|---|
| π | CV Import | Upload PDF, DOCX, TXT, or image β OCR supported |
| π | Job Offer Parsing | Paste any job URL β text is extracted automatically via Jina AI |
| π | Country Targeting | Adapts formatting and tone for France π«π·, Germany π©πͺ, Canada π¨π¦ |
| π | Match Scoring | Before/after keyword match score + country compliance score |
| π€ | LLM Rewriting | CV regenerated with DeepSeek-V3.2 reasoning (thinking) mode |
| π³ | Stripe Premium | PDF download unlocked after a single payment β no account needed |
The Streamlit UI is split into two panels:
βββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββ
β LEFT PANEL β RIGHT PANEL β
β β β
β β Upload CV β β£ Match Original score β
β β‘ Paste job offer URL β β€ Match Custom score β
β β’ Select target country β β₯ ConformitΓ© score β
β β β¦ Personalised CV preview β
β [ Run Analysis ] β β§ PDF download (premium π) β
β [ Generate Stripe Link ] β β
βββββββββββββββββββββββββββββ΄ββββββββββββββββββββββββββββββββββ
Supported CV formats: PDF Β· DOCX Β· TXT Β· Image (OCR)
Keywords are extracted from the job offer. This score measures how many of them already appear in your original CV. A low score means the offer's vocabulary is barely reflected in your current document.
Same calculation, run on the rewritten CV. A higher score than Match Original confirms the LLM successfully aligned your CV with the offer's language and expectations.
This score does not compare your CV to the job offer. It checks against cultural rules specific to the selected country: section order, personal information policies, tone, and layout expectations.
Scoring formula:
match_score = (keywords found in CV Γ· total keywords detected) Γ 100
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β FREE tier PREMIUM tier β
β β
β β
Upload CV β
Everything in FREE β
β β
Fetch & parse job offer β
Download final PDF β
β β
Run full analysis β
β β
View personalised CV β
β β
See all three scores β
β β Download PDF export β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Payment flow:
User clicks "Generate Stripe Link"
β
Completes payment on Stripe checkout
β
Stripe redirects β app/?payment=success
β
App activates premium mode
β
PDF download button appears β
flowchart TD
U[Utilisateur] --> UI[Streamlit UI]
UI --> P[Pipeline Agent]
P --> CVX[CV Extractor]
P --> JOBX[Job Offer Extractor]
P --> CR[Country Rules]
P --> MA[Matching Agent]
P --> CGA[CV Generator Agent]
CGA --> LLM[LLM Provider]
UI --> PDF[PDF Builder]
UI --> STRIPE[Stripe Payments]
CVX --> FILES[PDF Β· DOCX Β· TXT Β· Image]
JOBX --> JINA[Jina AI Mirror]
CR --> CFG[JSON Country Config]
FlashApply/
βββ streamlit_app.py # Main Streamlit UI & pipeline entrypoint
βββ ARCHITECTURE.md
βββ README.md
βββ requirements.txt
β
βββ app/
βββ main.py # Minimal FastAPI backend (health check)
β
βββ config/
β βββ cv_customizer_agent.json # Country profiles β FR Β· DE Β· CA
β
βββ agents/
β βββ pipeline_agent.py # Core business orchestration
β βββ matching_agent.py # Keyword-based scoring
β βββ cv_generator_agent.py # LLM CV generation + rule-based fallback
β
βββ extractors/
β βββ cv_extractor.py # PDF Β· DOCX Β· TXT Β· OCR dispatcher
β βββ job_offer_extractor.py # URL β text via Jina AI
β
βββ utils/
βββ country_rules.py # Country norm adapter
βββ llm.py # DeepSeek / OpenAI connector
βββ stripe_payments.py # Stripe payment link creator
The single entry point for all user interaction.
- Collects CV file, job offer URL, and target country
- Manages Streamlit session state across steps
- Triggers
run_pipelineand renders all results - Generates the premium PDF from the personalised markdown
- Creates a Stripe payment link and unlocks PDF download on
?payment=success
The central application service. Chains every step in order:
extract CV text
β fetch job offer
β load country rules
β score original CV
β generate personalised CV
β score personalised CV
β compute compliance
β return result dict
| Module | Input | Method |
|---|---|---|
cv_extractor.py |
.pdf |
pdfplumber |
cv_extractor.py |
.docx |
python-docx |
cv_extractor.py |
.txt |
Direct read |
cv_extractor.py |
Image | pytesseract OCR |
job_offer_extractor.py |
Any URL | https://r.jina.ai/{url} |
Generates the personalised CV using:
- π Country formatting rules
- π Current match score
- π Present / missing keywords
- π Source CV text + job offer text
Falls back to a rule-based mode if no LLM API key is available.
Each profile defines document length, layout type, allowed/forbidden personal info, section order, tone, and cultural constraints.
| Country | Key rules |
|---|---|
| π«π· France | Formal tone Β· photo optional Β· structured sections |
| π©πͺ Germany | Lebenslauf format Β· photo expected Β· strict chronology |
| π¨π¦ Canada | No photo Β· concise Β· skills-first Β· bilingual considerations |
Provider resolution order:
1. DeepSeek β DEEPSEEK_API_KEY deepseek-reasoner (V3.2 thinking mode)
2. OpenAI β OPENAI_API_KEY fallback only
deepseek-reasoneris the DeepSeek-V3.2 "thinking" mode β extended chain-of-thought reasoning before generating the final CV. Custom base URL is supported viaDEEPSEEK_BASE_URL(defaults tohttps://api.deepseek.com).
Creates per-session, on-the-fly:
Product β Price β Payment Link β Redirect to ?payment=success
No stored products, no subscriptions β each session generates its own Stripe artefacts.
| Package | Used for |
|---|---|
pdfplumber |
PDF text extraction |
python-docx |
DOCX parsing |
pytesseract |
Image OCR |
Pillow |
Image pre-processing |
reportlab |
PDF generation |
streamlit |
UI framework |
fastapi |
Backend health endpoint |
langchain-openai |
LLM client (DeepSeek-compatible) |
stripe |
Payment link creation |
Pipeline input:
{
"cv_file_path": "local_temp_path", # Temporary path of uploaded CV
"offer_url": "https://...", # Job offer URL
"country": "France" # Target country profile
}Pipeline output:
{
"country": "...", # Selected country
"country_rules": { ... }, # Loaded formatting rules
"cv_text": "...", # Extracted CV text
"offer_text": "...", # Extracted job offer text
"original_matching": { ... }, # Score before personalisation
"personalized_cv": "...", # LLM-generated CV
"personalized_matching": { ... }, # Score after personalisation
"compliance": { ... } # Country conformity score
}FlashApply Β· AI CV Personalisation Β· Streamlit + DeepSeek + Stripe
Not financial or legal advice. CV quality depends on LLM output.
