A modern, full-stack web application for tracking job applications with an intuitive UI built with Vue.js and PrimeVue.
- β Complete CRUD Operations: Create, read, update, and delete job applications
- β Rich Data Tracking: Company name, position, location, job type/level, status, dates, notes
- β Modern UI: Built with PrimeVue v4 components and Aura theme
- β Data Persistence: PostgreSQL database with automatic schema creation
- β Containerized: Fully Dockerized application with single-command deployment
- β Production Ready: Gunicorn WSGI server, nginx reverse proxy, health monitoring
- Docker (version 20.10+)
- Docker Compose (version 2.0+)
- Bun (optional, for local frontend development)
# Navigate to project directory
cd /root/projects/JobApplicationTracker
# Generate environment configuration
chmod +x scripts/setup_env.sh
./scripts/setup_env.shThe setup script will:
- Auto-generate secure passwords and secret keys
- Prompt for application host (default:
localhost:8080) - Prompt for optional Google Tag Manager ID
- Create a
.envfile with all configuration
# Build and start all services
docker compose up --buildThis will start:
- PostgreSQL 16 database
- Flask backend with Gunicorn (Python 3.12)
- Vue 3 frontend with PrimeVue v4
- Nginx reverse proxy
Open your browser and navigate to:
http://localhost:8080
# View backend logs
docker compose logs -f backend
# Access backend container
docker compose exec backend bash
# Run database migrations (if needed)
docker compose exec backend python -c "from app.database import db; from app import create_app; app = create_app(); app.app_context().push(); db.create_all()"For local development with hot-reload:
cd frontend
bun install
bun run devThe dev server will start at http://localhost:5173 with API proxying to the backend.
# Access PostgreSQL CLI
docker compose exec postgres psql -U tracker_user -d job_tracker
# Backup database
docker exec job_tracker_postgres pg_dump -U tracker_user job_tracker > backup.sql
# Restore database
docker exec -i job_tracker_postgres psql -U tracker_user job_tracker < backup.sqlBackend:
- Python 3.12
- Flask (web framework)
- SQLAlchemy (ORM)
- PostgreSQL 16 (database)
- Gunicorn (WSGI server)
Frontend:
- Vue 3 (framework)
- PrimeVue v4 (UI library, Aura theme)
- Vite (build tool)
- Bun (package manager)
- Axios (HTTP client)
Infrastructure:
- Docker & Docker Compose
- Nginx (reverse proxy)
- Single Docker network (
job_tracker_network)
JobApplicationTracker/
βββ backend/
β βββ app/
β β βββ __init__.py # Flask app factory
β β βββ config.py # Configuration
β β βββ database.py # SQLAlchemy setup
β β βββ models.py # Database models
β β βββ routes.py # API endpoints
β βββ Dockerfile
β βββ requirements.txt
β βββ gunicorn.conf.py
βββ frontend/
β βββ src/
β β βββ components/ # Vue components
β β βββ services/ # API service
β β βββ App.vue # Root component
β β βββ main.js # Vue app entry
β βββ Dockerfile
β βββ package.json
β βββ vite.config.js
βββ nginx/
β βββ nginx.conf.template # Nginx config with env vars
β βββ Dockerfile
βββ scripts/
β βββ setup_env.sh # Environment setup script
βββ .env.example # Environment variables template
βββ docker-compose.yml # Docker orchestration
βββ README.md
All API endpoints are prefixed with /api/:
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/health |
Health check |
| GET | /api/applications |
List all applications |
| POST | /api/applications |
Create new application |
| GET | /api/applications/<id> |
Get single application |
| PUT | /api/applications/<id> |
Update application |
| DELETE | /api/applications/<id> |
Delete application |
# Health check
curl http://localhost:8080/api/health
# Create application
curl -X POST http://localhost:8080/api/applications \
-H "Content-Type: application/json" \
-d '{
"company_name": "Acme Corp",
"position_title": "Senior Developer",
"location": "Remote",
"job_type": "Full-time",
"status": "Applied"
}'
# List all applications
curl http://localhost:8080/api/applications# Stop all services
docker compose down
# Stop and remove volumes (WARNING: deletes all data)
docker compose down -v# Find and kill process using port 8080
lsof -ti:8080 | xargs kill -9
# Or change APP_HOST in .env to use different port# Check if PostgreSQL is running
docker compose ps postgres
# View PostgreSQL logs
docker compose logs postgres
# Restart PostgreSQL
docker restart postgres# Rebuild nginx container
docker compose up --build nginx
# Check nginx logs
docker compose logs nginxAll configuration is managed through the .env file:
| Variable | Description | Default |
|---|---|---|
APP_HOST |
Application hostname | localhost:8080 |
POSTGRES_DB |
Database name | job_tracker |
POSTGRES_USER |
Database user | tracker_user |
POSTGRES_PASSWORD |
Database password | Auto-generated |
SECRET_KEY |
Flask secret key | Auto-generated |
BACKEND_CORS_ORIGIN |
CORS origin | http://localhost:8080 |
GTM_ID |
Google Tag Manager ID | Empty |
- Never commit
.envto version control - Auto-generated secrets use cryptographically secure random generation
- CORS is configured to only allow requests from configured origin
- Input validation on both frontend and backend
- Resume and cover letter uploads
- Document storage in Docker volumes
- File download functionality
- OpenAI job description parsing
- Automatic field extraction
- AI-powered resume/cover letter feedback
- JWT-based authentication
- User session management
- Protected routes
- In-browser PDF/DOCX viewing
- Analytics dashboard
- Advanced filtering and search
This project is proprietary.
This is a personal project. For inquiries, please contact the repository owner.