Overview
AFL (Already Format Language) is the description format already.events understands. You write event descriptions in your Google Calendar — or wherever your data comes from — using any combination of the features below. AFL handles them automatically: it auto-detects whether you wrote HTML, Markdown, or plain text; pulls out comments, directives, image URLs, and platform links; and renders the rest as the visitor-facing event description.
You don't have to learn AFL all at once. Plain text and Markdown both work. The advanced features layer on as you need them.
Base formats
AFL auto-detects each description as one of three base formats:
| Format | Detection | Rendering |
|---|---|---|
| HTML | Contains <tag> patterns |
Sanitized to a safe subset of tags and attributes |
| Markdown | Contains # headings, **bold**, [links](url), - lists, etc. |
Parsed with marked, then sanitized |
| Plain text | Default | HTML-escaped, newlines converted to <br> |
Detection runs after comments, directives, and URL extraction (see Processing order below) so the literal #already: text doesn't accidentally trip Markdown's hash-heading detection.
Comments
Lines starting with // are stripped from descriptions before any other processing happens. Use them for internal notes, TODOs, or to temporarily disable a directive without deleting it.
See Comments for the full rules.
Directives
#already:<type>:<value> tokens let you control rendering — pin events, hide events, add tags, attach images, or surface platform action buttons (Eventbrite, Instagram, Zoom, …). Directives are extracted and removed from the rendered description, then rendered as the appropriate UI element.
The full reference lives in the Directives section of these docs:
- Platform Links — Instagram, Eventbrite, Zoom, Google Maps, and 14 other platforms
- Images —
#already:image:<url>and Google Drive support - Tags — categorize events for filtering
- Attachments — flyers, PDFs, and downloadable files
- Featured & Hidden —
#already:featuredand#already:hidden
URL extraction
URLs in your description are detected and pulled out automatically — you don't need a directive for the common cases:
- Image URLs (
.png,.jpg,.gif,.webp) → event thumbnail and gallery - Google Drive links → converted to direct-servable image URLs
- Dropbox links → normalized to direct-download URLs
- Platform URLs (Eventbrite, Instagram, Zoom, etc.) → action buttons. Same canonicalization as the matching directive.
- File URLs (
.pdf,.doc,.zip, etc.) → downloadable attachment chips
Extracted URLs are removed from the rendered description text so the same content doesn't appear twice (once as the URL, once as the rendered card).
Processing order
When a description goes through AFL, extractions run in this fixed order:
- Comments —
//lines are removed entirely - Directives —
#already:tokens are extracted - Images — image URLs, Google Drive links, Dropbox links
- Links — platform URLs (Eventbrite, Instagram, …)
- Attachments — file URLs (
.pdf,.doc, …) - Format detection — what's left is auto-detected as HTML, Markdown, or plain text
A few invariants:
- All stages decode
&to&before matching (Google Calendar HTML-encodes ampersands). - Stages 2–5 contribute to a shared deduplication set keyed by canonical ID — a directive and a URL pointing to the same resource produce one entry, not two.
- Comments (stage 1) are fully stripped and produce nothing.