ResumeAI is a full-stack SaaS application that helps users create professional resumes with AI-powered enhancements. Build, customize, and export resumes in PDF format with job-specific tailoring.
- 📝 Visual Resume Editor - User-friendly interface for editing resume content
- 🤖 AI-Powered Tailoring - Automatically customize resumes for specific job postings
- 📄 PDF Export - Generate professional PDF resumes
- 🎨 Template System - Multiple resume templates to choose from
- 💼 Job Applications - Track and manage job applications
- 📦 Resume Packages - Generate tailored resume packages
ResumeAI consists of two main components:
| Component | Technology | Description |
|---|---|---|
| Frontend | React 19 + TypeScript + Vite | Single Page Application |
| Backend | FastAPI + Python | REST API with resume generation |
For detailed architecture documentation, see CLAUDE.md.
Before running ResumeAI, ensure you have the following installed:
- Node.js (v18+) - Download
- Python: 3.11 or 3.12 (Python 3.14 is NOT supported due to PyMuPDF compatibility)
- LaTeX - Required for PDF generation
- macOS:
brew install texlive - Ubuntu:
sudo apt-get install texlive-latex-base - Windows: TeX Live
- macOS:
- Docker (optional) - For containerized deployment
# Clone the repository
git clone https://github.com/anchapin/ResumeAI.git
cd ResumeAI
# Install dependencies
npm install
# Create local environment file
cp .env.example .env.local
# Configure environment variables
# Edit .env.local and add your API keys (see Configuration section)
# Start development server
npm run devThe frontend will be available at http://localhost:5173
# Navigate to API directory
cd resume-api
# Create virtual environment (optional but recommended)
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install Python dependencies
pip install -r requirements.txt
# Create environment file
cp .env.example .env
# Configure environment variables
# Edit .env and add your API keys
# Start the API server
python main.pyThe API will be available at http://127.0.0.1:8000
# Build and run the backend container
cd resume-api
docker-compose up
# Or build manually
docker build -t resume-api:latest .
docker run -p 8000:8000 resume-api:latestResumeAI provides a docker-compose.local.yml file for setting up local development services including PostgreSQL, Redis, and the API.
- Docker installed and running
- Docker Compose installed
# Copy the example environment file
cp .env.local.example .env.local
# Start all local services (PostgreSQL, Redis, API)
docker-compose -f docker-compose.local.yml up -d
# View logs
docker-compose -f docker-compose.local.yml logs -f
# Stop all services
docker-compose -f docker-compose.local.yml down| Service | Port | Description |
|---|---|---|
| PostgreSQL | 5432 | Local database |
| Redis | 6379 | Cache backend |
| API | 8000 | ResumeAI API |
| Frontend | 5173 | Vite dev server (optional) |
To also run the frontend in the local stack:
# The frontend service is disabled by default
# To enable, edit docker-compose.local.yml and uncomment the frontend service
# Or run frontend locally with npm
npm run devThe .env.local.example file contains all required variables. Key settings:
DATABASE_URL: PostgreSQL connection stringREDIS_URL: Redis connection stringCACHE_BACKEND: Set toredisto use Redis cachingREQUIRE_API_KEY=false: Disable API key auth for local development
# API Configuration
VITE_API_URL=http://127.0.0.1:8000
# AI Provider (optional - uses default if not set)
GEMINI_API_KEY=your_gemini_api_key_here# AI Configuration
AI_PROVIDER=openai # Options: openai, claude, gemini
AI_MODEL=gpt-4o
OPENAI_API_KEY=sk-...
ANTHROPIC_API_KEY=sk-...
GEMINI_API_KEY=...
# API Authentication
MASTER_API_KEY=rai_your_master_api_key_here
REQUIRE_API_KEY=true # Set to false for development
# GitHub OAuth Configuration (REQUIRED)
GITHUB_CLIENT_ID=your_github_client_id_here
GITHUB_CLIENT_SECRET=your_github_client_secret_here
GITHUB_REDIRECT_URI=http://localhost:5173/auth/github/callback
# Server
HOST=0.0.0.0
PORT=8000
DEBUG=false-
Register a GitHub OAuth App:
- Go to https://github.com/settings/developers
- Click "New OAuth App"
- Fill in the application details:
- Application name:
ResumeAI - Homepage URL:
http://localhost:5173(for development) - Application description:
Resume builder with GitHub integration - Authorization callback URL:
http://localhost:8000/github/callback
- Application name:
- Copy the Client ID and Client Secret
-
Configure Environment Variables:
- Add
GITHUB_CLIENT_IDandGITHUB_CLIENT_SECRETto your.envfile - Set
GITHUB_REDIRECT_URIto match your deployment environment
- Add
-
Frontend OAuth Configuration (.env.local):
# Backend API URL VITE_API_URL=http://127.0.0.1:8000
ResumeAI uses GitHub OAuth for secure authentication and integration:
- User clicks "Connect GitHub" in the settings or sync dialog
- Frontend requests OAuth URL from backend (
GET /github/connect) - User is redirected to GitHub to authorize the application
- GitHub redirects back to the callback endpoint with authorization code
- Backend exchanges code for access token (
GET /github/callback) - Token is encrypted and stored in the database
- User can now sync GitHub projects and manage their repositories
GET /github/connect- Initiate OAuth authorization flowGET /github/callback- Handle OAuth callback from GitHubGET /github/status- Check current GitHub connection statusGET /github/repositories- Fetch user's GitHub repositoriesDELETE /github/disconnect- Disconnect GitHub account and revoke token
For detailed API documentation, see API_DOCUMENTATION.md.
Once the backend is running:
- Swagger UI: http://127.0.0.1:8000/docs
- ReDoc: http://127.0.0.1:8000/redoc
For detailed API documentation, see API_DOCUMENTATION.md.
ResumeAI maintains 60% minimum code coverage for both frontend and backend. Coverage is automatically checked on all PRs.
# Frontend tests
npm test # Run tests in watch mode
npm run test:coverage # Run tests with coverage report
# Backend tests (from project root)
cd resume-api
python -m pytest # Run all tests
python -m pytest --cov=resume-api --cov-report=html # Run with coverageFor detailed coverage information and how to improve test coverage, see COVERAGE_GUIDE.md.
| Command | Description |
|---|---|
npm run dev |
Start development server |
npm run build |
Build for production |
npm run preview |
Preview production build |
npm test |
Run tests |
npm run test:coverage |
Run tests with coverage report |
npm run docs |
Generate TypeScript documentation |
cd resume-api
# Run development server
python main.py
# Run tests
pytest
# Test specific module
python -m pytest tests/test_validation.pyThe frontend is deployed to Vercel. See VERCEL_DEPLOYMENT.md for detailed instructions.
Quick deploy:
npm install -g vercel
vercel --prodThe backend can be deployed to Google Cloud Run. See resume-api/CLOUDRUN_DEPLOYMENT.md for instructions.
ResumeAI/
├── src/ # React frontend
│ ├── components/ # Reusable UI components
│ ├── pages/ # Page components
│ ├── hooks/ # Custom React hooks
│ ├── utils/ # Utility functions
│ ├── types.ts # TypeScript types
│ └── App.tsx # Main app component
├── resume-api/ # FastAPI backend
│ ├── api/ # API routes and models
│ ├── config/ # Configuration
│ ├── lib/ # CLI integration
│ ├── templates/ # Resume templates
│ ├── main.py # FastAPI entry point
│ └── Dockerfile # Container configuration
├── tests/ # Frontend tests
├── docs/ # Generated documentation
├── CLAUDE.md # Developer documentation
└── package.json # Node.js configuration
- Create a feature branch:
git checkout -b feature/your-feature - Make your changes and commit them
- Push to the branch:
git push origin feature/your-feature - Create a Pull Request
See CLAUDE.md for detailed Git workflow guidelines.
ResumeAI includes a devcontainer configuration for reproducible development environments. This is the recommended way to develop as it sets up all dependencies automatically.
- Docker installed and running
- Visual Studio Code installed
- Dev Containers extension installed
- Open in VS Code: Open the project in VS Code
- Reopen in Container: Click "Reopen in Container" when prompted (or press
F1and select "Dev Containers: Reopen in Container") - Wait for Setup: The container will install all dependencies automatically:
- Node.js 20 with npm
- Python 3.11 with pip
- GitHub CLI
- All required VS Code extensions
The devcontainer provides:
-
Debugging Configurations:
- React frontend debugging (Chrome, Firefox)
- FastAPI backend debugging with hot reload
- Frontend and backend unit test debugging
- E2E test debugging with Playwright
- Full-stack combined debugging
-
VS Code Extensions:
- ESLint & Prettier for code quality
- Tailwind CSS support
- Python (Pylance, Black, Flake8, Pytest)
- Docker support
- GitLens for version control
-
Pre-configured Settings:
- Format on save enabled
- ESLint auto-fix on save
- Python testing with pytest
- Organized imports on save
| Target | Description |
|---|---|
React: Chrome |
Debug frontend in Chrome |
React: Firefox |
Debug frontend in Firefox |
Python: FastAPI (ResumeAPI) |
Debug backend with hot reload |
Python: Current File |
Debug currently open Python file |
Python: Pytest |
Debug pytest tests |
Debug Tests |
Debug frontend vitest tests |
Debug Current Test File |
Debug current test file |
E2E Tests |
Run Playwright E2E tests |
Full Stack Debug |
Debug both frontend and backend together |
To run both frontend and backend:
- Start the backend using
Python: FastAPI (ResumeAPI)debug configuration - Start the frontend using
React: Chromedebug configuration - Or use the
Full Stack Debugcompound configuration to run both at once
- 5173: Frontend (Vite dev server)
- 8000: Backend (FastAPI)
The devcontainer automatically forwards these ports and notifies you when they're available.
If you prefer to develop locally without containers, follow the manual setup instructions in the Installation section above.
ResumeAI includes a devcontainer configuration for reproducible development environments:
- Open in VS Code: Open the project in VS Code
- Reopen in Container: Click "Reopen in Container" when prompted (or press
F1and select "Dev Containers: Reopen in Container") - Wait for Setup: The container will install all dependencies automatically
The devcontainer includes:
- Node.js 20 with npm
- GitHub CLI
- All required VS Code extensions (ESLint, Prettier, Python, Docker)
- Pre-configured linting and formatting on save
-
Verify GitHub OAuth App credentials:
- Check that
GITHUB_CLIENT_IDandGITHUB_CLIENT_SECRETare correctly set - Ensure your OAuth App exists at https://github.com/settings/developers
- Check that
-
Check callback URL:
- Make sure
GITHUB_REDIRECT_URIin backend.envmatches the authorization callback URL in your GitHub OAuth App
- Make sure
-
Clear browser session:
- Clear browser cookies and localStorage
- Try connecting again
-
Check backend logs for detailed error messages:
docker logs <container_id>
Ensure LaTeX is installed:
# macOS
brew install texlive
# Ubuntu
sudo apt-get install texlive-latex-base- Verify the backend is running:
curl http://127.0.0.1:8000/health - Check CORS settings in backend
- Ensure
VITE_API_URLis correct in frontend.env.local
# Clear node_modules and reinstall
rm -rf node_modules
npm install
# Clear cache
rm -rf dist
npm run buildIf you see warnings about CLI mode:
- Update to the latest version
- Use OAuth for authentication
- See the GitHub Integration section above for setup instructions
MIT License - See LICENSE for details.
- CLAUDE.md - Detailed developer documentation
- VERCEL_DEPLOYMENT.md - Frontend deployment guide
- API_DOCUMENTATION.md - API reference
- resume-api/README.md - Backend documentation
