Generate dynamic
.icscalendar feeds from schedules, APIs, websites, and custom event data
- 📅 Generate valid
.icscalendar feeds - 🌐 Create calendars from websites or APIs
- ⚡ Auto-update schedules dynamically
- 🏀 Perfect for sports schedules, TV listings, movies, and events
- 🔄 Export recurring or one-time events
- ☁️ Easy deployment on Vercel, or your own server
- 🛠 Simple and developer-friendly setup
Feeds generated using TVMaze and enriched with IMDb metadata. The show schedules are also seamlessly merged and supplemented with Rotten Tomatoes ratings, summaries, and upcoming episode links using robust canonical name matching.
- Search:
/api/search?q={query} - ICS Feed:
/api/episodes?show={showName}&format=ics
Comprehensive sports coverage using TheSportsDB, ESPN scraping, and specialized data for:
- Major Leagues: NBA, NFL, MLB, NHL, MLS, etc.
- WNBA: Enhanced support via SportsDataverse and ESPN.
- AHL: American Hockey League schedules.
- MiLB: Minor League Baseball schedules.
- AF1: Arena Football One official schedules.
- Search:
/api/sports-search?q={query} - ICS Feed:
/api/sports-events?teamId={teamId}&format=ics
Upcoming movie releases scraped from the IMDb US Release Calendar.
- Search Types:
movie,genre,character,people,studio. - Search:
/api/movies-search?q={query}&type={type} - ICS Feed:
/api/movies?q={query}&type={type}&format=ics
git clone https://github.com/DisabledAbel/MakeICS.gitcd MakeICSnpm installnpm run devOr run directly with Node.js:
node index.jsOpen http://localhost:3000, start typing to pick a suggested show, sports team, or upcoming movie, and click Copy ICS URL to copy the all-time calendar feed URL. The ICS feed includes daily refresh metadata and the API cache revalidates daily so newly published episodes/games/movies can appear without changing the URL.
GET /api/search?q=The%20Last%20of%20Us
GET /api/episodes?show=The%20Last%20of%20Us
GET /api/episodes?show=The%20Last%20of%20Us&format=icsGET /api/sports-search?q=Portland%20Thorns
GET /api/sports-events?teamId=136450
GET /api/sports-events?teamId=136450&format=icsGET /api/movies-search?q=Spider-Man&type=movie
GET /api/movies?q=Spider-Man&type=movie
GET /api/movies?q=Animation&type=genre&format=ics{
"show": {
"name": "Example Show",
"imdbId": "tt1234567"
},
"imdb": null,
"episodes": []
}The app tries a public/free IMDb-compatible endpoint by default, but treats it as optional so temporary endpoint outages do not interrupt TV show searches:
That endpoint does not require an API key. If the public endpoint is unavailable, MakeICS still returns TVMaze episodes and the direct IMDb link without showing a blocking enrichment failure. If you configure Firecrawl, the app uses Firecrawl first to scrape the public IMDb title page and falls back to the free endpoint if Firecrawl fails.
| Variable | Purpose |
|---|---|
FIRECRAWL_API_KEY |
Optional Firecrawl API key. Sent as Authorization: Bearer <key> to the Firecrawl scrape API. |
FIRECRAWL_API_URL |
Optional override for the Firecrawl scrape URL. Defaults to https://api.firecrawl.dev/v2/scrape. |
IMDB_API_URL |
Optional custom public/free IMDb-compatible endpoint. Use {imdbId} as a placeholder, or the app appends ?tt=<imdbId> / &tt=<imdbId>. |
Example local usage with Firecrawl:
FIRECRAWL_API_KEY='fc-YOUR-KEY' npm run devExample local usage with a custom free IMDb-compatible endpoint:
IMDB_API_URL='https://example-imdb-api.test/title/{imdbId}' npm run dev