Instructor-facing dashboard to grade PRs against team PRDs.
Made with Cursor, based on my PRD
- Team selector for CS210 project repos
- PRD upload (file or Google Drive link)
- Overall progress summary
- P0/P1 recommendations
- PR summaries timeline (score + summary per PR)
- Force refresh and nightly backfill actions
- "Talk to Autograder (Experimental)" panel
git clone <your-repo-url>
cd 210_autograder
cp backend/.env.example backend/.envEdit backend/.env and set at minimum:
GITHUB_TOKEN=<token-with-access-to-cs210-private-repos>
Optional for better summaries:
OPENROUTER_API_KEY=<your-key>andLLM_PROVIDER=openrouter
docker compose up --buildOpen:
http://127.0.0.1:8000
Docker stores SQLite data in a persistent named volume (autograder_data).
docker compose downcd backend
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
uvicorn app.main:app --reloadOpen:
http://127.0.0.1:8000
GITHUB_TOKENis required for most CS210 team repos (private org repos).- If force refresh fails with repo access errors, verify token permissions and org authorization.
Recommended token permissions:
- Private repo read access
- Pull requests read
- Contents read
- Metadata read
Choose one:
- OpenRouter free model (easiest)
LLM_PROVIDER=openrouterOPENROUTER_API_KEY=<key>OPENROUTER_MODEL=meta-llama/llama-3.1-8b-instruct:free(default)
- Local Ollama
- Install Ollama app
- Run
ollama pull llama3.1 - Keep Ollama running on
http://localhost:11434 - Set
LLM_PROVIDER=ollama
If no LLM is reachable, app falls back to heuristic summaries and shows warning text.
See backend/.env.example.
Important values:
GITHUB_TOKENMAX_PRS_PER_TEAM(default 40)AUTO_IMPORT_CS210_TEAMS(default true)LLM_PROVIDER(auto,openrouter,ollama,heuristic)OPENROUTER_API_KEYOPENROUTER_MODELOLLAMA_URLOLLAMA_MODEL
For each new admin:
- Pull latest code
- Copy env and add their own token
- Start with Docker (
docker compose up --build) - Open dashboard and click
Force Refreshon a team - Confirm summaries populate
GET /healthzreturns{"status":"ok"}
- Backend: FastAPI + SQLite
- Main entrypoint:
backend/app/main.py - Core grading logic:
backend/app/services.py - GitHub/LLM integrations:
backend/app/integrations.py