Template Markdown Capabilities

Each SCM provider renders comment bodies, check-run output, and discussion posts through its own markdown engine. Writing templates that look great on GitHub but break on Bitbucket is easy. This page tells you exactly what each provider supports so you can write portable templates or tailor them per platform.

Feature matrix

FeatureGitHubGitLabGiteaBitbucket CloudBitbucket ServerAzure DevOpsSourceHut
Boldβœ…βœ…βœ…βœ…βœ…βœ…βŒ
Italicβœ…βœ…βœ…βœ…βœ…βœ…βŒ
Strikethroughβœ…βœ…βœ…βœ…βœ…βŒβŒ
Inline codeβœ…βœ…βœ…βœ…βœ…βœ…βŒ
Code blocksβœ…βœ…βœ…βœ…βœ…βœ…βŒ
Headingsβœ…βœ…βœ…βœ…βœ…βœ…βŒ
Ordered listsβœ…βœ…βœ…βœ…βœ…βœ…βŒ
Unordered listsβœ…βœ…βœ…βœ…βœ…βœ…βŒ
Task listsβœ…βœ…βœ…βŒβŒβŒβŒ
Tablesβœ…βœ…βœ…βš οΈβš οΈβœ…βŒ
Blockquotesβœ…βœ…βœ…βœ…βœ…βœ…βŒ
Linksβœ…βœ…βœ…βœ…βœ…βœ…βŒ
Imagesβœ…βœ…βœ…βŒβŒβœ…βŒ
<details>/<summary>βœ…βœ…βœ…βŒβŒβŒβŒ
Emojiβœ…βœ…βœ…βœ…βœ…βœ…βŒ
Same-repo issue refs (#123)βœ…βœ…βœ…βœ…βœ…βœ…βŒ
Cross-repo refs (owner/repo#123)βœ…βœ…βœ…βœ…βœ…βŒβŒ
PR/MR refs#123!123#123#123#123#123❌
User mentions (@user)βœ…βœ…βœ…βœ…βœ…βœ…βŒ
Auto-linked referencesβœ…βœ…βœ…βœ…βœ…βœ…βŒ

⚠️ Bitbucket tables: Bitbucket renders GFM tables inconsistently across Cloud and Server versions. Bold lists are a safer choice for structured data.

SourceHut: Uses an email/patch-based workflow. No markdown rendering at all. The commit status API exists, but comment bodies are not applicable.

API field limits

Every provider enforces maximum lengths on different fields. The relay applies Truncate() automatically when needed, but you should design your templates to stay within these limits for the best readability.

ProviderStatus DescriptionStatus ContextComment BodyLabel Name
GitHub140 chars255 chars65,000 chars50 chars
GitLab255 charsN/A1,000,000 chars255 chars
Gitea255 chars255 chars65,000 chars50 chars
Bitbucket Cloud255 chars255 chars65,000 charsN/A
Bitbucket Server255 chars255 chars65,000 charsN/A
Azure DevOps4,000 charsN/A65,000 chars255 chars
SourceHutN/AN/AN/AN/A

What this means for your templates:

Provider-specific notes

GitHub

Full GitHub Flavored Markdown. Use <details>/<summary> to collapse result tables, task lists for checklists, and tables for structured data. Auto-links #123 issues and PRs, @user mentions, and commit SHAs.

Best template candidates: github-pr-comment.tmpl, github-checkrun.tmpl.

GitLab

GitLab Flavored Markdown extends standard GFM. Merge request references use !123 instead of #123. Task lists (- [ ] / - [x]) work in notes. Tables and <details> are supported. Auto-links issues, MRs, and users.

Best template candidate: gitlab-note.tmpl.

Gitea

Nearly identical to GitHub’s GFM. Full support for tables, <details>, task lists, and cross-references. Works well with GitHub-style templates.

Best template candidates: gitea-pr-comment.tmpl, gitea-issue-comment.tmpl.

Bitbucket Cloud and Server

Basic formatting works (bold, lists, links, code blocks). Tables render inconsistently across versions. <details>/<summary> is not supported. Stick to bold lists for structured data instead of tables.

Best template candidate: bitbucket-comment.tmpl (uses bold lists, not tables).

Azure DevOps

GFM tables and code blocks render well. <details>/<summary> is not supported. The description field for commit statuses has a generous 4,000 character limit. Cross-repo references are not supported.

Best template candidate: azuredevops-comment.tmpl.

SourceHut

No markdown rendering. SourceHut uses email-based workflows with commit trailers. Templates are only meaningful for the commit status API (text description). Don’t attempt markdown formatting.

Writing portable templates

If you need a single template that works across providers, follow these guidelines:

  1. Use bold lists instead of tables for structured data. Tables break on Bitbucket.
  2. Avoid <details>/<summary> for Bitbucket and Azure DevOps. Use headings to separate sections instead.
  3. Keep status descriptions under 140 characters to satisfy GitHub’s limit.
  4. Use Truncate() for dynamic content like Description and result values. This prevents overflow on any provider.
  5. Use IssueRef() and PRRef() domain helpers instead of hardcoded #123 syntax. These produce the correct syntax per provider (e.g., !123 for GitLab merge requests).
  6. Test with the provider’s actual render preview before deploying templates to production.

The configmap-templates.yaml shipped with the Helm chart includes provider-specific templates that follow these rules. Start there and customize from a known-good baseline.