Project Info
Inspiration
Every student has Canvas. Every student also has calendar anxiety. Assignments pile up. Deadlines sneak up. Syllabi live as PDFs you open once and forget. Canvas technically has a calendar—but it’s cluttered, passive, and disconnected from how students actually manage their time. We kept asking the same question: Why doesn’t my calendar just know what’s due? Why can’t Google Calendar already understand my classes, my assignments, my exams, and the reality that I need time to walk across campus, time to study, and time to breathe? We, and basically every friend we talked to, were frustrated by how much mental effort it takes just to stay oriented. That lack of clarity hurts productivity, increases stress, and ultimately affects academic performance. So we built CanvasCal for the UCSC community: a tool that doesn’t just list deadlines, but actively helps you plan around them.
What it does
📆 Smart Academic Calendar Pulls assignments, due dates, and announcements directly from Canvas Displays everything cleanly in one place One-click export to Google Calendar, so deadlines actually live where students plan their lives 🤖 AI Syllabus Parser Drag-and-drop any syllabus PDF Gemini-powered OCR extracts: Class meeting times Exams & midterms Office hours Important academic dates Class meeting times Exams & midterms Office hours Important academic dates Turns static documents into structured, usable data 💬 Academic Agent (Chatbot) Natural language interface for your calendar Ask things like: “When can I study for CSE 101?” “Add a study block before my midterm.” “Delete my 8am lab on Friday.” “When can I study for CSE 101?” “Add a study block before my midterm.” “Delete my 8am lab on Friday.” Reads your schedule, finds free time, and updates events intelligently 🗺️ Campus Travel Logic (Prototype) Calculates realistic buffer time between UCSC campus locations Prevents impossible back-to-back events across campus
How we built it
🧩 Frontend Framework: Next.js (React) + TypeScript Styling: Tailwind CSS Icons: Lucide Deployment: Vercel Optimized for speed, accessibility, and zero friction 🧠 Backend Framework: FastAPI (Python 3.11+) AI Model: Google Gemini 2.0 Flash PDF Processing: PyMuPDF Integrations: Canvas API ☁️ Infrastructure Database: Supabase (PostgreSQL) Security: Row Level Security (RLS) Built to scale safely as usage grows
Challenges we ran into
Syllabus Variability: There is no standard syllabus format. PDFs included scans, tables, multi-column layouts, and inconsistent date phrasing, which made reliable extraction non-trivial. Syllabus Variability: There is no standard syllabus format. PDFs included scans, tables, multi-column layouts, and inconsistent date phrasing, which made reliable extraction non-trivial. LLM Reliability: Model output could not be trusted directly. We had to constrain responses to fixed schemas and validate all extracted fields before creating calendar events. LLM Reliability: Model output could not be trusted directly. We had to constrain responses to fixed schemas and validate all extracted fields before creating calendar events. Event Consistency: Combining Canvas sync, syllabus events, and user edits caused duplication and overwrite issues early on. Ensuring idempotent writes and stable identifiers was required to keep the calendar coherent. Event Consistency: Combining Canvas sync, syllabus events, and user edits caused duplication and overwrite issues early on. Ensuring idempotent writes and stable identifiers was required to keep the calendar coherent. Vague Prompts: User prompts were often incomplete or vague. Resolving relative times and underspecified actions required additional parsing and fallback logic. Vague Prompts: User prompts were often incomplete or vague. Resolving relative times and underspecified actions required additional parsing and fallback logic. Inference Latency: PDF parsing and LLM calls added noticeable delay. We had to reduce prompt size, limit context, and avoid unnecessary calls to keep interactions responsive. Inference Latency: PDF parsing and LLM calls added noticeable delay. We had to reduce prompt size, limit context, and avoid unnecessary calls to keep interactions responsive. Travel Time Estimation: Campus navigation is context-dependent. A fully accurate model was out of scope, so we implemented a lightweight approximation that still prevented impossible schedules. Travel Time Estimation: Campus navigation is context-dependent. A fully accurate model was out of scope, so we implemented a lightweight approximation that still prevented impossible schedules. Access Control: Calendar data is sensitive. Supabase RLS policies had to be carefully scoped to prevent cross-user access. Access Control: Calendar data is sensitive. Supabase RLS policies had to be carefully scoped to prevent cross-user access. Time Constraints: Building a modular system while shipping a working product during a hackathon required constant trade-offs. Time Constraints: Building a modular system while shipping a working product during a hackathon required constant trade-offs.
Accomplishments we're proud of
Extracting structured academic data from real-world, messy syllabi Building a usable AI agent instead of a demo chatbot Making Canvas data actually actionable Designing a system that feels helpful, not overwhelming Shipping a fully working end-to-end product during a hackathon 😤
What we learned
We've gained deeper understanding of how UI should be dealt with and how our targeted audience should affect our design. Academic data is highly unstructured in practice. Syllabi vary wildly in format so we learned how to extract the same data from a variety of them. Integrating AI into productivity tools requires strong guardrails Real-time calendar systems needs careful building. Users expect instant, low-latency interactions from AI agents, which significantly influences architectural decisions. Privacy and data isolation are foundational when dealing with academic records, making row-level security and scoped access essential. Effective time management systems must reason about context (travel time, workload density, availability), not just store events.
What's next
Voice Agent Integration Hands-free scheduling and calendar edits Voice Agent Integration Hands-free scheduling and calendar edits Two-Way Google Calendar Sync Updates flow both directions in real time Two-Way Google Calendar Sync Updates flow both directions in real time Smart Study Recommendations Auto-suggest study blocks based on workload and deadlines Smart Study Recommendations Auto-suggest study blocks based on workload and deadlines Deeper Canvas Support Quizzes, discussions, grading windows, and announcements Deeper Canvas Support Quizzes, discussions, grading windows, and announcements Personalized Time Intelligence Learns from user behavior to improve scheduling over time Personalized Time Intelligence Learns from user behavior to improve scheduling over time
CanvasCal 📅
CruzHacks 2026
CanvasCal is an AI-native productivity ecosystem designed to bridge the gap between academic requirements and daily action. By integrating directly with Canvas LMS and utilizing Gemini-powered OCR for syllabus parsing, it automatically transforms static course documents into an intelligent, active schedule.
🚀 Features
- 🤖 AI Syllabus Parser: Drag & drop a PDF syllabus, and our Gemini 2.0 parser extracts dates, exams, and assignments with high precision.
- 💬 Academic Agent: A natural language chatbot that can check your schedule, add study blocks, and find free time ("When can I study for CSE 101?").
- 🔗 Canvas Integration: Live sync with Canvas API to pull real-time assignment due dates and announcements.
- 🗺️ Campus Travel Logic: (Prototype) Intelligent buffers that calculate travel time between UCSC campus locations.
- ☁️ Supabase Backend: Secure, scalable event storage with Row Level Security (RLS).
🛠️ Architecture
Frontend (/frontend)
- Framework: Next.js (React) with TypeScript
- Styling: Tailwind CSS + Lucide Icons
- Deployment: Vercel / Local Vite (for dev)
Backend (/backend)
- Framework: FastAPI (Python 3.11+)
- AI Model: Google Gemini 2.0 Flash
- Database: Supabase (PostgreSQL)
- PDF Processing: PyMuPDF
📦 Setup Guide
Prerequisites
- Node.js 18+ & npm/pnpm
- Python 3.11+
- Supabase Account
- Google AI Studio API Key
1. Backend Setup
cd backend
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
Create a .env file in /backend:
PROJECT_NAME="CanvasCal"
BACKEND_CORS_ORIGINS=["http://localhost:5173"]
# Integrations
GEMINI_API_KEY="your_gemini_key"
CANVAS_API_URL="https://canvas.instructure.com" # or your school's instance
CANVAS_ACCESS_TOKEN="your_canvas_token"
# Database
SUPABASE_URL="your_supabase_url"
SUPABASE_KEY="your_supabase_anon_key"
2. Frontend Setup
cd frontend
npm install
Create a .env.local in /frontend:
NEXT_PUBLIC_API_URL="http://localhost:8000"
3. Database Schema
Run the SQL found in backend/schema.sql in your Supabase SQL Editor to create the necessary tables.
4. Running the App
We have a unified start script for convenience:
./start.sh
This will launch:
- Backend: http://localhost:8000 (Docs: /docs)
- Frontend: http://localhost:5173
🧪 Testing
Run the backend test suite:
cd backend
pytest tests/
👥 Contributors
- Max Ratcliff
- Sharanya Ramanujan
- Jiya Sawarkar
- Tarun Nagaraju
Built for CruzHacks 2026
Analysis
View
Metric
- 18
- 3
- 1
- 1
Figures cover GitHub contributors during the hackathon window. A co-authored commit counts in full for each author, so per-member totals add up to more than the whole-team figures.
Technology
- CSSIn code
- FastAPIIn code
- HTMLIn code
- Next.jsIn code
- PythonIn code
- ReactIn code
- SQLIn code
- SupabaseIn code
- Tailwind CSSIn code
- TypeScriptIn code
10 of 10 appear in the indexed code.
AI coding agents
No AI coding agent signals were found in this repository.
Detected from committed agent config files and commit authorship. Absence of a signal is not proof an agent was unused.
Codebase size
Source size
421 KB
Source files
124
Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.
Repository
Max-Ratcliff/CanvasCal
148 files · 773 KB · @ 4ac9016
Structure
Interface
81 files · 55%Screens, components and styles rendered to the user.
API & routing
6 files · 4%Request entry points: routes, handlers and controllers.
Application logic
10 files · 7%Domain rules, services and shared utilities.
Data & schema
4 files · 3%Schema definitions, migrations and data access.
Supporting
Layers are inferred from where files sit in the tree, not from reading the code. A project that names its directories unconventionally will read oddly here — open the file browser to check anything the diagram implies.
Languages
- TypeScript59%
- Python24%
- CSS8%
- Markdown8%
- SQL1%
- Shell0%
- Other (1)0%
Share of indexed source by file size. Binary and vendored files are excluded.
Dependencies
frontend/package.json
npm · 60- @hookform/resolvers
- @radix-ui/react-accordion
- @radix-ui/react-alert-dialog
- @radix-ui/react-aspect-ratio
- @radix-ui/react-avatar
- @radix-ui/react-checkbox
- @radix-ui/react-collapsible
- @radix-ui/react-context-menu
- @radix-ui/react-dialog
- @radix-ui/react-dropdown-menu
- @radix-ui/react-hover-card
- @radix-ui/react-label
- @radix-ui/react-menubar
- @radix-ui/react-navigation-menu
- @radix-ui/react-popover
- @radix-ui/react-progress
- @radix-ui/react-radio-group
- @radix-ui/react-scroll-area
- +42 more
frontend_v1_backup/package.json
npm · 45- @radix-ui/react-accordion
- @radix-ui/react-alert-dialog
- @radix-ui/react-aspect-ratio
- @radix-ui/react-avatar
- @radix-ui/react-checkbox
- @radix-ui/react-collapsible
- @radix-ui/react-context-menu
- @radix-ui/react-dialog
- @radix-ui/react-dropdown-menu
- @radix-ui/react-hover-card
- @radix-ui/react-label
- @radix-ui/react-menubar
- @radix-ui/react-navigation-menu
- @radix-ui/react-popover
- @radix-ui/react-progress
- @radix-ui/react-radio-group
- @radix-ui/react-scroll-area
- @radix-ui/react-select
- +27 more
backend/requirements.txt
pypi · 14- canvasapi
- fastapi
- google-api-python-client
- google-auth-oauthlib
- google-genai
- httpxcryptography
- pydantic
- pydantic-settings
- PyMuPDF
- pytest
- python-dotenv
- python-multipart
- supabase
- uvicorn
Declared in the repository’s manifests at the indexed commit. A declared package is not proof it is used, and runtime dependencies are listed first.
This project’s features have not been analysed yet.
Export this project's context (description, README, evidence, key source files) to chat with an AI agent elsewhere.