Parse resumes, extract skills, discover jobs and courses, classify domain, and chat locally with an AI coach — all in a modern Streamlit app.
InternHunt helps candidates quickly understand and improve their resumes, discover relevant roles and courses, and converse with a local AI about improvements. The app is modular and production-ready, with graceful fallbacks when optional services (DB, APIs, Ollama) aren’t configured.
- Live UI with Streamlit
- Resume parsing and skill extraction
- Job and course recommendations
- Resume domain classification
- Local chatbot via Ollama (optional)
- MySQL persistence and admin features (optional)
- Job scraping across multiple sources
- Resume Parsing
- Extracts contact info, skills, education, and experience from PDFs using spaCy and custom rules in
resume_parser.py.
- Extracts contact info, skills, education, and experience from PDFs using spaCy and custom rules in
- Smart Recommendations
- Jobs: role and keyword suggestions based on extracted skills.
- Courses: recommended courses to fill skill gaps (
Courses.py,api_services.py).
- Resume Classification
- Classifies resume domain/type (e.g., Data Science, Development) via
resume_classifier.py.
- Classifies resume domain/type (e.g., Data Science, Development) via
- Job Scraping
- Aggregates opportunities from multiple sources in
job_scrapers.pywith deduplication. - Scrapers include Internshala, GitHub repos (hiring/internship topics), and RemoteOK.
- Aggregates opportunities from multiple sources in
- Local Chatbot (Optional)
chat_service.pyintegrates with Ollama for fast, local, resume‑aware Q&A.- Streaming responses, model health checks, and conversation context.
- Database (Optional)
database.pyprovides MySQL connectivity for admin and tracking features.setup_database.sqlbootstraps schema; app runs fine without DB configured.
- Robust UI/UX
- Clean components in
ui.py, theme and styles fromstyles.py. - Centralized error handling via
error_handler.py. - Config in
config.pyand helpers inutils.py.
- Clean components in
.
├─ App_refined.py # Main Streamlit entrypoint (recommended)
├─ App.py # Legacy/alternate entry
├─ api_services.py # External helpers (yt_dlp, course helpers, Jooble, etc.)
├─ chat_service.py # Local chatbot via Ollama
├─ job_scrapers.py # Internshala / GitHub / RemoteOK scrapers + aggregator
├─ resume_parser.py # Resume parsing & extraction logic
├─ resume_classifier.py # Resume domain/type classifier
├─ Courses.py # Course recommendations
├─ config.py # Env loading & app config (dotenv)
├─ database.py # MySQL connectivity (optional)
├─ error_handler.py # Centralized error handling/log helpers
├─ styles.py # Theming and styled components
├─ ui.py # UI building blocks
├─ utils.py # Utilities and helpers
├─ setup_database.sql # DB schema bootstrap
├─ requirements.txt # Pip dependencies
├─ environment.yml # Conda environment (alternative to pip)
├─ .env.example # Template for environment variables (no secrets)
├─ .gitignore
├─ README.md
└─ logo.png
- Python 3.9+
- pip or Conda
- spaCy model
en_core_web_sm - Optional:
- MySQL Server (for DB features)
- Ollama (for the local chatbot)
Option A: pip + venv
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
python -m spacy download en_core_web_smOption B: Conda
conda env create -f environment.yml
conda activate internhunt
python -m spacy download en_core_web_smCopy and edit the example:
cp .env.example .envMinimum variables (aligned with config.py):
# Database (optional)
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=
DB_NAME=cv
# Chatbot (optional)
OLLAMA_HOST=http://localhost:11434
OLLAMA_MODEL=phi:latest
# Job APIs (optional)
JOOBLE_API_KEY=
ADZUNA_APP_ID=
ADZUNA_API_KEY=
ADZUNA_COUNTRY=inIf DB or Ollama are not configured, the app still runs with those features disabled.
Use the Streamlit runner:
streamlit run App_refined.py --server.port 8502Open the URL printed in the terminal (e.g., http://localhost:8502).
- Start MySQL and apply schema:
mysql -u root -p < setup_database.sql-
Ensure
.envcontains the correct credentials. -
Run the app; database‑backed features (admin/tracking) will be enabled.
- Install and run Ollama:
- macOS:
brew install ollama - Start server:
ollama serve
- Pull a model:
ollama pull phi
# or: ollama pull llama3- Configure
.env:
OLLAMA_HOST=http://localhost:11434
OLLAMA_MODEL=phi:latest- Launch the app and open the chat panel.
job_scrapers.pyaggregates results from multiple sources and deduplicates by URL.- Some sources are rate‑limited; the code throttles requests (
time.sleep) and handles errors gracefully. - Provide skills (and optional location) to
scrape_all(skills, location).
- Upload a resume (PDF) on the main screen.
- Review extracted contact details, skills, education, and experience.
- Explore recommended job roles and keywords.
- See course recommendations to fill skill gaps.
- Check resume classification (e.g., DS, Dev).
- Use the chatbot for tailored suggestions (if Ollama enabled).
- If DB is enabled, use admin/tracking features as configured.
Use a Streamlit launch configuration so Streamlit provides a proper ScriptRunContext:
{
"name": "Python: Streamlit",
"type": "python",
"request": "launch",
"module": "streamlit",
"args": ["run", "App_refined.py", "--server.port", "8502"],
"cwd": "${workspaceFolder}",
"justMyCode": true,
"console": "integratedTerminal",
"env": { "PYTHONPATH": "${workspaceFolder}" }
}- Streamlit “missing ScriptRunContext” warnings
- Run with
streamlit run App_refined.py, notpython App_refined.py.
- Run with
- spaCy model not found
python -m spacy download en_core_web_sm
- MySQL connection errors
- Verify server is running; credentials in
.envmatch; database exists viasetup_database.sql.
- Verify server is running; credentials in
- Ollama connection errors
- Confirm
ollama serveis running; model is pulled;OLLAMA_HOSTis correct (no trailing/api, no trailing slash).
- Confirm
- yt‑dlp or API errors
- Ensure URLs are valid; some endpoints may require API keys configured in
.env.
- Ensure URLs are valid; some endpoints may require API keys configured in
- Can I run without MySQL?
- Yes. The app detects missing DB credentials and runs with DB features disabled.
- Which Ollama model should I use?
- Defaults to
phi:latest. You can tryllama3or other models depending on your hardware.
- Defaults to
- Do I need API keys?
- Only for the optional job APIs. Scrapers and the core app work without them.
Issues and PRs are welcome. For major changes, please open an issue first to discuss your approach.
MIT. See LICENSE.
⭐ If you found this project helpful, please give it a star! ⭐
Built with ❤️ for students and job seekers
