Turn PDFs, images, and text into calendar events β powered by AI.
Ever received a class timetable as a PDF and wished it would just appear in your calendar? Yeah, me too. That's why I built ParseCal.
Drop in any schedule β a university timetable, conference agenda, meeting list, or just some messy text β and let AI do the heavy lifting. Review the extracted events, tweak what you need, and push them straight to Google Calendar. Done.
- π Multi-format input β Upload PDFs, images, or paste plain text
- π€ AI-powered parsing β Gemini (primary), OpenAI, and Claude with automatic fallback
- βοΈ Event review & editing β Edit titles, dates, times, location, description, and recurrence rules before pushing
- π Google Calendar push β OAuth2-based integration to push events directly
- π₯ ICS export β Download
.icsfiles for any calendar app - π Session management β Search, filter by status, multi-select, and bulk delete
- π·οΈ Auto-generated titles β Session names derived from filenames or content
- π¦ Rate limiting β Per-user, per-IP, and global daily limits
- π Auth β Supabase-based email authentication
| Layer | Tech |
|---|---|
| Framework | Next.js 16 (App Router) |
| Language | TypeScript |
| Styling | Tailwind CSS 4 |
| Auth & DB | Supabase (PostgreSQL, Auth, Storage) |
| AI | Google Gemini, OpenAI, Anthropic Claude |
| Calendar | Google Calendar API, ical-generator |
| Validation | Zod |
| Icons | Lucide React |
- Node.js 18+
- A Supabase project
- At least one AI provider API key (Gemini recommended)
- Google Cloud project with Calendar API enabled (for push)
git clone https://github.com/nodesagar/parsecal.git
cd parsecal
npm install
Create a .env.local file:
# Supabase
NEXT_PUBLIC_SUPABASE_URL=your_supabase_url
NEXT_PUBLIC_SUPABASE_ANON_KEY=your_anon_key
# AI Providers (at least one required)
GEMINI_API_KEY=your_gemini_key
OPENAI_API_KEY=your_openai_key
ANTHROPIC_API_KEY=your_anthropic_key
# Google Calendar OAuth
GOOGLE_CLIENT_ID=your_client_id
GOOGLE_CLIENT_SECRET=your_client_secret
GOOGLE_REDIRECT_URI=http://localhost:3000/api/auth/calendar/google/callback
Run the migrations in your Supabase SQL Editor:
-- Run the contents of:
-- supabase/migrations/001_initial_schema.sql
-- supabase/migrations/002_add_session_title.sql
npm run dev
Open http://localhost:3000.
src/
βββ app/
β βββ (auth)/ # Login, signup, auth callback
β βββ (protected)/ # Dashboard, parse review, settings
β βββ api/ # Parse, calendar push/export, auth
βββ components/
β βββ dashboard/ # Session list (search, filters, multi-select)
βββ lib/
β βββ ai/ # Provider abstraction (Gemini, OpenAI, Claude)
β βββ calendar/ # Google Calendar integration
β βββ supabase/ # Client, server, middleware helpers
βββ types/ # TypeScript types
- Upload a PDF, image, or paste text on the parse page
- AI extracts structured events (title, date, time, location, recurrence)
- Review & edit events β adjust details, add custom recurrence rules
- Push to Google Calendar or export as
.ics
I kept getting schedules in formats that were anything but calendar-friendly β PDFs from university, event flyers, text dumps from group chats. Manually creating each event felt like a crime against productivity. So I built a tool to do it for me. If it saves you even 10 minutes, it was worth it.
If you like this project or want to chat about web dev, AI, or side projects β reach out!
- X (Twitter): @nodesagar
- LinkedIn: in/nodesagar
- Instagram: @nodesagar
- GitHub: @nodesagar
Built with β€οΈ and β by Sagar
If you found this project cool, consider giving it a β!