Self-hosted CV generation and management platform powered by AI
Built with React, NestJS, Bun, Prisma, PostgreSQL, and Groq AI.
- Docker Desktop installed (includes Docker Compose)
- That's it! Everything else runs in Docker.
git clone https://github.com/MohamedRamadanSaudi/cvify.git
cd cvifyCopy the .env file:
Linux/Mac:
cp .env.example .envWindows (PowerShell):
Copy-Item .env.example .envWindows (Command Prompt):
copy .env.example .envEdit .env and add your Groq API key:
GROQ_API_KEY=gsk_your_actual_key_here
Get your free API key from: https://console.groq.com
docker compose up -dDocker will automatically:
- ✅ Start PostgreSQL database
- ✅ Build React frontend with Nginx
- ✅ Build NestJS backend with Bun
- ✅ Run database migrations
- ✅ Start all services
First build takes ~3 minutes
Go to: http://localhost:3000
That's it! 🎉
What's running:
- 🌐 Frontend (React) - http://localhost:3000
- 🔧 Backend API - http://localhost:3000/api
- 🗄️ PostgreSQL - Internal (port 5432)
# View logs
docker compose logs -f
# Stop everything
docker compose down
# Restart after code changes
docker compose up -d --build
# Reset everything (⚠️ deletes all data)
docker compose down -v && docker compose up -dLinux/Mac/Windows (all shells):
docker compose exec postgres psql -U cvify -d cvify_db# Generate Prisma Client
docker compose exec backend bunx prisma generate
# Create migration
docker compose exec backend bunx prisma migrate dev --name migration_name
# Open Prisma Studio
docker compose exec backend bunx prisma studioIf you want to run without Docker:
Install Bun:
Linux/Mac:
curl -fsSL https://bun.sh/install | bashWindows:
powershell -c "irm bun.sh/install.ps1 | iex"Or visit: https://bun.sh/docs/installation
Backend:
# Install dependencies
bun install
bunx prisma generate
# Start database only
docker compose up postgres -d
# Run development server
bun run start:devFrontend:
cd frontend
npm install
npm run dev # Runs on http://localhost:5173| Variable | Description | Default | Required |
|---|---|---|---|
GROQ_API_KEY |
Your Groq API key | - | ✅ |
PORT |
Application port | 3000 | ❌ |
DATABASE_URL |
PostgreSQL connection | (auto-configured) | ❌ |
Persistent data locations:
uploads/- Generated CV filespostgres_data/- Database (Docker volume)
Port already in use?
# Edit docker-compose.yml and change:
ports:
- "8080:3000" # Use port 8080 insteadDatabase connection failed?
# Wait for DB to start, then restart:
docker compose restart appSomething broken?
# Nuclear option - reset everything:
docker compose down -v
docker compose up -d- Frontend: React + TypeScript + Vite + Nginx
- Backend: NestJS + Bun
- Database: PostgreSQL + Prisma ORM
- AI: Groq API (LLaMA models)
- PDF: PDFMake
- Deployment: Docker + Docker Compose