Google Calendar's recurrence rule (RRULE) only understands the Gregorian
calendar. There is no way to tell it "repeat on the 20th of every Jalali
(Persian/Shamsi) month" — a Gregorian BYMONTHDAY=20 rule always means the
20th of the Gregorian month, and the Jalali 20th lands on a different
Gregorian day nearly every month (it drifts between roughly the 9th and 11th
depending on the month lengths of both calendars).
This app sidesteps the problem instead of fighting it: rather than one
repeating rule, it computes the correct Gregorian date for every
occurrence of a given Jalali day-of-month, and bundles them into a single
.ics calendar file you can import into Google Calendar (or Outlook, Apple
Calendar, etc.) in one step. Each occurrence becomes its own event, so it's
always on the right day and can be edited/deleted individually.
- Pick any Jalali day of month (1–31) to repeat on.
- Choose what happens when a month is too short for that day (skip it, or fall back to the last day of the month).
- All-day or timed events, with custom duration.
- Repeat starting from any Jalali year/month, for 1–30 years.
- Live preview table showing every Jalali date next to its Gregorian equivalent before you download.
- One-click
.icsdownload, ready to import.
npm install
npm run devThe dev server runs on http://localhost:43217.
- Fill in the event details and click Download .ics.
- In Google Calendar (web), open Settings (gear icon) → Import & export.
- Under Import, select the downloaded file, choose the destination calendar, and click Import.
- All occurrences are added as individual events on their correct Gregorian dates.
jalaali-jsconverts each Jalali(year, month, day)to its Gregorian equivalent.src/lib/jalali-occurrences.tswalks forward month by month in the Jalali calendar, generating one occurrence per month (with configurable handling of short months).src/lib/ics.tsserializes those occurrences into a standardVCALENDAR/VEVENTICS file — deliberately using oneVEVENTper occurrence instead of anRRULE, since no Gregorian-based rule can express a Jalali monthly recurrence without drifting.
- Next.js (App Router) + TypeScript
- Tailwind CSS + shadcn/ui
- jalaali-js for calendar conversion