A full-stack web application for managing linear algebra coursework and tracking academic performance. The repository uses a pnpm monorepo with shared packages for the React client, Express API server and PostgreSQL database layer.
• Google Authentication (Supabase OAuth) – every user gets a private, isolated workspace secured with JWTs.
• Minimal Public Landing Page – unauthenticated visitors see a sleek hero section and can sign-in; authenticated users are redirected to their dashboard.
• Semester & GPA Tracking – server-side GPA aggregation ensures a single source of truth; instant React visualisations powered by React-Query caching.
• Exam Calendar – create, edit and track upcoming exams with a calendar-first UI.
• Digital Library – upload PDFs to Supabase Storage; AI (Gemini) extracts title/author/TOC for quick navigation.
• AI-assisted Parsing – paste transcript text or UF "class card" HTML and the parser auto-creates semesters + courses.
• Syllabus Auto-Upload – when creating classes, uploaded syllabus files are automatically saved to Materials with proper categorization.
• Inline Class Creation – create new classes on-the-fly during exam creation with an intelligent Combobox interface.
• Real-time WebSocket Worker – background queue (packages/queues) ready for long-running tasks like OCR or summarisation.
client/ React frontend
server/ Express backend
db/ Database schema and migrations
shared/ Shared types and utilities
packages/ Reusable packages (e.g. queues)
tests/ Unit and integration tests
See the architecture document for a detailed breakdown of the updated stack.
- Node.js 20+
- pnpm (
npm install -g pnpm) - PostgreSQL
- Install dependencies
pnpm install
- Create a
.envfile in the project root with your database connectionDATABASE_URL=postgresql://user:password@localhost:5432/database
- Start the development servers
pnpm dev
pnpm dev– run client and server in development modepnpm build– build all packagespnpm db:push– apply database migrationspnpm db:seed– seed the databasepnpm lint– run ESLintpnpm format– run Prettierpnpm check– TypeScript type checkingpnpm test– run the test suite
The repository uses ESLint, Prettier and Husky pre-commit hooks to maintain consistent code style. TypeScript strict mode ensures type safety across all packages.
- Fork the repository and create a feature branch.
- Make your changes and ensure all tests pass.
- Submit a pull request for review.
MIT
The new Course Materials system lets you upload and view PDFs, Word docs (DOCX), Excel workbooks (read-only placeholder), and images.
- Fire up the API + web client:
pnpm dev
- In a separate terminal run the AI queue worker (embeddings):
pnpm queue:worker
- Open
http://localhost:5173→ Materials page → upload a file. The viewer automatically shows progress while OpenAI embeddings are generated in the background.
- Files are stored in Supabase Storage bucket materials at
materials/{userId}/{uuid}.{ext}. - Metadata lives in
course_materialstable with soft delete and RLS identical tobooks. - Background job type
material-embedding(BullMQ, Redis) extracts text (pdf.js/mammoth) then stores vectors inmaterial_page_embeddingsfor semantic search. - Front-end hooks (
useMaterials,useAddMaterial…) leverage React Query and invalidation. - Unified
<DocumentViewer/>chooses PDF or DOCX renderer automatically; sidebar supports live editing.
See
architecture/assignments_implementation_plan.mdfor a diagram contrasting the textbooks and course materials flows.
When creating a new class through /classes/new, any uploaded syllabus files are automatically saved to the Materials section with:
- Title:
#[Class Name] Syllabus - Category:
Syllabus - Auto-organization: Files appear immediately in the class's materials for easy access
To disable this feature (e.g., for storage cost concerns), set the environment variable:
VITE_AUTO_SYLLABUS_UPLOAD=falseThe exam creation page now supports intelligent class creation with AI-powered syllabus processing:
Enable the workflow with an environment variable:
VITE_INLINE_CLASS_CREATE=true- Smart Detection: When saving exams, the system identifies classes that don't exist yet
- User Choice: An AlertDialog prompts with two options:
- "Create & Save": Automatically creates missing classes and processes any available syllabus content
- "Skip": Saves exams without creating classes
- Background Processing: New classes trigger automatic syllabus analysis to extract assignments
- Real-time Feedback: Toast notifications inform users when syllabus processing completes
- Streamlined Workflow: No need to pre-create classes before entering exam data
- Automatic Enrichment: Syllabus content becomes assignments automatically
- User Control: Choose when to create classes vs. proceed with existing data
- Cache Consistency: All course lists update immediately after class creation
This feature eliminates workflow friction while maintaining data integrity and providing intelligent defaults.