Plain-text descriptions in ICS: links and formatting limits
Level: intermediate · ~14 min read · Intent: informational
Audience: developers, product teams, ops engineers, event teams, technical teams
Prerequisites
- basic familiarity with ICS files or calendar events
- basic understanding of plain text vs rich text formatting
Key takeaways
- In RFC 5545, DESCRIPTION is a TEXT property, not a general-purpose HTML container. The safest cross-client assumption is plain text first.
- If you want links to survive reliably, include full HTTPS URLs in plain text and use the dedicated URL property when it fits the event model.
- Formatting limits in ICS are not only about what the spec allows. They are also about line folding, escaping, and how each calendar client chooses to display imported text.
References
FAQ
- Can I put HTML into an ICS DESCRIPTION field?
- The standards-safe assumption is no. DESCRIPTION is a TEXT value in RFC 5545, so clients may display HTML-like markup as literal text or strip it inconsistently.
- How should I include links in an ICS event?
- Use full HTTPS URLs in the plain-text description and use the URL property when you want to point to a canonical event resource.
- How do I create line breaks in DESCRIPTION?
- Use escaped text line breaks like inside the TEXT value, and let the serializer handle RFC line folding separately.
- What is ALTREP for?
- ALTREP points to an alternate representation of a textual property via a URI. It is not the same thing as putting inline HTML directly into DESCRIPTION.
Plain-text descriptions in ICS: links and formatting limits
The biggest mistake people make with ICS descriptions is assuming they behave like mini web pages.
They do not.
An ICS file is plain text.
And in RFC 5545, the DESCRIPTION property is a TEXT value, not a generic HTML field. The RFC defines it as:
DESCRIPTION ... : text
and the description says it is used to capture descriptive text for components such as VEVENT, VTODO, VJOURNAL, and some VALARM uses. citeturn270404view0turn357655view0
That sounds simple. In practice, it means two important things:
- rich formatting is not the safe default
- client behavior around links, line breaks, and alternate renderings varies more than teams expect
This guide explains what plain-text descriptions in ICS can safely do, where links belong, what the formatting limits really are, and how to author event descriptions that survive import into real calendar clients.
Why this topic matters
Teams search for this topic when they need to:
- generate ICS files that include event instructions or links
- understand why HTML formatting disappears or shows literally
- keep event descriptions readable in Outlook, Google Calendar, and Apple Calendar
- avoid broken line wrapping in generated ICS files
- decide whether to use
DESCRIPTION,URL, or both - understand what
ALTREPis actually for - make “Add to calendar” files survive email and browser downloads
- reduce client-specific surprises in calendar imports
This matters because event descriptions are often where product teams try to put:
- registration links
- Zoom or Meet links
- agendas
- bullet lists
- venue notes
- marketing copy
- HTML snippets from templates
And that is exactly where ICS files start behaving less like modern rich documents and more like what they actually are: structured calendar text with strict syntax rules.
Start with the standards truth: DESCRIPTION is text
RFC 5545 defines the DESCRIPTION property with the format:
description = "DESCRIPTION" descparam ":" text CRLF
That text value type matters. It is not declared as HTML, Markdown, or arbitrary markup. citeturn270404view0
The broader RFC section on text values is even more useful.
It says intentional formatted text line breaks in a TEXT property value must be represented as a backslash followed by n or N, and special characters like comma and semicolon must be backslash-escaped in text values. It also says backslashes themselves must be escaped. citeturn270404view5
That means an ICS description is standards-safe when you think of it as:
- plain text
- with escaped line breaks
- and escaped delimiter-like characters inside the text value
Not:
- a free-form rich HTML body
What this means for formatting
If you want to display something like:
Agenda:
- Intro
- Demo
- Q&A
the ICS-safe way is to serialize it as text with escaped newlines:
DESCRIPTION:Agenda:\n- Intro\n- Demo\n- Q&A
That is the correct semantic way to embed intentional line breaks in the text value. The RFC is explicit that literal formatted text line breaks in TEXT values are represented as \n or \N. citeturn270404view5
This is one of the most important distinctions in the whole topic:
Text line breaks inside the property value
Use \n.
Physical line folding in the file
That is a different mechanism entirely.
Escaped line breaks are not the same as folded lines
ICS has two separate concepts that teams often confuse.
1. Escaped line breaks inside the value
These are part of the text content.
Use \n.
2. Folded content lines in the file
These are a serialization rule for long ICS lines.
RFC 5545 says content lines should not be longer than 75 octets excluding the line break, and that long content lines should be split using line folding: insert a CRLF followed by one space or tab, then unfold during parsing. citeturn270404view4
That means this:
DESCRIPTION:This is a long line that gets folded...
may be physically wrapped in the file for transport, but that folding is not the same thing as adding a visible new paragraph in the event description. citeturn270404view4
A safe authoring rule is:
- use
\nfor intended visual line breaks - let your ICS serializer handle folding automatically
Do not hand-fold lines and assume you have created visible formatting.
What happens if you paste HTML into DESCRIPTION
The standards-safe answer is: do not rely on it.
Because DESCRIPTION is a TEXT property, a client can reasonably:
- display angle-bracket markup literally
- strip or escape portions of it
- partially render it in ways that differ from another client
RFC 5545 does provide one related mechanism: ALTREP.
The ALTREP parameter specifies a URI pointing to an alternate representation for a textual property value, and the RFC says the property using it must still include a normal text value reflecting the default representation. The examples note that the URI might point to a text/html body part or network resource. citeturn270404view1
That is a subtle but important difference:
ALTREP
Points to another representation of the text.
DESCRIPTION
Still carries the plain text value itself.
So even the standards mechanism for richer representation is not “put raw HTML inline and hope every client renders it.”
The safest interpretation of ALTREP
ALTREP is best understood as:
- an alternate representation pointer
- not a guarantee of rich rendering support
- not a substitute for a readable plain-text description
RFC 5545 says the parameter value is a URI and that HTTP, HTTPS, and CID are commonly used by implementations. It also says the normal property value must still reflect the default representation. citeturn270404view1
So a good practical rule is:
If your event must remain understandable everywhere, the plain-text DESCRIPTION still has to stand on its own.
That means:
- do not hide essential information only in an alternate representation
- do not assume every client will fetch or honor the URI
- do not treat ALTREP like universal HTML support
Use URL for canonical links, not only DESCRIPTION
RFC 5545 defines a dedicated URL property with value type URI.
Its purpose is to associate a URL with the iCalendar object and convey where a more dynamic rendition of the associated calendar information can be found. citeturn270404view2
That gives you a very useful standards distinction:
DESCRIPTION
Human-readable event text
URL
Canonical event-related web resource
If your event has:
- an event page
- a registration page
- a webinar landing page
- a conference detail page
then the URL property is often the cleanest place to put that canonical link. citeturn270404view2
You can still include the same full HTTPS link inside the plain-text description for user visibility, but URL gives the event a dedicated standards-based link field.
What links in DESCRIPTION should look like
The safest link style in DESCRIPTION is:
- full HTTPS URL
- no HTML anchor tag
- no JavaScript or tracking-heavy link shortener when avoidable
- readable enough to survive plain-text display
Example:
DESCRIPTION:Join the webinar here:\nhttps://example.com/events/product-demo
URL:https://example.com/events/product-demo
This works well because:
- the description remains readable even if the client does nothing “smart”
- the event also has a dedicated canonical URL property
- the link is still useful when copied manually
That is usually safer than relying on:
<a href="...">Click here</a>
inside DESCRIPTION.
Why import behavior still matters
Even if the ICS is authored correctly, imported files are not live rich documents.
Google’s import docs tell users to create or edit .ics files with a text editor and format them according to the provided guidelines or exported examples. Apple’s Calendar docs describe importing .ics files as a file-based event transfer workflow. Outlook’s ICS-link docs explicitly distinguish importing an ICS file from subscribing to a calendar feed and say imported events do not automatically refresh afterward. citeturn357655view1turn357655view3turn357655view2
That matters because:
- description rendering is part of import/display behavior
- imported files are not a web app
- later edits to a source page do not magically restyle or resync the imported plain-text description
So author the description as if:
- the user may see exactly the imported text
- and nothing more
The safest authoring pattern
For the broadest client safety, use this pattern:
1. Keep DESCRIPTION plain-text first
No dependency on HTML rendering.
2. Use escaped \n for visible line breaks
That is the standards path for intentional formatting in text values. citeturn270404view5
3. Use full HTTPS links
Do not rely on anchor tags.
4. Use URL for the canonical event link
That is what the dedicated property is for. citeturn270404view2
5. Let your serializer handle line folding
Do not confuse folding with content formatting. citeturn270404view4
6. Keep essential information in the plain-text body
ALTREP may help, but the plain-text fallback must stand on its own. citeturn270404view1
Good examples
Example 1: safest baseline
DESCRIPTION:Product Demo\nJoin link:\nhttps://example.com/demo\nBring your questions.
URL:https://example.com/demo
Why it works:
- plain-text readable
- visible line breaks
- no HTML dependency
- dedicated canonical URL
Example 2: long description with folding
A serializer may output the description across folded content lines to respect the RFC length guidance.
That is fine.
It should still unfold back into one DESCRIPTION value when parsed. citeturn270404view4
Example 3: alternate representation with fallback
DESCRIPTION;ALTREP="https://example.com/events/demo-description.html":Product Demo\nJoin link:\nhttps://example.com/demo
URL:https://example.com/demo
Why it is safer than inline HTML:
- the main text still stands alone
- the alternate representation is a URI, which matches the RFC model
- clients that ignore ALTREP still have a complete description citeturn270404view1
Common anti-patterns
Pasting raw HTML into DESCRIPTION
This is the fastest path to inconsistent rendering.
Using folded lines as if they were visible paragraphs
Folding is transport serialization, not display formatting. citeturn270404view4
Putting the only meaningful link in ALTREP
Clients may not surface it the way you expect.
Using relative or fragile URLs
A plain-text calendar description should be copyable and understandable out of context.
Forgetting to escape commas, semicolons, backslashes, or intended line breaks in TEXT values
RFC 5545 requires explicit escaping for these text cases. citeturn270404view5
A practical checklist before shipping an ICS file
Use this checklist for event descriptions:
- Is the description readable as plain text?
- Are visible line breaks represented with
\n? - Are full HTTPS links included in text where users can copy them?
- Is the canonical event page also placed in
URL? - Are special text characters escaped correctly?
- Is line folding handled by the generator, not by hand?
- Does the file still look right after import into at least two calendar clients?
This is the safest way to avoid “it worked in one calendar” surprises.
Which Elysiate tools fit this article best?
For this topic, the most natural supporting tools are:
- QR Code Generator SVG
- ICS File Generator
- CSV Validator
- CSV Format Checker
- CSV Delimiter Checker
- CSV Header Checker
- CSV Row Checker
- ICS tools hub
These fit naturally because event descriptions often start from exported or transformed data, but the final ICS still needs clean text, safe links, and standards-correct serialization.
FAQ
Can I put HTML into an ICS DESCRIPTION field?
The standards-safe assumption is no. DESCRIPTION is a TEXT value in RFC 5545, so clients may display HTML-like markup as literal text or handle it inconsistently. citeturn270404view0turn270404view5
How should I include links in an ICS event?
Use full HTTPS URLs in the plain-text description and use the URL property when you want to point to a canonical event resource. RFC 5545 defines URL specifically for an associated calendar-object URI. citeturn270404view2
How do I create line breaks in DESCRIPTION?
Use escaped text line breaks like \n inside the TEXT value, and let the serializer handle RFC line folding separately. citeturn270404view5turn270404view4
What is ALTREP for?
ALTREP points to an alternate representation of a textual property via a URI. It is not the same thing as putting inline HTML directly into DESCRIPTION, and the plain-text property value still has to be present. citeturn270404view1
Why doesn’t import guarantee the same rendering everywhere?
Because importing is a client workflow, not only a syntax check. Google, Apple, and Outlook all support ICS import, but imported files are still interpreted and displayed by product-specific UIs. Outlook’s docs also explicitly distinguish imported ICS snapshots from subscribed calendars. citeturn357655view1turn357655view2turn357655view3
What is the safest default?
Treat DESCRIPTION as plain text, use \n for visible breaks, put canonical links in URL, and keep the event understandable even if every client ignores richer alternate renderings.
Final takeaway
Plain-text descriptions in ICS are not a limitation you can hack around casually. They are the core contract of the format.
The safest baseline is:
- write DESCRIPTION as real plain text
- use escaped
\nfor visible breaks - use URL intentionally for event links
- treat ALTREP as optional enhancement, not primary content
- let the serializer handle folding
- test in the clients your users actually use
That is how you make ICS descriptions readable, link-friendly, and much less likely to surprise people after import.
About the author
Elysiate publishes practical guides and privacy-first tools for data workflows, developer tooling, SEO, and product engineering.