AI-assisted job matching for resume-driven job search. The app stores resumes in Supabase Storage, keeps structured career profile data, syncs real company jobs from Greenhouse into PostgreSQL, ranks opportunities with pgvector + OpenAI, and supports interview prep content managed by admins.
- Google OAuth login
- Email registration and login
- Cookie-based access and refresh sessions
adminanduserroles- Resume upload, replace, download, and delete
- Supabase Storage resume backend
- Career Profile free-text input with AI field extraction
- Manual Match refresh
- Greenhouse company source configuration and sync
- Opportunity storage in PostgreSQL
- pgvector embeddings for resumes and opportunities
- Structured prefilter + vector recall + batched LLM reranking
- Match list/detail with skill fit and apply state
- Application tracker with a dated stage timeline, manual entries, one-click tracking from a match, stage/type/region filters, and CSV export
- Cover letter generation on demand
- Daily Tasks based on current matches
- Daily match digest emails via SendGrid, with delivery logs and once-per-day idempotency
- Interview Prep library
- Admin user management
- Admin email delivery log and test send
- Admin Greenhouse source management
- Admin interview experience CRUD, review workflow, JSON import, filters
- User signs in with Google or email.
- User uploads a PDF resume.
- User fills Career Profile in natural language.
- Admin configures Greenhouse company sources and syncs jobs.
- User clicks
Run Match. - Backend ranks synced opportunities and creates matches/tasks.
- User opens a match, reviews fit, related interview prep, and generates a cover letter only when needed.
Backend:
- FastAPI
- SQLAlchemy async
- Alembic
- PostgreSQL + pgvector
- Supabase Storage
- OpenAI embeddings and GPT ranking
- LangChain / LangGraph
Frontend:
- React
- TypeScript
- Vite
- Tailwind CSS
- React Router
Infrastructure:
- Railway backend and frontend services
- Supabase Postgres and Storage
- GitHub auto-deploy
Backend:
cd backend
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
alembic -c alembic.ini upgrade head
uvicorn app.main:app --reloadFrontend:
cd frontend
npm install
npm run devLocal URLs:
- Frontend:
http://localhost:5173 - Backend health:
http://localhost:8000/health - Backend docs:
http://localhost:8000/docs
Minimum backend variables:
DATABASE_URL=postgresql+asyncpg://...
JWT_SECRET_KEY=change-this
OPENAI_API_KEY=sk-...
FRONTEND_URL=http://localhost:5173
BACKEND_CORS_ORIGINS=http://localhost:5173Recommended production variables:
STORAGE_BACKEND=supabase
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_SERVICE_ROLE_KEY=...
SUPABASE_RESUME_BUCKET=resumes
GOOGLE_CLIENT_ID=...
GOOGLE_CLIENT_SECRET=...
GOOGLE_REDIRECT_URI=https://your-frontend-domain/api/auth/google/callback
AUTH_COOKIE_SECURE=true
AUTH_COOKIE_SAMESITE=lax
ADMIN_EMAILS=admin@example.comFull reference:
Yes, the backend needs OPENAI_API_KEY for the full product:
- Resume embedding
- Career Profile extraction
- Opportunity embedding during Greenhouse sync
- Match LLM reranking
- Cover letter generation
Without a key, auth and basic CRUD may still start, but resume processing, sync embeddings, matching, and cover letters will fail or degrade.
Alembic is used for schema management.
Local:
cd backend
alembic -c alembic.ini upgrade headRailway:
- The backend Dockerfile runs
alembic -c alembic.ini upgrade headbefore Uvicorn starts. - You can confirm current DB revision in Supabase:
select version_num from alembic_version;Admins configure company sources in Admin:
source_type:greenhousecompany_name: display nameboard_token: Greenhouse board token, for exampleairbnb
Sync behavior:
- Fetches Greenhouse Job Board API
- Upserts jobs into
opportunities - Marks missing jobs closed
- Stores sync logs
- Generates opportunity embeddings when possible
Current pipeline:
- Load latest resume and Career Profile effective fields.
- Load open synced opportunities.
- Use structured filters for company exclusions, internship intent, keywords, location, and remote preference.
- Use resume embedding to recall opportunity embeddings.
- Rank candidates and keep a bounded top-N.
- Batch LLM rerank candidates.
- Save
UserJobMatchrows and Daily Tasks. - Generate cover letter only when user clicks
Generate.
Default knobs:
MATCH_THRESHOLD=70
MIN_THRESHOLD=30
THRESHOLD_STEP=5
TARGET_JOBS=10
MATCH_LLM_RERANK_LIMIT=20
MATCH_LLM_BATCH_SIZE=10Auth:
POST /api/auth/registerPOST /api/auth/loginPOST /api/auth/logoutPOST /api/auth/refreshGET /api/auth/meGET /api/auth/google/loginGET /api/auth/google/callback
Applications:
GET /api/applicationsGET /api/applications/exportPOST /api/applicationsPATCH /api/applications/{id}DELETE /api/applications/{id}POST /api/applications/{id}/eventsDELETE /api/applications/{id}/events/{event_id}
Resume:
GET /api/resumePOST /api/resumeDELETE /api/resume
Career Profile:
GET /api/preferencesPOST /api/preferencesPOST /api/preferences/analyzePATCH /api/preferences/fields
Matches:
GET /api/jobsGET /api/jobs/{id}POST /api/jobs/refreshPOST /api/jobs/{id}/cover-letterPUT /api/jobs/{id}/apply
Interview Prep:
GET /api/interview-experiences
Admin:
GET /api/admin/usersPATCH /api/admin/users/{id}/roleGET /api/admin/company-sourcesPOST /api/admin/company-sourcesPATCH /api/admin/company-sources/{id}PATCH /api/admin/company-sources/{id}/deactivatePOST /api/admin/company-sources/{id}/syncGET /api/admin/source-sync-runsGET /api/admin/interview-experiencesPOST /api/admin/interview-experiencesPOST /api/admin/interview-experiences/importPATCH /api/admin/interview-experiences/{id}PATCH /api/admin/interview-experiences/{id}/statusDELETE /api/admin/interview-experiences/{id}
Scheduler is intentionally disabled by default:
ENABLE_SCHEDULER=falseOnly enable it on a dedicated scheduler/worker instance later:
ENABLE_SCHEDULER=trueDo not enable scheduler on every web replica.
Completed:
- P0 infrastructure and profile refactor
- P1 Auth/RBAC/stability
- P2 core data model and IA
- P2.5 frontend visual consistency
- P3 Greenhouse integration
- P4 matching pipeline upgrade
- P5 interview prep workflow, filters, match association, import
Deferred:
- Forgot Password
- Email verification strategy
- Dedicated scheduler/worker
- Redis/arq evaluation
- Monitoring, audit logs, email notifications