matrix-announcement
Installation
SKILL.md
Matrix Announcement
Content guidance for Matrix announcements; matrix-communication does the sending.
The five rules
- One headline, one purpose. A Matrix message is a tweet, not a blog post.
- Send
formatted_bodywith the HTML subset.bodystays as plaintext fallback. Never send only Markdown — clients are not required to parse it. - Lists beat paragraphs. If you're tempted to write "and also …", start a
<ul>. - Wrap code. Inline
<code>for commands, paths, version strings, IDs, env vars — every one of them. Multi-line snippets in<pre><code class="language-…">. - Layout > words → render an HTML card to PNG. Comparisons, dashboards, multi-row tables die in
formatted_body.
Type tags (pick one — never stack)
| Tag | Meaning | Title example |
|---|---|---|
New skill |
first public release | New skill: github-release-skill v0.2.0 |
Release |
feature version | Release: jira-skill v3.12.0 |
Patch |
bugfix-only | Patch: docker-development-skill v1.7.0 |
Digest |
weekly / multi-skill roundup | Digest: skill ecosystem — week of 2026-04-22 |
Heads-up |
breaking change, deprecation | Heads-up: matrix-skill v2 drops Python 3.8 |
Postmortem |
incident summary | Postmortem: CI cache wipe 2026-04-25 |
RFC |
proposal seeking feedback | RFC: unified checkpoint schema |
Glyphs
One leading glyph at most. Never trailing decoration, multi-emoji ladders, 🚀, or 🎉. Approved: 🤖 bot · 📦 release · 🔧 tooling · 🛡 security · ⚠️ heads-up · 📋 digest · 🔬 RFC · 🚑 hotfix · 🔥 postmortem · ✨ new capability (sparingly).
Pre-send checklist
- Title fits on one line in Element on a 1280-wide screen.
- First sentence states the change. No "we're excited to".
- Every URL wrapped in
<a>with destination-as-text. - Every command, path, version is in
<code>. - Multi-line code in
<pre><code class="language-…">. - At most one prefix glyph; no trailing emoji; no celebration.
-
bodyis a real readable plaintext fallback, not stripped HTML. -
msgtype=m.noticefor unattended automation,m.textotherwise. - No
@roomunless it is an outage. - Layout-heavy → card image with text fallback, not
<table>informatted_body. - Length under 3000 chars or split into a thread.
References
- html-subset.md — allowed/banned tags, Markdown↔HTML,
data-mx-*attributes - structure.md — skeleton, section patterns, element-when-to-use, length budget,
m.textvsm.notice - glyphs.md — full glyph table with banned set
- image-cards.md — chromium → upload →
m.imagerecipe; image-pairing rules - threading.md — threads, mentions, edits, redactions
- anti-patterns.md — wall-of-text, emoji ladder, mention storm, inline URLs (with fixes)
- text-templates.md — drop-in
formatted_bodyskeletons per type tag - templates/ —
release-card.html(1200×630),weekly-digest.html(1200×1500),comparison.html(1200×900) - gallery.html — visual preview of every rule, the five worked examples, and the three templates
Sending: pass the composed message to matrix-communication (matrix-send-e2ee.py "$ROOM" "$MARKDOWN" [--notice]). The transport converts markdown to HTML using the rules in html-subset.md; pass --notice for unattended automation so other bots can't auto-reply (mutually exclusive with --emote). For hand-crafted formatted_body or m.image cards, call the homeserver API directly — recipe in image-cards.md.