# Deployment Guide: Hugging Face Spaces This guide deploys the FastAPI app as a Hugging Face Docker Space. Hugging Face Spaces supports Docker apps, and a Docker Space is configured by adding `sdk: docker` to the YAML block at the top of the Space `README.md`. Docker Spaces commonly expose port `7860`; the app, Dockerfile, and Space metadata must all use the same port. Official references: - Hugging Face Docker Spaces: https://huggingface.co/docs/hub/main/spaces-sdks-docker - Hugging Face Spaces overview: https://huggingface.co/docs/hub/main/spaces-overview ## What Gets Deployed The Hugging Face Space should deploy the backend API and built-in analyzer UI: - `GET /` serves `app/static/index.html` - `GET /health` returns API health - `POST /analyze` rates a GitHub username The separate React documentation website in `website/` can be deployed separately as a static site. The Space deployment described here focuses on the FastAPI app. ## Prerequisites 1. A Hugging Face account. 2. Git installed locally. 3. Optional but recommended: a valid GitHub token for higher API limits. Create a GitHub token and save it as a Hugging Face Space secret named: ```text GITHUB_TOKEN ``` Public/no-token mode works, but GitHub rate limits unauthenticated requests heavily. ## Create The Space 1. Go to https://huggingface.co/spaces 2. Click **Create new Space**. 3. Choose an owner and Space name. 4. Select **Docker** as the SDK. 5. Choose public or private visibility. 6. Create the Space. ## Space README Metadata In the Hugging Face Space repository, the top of `README.md` should include: ```yaml --- title: GitHub Profile AI Reviewer emoji: 🧪 colorFrom: green colorTo: blue sdk: docker app_port: 7860 --- ``` The important lines are: ```yaml sdk: docker app_port: 7860 ``` ## Hugging Face Dockerfile Hugging Face expects the app to listen on the configured Space port. Use this Dockerfile for the Space: ```dockerfile FROM python:3.12-slim WORKDIR /app ENV PYTHONDONTWRITEBYTECODE=1 ENV PYTHONUNBUFFERED=1 ENV APP_HOST=0.0.0.0 ENV APP_PORT=7860 COPY requirements.txt ./ RUN pip install --no-cache-dir --upgrade pip \ && pip install --no-cache-dir -r requirements.txt COPY . . EXPOSE 7860 CMD uvicorn app.main:app --host "${APP_HOST}" --port "${APP_PORT}" ``` Why this differs from local Docker: - Hugging Face Docker Spaces commonly expose `7860`. - The production API does not require `torch` or `transformers`; default `requirements.txt` is enough. - `requirements-ml.txt` is optional and should not be installed unless you intentionally want the heavier ML stack. ## Environment Variables And Secrets Set these in the Hugging Face Space **Settings** tab. Secrets: ```text GITHUB_TOKEN=your_valid_github_token_here ``` Variables: ```text GITHUB_API_URL=https://api.github.com/graphql GITHUB_REST_API_URL=https://api.github.com GITHUB_PUBLIC_REPO_LIMIT=20 GITHUB_FETCH_COMMIT_COUNTS=false GITHUB_CACHE_TTL_SECONDS=900 APP_HOST=0.0.0.0 APP_PORT=7860 SCORING_BACKEND=heuristic ``` Do not commit `.env` to Hugging Face or GitHub. Use Hugging Face Space secrets for private values. ## Push Code To The Space From your local repo: ```bash git remote add hf https://huggingface.co/spaces/YOUR_USERNAME/YOUR_SPACE_NAME git push hf main ``` If your app is on another branch, push that branch to `main` on the Space: ```bash git push hf your-branch:main ``` Hugging Face rebuilds the Space automatically after each push. ## Test The Deployed App After the Space finishes building: ```text https://YOUR_USERNAME-YOUR_SPACE_NAME.hf.space/ ``` Health check: ```text https://YOUR_USERNAME-YOUR_SPACE_NAME.hf.space/health ``` Analyze request: ```bash curl -X POST https://YOUR_USERNAME-YOUR_SPACE_NAME.hf.space/analyze \ -H "Content-Type: application/json" \ -d '{"username":"octocat"}' ``` Expected response includes: ```json { "username": "octocat", "rating_score": 72, "public_activity": { "public_commits": 18, "public_prs_created": 4 }, "model_info": { "data_source": "graphql" } } ``` ## Troubleshooting ### Space stuck on Starting Check that all three ports match: - Space README: `app_port: 7860` - Dockerfile: `EXPOSE 7860` - Uvicorn command: `--port 7860` ### GitHub API rate limit exceeded Add a valid `GITHUB_TOKEN` as a Hugging Face Space secret and restart/rebuild the Space. ### Bad credentials Your `GITHUB_TOKEN` is invalid or expired. Replace it in Space secrets, then restart the Space. ### Module import errors Make sure `requirements.txt` is installed in the Dockerfile. Do not rely on local virtual environments. ### Heavy image or slow build Use the lightweight `requirements.txt`. Avoid installing `requirements-ml.txt` unless you actually need `torch`, `transformers`, and `langgraph`. ## React Documentation Website The React documentation website lives in `website/`. To deploy it separately: ```bash cd website npm install npm run build ``` Deploy `website/dist/` to a static host such as Hugging Face Static HTML Space, Netlify, Vercel, or GitHub Pages. If deploying the React docs to a Hugging Face Static HTML Space, configure the Space as Static HTML and upload the built `dist/` contents.