{
  "slug": "ics-parse",
  "name": "gizza-ai/ics-parse",
  "version": "0.1.0",
  "title": "ICS Parser — iCalendar (.ics) to Structured JSON Events — gizza.ai",
  "description": "Parse .ics calendar files into JSON events with start/end, all-day status, location, attendees, organizer and RRULE recurrence. Runs in your browser.",
  "tags": [
    "ics parser",
    "ical to json",
    "ics to json",
    "parse ics",
    "icalendar parser",
    "vevent to json",
    "rrule parser",
    "ics events json"
  ],
  "category": "time",
  "urls": {
    "page": "https://gizza.ai/tools/ics-parse/",
    "markdown": "https://gizza.ai/tools/ics-parse/index.md",
    "descriptor": "https://gizza.ai/tools/ics-parse/tool.json",
    "deep_link_example": "https://gizza.ai/tools/ics-parse/?ics=BEGIN%3AVCALENDAR%0ABEGIN%3AVEVENT%0ASUMMARY%3ATeam%20Standup%0ADTSTART%3A20240309T081530Z%0ADTEND%3A20240309T083000Z%0ALOCATION%3ARoom%204%0AEND%3AVEVENT%0AEND%3AVCALENDAR&date_format=iso&pretty=true&include_description=true"
  },
  "cli": "gizza tool ics-parse \"BEGIN:VCALENDAR\nBEGIN:VEVENT\nSUMMARY:Team Standup\nDTSTART:20240309T081530Z\nDTEND:20240309T083000Z\nLOCATION:Room 4\nEND:VEVENT\nEND:VCALENDAR\"",
  "tool": {
    "description": "Parse an iCalendar (.ics) document into a JSON array of event objects — one per VEVENT, in document order. Each object carries uid, summary, start, end, an all_day flag (set for VALUE=DATE / date-only values), location, description, status, categories (a list), organizer and attendees (each name + email, parsed from the CN parameter and the mailto: value), and recurrence (the RRULE parsed into a structured object: freq/interval/count/until/byday/…). Empty or absent fields are omitted so the JSON stays clean. date_format writes start/end/until as iso (normalized ISO-8601, default), raw (original .ics text), or unix (epoch seconds; Z times exact, floating/TZID read as UTC). pretty toggles indented vs compact JSON; set include_description=false to drop the description field. Folded lines are unfolded, RFC 5545 TEXT escapes (\\n, \\,, \\;) are decoded, and VALARM/VTIMEZONE sub-components are skipped so their properties never leak into the event. Paste the .ics contents in the 'ics' field. Runs entirely in-browser; nothing is uploaded.",
    "parameters": {
      "additionalProperties": false,
      "properties": {
        "date_format": {
          "default": "iso",
          "description": "How the start/end (and RRULE UNTIL) date values are written. iso (default) normalizes to ISO-8601 (20240309T081530Z → 2024-03-09T08:15:30Z, 20240309 → 2024-03-09); raw keeps the original .ics value verbatim; unix converts to epoch seconds (Z/UTC times are exact, floating/TZID times are read as wall-clock UTC — no timezone database is shipped).",
          "enum": [
            "iso",
            "raw",
            "unix"
          ],
          "type": "string"
        },
        "ics": {
          "description": "The iCalendar (.ics) document to parse. Paste the whole file contents — it starts with BEGIN:VCALENDAR and contains one or more BEGIN:VEVENT…END:VEVENT blocks. Folded lines are unfolded and RFC 5545 TEXT escapes are decoded. Only VEVENTs are parsed (task/journal/free-busy components are ignored).",
          "type": "string"
        },
        "include_description": {
          "default": true,
          "description": "Include each event's DESCRIPTION field. Default true; set false to drop it (handy when descriptions are long).",
          "type": "boolean"
        },
        "pretty": {
          "default": true,
          "description": "Pretty-print the JSON with indentation. Default true; set false for compact single-line JSON.",
          "type": "boolean"
        }
      },
      "required": [
        "ics"
      ],
      "type": "object"
    }
  }
}