CareerPilot
Self-hosted AI career assistant: target companies, public career URLs, job leads, applications, interview prep plans, reminders, backups, and weekly reporting. Configure LLM keys and secrets in .env only (never commit — see SECURITY.md).
License: MIT.
Screenshots (placeholders)
Screenshots live under docs/images/. Add PNGs and uncomment or replace the lines below.
Product boundaries
- Supported: user-configured public
http(s)career pages. - Not supported: LinkedIn / Indeed / Glassdoor automation, login-gated boards, or scraping policy violations.
Prerequisites
| Tool | Role |
|---|---|
| Docker + Compose v2 | MySQL (and optional full stack) |
| JDK 21 | Backend ./gradlew |
| Node.js 18+ (20+ recommended) | Frontend |
| Python 3.11+ | Scripts (pip install -r scripts/requirements.txt) |
Maintainers / AI assistants: see PROJECT_CONTEXT.md for architecture and handoff rules.
Quick start (clone → run)
git clone <your-fork-or-upstream-url>
cd careerpilot-local
cp .env.example .env
# Required: set JWT_SECRET (e.g. openssl rand -hex 32). Do not use empty or change-me* values.
Option A — Full stack in Docker (recommended first run)
docker compose up --build -d
| Service | Default URL |
|---|---|
| Web app | http://localhost:3000 (FRONTEND_PORT) |
| API | http://localhost:8080 (BACKEND_PORT) |
| MySQL | localhost:3306 |
Health: curl -s http://localhost:8080/health · curl -s http://localhost:3000/health · docker compose ps
Stop: docker compose down. Erase DB volume: docker compose down -v.
Option B — MySQL in Docker, backend + Vite on host
./scripts/local-up.sh
Frontend: http://localhost:5173 · API: http://localhost:8080.
First-time database: Compose applies database/schema.sql + database/seed.sql on a new volume. Optional login: demo@careerpilot.local / demo12345 — see database/README.md.
Demo flow (guided tour)
Step-by-step commands and UI path: docs/demo.md.
- Register (or use seeded demo user).
- Add a target company (public careers URL).
- Run
job_watcheronscripts/examples/mock_careers_page.html. - Generate an interview plan in
AI_PROVIDER=mock. - Save a job lead as an application.
- Update application status (Kanban / Applications).
- Run
generate_weekly_report.py. - Run
backup_database.py.
Documentation
| Doc | Purpose |
|---|---|
docs/demo.md |
End-to-end demo + reset |
docs/troubleshooting.md |
Common errors |
docs/local-setup.md |
Detailed local & Compose setup |
docs/ai-setup.md |
AI keys, mock mode, privacy |
docs/interview-plan-api.md |
Interview plan REST |
docs/backup-and-restore.md |
Backups |
docs/database-schema.md |
Tables |
SECURITY.md |
Secrets policy, reporting |
Configuration
.env.example— template only; copy to.env(gitignored). Scripts also readSCRIPTS_EMAIL/SCRIPTS_PASSWORDorSCRIPTS_API_TOKEN— see.env.exampletail.frontend/.env.example—VITE_*for host dev.
Quality checks & CI
make test # backend tests + frontend typecheck/lint/build + Python smoke
make test creates scripts/.venv-test and installs Python test dependencies automatically.
GitHub Actions: .github/workflows/ci.yml.
Tech stack
- Backend: Kotlin, Ktor, Gradle, MySQL (H2 in tests)
- Frontend: React 18, TypeScript, Vite
- Scripts: Python (
scripts/) - Deploy:
docker-compose.yml,Makefile
Repo layout
careerpilot-local/
PROJECT_CONTEXT.md # maintainer handoff context
SECURITY.md
LICENSE
README.md # this file
.env.example
Makefile
docker-compose.yml
database/ # schema.sql, seed.sql
backend/
frontend/
scripts/
docs/
tests/ # pytest smoke (Day 29)
.github/workflows/
Git hygiene (optional)
./scripts/install-git-hooks.sh
Strips Co-authored-by: / Made-with: trailers so commits stay single-author if you want.
Roadmap / status
Feature status and backlog: PROJECT_CONTEXT.md §4–§7.
