Org2Ics - Bidirectional Org/iCalendar Converter
A C# console application that provides bidirectional conversion between .org diary files and .ics (iCalendar) format.
Description
This tool converts between .org files containing diary entries and iCalendar (.ics) files. It supports:
- Org to ICS: Convert diary entries to all-day calendar events named "Chronolog"
- ICS to Org: Convert calendar events back to org diary format with proper date headers
Features
- Bidirectional conversion between .org and .ics formats
- Auto-detection of input file format based on file extension
- Org to ICS conversion:
- Parses .org files with level 3 headings (***) containing dates in YYYY-MM-DD format
- Extracts diary content for each date entry
- Creates all-day events with the title "Chronolog"
- Includes diary content as event descriptions
- ICS to Org conversion:
- Parses standard .ics calendar files
- Extracts event dates and descriptions
- Organizes entries by year and month
- Creates proper org-mode structure with level 3 date headers
- Proper character escaping for both formats
- Round-trip compatibility for seamless conversion between formats
Usage
dotnet run <input.org|input.ics> [output.ics|output.org]
Parameters
input.org|input.ics: Path to the input file (required).orgfiles will be converted to.icsformat.icsfiles will be converted to.orgformat
output.ics|output.org: Path to the output file (optional, auto-determined if not specified)
Examples
# Convert diary.org to diary.ics
dotnet run diary.org
# Convert calendar.ics to calendar.org
dotnet run calendar.ics
# Specify custom output filename
dotnet run diary.org my-calendar.ics
dotnet run calendar.ics my-diary.org
# Round-trip conversion
dotnet run diary.org calendar.ics
dotnet run calendar.ics diary-restored.org
File Format Support
Org File Format (.org → .ics)
The converter expects .org files with the following structure:
* My Diary
** Month Section
*** 2025-01-15
This is the diary content for January 15th, 2025.
It can span multiple lines and paragraphs.
*** 2025-01-16
Another diary entry for the next day.
** Another Section
*** 2025-02-01
February entry content here.
Requirements:
- Level 3 headings (starting with
***) must contain dates inYYYY-MM-DDformat - Everything after a date heading until the next heading becomes the diary content for that date
- Non-date headings are ignored
ICS File Format (.ics → .org)
The converter can parse standard iCalendar files and extracts:
- Event dates (both all-day and timed events)
- Event descriptions or summaries as diary content
- Events are organized chronologically and grouped by month
Supported:
DTSTART;VALUE=DATE:(all-day events)DTSTART:(timed events - date portion used)DESCRIPTION:field contentSUMMARY:field content (when no description available)- Proper unescaping of iCalendar text formatting
Output Formats
Generated .ics Files (from .org)
- Standard iCalendar format (RFC 5545 compliant)
- All-day events spanning from the diary date to the next day
- Event title: "Chronolog"
- Event description: The diary content for that date
- Unique identifiers for each event
Generated .org Files (from .ics)
- Proper org-mode structure with hierarchical headings
- Level 1: "Diary" (root heading)
- Level 2: Month and year groupings (e.g., "January 2025")
- Level 3: Individual date entries (e.g., "*** 2025-01-15")
- Content: Event descriptions properly formatted for org-mode
Building
dotnet build
Requirements
- .NET 8.0 or higher
- No additional dependencies required
License
This project is provided as-is for educational and personal use.
Description
Languages
C#
100%