Skip to content

YASMINE12AMOR/FlashApply

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

11 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation


⚑ FlashApply

AI-powered CV personalisation β€” tailored to every job offer, every country.


Python Streamlit FastAPI DeepSeek Stripe


Upload your CV Β· Paste a job URL Β· Pick a country Β· Get a perfectly matched CV in seconds.



πŸ—ΊοΈ Table of Contents


🎯 What is FlashApply?

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.


✨ Features

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

πŸ–₯️ Interface

The Streamlit UI is split into two panels:

FlashApply Interface

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚         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)


πŸ“Š Scores Explained

Match Original β€” how good is your CV before personalisation?

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.

Match Custom β€” how good is your CV after personalisation?

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.

ConformitΓ© β€” does your CV fit the target country?

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

πŸ’³ Premium Model

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  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 βœ…

πŸ—οΈ Architecture

Pipeline overview

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]
Loading

πŸ“ Project Structure

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

🧩 Components

🎨 Presentation β€” streamlit_app.py

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_pipeline and renders all results
  • Generates the premium PDF from the personalised markdown
  • Creates a Stripe payment link and unlocks PDF download on ?payment=success

βš™οΈ Orchestration β€” pipeline_agent.py

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

πŸ“‚ Extraction

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}

πŸ€– CV Generator β€” cv_generator_agent.py

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.


🌍 Country Profiles β€” cv_customizer_agent.json

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

πŸ”Œ External Services

LLM β€” llm.py

Provider resolution order:

1. DeepSeek   β†’   DEEPSEEK_API_KEY      deepseek-reasoner  (V3.2 thinking mode)
2. OpenAI     β†’   OPENAI_API_KEY        fallback only

deepseek-reasoner is the DeepSeek-V3.2 "thinking" mode β€” extended chain-of-thought reasoning before generating the final CV. Custom base URL is supported via DEEPSEEK_BASE_URL (defaults to https://api.deepseek.com).


πŸ’³ Stripe β€” stripe_payments.py

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.


πŸ“¦ Local Dependencies

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

πŸ”„ Data Contracts

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.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages