Paste an .ics calendar file and get RFC 5545 findings grouped into MUST violations,
SHOULD-level findings and interoperability notes, or build an event file folded correctly at 75 octets.
One HTML file, nothing leaves your browser.
Two input paths, and they are not equivalent. The uploaded-file path gives this page the raw octets, so every byte-level check is exact. The paste path does not.
Read locally with FileReader. The file is never uploaded anywhere.
Your browser decodes pasted text before this page sees it, so three checks are weaker on this path. The page says so on screen when you use it.
A file that fails only SHOULD-level checks is still a conforming iCalendar object. The three counts are reported separately and are never added together into one error number.
Pasted text was decoded by your browser before this page saw it. The line-ending, the split-codepoint and the charset checks are exact only on the uploaded-file path.
| Assertion | Expected | Observed | Result |
|---|
The last row is a positive control. It is an assertion written to fail on purpose. If it ever stops failing, or does not appear at all, the self test itself has stopped running and nothing above it can be trusted.
Output is folded at 75 octets measured over the UTF-8 encoding, never inside a multi-octet sequence, every line terminated CRLF, every TEXT value escaped per RFC 5545 section 3.3.11. That is output hygiene. Folding is not required by the RFC, it is recommended.
Enabled only in TZID mode.
RFC 5545 section 3.2.19 requires a matching VTIMEZONE component in the same object for every unique TZID parameter value. This page ships no timezone database and never will, because a browser timezone update would silently change the verdict on a fixed input. It therefore cannot generate the VTIMEZONE component for you. The output below will report one MUST finding against itself until you paste a VTIMEZONE block for this identifier into the object. UTC and floating modes have no such requirement.
RFC 5545 dur-value, for example PT1H30M or P2D.
RRULE is a recurrence rule, not a cron expression. FREQ is emitted first because RFC 5545 section 3.3.10 requires it to be the first rule part.
COUNT and UNTIL must not both appear in one rule.
A whole number for COUNT, or a UTC date-time for UNTIL.
Press Build .ics to generate an object.
The bytes above are fed straight back through the validator on this page. This is the same engine and the same checks, run in your browser, right now.