An AI-powered academic assistant that reads Canvas data, syllabus content, and student schedules to create personalized daily study plans. Every morning, it sends students a clear study plan through Telegram, and during breaks between classes, it recommends the best lesson to review and gives a short quiz.
Students have:
- Deadlines scattered across Canvas
- Syllabus info hidden in PDFs
- Small breaks between classes that get wasted
- No clear idea what to study first
- No personalized daily plan
Studentify solves this by automatically creating smart study recommendations based on:
- Canvas deadlines & grades
- Syllabus exam/quiz dates
- Class schedule breaks
- Weak subject detection
- Time-of-day availability
- Python 3.9+
- Node.js 16+
- Canvas API token (from your school)
- Telegram Bot token
- Supabase account (free tier works)
git clone <your-repo>
cd studentify
cp .env.example .env
# Fill in your credentials in .env# Terminal 1: Backend
cd backend
pip install -r requirements.txt
python main.py
# Terminal 2: Frontend (in new terminal)
cd frontend
npm install
npm start
# Terminal 3: Bot (in new terminal)
cd bot
python telegram_bot.pyBackend runs on http://localhost:8000
Frontend runs on http://localhost:3000
studentify/
├── backend/
│ ├── main.py # FastAPI entry point
│ ├── canvas_integration.py # Canvas API wrapper
│ ├── database.py # Supabase client
│ ├── routes.py # API router composition
│ ├── api_routes/ # Split endpoint modules by domain
│ ├── models.py # Pydantic schemas
│ ├── syllabus_parser.py # Syllabus PDF extraction + events
│ ├── priority_engine.py # Priority scoring + daily plan builder
│ ├── break_detector.py # Schedule gap detection
│ ├── time_fitter.py # Fits study items into break lengths
│ ├── quiz_generator.py # Quiz creation logic
│ ├── utils.py # Priority scoring + helpers
│ ├── requirements.txt
│ └── .env (ignored)
│
├── frontend/
│ ├── src/
│ │ ├── pages/
│ │ │ ├── Landing.tsx
│ │ │ ├── Onboarding.tsx
│ │ │ ├── onboarding/ # Split onboarding step components
│ │ │ └── Dashboard.tsx
│ │ ├── components/
│ │ ├── App.tsx
│ │ └── index.css
│ ├── package.json
│ └── tailwind.config.js
│
├── bot/
│ ├── telegram_bot.py # Bot commands
│ ├── message_formatter.py # Message templates
│ ├── requirements.txt
│ └── .env (ignored)
│
├── .env.example # Copy to .env
├── .gitignore
└── README.md (this file)
Copy .env.example to .env and fill in:
# Canvas
CANVAS_API_KEY=your_canvas_token_here
CANVAS_API_URL=https://your-school.instructure.com
# Supabase
SUPABASE_URL=https://xxxxx.supabase.co
SUPABASE_KEY=your_anon_key_here
# Telegram
TELEGRAM_BOT_TOKEN=123456:ABCdef-1234567890abcdefgh
# OpenAI (for quiz generation)
OPENAI_API_KEY=sk-...
# Frontend
REACT_APP_API_URL=http://localhost:8000id, name, email, canvas_token, telegram_chat_id, created_atid, user_id, canvas_course_id, course_name, created_atid, user_id, course_id, title, due_date, type, points, status, created_atid, user_id, course_id, title, event_type (exam/quiz/deadline), event_date, topic, created_atid, user_id, day_of_week, start_time, end_time, class_name, created_atid, user_id, date, topic, reason, time_block, created_at| Method | Endpoint | Purpose |
|---|---|---|
| POST | /connect/canvas |
Validate & store Canvas token |
| GET | /courses |
Get user's courses |
| GET | /today-plan |
Get today's study plan |
| GET | /break-recommendation |
Get next break suggestion |
| POST | /upload/syllabus |
Upload & parse syllabus PDF |
| POST | /schedule |
Save class schedule |
| POST | /telegram/send-morning-plan |
Trigger morning message |
| Command | Purpose |
|---|---|
/start |
Welcome & onboarding link |
/today |
Show today's plan |
/nextquiz |
When's the next quiz? |
/weakest |
What are my weak areas? |
/quizme |
Get a quick quiz |
Good morning! Here's your plan for today:
• 10:30–11:00 AM: Review STAT 200 hypothesis testing
• 1:20–1:35 PM: Quick CMPSC 131 practice
• 3:15–3:35 PM: Review Cyber notes for upcoming quiz
• 8:00–8:30 PM: Finish reading for AI-100
Top priority today: STAT 200 midterm is in 2 days.
You have 25 minutes before your next class.
Best lesson to review: Hypothesis testing p-values
Reason: Upcoming exam in 2 days + low recent quiz score
Quick Quiz
1. What does a small p-value suggest?
A) strong evidence against null
B) null is proven true
C) sample size is small
Reply with A, B, or C.
| Layer | Tech | Why |
|---|---|---|
| Backend | FastAPI | Fast, modern, great for AI apps |
| Database | Supabase + Postgres | Real-time, free tier |
| Frontend | React + Tailwind | Clean, fast, responsive |
| Bot | python-telegram-bot | Easy to use |
| PDF Parsing | PyPDF2 | Simple, reliable |
| AI | OpenAI API | Quiz generation, summarization |
| Canvas | canvasapi | Official wrapper |
| Risk | Backup |
|---|---|
| Canvas API issues | Use mocked Canvas JSON data |
| Syllabus parsing messy | Support structured text input |
| Telegram timing hard | Manual trigger buttons |
| Weak-subject detection complex | Grade-by-course fallback |
- Canvas API Docs: https://canvas.instructure.com/doc/api/
- Supabase Docs: https://supabase.com/docs
- Telegram Bot API: https://core.telegram.org/bots/api