Skip to content

Convert

ICS Filter

ICS Filter

Beta

Keep only the events you want from one .ics calendar. Filter by a date range, a keyword, a category or a status, drop cancelled events, then download the smaller calendar to import, or the events it removed as their own file. On this page, the calendar is read in your browser and nothing is uploaded.

Use via API
  • Free, no sign-up
  • REST + MCP
  • Updated
  • Reviewed by Olgun Ozoktas

Matches SUMMARY, DESCRIPTION or LOCATION.

An event is kept only when it matches every filter you set. Leave a field empty to skip it.

Drop one .ics file hereor click to choose a calendar export
Filtered calendar

The filtered calendar will appear here.

How to Filter an ICS File

  1. Export the calendar as .ics

    In Google Calendar, Settings > Import & export > Export. Apple Calendar: File > Export. Outlook: File > Save Calendar.
  2. Drop the .ics file on the page, or click to choose it

  3. Set the filters you need

    a From and To date, a keyword, a category, a status. Drop cancelled events is on by default. An event must match every filter you set.
  4. Check the counts under the output, then download the filtered .ics

    Download removed.ics as well if you want a record of what was left out.

Common Use Cases

Import limits

cut a full-year export down to the months you need before importing it.

Projects

keep only the events that mention a client or project name.

Clean-up

drop the cancelled events a calendar app keeps in its exports.

Sharing

separate the events tagged Work from the ones tagged Personal before you send a file.

Audits

keep the removed events as their own calendar, so nothing is lost by the trim.

Why Filter an ICS File?

A calendar export holds everything: years of events, every cancelled meeting, every personal appointment next to the work ones. When you only need this quarter, or only one project, or a file small enough for an importer to accept, the manual route is deleting events one by one in a calendar app, or converting to a spreadsheet, filtering there and rebuilding the .ics by hand. This page keeps the events that match your filters and writes them back as a valid calendar with every property intact, ready to import.

The filters combine with AND. The date range keeps an entry when any part of it touches the days from From to To, inclusive, compared with the wall-clock time the file states for that entry. Either end may be left empty. The keyword is matched without regard to case in SUMMARY, DESCRIPTION and LOCATION. The category is matched against the CATEGORIES values, and the status against the STATUS line. With Drop cancelled events on, an entry with STATUS:CANCELLED is removed; choosing the Cancelled status keeps only those entries instead.

A recurring series is judged by its main event and kept or removed as a whole. For the date range, the series is kept when at least one occurrence falls in the range, worked out from the RRULE, RDATE and EXDATE, or when one of its moved occurrences does. The rule is copied as it is, and the moved and cancelled occurrences that belong to a kept series stay with it. A rule with parts the expansion does not support, such as BYSETPOS, is kept when it starts before the range ends, and a note says so. To cut a series down to the occurrences in a range, use ICS Expand RRULE.

The filtered calendar keeps the header of the source with a new PRODID, every property of every kept entry as read, and the VTIMEZONE blocks the kept entries use. The removed entries can be downloaded the same way, as their own calendar.

How it compares

Calendar apps can delete events one at a time or a whole calendar at once, but not "everything before July" or "everything that mentions Acme". Converting to a spreadsheet makes the filtering easy and the way back hard: the recurrence rules, time zones and alarms do not survive the round trip. This page filters the calendar file itself and writes a valid .ics with every property intact.

Filter Tips

  • Dates are inclusive: From 2026-10-01 To 2026-12-31 keeps everything that touches any of those days, including an event that starts on 30 September and ends on 1 October.
  • A recurring series is kept whole when at least one of its occurrences falls in the range. Its rule is copied as it is; use ICS Expand RRULE when you need one event per occurrence.
  • A moved or cancelled occurrence of a kept series stays with it, so the occurrence stays moved or cancelled after the import.
  • Category accepts several names separated by commas; an event with any one of them matches.
  • An event with no STATUS line matches only the Any status.

Frequently Asked Questions

How do I keep only the events in a date range?

Set From and To and leave the other filters empty. Both days are inclusive: an event is kept when any part of it touches one of the days in the range, so an event from 23:00 on 30 September to 01:00 on 1 October is kept by a range that starts on 1 October. Either end can stay empty for an open range, such as everything from 1 July on.

How are recurring events filtered?

A recurring series is kept or removed as a whole, judged by its main event. The date range keeps it when at least one of its occurrences falls in the range, worked out from its RRULE, RDATE and EXDATE, or when one of its moved occurrences does. The rule itself is copied unchanged, never expanded. To get one event per occurrence inside the range instead, use ICS Expand RRULE.

Where does the keyword search look?

In the SUMMARY, DESCRIPTION and LOCATION of each event, ignoring upper and lower case. The keyword is matched as one piece of text, so "team lunch" matches "Team lunch on Friday" but not "lunch with the team". Attendees, organizers and categories are not searched; use the Category filter for categories.

What does Drop cancelled events do?

It removes every entry with STATUS:CANCELLED, which some calendar apps keep in their exports after a meeting is cancelled. It is on by default and works alone, with no other filter set. A cancelled occurrence of a series that is kept stays with the series, because removing it would bring that occurrence back. Choosing Cancelled as the status keeps only the cancelled entries, and Drop cancelled events is then ignored.

How do the category and status filters work?

Category keeps an event whose CATEGORIES include one of the names you type, separated by commas and matched without regard to case. Status keeps an event whose STATUS is Confirmed, Tentative or Cancelled; an event with no STATUS line matches only Any. Google Calendar writes STATUS on its events; other apps may leave it out.

Will the filtered file import into Google Calendar, Apple Calendar and Outlook?

Yes. The output is a complete VCALENDAR in the standard format, with the header of the source, a PRODID naming this tool, the VTIMEZONE blocks the kept events use, and every kept event with all its properties as read: UID, recurrence rules, alarms, attendees and descriptions. Because the UIDs are unchanged, importing it into the calendar it came from updates the existing events rather than adding copies.

What is removed.ics?

It is the events the filters removed, written as a calendar of their own with the same header and the time zones they use. Keep it as a record of what the trim left out, or import it somewhere else. The line under the output says how many events each filter removed.

Why does the page say no entry matched?

Because every event failed at least one filter, and an empty calendar is not worth downloading. The message counts the reasons, for example how many events fell outside the dates and how many were cancelled. Widen the date range, shorten the keyword, or clear a filter, and the counts update as you type.

Is my calendar uploaded?

Not on this page. The file is read with the browser's File API and filtered in the tab, and the page makes no request with the calendar text, which you can confirm in the browser's network panel. The page never fetches a calendar URL either. The REST API and MCP tool are a separate path: a call sends the input you include to FindUtils over HTTPS, where it is processed and the result returned. FindUtils does not store that input, and logs the request without its content.

Can I filter a calendar from a script?

Yes. The same code runs on the FindUtils REST API and MCP server as the ics_filter tool. Send the .ics text as input with any of from, to, keyword, category, status and drop_cancelled; read the filtered calendar from ics and the removed one from removed_ics, with the counts per filter beside them.

Rate This Tool

0/1000

Get Weekly Tools

Suggest a Tool