StudyOS turns assignment emails into an organized student workflow. It reads unread Gmail messages with PDF attachments, extracts assignment details with OpenAI, creates structured tasks in Notion, adds deadlines to Google Calendar, and generates a morning briefing for what needs attention next.
This project was built as a student productivity automation tool focused on one simple idea: reduce the manual work between receiving an academic update and actually planning around it.
From inbox to action: Gmail -> AI extraction -> Notion -> Google Calendar -> morning briefing
- Problem: assignment updates are scattered across email threads, PDFs, calendars, and notes
- Solution: one workflow that converts academic emails into structured tasks and reminders
- Outcome: less manual tracking, better visibility, and faster planning for students
- Scans unread Gmail messages that match assignment-style queries
- Downloads attached PDF briefs, notices, and assignment sheets
- Extracts task details from email + PDF content using OpenAI
- Creates clean tasks inside a Notion database
- Adds due-date reminders to Google Calendar
- Generates a morning briefing with overdue, today, and upcoming tasks
The current project demo shows:
- assignment emails landing in Gmail
- tasks being created in Notion
- deadlines appearing in Google Calendar
- a generated morning briefing summarizing student workload
Demo support files are included in demo_assets/README.md.
The full walkthrough is available in final_demov3.mp4.
For the public GitHub repo, the cleaner option is to:
- keep the screenshots in the README
- share the full video through your LinkedIn post
- optionally upload the
.mp4later as a GitHub release asset or external video link
- Python
- Gmail API
- Google Calendar API
- Notion API
- OpenAI API
- PyMuPDF for PDF text extraction
StudyOS/
|-- app/
| |-- ai_extractor.py
| |-- ai_service.py
| |-- auth.py
| |-- briefing_service.py
| |-- calendar_service.py
| |-- gmail_service.py
| |-- notion_service.py
| `-- processor.py
|-- demo_assets/
|-- docs/
|-- briefing.py
|-- config.py
|-- main.py
|-- notion_setup.py
|-- pdf_parser.py
|-- requirements.txt
`-- README.md
- main.py fetches unread Gmail messages that match the configured query.
- app/processor.py reads the message body, downloads PDF attachments, and combines both text sources.
- app/ai_extractor.py asks OpenAI to return assignment details as structured JSON.
- app/notion_service.py creates Notion tasks.
- app/calendar_service.py creates matching Google Calendar events.
- briefing.py and app/briefing_service.py generate a daily academic summary.
git clone <your-repo-url>
cd StudyOSpython -m venv .venv
.venv\Scripts\activatepip install -r requirements.txtCopy .env.example to .env and fill in your values:
OPENAI_API_KEY=your_openai_api_key
NOTION_API_KEY=your_notion_integration_key
NOTION_DB_ID=your_notion_database_idPlace your Google OAuth client file in the project root as:
credentials.json
You will also need to authorize:
- Gmail API access
- Google Calendar API access
Create a Notion database with these properties:
Nameas titleDue Dateas datePriorityas selectSubjectas selectStatusas status
Then share that database with your Notion integration.
python main.pypython briefing.pypython briefing.py --demoThe Gmail search filter lives in config.py. The current default is tuned for unread academic emails with PDF attachments.
- This project uses real external APIs, so it requires API keys and OAuth setup before running.
- The repo intentionally excludes private tokens, credentials, and generated local files.
- Demo input files are included to make the workflow easier to understand and present.
- stronger date parsing for more natural language cases
- duplicate-task prevention before creating Notion entries
- better subject classification and priority estimation
- a simple web dashboard for non-technical users
- automated testing around extraction and task creation flows
This project is released under the MIT License. See LICENSE.



