# ICS to CSV Converter

Convert an .ics calendar file to CSV in your browser — one row per event with summary, start, end, location and description. Free, private, nothing uploaded.

## Run it

- **CLI:** `gizza tool ics-to-csv "BEGIN:VCALENDAR
BEGIN:VEVENT
SUMMARY:Team Standup
DTSTART:20240309T081530Z
DTEND:20240309T083000Z
LOCATION:Room 4
END:VEVENT
END:VCALENDAR"`
- **Web:** https://gizza.ai/tools/ics-to-csv/
- **Agents:** machine-readable descriptor (parameters JSON Schema) at https://gizza.ai/tools/ics-to-csv/tool.json

## Inputs

- `ics` — .ics file contents _(field)_
- `delimiter` — CSV delimiter _(field)_
- `header` — Include header row _(field)_
- `date_format` — Date column format _(field)_
- `include_location` — Include location column _(field)_
- `include_description` — Include description column _(field)_

## Output

- CSV (text)

## Query parameters

Open the tool pre-filled and auto-run via URL:

- `ics` — .ics file contents
- `delimiter` — CSV delimiter
- `header` — Include header row
- `date_format` — Date column format
- `include_location` — Include location column
- `include_description` — Include description column

Example: `https://gizza.ai/tools/ics-to-csv/?ics=BEGIN%3AVCALENDAR%0ABEGIN%3AVEVENT%0ASUMMARY%3ATeam%20Standup%0ADTSTART%3A20240309T081530Z%0ADTEND%3A20240309T083000Z%0ALOCATION%3ARoom%204%0AEND%3AVEVENT%0AEND%3AVCALENDAR&delimiter=comma&header=true&date_format=iso&include_location=true&include_description=true`

---

## About this tool

**ICS to CSV** turns an iCalendar file — the `.ics` format that Google Calendar,
Apple Calendar, Outlook and event invites export — into a clean CSV table you can
open in a spreadsheet or import anywhere. Paste the file contents and you get one
row per event with these columns:

`summary, start, end, location, description`

plus **status**, **categories** and **uid** columns whenever your events carry
them, so the CSV never has a column of blanks. Folded lines are unfolded, RFC 5545
text escapes (`\n`, `\,`, `\;`) are decoded back to real characters, alarm and
timezone sub-blocks are skipped, and every field is RFC-4180 escaped so summaries
or descriptions containing commas, quotes or newlines stay intact.

Everything runs locally in your browser — the calendar never leaves your device.

### Worked example

Input (one event):

```text
BEGIN:VCALENDAR
BEGIN:VEVENT
UID:evt-1@example.com
SUMMARY:Team Standup
DTSTART:20240309T081530Z
DTEND:20240309T083000Z
LOCATION:Room 4
DESCRIPTION:Daily sync
END:VEVENT
END:VCALENDAR
```

Output (defaults — comma delimiter, header on, ISO dates):

```csv
summary,start,end,location,description,uid
Team Standup,2024-03-09T08:15:30Z,2024-03-09T08:30:00Z,Room 4,Daily sync,evt-1@example.com
```

### Options

- **Delimiter** — comma, semicolon (handy for comma-decimal locales), tab (TSV),
  or pipe.
- **Include header row** — turn the column-name row off for a headerless CSV.
- **Date column format** — `iso` normalizes to ISO-8601
  (`20240309T081530Z` → `2024-03-09T08:15:30Z`, `20240704` → `2024-07-04`), `raw`
  keeps the original `.ics` value text, and `unix` converts to epoch seconds.
- **Include location / description** — drop either column when you don't need it
  (descriptions can be long).

### Limits & edge cases

- Only `VEVENT` blocks become rows. `VTODO`, `VJOURNAL` and `VFREEBUSY` are
  ignored, and `VALARM` / `VTIMEZONE` sub-blocks inside an event are skipped so
  their fields never leak into the event row.
- All-day events use a date-only `DTSTART` / `DTEND`; the `DTEND` of an all-day
  event is the exclusive end date per the iCalendar spec — it is copied through as
  written, not adjusted.
- `unix` epoch treats `Z` (UTC) times exactly; floating times and `TZID` times are
  read as wall-clock UTC because the tool ships no timezone/DST database. Use `raw`
  or `iso` to keep the original wall-clock value untouched.
- Recurrence (`RRULE`) is not expanded — a repeating event is one row for its
  master `DTSTART`, not one row per occurrence.
- A date value the parser can't read is passed through unchanged rather than
  failing the whole conversion.

## FAQ

<!-- FAQ MUST be <details>/<summary> accordions. Keep the blank line inside each. -->

<details>
<summary>What columns does the CSV have?</summary>

Always `summary`, `start`, and `end`, then `location` and `description` unless you
turn those off. `status`, `categories` and `uid` columns are added automatically
whenever at least one event includes them, so you never get a column that is
entirely empty. An empty cell means that event didn't record that value.

</details>

<details>
<summary>Does it handle all-day events and different date formats?</summary>

Yes. Date-only values like `DTSTART;VALUE=DATE:20240704` are recognized as all-day
events and written as `2024-07-04`. Timed values are normalized to ISO-8601, or you
can switch the date format to `raw` to keep the original `.ics` text or `unix` for
epoch seconds. `Z`-suffixed times are UTC; floating and `TZID` times are read as
wall-clock UTC.

</details>

<details>
<summary>Why did some events not turn into rows?</summary>

Only calendar events (`VEVENT` blocks) are exported. To-dos (`VTODO`), journal
entries (`VJOURNAL`) and free/busy blocks (`VFREEBUSY`) are skipped, and a
repeating event appears once for its master start date — recurrences (`RRULE`) are
not expanded into individual occurrences.

</details>

<details>
<summary>Is my calendar file uploaded anywhere?</summary>

No. The conversion runs entirely in your browser using WebAssembly — the `.ics`
text you paste is processed on your own device and is never sent to a server.

</details>

## Related tools

- [Amazon Order Analyzer](https://gizza.ai/tools/amazon-order-analyzer/): Paste an Amazon order-history CSV export to summarize total spend by month, top items, and category breakdowns. Browser-only, private, with Markdown or JSON output.
- [Avro to JSON Converter](https://gizza.ai/tools/avro-to-json/): Decode Apache Avro Object Container Files (.avro / OCF) to JSON, NDJSON, or the embedded schema — no .avsc needed, free and private in your browser.
- [Reconcile bank statement and ledger CSVs](https://gizza.ai/tools/bank-statement-reconcile/): Match bank-statement CSV rows to ledger rows by date, signed amount, and fuzzy memo similarity, with unmatched and suggested matches.
- [Bencode decoder](https://gizza.ai/tools/bencode-decoder/): Decode bencode (the BitTorrent / .torrent serialization format) into readable JSON, and re-encode JSON back into canonical bencode — in your browser. Nothing is uploaded.
- [Budget Planner](https://gizza.ai/tools/budget-planner/): Plan a monthly budget from take-home pay: 50/30/20 needs/wants/savings targets with custom splits, or a zero-based plan showing what's left to allocate.
