Project Info
Inspiration
Many professors often use different platforms to host their course which makes organizing your schedule a painstaking process. At the same time, manually inputting your schedules into Google Calendar is an almost unreasonable process. So we need a system that allows us to keep track of our schedules without requiring a massive amount of effort.
What it does
The tool works by pushing information gathered from syllabi into organized Google calendars.
How we built it
Backend: Python and Flask the basic framework, we also used Google Calendar API to add events to the calendar, as well as Gemini API for NLP and event parsing, and ICS export (icalendar used to send ics to Google Calendar API) Frontend: The main user interface is currently an HTML page, which uses: JavaScript , Google Identity Services for OAuth (client-side sign-in and API calls) Modern HTML/CSS for UI (no React or Tailwind in the current codebase)
Challenges we ran into
Calendar Titling. Internet latency, which in turn delayed api calls, making the whole testing process very slow. Long wait times for the parser. The events/tasks on the Google Calendar would often have issues with the dates.
Accomplishments we're proud of
Since the wait time was kind of annoying, we developed a built-in flappy bird game that allows you to play as the parser processes the syllabi information. Additionally, we added a Dark Mode feature since the white-and-blue theme was a bit hard to look at throughout the night.
What we learned
How to set up APIs, how to effectively use git.
What's next
We've noticed whenever an AI agent is embedded in a program (specifically for the projects we've seen here), the wait times are usually a bit longer than expected. We think that Earlybird can expand to an extension that allows one to play a short game while any program loads. On the actual product side, we also want to create an extension that automatically detects if there is a syllabus/work schedule on your webpage. You would then simply click on the extension to automatically update your Google Calendar.
π Syllabus to Calendar Converter
A web application that extracts events and tasks from academic syllabi and automatically creates them in Google Calendar using AI-powered parsing.
Features
- π€ AI-Powered Parsing: Uses Google Gemini AI to intelligently extract events from syllabi
- π PDF Support: Upload syllabi as .txt or .pdf files
- π Smart Categorization: Distinguishes between events (lectures, labs, exams) and tasks (assignments, projects)
- π Timezone Support: Automatically detects and uses your local timezone
- π Google Calendar Integration: Direct integration with Google Calendar
- π¨ Modern UI: Clean, responsive web interface
Quick Start
Prerequisites
- Python 3.8+
- Google account
- Gemini API key (free tier available)
1. Install Dependencies
pip install -r requirements.txt
2. Setup Google Cloud Project
Step 1: Create Google Cloud Project
- Go to Google Cloud Console
- Click "Select a project" β "New Project"
- Enter project name (e.g., "Syllabus Calendar") and click "Create"
Step 2: Enable APIs
- In your project, go to "APIs & Services" β "Library"
- Search for and enable:
- Google Calendar API
- Google OAuth2 API
Step 3: Create OAuth Credentials
- Go to "APIs & Services" β "Credentials"
- Click "Create Credentials" β "OAuth client ID"
- Select "Web application"
- Add Authorized redirect URI:
http://localhost:5000/oauth/callback - Click "Create"
- Download credentials as
credentials.json - Place
credentials.jsonin the project root
Step 4: Configure OAuth Consent Screen
- Go to "APIs & Services" β "OAuth consent screen"
- Select "External" β "Create"
- Fill in required fields:
- App name: Syllabus Calendar
- User support email: your email
- Developer contact: your email
- Click "Save and Continue"
- In "Scopes", click "Add or Remove Scopes"
- Add scopes:
.../auth/calendar.events.../auth/userinfo.email.../auth/userinfo.profile
- Save and continue
- Add test users (your email) if needed
- Back to "Credentials", click "Edit" on your OAuth client
- Under "Authorized redirect URIs", add:
http://localhost:5000/oauth/callback - Save
3. Setup Gemini API (Optional)
- Go to Google AI Studio
- Click "Create API Key"
- Copy the API key
4. Create .env File
Create a .env file in the project root:
GEMINI_API_KEY=your-gemini-api-key-here
SECRET_KEY=dev-secret-key-change-in-production
Note: Gemini API is optional - the app falls back to basic date parsing if not provided.
5. Run the Application
python app.py
Open your browser and navigate to: http://localhost:5000
Usage
- Sign in with Google: Click "Sign in with Google" in the header
- Upload Syllabus: Click "Choose File" and select your syllabus (.txt or .pdf format)
- Parse Events: Click "Parse Events" to extract events and tasks
- Review: Check the extracted events (indicated as π Event or π Task)
- Create Calendar: Click "Add to Google Calendar" to create events
Project Structure
CalHacks/
βββ app.py # Flask web server
βββ parsers.py # Event extraction logic (Gemini AI + dateparser)
βββ calendar_utils.py # Google Calendar integration
βββ credentials.json # Google OAuth credentials (add this)
βββ token.json # User authentication token (auto-generated)
βββ .env # Environment variables (create this)
βββ requirements.txt # Python dependencies
βββ templates/
β βββ index.html # Web UI
βββ examples/
βββ sample_syllabus.txt # Sample test file
Features Explained
Event vs Task
-
Events: Lectures, labs, discussions, exams, meetings
- Have specific start and end times
- Show location if mentioned
-
Tasks: Assignments, projects, homework
- Only have due dates (all-day events)
- No time component
Timezone Handling
The app automatically detects your browser's timezone and uses it for all calendar events. No manual configuration needed!
Troubleshooting
"redirect_uri_mismatch" Error
- Make sure
http://localhost:5000/oauth/callbackis added to Authorized redirect URIs in Google Cloud Console
"access_denied" Error
- Add your email as a test user in OAuth consent screen
- Make sure OAuth consent screen is published or in testing mode
Events Times Are Wrong
- The app now uses your local timezone automatically
- If issues persist, check your browser's timezone settings
Gemini API Not Working
- The app automatically falls back to dateparser if Gemini API key is not set
- Gemini API is completely optional for basic functionality
Requirements
- Python 3.8+
- Google Cloud account
- Google account for calendar access
- Gemini API key (optional, free tier available)
Technologies Used
- Backend: Flask (Python)
- AI Parsing: Google Gemini AI
- Calendar: Google Calendar API
- Date Parsing: dateparser
- Frontend: HTML/CSS/JavaScript
License
See LICENSE file for details.
Analysis
View
Metric
- 28
- 18
- 11
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
- FlaskIn code
- HTMLIn code
- PythonIn code
- Google GeminiClaimed
- JavaScriptClaimed
3 of 5 appear in the indexed code. 2 claimed on Devpost could not be matched to code, which may simply mean the tool leaves no trace in the repository.
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
133 KB
Source files
7
Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.
Repository
hamza-els/CalHacks-Earlybird
26 files Β· 2.8 MB Β· @ 97f3e9b
Structure
Interface
1 file Β· 4%Screens, components and styles rendered to the user.
Application logic
6 files Β· 23%Domain rules, services and shared utilities.
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
- Python51%
- HTML45%
- Markdown4%
Share of indexed source by file size. Binary and vendored files are excluded.
Dependencies
requirements.txt
pypi Β· 12- dateparser
- flask
- google-api-python-client
- google-auth-httplib2
- google-auth-oauthlib
- google-generativeai
- icalendar
- pdfplumber
- pillow
- python-dateutil
- python-dotenv
- werkzeug
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.