A modern, feature-rich web application to track and manage your job search with automated email notifications and browser extension for quick-add from job sites.
- π Dual View Modes - Switch between Grid and Kanban board layouts
- π Statistics Dashboard - Track response rate, interviews, and success metrics
- π¨ Dark Mode - Beautiful light and dark themes
- πΎ Export/Import - Save your data as JSON or CSV
- π Search & Filter - Find applications by company, position, or status
- π± Responsive Design - Works on desktop, tablet, and mobile
- Automated Follow-up Reminders - Get email reminders before follow-up dates
- Daily Digest - Optional summary of upcoming follow-ups
- Beautiful HTML Emails - Professional, branded email templates
- Smart Scheduling - Reminders checked daily at 9 AM and every 6 hours
- Customizable Settings - Configure reminder timing and preferences
- One-Click Add - Add applications directly from job sites
- Auto-Extract Details - Automatically fills company, position, location, and salary
- Supported Sites:
- β LinkedIn Jobs
- β Indeed
- β Greenhouse
- π§ More coming soon
- Works Offline - Data saved locally even without internet
# Install dependencies
npm install
# Run frontend
npm run devVisit http://localhost:5173 and start tracking applications!
See the Complete Setup Guide for detailed instructions on:
- Setting up email notifications with Gmail
- Installing the browser extension
- Configuring MongoDB (optional)
Quick Version:
- Create
.envfile (copy from.env.example) - Add your Gmail credentials
- Run both frontend and backend:
npm run dev:full
- Setup Guide - Complete setup instructions with troubleshooting
- Browser Extension Guide - Extension installation and usage
- React 19 - Modern UI library with latest hooks
- Vite 6 - Lightning-fast build tool and dev server
- Tailwind CSS 4 - Utility-first CSS framework
- React Hooks - State management
- Express.js - Web server framework
- Nodemailer - Email sending service
- Node-cron - Scheduled task runner
- Mongoose - MongoDB object modeling (optional)
- Manifest V3 - Latest extension standard
- Content Scripts - Job site data extraction
- Service Workers - Background processing
opportune/
βββ backend/ # Express backend for email notifications
β βββ server.js # Main server file
β βββ models/ # MongoDB models (User, Application)
β βββ routes/ # API routes (notifications, applications)
β βββ services/ # Email and notification services
β βββ config/ # Configuration files
β
βββ browser-extension/ # Chrome/Firefox extension
β βββ manifest.json # Extension configuration
β βββ popup/ # Extension popup UI
β β βββ popup.html
β β βββ popup.css
β β βββ popup.js
β βββ content-scripts/ # Job site scrapers
β β βββ linkedin.js
β β βββ indeed.js
β β βββ greenhouse.js
β βββ background.js # Service worker
β
βββ src/ # React frontend
β βββ components/ # Reusable UI components
β β βββ ApplicationForm.jsx
β β βββ KanbanBoard.jsx
β β βββ MainCard.jsx
β β βββ Statistics.jsx
β β βββ NotificationSettings.jsx # NEW
β β βββ Toast.jsx
β β βββ ThemeToggle.jsx
β β βββ ...
β βββ pages/ # Page components
β β βββ LandingPage.jsx
β βββ context/ # React context providers
β β βββ ThemeContext.jsx
β βββ App.jsx # Main app component
β βββ main.jsx # Entry point
β
βββ .env.example # Example environment variables
βββ .env # Your environment variables (create this)
βββ package.json # Dependencies and scripts
βββ vite.config.js # Vite configuration
βββ tailwind.config.js # Tailwind configuration
βββ README.md # This file
βββ SETUP_GUIDE.md # Detailed setup instructions
- Click "New Application"
- Fill in job details
- Set a follow-up date (optional)
- Click "Save"
- Go to a job posting on LinkedIn or Indeed
- Click the Opportune extension icon
- Click "Extract from Page"
- Review and adjust details
- Click "Add to Tracker"
- Click the bell icon in the header
- Enter your email address
- Configure notification preferences:
- Enable/disable email notifications
- Set reminder timing (1-7 days before)
- Enable daily digest (optional)
- Save settings
- Edit: Click the edit icon on any application card
- Delete: Click the delete icon and confirm
- Change Status: Drag cards between columns in Kanban view
- Search: Use the search bar to find applications
- Filter: Filter by status or sort by date/company
- Click "Export" button
- Choose format:
- JSON - Full backup with all data
- CSV - Spreadsheet format for Excel
- Applied - Application submitted
- Waiting - Awaiting response
- Interview - Interview scheduled or completed
- Accepted - Offer received
- Rejected - Application declined
# Development
npm run dev # Run frontend only
npm run server # Run backend only
npm run dev:full # Run both frontend and backend
# Production
npm run build # Build frontend for production
npm run preview # Preview production build
# Other
npm run lint # Run ESLint code lintingThe backend provides these endpoints:
GET /api/notifications/settings/:email- Get user notification settingsPUT /api/notifications/settings/:email- Update notification settingsPOST /api/notifications/check- Manually trigger reminder checkGET /api/notifications/verify- Verify email configuration
GET /api/applications/:userId- Get all applications for a userPOST /api/applications- Create new applicationPUT /api/applications/:id- Update applicationDELETE /api/applications/:id- Delete applicationPOST /api/applications/sync- Bulk sync applications
- Local-First: All data stored locally in your browser by default
- Optional Backend: Email and database features are completely optional
- No Tracking: No analytics or third-party tracking
- Open Source: Full transparency - review the code yourself
- Your Credentials: Email credentials stored in
.env(never committed) - App Passwords: Uses Gmail App Passwords for enhanced security
- Verify
.envfile exists and has correct Gmail credentials - Ensure 2-Step Verification is enabled on Google account
- Check that you're using an App Password, not your regular password
- Restart the backend server after changing
.env
- Make sure you're on a job posting page (not search results)
- Wait for page to fully load before clicking "Extract"
- Some sites have anti-scraping measures - fill manually if needed
- Refresh the dashboard page
- Check browser console for errors (F12)
- Ensure localStorage is enabled in browser settings
For more troubleshooting help, see the Setup Guide.
MIT License - feel free to use this project for personal or commercial purposes.
- Interview preparation notes
- Resume version tracking
- Calendar integration
- Analytics dashboard with charts
- Application templates
- More job site support (Glassdoor, ZipRecruiter)
- Mobile app
- Collaboration features
Found a bug? Have a feature request? Open an issue or submit a pull request!
Track smarter. Land faster.