GitGud is a full-stack application that generates resume-worthy CV entries from a user's GitHub repositories and inserts them into a LaTeX résumé. It combines GitHub OAuth login, repository analysis, a multi-layer scoring pipeline, and automated LaTeX editing.
- Built with FastAPI and Python.
- Stores users, repositories, suggestions, and CV documents in PostgreSQL.
- Uses Celery with Redis for background work.
- Uses GitHub OAuth to authenticate users and access repositories.
- Analyzes repositories in three stages:
- Rule-based quality filtering.
- Groq-based domain detection and scoring against the user's career profile.
- Groq-based CV suggestion generation.
- Stores original uploaded
.texCV files in MinIO. - Uses LaTeX editing and PDF compilation to insert selected projects into the user's CV.
- Receives GitHub webhooks to keep repository data synced and reanalyzed after changes.
- Built with React, Vite, Tailwind CSS, and React Router.
- Provides login flow, dashboard, repository list, suggestion review, CV upload/edit, and settings.
- Uses JWT tokens stored in
localStorage. - Protects authenticated routes and refreshes user state from the backend.
- Docker Compose runs PostgreSQL, Redis, MinIO, backend, worker, beat, and frontend.
start.ps1helps start the full stack and optionally reset app state.
- GitHub OAuth login and user management.
- Repository synchronization and webhook handling.
- Multi-layer repository analysis.
- CV suggestion generation from repository content.
- Upload LaTeX CV source and parse career profile.
- Insert selected project entries into LaTeX CV source using an LLM.
- Compile resulting LaTeX into PDF.
- Manage suggestion approval, rejection, and CV settings.
-
backend/app/main.py: FastAPI application entrypoint.app/core/: configuration, database, authentication, dependencies.app/api/routes/: API routes for auth, CV, repositories, suggestions, webhooks.app/models/: SQLAlchemy models for users, repositories, suggestions, CV documents.app/services/: GitHub integration, scoring, Groq requests, LaTeX editing, storage.app/workers/: Celery worker configuration and tasks.alembic/: database migrations.pyproject.toml: Python dependencies and packaging.
-
frontend/src/main.jsx: React entrypoint.src/App.jsx: routes and providers.src/context/AuthContext.jsx: auth state and token management.src/components/: reusable layout and navigation components.src/pages/: application pages.package.json: frontend dependencies and scripts.
-
docker-compose.yml: orchestrates services. -
start.ps1: starts services and optionally resets state.
- Docker and Docker Compose installed.
.envconfigured with required environment variables.- GitHub OAuth app credentials.
- Groq API key(s).
Set the following in .env or equivalent environment:
SECRET_KEYPOSTGRES_PASSWORD(used by docker-compose for thedbservice; must match the password inDATABASE_URL)DATABASE_URLREDIS_URLGITHUB_CLIENT_IDGITHUB_CLIENT_SECRETGITHUB_REDIRECT_URIGITHUB_WEBHOOK_SECRETGROQ_API_KEYGROQ_API_KEYS(optional comma-separated extras)GROQ_MODEL(fast model for CV parsing and Layer 2 scoring; defaultllama-3.1-8b-instant)GROQ_MODEL_SMART(stronger model for Layer 3 CV-entry generation and LaTeX editing; defaultllama-3.3-70b-versatile)MINIO_ROOT_PASSWORD(used by docker-compose for theminioservice; must matchMINIO_SECRET_KEY; use a different password thanPOSTGRES_PASSWORD)MINIO_ENDPOINTMINIO_ACCESS_KEYMINIO_SECRET_KEYMINIO_BUCKETWEBHOOK_BASE_URL
See .env.example for a full template.
From the repository root:
.\
start.ps1This:
- builds backend and frontend containers,
- starts PostgreSQL, Redis, MinIO, backend, worker, beat, and frontend,
- runs
alembic upgrade headautomatically before the backend, worker, and beat start (seebackend/entrypoint.sh), so no manual migration step is needed, - waits for backend readiness,
- prints frontend/backend/MinIO URLs.
POSTGRES_PASSWORD/MINIO_ROOT_PASSWORDerrors ondocker compose up: both are required in.env— copy.env.exampleand set real values. The password insideDATABASE_URLmust matchPOSTGRES_PASSWORD, andMINIO_SECRET_KEYmust matchMINIO_ROOT_PASSWORD.- Login 500s /
relation "users" does not exist: migrations did not run. They run automatically on container start; if you see this on an older checkout, rundocker compose exec backend alembic upgrade head(orpoetry run alembic upgrade headfor local runs) and retry. - Stale database after changing
POSTGRES_PASSWORD: the existingpostgres_datavolume keeps the old password. Run.\start.ps1 -Reset(ordocker compose down -v) to recreate it.
docker compose down.\start.ps1 -ResetThis resets database tables, Redis cache, Celery beat state, and MinIO bucket contents.
From backend/:
poetry install
poetry run alembic upgrade head
poetry run uvicorn app.main:app --host 0.0.0.0 --port 8000 --reloadThe alembic upgrade head step is required for local (non-Docker) runs — the Docker containers do it automatically via backend/entrypoint.sh.
Visit http://localhost:8000/docs for API docs.
From frontend/:
pnpm install
pnpm run devVisit http://localhost:5173.
The default suggestion threshold has been set to 30 for new users.
- The current workflow uses the original
.texupload as source of truth. - CV download rebuilds a PDF from LaTeX after inserting approved suggestions.
- GitHub repo sync is automatic via polling and webhooks.