Overview
Parse one or more ICS calendar files, merge their events, sort by start time, and print the result in several formats.
Install
python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
Basic usage
--filepath is required and may be repeated. Paths are read in order; events from every file are combined and sorted by start time.
ics_render --filepath calendar-a.ics --filepath calendar-b.ics
Without an output flag, ics_render prints a text table to stdout.
Output modes
Output format flags are mutually exclusive. Pick one per run.
Default text table
Sorted columns: Start, Duration, Name.
ics_render --filepath tests/fixtures/early.ics --filepath tests/fixtures/late.ics
Start Duration Name
------------------------- ---------- ----------------
2024-06-01T09:00:00+00:00 0:30:00 Morning standup
2024-06-10 1 day All-day planning
2024-06-15T14:00:00+00:00 1:00:00 Release review
JSON Lines (--jsonl)
Each event is one JSON object on its own line. Keys are lower-case, underscore-separated names taken from the original VEVENT properties (summary, start, end, and so on). Timestamp values use ISO 8601.
ics_render --jsonl --filepath tests/fixtures/early.ics --filepath tests/fixtures/late.ics
{"summary": {"parameters": {}, "value": "Morning standup"}, "start": {"parameters": {}, "value": "2024-06-01T09:00:00+00:00"}, "end": {"parameters": {}, "value": "2024-06-01T09:30:00+00:00"}, "uid": {"parameters": {}, "value": "early-1@example"}, "description": {"parameters": {}, "value": "Daily team sync"}}
{"summary": {"parameters": {}, "value": "All-day planning"}, "start": {"parameters": {"value": "DATE"}, "value": "2024-06-10"}, "end": {"parameters": {"value": "DATE"}, "value": "2024-06-11"}, "uid": {"parameters": {}, "value": "late-2@example"}}
{"summary": {"parameters": {}, "value": "Release review"}, "start": {"parameters": {}, "value": "2024-06-15T14:00:00+00:00"}, "end": {"parameters": {}, "value": "2024-06-15T15:00:00+00:00"}, "uid": {"parameters": {}, "value": "late-1@example"}}
Redirect to a file:
ics_render --jsonl --filepath calendar.ics > events.jsonl
HTML month grid (--html)
A self-contained HTML page with a traditional calendar layout: weeks as rows, days as columns (Sunday first), events listed inside each day cell. Timed events show HH:MM before the name.
When events span more than one month, a Month drop-down at the top switches between month grids. The visible grid stays in sync with the selection after refresh.
Click an event to open a detail modal (start, stop, duration, description). Use Copy beside the description to copy it to the clipboard; a Copied toast confirms success.
ics_render --html --filepath tests/fixtures/early.ics --filepath tests/fixtures/late.ics > calendar.html
Open in a browser:
xdg-open calendar.html
HTML table (--html-table)
A self-contained HTML page: one table row per event with Start, Stop, Duration, and Name. Hover the name to see the description as a tooltip.
ics_render --html-table --filepath tests/fixtures/early.ics --filepath tests/fixtures/late.ics > calendar-table.html
HTML list (--html-list)
A self-contained HTML page: each event is a spaced block with name, start, stop, duration, and the full description at the bottom (newlines rendered as line breaks).
ics_render --html-list --filepath tests/fixtures/early.ics --filepath tests/fixtures/late.ics > calendar-list.html
Tests
python -m pytest -q
Regenerating README screenshots
Screenshots under asset/screenshots/ are produced from the test fixtures using Brave in headless mode:
./make_screenshots
Requires brave (or adjust the browser command in the script). Intermediate .html files in asset/screenshots/ are updated at the same time. Text table and JSONL examples in this README are sample output from the same fixtures.
Metadata
Release files for ics-render 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| ics_render-0.1.1.tar.gz | 117.1 kB | Without provenance | Details for ics_render-0.1.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| ics_render-0.1.1-py3-none-any.whl | Python 3 | none | any | Details for ics_render-0.1.1-py3-none-any.whl |
Total release size: 130.9 kB
Release files / ics_render-0.1.1.tar.gz
| Download URL | ics_render-0.1.1.tar.gz |
|---|---|
| Size | 117.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
161ca552a62dcac760ccfaf71f31d8ea8f5c86200026ea5831cf240c12aac59f
|
|
BLAKE2b-256 checksum How to use checksums |
d50cadb70856221320a37c8f583b51545f4861b9adfffff27ca653e289a76dde
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.4
|
Release files / ics_render-0.1.1-py3-none-any.whl
| Download URL | ics_render-0.1.1-py3-none-any.whl |
|---|---|
| Size | 13.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d5c75e03ac65c2e59d00d6ffac783aa21ce18570965c08b236497a5a4c24b4cd
|
|
BLAKE2b-256 checksum How to use checksums |
e1d4f12165a2c0e6c814aee0bc4fc4190bdbb846b81bf4b6f43a8bd9881a2729
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.4
|
Security for ics-render 0.1.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.