A full-stack job scraping application that collects job listings from multiple sources (LinkedIn, Naukri) and presents them in a beautiful, searchable web interface.
Caliber is a modern job scraping tool with:
- π·οΈ Web Scraping - Extract jobs from LinkedIn and Naukri
- π¨ Beautiful Frontend - React + Vite with Tailwind CSS
- π Robust Backend - Node.js/Express API
- π Smart Search - Filter by title, company, location, salary
- π Data Management - Export to CSV, view statistics
- π± Responsive Design - Works on all devices
caliber/
βββ frontend/ # React + Vite UI
β βββ src/
β β βββ components/ # Header, JobCard, FilterPanel
β β βββ App.jsx # Main application
β β βββ App.css # Styles and animations
β β βββ index.css # Global Tailwind CSS
β βββ tailwind.config.js # Tailwind configuration
β βββ package.json # Frontend dependencies
β βββ README.md # Frontend documentation
β
βββ backend/ # Node.js/Express API
β βββ src/
β β βββ controllers/ # Request handlers
β β βββ routes/ # API endpoints
β β βββ services/ # Business logic
β β βββ models/ # Database models
β β βββ middleware/ # Express middleware
β β βββ config/ # Configuration
β β βββ app.js # Express app
β β βββ server.js # Server entry
β βββ package.json # Backend dependencies
β βββ README.md # Backend documentation
β
βββ linkedin.py # LinkedIn scraper
βββ naukri.py # Naukri scraper
βββ main.py # Scraper orchestrator
βββ requirements.txt # Python dependencies
βββ pyproject.toml # Python project config
βββ README.md # This file
- React 19 - UI framework
- Vite - Build tool and dev server
- Tailwind CSS - Utility-first styling
- Lucide React - Icon library
- Axios - HTTP client
- Node.js - Runtime environment
- Express - Web framework
- MongoDB - Database (optional)
- Axios - HTTP requests
- Child Process - Execute Python scripts
- Selenium/BeautifulSoup - Web scraping
- Requests - HTTP library
- Pandas - Data processing
git clone https://github.com/Monkdev7/Caliber.git
cd Calibercd frontend
npm install
cp .env.example .env.local
npm run devFrontend will be available at: http://localhost:5173
cd ../backend
npm install
npm startBackend will be available at: http://localhost:5000
cd ..
python -m venv .venv
.venv\Scripts\activate # On Windows
# or
source .venv/bin/activate # On macOS/Linux
pip install -r requirements.txt- π Search by job title or company
- π’ Filter by company name
- π Filter by location
- πΌ Filter by job source (LinkedIn/Naukri)
- β View job statistics
- π₯ Scrape jobs from multiple sources
- πΎ Store jobs in database
- π₯ Export jobs to CSV
- π Real-time updates
- π± Fully responsive design
- β‘ Fast and smooth interactions
- π¨ Modern, professional styling
- π Clean dark-friendly design
GET /api/jobs- Fetch all jobsPOST /api/jobs- Create a new jobGET /api/jobs/:id- Get job by IDPUT /api/jobs/:id- Update jobDELETE /api/jobs/:id- Delete job
POST /api/scrape- Trigger scraping for a sourceGET /api/scrape/status- Get scrape status
VITE_API_URL=http://localhost:5000/apiPORT=5000
MONGODB_URI=mongodb://localhost:27017/caliber
NODE_ENV=development# Terminal 1: Frontend
cd frontend
npm run dev
# Terminal 2: Backend
cd backend
npm start
# Terminal 3: Python Scrapers (optional)
cd ..
python main.py# Frontend
cd frontend
npm run build
npm run preview
# Backend
cd backend
npm run build
npm startcd frontend
npm run dev # Start dev server
npm run lint # Check code quality
npm run build # Build for productioncd backend
npm run dev # Start with nodemon
npm run lint # Check code quality
npm test # Run testspython main.py # Run main scraper
python linkedin.py # Run LinkedIn scraper only
python naukri.py # Run Naukri scraper only{
_id: ObjectId,
title: String,
company: String,
location: String,
salary: String,
experience: String,
description: String,
url: String,
source: String, // 'linkedin' or 'naukri'
posted_date: Date,
scraped_at: Date,
created_at: Date,
updated_at: Date
}- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Commit changes:
git commit -m 'Add amazing feature' - Push to branch:
git push origin feature/amazing-feature - Open a pull request
- Check if backend is running:
http://localhost:5000 - Clear browser cache and hard refresh
- Check
.env.localAPI URL
- Verify backend is running
- Check CORS settings in backend
- Verify API URL in frontend
.env.local
- Check Python environment is activated
- Verify dependencies:
pip install -r requirements.txt - Check browser/scraper logs for errors
- Ensure MongoDB is running
- Check connection string in backend
.env - Verify database credentials
- Frontend caches jobs in state
- Backend implements pagination
- Images are lazy-loaded
- CSS is optimized with Tailwind purging
- Environment variables for sensitive data
- Input validation on frontend and backend
- CORS configuration
- Rate limiting (recommended)
- SQL/NoSQL injection prevention
Deploy to: Vercel, Netlify, GitHub Pages, etc.
npm run build
# Upload dist/ folderDeploy to: Heroku, Railway, Render, AWS, etc.
npm run build
# Set environment variables
# Deploy server- β‘ Frontend First Contentful Paint: < 1s
- π Backend Response Time: < 100ms
- π Database Queries: Indexed and optimized
- π Real-time job updates
- User authentication and profiles
- Saved/bookmarked jobs
- Email job alerts
- AI-powered job recommendations
- Advanced salary analytics
- Integration with Indeed, Glassdoor
- Browser extension
- Mobile app (React Native)
This project is licensed under the MIT License - see the LICENSE file for details.
- GitHub: Monkdev7/Caliber
- Issues: GitHub Issues
- Author: Monkdev7
- React and Vite communities
- Tailwind CSS team
- Job boards for providing opportunities
- All contributors
Happy job hunting! π
Made with β€οΈ by Monkdev7