Intelligent Job Matching Platform - Upload your CV and get personalized job recommendations powered by AI-based skill matching.
JobConnect is a web application that connects job seekers with remote opportunities. The platform analyzes your CV using natural language processing, extracts relevant skills and keywords, then searches multiple job platforms to find the best matches ranked by relevance.
Live Demo: Deployed on Railway π (Update link when deployed)
- Smart CV Analysis - Supports PDF and DOCX formats with automatic text extraction and section detection
- AI-Powered Matching - Scores and ranks jobs based on skill overlap, role alignment, and keyword relevance
- Multi-Platform Search - Scrapes jobs from WeWorkRemotely, RemoteOK, and more
- Application Tracking - Save and track your job applications in one place
- Employer Dashboard - Post, edit, and manage job listings
- Multi-language Support - Available in English, Spanish, and Italian
- Responsive Design - Modern UI optimized for desktop and mobile
- Security - Password hashing, rate limiting, input validation, and session protection
| Layer | Technology |
|---|---|
| Backend | Python 3.10+, Flask, SQLAlchemy |
| Frontend | Jinja2, Tailwind CSS, Alpine.js |
| Database | SQLite (dev) / PostgreSQL (prod) |
| Scraping | BeautifulSoup, Requests, fake-useragent |
| AI/NLP | Custom keyword extraction & TF-IDF scoring |
| Auth | Flask-Login with bcrypt password hashing |
| i18n | Flask-Babel (ES/EN/IT) |
| Security | Flask-Limiter, CSRF protection |
- Python 3.10 or higher
- pip (Python package manager)
# 1. Clone the repository
git clone https://github.com/RanuK12/JobFinder.git
cd JobFinder
# 2. Create and activate a virtual environment
python -m venv venv
source venv/bin/activate # Linux/macOS
# venv\Scripts\activate # Windows
# 3. Install dependencies
pip install -r requirements.txt
# 4. Set up environment variables
cp .env.example .env
# Edit .env with your configuration (especially SECRET_KEY)
# 5. Run the application
python app.pyThe app will be available at http://localhost:5000
- Register a new account (choose "Candidate" or "Employer")
- As a Candidate: Upload your CV (PDF/DOCX) to get job recommendations
- As an Employer: Create job listings from your dashboard
JobFinder/
βββ app.py # Application factory & routes
βββ config.py # Configuration classes (dev/prod/test)
βββ scraper.py # Multi-platform job scraper
βββ cv_parser.py # CV text extraction (PDF/DOCX)
βββ ai_matcher.py # AI-powered job matching engine
βββ requirements.txt # Python dependencies
βββ .env.example # Environment variable template
βββ .gitignore # Git ignore rules
β
βββ templates/ # Jinja2 HTML templates
β βββ base.html # Base layout with navbar & footer
β βββ navbar.html # Responsive navigation
β βββ home.html # Landing page
β βββ login.html # Authentication
β βββ register.html # User registration
β βββ index.html # CV upload & job search
β βββ results.html # Job search results
β βββ candidate_dashboard.html
β βββ employer_dashboard.html
β βββ create_job.html # Job posting form
β βββ edit_job.html # Job editing form
β βββ job_detail.html # Job details view
β βββ applications.html # Application tracking
β βββ errors/ # Custom error pages (403, 404, 429, 500)
β
βββ static/
β βββ profiles/ # User profile pictures
β βββ logs/ # Application logs
β
βββ translations/ # i18n translations (en/es/it)
βββ instance/ # SQLite database (auto-created)
βββ uploads/ # Temporary CV uploads
The application uses Flask's Application Factory Pattern for better modularity:
from app import create_app
app = create_app('development') # or 'production', 'testing'The matching engine uses a multi-factor scoring system:
- Skill Matching (60%) - Compares extracted technical skills against job requirements
- Role Alignment (20%) - Identifies role categories (frontend, backend, data, etc.)
- Keyword Overlap (20%) - General keyword frequency analysis
Jobs are scored 0-100 and labeled as High/Medium/Low relevance.
- Passwords hashed with Werkzeug's
generate_password_hash(PBKDF2) - Rate limiting on login (5/min) and registration (3/min) endpoints
- File upload validation (type + size limits)
- Session-based CSRF protection
- Input sanitization on all forms
The app supports three environments via config.py:
| Config | Use Case | Debug | Key Differences |
|---|---|---|---|
DevelopmentConfig |
Local dev | Yes | Shorter scraping delays, verbose logging |
ProductionConfig |
Deployment | No | Proxy support, stricter security |
TestingConfig |
Unit tests | Yes | In-memory DB, no rate limits |
Set the environment via FLASK_ENV environment variable or pass directly to create_app().
| Method | Route | Auth | Description |
|---|---|---|---|
| GET | / |
No | Landing page |
| GET/POST | /login |
No | User login |
| GET/POST | /register |
No | User registration |
| GET | /logout |
Yes | Logout |
| GET | /dashboard |
Yes | Redirect to user dashboard |
| GET/POST | /search |
Yes | CV upload & job search |
| GET | /results |
Yes | View matched jobs |
| POST | /apply_job |
Yes | Save job application (JSON) |
| GET | /applications |
Yes | View saved applications |
| GET/POST | /job/create |
Employer | Create job listing |
| GET/POST | /job/<id>/edit |
Employer | Edit job listing |
| POST | /job/<id>/delete |
Employer | Delete job listing |
| GET | /job/<id> |
Yes | Job detail view |
| GET | /jobs |
No | Public job listings |
| GET | /set_lang/<lang> |
No | Change language |
- Fork the repository
- Create a feature branch:
git checkout -b feature/my-feature - Make your changes and commit:
git commit -m "Add: description of changes" - Push to your branch:
git push origin feature/my-feature - Open a Pull Request
- Follow PEP 8 for Python code style
- Add docstrings to all functions and classes
- Keep route handlers concise; extract logic into utility functions
- Use Flask's
flash()for user feedback messages - Always validate and sanitize user input
pip install gunicorn
gunicorn "wsgi:app" -w 4 -b 0.0.0.0:8000This repository is pre-configured for automatic deployment on Railway.
- Connect GitHub: Create a new project on Railway and deploy from your GitHub repository.
- Auto Detection: Railway will use
Nixpacksand automatically detect the Python environment. - Start Command: The
railway.jsonandProcfileare already set up to rungunicorn wsgi:app. - Environment Variables: Don't forget to add your
.envvariables (e.g.SECRET_KEY,FLASK_ENV=production) in the Railway project variables settings.
export FLASK_ENV=production
export SECRET_KEY=$(python -c "import secrets; print(secrets.token_hex(32))")
export DATABASE_URL=postgresql://user:pass@host/dbnameMIT β Β© 2026 Ranuk IT Solutions | ranuk.dev
- Author: Emilio Ranucoli
- Email: ranucoliemilio@gmail.com
- LinkedIn: Emilio Ranucoli
- Repository: github.com/RanuK12/JobFinder