Free and open source way to subscribe to calendars from multiple sports organizations. Never miss a game, fight, or match again.
- Multiple Sports: MMA, Football, Basketball, Tennis, Formula 1, eSports
- Calendar Subscriptions: Apple Calendar, Google Calendar, ICS download
- Real-time Updates: Automatic calendar updates with caching
- Modern UI: Apple-style design with animated backgrounds
- Responsive: Works on desktop, tablet, and mobile
- Open Source: Free to use and modify
- Next.js 15 - React framework
- TypeScript - Type safety
- Tailwind CSS - Utility-first CSS
- Framer Motion - Animations
- Vercel - Hosting
- Python 3.11 - Backend language
- Flask - Web framework
- BeautifulSoup - Web scraping
- ICS - Calendar format
- Gunicorn - Production server
- Koyeb - Hosting
# Clone the repository
git clone https://github.com/andricje/calendar.git
cd calendar
# Start with Docker Compose
npm run dev
# or
docker-compose up# Backend
cd backend
pip install -r requirements.txt
python -m main
# Frontend
cd frontend
npm install
npm run devGET /- Health checkGET /ufc- UFC calendarGET /onefccalendar- ONE Championship calendarGET /cache- Cache statusGET /cache/clear- Clear cache
- Apple Calendar:
webcal://backend-url/ufc?name=UFC%20Events - Google Calendar:
https://calendar.google.com/calendar/r?cid=backend-url/ufc&name=UFC%20Events - Download ICS:
https://backend-url/ufc?name=UFC%20Events
- Apple Calendar:
webcal://backend-url/onefccalendar?name=ONE%20Championship%20Events - Google Calendar:
https://calendar.google.com/calendar/r?cid=backend-url/onefccalendar&name=ONE%20Championship%20Events - Download ICS:
https://backend-url/onefccalendar?name=ONE%20Championship%20Events
- Deploy to Koyeb:
# Install Koyeb CLI
curl -fsSL https://cli.koyeb.com/install.sh | bash
# Login to Koyeb
koyeb login
# Deploy backend
koyeb app init sports-calendar-backend \
--docker . \
--ports 8080:http \
--routes /:8080 \
--env URL=sports-calendar-backend-andricje.koyeb.app- Environment Variables:
URL: Your Koyeb app URLPORT: 8080 (default)
- Deploy to Vercel:
# Install Vercel CLI
npm i -g vercel
# Login to Vercel
vercel login
# Deploy frontend
cd frontend
vercel --prod- Environment Variables:
NEXT_PUBLIC_BACKEND_URL: Your Koyeb backend URL (without trailing slash)
- Frontend: https://sports-calendar-andricje.vercel.app
- Backend: https://sports-calendar-backend-andricje.koyeb.app
- Backend Scraper:
# backend/new_sport_calendar.py
from backend.calendar_control import CalendarControl
class NewSportCalendar(CalendarControl):
def update_calendar(self) -> Path:
# Implement scraping logic
pass- Frontend Config:
// frontend/src/lib/sports-config.ts
{
key: 'newsport',
name: 'New Sport',
icon: NewSportIcon,
leagues: [
{
id: 'newleague',
name: 'New League',
href: '/newleague',
backendEndpoint: '/newleague',
}
]
}- Fork the repository
- Create a feature branch
- Make your changes
- Submit a pull request
MIT License - see LICENSE file for details.