How to convert engineering rfcs to confluence wiki markup
- Step 1Paste or upload the RFC — Use Upload file to load the
.mdfrom your engineering repo, or Paste text for a section. Single file only — combine multiple RFC parts with md-merger first if needed. - Step 2Click Run — The transform stashes fenced code (including diagram fences), then rewrites headings, lists, inline code, links, blockquotes, and rules. No options to configure.
- Step 3Verify section headings and code — Confirm Motivation / Detailed Design / Alternatives became
h2.and that code samples landed in{code:lang}macros with the right language label. - Step 4Copy the wiki markup — Click Copy to put the full wiki-markup string on your clipboard.
- Step 5Insert via Confluence's Wiki Markup dialog — In the Confluence editor, Insert > Markup, set type to Wiki Markup, paste, and Insert.
- Step 6Rebuild decision matrices and handle diagrams — Rebuild any GFM comparison or decision-matrix tables as
||header||rows. For Mermaid diagrams, install the Confluence Mermaid app to render the{code:mermaid}block, or pre-render the diagram to an image and embed it.
RFC elements and their wiki output
How the parts of an engineering RFC map through the transform.
| RFC element | Markdown | Wiki output |
|---|---|---|
| Section heading | ## Motivation | h2. Motivation |
| Sub-section | ### API Changes | h3. API Changes |
| Code sample | ` go … ` | {code:go}…{code} |
| Mermaid diagram | ` mermaid … ` | {code:mermaid}…{code} |
| Inline type name | RetryPolicy | {{RetryPolicy}} |
| Design rationale quote | > We chose X because… | bq. We chose X because… |
| Alternative list | - Option A | * Option A |
| Ordered phases | 1. Phase one | # Phase one |
| Reference link | [ADR-7](https://wiki/adr7) | [ADR-7|https://wiki/adr7] |
| Section divider | --- | ---- |
Engineering constructs that need a manual step
Things RFCs commonly include that the transform does not handle.
| Element | What the tool does | Manual action |
|---|---|---|
| Decision matrix (GFM table) | Passes through as raw pipe text | Rebuild as ||Option||Pros||Cons|| rows |
| Mermaid / diagram fence | Becomes {code:mermaid}…{code} (source, not a picture) | Install the Confluence Mermaid app, or pre-render to an image |
Architecture image  | Becomes ![arch|url] (link form) | Attach the image and reference with !arch.png! |
Footnotes [^1] | Left as literal [^1] text | Inline the note or use a Confluence footnote macro |
Math $E=mc^2$ | Passed through as literal text | Use a Confluence math/LaTeX macro after paste |
Input limits by tier
A long RFC with embedded code can hit the character cap before the file-size cap.
| Tier | Max size | Max characters | Files / run |
|---|---|---|---|
| Free | 1 MB | 500,000 | 1 |
| Pro | 10 MB | 5,000,000 | 1 used |
| Pro + Media | 50 MB | 20,000,000 | 1 used |
| Developer | 500 MB | Unlimited | 1 used |
Cookbook
RFC fragments before and after conversion, plus the Confluence-side follow-ups for diagrams and matrices.
Motivation section with a rationale quote
The heading becomes h2. and the blockquote rationale becomes bq. Upgrade to a {info} panel in Confluence if you want a styled callout.
Markdown in: ## Motivation > The current retry logic causes thundering-herd outages. We need bounded, jittered backoff. Wiki out: h2. Motivation bq. The current retry logic causes thundering-herd outages. We need bounded, jittered backoff.
Code sample with a language tag
Fenced Go becomes a {code:go} macro. The pointer star and the brackets in the slice index are preserved because the block is stashed before inline rules run.
Markdown in:
```go
func retry(p *RetryPolicy) {
delays := []int{1, 2, 4}
}
```
Wiki out:
{code:go}
func retry(p *RetryPolicy) {
delays := []int{1, 2, 4}
}
{code}Mermaid diagram becomes a code macro, not a picture
A mermaid fence converts to {code:mermaid}. Confluence needs the Mermaid app to render it; otherwise pre-render to an image and embed.
Markdown in:
```mermaid
graph TD; A-->B; B-->C;
```
Wiki out:
{code:mermaid}
graph TD; A-->B; B-->C;
{code}
Confluence: install the Mermaid app, or replace with !diagram.png!Alternatives Considered as a list with references
Bullet alternatives become * items and the ADR reference link flips to pipe form.
Markdown in: ## Alternatives Considered - Fixed backoff (rejected, see [ADR-7](https://wiki/adr7)) - No retry (rejected, breaks idempotency) Wiki out: h2. Alternatives Considered * Fixed backoff (rejected, see [ADR-7|https://wiki/adr7]) * No retry (rejected, breaks idempotency)
Decision matrix left for manual rebuild
A GFM decision matrix passes through untouched. Rebuild it as Confluence wiki table rows so it renders as a grid.
Markdown in: | Option | Latency | Risk | | ------ | ------- | ---- | | Jittered backoff | low | low | | Fixed backoff | low | high | Wiki out (unchanged): | Option | Latency | Risk | | ------ | ------- | ---- | | Jittered backoff | low | low | | Fixed backoff | low | high | Confluence form: ||Option||Latency||Risk|| |Jittered backoff|low|low| |Fixed backoff|low|high|
Edge cases and what actually happens
Decision matrices and comparison tables not converted
By designThe transform has no table logic, so a decision matrix or comparison table passes through as plain pipe text and renders as monospaced lines in Confluence. Rebuild it as ||Option||Pros||Cons|| rows. This corrects earlier copy implying decision matrices keep their layout automatically.
Mermaid diagrams become code, not pictures
Manual fixA ``` mermaid fence converts to a {code:mermaid}…{code} block — the diagram source, not a rendered image. Confluence renders it only with a Mermaid app installed; otherwise pre-render the diagram to PNG/SVG and embed it as an attachment with !diagram.png!`.
Architecture images become a link form
Manual fix becomes ![architecture|url], which Confluence will not render inline. Attach the image to the page and reference it with !architecture.png!, or paste it into the editor directly.
Math notation is passed through as text
Manual fixThere is no math support — $E=mc^2$ or \[ … \] stays as literal text. Use a Confluence LaTeX/math macro after pasting for properly typeset equations. To normalize math delimiters on the Markdown side first, see md-math-normalizer.
Underscored type/field names read as italic
Watch outAn identifier like max_in_flight written in prose can render as italic in Confluence (_ means italic). Wrap such names in inline code so they become {{max_in_flight}} monospace and the underscores are safe.
Footnotes survive as bracket text
Manual fixMarkdown footnotes [^1] and their definitions are not handled and remain as literal text. Inline the note where it is referenced, or use a Confluence footnote macro after pasting.
Pasted into the rich editor instead of the Wiki Markup dialog
Display issuePasting wiki markup straight into the Confluence body shows literal h2. and {code} text. Use Insert > Markup > Wiki Markup so Confluence interprets the syntax before inserting.
Empty input
ExpectedNo input returns an empty string. Paste the RFC or select a file first.
Large RFC exceeds Free character cap
Tier limitA long RFC with embedded code listings can pass 500,000 characters while under 1 MB. Convert section by section, or upgrade to Pro (5,000,000 characters). Merge parts into one page first with md-merger if needed.
Frequently asked questions
Will Mermaid diagrams render in Confluence?
Only with the Confluence Mermaid app installed. This tool converts a ``` mermaid fence to a {code:mermaid}…{code} block — the diagram source, not a picture. Without the app, pre-render the diagram to an image and embed it as an attachment with !diagram.png!`.
Do decision-matrix tables keep their layout?
No. GFM tables pass through as plain pipe text. Rebuild a decision matrix as ||Option||Pros||Cons|| rows in Confluence for a real grid. If your source table is malformed, md-table-repair can normalize it on the Markdown side first.
How are code samples handled?
Each fenced block becomes a {code:lang}…{code} macro (or {code} with no language). Code is stashed before the inline passes, so pointers (*p), underscores, and brackets inside the sample are preserved exactly. Confluence renders it with the language label and monospace styling.
What about math notation in the RFC?
There is no math support — $…$ and \[…\] pass through as literal text. Use a Confluence LaTeX/math macro after pasting. To standardize math delimiters in the source first, see md-math-normalizer.
How do reference links to ADRs and PRs convert?
[ADR-7](url) becomes [ADR-7|url], the pipe form Confluence's Wiki Markup dialog expects. External URLs stay clickable; for internal pages you can also use Confluence's link picker after pasting.
Are there any options to configure?
No. The transform is deterministic with no settings. Shape the output by editing the Markdown. md-lint, md-toc-generator, and md-code-block-tagger help prep an RFC source first.
Is my RFC content uploaded anywhere?
No. The conversion runs in your browser on a string. Internal architecture, service names, and security considerations never reach a server. Only an anonymous run counter is recorded for dashboard stats.
What output do I get and how do I save it?
Plain wiki-markup text. Copy it to the clipboard or Download a -jira.txt file (original name plus -jira.txt). Paste the copied text into Confluence's Insert > Markup > Wiki Markup dialog.
How large an RFC can I convert at once?
Free: 1 MB / 500,000 characters per file. Pro: 10 MB / 5,000,000 characters. The character cap is independent of byte size, so an RFC dense with code can hit it first. The tool converts one file per run; merge parts with md-merger beforehand.
How do I keep the Git RFC and the Confluence page in sync?
Treat the Markdown in Git as the source of truth and re-run this conversion on each change. Save the -jira.txt output beside the source for traceability. The tool does no diffing itself — compare versions with md-diff.
What if my type names contain underscores?
Wrap them in inline code. In prose, max_in_flight can render as italic because Confluence treats _ as emphasis. Writing ` max_in_flight makes it {{max_in_flight}}` monospace, which renders literally.
Where do I go for other RFC output targets?
For a Jira tracking ticket use the Jira wiki guide; for a polished PDF of the design doc see md-to-pdf-academic; for a Word review copy see md-to-docx; for a self-contained HTML page see md-to-html.
Privacy first
All Markdown processing runs locally in your browser using JavaScript. No file is ever uploaded to JAD Apps servers — only metadata counters are saved for signed-in dashboard stats.