VPC-byte /
jobclaw
AI-powered job search agent: scrape jobs, match against a profile, draft applications, notify, and track outcomes.
Loading repository data…
morningstar1898-eng / repository
AI-powered job search assistant with 6 autonomous agents, voice integration, and real-time dashboard — built with Next.js, FastAPI, and CrewAI
A human-in-the-loop AI career operating system for data and AI job seekers.
Career OS helps find job opportunities, score job fit, draft application materials, track pipeline status, identify missing skills, generate teaching moments and interview practice, and produce daily career briefings. It began as a private single-user system and now also contains a multi-user SaaS foundation (/v1 API) with accounts, a 3-day no-card trial, plans/entitlements, and a Gmail feedback-loop scaffold.
It does not auto-submit job applications. Agents find jobs and draft materials; the user reviews everything and submits every application themselves. The pipeline enforces this in code: automation can only create Found, Saved, Drafted, or Ready to Apply records — only an explicit user action (or a confirmed application email) moves a job to Applied/Confirmation Received, and every change is recorded in event history.
Branding note: "CareerOS" is the internal name; the user-facing name is configurable via
PUBLIC_APP_NAME/NEXT_PUBLIC_APP_NAMEuntil the external SaaS brand is chosen.
| Agent | Action |
|---|---|
| Skills Scout | Scans job boards + company careers pages, extracts skill trends, logs verified postings as Found |
| Materials Drafter | Drafts tailored resume bullets + cover letters for the top roles (for the owner's review) |
| Tutor | Writes a deep daily lesson targeting the biggest skill gap |
| Data Analyst | Proposes a portfolio project concept from a real public dataset |
| Interview Coach | Generates 10 practice questions with model answers |
| Follow-up Tracker | Flags manually-applied jobs that have gone quiet for 7+ days |
| LinkedIn Optimizer (Mondays) | Audits profile keywords against the week's postings |
| Orchestrator | Compiles everything into a Notion page + emailed briefing |
The owner's daily input: read the briefing, review drafts, and decide what to actually apply to.
GitHub Actions (weekday cron) Vercel
┌─────────────────────────┐ ┌──────────────────┐
│ CrewAI crew (main.py) │ │ Next.js 16 │
│ 6-8 agents, Claude API │ │ dashboard │
│ → Notion briefing │ │ (password gate + │
│ → Google Sheets log │ │ bearer token) │
│ → Azure Blob materials │ └───────┬──────────┘
└──────────┬──────────────┘ │ REST + WS (Bearer token)
│ POST /ingest/* (token + secret) │
┌──────────▼──────────────────────────────────▼─────────┐
│ FastAPI backend — Docker container on Azure App Service│
│ SQLite (CAREER_OS_DB → persistent mount) │
│ briefings · pipeline Kanban · interview · analytics │
└────────────────────────────────────────────────────────┘
More detail: docs/ARCHITECTURE.md · Security model: docs/SECURITY.md · Demo guide: docs/RECRUITER_DEMO_CHECKLIST.md
/v1 API)Alongside the original single-user dashboard, the backend now ships a multi-user SaaS layer:
AUTH_SECRET); admin role bootstrapped via ADMIN_EMAIL and checked server-side against the database.TRIAL_DAYS), no credit card; server-side entitlement matrix for Free Demo / Trial / Starter / Pro / Premium; per-day usage limits (429s) and admin kill switches (DISABLE_AI_RUNS, DISABLE_GMAIL_SYNC, DISABLE_APPLICATION_ASSIST, DISABLE_NEW_SIGNUPS). Billing state changes only via the signature-verified Stripe webhook (docs/BILLING.md).user_id, every query filtered by the authenticated user, verified by tests. Full data export (GET /v1/me/export) and hard account deletion (DELETE /v1/me).Found), deterministic fit scoring labeled as guidance, missing-skills engine over a data/AI taxonomy, teaching moments, portfolio project recommendations./v1/admin/* overview (users, trials, usage, flags, failed runs) and in-app feedback capture.Roadmap and honest scaffold status: docs/PRODUCT_ROADMAP.md · Migration to Postgres/managed auth: docs/SAAS_MIGRATION.md · Legal drafts: docs/legal/
This is a personal tool, not a production-grade product: it is single-user, uses SQLite, and has no monitoring stack. Those limitations are documented, deliberate trade-offs.
cd backend
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt # full agent stack
cp ../.env.example ../.env # fill in your values
uvicorn api.main:app --reload # API at http://localhost:8000
To run just the API tests (no CrewAI/integrations needed):
pip install -r requirements-ci.txt
pytest tests -q
To run the agent crew once locally (spends Claude API budget):
python main.py
cd frontend
npm install
npm run dev # http://localhost:3000
npm run typecheck # tsc --noEmit
npm run lint
npm run build
backend/config/resume.txt — your resume text (used by the drafting agents)backend/config/linkedin_profile.txt — your LinkedIn text (used by the Monday optimizer)In GitHub Actions these are written at run time from the RESUME_TEXT and LINKEDIN_PROFILE_TEXT repository secrets.
See .env.example for the full annotated list. The critical ones:
| Variable | Purpose |
|---|---|
CAREER_OS_API_TOKEN | Required. Bearer token for all private API routes. Without it the API fails closed. |
CAREER_OS_PASSWORD | Dashboard login password |
INGEST_SECRET | Second factor for workflow → API ingest calls |
CAREER_OS_DB | SQLite path. Production: a persistent mount like /home/career-os/career_os.db |
ENV | production disables demo seeding routes |
PUBLIC_DEMO_MODE | true = serve ONLY a separate sanitized demo database |
ALLOW_MANUAL_RUNS | true enables the dashboard "Trigger Run" button (spends API budget) |
ALLOWED_ORIGINS | CORS allowlist (comma-separated) |
ANTHROPIC_API_KEY | Claude API for agents + interview practice |
Authorization: Bearer <token> — either the static CAREER_OS_API_TOKEN or a session token issued by the password login. /health is the only public data route. The WebSocket requires the token as a query parameter.AuthGate; the login token is attached to every API call. Frontend gating is a UX layer — the backend enforces auth independently.Found and never overwrite a manually-set status.PUBLIC_DEMO_MODE=true points the API at a separate demo database seeded only with fictitious data; demo seeding routes are never registered in production.Full details: docs/SECURITY.md.
Build Backend Image workflow → GHCR → Azure App Service (B1, always-on). Set CAREER_OS_DB=/home/career-os/career_os.db (with App Service persistent storage enabled) so the SQLite database survives redeploys. For anything beyond single-user scale, move to Azure SQL or Postgres.NEXT_PUBLIC_API_URL pointing at the backend.The database schema is created idempotently on startup (CREATE TABLE IF NOT EXISTS + additive ALTER TABLE migrations) — redeploys never drop data.
Set PUBLIC_DEMO_MODE=true (backend) and NEXT_PUBLIC_DEMO_MODE=true (frontend) to run a recruiter-safe instance: the API serves a separate demo database, and the "Load Demo Data" button seeds fictitious companies, generic roles, and sample metrics — no private pipeline, resume, or employer-sensitive data.
| Service | Cost |
|---|---|
| Claude API | ~$3–8/month |
| Azure App Service B1 | ~$13/month |
| Serper search | Free (2,500/mo) |
| GitHub Actions | Free (2,000 min/mo) |
| Azure Blob / Kaggle / Notion | Free tiers |
Selected from shared topics, language and repository description—not editorial ratings.
VPC-byte /
AI-powered job search agent: scrape jobs, match against a profile, draft applications, notify, and track outcomes.
Ayushman-Raghav /
End-to-end AI-powered job-search automation pipeline using FastAPI, n8n, Docker, Google Sheets, and local LLM scoring via Ollama
Tanmai019 /
AI-powered job search and resume optimization agent that matches roles, ranks opportunities, and adapts resumes using LLM-driven workflows.
Hira-1 /
AI-powered job search agent that scrapes 7 remote job boards, scores listings against your CV with GPT-4o-mini, researches companies, generates cover letters, and presents everything in a web dashboard