Automatically apply to internships with AI! Just add your resume and run one command.
- Scrapes job boards (Jobright, Intern List) every 5 minutes
- Ranks jobs based on your resume (AI scoring)
- Shows jobs on beautiful web dashboard with fit scores
- Auto-applies using Gemini AI + browser automation
- Saves proof - screenshots and action logs for every application
Create my_resume.json in this folder:
{
"name": "Your Name",
"contacts": {
"email": "[email protected]",
"phone": "+1-234-567-8900",
"location": "Your City, State"
},
"education": [
{
"school": "Your University",
"degree": "BS Computer Science",
"grad": "2026"
}
],
"skills": ["Python", "JavaScript", "SQL", "React"],
"projects": [
{
"name": "Cool Project",
"tech": ["Python", "FastAPI"],
"bullets": ["Built something awesome", "Improved by 50%"]
}
],
"constraints": {
"locations": ["US-remote", "San Francisco"],
"visa": "US Citizen",
"preferred_roles": ["Software Engineer Intern"]
}
}Copy .env.example to .env and add your keys:
cp .env.example .envEdit .env:
- Add your Gemini API Key (get at aistudio.google.com)
- Add your Gemini API Key (get from aistudio.google.com)
- (Optional) Configure storage (GCS or S3) for saving application proofs
./start.shThat's it! The script will:
- Build Docker containers
- Start PostgreSQL + Redis
- Start API + Workers
- Load your resume
- Begin monitoring jobs
Open your browser and go to:
You'll see a beautiful dashboard with:
- π Real-time statistics
- π― Job listings with fit scores
- π·οΈ Matched keywords
- β/β One-click approve/reject buttons
Also available:
- API Docs: http://localhost:8000/docs
- Health Check: http://localhost:8000/healthz
- Every 5 minutes, the system checks job boards for new postings
- AI Ranking: Each job is scored against your resume (0-100%)
- Dashboard Review: High-scoring jobs (β₯65%) appear on the dashboard
- Your Decision: Click β Yes, Apply or β No, Skip
- Auto-Apply: If approved, Gemini AI fills out the application
- Proof Saved: Screenshots and logs saved to
artifacts/{job_id}/
docker compose logs -fdocker compose stopdocker compose restartdocker compose down -v
./start.shJob Sources β Scraper β Database β AI Ranking β Slack Notification
β
You Click Yes
β
Gemini AI + Playwright Apply
β
Save Proof + Logs
β
Auto-polling - Checks for new jobs every 5 minutes
β
AI scoring - Ranks jobs 0-100% fit with your resume
β
Web dashboard - Beautiful UI to review and approve jobs
β
Auto-yes mode - Skip prompts for high-fit jobs (β₯85%)
β
Smart form filling - Gemini AI fills out applications
β
Full audit trail - Screenshots + action logs
β
Safety limits - Daily caps, allowlist, CAPTCHA detection
β
Cloud storage - Saves proof to GCS/S3
Skip the manual review for high-scoring jobs:
curl -X POST http://localhost:8000/settings/auto-yes \
-H "Content-Type: application/json" \
-d '{"auto_yes_enabled": true, "auto_yes_threshold": 0.85}'Edit .env:
FIT_THRESHOLD=0.65- Minimum score to show on dashboardAUTO_YES_THRESHOLD=0.85- Auto-apply above this scoreMAX_SUBMITS_PER_DAY=10- Daily application limit
Edit app/jobs/ to add new scrapers.
- Allowlist only - Only applies to approved ATS domains
- Daily limits - Max 10 applications per day (configurable)
- CAPTCHA detection - Stops if CAPTCHA found (no bypass)
- Kill switch - Set
KILL_SWITCH=trueto stop all applications - Truth only - Never fabricates resume data
sudo systemctl start docker- Wait 5 minutes (polling interval)
- Check logs:
docker compose logs -f worker - Update HTML selectors in
app/jobs/jobright_fetcher.pyif needed
- Check API is running:
curl http://localhost:8000/healthz - View API logs:
docker compose logs -f api - Restart:
docker compose restart api
- Check
artifacts/{job-id}/for screenshots - View logs:
docker compose logs -f worker - Try dry-run first: see API docs at
/docs
- Containers: postgres, redis, api, worker, beat
- Volumes: Database storage (persists after restart)
- Artifacts:
./artifacts/- All application screenshots + logs - User Data:
./user_data_dirs/- Browser profiles per company
- Backend: FastAPI + Python 3.11
- Database: PostgreSQL 15
- Cache: Redis 7
- Workers: Celery
- Browser: Playwright + Chromium
- AI: Gemini 2.5 Flash
- Notifications: Slack SDK
- Storage: GCS or S3
GET /healthz- Health checkPOST /profile- Update resumePOST /settings/auto-yes- Configure auto-applyPOST /dry-run/apply- Test without submittingGET /jobs- List jobsGET /applications- View history
See full docs at http://localhost:8000/docs
my_resume.json- Your resume (you create this).env- Your API keys (copy from .env.example)docker compose.yml- Service definitionsDockerfile- Container buildstart.sh- One-command setupapp/- Python application code
Questions? Check the API docs or view logs:
# API logs
docker compose logs -f api
# Worker logs
docker compose logs -f worker
# All logs
docker compose logs -fBuilt with β€οΈ for automated job hunting