GRASP is a web application that helps UBC instructors turn course materials into evidence-based formative assessments. Instructors upload lecture content, generate and review AI-authored questions, and publish quizzes; students get spaced, adaptive, and elaborative practice — all behind UBC Single Sign-On.
- AI question generation — Upload lecture material (text, PDF, DOCX, URLs) and generate evidence-based questions grounded in your content via a retrieval-augmented (RAG) pipeline.
- Multiple question types — Multiple choice, fill-in-the-blank, calculation, and open-ended questions, with support for math (KaTeX) and chemistry (SMILES) rendering.
- Question review & banking — Review, edit, flag, and organize generated questions in a per-course question bank before they reach students.
- Quizzes & scoring — Build quizzes from the bank, publish them to students, and track scores and quiz summaries.
- Student practice experience — A dedicated student dashboard with quizzes, achievements, and adaptive practice.
- Course materials & onboarding — Manage uploaded materials per course and guide new instructors through setup.
- User management — Faculty can view and manage course members.
- UBC SSO — SAML-based Single Sign-On / Single Log-Out, with role-based access (faculty / staff / student).
- Frontend: React 18, Vite, Tailwind CSS, React Router, TanStack Query, Zustand
- Backend: Node.js, Express 5
- Database: MongoDB
- AI / RAG: UBC GenAI Toolkit (LLM, embeddings, chunking, RAG), Qdrant vector store, OpenAI or Ollama as the LLM provider
- Auth: Passport + SAML (UBC Shibboleth)
- Testing: Cypress (end-to-end)
tlef-grasp/
├── client/ # React frontend (Vite + Tailwind)
│ ├── src/ # pages, components, hooks, stores
│ ├── dist/ # built assets, served in production (committed)
│ └── cypress/ # end-to-end tests
├── src/ # Express backend
│ ├── server.js # server entry (API + serves client/dist)
│ ├── routes/ # API + auth route definitions
│ ├── controllers/ # request handlers
│ ├── services/ # business logic, data access, RAG
│ ├── models/ # question models
│ └── middleware/ # auth, session, passport, database
├── .env.example # environment variable template
├── package.json # backend dependencies and scripts
└── README.md # this file
- Node.js 18+
- npm
- A running MongoDB instance
- A running Qdrant instance (for the question-generation vector store)
- An LLM provider — an OpenAI API key, or a local Ollama server
- For login: a SAML Identity Provider. For local development this is typically the
docker-simple-samlproject.
Install backend and frontend dependencies:
npm install
npm --prefix client installCopy the template and fill in your values:
cp .env.example .envnpm run devThis runs the Express backend (port 8070) and the Vite dev server (port 5173)
in parallel. The Vite dev server proxies /api, /auth, and /Shibboleth.sso
requests to the backend, so you only need to open the frontend.
Visit http://localhost:5173/ in your browser. You'll be taken through SSO and into the dashboard.
Backend (run from the project root):
npm run dev— Start backend + frontend together (development).npm run dev:server— Start only the Express backend (with nodemon).npm run dev:client— Start only the Vite frontend.npm run build— Build the React client intoclient/dist.npm start— Run the production server (serves the built client fromclient/distat port8070).
Frontend (run from client/):
npm run lint/npm run format— Lint / format the client source.npm run cypress:open/npm run test:e2e— Run end-to-end tests. See client/cypress/README.md for setup.
This project is owned by the Learning Technology Innovation Centre (LTIC) at the University of British Columbia. All rights reserved.