<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://ngpilot.com/blog</id>
    <title>NGPILOT Blog</title>
    <updated>2026-10-24T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://ngpilot.com/blog"/>
    <subtitle>NGPILOT Blog</subtitle>
    <icon>https://ngpilot.com/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[The Real Cost of Migrating Confluence Macros (2026)]]></title>
        <id>https://ngpilot.com/blog/confluence-macro-migration-cost</id>
        <link href="https://ngpilot.com/blog/confluence-macro-migration-cost"/>
        <updated>2026-10-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[When a Confluence app retires, its macros die — the content often survives in storage. What macro migration really costs, and a Mermaid case study.]]></summary>
        <content type="html"><![CDATA[<p>Somewhere in your Confluence right now there are pages that depend on a third-party app to render. A diagram here, a markdown block there, a whiteboard embed somewhere else. The pages are fine. The app is fine. Everything is fine — until it isn't: the vendor retires the app, gets acquired, or your team outgrows it. And then a question almost nobody has asked out loud suddenly matters: <strong>what is actually stored on those pages, and what survives?</strong></p>
<p>We just went through this cycle for Mermaid diagram apps — one major vendor just announced the end of life of its Connect-based app in January 2027 — and the experience taught us a lot about the real cost of macro migration. Not the license cost. The <strong>content</strong> cost. This post is that breakdown; the Mermaid story is the case study at the end.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-anatomy-what-a-macro-actually-leaves-behind">The anatomy: what a macro actually leaves behind<a href="https://ngpilot.com/blog/confluence-macro-migration-cost#the-anatomy-what-a-macro-actually-leaves-behind" class="hash-link" aria-label="Direct link to The anatomy: what a macro actually leaves behind" title="Direct link to The anatomy: what a macro actually leaves behind" translate="no">​</a></h2>
<p>Confluence macros are stored <strong>inside the page itself</strong>. The app renders them live; Confluence only stores a small block describing the macro and its content. When the rendering app disappears, the page keeps the block but nothing draws it anymore. The text, the diagram definition, the table — whatever the app put in storage — is still there.</p>
<p>So content usually <strong>survives</strong> the app. What dies is the render. And that is the trap: "my pages still exist" feels safe until you open one and the diagram simply is not there anymore.</p>
<p>Whether the surviving data is <em>usable</em> depends entirely on the vendor:</p>
<ul>
<li class="">Some apps keep the human-readable source (Mermaid syntax, markdown) directly in storage</li>
<li class="">Some wrap it in JSON with revision history</li>
<li class="">Some store only a rendered image and keep the source in a proprietary attachment format</li>
<li class="">Some do all three, depending on the app version that last touched the macro</li>
</ul>
<p>Every one of those is a different migration project.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-the-cost-is-always-higher-than-it-looks">Why the cost is always higher than it looks<a href="https://ngpilot.com/blog/confluence-macro-migration-cost#why-the-cost-is-always-higher-than-it-looks" class="hash-link" aria-label="Direct link to Why the cost is always higher than it looks" title="Direct link to Why the cost is always higher than it looks" translate="no">​</a></h2>
<p><strong>Cost 1: the formats.</strong> Each vendor's storage format is undocumented and versioned. Reading "what's on the page" is not a query — it is a small reverse-engineering project per app, sometimes per app <em>version</em>. This is the single biggest line item in any macro migration.</p>
<p><strong>Cost 2: the scale is invisible until you measure it.</strong> Teams consistently underestimate how many pages depend on an app, because diagrams are scattered — one here in an architecture doc, three there in a runbook. Nobody costs a migration they have not inventoried.</p>
<p><strong>Cost 3: the app ecosystem keeps generating this problem.</strong> This is not a rare event. Atlassian ended its own Server product line in 2024, forcing one of the largest app-and-content migrations in the platform's history. Vendors retire or pivot — the Connect-based Mermaid app by Stratus reaches end of life in January 2027, the very case that prompted this post. Free first-party alternatives keep appearing in the same categories. And independent of any retirement, teams <strong>switch vendors</strong> — which is the same migration with a different trigger. If your team uses Confluence deeply today, the odds that it will face at least one macro migration in the next few years are close to certain.</p>
<p><strong>Cost 4: the manual fallback is real but doesn't scale.</strong> Opening every page and recreating content by hand genuinely works — for ten pages. At a hundred, triage paralysis sets in: nobody costs it, nobody schedules it, and the migration quietly becomes "we'll deal with it when it breaks."</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="case-study-what-migrating-mermaid-diagrams-took">Case study: what migrating Mermaid diagrams took<a href="https://ngpilot.com/blog/confluence-macro-migration-cost#case-study-what-migrating-mermaid-diagrams-took" class="hash-link" aria-label="Direct link to Case study: what migrating Mermaid diagrams took" title="Direct link to Case study: what migrating Mermaid diagrams took" translate="no">​</a></h2>
<p>When the retirement news landed, we built migration support into our Mermaid app — and the economics matched the framework above almost exactly.</p>
<p><strong>Inventory first.</strong> A scan reads page storage and counts macros per page. Teams that ran it found diagrams in spaces nobody expected — the invisible-scale problem, confirmed every time.</p>
<p><strong>Four vendors, four formats.</strong> We ended up supporting four distinct storage layouts: source in a macro parameter, source in a JSON blob in the macro body, source in a companion code block, and a renderer macro that references all of the above. Four parsers, each a small reverse-engineering project against undocumented formats.</p>
<p><strong>Conversion is text processing; judgment is not.</strong> Replacing an old macro with a new rendered diagram at the same position in the page is mechanical. The hard parts were elsewhere: pages that mix several vendors' macros (convert only what you scanned for?), diagrams whose source cannot be extracted (report them honestly, per page, or they vanish without a trace), and the rollback story (in-place conversion plus page history beats any backup script).</p>
<p><strong>The result:</strong> a space sweep per source app, a review table before anything is written, and every conversion landing as a normal page version. That combination turned an unbounded, scary project into a bounded checklist.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-general-checklist">The general checklist<a href="https://ngpilot.com/blog/confluence-macro-migration-cost#the-general-checklist" class="hash-link" aria-label="Direct link to The general checklist" title="Direct link to The general checklist" translate="no">​</a></h2>
<p>Whatever the macro type — diagrams, markdown, tables, whiteboards — the same checklist applies:</p>
<ol>
<li class=""><strong>Inventory by scanning page storage</strong>, not by asking around</li>
<li class=""><strong>Map the formats</strong>: where each vendor keeps the source, and whether it is human-readable</li>
<li class=""><strong>Migrate one vendor at a time</strong>, with per-page results before anything is written</li>
<li class=""><strong>Convert in place</strong> and let page history be the rollback mechanism</li>
<li class=""><strong>Report failures per page</strong> — silent skips are how content quietly dies anyway</li>
</ol>
<p>The teams that skip steps 1 and 2 are the teams whose migration "unexpectedly" takes a quarter.</p>
<hr>
<p>If the macros you're leaving behind are Mermaid diagrams, you can start today: <a href="https://marketplace.atlassian.com/apps/1236814/" target="_blank" rel="noopener noreferrer" class="">Mermaid Plus Diagrams &amp; AI Agent for Confluence</a> includes the migration wizard described above — it recognizes macros from Mermaid Chart, Stratus, the Atlassian Labs viewer, weweave and Tech Labs, and converts them in place. The <a class="" href="https://ngpilot.com/docs/Mermaid-Plus-for-Confluence/migration">migration guide</a> walks through every step.</p>
<p>If you're switching away from a different macro type — draw.io, Excalidraw, markdown, tables — the checklist above still applies, and the same pipeline (inventory → parse → convert in place) is how we're expanding coverage: Excalidraw is next on the roadmap. Tell us which app you're switching <strong>from</strong> — the more we know about the formats teams are actually leaving, the faster that list grows.</p>
<p>And if you're mid-decision right now, bring it to <a href="https://community.atlassian.com/forums/discussion/3315617/what-do-you-do-with-pages-with-old-macros-when-you-decide-to-switch-confluence-macro-apps" target="_blank" rel="noopener noreferrer" class="">the Community discussion</a> — the "we'll migrate as we go" plan needs all the reality checks it can get.</p><div class="margin-top--xl padding-top--lg"><h2 class="anchor anchorWithStickyNavbar_LWe7">Related guides</h2><ul><li><a href="https://ngpilot.com/blog/how-to-create-mermaid-diagrams-jira">How to Create Mermaid Diagrams in Jira</a></li><li><a href="https://ngpilot.com/blog/export-jira-issues-to-excel">Export Jira Issues to Excel or CSV</a></li><li><a href="https://ngpilot.com/blog/bulk-download-jira-attachments">Bulk Download Jira Attachments</a></li><li><a href="https://ngpilot.com/blog/how-to-migrate-confluence-content">How to Migrate Confluence Content</a></li><li><a href="https://ngpilot.com/blog/block-quote-confluence">How to Add a Block Quote in Confluence</a></li></ul></div><div style="display:flex;flex-wrap:wrap;gap:0.75rem;justify-content:center;margin-top:2.5rem;margin-bottom:1rem;padding-top:1.5rem;border-top:1px solid var(--ifm-color-emphasis-200)"><span style="font-size:0.875rem;font-weight:600;color:var(--ifm-color-emphasis-500);align-self:center;width:100%;text-align:center;margin-bottom:0.25rem">Explore NGPILOT</span><a class="button button--secondary button--sm" href="https://ngpilot.com/solutions">Browse Solutions</a><a class="button button--secondary button--sm" href="https://ngpilot.com/apps">All Apps</a><a class="button button--secondary button--sm" href="https://ngpilot.com/blog/archive">All Posts</a><a href="https://marketplace.atlassian.com/vendors/1226848/?utm_source=ngpilot.com&amp;utm_medium=blog&amp;utm_campaign=hub-links" class="button button--secondary button--sm" target="_blank" rel="noopener noreferrer">Atlassian Marketplace →</a></div>]]></content>
        <author>
            <name>NGPilot</name>
            <uri>https://ngpilot.com</uri>
        </author>
        <category label="confluence" term="confluence"/>
        <category label="macro" term="macro"/>
        <category label="migration" term="migration"/>
        <category label="vendor-lock-in" term="vendor-lock-in"/>
        <category label="mermaid" term="mermaid"/>
        <category label="diagrams" term="diagrams"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Jira Checklist Templates: Copy-Paste Sets for 6 Workflows]]></title>
        <id>https://ngpilot.com/blog/jira-checklist-templates</id>
        <link href="https://ngpilot.com/blog/jira-checklist-templates"/>
        <updated>2026-10-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Six copy-paste Jira checklist templates — bug fix, incident, release, code review, onboarding, publishing — and how to save each one.]]></summary>
        <content type="html"><![CDATA[<p>Every team re-types the same list: the release steps, the incident first hours, what "this bug is fixed" actually means. Retyped lists drift — one ticket gets five steps, the next gets two and a shrug. A checklist template fixes the drift: write the list once, and every issue of that kind starts with the same checkboxes. This post gives you six copy-paste templates and shows how to save them so nobody retypes them again.</p>
<p><strong>Quick answer:</strong> Jira has no native checklist object, so there is nothing native to template. Paste one of the checklists below into an issue, install <a href="https://marketplace.atlassian.com/apps/1795968238/" target="_blank" rel="noopener noreferrer" class="">Checklist Workflow Automation for Jira</a> (free for up to 10 users) to turn it into a real checklist, flag the non-negotiables as <strong>required</strong>, and save it via the ⋯ menu as a reusable project template. Add the <strong>Checklist required items complete</strong> validator to the Done transition and the template stops being a suggestion.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="where-a-checklist-template-can-live">Where a checklist template can live<a href="https://ngpilot.com/blog/jira-checklist-templates#where-a-checklist-template-can-live" class="hash-link" aria-label="Direct link to Where a checklist template can live" title="Direct link to Where a checklist template can live" translate="no">​</a></h2>
<p>Three storage spots, in increasing order of usefulness:</p>
<ol>
<li class=""><strong>A Confluence page or Slack message</strong> — the "master copy" nobody opens at ticket time. Fine as documentation, useless as automation.</li>
<li class=""><strong>The issue description</strong> — works, and pairs with <a class="" href="https://ngpilot.com/blog/how-to-create-jira-issue-templates">issue templates</a> that pre-fill the description on every new issue. But checkboxes in free text are inert: nothing tracks their state, and nothing stops the issue closing unchecked.</li>
<li class=""><strong>A saved checklist template on the issue itself</strong> — with Checklist Workflow Automation, a saved template re-applies as live checklist items with state, required flags, and JQL visibility. Sub-task nesting round-trips too, and CSV import/export means you can maintain the master list in Excel and paste it in.</li>
</ol>
<p>The rest of this post gives you the lists. Storage spot 3 is what makes them stick.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-six-templates">The six templates<a href="https://ngpilot.com/blog/jira-checklist-templates#the-six-templates" class="hash-link" aria-label="Direct link to The six templates" title="Direct link to The six templates" translate="no">​</a></h2>
<p>Each list is plain markdown — paste it as-is, then flag the ⭐ items as required.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-bug-fix">1. Bug fix<a href="https://ngpilot.com/blog/jira-checklist-templates#1-bug-fix" class="hash-link" aria-label="Direct link to 1. Bug fix" title="Direct link to 1. Bug fix" translate="no">​</a></h3>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> ⭐ Reproduce the bug on the affected version</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> ⭐ Write a failing test that captures the bug</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Fix implemented</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Regression test added for the surrounding area</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> ⭐ Changelog / release note entry written</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Reporter confirmed the fix (or QA sign-off)</span><br></div></code></pre></div></div>
<p>The discipline point is the first item: a fix that cannot be reproduced cannot be verified. Pair the list with a <a class="" href="https://ngpilot.com/blog/how-to-create-jira-issue-templates">structured bug template</a> so the reproduction steps arrive with the ticket.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-incident-response">2. Incident response<a href="https://ngpilot.com/blog/jira-checklist-templates#2-incident-response" class="hash-link" aria-label="Direct link to 2. Incident response" title="Direct link to 2. Incident response" translate="no">​</a></h3>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> ⭐ Severity assessed and incident channel opened</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Customers / stakeholders notified (status page or banner)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> ⭐ Mitigation in place — impact stopped or contained</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Timeline of events recorded as it happens</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Root cause identified</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Postmortem document created and scheduled</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Follow-up actions filed as issues</span><br></div></code></pre></div></div>
<p>Items 1–3 are the ones that get skipped at 3 a.m. — which is exactly why they are the required ones. The validator refusing to close the incident until the status page was updated is cheaper than the retro conversation about why it wasn't.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-release">3. Release<a href="https://ngpilot.com/blog/jira-checklist-templates#3-release" class="hash-link" aria-label="Direct link to 3. Release" title="Direct link to 3. Release" translate="no">​</a></h3>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> ⭐ All release-scope issues resolved or explicitly deferred</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> ⭐ Test pass complete on the release candidate</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Release notes drafted and reviewed</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Documentation updated</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> ⭐ Deployed to production</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Smoke test on production passed</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Announce to stakeholders</span><br></div></code></pre></div></div>
<p>This is the <a class="" href="https://ngpilot.com/blog/jira-definition-of-done-template">definition-of-done pattern</a> scaled up from one issue to a version. Keep the issue-level list short and let the release checklist own the version-level gates.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-code-review">4. Code review<a href="https://ngpilot.com/blog/jira-checklist-templates#4-code-review" class="hash-link" aria-label="Direct link to 4. Code review" title="Direct link to 4. Code review" translate="no">​</a></h3>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> ⭐ Tests cover the changed behavior</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> No new warnings or lint suppressions</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Error paths handled, not just the happy path</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Security-sensitive input validated</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> ⭐ Approver is not the author</span><br></div></code></pre></div></div>
<p>Short on purpose — a review checklist longer than this gets skimmed. The last item enforces a policy that Jira alone won't.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-onboarding">5. Onboarding<a href="https://ngpilot.com/blog/jira-checklist-templates#5-onboarding" class="hash-link" aria-label="Direct link to 5. Onboarding" title="Direct link to 5. Onboarding" translate="no">​</a></h3>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> ⭐ Accounts and access provisioned</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Development environment set up and first build runs</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> ⭐ Welcome buddy assigned</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> First issue assigned and completed</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> 30-day check-in scheduled</span><br></div></code></pre></div></div>
<p>Onboarding is where checklist templates pay off fastest: the process runs a few times a year, so nobody carries it in their head, and the person who wrote it has often already left the team.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-content-publishing">6. Content publishing<a href="https://ngpilot.com/blog/jira-checklist-templates#6-content-publishing" class="hash-link" aria-label="Direct link to 6. Content publishing" title="Direct link to 6. Content publishing" translate="no">​</a></h3>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> ⭐ Draft reviewed and approved</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> SEO title and meta description within limits</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Images checked (alt text, sizing, rights)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> ⭐ Published and links verified</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token list punctuation" style="color:#393A34">-</span><span class="token plain"> Distribution done (newsletter, social, community)</span><br></div></code></pre></div></div>
<p>For teams that run Jira beyond engineering — marketing, ops, HR — this is the proof that the same enforcement pattern works on any repeatable list.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="make-the-template-automatic-where-it-matters">Make the template automatic where it matters<a href="https://ngpilot.com/blog/jira-checklist-templates#make-the-template-automatic-where-it-matters" class="hash-link" aria-label="Direct link to Make the template automatic where it matters" title="Direct link to Make the template automatic where it matters" translate="no">​</a></h2>
<p>Two layers of "automatic", both worth wiring:</p>
<ul>
<li class=""><strong>The list arrives on its own.</strong> Saved checklist templates apply from the ⋯ menu in one click; for fully automatic pre-fill, put the checklist in an issue template's description so the list is there the moment the issue is created — no click at all.</li>
<li class=""><strong>Done waits for the list.</strong> The 'Checklist required items complete' validator on the Done transition is what turns a template from a reminder into a rule. This is the part Jira cannot do natively at any price — <a class="" href="https://ngpilot.com/blog/jira-checklist">the full enforcement walkthrough is here</a>.</li>
</ul>
<p>Once the checklists are live, they are searchable: <code>issue in hasIncompleteRequired()</code> finds every issue still owed work before Done — a saved filter that answers "what's blocking release?" without opening a ticket.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="related-resources">Related Resources<a href="https://ngpilot.com/blog/jira-checklist-templates#related-resources" class="hash-link" aria-label="Direct link to Related Resources" title="Direct link to Related Resources" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://ngpilot.com/blog/jira-checklist">Jira Checklists: Block Transitions Until Done</a> — the enforcement mechanics in depth: panels, required flags, the validator, and JQL</li>
<li class=""><a class="" href="https://ngpilot.com/blog/jira-definition-of-done-template">Jira Definition of Done: Template + How to Enforce It</a> — the one checklist every issue type should have</li>
<li class=""><a class="" href="https://ngpilot.com/blog/how-to-create-jira-issue-templates">Create Jira issue templates</a> — pre-fill the whole issue body, checklist included, on every new ticket</li>
<li class=""><a class="" href="https://ngpilot.com/apps/checklist-workflow-automation-for-jira">Checklist Workflow Automation for Jira</a> — templates, CSV import/export, enforcement, and the audit log</li>
</ul><div class="margin-top--lg margin-bottom--lg" style="padding:1.25rem 1.5rem;border-left:4px solid var(--ifm-color-primary);background-color:var(--ifm-color-emphasis-100);border-radius:var(--ifm-global-radius)"><p style="margin-bottom:0.5rem;font-weight:600">Try <!-- -->Modern Issue Templates for Jira</p><p style="margin-bottom:0.75rem;font-size:0.95rem">Create issues from reusable templates with variables, GitHub import, and auto-apply — free for up to 10 users.</p><a href="https://marketplace.atlassian.com/apps/2564635381/modern-issue-templates-for-jira?utm_source=ngpilot.com&amp;utm_medium=website&amp;utm_campaign=modern-issue-templates-for-jira" target="_blank" rel="noopener noreferrer" class="button button--primary button--sm">Get it on the Atlassian Marketplace</a></div><div class="margin-top--xl padding-top--lg"><h2 class="anchor anchorWithStickyNavbar_LWe7">Related guides</h2><ul><li><a href="https://ngpilot.com/blog/jira-checklist">How to Add a Checklist to Jira — and Block Transitions Until Done</a></li><li><a href="https://ngpilot.com/blog/jira-definition-of-done-template">Jira Definition of Done: Template + How to Enforce It</a></li><li><a href="https://ngpilot.com/blog/how-to-create-jira-issue-templates">Create Jira Issue Templates — Import from GitHub, Markdown &amp; Rich Text</a></li></ul></div><div style="display:flex;flex-wrap:wrap;gap:0.75rem;justify-content:center;margin-top:2.5rem;margin-bottom:1rem;padding-top:1.5rem;border-top:1px solid var(--ifm-color-emphasis-200)"><span style="font-size:0.875rem;font-weight:600;color:var(--ifm-color-emphasis-500);align-self:center;width:100%;text-align:center;margin-bottom:0.25rem">Explore NGPILOT</span><a class="button button--secondary button--sm" href="https://ngpilot.com/solutions">Browse Solutions</a><a class="button button--secondary button--sm" href="https://ngpilot.com/apps">All Apps</a><a class="button button--secondary button--sm" href="https://ngpilot.com/blog/archive">All Posts</a><a href="https://marketplace.atlassian.com/vendors/1226848/?utm_source=ngpilot.com&amp;utm_medium=blog&amp;utm_campaign=hub-links" class="button button--secondary button--sm" target="_blank" rel="noopener noreferrer">Atlassian Marketplace →</a></div>]]></content>
        <author>
            <name>NGPilot</name>
            <uri>https://ngpilot.com</uri>
        </author>
        <category label="jira" term="jira"/>
        <category label="checklist" term="checklist"/>
        <category label="templates" term="templates"/>
        <category label="workflow" term="workflow"/>
        <category label="how-to" term="how-to"/>
        <category label="process" term="process"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Atlassian Price Increase 2026: NGPILOT Apps Unchanged]]></title>
        <id>https://ngpilot.com/blog/atlassian-price-increase-2026</id>
        <link href="https://ngpilot.com/blog/atlassian-price-increase-2026"/>
        <updated>2026-10-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Atlassian raised Cloud list prices on October 13, 2026 — Jira and Confluence up 7-10%, JSM up to +10%. Full breakdown, renewal impact, and our position.]]></summary>
        <content type="html"><![CDATA[<p>On October 13, 2026, Atlassian's latest Cloud price increase took effect — Jira, Confluence, Jira Service Management, Bitbucket, Guard, the works. If you're the billing admin, you've seen it land. This post is the breakdown in one place, what it means at your next renewal, and the part we can speak to directly: <strong>not one of our 36 apps is raising its price. Not now, not at your renewal.</strong></p>
<p><strong>Quick answer:</strong> Effective October 13, 2026, Atlassian raised Cloud list prices — Jira and Confluence Standard/Premium +7–10%, Enterprise +8%; JSM (Service Collection) +7.5–10%; Bitbucket Premium +10%; Jira Product Discovery +5%; Guard +3–5%; Atlassian Government Cloud +5–10% by product. It applies to new purchases, upgrades and renewals from that date, and it's the third consecutive annual increase (<a href="https://www.atlassian.com/licensing/future-pricing" target="_blank" rel="noopener noreferrer" class="">official page</a>, <a href="https://www.adaptavist.com/blog/atlassian-price-updates-effective-october-2026" target="_blank" rel="noopener noreferrer" class="">Adaptavist's breakdown</a>). NGPILOT's response: <strong>zero changes across all 36 of our Marketplace apps.</strong> Free for up to 10 users stays free.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-changed-product-by-product">What changed, product by product<a href="https://ngpilot.com/blog/atlassian-price-increase-2026#what-changed-product-by-product" class="hash-link" aria-label="Direct link to What changed, product by product" title="Direct link to What changed, product by product" translate="no">​</a></h2>
<p>Announced in late August 2026, effective <strong>October 13, 2026</strong> — new purchases, upgrades and renewals from that date onward. Existing subscriptions keep their current price until their next renewal falls due.</p>
<table><thead><tr><th>Product</th><th>Standard</th><th>Premium</th><th>Enterprise</th></tr></thead><tbody><tr><td>Jira Cloud</td><td>+7–10%</td><td>+7–10%</td><td>+8%</td></tr><tr><td>Confluence Cloud</td><td>+7–10%</td><td>+7–10%</td><td>+8%</td></tr><tr><td>Teamwork Collection</td><td>+7–10%</td><td>+7–10%</td><td>+8%</td></tr><tr><td>Service Collection (JSM)</td><td>+7.5%</td><td>+7.5%</td><td>+10%</td></tr><tr><td>Jira Product Discovery</td><td>+5%</td><td>+5%</td><td>—</td></tr><tr><td>Bitbucket Cloud</td><td>—</td><td>+10% (5-user minimum removed)</td><td>—</td></tr><tr><td>Atlassian Guard</td><td>+3%</td><td>+5%</td><td>—</td></tr></tbody></table>
<p><strong>Atlassian Government Cloud:</strong> Jira +8% · Confluence +8% · Service Collection/JSM +10% · Guard +5%.</p>
<p>Atlassian's stated reason is continued investment in AI (Rovo), the Teamwork Graph, integrated workflows, and enterprise capabilities. Worth naming the pattern too, because renewal budgets care about trajectories more than single years: this is the third consecutive annual Cloud increase since 2024, and it sits on top of a separate 15% Data Center increase that took effect in February 2026.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-you-can-actually-do-about-it">What you can actually do about it<a href="https://ngpilot.com/blog/atlassian-price-increase-2026#what-you-can-actually-do-about-it" class="hash-link" aria-label="Direct link to What you can actually do about it" title="Direct link to What you can actually do about it" translate="no">​</a></h2>
<ul>
<li class=""><strong>Check when your renewal lands.</strong> The increase applies at renewal, so a subscription renewing in October pays it immediately; one renewing in August 2027 pays it then. There's nothing to game here — just don't let the renewal surprise the budget owner.</li>
<li class=""><strong>Audit your user tiers before renewing.</strong> A +7–10% list-price increase is a fine moment to notice you're paying Premium for 12 users who left in March. Tier hygiene is the one lever that's fully yours.</li>
<li class=""><strong>Watch the collection bundling.</strong> The increases differ by collection (Service Collection's Enterprise tier is +10% while Teamwork's is +8%) — if you pay for collections, the math of what's bundled vs à la carte changed.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="our-position-were-not-raising-prices">Our position: we're not raising prices<a href="https://ngpilot.com/blog/atlassian-price-increase-2026#our-position-were-not-raising-prices" class="hash-link" aria-label="Direct link to Our position: we're not raising prices" title="Direct link to Our position: we're not raising prices" translate="no">​</a></h2>
<p>Every NGPILOT app keeps its current pricing through this — all 36 of them, Jira and Confluence alike. Concretely:</p>
<ul>
<li class=""><strong>The free tier stays.</strong> Every one of our apps is free for up to 10 users. That's not a promo ending in November; it's the product.</li>
<li class=""><strong>No increase at your next renewal.</strong> Nothing on our Marketplace listings changed on October 13, and nothing is scheduled to change at any renewal date.</li>
<li class=""><strong>Why we can hold:</strong> our apps are Forge-native — no Data Center legacy codebase to amortize, no server-infrastructure costs passing through to you. When the platform's costs move, ours don't move with them.</li>
<li class=""><strong>And why we'd hold anyway:</strong> a price increase landing in the same budget line as your Atlassian renewal compounds the exact pain it comes out of. Your platform bill going up shouldn't drag your app stack up with it. Pricing stability is the deal, and this is the quarter where saying so out loud matters.</li>
</ul>
<p>If an Atlassian price line is what brought you here: browse the <a class="" href="https://ngpilot.com/apps">NGPILOT app catalog</a> — diagramming (Mermaid Plus, Excalidraw Plus), Markdown and formatting, code blocks, checklists, banners, import/export — free for up to 10 users on every one, paid tiers that don't move out from under you.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sources">Sources<a href="https://ngpilot.com/blog/atlassian-price-increase-2026#sources" class="hash-link" aria-label="Direct link to Sources" title="Direct link to Sources" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://www.atlassian.com/licensing/future-pricing" target="_blank" rel="noopener noreferrer" class="">Atlassian — Future Pricing (official price update page)</a></li>
<li class=""><a href="https://www.adaptavist.com/blog/atlassian-price-updates-effective-october-2026" target="_blank" rel="noopener noreferrer" class="">Atlassian Cloud price updates, effective October 2026 — Adaptavist</a> — published 28 August 2026, updated 2 September 2026; the per-product table above follows their breakdown</li>
<li class=""><a href="https://www.empyra.com/blog/atlassian-cloud-price-increase-2026" target="_blank" rel="noopener noreferrer" class="">Atlassian Cloud Price Increase 2026 — Empyra</a> — effective date, renewal semantics, and the annual-increase pattern</li>
</ul><div class="margin-top--xl padding-top--lg"><h2 class="anchor anchorWithStickyNavbar_LWe7">Related guides</h2><ul><li><a href="https://ngpilot.com/blog/how-to-create-mermaid-diagrams-jira">How to Create Mermaid Diagrams in Jira</a></li><li><a href="https://ngpilot.com/blog/export-jira-issues-to-excel">Export Jira Issues to Excel or CSV</a></li><li><a href="https://ngpilot.com/blog/bulk-download-jira-attachments">Bulk Download Jira Attachments</a></li><li><a href="https://ngpilot.com/blog/how-to-migrate-confluence-content">How to Migrate Confluence Content</a></li><li><a href="https://ngpilot.com/blog/block-quote-confluence">How to Add a Block Quote in Confluence</a></li></ul></div><div style="display:flex;flex-wrap:wrap;gap:0.75rem;justify-content:center;margin-top:2.5rem;margin-bottom:1rem;padding-top:1.5rem;border-top:1px solid var(--ifm-color-emphasis-200)"><span style="font-size:0.875rem;font-weight:600;color:var(--ifm-color-emphasis-500);align-self:center;width:100%;text-align:center;margin-bottom:0.25rem">Explore NGPILOT</span><a class="button button--secondary button--sm" href="https://ngpilot.com/solutions">Browse Solutions</a><a class="button button--secondary button--sm" href="https://ngpilot.com/apps">All Apps</a><a class="button button--secondary button--sm" href="https://ngpilot.com/blog/archive">All Posts</a><a href="https://marketplace.atlassian.com/vendors/1226848/?utm_source=ngpilot.com&amp;utm_medium=blog&amp;utm_campaign=hub-links" class="button button--secondary button--sm" target="_blank" rel="noopener noreferrer">Atlassian Marketplace →</a></div>]]></content>
        <author>
            <name>NGPilot</name>
            <uri>https://ngpilot.com</uri>
        </author>
        <category label="atlassian" term="atlassian"/>
        <category label="pricing" term="pricing"/>
        <category label="news" term="news"/>
        <category label="jira" term="jira"/>
        <category label="confluence" term="confluence"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Export Confluence to Markdown (LLMs, RAG & Git)]]></title>
        <id>https://ngpilot.com/blog/export-confluence-to-markdown</id>
        <link href="https://ngpilot.com/blog/export-confluence-to-markdown"/>
        <updated>2026-10-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Confluence has no native Markdown export: three ways to get pages out as clean Markdown for an LLM, a RAG pipeline, or a docs-as-code repo.]]></summary>
        <content type="html"><![CDATA[<p>Markdown is the lingua franca of everything Confluence isn't: LLM context windows, RAG pipelines, Git-based docs, static site generators. So the request shows up wherever those worlds meet — "can you get our Confluence into Markdown?" — and the honest answer starts with a gap: <strong>Confluence Cloud has no native Markdown export.</strong> Built-in export gives you PDF, Word, HTML and XML; Markdown isn't on the list. Here's how to get there anyway, and how to make the output something a pipeline can actually consume.</p>
<p><strong>Quick answer:</strong> For one page, copy-paste through a converter. For anything real — a space, a corpus, an LLM knowledge base — use <a href="https://marketplace.atlassian.com/apps/977066696/" target="_blank" rel="noopener noreferrer" class="">Modern Importer &amp; Exporter for Confluence</a>: select pages or whole spaces, choose Markdown (plus any sibling formats in one ZIP), and get clean <code>.md</code> files with images bundled and a manifest listing everything exported.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="method-1--copy-paste-through-a-converter">Method 1 — Copy-Paste Through a Converter<a href="https://ngpilot.com/blog/export-confluence-to-markdown#method-1--copy-paste-through-a-converter" class="hash-link" aria-label="Direct link to Method 1 — Copy-Paste Through a Converter" title="Direct link to Method 1 — Copy-Paste Through a Converter" translate="no">​</a></h2>
<p>Open the page, copy the content, paste it into any HTML-to-Markdown converter or your editor's paste-as-Markdown.</p>
<p><strong>Good for:</strong> one page, once — a doc you're moving into a README today.</p>
<p><strong>What's missing:</strong> structure under scale. Tables mangle, macros vanish or arrive as HTML fragments, images break (they point at your Confluence instance, which the reader — or the model — can't access), and nobody is doing this four hundred times. It's a bridge, not a pipeline.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="method-2--html-export--a-conversion-step">Method 2 — HTML Export + a Conversion Step<a href="https://ngpilot.com/blog/export-confluence-to-markdown#method-2--html-export--a-conversion-step" class="hash-link" aria-label="Direct link to Method 2 — HTML Export + a Conversion Step" title="Direct link to Method 2 — HTML Export + a Conversion Step" translate="no">​</a></h2>
<p>Confluence's native space export includes HTML. Convert the HTML bundle to Markdown with a tool (Pandoc is the standard), post-process the leftovers.</p>
<p><strong>Good for:</strong> one-off migrations where you already own a conversion script.</p>
<p><strong>What's missing:</strong> two conversion layers, each with its own losses. Confluence's HTML export is built for archival (it carries its own CSS, navigation and storage-format quirks), so the Markdown that emerges needs real cleanup — and images still need re-linking. It works; it's just a project.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="method-3--export-markdown-directly">Method 3 — Export Markdown Directly<a href="https://ngpilot.com/blog/export-confluence-to-markdown#method-3--export-markdown-directly" class="hash-link" aria-label="Direct link to Method 3 — Export Markdown Directly" title="Direct link to Method 3 — Export Markdown Directly" translate="no">​</a></h2>
<p><a href="https://marketplace.atlassian.com/apps/977066696/" target="_blank" rel="noopener noreferrer" class="">Modern Importer &amp; Exporter for Confluence</a> exports Confluence content as Markdown natively — no intermediate format:</p>
<ol>
<li class="">Open <strong>Apps → Modern Importer &amp; Exporter</strong>, or right-click a page for a single export.</li>
<li class="">Select the pages or spaces you want.</li>
<li class="">Choose <strong>Markdown</strong> — or bundle Word, HTML, JSON, XML in the same ZIP if the migration needs siblings.</li>
<li class="">Export: images are downloaded and included, files are organized by space, and a <strong>manifest</strong> lists every page that came out.</li>
</ol>
<p>The last two details are the ones that decide whether the output is usable. Images <em>in the bundle</em> means the Markdown references files that actually exist next to it — not <code>https://your-instance.atlassian.net/wiki/download/...</code> URLs that 404 outside Confluence. And the manifest is what turns "a folder of files" into a corpus: your RAG ingestion or docs repo can walk the manifest, know what each file is, and detect gaps.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="making-the-output-llm-ready">Making the Output LLM-Ready<a href="https://ngpilot.com/blog/export-confluence-to-markdown#making-the-output-llm-ready" class="hash-link" aria-label="Direct link to Making the Output LLM-Ready" title="Direct link to Making the Output LLM-Ready" translate="no">​</a></h2>
<p>If the destination is a model rather than a human, the export is step one:</p>
<ul>
<li class=""><strong>Chunk along the headings.</strong> Markdown's <code>#</code>/<code>##</code> structure is what chunkers want — no HTML-stripping step means no boilerplate baked into every chunk.</li>
<li class=""><strong>Ship the manifest with the corpus.</strong> Page titles, spaces and timestamps let retrieval cite sources and let you re-export only what changed.</li>
<li class=""><strong>Keep code fences.</strong> Markdown export preserves fenced code blocks, which is the difference between a model that can quote your API example and one that quotes mangled indentation.</li>
<li class=""><strong>Re-export per sync, not per crisis.</strong> Because the exporter runs the same selection every time, refreshing the corpus is a two-minute task — schedule it like a backup.</li>
</ul>
<p>For the other half of the pipeline — chunking, embedding, retrieval patterns on Confluence content — see <a class="" href="https://ngpilot.com/blog/rag-with-confluence-build-ai-knowledge-base">RAG with Confluence: Build an AI Knowledge Base</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="which-method-should-you-use">Which Method Should You Use?<a href="https://ngpilot.com/blog/export-confluence-to-markdown#which-method-should-you-use" class="hash-link" aria-label="Direct link to Which Method Should You Use?" title="Direct link to Which Method Should You Use?" translate="no">​</a></h2>
<table><thead><tr><th>Need</th><th>Use</th></tr></thead><tbody><tr><td>One page, once</td><td>Copy-paste through a converter</td></tr><tr><td>You already own a Pandoc pipeline</td><td>HTML export + convert</td></tr><tr><td>A space, a corpus, or anything an LLM reads</td><td>Direct Markdown export</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="related-resources">Related Resources<a href="https://ngpilot.com/blog/export-confluence-to-markdown#related-resources" class="hash-link" aria-label="Direct link to Related Resources" title="Direct link to Related Resources" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://ngpilot.com/blog/markdown-to-confluence-converter">Markdown to Confluence: 3 Ways to Convert and Paste</a> — the reverse direction, into Confluence</li>
<li class=""><a class="" href="https://ngpilot.com/blog/rag-with-confluence-build-ai-knowledge-base">RAG with Confluence: Build an AI Knowledge Base</a> — what to do with the corpus once you have it</li>
<li class=""><a class="" href="https://ngpilot.com/blog/how-to-migrate-confluence-content">How to Migrate Confluence Content</a> — when the goal is moving, not converting</li>
<li class=""><a class="" href="https://ngpilot.com/apps/modern-importer-exporter-for-confluence">Modern Importer &amp; Exporter for Confluence</a> — full documentation: formats, wizard, import side</li>
</ul><div class="margin-top--lg margin-bottom--lg" style="padding:1.25rem 1.5rem;border-left:4px solid var(--ifm-color-primary);background-color:var(--ifm-color-emphasis-100);border-radius:var(--ifm-global-radius)"><p style="margin-bottom:0.5rem;font-weight:600">Try <!-- -->Enhanced Markdown for Confluence</p><p style="margin-bottom:0.75rem;font-size:0.95rem">Write Markdown with live split preview, Mermaid diagrams, KaTeX/LaTeX math, and 190+ code languages — all in one macro, free for up to 10 users.</p><a href="https://marketplace.atlassian.com/apps/1237026/enhanced-markdown-for-confluence?utm_source=ngpilot.com&amp;utm_medium=website&amp;utm_campaign=enhanced-markdown-for-confluence" target="_blank" rel="noopener noreferrer" class="button button--primary button--sm">Get it on the Atlassian Marketplace</a></div><div class="margin-top--xl padding-top--lg"><h2 class="anchor anchorWithStickyNavbar_LWe7">Related guides</h2><ul><li><a href="https://ngpilot.com/blog/rag-with-confluence-build-ai-knowledge-base">RAG with Confluence: Build an AI Knowledge Base</a></li><li><a href="https://ngpilot.com/blog/markdown-to-confluence-converter">Markdown to Confluence: 3 Ways to Convert and Paste</a></li><li><a href="https://ngpilot.com/blog/how-to-migrate-confluence-content">How to Migrate Confluence Content</a></li></ul></div><div style="display:flex;flex-wrap:wrap;gap:0.75rem;justify-content:center;margin-top:2.5rem;margin-bottom:1rem;padding-top:1.5rem;border-top:1px solid var(--ifm-color-emphasis-200)"><span style="font-size:0.875rem;font-weight:600;color:var(--ifm-color-emphasis-500);align-self:center;width:100%;text-align:center;margin-bottom:0.25rem">Explore NGPILOT</span><a class="button button--secondary button--sm" href="https://ngpilot.com/solutions">Browse Solutions</a><a class="button button--secondary button--sm" href="https://ngpilot.com/apps">All Apps</a><a class="button button--secondary button--sm" href="https://ngpilot.com/blog/archive">All Posts</a><a href="https://marketplace.atlassian.com/vendors/1226848/?utm_source=ngpilot.com&amp;utm_medium=blog&amp;utm_campaign=hub-links" class="button button--secondary button--sm" target="_blank" rel="noopener noreferrer">Atlassian Marketplace →</a></div>]]></content>
        <author>
            <name>NGPilot</name>
            <uri>https://ngpilot.com</uri>
        </author>
        <category label="confluence" term="confluence"/>
        <category label="markdown" term="markdown"/>
        <category label="export" term="export"/>
        <category label="llm" term="llm"/>
        <category label="rag" term="rag"/>
        <category label="how-to" term="how-to"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[How to Format JSON in Jira (Comments, Descriptions & Fields)]]></title>
        <id>https://ngpilot.com/blog/format-json-in-jira</id>
        <link href="https://ngpilot.com/blog/format-json-in-jira"/>
        <updated>2026-10-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Three ways to format JSON in Jira — native code blocks, format-outside-paste-back, and an in-issue panel that highlights, validates and graphs it.]]></summary>
        <content type="html"><![CDATA[<p>Every bug report eventually contains the same artifact: a REST response pasted into a Jira comment as one 4,000-character line. Nobody can read it, Jira can't help — the editor has no JSON tooling at all — and the payload gets re-pasted, re-formatted in a browser tool, and re-pasted again until someone gives up. Here are the three workable ways to handle JSON in Jira, from native-and-free to an in-issue panel, and where each one fits.</p>
<p><strong>Quick answer:</strong> For a comment, use Jira's code snippet block with JSON as the language — monospace, indentation preserved. To <em>format</em>, run it through <code>jq</code> or your editor and paste the result back. To format, validate <strong>and explore</strong> JSON without leaving the issue, <a href="https://marketplace.atlassian.com/apps/1886661294/" target="_blank" rel="noopener noreferrer" class="">JSON Graph Viewer &amp; Visualizer for Jira</a> adds a Paste JSON tab that highlights and validates as you type, plus a node graph of the payload's shape.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="method-1--the-native-code-block-the-floor">Method 1 — the Native Code Block (the Floor)<a href="https://ngpilot.com/blog/format-json-in-jira#method-1--the-native-code-block-the-floor" class="hash-link" aria-label="Direct link to Method 1 — the Native Code Block (the Floor)" title="Direct link to Method 1 — the Native Code Block (the Floor)" translate="no">​</a></h2>
<p>Every method starts here. In the comment or description editor, insert a code snippet (the <code>{}</code> icon or typing <code>/code</code>), paste the payload, and pick <strong>JSON</strong> as the language.</p>
<p>What you get: monospace text that keeps its line structure and copies cleanly back out — which is the entire difference between readable and unreadable JSON.</p>
<p>What you don't get: a pretty-print button (a minified one-liner stays a minified one-liner), syntax validation (a stray comma ships silently), or any way to collapse the 200 lines you don't care about. The code block is storage, not tooling.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="method-2--format-outside-paste-back-free-works-everywhere">Method 2 — Format Outside, Paste Back (Free, Works Everywhere)<a href="https://ngpilot.com/blog/format-json-in-jira#method-2--format-outside-paste-back-free-works-everywhere" class="hash-link" aria-label="Direct link to Method 2 — Format Outside, Paste Back (Free, Works Everywhere)" title="Direct link to Method 2 — Format Outside, Paste Back (Free, Works Everywhere)" translate="no">​</a></h2>
<p>When the payload arrives minified, format it before it enters Jira:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># jq — one line, any payload you can curl</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">curl -s https://api.example.com/orders/42 | jq .</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># or format what's already on your clipboard</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pbpaste | jq .</span><br></div></code></pre></div></div>
<p>Any editor does the same (VS Code: format document with JSON language mode). Paste the formatted result into the Method 1 code block.</p>
<p>The round-trip is the cost: for a one-off share it's ten seconds, and it keeps Jira clean of extra apps. As a daily workflow — debug a webhook, share a payload, review an integration — it breaks down, because the formatted copy in the comment is stale the moment the API response changes.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="method-3--an-in-issue-panel-that-formats-validates-and-graphs">Method 3 — an In-Issue Panel That Formats, Validates and Graphs<a href="https://ngpilot.com/blog/format-json-in-jira#method-3--an-in-issue-panel-that-formats-validates-and-graphs" class="hash-link" aria-label="Direct link to Method 3 — an In-Issue Panel That Formats, Validates and Graphs" title="Direct link to Method 3 — an In-Issue Panel That Formats, Validates and Graphs" translate="no">​</a></h2>
<p><a href="https://marketplace.atlassian.com/apps/1886661294/" target="_blank" rel="noopener noreferrer" class="">JSON Graph Viewer &amp; Visualizer for Jira</a> puts the tooling where the JSON actually lives — the issue. It's read-only (nothing it sees can be changed, and rendering happens in your browser), and there's nothing to configure.</p>
<p><strong>Paste JSON</strong> is the tab for the comment-and-webhook workflow: a syntax-highlighted editor that renders as you type. Paste a dev-tools response, a webhook payload or an API example; invalid input gets told to you plainly — <em>"That isn't valid JSON. Check the syntax and try again."</em> — instead of a blank panel. Valid JSON becomes an interactive node graph: expand and collapse objects, fold a 200-element array into a single <code>n items</code> node, pan and zoom to see the shape you'd otherwise count braces for.</p>
<p>The panel also finds JSON that's already on the issue, which is the part pasting can't do:</p>
<ul>
<li class=""><strong>Issue fields</strong> — any field whose content parses as JSON (a REST payload stored in a custom field) renders automatically; several matches get a picker.</li>
<li class=""><strong>Issue properties</strong> — JSON that other apps stash on the issue as entity properties (integration state, cached API data) shows up under its own tab.</li>
</ul>
<p>A view-mode dropdown switches between <strong>Code</strong> (formatted and highlighted), <strong>Graph</strong>, or both side by side — read the payload above, see its shape below.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="where-json-hides-in-jira">Where JSON Hides in Jira<a href="https://ngpilot.com/blog/format-json-in-jira#where-json-hides-in-jira" class="hash-link" aria-label="Direct link to Where JSON Hides in Jira" title="Direct link to Where JSON Hides in Jira" translate="no">​</a></h2>
<table><thead><tr><th>Source</th><th>How it got there</th><th>Readable by</th></tr></thead><tbody><tr><td>Comment / description paste</td><td>Someone sharing a payload</td><td>Code block + manual formatting</td></tr><tr><td>Custom field</td><td>An integration or script storing an API response</td><td>Panel's <strong>Issue fields</strong> tab, automatically</td></tr><tr><td>Issue (entity) property</td><td>Another app writing structured state</td><td>Panel's <strong>Issue properties</strong> tab, automatically</td></tr><tr><td>Webhook / REST debugging</td><td>You, from dev tools or a curl repro</td><td>Paste JSON tab, live</td></tr></tbody></table>
<p>The last three are the reason "format outside and paste back" stops scaling: the JSON isn't text someone pasted once — it's state that changes, and a stale formatted copy in a comment is worse than none.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="which-method-should-you-use">Which Method Should You Use?<a href="https://ngpilot.com/blog/format-json-in-jira#which-method-should-you-use" class="hash-link" aria-label="Direct link to Which Method Should You Use?" title="Direct link to Which Method Should You Use?" translate="no">​</a></h2>
<table><thead><tr><th>Need</th><th>Use</th></tr></thead><tbody><tr><td>Share a payload once in a comment</td><td>Code block (format first if it's minified)</td></tr><tr><td>Occasional formatting, zero apps</td><td><code>jq</code> / editor → paste back</td></tr><tr><td>Debug webhooks and integrations in the issue, validate as you type</td><td>JSON Graph Viewer &amp; Visualizer panel</td></tr><tr><td>JSON stored in fields or properties, not comments</td><td>Panel — it finds those sources on its own</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="related-resources">Related Resources<a href="https://ngpilot.com/blog/format-json-in-jira#related-resources" class="hash-link" aria-label="Direct link to Related Resources" title="Direct link to Related Resources" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://ngpilot.com/blog/jira-json-viewer">How to View JSON in Jira</a> — the three JSON sources in depth</li>
<li class=""><a class="" href="https://ngpilot.com/apps/json-graph-viewer-visualizer-for-jira">JSON Graph Viewer &amp; Visualizer for Jira</a> — full documentation: sources, view modes, themes</li>
</ul><div class="margin-top--lg margin-bottom--lg" style="padding:1.25rem 1.5rem;border-left:4px solid var(--ifm-color-primary);background-color:var(--ifm-color-emphasis-100);border-radius:var(--ifm-global-radius)"><p style="margin-bottom:0.5rem;font-weight:600">Try <!-- -->JSON Structure Viewer for Confluence</p><p style="margin-bottom:0.75rem;font-size:0.95rem">Visualize JSON as interactive structure diagrams — free for up to 10 users.</p><a href="https://marketplace.atlassian.com/apps/1237254/json-structure-viewer-for-confluence?utm_source=ngpilot.com&amp;utm_medium=website&amp;utm_campaign=json-structure-viewer-for-confluence" target="_blank" rel="noopener noreferrer" class="button button--primary button--sm">Get it on the Atlassian Marketplace</a></div><div class="margin-top--xl padding-top--lg"><h2 class="anchor anchorWithStickyNavbar_LWe7">Related guides</h2><ul><li><a href="https://ngpilot.com/blog/jira-json-viewer">How to View JSON in Jira — Fields, Entity Properties &amp; Pasted Payloads</a></li><li><a href="https://ngpilot.com/blog/jira-issue-history">Jira Issue History: Track Every Change</a></li></ul></div><div style="display:flex;flex-wrap:wrap;gap:0.75rem;justify-content:center;margin-top:2.5rem;margin-bottom:1rem;padding-top:1.5rem;border-top:1px solid var(--ifm-color-emphasis-200)"><span style="font-size:0.875rem;font-weight:600;color:var(--ifm-color-emphasis-500);align-self:center;width:100%;text-align:center;margin-bottom:0.25rem">Explore NGPILOT</span><a class="button button--secondary button--sm" href="https://ngpilot.com/solutions">Browse Solutions</a><a class="button button--secondary button--sm" href="https://ngpilot.com/apps">All Apps</a><a class="button button--secondary button--sm" href="https://ngpilot.com/blog/archive">All Posts</a><a href="https://marketplace.atlassian.com/vendors/1226848/?utm_source=ngpilot.com&amp;utm_medium=blog&amp;utm_campaign=hub-links" class="button button--secondary button--sm" target="_blank" rel="noopener noreferrer">Atlassian Marketplace →</a></div>]]></content>
        <author>
            <name>NGPilot</name>
            <uri>https://ngpilot.com</uri>
        </author>
        <category label="jira" term="jira"/>
        <category label="json" term="json"/>
        <category label="api" term="api"/>
        <category label="how-to" term="how-to"/>
        <category label="debugging" term="debugging"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[20 Jira Announcement Banner Examples (Copy-Paste)]]></title>
        <id>https://ngpilot.com/blog/jira-announcement-banner-examples</id>
        <link href="https://ngpilot.com/blog/jira-announcement-banner-examples"/>
        <updated>2026-10-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Copy-paste Jira announcement banner messages for maintenance, incidents, policy changes and deadlines — each with recommended banner settings.]]></summary>
        <content type="html"><![CDATA[<p>Jira's announcement banner is the one message every user sees on every page — which makes it the most valuable and most wasted slot in the instance. Most banners fail the same way: too vague ("System update"), too loud ("URGENT!!!! READ THIS"), or left up so long the team stops seeing them. This is a library of banner messages that work, organized by scenario. Copy one, replace the specifics, and ship it in under a minute.</p>
<p><strong>Quick answer:</strong> Every example below follows the same three-part pattern — <em>what, when, what to do</em> — and stays under 200 characters. Copy the message for your scenario, fill in your dates and links, and pick persistent vs dismissible from the settings matrix. Jira banners render plain text only (emojis work), so the wording does all the work.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="scheduled-maintenance">Scheduled Maintenance<a href="https://ngpilot.com/blog/jira-announcement-banner-examples#scheduled-maintenance" class="hash-link" aria-label="Direct link to Scheduled Maintenance" title="Direct link to Scheduled Maintenance" translate="no">​</a></h2>
<p><strong>Advance notice (a week out, persistent):</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">🔧 Scheduled maintenance: Jira will be unavailable Saturday, June 14, 2–4 AM EST. Plan your work around the window.</span><br></div></code></pre></div></div>
<p><strong>Day-of countdown (persistent):</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">🔧 Jira goes offline in 2 hours for scheduled maintenance (2–4 AM EST). Save your work. Full service back by 4 AM.</span><br></div></code></pre></div></div>
<p><strong>Window closed (dismissible):</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">✅ Maintenance complete — Jira is back. If anything looks off, ping #it-help with a screenshot.</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="production-incident">Production Incident<a href="https://ngpilot.com/blog/jira-announcement-banner-examples#production-incident" class="hash-link" aria-label="Direct link to Production Incident" title="Direct link to Production Incident" translate="no">​</a></h2>
<p><strong>Active incident (persistent):</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">⚠️ Production incident in progress: API latency is elevated. Status updates every 30 min in #incident-response. No action needed from you.</span><br></div></code></pre></div></div>
<p><strong>Incident with user action (persistent):</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">⚠️ Do not deploy to staging — a broken build is circulating. Incident in progress, updates in #incident-response.</span><br></div></code></pre></div></div>
<p><strong>All clear (dismissible):</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">✅ Resolved: API latency back to normal as of 14:20 UTC. Root-cause write-up coming in the postmortem doc.</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="policy-changes">Policy Changes<a href="https://ngpilot.com/blog/jira-announcement-banner-examples#policy-changes" class="hash-link" aria-label="Direct link to Policy Changes" title="Direct link to Policy Changes" translate="no">​</a></h2>
<p><strong>New requirement (dismissible):</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">📋 New policy from Monday, Feb 1: every bug must include reproduction steps. Details and examples: wiki.acme.co/bug-policy</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="deadlines">Deadlines<a href="https://ngpilot.com/blog/jira-announcement-banner-examples#deadlines" class="hash-link" aria-label="Direct link to Deadlines" title="Direct link to Deadlines" translate="no">​</a></h2>
<p><strong>Quarter close (dismissible):</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">📅 Timesheets for Q1 are due Friday, Jan 20 at 5 PM. Missing entries block invoicing. Submit: timesheets.acme.co</span><br></div></code></pre></div></div>
<p><strong>Code freeze (persistent during freeze):</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">❄️ Code freeze in effect until the 3.2 release ships Thursday. Bug fixes only — release captain approval for exceptions.</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="security">Security<a href="https://ngpilot.com/blog/jira-announcement-banner-examples#security" class="hash-link" aria-label="Direct link to Security" title="Direct link to Security" translate="no">​</a></h2>
<p><strong>Advisory (persistent):</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">🔒 Security advisory: phishing emails are targeting Jira accounts. We never ask for your password. Verify sender before clicking: wiki.acme.co/security</span><br></div></code></pre></div></div>
<p><strong>Credential rotation (persistent during the window):</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">🔒 Rotate your password by Friday — forced reset at 6 PM. Takes 2 minutes: id.acme.co/rotate. Questions: #security</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="onboarding--team-changes">Onboarding &amp; Team Changes<a href="https://ngpilot.com/blog/jira-announcement-banner-examples#onboarding--team-changes" class="hash-link" aria-label="Direct link to Onboarding &amp; Team Changes" title="Direct link to Onboarding &amp; Team Changes" translate="no">​</a></h2>
<p><strong>Welcome (dismissible):</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">👋 New to the team? Start here: onboarding checklist, tool access requests and who-to-ask are in Confluence: wiki.acme.co/start</span><br></div></code></pre></div></div>
<p><strong>Reorg announcement (dismissible):</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">📣 From March 1, the Payments team joins Platform. Escalations for payment bugs go to @platform-oncall. Org chart: wiki.acme.co/org</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="releases--deployments">Releases &amp; Deployments<a href="https://ngpilot.com/blog/jira-announcement-banner-examples#releases--deployments" class="hash-link" aria-label="Direct link to Releases &amp; Deployments" title="Direct link to Releases &amp; Deployments" translate="no">​</a></h2>
<p><strong>Release note (dismissible):</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">🚀 3.1 is live: bulk issue editing, saved filters, dark mode. Release notes with screenshots: wiki.acme.co/3-1</span><br></div></code></pre></div></div>
<p><strong>Deployment window (persistent during):</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">🚀 Deploying 3.2 to production now (est. 20 min). Expect brief slowdowns. Do not run migrations until the all-clear.</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="events--rituals">Events &amp; Rituals<a href="https://ngpilot.com/blog/jira-announcement-banner-examples#events--rituals" class="hash-link" aria-label="Direct link to Events &amp; Rituals" title="Direct link to Events &amp; Rituals" translate="no">​</a></h2>
<p><strong>Office closure (dismissible):</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">🏢 Office closed Monday, May 29 (public holiday). Jira coverage is best-effort — non-urgent issues will be triaged Tuesday.</span><br></div></code></pre></div></div>
<p><strong>Survey round (dismissible):</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">📝 Platform survey closes Friday — 5 minutes, anonymous, results shared with everyone. Take it: survey.acme.co</span><br></div></code></pre></div></div>
<p><strong>Training session (dismissible):</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">🎓 Jira automation workshop this Thursday 3 PM — bring a repetitive task, leave with it automated. Signup: wiki.acme.co/workshops</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="migrations--moves">Migrations &amp; Moves<a href="https://ngpilot.com/blog/jira-announcement-banner-examples#migrations--moves" class="hash-link" aria-label="Direct link to Migrations &amp; Moves" title="Direct link to Migrations &amp; Moves" translate="no">​</a></h2>
<p><strong>Server-to-Cloud migration (persistent during):</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">📦 Jira migrates to Cloud this weekend. Read-only from Friday 6 PM, back Monday 8 AM. Export what you need: wiki.acme.co/migration</span><br></div></code></pre></div></div>
<p><strong>Compliance freeze (persistent during):</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">🔒 Audit period Mar 1–15: no permission changes and no project deletions without compliance sign-off. Questions: #compliance</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-settings-matrix">The Settings Matrix<a href="https://ngpilot.com/blog/jira-announcement-banner-examples#the-settings-matrix" class="hash-link" aria-label="Direct link to The Settings Matrix" title="Direct link to The Settings Matrix" translate="no">​</a></h2>
<p>For each scenario, the banner behavior that matches the message (Jira's native banner has a single global on/off — the dismissible/persistent and visibility controls below are what <a class="" href="https://ngpilot.com/apps/modern-announcement-banner-for-jira">Modern Announcement Banner for Jira</a> adds on top):</p>
<table><thead><tr><th>Scenario</th><th>Dismissible?</th><th>Visibility</th><th>Take it down when</th></tr></thead><tbody><tr><td>Maintenance advance notice</td><td>No</td><td>Public</td><td>Window closes</td></tr><tr><td>Active incident</td><td>No</td><td>Public</td><td>All-clear posted</td></tr><tr><td>Policy change</td><td>Yes</td><td>Public</td><td>A week after effective date</td></tr><tr><td>Deadline</td><td>Yes</td><td>Public</td><td>Deadline passes</td></tr><tr><td>Code / compliance freeze</td><td>No</td><td>Public</td><td>Freeze lifts</td></tr><tr><td>Security advisory</td><td>No</td><td>Public</td><td>Threat resolved</td></tr><tr><td>Onboarding / welcome</td><td>Yes</td><td>Public</td><td>Rotate monthly</td></tr><tr><td>Release note</td><td>Yes</td><td>Public</td><td>3–4 days</td></tr></tbody></table>
<p>Two rules the matrix encodes: <strong>acknowledge-once messages get dismissed; in-progress situations persist.</strong> And every banner gets a retirement date — a stale banner is ad blindness training for your whole instance.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="wording-rules-why-these-examples-look-like-this">Wording Rules (Why These Examples Look Like This)<a href="https://ngpilot.com/blog/jira-announcement-banner-examples#wording-rules-why-these-examples-look-like-this" class="hash-link" aria-label="Direct link to Wording Rules (Why These Examples Look Like This)" title="Direct link to Wording Rules (Why These Examples Look Like This)" translate="no">​</a></h2>
<ol>
<li class=""><strong>What, when, what to do — in that order.</strong> Users scan the first seven words; lead with the event, not the pleasantries.</li>
<li class=""><strong>One message per banner.</strong> Jira shows a single banner, so a second topic makes the first unreadable. <a class="" href="https://ngpilot.com/apps/modern-announcement-banner-for-jira">Modern Announcement Banner</a> still shows one banner at a time — it just keeps the library ready to switch.</li>
<li class=""><strong>Specific beats urgent.</strong> "URGENT" without a date is noise; "offline Saturday 2–4 AM EST" is information.</li>
<li class=""><strong>Emojis are your only formatting.</strong> Banners render plain text, so ⚠️ 🔒 📅 do the visual work a bold tag can't. One per banner — they're punctuation, not confetti.</li>
<li class=""><strong>Give the URL a name.</strong> "See wiki.acme.co/bug-policy" beats "see the wiki" — plain-text URLs get copy-pasted, vague pointers get ignored.</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="related-resources">Related Resources<a href="https://ngpilot.com/blog/jira-announcement-banner-examples#related-resources" class="hash-link" aria-label="Direct link to Related Resources" title="Direct link to Related Resources" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://ngpilot.com/blog/faq-jira-announcement-banner-customization">Jira Announcement Banner Customization — FAQ</a> — formatting limits, scheduling, targeting</li>
<li class=""><a class="" href="https://ngpilot.com/blog/set-up-announcement-banners-jira">Set Up Announcement Banners in Jira</a> — native banner vs app, step by step</li>
<li class=""><a class="" href="https://ngpilot.com/blog/how-to-set-up-announcement-banners-confluence-jira">How to Set Up Announcement Banners in Confluence and Jira</a> — both products side by side</li>
<li class=""><a class="" href="https://ngpilot.com/apps/modern-announcement-banner-for-jira">Modern Announcement Banner for Jira</a> — saved library, dismissible banners, public/private visibility</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sources">Sources<a href="https://ngpilot.com/blog/jira-announcement-banner-examples#sources" class="hash-link" aria-label="Direct link to Sources" title="Direct link to Sources" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-announcement-banner/" target="_blank" rel="noopener noreferrer" class="">Announcement banner REST API — Atlassian Developers</a> — the native banner's update endpoint takes a <code>message</code> string only: no format field, and HTML in the message renders as raw text</li>
</ul><div class="margin-top--lg margin-bottom--lg" style="padding:1.25rem 1.5rem;border-left:4px solid var(--ifm-color-primary);background-color:var(--ifm-color-emphasis-100);border-radius:var(--ifm-global-radius)"><p style="margin-bottom:0.5rem;font-weight:600">Try <!-- -->Modern Announcement Banner for Jira</p><p style="margin-bottom:0.75rem;font-size:0.95rem">Rich-text announcement banners with scheduling and targeting — free for up to 10 users.</p><a href="https://marketplace.atlassian.com/apps/194301976/modern-announcement-banner-for-jira?utm_source=ngpilot.com&amp;utm_medium=website&amp;utm_campaign=modern-announcement-banner-for-jira" target="_blank" rel="noopener noreferrer" class="button button--primary button--sm">Get it on the Atlassian Marketplace</a></div><div class="margin-top--xl padding-top--lg"><h2 class="anchor anchorWithStickyNavbar_LWe7">Related guides</h2><ul><li><a href="https://ngpilot.com/blog/faq-jira-announcement-banner-customization">Jira Announcement Banner Customization — FAQ</a></li><li><a href="https://ngpilot.com/blog/how-to-set-up-announcement-banners-confluence-jira">How to Set Up Announcement Banners in Confluence and Jira</a></li><li><a href="https://ngpilot.com/blog/set-up-announcement-banners-jira">Set Up Announcement Banners in Jira (Step by Step)</a></li></ul></div><div style="display:flex;flex-wrap:wrap;gap:0.75rem;justify-content:center;margin-top:2.5rem;margin-bottom:1rem;padding-top:1.5rem;border-top:1px solid var(--ifm-color-emphasis-200)"><span style="font-size:0.875rem;font-weight:600;color:var(--ifm-color-emphasis-500);align-self:center;width:100%;text-align:center;margin-bottom:0.25rem">Explore NGPILOT</span><a class="button button--secondary button--sm" href="https://ngpilot.com/solutions">Browse Solutions</a><a class="button button--secondary button--sm" href="https://ngpilot.com/apps">All Apps</a><a class="button button--secondary button--sm" href="https://ngpilot.com/blog/archive">All Posts</a><a href="https://marketplace.atlassian.com/vendors/1226848/?utm_source=ngpilot.com&amp;utm_medium=blog&amp;utm_campaign=hub-links" class="button button--secondary button--sm" target="_blank" rel="noopener noreferrer">Atlassian Marketplace →</a></div>]]></content>
        <author>
            <name>NGPilot</name>
            <uri>https://ngpilot.com</uri>
        </author>
        <category label="jira" term="jira"/>
        <category label="announcement-banner" term="announcement-banner"/>
        <category label="examples" term="examples"/>
        <category label="team-communication" term="team-communication"/>
        <category label="how-to" term="how-to"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Jira Definition of Done: Template + How to Enforce It]]></title>
        <id>https://ngpilot.com/blog/jira-definition-of-done-template</id>
        <link href="https://ngpilot.com/blog/jira-definition-of-done-template"/>
        <updated>2026-10-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[A copy-paste Jira definition of done template for stories and bugs, where to store it, and three ways to enforce it — including a checklist validator.]]></summary>
        <content type="html"><![CDATA[<p>Every team says it has a definition of done. Then you look at a closed ticket: the release notes were never written, one test is skipped, the customer was never told. Jira didn't fail them — Jira never knew what "done" meant. The Done button closes anything. This post gives you a copy-paste definition of done template for stories and bugs, shows where to store it so it's actually on every ticket, and walks through the enforcement options from free to fully gated.</p>
<p><strong>Quick answer:</strong> A definition of done (DoD) is the team-wide checklist every issue satisfies before closing — distinct from per-story acceptance criteria. Jira has no native DoD field, so the setup that works is: keep the DoD as a checklist template applied to every new issue, flag the non-negotiables as <strong>required</strong>, and add a workflow validator (<a href="https://marketplace.atlassian.com/apps/1795968238/" target="_blank" rel="noopener noreferrer" class="">Checklist Workflow Automation for Jira</a>, free up to 10 users) that blocks the Done transition while any required item is unfinished. Below: the template, the storage options, and the enforcement ladder.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-template">The Template<a href="https://ngpilot.com/blog/jira-definition-of-done-template#the-template" class="hash-link" aria-label="Direct link to The Template" title="Direct link to The Template" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="definition-of-done--user-story">Definition of Done — user story<a href="https://ngpilot.com/blog/jira-definition-of-done-template#definition-of-done--user-story" class="hash-link" aria-label="Direct link to Definition of Done — user story" title="Direct link to Definition of Done — user story" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">Code peer-reviewed</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Unit + integration tests pass in CI</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Acceptance criteria demonstrated to the reporter</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">No new high/critical vulnerabilities</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Documentation and release notes updated</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Feature flag / rollout plan confirmed</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Stakeholders notified</span><br></div></code></pre></div></div>
<p>Mark the first two and the release-notes line <strong>required</strong> — they are the ones teams skip under deadline pressure, and the ones that cost the most when skipped. The rest stay optional: nothing destroys a definition of done faster than twenty mandatory checkboxes nobody reads.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="definition-of-done--bug-fix">Definition of Done — bug fix<a href="https://ngpilot.com/blog/jira-definition-of-done-template#definition-of-done--bug-fix" class="hash-link" aria-label="Direct link to Definition of Done — bug fix" title="Direct link to Definition of Done — bug fix" translate="no">​</a></h3>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">Root cause identified (not just the symptom)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Fix verified in a production-like environment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Regression test added</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Release notes / affected users updated</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Related issues linked</span><br></div></code></pre></div></div>
<p>Bugs need a different gate than stories — a defect closed without a regression test is a defect scheduled to return. Same project, second template, so "done" stays one auditable concept with two shapes.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-the-template-is-not">What the template is not<a href="https://ngpilot.com/blog/jira-definition-of-done-template#what-the-template-is-not" class="hash-link" aria-label="Direct link to What the template is not" title="Direct link to What the template is not" translate="no">​</a></h3>
<p>Not a checklist of <em>who does what</em> (that's assignment) and not a list of <em>what this story must do</em> (that's acceptance criteria — keep those in the story's own description). The DoD is only the conditions that are true for <strong>every</strong> piece of finished work. If you're writing an item that applies to some tickets only, it belongs in acceptance criteria.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="where-to-store-it-so-people-actually-see-it">Where to Store It (So People Actually See It)<a href="https://ngpilot.com/blog/jira-definition-of-done-template#where-to-store-it-so-people-actually-see-it" class="hash-link" aria-label="Direct link to Where to Store It (So People Actually See It)" title="Direct link to Where to Store It (So People Actually See It)" translate="no">​</a></h2>
<table><thead><tr><th>Option</th><th>What you get</th><th>What breaks</th></tr></thead><tbody><tr><td>Wiki page</td><td>One canonical copy</td><td>Nobody opens it; zero per-ticket visibility</td></tr><tr><td>Description template</td><td>On every ticket from birth</td><td>Free text — items get deleted, JQL can't see them</td></tr><tr><td><strong>Checklist template on the issue</strong></td><td>On every ticket, structured, JQL-searchable</td><td>Needs an app to render and enforce</td></tr></tbody></table>
<p>The wiki page is where definitions of done go to die. The description template is one step better — <a class="" href="https://ngpilot.com/apps/modern-issue-templates-for-jira">Modern Issue Templates for Jira</a> pre-loads a rich-text body (description, DoD section, testing notes) on every new issue automatically, so the checklist is at least <em>present</em> on birth. But presence is not enforcement: a text checklist in the description can be deleted by anyone, and nothing stops the transition.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-enforcement-ladder">The Enforcement Ladder<a href="https://ngpilot.com/blog/jira-definition-of-done-template#the-enforcement-ladder" class="hash-link" aria-label="Direct link to The Enforcement Ladder" title="Direct link to The Enforcement Ladder" translate="no">​</a></h2>
<p><strong>Level 0 — nothing.</strong> The default. Close the ticket, hope for the best.</p>
<p><strong>Level 1 — present.</strong> The DoD template auto-applies to every new issue (issue template). Reviewers see it; nothing enforces it.</p>
<p><strong>Level 2 — enforced.</strong> The checklist lives on the issue, the non-negotiables are <strong>required</strong>, and a validator blocks Done until they're done.</p>
<p>Level 2 is the whole point, and it needs one workflow edit with <a href="https://marketplace.atlassian.com/apps/1795968238/" target="_blank" rel="noopener noreferrer" class="">Checklist Workflow Automation for Jira</a>:</p>
<ol>
<li class="">
<p>A Jira admin opens <strong>Project settings → Workflows</strong>, edits the workflow, and on the transition into Done adds the validator <strong>Checklist required items complete</strong> (category: <em>Forge apps</em>).</p>
</li>
<li class="">
<p>From then on, closing an issue with an unfinished required item is refused, and Jira names the offenders:</p>
<p><code>Complete required checklist items before transitioning: "Code peer-reviewed", …</code></p>
</li>
<li class="">
<p>Optional: add the <strong>Complete required checklist items</strong> post function to the same transition if your DoD documents <em>review steps</em> rather than work — it completes the required items automatically once the reviewer decides to move on.</p>
</li>
</ol>
<p>Two rules make the gate predictable: only <strong>exactly Done</strong> satisfies a requirement (a custom status like <em>Waiting on vendor</em> still blocks, <em>Skipped</em> never counts), and the validator <strong>fails open</strong> — if the app can't read a checklist, the transition goes through rather than bricking the workflow.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="audit-what-slips-through">Audit What Slips Through<a href="https://ngpilot.com/blog/jira-definition-of-done-template#audit-what-slips-through" class="hash-link" aria-label="Direct link to Audit What Slips Through" title="Direct link to Audit What Slips Through" translate="no">​</a></h2>
<p>Enforcement prevents new shortcuts; the JQL layer catches everything already in flight:</p>
<div class="language-jql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-jql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">issue in hasIncompleteRequired()</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cwaIncompleteRequired &gt; 0 AND sprint in openSprints()</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cwaOverdueRequired &gt; 0</span><br></div></code></pre></div></div>
<p>Save the first as a filter called "Owed before Done" and pin it as a dashboard gadget — it's the team's honest backlog of unfinished endings. Pair it with overdue reminders, which comment on issues where a required item has blown past its due date and mention the assignee (at most once every 7 days per issue, so it nudges without nagging).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="do-you-need-an-app-for-this">Do You Need an App for This?<a href="https://ngpilot.com/blog/jira-definition-of-done-template#do-you-need-an-app-for-this" class="hash-link" aria-label="Direct link to Do You Need an App for This?" title="Direct link to Do You Need an App for This?" translate="no">​</a></h2>
<p>For Level 1 — no. Any issue-template mechanism puts the DoD text on tickets.</p>
<p>For Level 2 — yes, something has to count checklist state inside a workflow validator, and native Jira can't. The honest landscape: <a href="https://marketplace.atlassian.com/search?query=scriptrunner" target="_blank" rel="noopener noreferrer" class="">ScriptRunner</a> can script the same gate if you already pay for it; HeroCoders' checklist app covers this ground; Checklist Workflow Automation does it without scripts and stays free up to 10 users, with the JQL functions, CSV round-trip and reminders built around the same required-item concept. Pick by what you need <em>around</em> the gate, not the gate itself — every option blocks the transition.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="related-resources">Related Resources<a href="https://ngpilot.com/blog/jira-definition-of-done-template#related-resources" class="hash-link" aria-label="Direct link to Related Resources" title="Direct link to Related Resources" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://ngpilot.com/blog/jira-checklist">How to Add a Checklist to Jira</a> — the checklist mechanics in depth: panels, required flags, JQL and templates</li>
<li class=""><a class="" href="https://ngpilot.com/blog/jira-checklist-templates">Jira Checklist Templates: Copy-Paste Sets for 6 Workflows</a> — scenario checklists (bug fix, incident, release, review, onboarding) beyond the DoD</li>
<li class=""><a class="" href="https://ngpilot.com/blog/how-to-create-jira-issue-templates">Create Jira Issue Templates</a> — put the DoD body on every ticket from birth</li>
<li class=""><a class="" href="https://ngpilot.com/blog/plan-jira-sprints-that-actually-work">Plan Jira Sprints That Actually Work</a> — where the DoD gate sits in sprint planning</li>
<li class=""><a class="" href="https://ngpilot.com/apps/checklist-workflow-automation-for-jira">Checklist Workflow Automation for Jira</a> — full documentation: enforcement, templates, CSV, JQL, audit log</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sources">Sources<a href="https://ngpilot.com/blog/jira-definition-of-done-template#sources" class="hash-link" aria-label="Direct link to Sources" title="Direct link to Sources" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://support.atlassian.com/jira-cloud-administration/docs/manage-workflow-transitions/" target="_blank" rel="noopener noreferrer" class="">Manage workflow transitions — Atlassian Support</a> — validators and conditions on transitions</li>
<li class=""><a href="https://support.atlassian.com/jira-cloud-administration/docs/configure-advanced-conditioning-in-workflows/" target="_blank" rel="noopener noreferrer" class="">Jira workflow conditions — what native conditions can and can't check</a> — the boundary that makes checklist validators necessary</li>
</ul><div class="margin-top--lg margin-bottom--lg" style="padding:1.25rem 1.5rem;border-left:4px solid var(--ifm-color-primary);background-color:var(--ifm-color-emphasis-100);border-radius:var(--ifm-global-radius)"><p style="margin-bottom:0.5rem;font-weight:600">Try <!-- -->Modern Issue Templates for Jira</p><p style="margin-bottom:0.75rem;font-size:0.95rem">Create issues from reusable templates with variables, GitHub import, and auto-apply — free for up to 10 users.</p><a href="https://marketplace.atlassian.com/apps/2564635381/modern-issue-templates-for-jira?utm_source=ngpilot.com&amp;utm_medium=website&amp;utm_campaign=modern-issue-templates-for-jira" target="_blank" rel="noopener noreferrer" class="button button--primary button--sm">Get it on the Atlassian Marketplace</a></div><div class="margin-top--xl padding-top--lg"><h2 class="anchor anchorWithStickyNavbar_LWe7">Related guides</h2><ul><li><a href="https://ngpilot.com/blog/jira-checklist">How to Add a Checklist to Jira — and Block Transitions Until Done</a></li><li><a href="https://ngpilot.com/blog/how-to-create-jira-issue-templates">Create Jira Issue Templates — Import from GitHub, Markdown &amp; Rich Text</a></li><li><a href="https://ngpilot.com/blog/plan-jira-sprints-that-actually-work">Plan Jira Sprints That Actually Work</a></li></ul></div><div style="display:flex;flex-wrap:wrap;gap:0.75rem;justify-content:center;margin-top:2.5rem;margin-bottom:1rem;padding-top:1.5rem;border-top:1px solid var(--ifm-color-emphasis-200)"><span style="font-size:0.875rem;font-weight:600;color:var(--ifm-color-emphasis-500);align-self:center;width:100%;text-align:center;margin-bottom:0.25rem">Explore NGPILOT</span><a class="button button--secondary button--sm" href="https://ngpilot.com/solutions">Browse Solutions</a><a class="button button--secondary button--sm" href="https://ngpilot.com/apps">All Apps</a><a class="button button--secondary button--sm" href="https://ngpilot.com/blog/archive">All Posts</a><a href="https://marketplace.atlassian.com/vendors/1226848/?utm_source=ngpilot.com&amp;utm_medium=blog&amp;utm_campaign=hub-links" class="button button--secondary button--sm" target="_blank" rel="noopener noreferrer">Atlassian Marketplace →</a></div>]]></content>
        <author>
            <name>NGPilot</name>
            <uri>https://ngpilot.com</uri>
        </author>
        <category label="jira" term="jira"/>
        <category label="definition-of-done" term="definition-of-done"/>
        <category label="checklist" term="checklist"/>
        <category label="workflow" term="workflow"/>
        <category label="how-to" term="how-to"/>
        <category label="process" term="process"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Mermaid 12.2: Self-Coloring Mind Maps in Confluence]]></title>
        <id>https://ngpilot.com/blog/mermaid-12-2-confluence-jira</id>
        <link href="https://ngpilot.com/blog/mermaid-12-2-confluence-jira"/>
        <updated>2026-10-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Mermaid 12.2.0 is live in all three NGPILOT diagram apps: opt-in mindmap coloring by hierarchy depth, plus swimlane ID collision fixes.]]></summary>
        <content type="html"><![CDATA[<p>Mermaid 12.2.0 shipped upstream on October 13, and it is live in all three NGPILOT diagram apps: <strong>Enhanced Markdown for Confluence</strong>, <strong>Mermaid Plus Diagrams &amp; AI Agent for Confluence</strong>, and <strong>Mermaid Plus Diagrams for Jira</strong>. It's a small release with one feature you can see from across the room — mind maps that color themselves by hierarchy depth — and a set of quiet fixes that matter more on Confluence than anywhere else, because Confluence pages are where multiple diagrams share one page.</p>
<p><strong>Quick answer:</strong> Mermaid 12.2 adds <code>mindmap.colorBy: depth</code> — opt-in mind map coloring where each hierarchy level pulls from the theme palette — plus fixes for circle node sizing, mind map labels, and swimlane rendering (including the fix that stops two diagrams on one page from colliding). In <a href="https://marketplace.atlassian.com/apps/1237026/enhanced-markdown-for-confluence/" target="_blank" rel="noopener noreferrer" class="">Enhanced Markdown for Confluence</a>, <a href="https://marketplace.atlassian.com/apps/1236814/mermaid-plus-diagrams-ai-agent-for-confluence/" target="_blank" rel="noopener noreferrer" class="">Mermaid Plus Diagrams &amp; AI Agent for Confluence</a>, and <a href="https://marketplace.atlassian.com/apps/2658777397/mermaid-plus-diagrams-for-jira/" target="_blank" rel="noopener noreferrer" class="">Mermaid Plus Diagrams for Jira</a>, add the config block to any mermaid fence or diagram panel. Existing diagrams render unchanged.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-headliner-mindmapcolorby-depth">The headliner: <code>mindmap.colorBy: depth</code><a href="https://ngpilot.com/blog/mermaid-12-2-confluence-jira#the-headliner-mindmapcolorby-depth" class="hash-link" aria-label="Direct link to the-headliner-mindmapcolorby-depth" title="Direct link to the-headliner-mindmapcolorby-depth" translate="no">​</a></h2>
<p>Mind maps encode hierarchy, but by default every node wears the same palette role — the structure lives only in the lines. With 12.2 you opt in once:</p>
<div class="language-markdown codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-markdown codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token front-matter-block punctuation" style="color:#393A34">---</span><span class="token front-matter-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token front-matter-block"></span><span class="token front-matter-block front-matter yaml language-yaml key atrule" style="color:#00a4db">config</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">:</span><span class="token front-matter-block front-matter yaml language-yaml"></span><br></div><div class="token-line" style="color:#393A34"><span class="token front-matter-block front-matter yaml language-yaml">  </span><span class="token front-matter-block front-matter yaml language-yaml key atrule" style="color:#00a4db">mindmap</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">:</span><span class="token front-matter-block front-matter yaml language-yaml"></span><br></div><div class="token-line" style="color:#393A34"><span class="token front-matter-block front-matter yaml language-yaml">    </span><span class="token front-matter-block front-matter yaml language-yaml key atrule" style="color:#00a4db">colorBy</span><span class="token front-matter-block front-matter yaml language-yaml punctuation" style="color:#393A34">:</span><span class="token front-matter-block front-matter yaml language-yaml"> depth</span><span class="token front-matter-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token front-matter-block"></span><span class="token front-matter-block punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mindmap</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  root((Platform))</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Billing</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      Invoices</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      Dunning</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Identity</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      SSO</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      SCIM</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Observability</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      Traces</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      Alerts</span><br></div></code></pre></div></div>
<p>Every level takes its color from the theme palette the diagram already uses — root, first-level branches, and leaves become visually distinct bands with <strong>zero per-node styling</strong>. No <code>classDef</code> lines, no manual colors to keep in sync when the hierarchy changes; the color <em>is</em> the depth.</p>
<p><img decoding="async" loading="lazy" alt="A Mermaid 12.2 mind map rendered on desktop: each hierarchy level takes the next theme-palette color, so the chain reads as alternating color bands rooted at the central mindmap node." src="https://ngpilot.com/assets/images/mindmap-depth-colors-06c853179d7019d7ed6fa40605ff6081.png" width="1238" height="1312" class="img_ev3q"></p>
<p>Two details worth knowing:</p>
<ul>
<li class=""><strong>It's opt-in.</strong> Without <code>colorBy: depth</code>, mind maps render exactly as they did in 12.0 and 12.1 — no existing diagram changes appearance.</li>
<li class=""><strong>It reuses the theme palette.</strong> Dark mode, custom themes, the neo look — the depth colors come from whatever theme is already active, so the map stays consistent with the rest of the page.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-quiet-fix-that-matters-most-on-confluence">The quiet fix that matters most on Confluence<a href="https://ngpilot.com/blog/mermaid-12-2-confluence-jira#the-quiet-fix-that-matters-most-on-confluence" class="hash-link" aria-label="Direct link to The quiet fix that matters most on Confluence" title="Direct link to The quiet fix that matters most on Confluence" translate="no">​</a></h2>
<p>The easiest one to scroll past in a changelog: <strong>swimlane cluster DOM ids are now scoped per diagram</strong> (<a href="https://github.com/mermaid-js/mermaid/pull/8161" target="_blank" rel="noopener noreferrer" class="">#8161</a>). Before, two diagrams on the same page could collide on an internal id — and Confluence pages are exactly where that happens: a runbook with a flowchart <em>and</em> a swimlane, a design doc with three diagrams stacked.</p>
<p>Also in the swimlane batch: edges that detour around a lane no longer share an attachment point with their neighbor (<a href="https://github.com/mermaid-js/mermaid/pull/8383" target="_blank" rel="noopener noreferrer" class="">#8383</a>), lane title bands stay clear of crossing edges (<a href="https://github.com/mermaid-js/mermaid/pull/8384" target="_blank" rel="noopener noreferrer" class="">#8384</a>), and nodes with no edges keep their source order instead of being sorted by id (<a href="https://github.com/mermaid-js/mermaid/pull/8366" target="_blank" rel="noopener noreferrer" class="">#8366</a>) — so a hand-ordered incident runbook lane renders in the order you wrote it.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-rest-of-122">The rest of 12.2<a href="https://ngpilot.com/blog/mermaid-12-2-confluence-jira#the-rest-of-122" class="hash-link" aria-label="Direct link to The rest of 12.2" title="Direct link to The rest of 12.2" translate="no">​</a></h2>
<table><thead><tr><th>Change</th><th>What you'll notice</th></tr></thead><tbody><tr><td>Circle &amp; double-circle nodes size to their label (<a href="https://github.com/mermaid-js/mermaid/pull/8409" target="_blank" rel="noopener noreferrer" class="">#8409</a>)</td><td>Short labels no longer float in oversized circles; padding trimmed in the neo look</td></tr><tr><td>Mind map labels centered with <code>htmlLabels: false</code> (<a href="https://github.com/mermaid-js/mermaid/pull/8390" target="_blank" rel="noopener noreferrer" class="">#8390</a>), readable in the neo look on repainting themes (<a href="https://github.com/mermaid-js/mermaid/pull/8394" target="_blank" rel="noopener noreferrer" class="">#8394</a>)</td><td>Mind map text sits where it looks like it should</td></tr><tr><td>ELK no longer straightens an edge terminal into a label (<a href="https://github.com/mermaid-js/mermaid/pull/8395" target="_blank" rel="noopener noreferrer" class="">#8395</a>)</td><td>Fewer labels sitting on top of edges in ELK layouts</td></tr><tr><td>Edge clipping scoped to the engine that drew it (<a href="https://github.com/mermaid-js/mermaid/pull/8270" target="_blank" rel="noopener noreferrer" class="">#8270</a>)</td><td>Diagrams pinning their own engine (bpmn, swimlanes) render correctly even when the page default is another engine</td></tr></tbody></table>
<p>All of it is fix-grade: syntax unchanged, behavior corrected. If a diagram looked slightly wrong in 12.1 — a label off-center, a lane band under an edge — 12.2 is the "try again" release.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="related-resources">Related Resources<a href="https://ngpilot.com/blog/mermaid-12-2-confluence-jira#related-resources" class="hash-link" aria-label="Direct link to Related Resources" title="Direct link to Related Resources" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://ngpilot.com/blog/mermaid-12-confluence-jira">Mermaid 12 in Confluence &amp; Jira</a> — the 12.0 release: use case diagrams, ELK default, new look</li>
<li class=""><a class="" href="https://ngpilot.com/blog/mermaid-mindmap-hierarchy-diagram-confluence">Mind Maps &amp; Hierarchy Diagrams in Confluence</a> — the mind map syntax this coloring upgrades</li>
<li class=""><a class="" href="https://ngpilot.com/blog/mermaid-process-flow-swimlane-diagram-confluence">Swimlane Process Diagrams in Confluence</a> — the diagram type that got the most fixes in 12.2</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sources">Sources<a href="https://ngpilot.com/blog/mermaid-12-2-confluence-jira#sources" class="hash-link" aria-label="Direct link to Sources" title="Direct link to Sources" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://github.com/mermaid-js/mermaid/releases/tag/mermaid%4012.2.0" target="_blank" rel="noopener noreferrer" class="">mermaid@12.2.0 release notes — mermaid-js/mermaid on GitHub</a>, published 2026-10-13</li>
</ul><div class="margin-top--lg margin-bottom--lg" style="padding:1.25rem 1.5rem;border-left:4px solid var(--ifm-color-primary);background-color:var(--ifm-color-emphasis-100);border-radius:var(--ifm-global-radius)"><p style="margin-bottom:0.5rem;font-weight:600">Try <!-- -->Mermaid Plus Diagrams &amp; AI Agent for Confluence</p><p style="margin-bottom:0.75rem;font-size:0.95rem">All 30 Mermaid diagram types plus a Rovo AI agent, with live preview and one-click templates — free for up to 10 users.</p><a href="https://marketplace.atlassian.com/apps/1236814/mermaid-plus-diagrams-ai-agent-for-confluence?utm_source=ngpilot.com&amp;utm_medium=website&amp;utm_campaign=mermaid-plus-for-confluence" target="_blank" rel="noopener noreferrer" class="button button--primary button--sm">Get it on the Atlassian Marketplace</a></div><div class="margin-top--xl padding-top--lg"><h2 class="anchor anchorWithStickyNavbar_LWe7">Related guides</h2><ul><li><a href="https://ngpilot.com/blog/how-to-create-mermaid-diagrams-jira">How to Create Mermaid Diagrams in Jira</a></li><li><a href="https://ngpilot.com/blog/export-jira-issues-to-excel">Export Jira Issues to Excel or CSV</a></li><li><a href="https://ngpilot.com/blog/bulk-download-jira-attachments">Bulk Download Jira Attachments</a></li><li><a href="https://ngpilot.com/blog/how-to-migrate-confluence-content">How to Migrate Confluence Content</a></li><li><a href="https://ngpilot.com/blog/block-quote-confluence">How to Add a Block Quote in Confluence</a></li></ul></div><div style="display:flex;flex-wrap:wrap;gap:0.75rem;justify-content:center;margin-top:2.5rem;margin-bottom:1rem;padding-top:1.5rem;border-top:1px solid var(--ifm-color-emphasis-200)"><span style="font-size:0.875rem;font-weight:600;color:var(--ifm-color-emphasis-500);align-self:center;width:100%;text-align:center;margin-bottom:0.25rem">Explore NGPILOT</span><a class="button button--secondary button--sm" href="https://ngpilot.com/solutions">Browse Solutions</a><a class="button button--secondary button--sm" href="https://ngpilot.com/apps">All Apps</a><a class="button button--secondary button--sm" href="https://ngpilot.com/blog/archive">All Posts</a><a href="https://marketplace.atlassian.com/vendors/1226848/?utm_source=ngpilot.com&amp;utm_medium=blog&amp;utm_campaign=hub-links" class="button button--secondary button--sm" target="_blank" rel="noopener noreferrer">Atlassian Marketplace →</a></div>]]></content>
        <author>
            <name>NGPilot</name>
            <uri>https://ngpilot.com</uri>
        </author>
        <category label="confluence" term="confluence"/>
        <category label="jira" term="jira"/>
        <category label="mermaid" term="mermaid"/>
        <category label="mindmap" term="mindmap"/>
        <category label="diagrams" term="diagrams"/>
        <category label="release-notes" term="release-notes"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Render OpenAPI/Swagger Specs in Confluence]]></title>
        <id>https://ngpilot.com/blog/openapi-swagger-confluence</id>
        <link href="https://ngpilot.com/blog/openapi-swagger-confluence"/>
        <updated>2026-10-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Confluence has no native OpenAPI renderer: three ways to put an API spec on a page, from a static code block to an interactive viewer with validation.]]></summary>
        <content type="html"><![CDATA[<p>The API spec always ends up in Confluence eventually — the review page, the integration guide, the "what does this endpoint return" discussion. And Confluence does nothing with it: paste an OpenAPI YAML into a code block and you get monospaced text that scrolls for forty screens. No endpoint tree, no expandable examples, no way to see what a 200 response looks like without reading the schema by eye. Here are the three realistic ways to get a spec onto a Confluence page, ending with the one that renders it as actual API documentation.</p>
<p><strong>Quick answer:</strong> Confluence has no native OpenAPI rendering — a code block is your floor. For interactive docs, install <a href="https://marketplace.atlassian.com/apps/2844069010/" target="_blank" rel="noopener noreferrer" class="">Modern OpenAPI (Swagger) Integration for Confluence</a>, insert its macro, paste an OpenAPI 3.x / Swagger 2.x spec (YAML or JSON), and save: the page gets validated, navigable API documentation with expandable endpoints, request/response examples and example/schema model views, in the reader's own theme.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="method-1--code-block-the-floor">Method 1 — Code Block (the Floor)<a href="https://ngpilot.com/blog/openapi-swagger-confluence#method-1--code-block-the-floor" class="hash-link" aria-label="Direct link to Method 1 — Code Block (the Floor)" title="Direct link to Method 1 — Code Block (the Floor)" translate="no">​</a></h2>
<p>Paste the spec into a code snippet block, language YAML or JSON.</p>
<p><strong>Good for:</strong> "can you check this spec" reviews between two engineers.</p>
<p><strong>What's missing:</strong> everything after the paste. No navigation (find <code>/orders/{id}</code> by scrolling), no examples rendered from the schema, no validation until a human reads it, and a 3,000-line spec makes the page unusable for everyone who isn't actively editing it.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="method-2--link-out-to-a-renderer">Method 2 — Link Out to a Renderer<a href="https://ngpilot.com/blog/openapi-swagger-confluence#method-2--link-out-to-a-renderer" class="hash-link" aria-label="Direct link to Method 2 — Link Out to a Renderer" title="Direct link to Method 2 — Link Out to a Renderer" translate="no">​</a></h2>
<p>Park the spec in a repo and link to Swagger Editor, Redoc, or a hosted docs portal.</p>
<p><strong>Good for:</strong> teams whose real docs already live outside Confluence.</p>
<p><strong>What's missing:</strong> the page stops being documentation and becomes a redirect. Reviewers leave Confluence to answer questions; the page can't show the one endpoint being discussed; and access control is now someone else's problem — the spec URL is visible to anyone with the link, while the Confluence page respected permissions.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="method-3--the-macro-interactive-docs-on-the-page">Method 3 — the Macro (Interactive Docs on the Page)<a href="https://ngpilot.com/blog/openapi-swagger-confluence#method-3--the-macro-interactive-docs-on-the-page" class="hash-link" aria-label="Direct link to Method 3 — the Macro (Interactive Docs on the Page)" title="Direct link to Method 3 — the Macro (Interactive Docs on the Page)" translate="no">​</a></h2>
<p><a href="https://marketplace.atlassian.com/apps/2844069010/" target="_blank" rel="noopener noreferrer" class="">Modern OpenAPI (Swagger) Integration for Confluence</a> renders the spec inside the page:</p>
<ol>
<li class="">Insert the macro (<code>/</code> → search for its name). The config panel has a code editor on the left.</li>
<li class="">Paste the spec — <strong>OpenAPI 3.x or Swagger 2.x, YAML or JSON</strong>. Click <strong>Format</strong> to auto-indent.</li>
<li class="">Validation runs as you type: a green badge confirms the spec parses; a red badge names the problem before it ever reaches readers.</li>
<li class="">Configure the reader experience and <strong>Save</strong>.</li>
</ol>
<p>What readers get on the page:</p>
<ul>
<li class=""><strong>Expand and collapse</strong> — endpoints grouped by tag, open only what you're discussing.</li>
<li class=""><strong>Request and response examples</strong> rendered per operation, not hand-derived from the schema.</li>
<li class=""><strong>Models as Example or Schema</strong> — flip between sample values and type structure with a dropdown.</li>
<li class=""><strong>Tag filter</strong> — a search box over tag names for large APIs (it matches tags like <code>pet</code> or <code>store</code>, not endpoint paths — so tag your operations meaningfully).</li>
<li class=""><strong>Theme-matched</strong> — follows each reader's Confluence light/dark setting.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tips-for-large-specs">Tips for Large Specs<a href="https://ngpilot.com/blog/openapi-swagger-confluence#tips-for-large-specs" class="hash-link" aria-label="Direct link to Tips for Large Specs" title="Direct link to Tips for Large Specs" translate="no">​</a></h2>
<ul>
<li class=""><strong>Start small.</strong> Paste a two-endpoint spec first, verify the render, then paste the full one — debugging a 5,000-line paste is worse than debugging ten lines.</li>
<li class=""><strong>Tag deliberately.</strong> The tag filter and the default Tags expansion both key off your spec's <code>tags</code>; a spec with no tags opens as one undifferentiated list.</li>
<li class=""><strong>Expansion = None for reference pages.</strong> Internal platforms pasting a whole API set should load collapsed; the reader opens the section they came for.</li>
<li class=""><strong>Split by domain at 1024 KB.</strong> The macro's raw size ceiling is generous, but one macro per bounded context (auth, billing, webhooks) beats one mega-page for readers anyway.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="which-method-should-you-use">Which Method Should You Use?<a href="https://ngpilot.com/blog/openapi-swagger-confluence#which-method-should-you-use" class="hash-link" aria-label="Direct link to Which Method Should You Use?" title="Direct link to Which Method Should You Use?" translate="no">​</a></h2>
<table><thead><tr><th>Need</th><th>Use</th></tr></thead><tbody><tr><td>Quick review between engineers</td><td>Code block</td></tr><tr><td>Docs already live outside Confluence</td><td>Link out</td></tr><tr><td>The page <em>is</em> the documentation</td><td>OpenAPI macro</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="related-resources">Related Resources<a href="https://ngpilot.com/blog/openapi-swagger-confluence#related-resources" class="hash-link" aria-label="Direct link to Related Resources" title="Direct link to Related Resources" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://ngpilot.com/blog/code-blocks-confluence-monaco-editor">Code Blocks in Confluence</a> — where Method 1 comes from, and how far proper highlighting goes</li>
<li class=""><a class="" href="https://ngpilot.com/blog/display-json-xml-code-in-confluence">Display JSON, XML and Code in Confluence</a> — the same story for payload formats</li>
<li class=""><a class="" href="https://ngpilot.com/apps/modern-openapi-swagger-integration-for-confluence">Modern OpenAPI (Swagger) Integration for Confluence</a> — full documentation: options, troubleshooting, limits</li>
</ul><div class="margin-top--xl padding-top--lg"><h2 class="anchor anchorWithStickyNavbar_LWe7">Related guides</h2><ul><li><a href="https://ngpilot.com/blog/code-blocks-confluence-monaco-editor">Code Blocks in Confluence — Monaco Editor, Themes &amp; Highlighting</a></li><li><a href="https://ngpilot.com/blog/display-json-xml-code-in-confluence">Display JSON, XML and Code in Confluence</a></li></ul></div><div style="display:flex;flex-wrap:wrap;gap:0.75rem;justify-content:center;margin-top:2.5rem;margin-bottom:1rem;padding-top:1.5rem;border-top:1px solid var(--ifm-color-emphasis-200)"><span style="font-size:0.875rem;font-weight:600;color:var(--ifm-color-emphasis-500);align-self:center;width:100%;text-align:center;margin-bottom:0.25rem">Explore NGPILOT</span><a class="button button--secondary button--sm" href="https://ngpilot.com/solutions">Browse Solutions</a><a class="button button--secondary button--sm" href="https://ngpilot.com/apps">All Apps</a><a class="button button--secondary button--sm" href="https://ngpilot.com/blog/archive">All Posts</a><a href="https://marketplace.atlassian.com/vendors/1226848/?utm_source=ngpilot.com&amp;utm_medium=blog&amp;utm_campaign=hub-links" class="button button--secondary button--sm" target="_blank" rel="noopener noreferrer">Atlassian Marketplace →</a></div>]]></content>
        <author>
            <name>NGPilot</name>
            <uri>https://ngpilot.com</uri>
        </author>
        <category label="confluence" term="confluence"/>
        <category label="openapi" term="openapi"/>
        <category label="swagger" term="swagger"/>
        <category label="api-docs" term="api-docs"/>
        <category label="how-to" term="how-to"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Jira vs Confluence: When You Need Each One]]></title>
        <id>https://ngpilot.com/blog/jira-vs-confluence</id>
        <link href="https://ngpilot.com/blog/jira-vs-confluence"/>
        <updated>2026-10-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Jira tracks work; Confluence holds knowledge: a plain-language comparison of what each Atlassian product does, where the boundary sits, and how they connect.]]></summary>
        <content type="html"><![CDATA[<p>The two products Atlassian is best known for are also the two most confused with each other — same vendor, same pricing page, both "for teams", one blue and one grey. The confusion is expensive: teams either buy both and use one as an expensive document store, or buy one and force it to do a job it is bad at.</p>
<p><strong>Quick answer:</strong> Jira is for work that <strong>moves</strong> — issues that travel through a workflow from To Do to Done. Confluence is for knowledge that <strong>stays</strong> — pages that hold decisions, specs, and runbooks and get revised as reality changes. They are complements, not competitors, and the link between them is where most teams get the real value.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-jira-is-for">What Jira is for<a href="https://ngpilot.com/blog/jira-vs-confluence#what-jira-is-for" class="hash-link" aria-label="Direct link to What Jira is for" title="Direct link to What Jira is for" translate="no">​</a></h2>
<p>Jira tracks <strong>issues</strong> — units of work with a type (bug, story, task), a status, an assignee, and a place in a workflow. Its strengths are all downstream of that model:</p>
<ul>
<li class=""><strong>Workflow enforcement</strong> — work moves through states you define, with rules about who can move what.</li>
<li class=""><strong>Filtering and reporting</strong> — JQL queries over thousands of issues; sprint boards, burndown charts, velocity.</li>
<li class=""><strong>Accountability</strong> — every field change is stamped; you can always answer "who moved this and when."</li>
</ul>
<p>What Jira is <em>not</em> is a place to write. An issue description holds a paragraph or two fine; a 20-page product spec inside a Jira description is a document nobody can find, link to, or maintain.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-confluence-is-for">What Confluence is for<a href="https://ngpilot.com/blog/jira-vs-confluence#what-confluence-is-for" class="hash-link" aria-label="Direct link to What Confluence is for" title="Direct link to What Confluence is for" translate="no">​</a></h2>
<p>Confluence holds <strong>pages</strong> organized in a space tree. Its strengths are the mirror image:</p>
<ul>
<li class=""><strong>Long-form content</strong> — a real editor with headings, tables, macros, and diagrams rendered right on the page.</li>
<li class=""><strong>Organization</strong> — spaces, page trees, and labels so knowledge is findable by structure, not just search.</li>
<li class=""><strong>Institutional memory</strong> — page histories and comments make "why did we decide this?" answerable two years later.</li>
</ul>
<p>What Confluence is <em>not</em> is a tracker. You can build a task list on a page, but pages do not have states, assignees with notification rules, or JQL — a to-do list that has to be <em>worked</em> does not belong there.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-boundary-in-one-table">The boundary in one table<a href="https://ngpilot.com/blog/jira-vs-confluence#the-boundary-in-one-table" class="hash-link" aria-label="Direct link to The boundary in one table" title="Direct link to The boundary in one table" translate="no">​</a></h2>
<table><thead><tr><th>Question</th><th>Product</th><th>Why</th></tr></thead><tbody><tr><td>"What is the status of this bug?"</td><td>Jira</td><td>Issues have states, assignees, and history</td></tr><tr><td>"How does our deploy pipeline work?"</td><td>Confluence</td><td>A living document with diagrams and owners</td></tr><tr><td>"What is this sprint's velocity?"</td><td>Jira</td><td>Reports run over tracked issues</td></tr><tr><td>"Why did we choose vendor X?"</td><td>Confluence</td><td>Decision records with context and comments</td></tr><tr><td>"Who is working on what right now?"</td><td>Jira</td><td>Boards and filters over live data</td></tr><tr><td>"Where is the onboarding checklist?"</td><td>Confluence</td><td>A page a new hire can actually follow</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="when-one-alone-is-enough">When one alone is enough<a href="https://ngpilot.com/blog/jira-vs-confluence#when-one-alone-is-enough" class="hash-link" aria-label="Direct link to When one alone is enough" title="Direct link to When one alone is enough" translate="no">​</a></h2>
<ul>
<li class=""><strong>A 5-person team tracking tasks</strong> can live in Jira free plan alone — keep the "documentation" in issue descriptions and a pinned link or two, and accept the ceiling.</li>
<li class=""><strong>A writing-heavy team with no structured work</strong> (agency producing content, for example) can run on Confluence alone with page-level task lists.</li>
</ul>
<p>The trap is the middle: the moment specs start affecting tracked work, or tickets start needing real explanations, gluing a second product onto the first costs less than the workarounds.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="where-the-two-connect">Where the two connect<a href="https://ngpilot.com/blog/jira-vs-confluence#where-the-two-connect" class="hash-link" aria-label="Direct link to Where the two connect" title="Direct link to Where the two connect" translate="no">​</a></h2>
<p>The integration is the point, not an afterthought:</p>
<ul>
<li class=""><strong>Mention an issue key on a page</strong> (<code>PROJ-123</code>) and Confluence renders a live card with current status.</li>
<li class=""><strong>Link issues to pages</strong> so the spec, the meeting notes, or the postmortem sits one click from the work it explains.</li>
<li class=""><strong>Dashboards and macros</strong> surface Jira data inside Confluence pages for status pages and leadership reviews.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="where-apps-make-the-pair-genuinely-good">Where apps make the pair genuinely good<a href="https://ngpilot.com/blog/jira-vs-confluence#where-apps-make-the-pair-genuinely-good" class="hash-link" aria-label="Direct link to Where apps make the pair genuinely good" title="Direct link to Where apps make the pair genuinely good" translate="no">​</a></h2>
<p>Both products ship lean, and the Marketplace is where teams close the gaps:</p>
<ul>
<li class=""><strong>Making Confluence pages richer</strong> — text-native diagrams (see <a class="" href="https://ngpilot.com/blog/create-mermaid-diagrams-confluence">Mermaid in Confluence</a>), custom fonts, code blocks, and structured FAQ or Q&amp;A macros turn a plain wiki into a real knowledge base.</li>
<li class=""><strong>Getting data out of Jira</strong> — Cloud's built-in export is famously limited; a <a class="" href="https://ngpilot.com/blog/export-jira-issues-to-excel">bulk export to Excel/CSV</a> is the standard fix for reporting and audits.</li>
<li class=""><strong>Bridging the two</strong> — issue templates that stamp consistent structure into Jira work, and task lists on Confluence pages that mirror real tracked work, keep the boundary clean instead of letting each product decay into a bad copy of the other.</li>
</ul>
<p>The <a class="" href="https://ngpilot.com/apps">NGPILOT app catalog</a> covers both products — every app is free for up to 10 users, and installs directly from the Atlassian Marketplace.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="related-guides">Related guides<a href="https://ngpilot.com/blog/jira-vs-confluence#related-guides" class="hash-link" aria-label="Direct link to Related guides" title="Direct link to Related guides" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://ngpilot.com/blog/jira-issue-history">Jira issue history: who changed what</a> — the audit trail Jira keeps and how to read it</li>
<li class=""><a class="" href="https://ngpilot.com/blog/bulk-download-jira-attachments">Bulk download Jira attachments</a> — when the work data has to leave Jira</li>
<li class=""><a class="" href="https://ngpilot.com/solutions/team-knowledge-faq-qa-and-tasks-in-confluence">Run team knowledge with FAQs and Q&amp;A in Confluence</a> — structuring the knowledge side</li>
</ul><div class="margin-top--xl padding-top--lg"><h2 class="anchor anchorWithStickyNavbar_LWe7">Related guides</h2><ul><li><a href="https://ngpilot.com/blog/how-to-create-mermaid-diagrams-jira">How to Create Mermaid Diagrams in Jira</a></li><li><a href="https://ngpilot.com/blog/export-jira-issues-to-excel">Export Jira Issues to Excel or CSV</a></li><li><a href="https://ngpilot.com/blog/bulk-download-jira-attachments">Bulk Download Jira Attachments</a></li><li><a href="https://ngpilot.com/blog/how-to-migrate-confluence-content">How to Migrate Confluence Content</a></li><li><a href="https://ngpilot.com/blog/block-quote-confluence">How to Add a Block Quote in Confluence</a></li></ul></div><div style="display:flex;flex-wrap:wrap;gap:0.75rem;justify-content:center;margin-top:2.5rem;margin-bottom:1rem;padding-top:1.5rem;border-top:1px solid var(--ifm-color-emphasis-200)"><span style="font-size:0.875rem;font-weight:600;color:var(--ifm-color-emphasis-500);align-self:center;width:100%;text-align:center;margin-bottom:0.25rem">Explore NGPILOT</span><a class="button button--secondary button--sm" href="https://ngpilot.com/solutions">Browse Solutions</a><a class="button button--secondary button--sm" href="https://ngpilot.com/apps">All Apps</a><a class="button button--secondary button--sm" href="https://ngpilot.com/blog/archive">All Posts</a><a href="https://marketplace.atlassian.com/vendors/1226848/?utm_source=ngpilot.com&amp;utm_medium=blog&amp;utm_campaign=hub-links" class="button button--secondary button--sm" target="_blank" rel="noopener noreferrer">Atlassian Marketplace →</a></div>]]></content>
        <author>
            <name>NGPilot</name>
            <uri>https://ngpilot.com</uri>
        </author>
        <category label="jira" term="jira"/>
        <category label="confluence" term="confluence"/>
        <category label="atlassian" term="atlassian"/>
        <category label="comparison" term="comparison"/>
        <category label="explained" term="explained"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[How to Use PlantUML in Confluence Cloud (3 Working Methods)]]></title>
        <id>https://ngpilot.com/blog/plantuml-in-confluence</id>
        <link href="https://ngpilot.com/blog/plantuml-in-confluence"/>
        <updated>2026-10-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Confluence Cloud has no native PlantUML macro. Three workarounds: convert to an editable Excalidraw whiteboard, render externally and embed, or use Mermaid.]]></summary>
        <content type="html"><![CDATA[<p>Every team that migrated to Confluence Cloud with a wiki full of PlantUML diagrams hits the same wall: the macro they used on Data Center does not exist in Cloud, and there is no native PlantUML support to fall back on. The source text is usually still there, sitting in page storage — it just has nothing to render it.</p>
<p><strong>Quick answer:</strong> there are three working methods in Confluence Cloud. Convert PlantUML into an editable Excalidraw whiteboard with an AI agent (best for diagrams you still maintain), render externally and embed an image (fine for frozen history), or write new diagrams in Mermaid (best for everything you have not created yet). This post shows all three.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-there-is-no-plantuml-in-confluence-cloud">Why there is no PlantUML in Confluence Cloud<a href="https://ngpilot.com/blog/plantuml-in-confluence#why-there-is-no-plantuml-in-confluence-cloud" class="hash-link" aria-label="Direct link to Why there is no PlantUML in Confluence Cloud" title="Direct link to Why there is no PlantUML in Confluence Cloud" translate="no">​</a></h2>
<p>PlantUML rendering requires executing the PlantUML engine — a Java process that turns <code>.puml</code> source into SVG. On Data Center, apps bundled that engine server-side. Confluence Cloud's Forge platform does not give apps a Java runtime, so the classic PlantUML macros never made the jump, and Atlassian has no native diagram-as-code feature beyond Mermaid's text syntax in some app ecosystems. That is why searches for PlantUML in the Marketplace often return nothing useful for Cloud.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="method-1-convert-plantuml-into-an-editable-whiteboard">Method 1: convert PlantUML into an editable whiteboard<a href="https://ngpilot.com/blog/plantuml-in-confluence#method-1-convert-plantuml-into-an-editable-whiteboard" class="hash-link" aria-label="Direct link to Method 1: convert PlantUML into an editable whiteboard" title="Direct link to Method 1: convert PlantUML into an editable whiteboard" translate="no">​</a></h2>
<p><a href="https://marketplace.atlassian.com/apps/1237651/excalidraw-plus-whiteboards-for-confluence?hosting=cloud&amp;tab=overview" target="_blank" rel="noopener noreferrer" class="">Excalidraw Plus Whiteboards &amp; AI Agent for Confluence</a> ships with a Rovo AI agent that converts PlantUML source into an Excalidraw whiteboard. Open Confluence chat on your page and ask it to convert; the output is fully editable shapes on the canvas — reposition, restyle, and extend them like any drawn whiteboard.</p>
<p>This is the right method for <strong>live diagrams</strong> — the sequence diagram that changes with every sprint, the component diagram you actually keep updated. Two honest caveats:</p>
<ul>
<li class="">Conversion is one-directional: PlantUML → Excalidraw. (Mermaid converts in both directions; PlantUML does not convert back.)</li>
<li class="">Exotic PlantUML constructs may need a touch-up after conversion. The shapes arrive; exotic styling sometimes does not.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="method-2-render-externally-embed-the-picture">Method 2: render externally, embed the picture<a href="https://ngpilot.com/blog/plantuml-in-confluence#method-2-render-externally-embed-the-picture" class="hash-link" aria-label="Direct link to Method 2: render externally, embed the picture" title="Direct link to Method 2: render externally, embed the picture" translate="no">​</a></h2>
<p>For diagrams that are <strong>frozen history</strong> — the architecture as it was in 2023, the audit appendix — converting is wasted effort. Render the <code>.puml</code> outside Confluence:</p>
<ol>
<li class="">Paste the source into the public PlantUML server (<code>plantuml.com/plantuml</code>) or run it through a local <code>plantuml.jar</code> / CI render step.</li>
<li class="">Export PNG (quick) or SVG (crisp at any zoom).</li>
<li class="">Attach the image to the Confluence page.</li>
</ol>
<p>Zero apps, zero cost, and the diagram looks exactly as it did on Data Center. The trade: it is a picture now. Nobody edits it in place, and search cannot read inside it. If a diagram needs its next revision, that is your signal to use Method 1 or 3 instead.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="method-3-write-new-diagrams-in-mermaid">Method 3: write new diagrams in Mermaid<a href="https://ngpilot.com/blog/plantuml-in-confluence#method-3-write-new-diagrams-in-mermaid" class="hash-link" aria-label="Direct link to Method 3: write new diagrams in Mermaid" title="Direct link to Method 3: write new diagrams in Mermaid" translate="no">​</a></h2>
<p>For everything you have not written yet, the pragmatic answer is to stop accumulating PlantUML debt. Mermaid covers the everyday UML set — sequence, class, state, ER, activity-style flowcharts — and has first-class Confluence support: <a href="https://marketplace.atlassian.com/apps/1236814/mermaid-plus-diagrams-ai-agent-for-confluence?hosting=cloud&amp;tab=overview" target="_blank" rel="noopener noreferrer" class="">Mermaid Plus Diagrams &amp; AI Agent for Confluence</a> renders 30 Mermaid diagram types from a <code>/mermaid</code> macro with live preview, and its AI agent creates and edits diagrams from chat.</p>
<p>The syntax is different from PlantUML, but the mental model is identical: text in, diagram out, versioned with the page. The <a class="" href="https://ngpilot.com/blog/create-mermaid-diagrams-confluence">step-by-step Mermaid guide</a> covers the move in ten minutes.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="which-method-for-which-diagram">Which method for which diagram<a href="https://ngpilot.com/blog/plantuml-in-confluence#which-method-for-which-diagram" class="hash-link" aria-label="Direct link to Which method for which diagram" title="Direct link to Which method for which diagram" translate="no">​</a></h2>
<table><thead><tr><th>Situation</th><th>Method</th><th>Why</th></tr></thead><tbody><tr><td>Live diagram you still edit</td><td>1 — Convert to Excalidraw</td><td>Editable shapes on the canvas, AI edits in place</td></tr><tr><td>Frozen history / audit appendix</td><td>2 — Render + embed</td><td>Zero effort, pixel-identical, nobody needs to edit it</td></tr><tr><td>New sequence/class/ER diagram</td><td>3 — Mermaid</td><td>Native Confluence rendering, one syntax going forward</td></tr><tr><td>Diagram your team renders in CI</td><td>2 — Render + embed</td><td>Keep the pipeline; Confluence stays the display layer</td></tr><tr><td>Page migrated from Data Center</td><td>1 or 2</td><td>The source text survived; render or convert it before the page rots</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="related-guides">Related guides<a href="https://ngpilot.com/blog/plantuml-in-confluence#related-guides" class="hash-link" aria-label="Direct link to Related guides" title="Direct link to Related guides" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://ngpilot.com/blog/create-mermaid-diagrams-confluence">Create Mermaid diagrams in Confluence</a> — the step-by-step editor walkthrough</li>
<li class=""><a class="" href="https://ngpilot.com/blog/mermaid-vs-plantuml-vs-graphviz-confluence">Mermaid vs PlantUML vs Graphviz for Confluence</a> — choosing between the three text-to-diagram syntaxes</li>
<li class=""><a class="" href="https://ngpilot.com/blog/excalidraw-ai-agent-confluence">Excalidraw AI agent in Confluence</a> — how the conversion and chat editing work</li>
</ul><div class="margin-top--xl padding-top--lg"><h2 class="anchor anchorWithStickyNavbar_LWe7">Related guides</h2><ul><li><a href="https://ngpilot.com/blog/how-to-create-mermaid-diagrams-jira">How to Create Mermaid Diagrams in Jira</a></li><li><a href="https://ngpilot.com/blog/export-jira-issues-to-excel">Export Jira Issues to Excel or CSV</a></li><li><a href="https://ngpilot.com/blog/bulk-download-jira-attachments">Bulk Download Jira Attachments</a></li><li><a href="https://ngpilot.com/blog/how-to-migrate-confluence-content">How to Migrate Confluence Content</a></li><li><a href="https://ngpilot.com/blog/block-quote-confluence">How to Add a Block Quote in Confluence</a></li></ul></div><div style="display:flex;flex-wrap:wrap;gap:0.75rem;justify-content:center;margin-top:2.5rem;margin-bottom:1rem;padding-top:1.5rem;border-top:1px solid var(--ifm-color-emphasis-200)"><span style="font-size:0.875rem;font-weight:600;color:var(--ifm-color-emphasis-500);align-self:center;width:100%;text-align:center;margin-bottom:0.25rem">Explore NGPILOT</span><a class="button button--secondary button--sm" href="https://ngpilot.com/solutions">Browse Solutions</a><a class="button button--secondary button--sm" href="https://ngpilot.com/apps">All Apps</a><a class="button button--secondary button--sm" href="https://ngpilot.com/blog/archive">All Posts</a><a href="https://marketplace.atlassian.com/vendors/1226848/?utm_source=ngpilot.com&amp;utm_medium=blog&amp;utm_campaign=hub-links" class="button button--secondary button--sm" target="_blank" rel="noopener noreferrer">Atlassian Marketplace →</a></div>]]></content>
        <author>
            <name>NGPilot</name>
            <uri>https://ngpilot.com</uri>
        </author>
        <category label="confluence" term="confluence"/>
        <category label="plantuml" term="plantuml"/>
        <category label="diagrams" term="diagrams"/>
        <category label="uml" term="uml"/>
        <category label="sequence-diagram" term="sequence-diagram"/>
        <category label="how-to" term="how-to"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fix Broken Links After a Confluence Cloud Migration]]></title>
        <id>https://ngpilot.com/blog/broken-links-after-confluence-cloud-migration</id>
        <link href="https://ngpilot.com/blog/broken-links-after-confluence-cloud-migration"/>
        <updated>2026-10-14T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[A Confluence Cloud migration moves your pages but not the links inside them: find legacy Server and DC URLs, preview every fix, and rewrite them in bulk.]]></summary>
        <content type="html"><![CDATA[<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>Quick Answer</div><div class="admonitionContent_BuS1"><p>A Cloud migration moves your content. It does not fix the links <strong>inside</strong> it. Anything a user typed by hand — an old Jira URL in a page body, a Server link pasted into a comment in 2021, a macro pointing at your old domain — survives the migration verbatim and now points at a host that no longer exists. Find them with advanced search on the old domain, define one mapping rule per domain, preview every match before rewriting, and sweep page bodies, blog posts, comments, macro parameters and attachment names separately.</p></div></div>
<p>The migration is done. Pages moved, spaces are there, the site is live and people are using it. Then someone clicks a link in an onboarding page and lands on a 404 that points at <code>jira.mycompany.com</code> — a hostname that stopped answering the day you cut over.</p>
<p>It is a common post-migration complaint, and it has a specific cause worth understanding, because the fix is different depending on where the link is.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>What you'll learn</div><div class="admonitionContent_BuS1"><ol>
<li class="">Which links the migration fixes and which it silently leaves behind</li>
<li class="">Why comments and macro parameters are where the damage hides</li>
<li class="">The search queries that actually find the stragglers</li>
<li class="">How to build mapping rules that are safe to run in bulk</li>
<li class="">Why Jira links inside Confluence need their own mapping</li>
</ol></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-the-migration-leaves-links-behind">Why the migration leaves links behind<a href="https://ngpilot.com/blog/broken-links-after-confluence-cloud-migration#why-the-migration-leaves-links-behind" class="hash-link" aria-label="Direct link to Why the migration leaves links behind" title="Direct link to Why the migration leaves links behind" translate="no">​</a></h2>
<p>The Cloud Migration Assistant understands structure. It knows a page in space <code>ENG</code> called "Onboarding" should become a page with a new ID at a new URL, and it rewrites the links that point at <em>that page</em>. That is the part it is good at, and for content that was linked properly, it works.</p>
<p>What it cannot do is interpret a URL that someone typed as text. Those are just strings to it:</p>
<table><thead><tr><th>Where the link lives</th><th>Migration awareness</th><th>Result</th></tr></thead><tbody><tr><td>Link to a migrated page, made via the editor picker</td><td>Likely — the target resolves</td><td>Usually fixed automatically</td></tr><tr><td>Old Jira issue link typed into a page body</td><td>Partial — needs the Jira migration mapping</td><td>Broken unless you apply the mapping</td></tr><tr><td>Old-domain URL pasted into a comment</td><td>None — comments are historical text</td><td>Broken</td></tr><tr><td>Old URL inside a macro parameter (chart, filter, Smart Link)</td><td>None — it is a config value</td><td>Broken</td></tr><tr><td>Old URL in an attachment filename</td><td>None</td><td>Broken when opened</td></tr></tbody></table>
<p>The pattern is that the further a link is from Confluence's own page model, the less the migration knows about it. And the further from the model it is, the more likely a human put it there by hand — which is exactly the case the tooling cannot handle.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1-find-what-is-actually-broken">Step 1: find what is actually broken<a href="https://ngpilot.com/blog/broken-links-after-confluence-cloud-migration#step-1-find-what-is-actually-broken" class="hash-link" aria-label="Direct link to Step 1: find what is actually broken" title="Direct link to Step 1: find what is actually broken" translate="no">​</a></h2>
<p>Start with the old domain. Confluence CQL's <code>~</code> operator — which <a href="https://developer.atlassian.com/cloud/confluence/advanced-searching-using-cql/" target="_blank" rel="noopener noreferrer" class="">Atlassian's operator reference</a> calls CONTAINS — does what you need here:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">text ~ "jira.mycompany.com"</span><br></div></code></pre></div></div>
<p>One caveat worth knowing before you trust the results: <code>~</code> is a fuzzy token match, not a literal string match. It will also return pages that merely <em>mention</em> the old domain rather than link to it. Budget for a manual pass over the hits — which you need anyway, because the next step is a rewrite.</p>
<p>Run it for three things:</p>
<ul>
<li class=""><strong>Your old Confluence domain</strong> — self-links that were typed rather than picked</li>
<li class=""><strong>Your old Jira base URL</strong> — worth its own sweep, because Confluence pages reference Jira issues constantly</li>
<li class=""><strong>Any third-party host</strong> that also moved, if you had a self-hosted plugin domain</li>
</ul>
<p>Then sweep the places CQL will not reach. This matters because <a href="https://developer.atlassian.com/cloud/confluence/advanced-searching-using-cql/" target="_blank" rel="noopener noreferrer" class=""><code>text</code> is a master field covering title, content body and labels only</a> — <strong>comments are not part of it</strong>, so a comment link will not appear in the query above at all.</p>
<ul>
<li class=""><strong>Comments.</strong> A link someone pasted into a comment three years ago is still sitting there verbatim, and the CQL text search will not find it. Check these in the UI.</li>
<li class=""><strong>Blog posts.</strong> Selectable explicitly with <code>AND type = blogpost</code>.</li>
<li class=""><strong>Macro parameters.</strong> A chart macro pointed at your old Grafana, or a filter macro pointed at your old Jira, is a config value the migration has no reason to touch. CQL has a <code>macro</code> field, so <code>macro = jira</code> lists every page carrying a Jira issue macro — a good place to check for stale issue links.</li>
<li class=""><strong>Attachment filenames and page properties.</strong></li>
</ul>
<p>If you want to see the scale before you commit to a fix, run the query once per space and compare counts. Confluence CQL has no grouping operator at all — <a href="https://developer.atlassian.com/cloud/confluence/advanced-searching-using-cql/" target="_blank" rel="noopener noreferrer" class="">its documented keywords</a> are <code>AND</code>, <code>OR</code>, <code>NOT</code> and <code>ORDER BY</code>, with <code>ASC</code> and <code>DESC</code> as sort modifiers — so there is no way to ask for a per-space tally inside a single query.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2-define-the-mapping-rules-before-you-touch-anything">Step 2: define the mapping rules before you touch anything<a href="https://ngpilot.com/blog/broken-links-after-confluence-cloud-migration#step-2-define-the-mapping-rules-before-you-touch-anything" class="hash-link" aria-label="Direct link to Step 2: define the mapping rules before you touch anything" title="Direct link to Step 2: define the mapping rules before you touch anything" translate="no">​</a></h2>
<p>Do not start with find-and-replace. Start with a rule table, one row per domain:</p>
<table><thead><tr><th>Old</th><th>New</th></tr></thead><tbody><tr><td><code>jira.mycompany.com/browse/</code></td><td><code>your-domain.atlassian.net/browse/</code></td></tr><tr><td><code>jira.mycompany.com/secure/ViewProfile.jspa</code></td><td><code>your-domain.atlassian.net/jira/secure/ViewProfile.jspa</code></td></tr><tr><td><code>mycompany.atlassian.com/wiki/</code></td><td><code>your-domain.atlassian.net/wiki/</code></td></tr></tbody></table>
<p>Rules are safer than replacements for three reasons. They are explicit about which paths are in scope. They are auditable — you can print the rule set and check it. And when one rule is wrong, you fix one rule instead of hunting through every page it already damaged.</p>
<p>The mistake to avoid is a blanket old-domain-to-new-domain replacement applied to every URL. Some old paths are genuinely gone and should become something else entirely. Blanket replacement turns those into confidently-wrong new URLs, which is harder to detect later than the original 404.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-3-preview-then-fix">Step 3: preview, then fix<a href="https://ngpilot.com/blog/broken-links-after-confluence-cloud-migration#step-3-preview-then-fix" class="hash-link" aria-label="Direct link to Step 3: preview, then fix" title="Direct link to Step 3: preview, then fix" translate="no">​</a></h2>
<p>Every candidate match should show you three things before you approve it: the page it lives on, the URL as it is now, and the URL it would become. Then you can accept, skip or fix each one.</p>
<p>This is worth insisting on even when the rule looks obviously safe, because of the Jira case below.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-jira-links-inside-confluence-need-their-own-mapping">The Jira links inside Confluence need their own mapping<a href="https://ngpilot.com/blog/broken-links-after-confluence-cloud-migration#the-jira-links-inside-confluence-need-their-own-mapping" class="hash-link" aria-label="Direct link to The Jira links inside Confluence need their own mapping" title="Direct link to The Jira links inside Confluence need their own mapping" translate="no">​</a></h3>
<p>If your Confluence pages link to Jira issues and Jira migrated separately, a domain swap is not enough on its own. The Cloud Migration Assistant records an issue key to cloud-ID mapping for the migration; apply that mapping rather than guessing, so the rewrite follows the real transformation instead of a pattern match.</p>
<p>Getting this wrong produces links that look right and go nowhere: correct domain, wrong key.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-4-verify-with-a-re-scan">Step 4: verify with a re-scan<a href="https://ngpilot.com/blog/broken-links-after-confluence-cloud-migration#step-4-verify-with-a-re-scan" class="hash-link" aria-label="Direct link to Step 4: verify with a re-scan" title="Direct link to Step 4: verify with a re-scan" translate="no">​</a></h2>
<p>Re-run the same searches after the fix. Two things you want to see:</p>
<ul>
<li class=""><strong>Zero matches on the old domain.</strong> Anything left is a rule you did not write.</li>
<li class=""><strong>No new breakage.</strong> Spot-check a handful of pages you rewrote by following a few links out from them, especially into Jira. A page can be fully rewritten and still contain one link the rule did not match because of a trailing slash or a slightly different casing.</li>
</ul>
<p>Keep the record of what changed — which page, which URL, which rule, when. When someone reports a broken link in month three, that record turns a search into a lookup.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="doing-this-on-a-schedule">Doing this on a schedule<a href="https://ngpilot.com/blog/broken-links-after-confluence-cloud-migration#doing-this-on-a-schedule" class="hash-link" aria-label="Direct link to Doing this on a schedule" title="Direct link to Doing this on a schedule" translate="no">​</a></h2>
<p>Migration is not the only way legacy URLs appear. An app is renamed, a domain is rebranded, a third-party service is retired. Any of those leaves the same residue.</p>
<p>Running the old-domain sweep a few weeks after cutover — and once more after the first quarter — catches the stragglers that the first pass missed. Comments surface slowly: people find old links months later and report them one at a time, because nothing tells them the link is dead until they click it.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sources">Sources<a href="https://ngpilot.com/blog/broken-links-after-confluence-cloud-migration#sources" class="hash-link" aria-label="Direct link to Sources" title="Direct link to Sources" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://developer.atlassian.com/cloud/confluence/advanced-searching-using-cql/" target="_blank" rel="noopener noreferrer" class="">Advanced searching using CQL — Atlassian Developers</a> — the <code>~</code> CONTAINS operator, the <code>text</code> master field, and the absence of a grouping operator</li>
<li class=""><a href="https://developer.atlassian.com/cloud/confluence/advanced-searching-using-cql/" target="_blank" rel="noopener noreferrer" class="">Advanced searching using CQL — Atlassian Developers</a> — <code>~</code> CONTAINS, the <code>text</code> master field, keyword list</li>
<li class=""><a href="https://confluence.atlassian.com/clean/cleanup-guide-1018788576.html" target="_blank" rel="noopener noreferrer" class="">Cleanup guide — Atlassian Documentation</a> — Atlassian's framing of cleanup as routine maintenance</li>
</ul><div class="margin-top--xl padding-top--lg"><h2 class="anchor anchorWithStickyNavbar_LWe7">Related guides</h2><ul><li><a href="https://ngpilot.com/blog/how-to-migrate-confluence-content">How to Migrate Confluence Content</a></li><li><a href="https://ngpilot.com/blog/find-stale-pages-confluence">How to Find Stale Pages in Confluence</a></li><li><a href="https://ngpilot.com/blog/find-unused-workflows-schemes-jira">How to Find Unused Workflows, Schemes and Custom Fields in Jira</a></li></ul></div><div style="display:flex;flex-wrap:wrap;gap:0.75rem;justify-content:center;margin-top:2.5rem;margin-bottom:1rem;padding-top:1.5rem;border-top:1px solid var(--ifm-color-emphasis-200)"><span style="font-size:0.875rem;font-weight:600;color:var(--ifm-color-emphasis-500);align-self:center;width:100%;text-align:center;margin-bottom:0.25rem">Explore NGPILOT</span><a class="button button--secondary button--sm" href="https://ngpilot.com/solutions">Browse Solutions</a><a class="button button--secondary button--sm" href="https://ngpilot.com/apps">All Apps</a><a class="button button--secondary button--sm" href="https://ngpilot.com/blog/archive">All Posts</a><a href="https://marketplace.atlassian.com/vendors/1226848/?utm_source=ngpilot.com&amp;utm_medium=blog&amp;utm_campaign=hub-links" class="button button--secondary button--sm" target="_blank" rel="noopener noreferrer">Atlassian Marketplace →</a></div>]]></content>
        <author>
            <name>NGPilot</name>
            <uri>https://ngpilot.com</uri>
        </author>
        <category label="confluence" term="confluence"/>
        <category label="cloud-migration" term="cloud-migration"/>
        <category label="broken-links" term="broken-links"/>
        <category label="confluence-admin" term="confluence-admin"/>
        <category label="how-to" term="how-to"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Find Stale Pages in Confluence (All Plans)]]></title>
        <id>https://ngpilot.com/blog/find-stale-pages-confluence</id>
        <link href="https://ngpilot.com/blog/find-stale-pages-confluence"/>
        <updated>2026-10-14T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Find stale Confluence pages on any plan: the Premium content manager, the CQL query for Free and Standard, and why last modified is not the same as stale.]]></summary>
        <content type="html"><![CDATA[<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>Quick Answer</div><div class="admonitionContent_BuS1"><p>On <strong>Premium and Enterprise</strong>, open <strong>Space settings → Content manager</strong> and use the <strong>Last active</strong> dropdown — it shows pages not viewed, updated or commented on, with options from 7 days to 6 months back. On <strong>Free and Standard</strong> that screen does not exist, so use CQL instead: <code>type = page AND lastModified &lt; now("-365d") ORDER BY lastModified ASC</code>. Neither route is complete: Atlassian documents that Last active excludes pages with children, and blogs sit outside the tool entirely.</p></div></div>
<p>A Confluence instance does not rot all at once. It accumulates. A project wraps up and its space stays. A team splits and both halves keep the old runbook. Someone copies a page instead of linking to it, and now two versions exist with different numbers in them. Five years later a new hire searches for the onboarding doc, lands on the 2021 version, and trusts it.</p>
<p>The cleanup instinct is right. The problem is that "find stale pages" is one of those tasks where the answer depends entirely on which Confluence plan you happen to be on, and almost nobody knows that until they go looking. Here is what each tier actually gives you, in the order you should try it.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>What you'll learn</div><div class="admonitionContent_BuS1"><ol>
<li class="">The native way, and the four documented omissions</li>
<li class="">Why Atlassian deliberately skips your most-outdated pages</li>
<li class="">The CQL query that works on every plan, including Free</li>
<li class="">Why "not edited" and "nobody reads it" are two different lists</li>
<li class="">What to do with the list once you have it</li>
</ol></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-native-way-content-manager-premium-and-enterprise">The native way: content manager (Premium and Enterprise)<a href="https://ngpilot.com/blog/find-stale-pages-confluence#the-native-way-content-manager-premium-and-enterprise" class="hash-link" aria-label="Direct link to The native way: content manager (Premium and Enterprise)" title="Direct link to The native way: content manager (Premium and Enterprise)" translate="no">​</a></h2>
<p>Confluence ships this tool and it does one specific job. Per <a href="https://support.atlassian.com/confluence-cloud/docs/manage-your-content-tree/" target="_blank" rel="noopener noreferrer" class="">Atlassian's documentation</a>, it is an admin tool in Confluence Premium and Enterprise, and Confluence Standard users have no access to it.</p>
<p><strong>Space settings → Content manager → Last active</strong></p>
<p>The filter shows pages that haven't been viewed, updated or commented on. The dropdown offers four fixed options: <strong>Over 7 days ago, over 1 month ago, Over 3 months ago, Over 6 months ago</strong>. From there you can archive (up to 500 items at a time), delete (up to 100), change owner, change status, or apply an automation flow to the selection.</p>
<p>Three things about it are worth knowing before you plan a cleanup around it.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="limit-1--it-is-one-space-at-a-time">Limit 1 — it is one space at a time<a href="https://ngpilot.com/blog/find-stale-pages-confluence#limit-1--it-is-one-space-at-a-time" class="hash-link" aria-label="Direct link to Limit 1 — it is one space at a time" title="Direct link to Limit 1 — it is one space at a time" translate="no">​</a></h3>
<p>The tool lives under Space settings and operates on a single space. There is no site-wide version. If you run 40 spaces, an instance-wide audit means opening the same screen 40 times and merging the results yourself. That is a common reason people end up writing a script instead.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="limit-2--it-skips-every-page-that-has-children">Limit 2 — it skips every page that has children<a href="https://ngpilot.com/blog/find-stale-pages-confluence#limit-2--it-skips-every-page-that-has-children" class="hash-link" aria-label="Direct link to Limit 2 — it skips every page that has children" title="Direct link to Limit 2 — it skips every page that has children" translate="no">​</a></h3>
<p>This one is documented, though the wording deserves care. Atlassian's content manager page states:</p>
<blockquote>
<p><strong>"Last active" won't return a complete list.</strong> It specifically filters pages that don't have children. This serves as a safety measure due to the way permissions are inherited in Confluence.
— <a href="https://support.atlassian.com/confluence-cloud/docs/manage-your-content-tree/" target="_blank" rel="noopener noreferrer" class="">Atlassian: Clean up a space with the content manager</a></p>
</blockquote>
<p>Read that literally and it reads as <em>excluding childless pages</em>. That is almost certainly a wording slip in the docs, because the rationale only makes sense the other way round: nested content inherits view permissions from its parent, so the risk being guarded against is acting on a <strong>parent</strong> without first setting explicit permissions on each page. Administrators consistently report the observed behaviour as <strong>parent pages with children being the ones left out of the list</strong>.</p>
<p>Either way, the conclusion for you is the same, and it is the part that matters: <strong>the list is not complete, and the pages most likely to be out of date are parent pages.</strong> The failure mode is quiet. You get a short list, it looks complete, and you archive what is on it — while the stale parents stay exactly where they were, and you conclude the cleanup worked. If you are about to run a cleanup on a space with a deep page tree, spot-check three parent pages by hand first.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="limit-3--more-is-excluded-than-the-filter-name-suggests">Limit 3 — more is excluded than the filter name suggests<a href="https://ngpilot.com/blog/find-stale-pages-confluence#limit-3--more-is-excluded-than-the-filter-name-suggests" class="hash-link" aria-label="Direct link to Limit 3 — more is excluded than the filter name suggests" title="Direct link to Limit 3 — more is excluded than the filter name suggests" translate="no">​</a></h3>
<p>The same documentation lists what the content tree covers and what it does not:</p>
<table><thead><tr><th>Included</th><th>Excluded, and why</th></tr></thead><tbody><tr><td>Published pages</td><td><strong>Blogs</strong> — the tool organizes a space's content <em>except blogs</em></td></tr><tr><td>Whiteboards</td><td><strong>Drafts</strong> — excluded because they are only visible to their author</td></tr><tr><td>Folders, live docs, smart links</td><td><strong>Databases</strong> — excluded while still in beta</td></tr></tbody></table>
<p>So the Last active filter is a filter <em>within an already-narrowed set</em>. Blog posts are not in the tool at all, which matters if your stale content lives in blog posts.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Which plan do I have?</div><div class="admonitionContent_BuS1"><p>Atlassian's documentation notes that Confluence Standard users don't have access to the content manager, and points them instead to archiving or deleting a nested group — including its nested pages — from the content tree. If you're on Free or Standard, everything below this section is your answer.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-route-that-works-on-every-plan-cql">The route that works on every plan: CQL<a href="https://ngpilot.com/blog/find-stale-pages-confluence#the-route-that-works-on-every-plan-cql" class="hash-link" aria-label="Direct link to The route that works on every plan: CQL" title="Direct link to The route that works on every plan: CQL" translate="no">​</a></h2>
<p>Confluence Query Language runs on Free. It is less comfortable than a filter dropdown, but it is not limited to one space, and you can export what it returns. The syntax below follows Atlassian's <a href="https://developer.atlassian.com/cloud/confluence/advanced-searching-using-cql/" target="_blank" rel="noopener noreferrer" class="">official CQL reference</a>.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">type = page AND lastModified &lt; now("-365d") ORDER BY lastModified ASC</span><br></div></code></pre></div></div>
<p>Narrow it as needed:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">space = ENG AND type = page AND lastModified &lt; now("-180d") ORDER BY lastModified ASC</span><br></div></code></pre></div></div>
<p>Run it in <strong>Advanced search</strong> in the Confluence UI, or via the REST API if you want the results programmatically:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">curl -u "you@example.com:token" \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --get "https://your-domain.atlassian.net/wiki/rest/api/content/search" \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --data-urlencode 'cql=type = page AND lastModified &lt; now("-365d") ORDER BY lastModified ASC' \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --data-urlencode "limit=100"</span><br></div></code></pre></div></div>
<p>Response bodies paginate — follow <code>_links.next</code> until it is absent, or you will silently process the first batch and believe it is the whole set.</p>
<p>Useful variations, all taken from Atlassian's documented Confluence CQL fields:</p>
<table><thead><tr><th>Goal</th><th>Add to the CQL</th></tr></thead><tbody><tr><td>Several spaces at once</td><td><code>AND space in (ENG, OPS)</code></td></tr><tr><td>Only blog posts</td><td><code>AND type = blogpost</code></td></tr><tr><td>Only pages still in draft</td><td><code>AND pageStatus = "Rough draft"</code></td></tr><tr><td>Scope to one page tree</td><td><code>AND ancestor = 12345</code> (the parent page's content ID)</td></tr><tr><td>Skip a known-good area</td><td><code>AND space != ARCHIVE</code></td></tr><tr><td>Pages carrying a Jira macro</td><td><code>AND macro = jira</code></td></tr></tbody></table>
<p>Two details worth knowing. <code>text</code> is a master field covering page title, content body and labels together, so a <code>text ~</code> query is broader than it looks. And label exclusions use <code>NOT IN</code> rather than an empty-value test: <code>label not in (draft, review)</code> means <em>does not carry either of these labels</em>, not <em>carries no labels</em>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-trap-last-modified-is-not-the-same-as-stale">The trap: last modified is not the same as stale<a href="https://ngpilot.com/blog/find-stale-pages-confluence#the-trap-last-modified-is-not-the-same-as-stale" class="hash-link" aria-label="Direct link to The trap: last modified is not the same as stale" title="Direct link to The trap: last modified is not the same as stale" translate="no">​</a></h2>
<p>This is the part that turns a cleanup into a mistake.</p>
<p><code>lastModified</code> measures <strong>editing</strong>. It does not measure <strong>reading</strong>. The two lists are close enough to look interchangeable in a spreadsheet, and far enough apart to archive something important.</p>
<table><thead><tr><th>Page</th><th>Last modified</th><th>Read?</th><th>Verdict</th></tr></thead><tbody><tr><td>GDPR data-processing register</td><td>14 months ago</td><td>read every quarter by Legal</td><td><strong>keep</strong> — reference material is meant to be static</td></tr><tr><td>Onboarding checklist</td><td>2 weeks ago</td><td>read by nobody, ever</td><td><strong>archive</strong> — recent does not mean useful</td></tr><tr><td><code>TEST-page-final-v2</code></td><td>3 years ago</td><td>zero views</td><td><strong>archive now</strong></td></tr><tr><td>Incident runbook</td><td>8 months ago</td><td>read weekly by on-call</td><td><strong>keep</strong> — nobody edits a runbook until it breaks</td></tr></tbody></table>
<p>That first row is the one that gets people. A reference page that is read constantly and never edited looks maximally stale by the <code>lastModified</code> measure and is the last thing you should archive.</p>
<p>Confluence itself doesn't settle this for you. In Atlassian's own words, the product "does not have a native function for tracking historical page views", and the feature request asking for a last-viewed page property (<a href="https://jira.atlassian.com/browse/CONFSERVER-33386" target="_blank" rel="noopener noreferrer" class="">CONFSERVER-33386</a>) is still open. (That article is written for Data Center, where the answer is a database query — but the underlying gap it describes is why the built-in filters on Cloud fall back to activity you can see rather than activity you can't.) View analytics do exist, but the <a href="https://support.atlassian.com/confluence-cloud/docs/view-insights-on-pages/" target="_blank" rel="noopener noreferrer" class="">content insights panel that carries a last-viewed value</a> is a Premium and Enterprise capability — basic view counts sit lower, but the last-viewed field is in the paid tier.</p>
<div class="theme-admonition theme-admonition-caution admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>caution</div><div class="admonitionContent_BuS1"><p><code>lastModified &lt; now("-365d")</code> means the page has not been <strong>edited</strong> for a year. It does not mean the page is wrong. Confirm what each page contains before you act on it, and archive rather than delete wherever you have the choice.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-to-do-with-the-list">What to do with the list<a href="https://ngpilot.com/blog/find-stale-pages-confluence#what-to-do-with-the-list" class="hash-link" aria-label="Direct link to What to do with the list" title="Direct link to What to do with the list" translate="no">​</a></h2>
<p>Once you have candidates, sort into three buckets before you touch anything:</p>
<ol>
<li class=""><strong>Archive.</strong> Unused, superseded, or a copy of something that still exists. Archived content drops out of the content tree and can still be viewed — which is why archiving is reversible and deleting is not.</li>
<li class=""><strong>Flag and notify.</strong> Content someone still depends on that is quietly out of date. Label it <code>needs-review</code>, or use the content manager's automation flow to route it to the last editor. This is the bucket most cleanups skip and most need.</li>
<li class=""><strong>Keep.</strong> Reference material, compliance documents, anything read regularly without being edited.</li>
</ol>
<p>Two operational notes that save pain later:</p>
<ul>
<li class=""><strong>Deleting does not create redirects.</strong> When a page is permanently deleted, inbound links break. Check what links to a page before you remove it.</li>
<li class=""><strong>Trash is not a backup.</strong> Deleted content can be restored from trash until it is purged. If you are deleting more than a handful of pages, export the space first.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="doing-this-on-a-schedule">Doing this on a schedule<a href="https://ngpilot.com/blog/find-stale-pages-confluence#doing-this-on-a-schedule" class="hash-link" aria-label="Direct link to Doing this on a schedule" title="Direct link to Doing this on a schedule" translate="no">​</a></h2>
<p>Once a quarter is a sensible cadence, and Atlassian's own guidance in the <a href="https://support.atlassian.com/confluence-cloud/docs/manage-your-content-tree/" target="_blank" rel="noopener noreferrer" class="">content manager documentation</a> is explicit about the split: use the content manager for heavy bulk cleanup, and use <a href="https://support.atlassian.com/confluence-cloud/docs/what-is-confluence-automation/" target="_blank" rel="noopener noreferrer" class="">automation flows</a> — which the same page describes as <em>another premium feature</em> — to keep things tidy moving forward.</p>
<p>On Free and Standard you are re-running the CQL query by hand each quarter. That is the practical difference between the tiers, and it is also the reason demand for third-party tooling in this specific area exists at all: the native feature is well built, and unavailable to Free and Standard.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sources">Sources<a href="https://ngpilot.com/blog/find-stale-pages-confluence#sources" class="hash-link" aria-label="Direct link to Sources" title="Direct link to Sources" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://support.atlassian.com/confluence-cloud/docs/manage-your-content-tree/" target="_blank" rel="noopener noreferrer" class="">Clean up a space with the content manager — Atlassian Support</a> — plan availability, filter options, documented exclusions, action limits</li>
<li class=""><a href="https://developer.atlassian.com/cloud/confluence/advanced-searching-using-cql/" target="_blank" rel="noopener noreferrer" class="">Advanced searching using CQL — Atlassian Developers</a> — CQL fields, operators and keywords</li>
<li class=""><a href="https://support.atlassian.com/confluence/kb/how-can-i-find-which-pages-users-have-recently-viewed/" target="_blank" rel="noopener noreferrer" class="">How can I find which pages users have recently viewed? — Atlassian Support</a> — "no native function for tracking historical page views", and the open feature request (Data Center article)</li>
<li class=""><a href="https://support.atlassian.com/confluence-cloud/docs/view-insights-on-pages/" target="_blank" rel="noopener noreferrer" class="">Content insights and analytics — Atlassian Support</a> — where the last-viewed field lives</li>
<li class=""><a href="https://support.atlassian.com/confluence-cloud/docs/delete-restore-or-purge-a-page/" target="_blank" rel="noopener noreferrer" class="">Delete, restore, or purge a content item — Atlassian Support</a></li>
<li class=""><a href="https://support.atlassian.com/confluence-cloud/docs/archive-pages/" target="_blank" rel="noopener noreferrer" class="">Archive content items — Atlassian Support</a></li>
</ul><div class="margin-top--xl padding-top--lg"><h2 class="anchor anchorWithStickyNavbar_LWe7">Related guides</h2><ul><li><a href="https://ngpilot.com/blog/confluence-permissions-ultimate-guide-2026">Confluence Permissions: The Ultimate Guide</a></li><li><a href="https://ngpilot.com/blog/how-to-migrate-confluence-content">How to Migrate Confluence Content</a></li><li><a href="https://ngpilot.com/blog/broken-links-after-confluence-cloud-migration">Broken Links After a Confluence Cloud Migration</a></li><li><a href="https://ngpilot.com/blog/find-unused-workflows-schemes-jira">How to Find Unused Workflows, Schemes and Custom Fields in Jira</a></li></ul></div><div style="display:flex;flex-wrap:wrap;gap:0.75rem;justify-content:center;margin-top:2.5rem;margin-bottom:1rem;padding-top:1.5rem;border-top:1px solid var(--ifm-color-emphasis-200)"><span style="font-size:0.875rem;font-weight:600;color:var(--ifm-color-emphasis-500);align-self:center;width:100%;text-align:center;margin-bottom:0.25rem">Explore NGPILOT</span><a class="button button--secondary button--sm" href="https://ngpilot.com/solutions">Browse Solutions</a><a class="button button--secondary button--sm" href="https://ngpilot.com/apps">All Apps</a><a class="button button--secondary button--sm" href="https://ngpilot.com/blog/archive">All Posts</a><a href="https://marketplace.atlassian.com/vendors/1226848/?utm_source=ngpilot.com&amp;utm_medium=blog&amp;utm_campaign=hub-links" class="button button--secondary button--sm" target="_blank" rel="noopener noreferrer">Atlassian Marketplace →</a></div>]]></content>
        <author>
            <name>NGPilot</name>
            <uri>https://ngpilot.com</uri>
        </author>
        <category label="confluence" term="confluence"/>
        <category label="confluence-admin" term="confluence-admin"/>
        <category label="content-cleanup" term="content-cleanup"/>
        <category label="content-management" term="content-management"/>
        <category label="how-to" term="how-to"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Find Unused Jira Workflows, Schemes & Fields]]></title>
        <id>https://ngpilot.com/blog/find-unused-workflows-schemes-jira</id>
        <link href="https://ngpilot.com/blog/find-unused-workflows-schemes-jira"/>
        <updated>2026-10-14T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Find unused Jira workflows, field configurations and schemes with Site optimizer, the Atlassian CLI, or manual checks, and know which plan each option needs.]]></summary>
        <content type="html"><![CDATA[<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>Quick Answer</div><div class="admonitionContent_BuS1"><p>On <strong>Premium and Enterprise</strong>, open <strong>Settings → System → Site optimizer</strong>. On <strong>Free and Standard</strong> that panel does not exist, and — less usefully than you might expect — Atlassian's free CLI doesn't cover workflows either, so the honest answer for lower tiers is the per-scheme optimizer (available on all four plans) plus manual checks. Whatever route you take, remove a custom field from its <strong>screen first</strong> and the instance last.</p></div></div>
<p>Jira configuration does not rot the way Confluence content does — nobody notices a redundant workflow scheme on a page. It shows up as slowness. Atlassian's own cleanup guidance notes that too many custom fields can clutter an instance and affect its performance, and that every field is evaluated during create, update and index operations.</p>
<p>The hunt is the easy part, once you know which tool applies to you. The awkward part is that Atlassian gates its site-wide cleanup tooling to the top two plans — and the free fallback doesn't fully cover the gap.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>What you'll learn</div><div class="admonitionContent_BuS1"><ol>
<li class="">What Site optimizer covers, and the plan it needs</li>
<li class="">What Atlassian's free CLI actually does and doesn't cover</li>
<li class="">How Atlassian defines an "unused" field — the five conditions</li>
<li class="">Why an archived project still pins a scheme</li>
<li class="">The removal order that keeps you able to undo it</li>
</ol></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="option-1-site-optimizer-premium-and-enterprise">Option 1: Site optimizer (Premium and Enterprise)<a href="https://ngpilot.com/blog/find-unused-workflows-schemes-jira#option-1-site-optimizer-premium-and-enterprise" class="hash-link" aria-label="Direct link to Option 1: Site optimizer (Premium and Enterprise)" title="Direct link to Option 1: Site optimizer (Premium and Enterprise)" translate="no">​</a></h2>
<p><strong>Settings → System → Site optimizer</strong></p>
<p><a href="https://support.atlassian.com/jira-cloud-administration/docs/what-is-the-site-optimizer/" target="_blank" rel="noopener noreferrer" class="">Atlassian's documentation</a> describes it as a central hub for monitoring and improving the health of your Jira data, with actions covering issue archival, custom-field cleanup and removal of unused project role permissions. The structure splits into <strong>Limits</strong> (forward-looking — how close you are to a threshold) and <strong>Guardrails</strong> (the cleanup actions themselves).</p>
<p>For custom fields specifically, <a href="https://support.atlassian.com/jira-cloud-administration/docs/optimize-your-custom-fields/" target="_blank" rel="noopener noreferrer" class="">the field optimization guide</a> is the one to read. In <strong>Limits → Fields per space → Review</strong> you get:</p>
<ul>
<li class="">Spaces approaching or exceeding the field limit</li>
<li class="">Unused custom fields that may be suitable for cleanup</li>
<li class="">How field usage has changed over time</li>
</ul>
<p>For each unused field it shows the type, contexts, screens, <strong>last-used date</strong> and a recommendation, and offers to move it to trash — recoverable for a limited period before it becomes permanent.</p>
<p>The Limits view is the part people miss. It reports how close you are to a threshold <em>before</em> you hit it, which is worth checking quarterly whether or not you think you have a problem.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Plan requirement</div><div class="admonitionContent_BuS1"><p>Atlassian is explicit: the Site optimizer is available <strong>only on Jira Premium and Enterprise plans</strong> and requires Jira administrator permissions. On Free and Standard it is not in your admin panel.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="option-2-what-the-atlassian-cli-actually-covers-and-doesnt">Option 2: what the Atlassian CLI actually covers (and doesn't)<a href="https://ngpilot.com/blog/find-unused-workflows-schemes-jira#option-2-what-the-atlassian-cli-actually-covers-and-doesnt" class="hash-link" aria-label="Direct link to Option 2: what the Atlassian CLI actually covers (and doesn't)" title="Direct link to Option 2: what the Atlassian CLI actually covers (and doesn't)" translate="no">​</a></h2>
<p>The <a href="https://developer.atlassian.com/cloud/acli/guides/install-acli/" target="_blank" rel="noopener noreferrer" class="">Atlassian CLI</a> (ACLI) is Atlassian's own free tool for Jira Cloud, <a href="https://developer.atlassian.com/cloud/acli/guides/download-supported-packages/" target="_blank" rel="noopener noreferrer" class="">available on Windows, Linux and macOS</a> and on all Jira Cloud plans. It's genuinely useful — but set your expectations correctly for this particular job.</p>
<p>Its modern command structure is <code>acli &lt;product&gt; &lt;feature&gt; &lt;action&gt;</code>, for example <code>acli jira workitem search</code> or <code>acli jira project list</code>. You may find older examples online using an <code>--action</code> flag style, for instance <code>acli --action getWorkflowList</code>. <strong>That syntax belongs to the previous generation of the tool and does not work with the current one.</strong></p>
<p>And for configuration cleanup specifically, the gaps are decisive:</p>
<ul>
<li class=""><strong>There is no <code>acli jira workflow</code> command.</strong> Workflows, workflow schemes, statuses and transitions are not covered by the CLI.</li>
<li class=""><strong><code>acli jira field</code> handles field definitions only</strong> — create, update, delete, cancel-delete. There is no <code>list</code> subcommand, so it cannot enumerate your custom fields for you either.</li>
</ul>
<p>One practical warning if you script around it: check that a subcommand actually exists before relying on it. Run <code>acli jira --help</code> and read the output rather than trusting that a command ran without complaint.</p>
<div class="theme-admonition theme-admonition-caution admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>caution</div><div class="admonitionContent_BuS1"><p>If you specifically need to enumerate unused workflows from the command line, the REST API is the more reliable path. Do not assume the CLI covers it.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="option-3-the-per-scheme-optimizer-all-plans">Option 3: the per-scheme optimizer (all plans)<a href="https://ngpilot.com/blog/find-unused-workflows-schemes-jira#option-3-the-per-scheme-optimizer-all-plans" class="hash-link" aria-label="Direct link to Option 3: the per-scheme optimizer (all plans)" title="Direct link to Option 3: the per-scheme optimizer (all plans)" translate="no">​</a></h2>
<p>This is the option most people miss, and it changes the picture for lower tiers. <a href="https://support.atlassian.com/jira-cloud-administration/docs/optimize-fields-in-your-project/" target="_blank" rel="noopener noreferrer" class="">Optimize field configuration schemes</a> is documented as available on <strong>Free, Standard, Premium and Enterprise</strong>:</p>
<p><strong>Settings → Work items → Field configuration schemes → Optimize scheme</strong></p>
<p>It scopes the analysis to one scheme rather than the whole site, and gives Atlassian's explicit definition of an unused field. The tool reports which fields can be reduced; you can then remove them from the scheme, create an optimized variant for a selected space without changing the original, or delete a scheme that is no longer associated to any spaces.</p>
<p>Atlassian defines unused as <strong>all</strong> of these being true:</p>
<ol>
<li class="">Haven't been used on a work item in the last two years</li>
<li class="">Aren't associated to a screen or scheme</li>
<li class=""><strong>Were made by a Jira administrator</strong> — not created or used by Jira, a plugin, or a Connect or Forge app</li>
<li class="">Aren't used in workflows</li>
<li class="">Aren't used in Forms</li>
</ol>
<p>The third condition is the counter-intuitive one: the field must have been made by a human admin. It excludes system fields created by Jira itself or by an app, which are not yours to delete.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="option-4-manual-checks">Option 4: manual checks<a href="https://ngpilot.com/blog/find-unused-workflows-schemes-jira#option-4-manual-checks" class="hash-link" aria-label="Direct link to Option 4: manual checks" title="Direct link to Option 4: manual checks" translate="no">​</a></h2>
<p>When none of the above fits, these need no tooling at all:</p>
<p><strong>Workflows.</strong> Go to <strong>Settings → System → Workflows</strong>. Look for workflows whose only associated scheme belongs to a project that no longer exists. Atlassian's own <a href="https://confluence.atlassian.com/clean/advanced-cleanup-1018789335.html" target="_blank" rel="noopener noreferrer" class="">advanced cleanup guidance</a> recommends verifying that no validator or post-function on a workflow depends on a custom field before deleting it.</p>
<p><strong>Fields.</strong> <strong>Settings → Work items → Fields</strong> lists every custom field. The ones worth auditing are those nobody can name a use case for — cross-check each against whether it appears on a screen, in a workflow, or has a value on any work item.</p>
<p><strong>Screens and screen schemes.</strong> These accumulate silently, and Atlassian's cleanup guidance calls out screens with no scheme, no workflow and no populated tab as candidates for removal.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-rule-that-catches-people-archived-is-not-gone">The rule that catches people: archived is not gone<a href="https://ngpilot.com/blog/find-unused-workflows-schemes-jira#the-rule-that-catches-people-archived-is-not-gone" class="hash-link" aria-label="Direct link to The rule that catches people: archived is not gone" title="Direct link to The rule that catches people: archived is not gone" translate="no">​</a></h2>
<p>An archived project still references its schemes. A workflow whose only scheme is attached to an archived project still has a live referrer, and deleting the workflow will break transitions on anything you restore later.</p>
<p>This is why "no scheme references it" is necessary but not sufficient. Before deleting, check whether the scheme is attached to an <strong>archived</strong> project, and if so whether that project is genuinely finished or merely dormant.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="remove-in-this-order">Remove in this order<a href="https://ngpilot.com/blog/find-unused-workflows-schemes-jira#remove-in-this-order" class="hash-link" aria-label="Direct link to Remove in this order" title="Direct link to Remove in this order" translate="no">​</a></h2>
<p>Atlassian's guidance on custom fields is a ladder, and the order matters because the rungs are not equally reversible:</p>
<ol>
<li class=""><strong>Remove from the screen.</strong> It stops appearing on create, view and edit. Values on existing work items are untouched. Fully reversible.</li>
<li class=""><strong>Remove from the scheme.</strong> Narrower, still reversible.</li>
<li class=""><strong>Remove from the instance.</strong> Only now consider it. This is where data becomes hard to recover, and Atlassian explicitly warns against treating a database query as proof — confirm in the UI that the field has no data before you get here.</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sources">Sources<a href="https://ngpilot.com/blog/find-unused-workflows-schemes-jira#sources" class="hash-link" aria-label="Direct link to Sources" title="Direct link to Sources" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://support.atlassian.com/jira-cloud-administration/docs/what-is-the-site-optimizer/" target="_blank" rel="noopener noreferrer" class="">What is the Site optimizer? — Atlassian Support</a> — plan requirement, scope</li>
<li class=""><a href="https://support.atlassian.com/jira-cloud-administration/docs/optimize-your-custom-fields/" target="_blank" rel="noopener noreferrer" class="">Optimize fields per space — Atlassian Support</a> — Fields per space review, last-used date, move to trash</li>
<li class=""><a href="https://support.atlassian.com/jira-cloud-administration/docs/optimize-fields-in-your-project/" target="_blank" rel="noopener noreferrer" class="">Optimize field configuration schemes — Atlassian Support</a> — all-plans availability and the five "unused" conditions</li>
<li class=""><a href="https://developer.atlassian.com/cloud/acli/guides/install-acli/" target="_blank" rel="noopener noreferrer" class="">Install Atlassian CLI — Atlassian Developers</a> — current command structure</li>
<li class=""><a href="https://developer.atlassian.com/cloud/acli/guides/download-supported-packages/" target="_blank" rel="noopener noreferrer" class="">Download supported ACLI packages — Atlassian Developers</a></li>
<li class=""><a href="https://confluence.atlassian.com/clean/advanced-cleanup-1018789335.html" target="_blank" rel="noopener noreferrer" class="">Advanced cleanup — Atlassian Documentation</a> — workflow and screen guidance</li>
</ul><div class="margin-top--xl padding-top--lg"><h2 class="anchor anchorWithStickyNavbar_LWe7">Related guides</h2><ul><li><a href="https://ngpilot.com/blog/create-jira-issues-from-templates">Create Jira Issues from Confluence Templates</a></li><li><a href="https://ngpilot.com/blog/find-stale-pages-confluence">How to Find Stale Pages in Confluence</a></li><li><a href="https://ngpilot.com/blog/broken-links-after-confluence-cloud-migration">Broken Links After a Confluence Cloud Migration</a></li></ul></div><div style="display:flex;flex-wrap:wrap;gap:0.75rem;justify-content:center;margin-top:2.5rem;margin-bottom:1rem;padding-top:1.5rem;border-top:1px solid var(--ifm-color-emphasis-200)"><span style="font-size:0.875rem;font-weight:600;color:var(--ifm-color-emphasis-500);align-self:center;width:100%;text-align:center;margin-bottom:0.25rem">Explore NGPILOT</span><a class="button button--secondary button--sm" href="https://ngpilot.com/solutions">Browse Solutions</a><a class="button button--secondary button--sm" href="https://ngpilot.com/apps">All Apps</a><a class="button button--secondary button--sm" href="https://ngpilot.com/blog/archive">All Posts</a><a href="https://marketplace.atlassian.com/vendors/1226848/?utm_source=ngpilot.com&amp;utm_medium=blog&amp;utm_campaign=hub-links" class="button button--secondary button--sm" target="_blank" rel="noopener noreferrer">Atlassian Marketplace →</a></div>]]></content>
        <author>
            <name>NGPilot</name>
            <uri>https://ngpilot.com</uri>
        </author>
        <category label="jira" term="jira"/>
        <category label="jira-admin" term="jira-admin"/>
        <category label="configuration" term="configuration"/>
        <category label="cleanup" term="cleanup"/>
        <category label="how-to" term="how-to"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Excalidraw AI Agent for Confluence (Chat Whiteboard)]]></title>
        <id>https://ngpilot.com/blog/excalidraw-ai-agent-confluence</id>
        <link href="https://ngpilot.com/blog/excalidraw-ai-agent-confluence"/>
        <updated>2026-10-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[AI whiteboard agent for Confluence: draw diagrams from a prompt, edit shapes in plain language, and convert Mermaid and PlantUML. Free for up to 10 users.]]></summary>
        <content type="html"><![CDATA[<p>Confluence holds your team's diagrams in two worlds, and the two don't talk to each other.</p>
<p>Text-defined diagrams — Mermaid and friends — are what AI speaks natively. They're source code, so a chat agent can read them, write them, and revise them. We shipped exactly that last week: <a class="" href="https://ngpilot.com/blog/mermaid-ai-agent-confluence">an AI agent for Mermaid in Confluence</a>.</p>
<p>Whiteboards are the other world. Freeform shapes, hand-drawn lines, arrows you drag where they need to go — the format that's actually intuitive to put in front of people. Every team has one: the architecture board on the team page, the incident flow everyone references, the onboarding map. And AI couldn't touch any of it. Ask a chat agent for a change to a whiteboard and you'd get a text <em>description</em> of a change, and someone still had to open the canvas and do it by hand.</p>
<p>That gap is why whiteboards go stale. Editing shapes one drag at a time is slow enough that nobody does it, and AI — the thing that was supposed to make maintenance cheap — had no way in.</p>
<p>The AI agent in <a href="https://marketplace.atlassian.com/apps/1237651/excalidraw-plus-whiteboards-for-confluence" target="_blank" rel="noopener noreferrer" class="">Excalidraw Plus Whiteboards &amp; AI Agent for Confluence</a> closes the gap: the whiteboard stays what it always was — visual, intuitive, for people — but now you can operate it in plain language, from Confluence chat.</p>
<p><strong>Quick answer:</strong> Open Confluence chat on any page and describe the board — "make an architecture diagram of our checkout system" draws it as an Excalidraw whiteboard right on the page. Follow-ups edit the existing shapes in place ("rename Service A to Auth Service"), the agent can search a whole space for boards, and it converts Mermaid and PlantUML into editable Excalidraw whiteboards — and back.</p>
<p><img decoding="async" loading="lazy" alt="The Excalidraw Plus agent open in Confluence chat beside a live whiteboard — starters for converting a Mermaid diagram, creating a flowchart, and finding diagrams in the space" src="https://ngpilot.com/assets/images/excalidraw-ai-agent-chat-8980a8da88243b4bc5a01d14b753afee.png" width="1840" height="900" class="img_ev3q"></p>
<p><em>The agent lives in Confluence chat, next to the board it operates on.</em></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-the-agent-can-do">What the agent can do<a href="https://ngpilot.com/blog/excalidraw-ai-agent-confluence#what-the-agent-can-do" class="hash-link" aria-label="Direct link to What the agent can do" title="Direct link to What the agent can do" translate="no">​</a></h2>
<table><thead><tr><th>Verb</th><th>What you say</th><th>What happens</th></tr></thead><tbody><tr><td><strong>Create</strong></td><td>"Draw the deployment flow on this page"</td><td>An Excalidraw whiteboard is added to the page — from a template (flowchart, sequence, architecture, mindmap, kanban, wireframe) or from your own element list</td></tr><tr><td><strong>Read</strong></td><td>"What's in the architecture board on this page?"</td><td>The agent summarizes the board's contents in chat — every board on the page, by name</td></tr><tr><td><strong>Edit</strong></td><td>"Rename Service A to Auth Service"</td><td>The named shapes change; everything else stays exactly where it was</td></tr><tr><td><strong>Style &amp; lay out</strong></td><td>"Group the AWS boxes and make them green" / "lay this out top to bottom"</td><td>Colors, fonts, roughness, grouping, and auto-layout applied to the existing board</td></tr><tr><td><strong>Search</strong></td><td>"Which pages in this space have diagrams?"</td><td>A list of pages with Excalidraw boards in the space</td></tr><tr><td><strong>Convert</strong></td><td>"Turn this Mermaid code block into a whiteboard"</td><td>Mermaid or PlantUML becomes editable Excalidraw shapes — or an Excalidraw board becomes Mermaid text</td></tr></tbody></table>
<p>The <strong>edit</strong> verb is the one that changes how whiteboards live. Until now, a board was a snapshot: right the day someone drew it, wronger every sprint after. When the agent can rename, move, group, and restyle individual shapes on command, "update the board" becomes a sentence instead of an afternoon.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-bridge-runs-both-ways">The bridge runs both ways<a href="https://ngpilot.com/blog/excalidraw-ai-agent-confluence#the-bridge-runs-both-ways" class="hash-link" aria-label="Direct link to The bridge runs both ways" title="Direct link to The bridge runs both ways" translate="no">​</a></h2>
<p>The convert verb deserves its own note, because it's the literal bridge between the two worlds.</p>
<p>Text diagrams are easy for AI to write and awkward for people to read — raw Mermaid syntax is not what you put on a screen in a design review. Whiteboards are the opposite: great for people, opaque to machines. The agent moves work across that line in whichever direction the moment needs:</p>
<ul>
<li class=""><strong>Mermaid → Excalidraw.</strong> That flowchart definition sitting in a code block on your page becomes real shapes you can drag, restyle, and extend — and then keep maintaining by chat.</li>
<li class=""><strong>PlantUML → Excalidraw.</strong> Same deal for the older PlantUML diagrams many teams have lying around.</li>
<li class=""><strong>Excalidraw → Mermaid.</strong> And when a board needs to live as text — to diff in a PR, to version with the code it documents — the agent converts it back out.</li>
</ul>
<p>Converted boards are real elements on the canvas, not screenshots. Everything the agent can do afterwards — edit, style, layout — applies to them the same as to anything drawn by hand.</p>
<p>If you read the <a class="" href="https://ngpilot.com/blog/mermaid-ai-agent-confluence">Mermaid agent post</a>: that agent lives on the text side and turns text into rendered diagrams. This one lives on the canvas side and turns text into <em>editable drawings</em>. Same chat, two destinations — pick by audience, not by tool.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-working-session">A working session<a href="https://ngpilot.com/blog/excalidraw-ai-agent-confluence#a-working-session" class="hash-link" aria-label="Direct link to A working session" title="Direct link to A working session" translate="no">​</a></h2>
<p>The scenario this was built for: the architecture board on your team page, three sprints out of date.</p>
<ol>
<li class=""><strong>Open Confluence chat on that page</strong> and start where the board is wrong: <em>"Rename Service A to Auth Service, and add a caching layer between it and the database."</em></li>
<li class=""><strong>Keep going in the same breath:</strong> <em>"Group the three AWS boxes into one container, and make the whole group green."</em></li>
<li class=""><strong>Tidy up:</strong> <em>"Lay this out top to bottom."</em> The agent rearranges the board into a clean top-down flow — you're not dragging eleven boxes into alignment yourself.</li>
<li class=""><strong>Then answer the question you actually get asked:</strong> <em>"Which other pages in this space have architecture diagrams?"</em> — because there are always four more, equally stale.</li>
<li class=""><strong>Hand off when it matters:</strong> the board is a normal Excalidraw macro. Anyone can click it and adjust by hand; the agent checks the latest saved version before each write, so its edits don't overwrite what a teammate changed an hour ago.</li>
</ol>
<p>A detail that matters on real pages: one page can hold several boards, and the agent keeps track of which is which. <em>"Update the deployment flow, not the network map"</em> works.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="where-you-take-over">Where you take over<a href="https://ngpilot.com/blog/excalidraw-ai-agent-confluence#where-you-take-over" class="hash-link" aria-label="Direct link to Where you take over" title="Direct link to Where you take over" translate="no">​</a></h2>
<p>The agent is honest about its limits, and so are we:</p>
<ul>
<li class=""><strong>Layout is deliberate, not freeform.</strong> Auto-layout today means top-to-bottom flow or a grid. Ask for a radial tree and the agent will tell you those are the two it does — then you arrange the rest by hand, once, and the board stays put.</li>
<li class=""><strong>Chat shows no pictures.</strong> The agent works on the board's data, so it replies with what changed and a link to the page — you look at the result where everyone else will.</li>
<li class=""><strong>Deletion has a seatbelt.</strong> Ask it to remove one of five similar boxes and it checks with you first, rather than guessing which one you meant.</li>
<li class=""><strong>Anything sacred stays hand-drawn.</strong> For boards that are compliance artifacts or just carefully art-directed, edit on the canvas as always — nothing the agent does is locked in, and nothing you hand-tune gets quietly redrawn.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="not-an-agent-only-app">Not an agent-only app<a href="https://ngpilot.com/blog/excalidraw-ai-agent-confluence#not-an-agent-only-app" class="hash-link" aria-label="Direct link to Not an agent-only app" title="Direct link to Not an agent-only app" translate="no">​</a></h2>
<p>The chat is one of two ways in, and the classic editor is unchanged — type <code>/excalidraw</code> and you get the full whiteboard: freehand drawing, <strong>220+ built-in shape libraries</strong>, templates from flowcharts to wireframes, and <strong>built-in Mermaid</strong> rendering in the same app. Manual first, agent when you want speed. Both write the same kind of macro, so a board that started in chat is indistinguishable from one drawn by hand.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="prompts-to-try-on-your-first-day">Prompts to try on your first day<a href="https://ngpilot.com/blog/excalidraw-ai-agent-confluence#prompts-to-try-on-your-first-day" class="hash-link" aria-label="Direct link to Prompts to try on your first day" title="Direct link to Prompts to try on your first day" translate="no">​</a></h2>
<ul>
<li class=""><em>"Draw an architecture diagram of our checkout system — web, API, payments, inventory."</em></li>
<li class=""><em>"Rename Service A to Auth Service and move it next to the API gateway."</em></li>
<li class=""><em>"Group the three AWS boxes and make them green."</em></li>
<li class=""><em>"Which pages in this space have Excalidraw diagrams?"</em></li>
<li class=""><em>"Convert the Mermaid flowchart in this page's code block into an editable whiteboard."</em></li>
<li class=""><em>"Lay this board out top to bottom."</em></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="related-resources">Related resources<a href="https://ngpilot.com/blog/excalidraw-ai-agent-confluence#related-resources" class="hash-link" aria-label="Direct link to Related resources" title="Direct link to Related resources" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://ngpilot.com/docs/Excalidraw-plus-for-Confluence/usage">Excalidraw Plus Whiteboards for Confluence</a> — full feature guide and documentation</li>
<li class=""><a class="" href="https://ngpilot.com/blog/mermaid-ai-agent-confluence">Mermaid AI Agent for Confluence</a> — the text-side twin: create, read, update, and convert Mermaid by chat</li>
<li class=""><a class="" href="https://ngpilot.com/blog/mermaid-vs-drawio-confluence">draw.io vs Mermaid in Confluence</a> — when the source text stays the diagram, and when shapes win</li>
<li class=""><a class="" href="https://ngpilot.com/blog/confluence-diagram-tools-comparison">Best diagram tool for Confluence</a> — Mermaid vs Excalidraw vs Graphviz</li>
</ul>
<p><strong>Ready to try it?</strong> <a href="https://marketplace.atlassian.com/apps/1237651/excalidraw-plus-whiteboards-for-confluence" target="_blank" rel="noopener noreferrer" class="">Install Excalidraw Plus Whiteboards &amp; AI Agent for Confluence →</a> — free for up to 10 users.</p><div class="margin-top--lg margin-bottom--lg" style="padding:1.25rem 1.5rem;border-left:4px solid var(--ifm-color-primary);background-color:var(--ifm-color-emphasis-100);border-radius:var(--ifm-global-radius)"><p style="margin-bottom:0.5rem;font-weight:600">Try <!-- -->Excalidraw Diagrams plus Whiteboards for Jira</p><p style="margin-bottom:0.75rem;font-size:0.95rem">Add a freehand drawing canvas to every Jira issue, with 229 shape libraries — free for up to 10 users.</p><a href="https://marketplace.atlassian.com/apps/2139233994/excalidraw-diagrams-plus-whiteboards-for-jira?utm_source=ngpilot.com&amp;utm_medium=website&amp;utm_campaign=excalidraw-diagrams-plus-whiteboards-for-jira" target="_blank" rel="noopener noreferrer" class="button button--primary button--sm">Get it on the Atlassian Marketplace</a></div><div class="margin-top--xl padding-top--lg"><h2 class="anchor anchorWithStickyNavbar_LWe7">Related guides</h2><ul><li><a href="https://ngpilot.com/blog/how-to-create-mermaid-diagrams-jira">How to Create Mermaid Diagrams in Jira</a></li><li><a href="https://ngpilot.com/blog/export-jira-issues-to-excel">Export Jira Issues to Excel or CSV</a></li><li><a href="https://ngpilot.com/blog/bulk-download-jira-attachments">Bulk Download Jira Attachments</a></li><li><a href="https://ngpilot.com/blog/how-to-migrate-confluence-content">How to Migrate Confluence Content</a></li><li><a href="https://ngpilot.com/blog/block-quote-confluence">How to Add a Block Quote in Confluence</a></li></ul></div><div style="display:flex;flex-wrap:wrap;gap:0.75rem;justify-content:center;margin-top:2.5rem;margin-bottom:1rem;padding-top:1.5rem;border-top:1px solid var(--ifm-color-emphasis-200)"><span style="font-size:0.875rem;font-weight:600;color:var(--ifm-color-emphasis-500);align-self:center;width:100%;text-align:center;margin-bottom:0.25rem">Explore NGPILOT</span><a class="button button--secondary button--sm" href="https://ngpilot.com/solutions">Browse Solutions</a><a class="button button--secondary button--sm" href="https://ngpilot.com/apps">All Apps</a><a class="button button--secondary button--sm" href="https://ngpilot.com/blog/archive">All Posts</a><a href="https://marketplace.atlassian.com/vendors/1226848/?utm_source=ngpilot.com&amp;utm_medium=blog&amp;utm_campaign=hub-links" class="button button--secondary button--sm" target="_blank" rel="noopener noreferrer">Atlassian Marketplace →</a></div>]]></content>
        <author>
            <name>NGPilot</name>
            <uri>https://ngpilot.com</uri>
        </author>
        <category label="confluence" term="confluence"/>
        <category label="excalidraw" term="excalidraw"/>
        <category label="whiteboard" term="whiteboard"/>
        <category label="diagrams" term="diagrams"/>
        <category label="ai" term="ai"/>
        <category label="agent" term="agent"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Mermaid AI Agent for Confluence: Draw in Chat]]></title>
        <id>https://ngpilot.com/blog/mermaid-ai-agent-confluence</id>
        <link href="https://ngpilot.com/blog/mermaid-ai-agent-confluence"/>
        <updated>2026-10-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[How the Mermaid Plus AI agent works in Confluence: create diagrams from a prompt, read back the source, update in place, convert code blocks.]]></summary>
        <content type="html"><![CDATA[<p>Confluence chat can write your page, summarize the thread, and answer questions about the space. What it couldn't do — until now — is draw. If you asked for "a flowchart of our deployment process," you got a text description of a flowchart, and someone still had to open an editor and build it.</p>
<p>The AI agent in <a href="https://marketplace.atlassian.com/apps/1236814/mermaid-plus-diagrams-ai-agent-for-confluence" target="_blank" rel="noopener noreferrer" class="">Mermaid Plus Diagrams &amp; AI Agent for Confluence</a> closes that gap: it creates, reads, updates, and converts Mermaid diagrams directly on Confluence pages and blog posts, from chat.</p>
<p><strong>Quick answer:</strong> Open Confluence chat on any page and describe the diagram — "make a sequence diagram of our login flow" renders a Mermaid diagram on the page. Follow-up prompts revise it in place, the agent can convert code blocks already on the page into rendered diagrams, and every diagram stays fully editable in the macro editor afterward.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-four-things-the-agent-can-do">The four things the agent can do<a href="https://ngpilot.com/blog/mermaid-ai-agent-confluence#the-four-things-the-agent-can-do" class="hash-link" aria-label="Direct link to The four things the agent can do" title="Direct link to The four things the agent can do" translate="no">​</a></h2>
<table><thead><tr><th>Verb</th><th>What you say</th><th>What happens</th></tr></thead><tbody><tr><td><strong>Create</strong></td><td>"Make a flowchart of our deployment process"</td><td>A Mermaid diagram renders on the page, from your description</td></tr><tr><td><strong>Read</strong></td><td>"What's in the architecture diagram on this page?"</td><td>The agent returns the diagram's source and version in chat</td></tr><tr><td><strong>Update</strong></td><td>"Make this better" / "add a failure path"</td><td>The existing diagram is revised in place — macro settings preserved</td></tr><tr><td><strong>Convert</strong></td><td>"Turn this code block into a diagram"</td><td>A Mermaid code block already on the page becomes a rendered diagram</td></tr></tbody></table>
<p>The <strong>convert</strong> verb is the quiet workhorse: plenty of pages already carry Mermaid source in a code block, pasted from a repo or a PR review. Until now those blocks were dead text on the page — the agent turns each one into a living diagram without anyone re-pasting it into a macro.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="walkthrough-from-prompt-to-published-diagram">Walkthrough: from prompt to published diagram<a href="https://ngpilot.com/blog/mermaid-ai-agent-confluence#walkthrough-from-prompt-to-published-diagram" class="hash-link" aria-label="Direct link to Walkthrough: from prompt to published diagram" title="Direct link to Walkthrough: from prompt to published diagram" translate="no">​</a></h2>
<ol>
<li class=""><strong>Install the app</strong> from the <a href="https://marketplace.atlassian.com/apps/1236814/mermaid-plus-diagrams-ai-agent-for-confluence" target="_blank" rel="noopener noreferrer" class="">Atlassian Marketplace</a> — free for up to 10 users.</li>
<li class=""><strong>Open Confluence chat</strong> on the page or blog post you're working on and describe what you need. Concrete prompts that work well:<!-- -->
<ul>
<li class=""><em>"Make a flowchart of our incident escalation path, from alert to postmortem."</em></li>
<li class=""><em>"Draw a sequence diagram of the checkout service calling payments and inventory."</em></li>
<li class=""><em>"Create an ER diagram for the orders and customers tables."</em></li>
</ul>
</li>
<li class=""><strong>Iterate in chat.</strong> Follow-ups like <em>"add a retry loop around the payment call"</em> or <em>"make this better"</em> update the diagram in place — you don't rebuild from scratch, and the macro's settings carry over.</li>
<li class=""><strong>Verify the render.</strong> The diagram lands on the page rendered, not as raw text — what you see in chat is what readers get.</li>
<li class=""><strong>Fine-tune by hand if needed.</strong> Click the diagram, select <strong>Edit</strong>, and the side-by-side editor opens: Mermaid source on one side, live preview on the other.</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="where-you-take-over-from-the-agent">Where you take over from the agent<a href="https://ngpilot.com/blog/mermaid-ai-agent-confluence#where-you-take-over-from-the-agent" class="hash-link" aria-label="Direct link to Where you take over from the agent" title="Direct link to Where you take over from the agent" translate="no">​</a></h2>
<p>The agent is fast at first drafts and mechanical conversions. You stay in charge of the parts that need judgment:</p>
<ul>
<li class=""><strong>Exact layout and styling.</strong> Themes, custom colors, and fonts are set in the macro editor — the same controls as before, unchanged.</li>
<li class=""><strong>Sensitive diagrams.</strong> For compliance or audit artifacts, review the source the same way you'd review any generated content. The source is plain Mermaid text, so the review is a diff, not a screenshot.</li>
<li class=""><strong>Anything highly specific.</strong> If the tenth revision still isn't right, editing the 5 lines of Mermaid directly is faster than describing the eleventh.</li>
</ul>
<p>That escape hatch is the point of the design: the agent and the editor share one source of truth. Nothing the agent produces is locked in, and nothing you hand-edit gets overwritten by chat later unless you ask for it.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="not-an-agent-only-app">Not an agent-only app<a href="https://ngpilot.com/blog/mermaid-ai-agent-confluence#not-an-agent-only-app" class="hash-link" aria-label="Direct link to Not an agent-only app" title="Direct link to Not an agent-only app" translate="no">​</a></h2>
<p>The chat is one of two ways in. The classic editor is still there — type <code>/mermaid</code> in the editor, and you get:</p>
<ul>
<li class=""><strong>All 30 Mermaid v12 diagram types</strong> — flowcharts, sequence, class, state, ER, Gantt, pie, C4, mindmaps, ZenUML, use case, and more</li>
<li class=""><strong>A one-click template for every type</strong>, so nobody starts from a blank canvas</li>
<li class=""><strong>Live preview</strong> as you type, so syntax errors surface before save</li>
<li class=""><strong>Dark mode</strong> that follows each reader's Confluence theme automatically</li>
<li class=""><strong>Re-editable diagrams</strong> — source and settings are fully preserved after saving</li>
</ul>
<p>Manual first, agent when you want speed. Both write the same kind of macro, so a diagram that started in chat is indistinguishable from one typed by hand.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="prompts-to-try-on-your-first-day">Prompts to try on your first day<a href="https://ngpilot.com/blog/mermaid-ai-agent-confluence#prompts-to-try-on-your-first-day" class="hash-link" aria-label="Direct link to Prompts to try on your first day" title="Direct link to Prompts to try on your first day" translate="no">​</a></h2>
<ul>
<li class=""><em>"Make a flowchart of our release checklist."</em></li>
<li class=""><em>"Turn the API example in this page's code block into a sequence diagram."</em></li>
<li class=""><em>"What does the current state diagram on this page say?"</em></li>
<li class=""><em>"Add a decision node after the build step — if tests fail, go back to dev."</em></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="related-resources">Related resources<a href="https://ngpilot.com/blog/mermaid-ai-agent-confluence#related-resources" class="hash-link" aria-label="Direct link to Related resources" title="Direct link to Related resources" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://ngpilot.com/apps/mermaid-plus-for-confluence">Mermaid Plus Diagrams &amp; AI Agent for Confluence</a> — full feature guide and documentation</li>
<li class=""><a class="" href="https://ngpilot.com/blog/excalidraw-ai-agent-confluence">Excalidraw AI Agent for Confluence</a> — the canvas-side twin: create, edit, search, and convert whiteboards by chat</li>
<li class=""><a class="" href="https://ngpilot.com/blog/create-mermaid-diagrams-confluence">How to create Mermaid diagrams in Confluence</a> — the step-by-step editor walkthrough</li>
<li class=""><a class="" href="https://ngpilot.com/blog/mermaid-vs-drawio-confluence">draw.io vs Mermaid in Confluence</a> — when the source text stays the diagram, and when shapes win</li>
<li class=""><a class="" href="https://ngpilot.com/blog/confluence-diagram-tools-comparison">Best diagram tool for Confluence</a> — Mermaid vs Excalidraw vs Graphviz</li>
<li class=""><a class="" href="https://ngpilot.com/blog/faq-mermaid-diagram-types-confluence">All 30 Mermaid diagram types</a> — complete reference</li>
</ul>
<p><strong>Ready to try it?</strong> <a href="https://marketplace.atlassian.com/apps/1236814/mermaid-plus-diagrams-ai-agent-for-confluence" target="_blank" rel="noopener noreferrer" class="">Install Mermaid Plus Diagrams &amp; AI Agent for Confluence →</a> — free for up to 10 users.</p><div class="margin-top--lg margin-bottom--lg" style="padding:1.25rem 1.5rem;border-left:4px solid var(--ifm-color-primary);background-color:var(--ifm-color-emphasis-100);border-radius:var(--ifm-global-radius)"><p style="margin-bottom:0.5rem;font-weight:600">Try <!-- -->Mermaid Plus Diagrams &amp; AI Agent for Confluence</p><p style="margin-bottom:0.75rem;font-size:0.95rem">All 30 Mermaid diagram types plus a Rovo AI agent, with live preview and one-click templates — free for up to 10 users.</p><a href="https://marketplace.atlassian.com/apps/1236814/mermaid-plus-diagrams-ai-agent-for-confluence?utm_source=ngpilot.com&amp;utm_medium=website&amp;utm_campaign=mermaid-plus-for-confluence" target="_blank" rel="noopener noreferrer" class="button button--primary button--sm">Get it on the Atlassian Marketplace</a></div><div class="margin-top--xl padding-top--lg"><h2 class="anchor anchorWithStickyNavbar_LWe7">Related guides</h2><ul><li><a href="https://ngpilot.com/blog/how-to-create-mermaid-diagrams-jira">How to Create Mermaid Diagrams in Jira</a></li><li><a href="https://ngpilot.com/blog/export-jira-issues-to-excel">Export Jira Issues to Excel or CSV</a></li><li><a href="https://ngpilot.com/blog/bulk-download-jira-attachments">Bulk Download Jira Attachments</a></li><li><a href="https://ngpilot.com/blog/how-to-migrate-confluence-content">How to Migrate Confluence Content</a></li><li><a href="https://ngpilot.com/blog/block-quote-confluence">How to Add a Block Quote in Confluence</a></li></ul></div><div style="display:flex;flex-wrap:wrap;gap:0.75rem;justify-content:center;margin-top:2.5rem;margin-bottom:1rem;padding-top:1.5rem;border-top:1px solid var(--ifm-color-emphasis-200)"><span style="font-size:0.875rem;font-weight:600;color:var(--ifm-color-emphasis-500);align-self:center;width:100%;text-align:center;margin-bottom:0.25rem">Explore NGPILOT</span><a class="button button--secondary button--sm" href="https://ngpilot.com/solutions">Browse Solutions</a><a class="button button--secondary button--sm" href="https://ngpilot.com/apps">All Apps</a><a class="button button--secondary button--sm" href="https://ngpilot.com/blog/archive">All Posts</a><a href="https://marketplace.atlassian.com/vendors/1226848/?utm_source=ngpilot.com&amp;utm_medium=blog&amp;utm_campaign=hub-links" class="button button--secondary button--sm" target="_blank" rel="noopener noreferrer">Atlassian Marketplace →</a></div>]]></content>
        <author>
            <name>NGPilot</name>
            <uri>https://ngpilot.com</uri>
        </author>
        <category label="confluence" term="confluence"/>
        <category label="mermaid" term="mermaid"/>
        <category label="diagrams" term="diagrams"/>
        <category label="ai" term="ai"/>
        <category label="how-to" term="how-to"/>
        <category label="agent" term="agent"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Confluence Pagination: Pages & Tables (3 Methods)]]></title>
        <id>https://ngpilot.com/blog/confluence-pagination</id>
        <link href="https://ngpilot.com/blog/confluence-pagination"/>
        <updated>2026-10-04T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Confluence has no built-in pagination for pages or tables. Split long content into a page series with Prev/Next buttons, chunk in-page, or restructure tables.]]></summary>
        <content type="html"><![CDATA[<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>Quick Answer</div><div class="admonitionContent_BuS1"><p>Confluence Cloud has no built-in pagination — pages render as one long scroll and tables render every row. The three working approaches: <strong>split long content into a page series</strong> and connect the parts with Previous/Next buttons (<a href="https://marketplace.atlassian.com/apps/1237371/pagination-buttons-for-confluence/" target="_blank" rel="noopener noreferrer" class="">Pagination Buttons for Confluence</a>), <strong>chunk in-page</strong> with tabs or expand sections, or <strong>restructure</strong> so the long table becomes linked category pages. What Confluence does paginate natively is search results and API responses — not your content.</p></div></div>
<p>A 4,000-word runbook. A 300-row release checklist. A training doc with five chapters. Sooner or later every Confluence space hits the wall: the page that takes forever to scroll, buries the section the reader needs, and times out in the editor when someone tries to reorganize it. Pagination is the standard fix everywhere else on the web — and Confluence doesn't have it, a gap the community has flagged since 2018. Here's what actually works instead.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>What you'll learn</div><div class="admonitionContent_BuS1"><ol>
<li class="">What Confluence paginates natively (search, API) and what it doesn't (pages, tables)</li>
<li class="">Method 1 — split into a page series with Prev/Next buttons</li>
<li class="">Method 2 — chunk in-page with tabs and expand sections</li>
<li class="">Method 3 — restructure long tables instead of paginating them</li>
</ol></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-confluence-paginates-natively-and-what-it-doesnt">What Confluence paginates natively (and what it doesn't)<a href="https://ngpilot.com/blog/confluence-pagination#what-confluence-paginates-natively-and-what-it-doesnt" class="hash-link" aria-label="Direct link to What Confluence paginates natively (and what it doesn't)" title="Direct link to What Confluence paginates natively (and what it doesn't)" translate="no">​</a></h2>
<table><thead><tr><th>Content type</th><th>Paginated natively?</th><th>What you get instead</th></tr></thead><tbody><tr><td>Search results</td><td>yes</td><td>paged result list</td></tr><tr><td>REST API responses</td><td>yes</td><td><code>limit</code> + cursor paging</td></tr><tr><td>A published page</td><td><strong>no</strong></td><td>one long scroll</td></tr><tr><td>Tables</td><td><strong>no</strong></td><td>all rows render; sorting and filtering only</td></tr><tr><td>Blog posts macro</td><td>partially</td><td>shows the most recent N posts</td></tr></tbody></table>
<p>The rest of this post is about the two <strong>no</strong> rows.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="method-1-page-series-with-previousnext-buttons-best-for-guides-and-runbooks">Method 1: page series with Previous/Next buttons (best for guides and runbooks)<a href="https://ngpilot.com/blog/confluence-pagination#method-1-page-series-with-previousnext-buttons-best-for-guides-and-runbooks" class="hash-link" aria-label="Direct link to Method 1: page series with Previous/Next buttons (best for guides and runbooks)" title="Direct link to Method 1: page series with Previous/Next buttons (best for guides and runbooks)" translate="no">​</a></h2>
<p>The document-style fix: each chapter becomes its own page, and readers page through with ‹ Prev | Next › controls at the bottom — the same pattern as this article series or a book.</p>
<ol>
<li class=""><strong>Split at natural boundaries.</strong> Break the long page into chapters. Create child pages under the parent (page tree → move), so the series stays organized and each part gets its own URL and search entry.</li>
<li class=""><strong>Leave a hub on the parent page.</strong> A short intro plus a table of contents linking every part. Anyone landing on the old URL still finds the whole series.</li>
<li class=""><strong>Add <a href="https://marketplace.atlassian.com/apps/1237371/pagination-buttons-for-confluence/" target="_blank" rel="noopener noreferrer" class="">Pagination Buttons for Confluence</a></strong> — type <code>/pagination</code>, then paste the previous and next page URLs in the macro config. Button style is symbol or text; layout options include center and space-between so the pair sits at the edges of the content, the way readers expect.</li>
<li class=""><strong>Repeat per page.</strong> First page gets only a Next URL; last page only a Previous.</li>
</ol>
<p>Why this beats one long page: each part loads fast, gets its own search result, and comments stay scoped to the section they're about. The cost is maintenance — inserting a chapter means re-numbering and re-wiring the buttons around it. Series that change weekly are better off as Method 2.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="method-2-in-page-chunking-with-tabs-and-expand-best-for-content-that-stays-one-page">Method 2: in-page chunking with tabs and expand (best for content that stays one page)<a href="https://ngpilot.com/blog/confluence-pagination#method-2-in-page-chunking-with-tabs-and-expand-best-for-content-that-stays-one-page" class="hash-link" aria-label="Direct link to Method 2: in-page chunking with tabs and expand (best for content that stays one page)" title="Direct link to Method 2: in-page chunking with tabs and expand (best for content that stays one page)" translate="no">​</a></h2>
<p>When the content belongs together — reference material, an FAQ, a spec — keep one page and hide the bulk behind interaction:</p>
<ul>
<li class=""><strong>Tabs</strong> separate modes or audiences: a Setup / Usage / Troubleshooting split reads as three short pages. Details and comparisons in <a class="" href="https://ngpilot.com/blog/confluence-tabs-macro">Tabs in Confluence</a>.</li>
<li class=""><strong>Expand sections</strong> hide long sub-blocks behind a one-line title — the pattern Atlassian's own docs use. Details in <a class="" href="https://ngpilot.com/blog/confluence-expand-macro">Expand macro for Confluence</a>.</li>
</ul>
<p>Both are native-capable (expand is built in; tabs come from a template or a macro). The limit: they paginate <em>attention</em>, not <em>rendering</em> — everything is still on the page and in the export. For a 300-row table no amount of collapsing helps; that's Method 3.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="method-3-long-tables--restructure-instead-of-paginate">Method 3: long tables — restructure instead of paginate<a href="https://ngpilot.com/blog/confluence-pagination#method-3-long-tables--restructure-instead-of-paginate" class="hash-link" aria-label="Direct link to Method 3: long tables — restructure instead of paginate" title="Direct link to Method 3: long tables — restructure instead of paginate" translate="no">​</a></h2>
<p>There is no way to paginate a native Confluence table today. The working patterns:</p>
<table><thead><tr><th>Pattern</th><th>How</th><th>Good fit</th></tr></thead><tbody><tr><td>Split by category</td><td>one child page per category, parent links them</td><td>reference tables (people, endpoints, flags)</td></tr><tr><td>Summarize on top</td><td>10-row "current status" table up top, full archive table below (or in a collapsed expand)</td><td>trackers, checklists</td></tr><tr><td>Page series</td><td>Method 1, one table-part per page</td><td>archives that grow append-only</td></tr><tr><td>Sort + filter</td><td>native table sorting/filtering</td><td>finding a row, not reducing the page</td></tr></tbody></table>
<p>The summarize-on-top pattern is the highest-value one: readers who need "where are we now" get a fast answer, and the archive stays in place for the few who need it.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-about-the-rest-api">What about the REST API?<a href="https://ngpilot.com/blog/confluence-pagination#what-about-the-rest-api" class="hash-link" aria-label="Direct link to What about the REST API?" title="Direct link to What about the REST API?" translate="no">​</a></h2>
<p>If you landed here writing an integration: Confluence's API paginates with a <code>limit</code> parameter and cursor-based <code>_links.next</code> URLs — see <a href="https://developer.atlassian.com/cloud/confluence/rest/intro/" target="_blank" rel="noopener noreferrer" class="">Atlassian's REST API pagination docs</a>. That governs API responses only; it doesn't change what readers see on a page.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="related-guides">Related guides<a href="https://ngpilot.com/blog/confluence-pagination#related-guides" class="hash-link" aria-label="Direct link to Related guides" title="Direct link to Related guides" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://ngpilot.com/blog/confluence-tabs-macro">Tabs in Confluence</a> — native layout tabs vs tab macros</li>
<li class=""><a class="" href="https://ngpilot.com/blog/confluence-expand-macro">Expand macro for Confluence</a> — collapsible sections, native vs styled</li>
<li class=""><a class="" href="https://ngpilot.com/blog/block-quote-confluence">How to add a block quote in Confluence</a> — formatting long-form content</li>
<li class=""><a class="" href="https://ngpilot.com/apps/pagination-buttons-for-confluence">Pagination Buttons for Confluence</a> — the Prev/Next macro used in Method 1</li>
</ul><div class="margin-top--xl padding-top--lg"><h2 class="anchor anchorWithStickyNavbar_LWe7">Related guides</h2><ul><li><a href="https://ngpilot.com/blog/how-to-create-mermaid-diagrams-jira">How to Create Mermaid Diagrams in Jira</a></li><li><a href="https://ngpilot.com/blog/export-jira-issues-to-excel">Export Jira Issues to Excel or CSV</a></li><li><a href="https://ngpilot.com/blog/bulk-download-jira-attachments">Bulk Download Jira Attachments</a></li><li><a href="https://ngpilot.com/blog/how-to-migrate-confluence-content">How to Migrate Confluence Content</a></li><li><a href="https://ngpilot.com/blog/block-quote-confluence">How to Add a Block Quote in Confluence</a></li></ul></div><div style="display:flex;flex-wrap:wrap;gap:0.75rem;justify-content:center;margin-top:2.5rem;margin-bottom:1rem;padding-top:1.5rem;border-top:1px solid var(--ifm-color-emphasis-200)"><span style="font-size:0.875rem;font-weight:600;color:var(--ifm-color-emphasis-500);align-self:center;width:100%;text-align:center;margin-bottom:0.25rem">Explore NGPILOT</span><a class="button button--secondary button--sm" href="https://ngpilot.com/solutions">Browse Solutions</a><a class="button button--secondary button--sm" href="https://ngpilot.com/apps">All Apps</a><a class="button button--secondary button--sm" href="https://ngpilot.com/blog/archive">All Posts</a><a href="https://marketplace.atlassian.com/vendors/1226848/?utm_source=ngpilot.com&amp;utm_medium=blog&amp;utm_campaign=hub-links" class="button button--secondary button--sm" target="_blank" rel="noopener noreferrer">Atlassian Marketplace →</a></div>]]></content>
        <author>
            <name>NGPilot</name>
            <uri>https://ngpilot.com</uri>
        </author>
        <category label="confluence" term="confluence"/>
        <category label="pagination" term="pagination"/>
        <category label="macros" term="macros"/>
        <category label="formatting" term="formatting"/>
        <category label="page-structure" term="page-structure"/>
        <category label="how-to" term="how-to"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Inline Code & Monospace in Confluence (Shortcuts)]]></title>
        <id>https://ngpilot.com/blog/confluence-monospace</id>
        <link href="https://ngpilot.com/blog/confluence-monospace"/>
        <updated>2026-10-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Format inline code in Confluence with the code shortcut (Ctrl+Shift+M), backtick autoformatting, or Markdown syntax in Enhanced Markdown. Inline vs code block.]]></summary>
        <content type="html"><![CDATA[<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>Quick Answer</div><div class="admonitionContent_BuS1"><p>Select the text and press <strong>Ctrl+Shift+M</strong> (Windows) or <strong>Opt+Shift+M</strong> (Mac) to apply inline code, or type <code>`backticks`</code> around text as you write — the Confluence Cloud editor autoformats them. Pasted Markdown keeps its backticks as literal characters, so paste into <a href="https://marketplace.atlassian.com/apps/1237026/enhanced-markdown-for-confluence/" target="_blank" rel="noopener noreferrer" class="">Enhanced Markdown for Confluence</a> instead, which renders inline code, code blocks, and diagrams from your Markdown source.</p></div></div>
<p>Inline code — monospace text on a subtle background — is how you mark up variable names, file paths, key names, and short commands inside a sentence: set <code>MAX_RETRIES = 3</code>, edit <code>~/.zshrc</code>, or run <code>kubectl get pods</code>. Confluence Cloud has three ways to produce it, and each fits a different moment: formatting as you go, typing Markdown, or bringing Markdown in from your repo.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>What you'll learn</div><div class="admonitionContent_BuS1"><ol>
<li class="">The keyboard shortcut — Ctrl+Shift+M, and the Mac split between Opt+Shift+M and Cmd+Shift+M</li>
<li class="">Backtick autoformatting while you type</li>
<li class="">The Markdown method for pasted content (Enhanced Markdown)</li>
<li class="">Inline code vs code block — which one to use where</li>
</ol></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="method-1-the-keyboard-shortcut-standard-editor">Method 1: the keyboard shortcut (standard editor)<a href="https://ngpilot.com/blog/confluence-monospace#method-1-the-keyboard-shortcut-standard-editor" class="hash-link" aria-label="Direct link to Method 1: the keyboard shortcut (standard editor)" title="Direct link to Method 1: the keyboard shortcut (standard editor)" translate="no">​</a></h2>
<ol>
<li class="">Select the text you want in monospace.</li>
<li class="">Press <strong>Ctrl+Shift+M</strong> (Windows/Linux) or <strong>Opt+Shift+M</strong> (Mac).</li>
</ol>
<p>The selection turns into inline code immediately — press the shortcut again to toggle it off. The same style is in the toolbar: select text, open the text formatting menu, and pick <strong>Code</strong>.</p>
<p>One Mac quirk worth knowing: Atlassian lists <strong>two</strong> code shortcuts. <strong>Opt+Shift+M</strong> applies <em>inline code</em> to a selection (text formatting), while <strong>Cmd+Shift+M</strong> creates a <em>code block</em> (block formatting). If you wanted a highlighted snippet and got a whole code section instead — or the reverse — that's the split you hit. On Windows both are Ctrl+Shift+M.</p>
<p>To see the full shortcut list on your site, press <strong>Ctrl+/</strong> (<strong>Cmd+/</strong> on Mac) while editing.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="method-2-backtick-autoformatting-while-you-type">Method 2: backtick autoformatting while you type<a href="https://ngpilot.com/blog/confluence-monospace#method-2-backtick-autoformatting-while-you-type" class="hash-link" aria-label="Direct link to Method 2: backtick autoformatting while you type" title="Direct link to Method 2: backtick autoformatting while you type" translate="no">​</a></h2>
<p>The Confluence Cloud editor parses a set of Markdown shortcuts as you type, and inline code is one of them: type a backtick, the text, and a closing backtick, and it converts to inline code on the closing tick — the same mechanic as <code>**bold**</code>, <code>*italic*</code>, and <code>~~strikethrough~~</code>.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">Type this:  `MAX_RETRIES`</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Get this:   MAX_RETRIES in inline code style</span><br></div></code></pre></div></div>
<p>This is the fastest method if your hands are already on the keyboard — no selection, no menu.</p>
<p>The catch: autoformatting only runs <strong>while typing</strong>. It is not a paste converter.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="method-3-pasted-markdown-enhanced-markdown">Method 3: pasted Markdown (Enhanced Markdown)<a href="https://ngpilot.com/blog/confluence-monospace#method-3-pasted-markdown-enhanced-markdown" class="hash-link" aria-label="Direct link to Method 3: pasted Markdown (Enhanced Markdown)" title="Direct link to Method 3: pasted Markdown (Enhanced Markdown)" translate="no">​</a></h2>
<p>If your content starts life as Markdown — a README, a runbook, an architecture doc with inline code, fenced code blocks, and diagrams — pasting it into the standard editor lands every backtick as a literal character. Retyping them works for one sentence, not for a 200-line document.</p>
<p><a href="https://marketplace.atlassian.com/apps/1237026/enhanced-markdown-for-confluence/" target="_blank" rel="noopener noreferrer" class="">Enhanced Markdown for Confluence</a> takes the paste directly: inline code, fenced code blocks with syntax highlighting, tables, math, and Mermaid diagrams all render from the pasted source, and the Markdown stays re-editable on the page — fix a variable name by editing the line, not by re-importing. The full syntax coverage is in the <a class="" href="https://ngpilot.com/docs/Enhanced-Markdown-for-Confluence/usage">user guide</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="inline-code-vs-code-block--which-one-where">Inline code vs code block — which one where<a href="https://ngpilot.com/blog/confluence-monospace#inline-code-vs-code-block--which-one-where" class="hash-link" aria-label="Direct link to Inline code vs code block — which one where" title="Direct link to Inline code vs code block — which one where" translate="no">​</a></h2>
<table><thead><tr><th></th><th>Inline code</th><th>Code block</th></tr></thead><tbody><tr><td>Shortcut</td><td>Ctrl+Shift+M / Opt+Shift+M</td><td>Cmd+Shift+M (Mac) / Ctrl+Shift+M (Win)</td></tr><tr><td>Markdown</td><td><code>`one tick`</code></td><td><code>```</code> fences</td></tr><tr><td>Use for</td><td>variables, paths, keys, one-line commands</td><td>multiline snippets, config files, scripts</td></tr><tr><td>Syntax highlighting</td><td>no</td><td>yes (190+ languages in <a class="" href="https://ngpilot.com/blog/markdown-code-block-confluence">Markdown apps</a>)</td></tr><tr><td>Line breaks</td><td>no — collapses with the sentence</td><td>preserved</td></tr></tbody></table>
<p>Rule of thumb: if it fits inside a sentence, inline code. If it needs its own lines, a code block.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="styling-limits-and-what-apps-add">Styling limits (and what apps add)<a href="https://ngpilot.com/blog/confluence-monospace#styling-limits-and-what-apps-add" class="hash-link" aria-label="Direct link to Styling limits (and what apps add)" title="Direct link to Styling limits (and what apps add)" translate="no">​</a></h2>
<p>Native inline code has exactly one style: monospace font, light background, no options. There is no theme, no per-space color, no size control — and no way to add a second emphasis level next to bold and italic.</p>
<p>If pages need styled code at the block level — themes, custom colors, highlighted lines — <a class="" href="https://ngpilot.com/docs/Modern-Code-Blocks-for-Confluence/user-docs">Modern Code Blocks</a> handles that; inline code stays native either way. For teams living in Markdown, <a class="" href="https://ngpilot.com/apps/enhanced-markdown-for-confluence">Enhanced Markdown</a> covers the paste path described above. And if what you actually want is a colored label rather than code — a chip that says <em>In review</em> or <em>Deprecated</em> — Confluence's native status element (type <code>/status</code>) is the closer tool.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="related-guides">Related guides<a href="https://ngpilot.com/blog/confluence-monospace#related-guides" class="hash-link" aria-label="Direct link to Related guides" title="Direct link to Related guides" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://ngpilot.com/blog/bold-text-confluence">How to make text bold in Confluence</a> — the sibling text-formatting shortcut and <code>**bold**</code> syntax</li>
<li class=""><a class="" href="https://ngpilot.com/blog/markdown-code-block-confluence">Markdown code blocks in Confluence</a> — fenced blocks, highlighting, and themes</li>
<li class=""><a class="" href="https://ngpilot.com/blog/faq-confluence-markdown-editor">How to write Markdown in Confluence</a> — the full syntax the editor supports</li>
<li class=""><a class="" href="https://ngpilot.com/blog/paste-mermaid-diagrams-into-confluence">Paste Mermaid diagrams into Confluence</a> — the repo-Markdown paste workflow, end to end</li>
</ul><div class="margin-top--xl padding-top--lg"><h2 class="anchor anchorWithStickyNavbar_LWe7">Related guides</h2><ul><li><a href="https://ngpilot.com/blog/how-to-create-mermaid-diagrams-jira">How to Create Mermaid Diagrams in Jira</a></li><li><a href="https://ngpilot.com/blog/export-jira-issues-to-excel">Export Jira Issues to Excel or CSV</a></li><li><a href="https://ngpilot.com/blog/bulk-download-jira-attachments">Bulk Download Jira Attachments</a></li><li><a href="https://ngpilot.com/blog/how-to-migrate-confluence-content">How to Migrate Confluence Content</a></li><li><a href="https://ngpilot.com/blog/block-quote-confluence">How to Add a Block Quote in Confluence</a></li></ul></div><div style="display:flex;flex-wrap:wrap;gap:0.75rem;justify-content:center;margin-top:2.5rem;margin-bottom:1rem;padding-top:1.5rem;border-top:1px solid var(--ifm-color-emphasis-200)"><span style="font-size:0.875rem;font-weight:600;color:var(--ifm-color-emphasis-500);align-self:center;width:100%;text-align:center;margin-bottom:0.25rem">Explore NGPILOT</span><a class="button button--secondary button--sm" href="https://ngpilot.com/solutions">Browse Solutions</a><a class="button button--secondary button--sm" href="https://ngpilot.com/apps">All Apps</a><a class="button button--secondary button--sm" href="https://ngpilot.com/blog/archive">All Posts</a><a href="https://marketplace.atlassian.com/vendors/1226848/?utm_source=ngpilot.com&amp;utm_medium=blog&amp;utm_campaign=hub-links" class="button button--secondary button--sm" target="_blank" rel="noopener noreferrer">Atlassian Marketplace →</a></div>]]></content>
        <author>
            <name>NGPilot</name>
            <uri>https://ngpilot.com</uri>
        </author>
        <category label="confluence" term="confluence"/>
        <category label="formatting" term="formatting"/>
        <category label="markdown" term="markdown"/>
        <category label="monospace" term="monospace"/>
        <category label="inline-code" term="inline-code"/>
        <category label="enhanced-markdown" term="enhanced-markdown"/>
        <category label="keyboard-shortcuts" term="keyboard-shortcuts"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[draw.io vs Mermaid in Confluence: Which Fits Your Docs?]]></title>
        <id>https://ngpilot.com/blog/mermaid-vs-drawio-confluence</id>
        <link href="https://ngpilot.com/blog/mermaid-vs-drawio-confluence"/>
        <updated>2026-09-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[draw.io now supports Mermaid, so the real difference is what happens to the source: Mermaid Plus vs draw.io for Confluence on text, AI and pricing.]]></summary>
        <content type="html"><![CDATA[<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>Quick Answer</div><div class="admonitionContent_BuS1"><p>draw.io supports Mermaid now — so "does draw.io do Mermaid?" is no longer the question. The question is <strong>what the source becomes</strong>. In <a href="https://marketplace.atlassian.com/apps/1236814/mermaid-plus-diagrams-ai-agent-for-confluence/" target="_blank" rel="noopener noreferrer" class="">Mermaid Plus Diagrams &amp; AI Agent for Confluence</a>, the Mermaid text stays the diagram: page history shows a text diff, an update is one line, and a Rovo agent can create, read, update or convert diagrams from chat. In draw.io, Mermaid is an import step that turns the diagram into native draw.io shapes, so you get full styling and shape-library freedom but the page holds shape data instead of reviewable text. On the AI side the difference is where the processing happens: Mermaid Plus runs on Atlassian Forge with Atlassian's own Rovo agent, so the diagram and the AI both stay inside the Atlassian trust boundary, covered by your existing Atlassian agreement. <strong>Text-first docs → Mermaid Plus. Visual-first, icon-heavy or migration-heavy work → draw.io.</strong></p></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>What you'll learn</div><div class="admonitionContent_BuS1"><ol>
<li class="">What changed when draw.io added Mermaid support in 2026</li>
<li class="">Where the two tools genuinely differ, and where they do not</li>
<li class="">How the AI features compare — canvas generation vs a Rovo agent on the page</li>
<li class="">Where the diagram and the AI data live, and why that decides it for enterprise teams</li>
<li class="">A decision framework for Confluence and Jira teams</li>
</ol></div></div>
<p>Every Confluence team ends up choosing a diagram tool, and most start by asking the wrong question: does it support Mermaid? These days, two answers exist. <a href="https://marketplace.atlassian.com/apps/1236814/mermaid-plus-diagrams-ai-agent-for-confluence/" target="_blank" rel="noopener noreferrer" class="">Mermaid Plus Diagrams &amp; AI Agent for Confluence</a> is built around Mermaid — all 30 Mermaid v12 diagram types, a code editor with live preview, one-click templates for every type, and a Rovo AI agent that works on the page. draw.io is the most-installed diagramming app on the Atlassian Marketplace, with deep shape libraries, whiteboarding, and a Mermaid importer added to its editor.</p>
<p>Both are good tools. This guide compares how they behave in Confluence specifically — how a diagram is created, what is stored on the page, what happens when you need to change it six months later, and what it costs.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="drawio-added-mermaid-in-2026--here-is-what-actually-changed">draw.io added Mermaid in 2026 — here is what actually changed<a href="https://ngpilot.com/blog/mermaid-vs-drawio-confluence#drawio-added-mermaid-in-2026--here-is-what-actually-changed" class="hash-link" aria-label="Direct link to draw.io added Mermaid in 2026 — here is what actually changed" title="Direct link to draw.io added Mermaid in 2026 — here is what actually changed" translate="no">​</a></h2>
<p>draw.io ships Mermaid support in its editor: <code>Arrange &gt; Insert &gt; Mermaid</code>, or the <code>+</code> button in the toolbar. The diagram type is detected from the first keyword of your source, and draw.io's documentation lists 29 supported Mermaid keywords — flowcharts, swimlanes, class, state, sequence, ZenUML, ER, requirement, C4, Gantt, journey, kanban, timeline, gitGraph, pie, XY, quadrant, radar, Sankey, treemap, mindmap, block, packet, architecture, Venn, Ishikawa, treeView, Wardley and event modeling. A type outside that list comes back as <em>unsupported diagram type</em>; a broken body comes back as a parse error pointing at the problem.</p>
<p>The significant change landed in <strong>July 2026</strong>. Previously, inserting Mermaid flattened the diagram into an image — you could see it and nothing more. Now, by default, the Mermaid source is rendered with <strong>native draw.io shapes inside a Mermaid container group</strong>, with the source attached to that group. That means:</p>
<ul>
<li class=""><strong>You can restyle it</strong> with draw.io's Style tools — fill and line colours, text colours, fonts, labels. Your edits override Mermaid styling and survive regeneration.</li>
<li class=""><strong>You can move and resize</strong> shapes and repath connectors inside the group.</li>
<li class=""><strong>You can re-edit the source</strong> — select a shape in the group, click the pen icon, change the Mermaid, click Apply to regenerate.</li>
<li class=""><strong>You can lock it</strong> with the padlock icon, or insert it as a single uneditable SVG image if you want a read-only diagram.</li>
<li class=""><strong>You can pick the layout engine</strong> — Dagre by default, with an ELK option for neater orthogonal connectors on large graphs.</li>
</ul>
<p>This is a real capability, and any comparison that still claims "draw.io cannot do Mermaid" is out of date. It also narrows the gap: draw.io can now hand you a Mermaid diagram <em>and</em> let you finish it as a polished visual artefact.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-real-difference-what-the-source-becomes">The real difference: what the source becomes<a href="https://ngpilot.com/blog/mermaid-vs-drawio-confluence#the-real-difference-what-the-source-becomes" class="hash-link" aria-label="Direct link to The real difference: what the source becomes" title="Direct link to The real difference: what the source becomes" translate="no">​</a></h2>
<p>Here is the honest core of the comparison. Both tools accept the same text:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">sequenceDiagram</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    participant Docs as Confluence</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    participant CI as CI pipeline</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    participant Reg as Registry</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    CI-&gt;&gt;Reg: push image</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Reg--&gt;&gt;Docs: webhook updates page</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Docs-&gt;&gt;Docs: rerender Mermaid diagram</span><br></div></code></pre></div></div>
<p>What each tool does with it next is the whole story.</p>
<p><strong>In Mermaid Plus, the text is the diagram.</strong> The Mermaid source is stored as the macro's source. Page history shows a readable text diff, so you can see that someone added a <code>Docs-&gt;&gt;Docs: rerender</code> arrow on a given date. Changing the diagram means changing a line and saving. The source is greppable, reviewable, and copy-pasteable into a pull request, a code review, or a chat with an AI assistant.</p>
<p><strong>In draw.io, the text becomes shapes.</strong> The Mermaid source is used to generate native draw.io shapes inside a container group. The source is still attached (that is the July 2026 improvement), but the diagram in the page is now shape and XML data. Your restyling, manual resizing and repathed connectors live alongside the generated geometry, and regenerating from source overrides geometry changes. Practically: you can style it freely, and you can still regenerate — but the page is no longer a text document, and a page-history diff is not a readable description of what changed.</p>
<p>This is why the two tools attract different teams. If your diagrams are <em>artifacts of your documentation</em>, text-native wins. If your diagrams are <em>designs you will present and iterate on visually</em>, draw.io's model wins.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="mermaid-plus-diagrams--ai-agent-for-confluence">Mermaid Plus Diagrams &amp; AI Agent for Confluence<a href="https://ngpilot.com/blog/mermaid-vs-drawio-confluence#mermaid-plus-diagrams--ai-agent-for-confluence" class="hash-link" aria-label="Direct link to Mermaid Plus Diagrams &amp; AI Agent for Confluence" title="Direct link to Mermaid Plus Diagrams &amp; AI Agent for Confluence" translate="no">​</a></h2>
<p><a href="https://marketplace.atlassian.com/apps/1236814/mermaid-plus-diagrams-ai-agent-for-confluence/" target="_blank" rel="noopener noreferrer" class="">Mermaid Plus Diagrams &amp; AI Agent for Confluence</a> is a Mermaid editor, not a general-purpose canvas. Everything about it follows from that.</p>
<ul>
<li class=""><strong>All 30 Mermaid v12 diagram types</strong> — flowcharts, sequence, class, state, ER, Gantt, pie, C4, mindmaps, ZenUML, use case, journey, requirement, gitGraph, and the rest — each with a one-click Quick Template, so you start from working code instead of a blank canvas.</li>
<li class=""><strong>Live preview beside the code</strong> — syntax errors surface while you type rather than when a reader opens the page.</li>
<li class=""><strong>Text-native storage</strong> — the source is the document. Page history, diffs, copy-paste and "edit one line" all work the way your team expects from code.</li>
<li class=""><strong>A Rovo AI agent that works on the page</strong> — see the next section.</li>
<li class=""><strong>Themes, custom colors and fonts</strong>, and <strong>automatic dark mode</strong> so diagrams follow the reader's Confluence theme.</li>
<li class=""><strong>Free for up to 10 users</strong>, running on Atlassian Forge with no external rendering server.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-rovo-agent-ai-on-the-page-not-just-in-the-canvas">The Rovo agent: AI on the page, not just in the canvas<a href="https://ngpilot.com/blog/mermaid-vs-drawio-confluence#the-rovo-agent-ai-on-the-page-not-just-in-the-canvas" class="hash-link" aria-label="Direct link to The Rovo agent: AI on the page, not just in the canvas" title="Direct link to The Rovo agent: AI on the page, not just in the canvas" translate="no">​</a></h3>
<p>The agent shipped with the current version of the app and it is the part that has no draw.io equivalent. Four capabilities, all operating on the page you are looking at:</p>
<ul>
<li class=""><strong>Create</strong> — describe what you want ("make a flowchart of our deployment process") and the diagram renders in place on the page.</li>
<li class=""><strong>Read</strong> — ask for the source and version of a diagram and get it back in chat, so you can diff, copy or paste it into a repository.</li>
<li class=""><strong>Update</strong> — say "make this better" and the agent revises the diagram in place, preserving the macro's settings.</li>
<li class=""><strong>Convert</strong> — turn code blocks that are already on the page into rendered diagrams. This is the fix for the most common Confluence Mermaid failure: an AI assistant or a colleague pasted a Mermaid code block into the page and it stayed dead text.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="privacy-the-diagram-and-the-ai-both-stay-inside-atlassian">Privacy: the diagram and the AI both stay inside Atlassian<a href="https://ngpilot.com/blog/mermaid-vs-drawio-confluence#privacy-the-diagram-and-the-ai-both-stay-inside-atlassian" class="hash-link" aria-label="Direct link to Privacy: the diagram and the AI both stay inside Atlassian" title="Direct link to Privacy: the diagram and the AI both stay inside Atlassian" translate="no">​</a></h2>
<p>This is the part that decides the question for a lot of enterprise teams, so it is worth being precise rather than reassuring.</p>
<p><strong>The diagram is Atlassian data, not vendor data.</strong> Mermaid Plus runs on Atlassian Forge and stores the Mermaid source as native content on the Confluence page. It is searchable, permissioned by Confluence's own rules, and versioned by page history. There is no second copy in a vendor account, because there is no vendor account.</p>
<p><strong>The agent is Atlassian's, not a bolted-on third-party AI.</strong> Rovo is part of Atlassian Cloud and ships inside the platform, included with Standard, Premium and Enterprise plans. You do not sign a separate DPA with an AI vendor, create an account with one, or add one to your app inventory. The vendor whose AI you are evaluating is us — the app vendor — and the AI itself is Atlassian's.</p>
<p><strong>Your inputs are not used to train anyone else's models.</strong> Atlassian states that Rovo inputs and outputs are not used to train, fine-tune or improve third-party LLM models or services, that its third-party-hosted LLM partners operate under strict zero data retention agreements, and that no provider retains the data you submit or the responses you receive. Requests are sent per-request over an SSL-encrypted connection, processed for the response, and returned.</p>
<p><strong>The agent inherits Confluence's permissions.</strong> Rovo honours existing permissions, so it cannot read a page or act on content the person asking does not already have access to. Page restrictions apply to the agent exactly as they apply to the reader.</p>
<p><strong>Admins keep the controls.</strong> AI features are managed from Atlassian Administration, Rovo activity is visible in the audit log, and Rovo data can be pinned to the same region as your Jira and Confluence data. Cloud Enterprise organisations can go further and elect to use only Atlassian-hosted LLMs, which keeps inference inside the Atlassian Cloud boundary rather than routing it to an external provider.</p>
<p>Two honest caveats, because a privacy section without them is just marketing. By default, Rovo routes requests to third-party-hosted model providers to generate the response — under the zero data retention terms above, and listed in Atlassian's public sub-processor list, so your security team can review exactly who is in the path. And Rovo retains chat and agent inputs and outputs for 30 days for safety and security purposes, while Atlassian may use de-identified, aggregated metadata to fine-tune open-source models that run inside Atlassian's own infrastructure — controllable through your organisation's data contribution settings.</p>
<p>Contrast that with draw.io, where AI generation (Smart Templates and a Generate tool that can call OpenAI, Claude or Gemini) is a feature of a third-party vendor's editor. draw.io does offer a <strong>zero egress</strong> option on its Forge app, which is a genuinely strong control — but it is an <strong>Advanced edition</strong> feature, so it is an enterprise-tier purchase rather than the default posture.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="drawio-for-confluence">draw.io for Confluence<a href="https://ngpilot.com/blog/mermaid-vs-drawio-confluence#drawio-for-confluence" class="hash-link" aria-label="Direct link to draw.io for Confluence" title="Direct link to draw.io for Confluence" translate="no">​</a></h2>
<p>draw.io for Confluence is the most-installed and highest-rated diagramming app on the Atlassian Marketplace — rated 4.8/5 across more than 1,200 reviews — run by JGraph as a Platinum Marketplace Partner. It is a mature, general-purpose diagramming suite, and for a lot of work it is the right tool. Its strengths:</p>
<ul>
<li class=""><strong>Shape library depth</strong> — AWS, Azure, Google Cloud, Cisco, IBM and other network and cloud icon sets, plus UML 2.5 and BPMN 2.0 libraries that Mermaid has no equivalent for.</li>
<li class=""><strong>Whiteboarding in the same app</strong> — a whiteboard editor for meetings and brainstorming alongside the diagram editor.</li>
<li class=""><strong>Migration paths</strong> — import from Visio (<code>.vsdx</code>), Gliffy and draw.io XML; export to XML, PDF, SVG, PNG, HTML and CSV.</li>
<li class=""><strong>Layout tooling</strong> — auto-layout plus advanced layout containers, and an ELK option for Mermaid-generated graphs.</li>
<li class=""><strong>AI generation inside the canvas</strong> — Smart Templates and a Generate tool that can use OpenAI, Claude or Gemini to produce a starting diagram you then edit as shapes.</li>
<li class=""><strong>Enterprise governance</strong> — Standard and Advanced editions, a dedicated account manager, custom security reviews, and a zero-egress option on Advanced; the app is Atlassian Cloud Fortified.</li>
<li class=""><strong>Broad platform support</strong> — Confluence Cloud plus Server and Data Center, and an equivalent app for Jira.</li>
</ul>
<p>Where it costs you: it is a commercial license with per-user pricing from the first seat, the diagram is stored as XML shape data rather than text, and "make the diagram match the schema" is a manual re-import rather than a one-line edit.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="side-by-side-comparison">Side-by-side comparison<a href="https://ngpilot.com/blog/mermaid-vs-drawio-confluence#side-by-side-comparison" class="hash-link" aria-label="Direct link to Side-by-side comparison" title="Direct link to Side-by-side comparison" translate="no">​</a></h2>
<table><thead><tr><th>Dimension</th><th>Mermaid Plus Diagrams &amp; AI Agent</th><th>draw.io for Confluence</th></tr></thead><tbody><tr><td><strong>What the source becomes</strong></td><td>The canonical text of the diagram, stored as-is</td><td>Native draw.io shapes in a Mermaid container group</td></tr><tr><td><strong>Diagram types</strong></td><td>All 30 Mermaid v12 types</td><td>draw.io's own shape libraries plus 29 Mermaid keywords</td></tr><tr><td><strong>Page history</strong></td><td>Readable text diffs</td><td>Shape/XML change history</td></tr><tr><td><strong>Editing model</strong></td><td>Type code, live preview, save</td><td>Draw, drag, restyle; regenerate from source when needed</td></tr><tr><td><strong>AI</strong></td><td>Rovo agent: create, read, update, convert on the page</td><td>Smart Templates and a Generate tool inside the canvas</td></tr><tr><td><strong>Where the AI runs</strong></td><td>Atlassian Rovo, inside the platform; no third-party AI account, inputs not used to train third-party models, admin controls and audit logs</td><td>Vendor feature in a third-party app; zero egress available on the Advanced edition only</td></tr><tr><td><strong>Templates</strong></td><td>One-click per diagram type</td><td>Smart Templates, AI-generated starters</td></tr><tr><td><strong>Shape libraries</strong></td><td>Mermaid diagram types, themed and colorable</td><td>Deep cloud, network, UML 2.5, BPMN 2.0, org chart, floorplan</td></tr><tr><td><strong>Whiteboarding</strong></td><td>No</td><td>Yes, separate whiteboard editor</td></tr><tr><td><strong>Migration</strong></td><td>Paste Mermaid text</td><td>Visio <code>.vsdx</code>, Gliffy, XML import and export</td></tr><tr><td><strong>Dark mode</strong></td><td>Automatic</td><td>Yes, selectable</td></tr><tr><td><strong>Confluence / Jira</strong></td><td>Confluence and Jira apps</td><td>Confluence Cloud, Server, Data Center, and Jira</td></tr><tr><td><strong>Pricing</strong></td><td>Free for up to 10 users</td><td>Commercial, per user, Standard and Advanced editions, free trial</td></tr><tr><td><strong>Best for</strong></td><td>Text-first docs, doc-as-code, AI-generated diagrams</td><td>Visual-first diagrams, icon-heavy architecture, enterprise rollout</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="decision-framework-pick-in-60-seconds">Decision framework: pick in 60 seconds<a href="https://ngpilot.com/blog/mermaid-vs-drawio-confluence#decision-framework-pick-in-60-seconds" class="hash-link" aria-label="Direct link to Decision framework: pick in 60 seconds" title="Direct link to Decision framework: pick in 60 seconds" translate="no">​</a></h2>
<ol>
<li class=""><strong>Do your diagrams need to diff, review, or live in a repository?</strong>
→ Yes: <strong>Mermaid Plus</strong>. Text-native is the only one of the two that gives you that.</li>
<li class=""><strong>Do you need cloud provider icons, BPMN 2.0, or Visio migration?</strong>
→ Yes: <strong>draw.io</strong>. No Mermaid tool covers those stencil libraries.</li>
<li class=""><strong>Do you want an agent to draft and revise diagrams from a sentence, in the page?</strong>
→ Yes: <strong>Mermaid Plus</strong> (Rovo agent). draw.io's AI works inside the canvas instead.</li>
<li class=""><strong>Are you a team of 10 or fewer, or standardizing on one tool across thousands of users?</strong>
→ 10 or fewer: <strong>Mermaid Plus</strong>, free. Thousands: compare total cost — draw.io's per-user license against the tools you would otherwise buy for whiteboarding and diagrams.</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="many-teams-run-both--and-that-is-fine">Many teams run both — and that is fine<a href="https://ngpilot.com/blog/mermaid-vs-drawio-confluence#many-teams-run-both--and-that-is-fine" class="hash-link" aria-label="Direct link to Many teams run both — and that is fine" title="Direct link to Many teams run both — and that is fine" translate="no">​</a></h2>
<p>The two tools do not conflict; they are separate macros and can sit on the same page. The common pattern is a split by <em>kind</em> of diagram: Mermaid Plus for the diagrams that are generated or versioned — schemas, API sequences, CI/CD pipelines, state machines, Gantt timelines — and draw.io for the diagrams that are designed — network topologies with vendor icons, BPMN process models, org charts, whiteboard sessions.</p>
<p>If you want one tool that covers both modes instead of two apps, <a href="https://marketplace.atlassian.com/apps/1237651/excalidraw-plus-whiteboards-for-confluence/" target="_blank" rel="noopener noreferrer" class="">Excalidraw plus Whiteboards for Confluence</a> gives you a freeform canvas with 220+ shape libraries plus Mermaid import.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="frequently-asked-questions">Frequently asked questions<a href="https://ngpilot.com/blog/mermaid-vs-drawio-confluence#frequently-asked-questions" class="hash-link" aria-label="Direct link to Frequently asked questions" title="Direct link to Frequently asked questions" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="can-drawio-do-mermaid-diagrams-in-confluence">Can draw.io do Mermaid diagrams in Confluence?<a href="https://ngpilot.com/blog/mermaid-vs-drawio-confluence#can-drawio-do-mermaid-diagrams-in-confluence" class="hash-link" aria-label="Direct link to Can draw.io do Mermaid diagrams in Confluence?" title="Direct link to Can draw.io do Mermaid diagrams in Confluence?" translate="no">​</a></h3>
<p>Yes — <code>Arrange &gt; Insert &gt; Mermaid</code>, or <code>+</code> then Mermaid. draw.io documents 29 supported Mermaid keywords, and since July 2026 the diagram is generated as native draw.io shapes inside a Mermaid container group with the source attached, so you can restyle it, resize it, lock it, and re-open the source to regenerate.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="so-what-is-the-real-difference-between-mermaid-and-drawio-in-confluence">So what is the real difference between Mermaid and draw.io in Confluence?<a href="https://ngpilot.com/blog/mermaid-vs-drawio-confluence#so-what-is-the-real-difference-between-mermaid-and-drawio-in-confluence" class="hash-link" aria-label="Direct link to So what is the real difference between Mermaid and draw.io in Confluence?" title="Direct link to So what is the real difference between Mermaid and draw.io in Confluence?" translate="no">​</a></h3>
<p>What happens to the source. Mermaid Plus keeps the text as the diagram — text diffs in page history, one-line updates, greppable source. draw.io converts Mermaid into native shapes, which buys styling and library freedom but makes the page shape data rather than a reviewable text document.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="which-one-should-a-confluence-team-choose-in-2026">Which one should a Confluence team choose in 2026?<a href="https://ngpilot.com/blog/mermaid-vs-drawio-confluence#which-one-should-a-confluence-team-choose-in-2026" class="hash-link" aria-label="Direct link to Which one should a Confluence team choose in 2026?" title="Direct link to Which one should a Confluence team choose in 2026?" translate="no">​</a></h3>
<p>Text-first teams — doc-as-code, AI-generated diagrams, standard types like flowcharts, sequence, ER, Gantt and C4 — should use Mermaid Plus. Visual-first teams that need cloud icon sets, BPMN 2.0, UML 2.5, Visio migration, whiteboarding, or enterprise zero-egress support should use draw.io. Plenty of teams install both and split by diagram type.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="is-mermaid-or-drawio-cheaper-for-confluence">Is Mermaid or draw.io cheaper for Confluence?<a href="https://ngpilot.com/blog/mermaid-vs-drawio-confluence#is-mermaid-or-drawio-cheaper-for-confluence" class="hash-link" aria-label="Direct link to Is Mermaid or draw.io cheaper for Confluence?" title="Direct link to Is Mermaid or draw.io cheaper for Confluence?" translate="no">​</a></h3>
<p>Mermaid Plus Diagrams &amp; AI Agent for Confluence is free for up to 10 users. draw.io for Confluence is a paid Marketplace app with Standard and Advanced editions and a free trial, priced per user from the first seat. Small teams pay nothing for Mermaid Plus; a large rollout is a real line item for draw.io.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="can-i-move-my-drawio-diagrams-to-mermaid-plus">Can I move my draw.io diagrams to Mermaid Plus?<a href="https://ngpilot.com/blog/mermaid-vs-drawio-confluence#can-i-move-my-drawio-diagrams-to-mermaid-plus" class="hash-link" aria-label="Direct link to Can I move my draw.io diagrams to Mermaid Plus?" title="Direct link to Can I move my draw.io diagrams to Mermaid Plus?" translate="no">​</a></h3>
<p>Not automatically — a draw.io diagram is XML, not text, so there is no reliable reverse conversion. The practical route is to regenerate diagrams as Mermaid source from whatever you already have (your schema, your OpenAPI spec, your pipeline config) and paste that in.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="which-has-the-better-ai-story-for-confluence-diagrams">Which has the better AI story for Confluence diagrams?<a href="https://ngpilot.com/blog/mermaid-vs-drawio-confluence#which-has-the-better-ai-story-for-confluence-diagrams" class="hash-link" aria-label="Direct link to Which has the better AI story for Confluence diagrams?" title="Direct link to Which has the better AI story for Confluence diagrams?" translate="no">​</a></h3>
<p>draw.io generates inside the canvas: Smart Templates and a Generate tool using OpenAI, Claude or Gemini, producing editable shapes. Mermaid Plus ships a Rovo agent that acts on the page — it creates a diagram from a sentence, reads the source back, revises it in place, and converts Mermaid code blocks already on the page into rendered diagrams. If your diagrams are generated by AI assistants, the convert capability is the one that matters most.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="where-does-the-diagram-and-the-ai-data-actually-live">Where does the diagram and the AI data actually live?<a href="https://ngpilot.com/blog/mermaid-vs-drawio-confluence#where-does-the-diagram-and-the-ai-data-actually-live" class="hash-link" aria-label="Direct link to Where does the diagram and the AI data actually live?" title="Direct link to Where does the diagram and the AI data actually live?" translate="no">​</a></h3>
<p>Both inside Atlassian. Mermaid Plus is a Forge app that stores the Mermaid source as native content on the Confluence page — searchable, permissioned, and versioned like the rest of the page, with no copy sitting in a vendor account. The agent is Atlassian Rovo, part of the platform rather than a separate AI vendor you have to contract with.</p>
<p>On the AI side, Atlassian states that Rovo inputs and outputs are not used to train, fine-tune or improve third-party LLM models or services; that its third-party-hosted LLM partners operate under strict zero data retention agreements; and that no provider retains the data you submit or the responses you receive. Rovo honours existing Confluence permissions, its activity shows up in the admin audit log, and Rovo data can be pinned to the same region as your Jira and Confluence data. Cloud Enterprise organisations can elect to use only Atlassian-hosted LLMs, which keeps inference inside the Atlassian Cloud boundary instead of routing it to an external provider.</p>
<p>Two caveats worth knowing: by default requests are routed to third-party-hosted providers to generate the response, under those zero data retention terms and listed in Atlassian's public sub-processor list, so your security team can audit exactly who sits in the path. And Rovo retains chat and agent inputs and outputs for 30 days for safety and security, while Atlassian may use de-identified, aggregated metadata to fine-tune open-source models running inside Atlassian's own infrastructure — switchable through your organisation's data contribution settings.</p>
<p>draw.io's equivalent AI is a feature of a third-party vendor's editor. It does offer a <strong>zero egress</strong> option on its Forge app, which is a strong control, but only on the <strong>Advanced edition</strong>.</p>
<hr>
<p><em>Compare the full set of Confluence diagram apps in the <a class="" href="https://ngpilot.com/apps">app catalog</a>, or see how Mermaid, Excalidraw and Graphviz divide the work in <a class="" href="https://ngpilot.com/blog/confluence-diagram-tools-comparison">Confluence diagram tools compared</a>.</em></p><div class="margin-top--lg margin-bottom--lg" style="padding:1.25rem 1.5rem;border-left:4px solid var(--ifm-color-primary);background-color:var(--ifm-color-emphasis-100);border-radius:var(--ifm-global-radius)"><p style="margin-bottom:0.5rem;font-weight:600">Try <!-- -->Mermaid Plus Diagrams &amp; AI Agent for Confluence</p><p style="margin-bottom:0.75rem;font-size:0.95rem">All 30 Mermaid diagram types plus a Rovo AI agent, with live preview and one-click templates — free for up to 10 users.</p><a href="https://marketplace.atlassian.com/apps/1236814/mermaid-plus-diagrams-ai-agent-for-confluence?utm_source=ngpilot.com&amp;utm_medium=website&amp;utm_campaign=mermaid-plus-for-confluence" target="_blank" rel="noopener noreferrer" class="button button--primary button--sm">Get it on the Atlassian Marketplace</a></div><div class="margin-top--xl padding-top--lg"><h2 class="anchor anchorWithStickyNavbar_LWe7">Related guides</h2><ul><li><a href="https://ngpilot.com/blog/how-to-create-mermaid-diagrams-jira">How to Create Mermaid Diagrams in Jira</a></li><li><a href="https://ngpilot.com/blog/export-jira-issues-to-excel">Export Jira Issues to Excel or CSV</a></li><li><a href="https://ngpilot.com/blog/bulk-download-jira-attachments">Bulk Download Jira Attachments</a></li><li><a href="https://ngpilot.com/blog/how-to-migrate-confluence-content">How to Migrate Confluence Content</a></li><li><a href="https://ngpilot.com/blog/block-quote-confluence">How to Add a Block Quote in Confluence</a></li></ul></div><div style="display:flex;flex-wrap:wrap;gap:0.75rem;justify-content:center;margin-top:2.5rem;margin-bottom:1rem;padding-top:1.5rem;border-top:1px solid var(--ifm-color-emphasis-200)"><span style="font-size:0.875rem;font-weight:600;color:var(--ifm-color-emphasis-500);align-self:center;width:100%;text-align:center;margin-bottom:0.25rem">Explore NGPILOT</span><a class="button button--secondary button--sm" href="https://ngpilot.com/solutions">Browse Solutions</a><a class="button button--secondary button--sm" href="https://ngpilot.com/apps">All Apps</a><a class="button button--secondary button--sm" href="https://ngpilot.com/blog/archive">All Posts</a><a href="https://marketplace.atlassian.com/vendors/1226848/?utm_source=ngpilot.com&amp;utm_medium=blog&amp;utm_campaign=hub-links" class="button button--secondary button--sm" target="_blank" rel="noopener noreferrer">Atlassian Marketplace →</a></div>]]></content>
        <author>
            <name>NGPilot</name>
            <uri>https://ngpilot.com</uri>
        </author>
        <category label="confluence" term="confluence"/>
        <category label="mermaid" term="mermaid"/>
        <category label="drawio" term="drawio"/>
        <category label="draw-io" term="draw-io"/>
        <category label="comparison" term="comparison"/>
        <category label="diagrams" term="diagrams"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Paste Mermaid Diagrams into Confluence — Now on Mermaid 12]]></title>
        <id>https://ngpilot.com/blog/paste-mermaid-diagrams-into-confluence</id>
        <link href="https://ngpilot.com/blog/paste-mermaid-diagrams-into-confluence"/>
        <updated>2026-09-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Paste Mermaid diagrams into Confluence and have them render: how Markdown with Mermaid 12 fences survives the paste from repo to Confluence docs.]]></summary>
        <content type="html"><![CDATA[<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>Quick Answer</div><div class="admonitionContent_BuS1"><p>Confluence's editor is WYSIWYG and has no Mermaid renderer, so pasting a Markdown file that contains <code>```mermaid</code> fences imports them as plain code blocks — the diagrams arrive dead. Paste into a Markdown macro instead: <a href="https://marketplace.atlassian.com/apps/1237026/enhanced-markdown-for-confluence/" target="_blank" rel="noopener noreferrer" class=""><strong>Enhanced Markdown for Confluence</strong></a> renders Mermaid 12 inline, so a whole README pastes in and the diagrams come alive. The v12 upgrade is what makes this newly worthwhile — <strong>UML use case diagrams</strong> now survive the paste, which is the diagram type requirements docs kept losing.</p></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>What you'll learn</div><div class="admonitionContent_BuS1"><ol>
<li class="">Why Mermaid dies on the way into Confluence, and where the fix lives</li>
<li class="">The paste workflow: repo Markdown in, rendered diagrams out</li>
<li class="">What Mermaid 12 changes — use case diagrams, refreshed layout, richer ZenUML</li>
<li class="">What happens to diagrams you already published</li>
</ol></div></div>
<p>The diagrams live in the repository. They were written in Mermaid, they are reviewed in pull requests next to the code they describe, and they are correct as of the last commit. The documentation, however, lives in Confluence — because that is where the rest of the team reads it. So somebody copies a Markdown file across, pastes it into a Confluence page, and the flowcharts, sequence diagrams and ER models arrive as grey boxes of unrendered code.</p>
<p>Everyone has hit this. It is one of the most common Confluence complaints, and the usual workarounds are worse than the problem: export every diagram to PNG and re-upload them (now they rot), keep the diagrams in an external tool and paste links (readers need a second account, and the links break), or build a browser extension to force rendering on paste.</p>
<p>There is a better answer, and Mermaid 12 makes it better still.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-mermaid-dies-on-the-way-into-confluence">Why Mermaid dies on the way into Confluence<a href="https://ngpilot.com/blog/paste-mermaid-diagrams-into-confluence#why-mermaid-dies-on-the-way-into-confluence" class="hash-link" aria-label="Direct link to Why Mermaid dies on the way into Confluence" title="Direct link to Why Mermaid dies on the way into Confluence" translate="no">​</a></h2>
<p>Two separate problems, often confused:</p>
<p><strong>Confluence cannot render Mermaid at all.</strong> There is no built-in Mermaid support in the editor — no <code>/mermaid</code> macro, no diagram fence handling. Anything that looks like a diagram arrives as a code block. This is a product limitation, not a configuration mistake, and it is why <a class="" href="https://ngpilot.com/blog/does-confluence-support-mermaid">Mermaid rendering in Confluence needs an app</a> rather than a setting.</p>
<p><strong>The import path actively flattens your content.</strong> When Markdown containing fenced diagrams is pasted or imported, the fence is treated as a code block and the page stores it as text. The information is not lost, but it is no longer a diagram — and nothing on the page will ever turn it back into one.</p>
<p>This is why "just paste the Markdown" does not work, and why teams end up screenshotting their diagrams.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-fix-paste-into-a-markdown-macro">The fix: paste into a Markdown macro<a href="https://ngpilot.com/blog/paste-mermaid-diagrams-into-confluence#the-fix-paste-into-a-markdown-macro" class="hash-link" aria-label="Direct link to The fix: paste into a Markdown macro" title="Direct link to The fix: paste into a Markdown macro" translate="no">​</a></h2>
<p><a href="https://marketplace.atlassian.com/apps/1237026/enhanced-markdown-for-confluence/" target="_blank" rel="noopener noreferrer" class="">Enhanced Markdown for Confluence</a> is a Markdown editor that lives inside the page. Paste your file into it and the Quikdown engine renders everything as you type — headings, GFM tables, syntax-highlighted code, KaTeX and LaTeX math, and Mermaid diagrams.</p>
<p>The workflow is three steps:</p>
<ol>
<li class=""><strong>Insert the macro.</strong> Type <code>/enhanced markdown</code> in the Confluence editor and pick the app. You get a split view: Markdown source on the left, live preview on the right.</li>
<li class=""><strong>Paste the whole file.</strong> Not just the diagram — the entire document. Tables, code fences, math and diagrams all render in the preview, so the page keeps one consistent look instead of a mix of pasted screenshots and live text.</li>
<li class=""><strong>Check the preview, then save.</strong> Diagrams render as centered inline SVG and update live as you keep typing. On save, the Markdown is stored as standard Confluence storage format, so it participates in search, exports, page history and permissions like any other page content.</li>
</ol>
<p>Two properties matter for teams beyond the first paste. The Markdown stays <strong>re-editable source on the page</strong>, so updating a diagram later means changing a line — not re-importing the file. And because the rendering libraries are bundled locally rather than pulled from a CDN, the macro stays inside your Atlassian boundary, which matters when "Runs on Atlassian" is a procurement checkbox.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new-in-mermaid-12-for-pasted-docs">What's new in Mermaid 12 for pasted docs<a href="https://ngpilot.com/blog/paste-mermaid-diagrams-into-confluence#whats-new-in-mermaid-12-for-pasted-docs" class="hash-link" aria-label="Direct link to What's new in Mermaid 12 for pasted docs" title="Direct link to What's new in Mermaid 12 for pasted docs" translate="no">​</a></h2>
<p>Enhanced Markdown now runs <strong>Mermaid 12</strong>, and for the paste workflow the headline is not cosmetic.</p>
<p><strong>UML use case diagrams (<code>usecase-beta</code>).</strong> This is the diagram type that requirements documents need and Markdown could not previously express. Actors, <code>systemBoundary</code> blocks, <code>include</code>/<code>extend</code> relationships and notes all render — so a requirements doc pasted from the repo arrives with its use case diagram intact instead of as an image or a footnote.</p>
<p><strong>A refreshed default look.</strong> Mermaid 12 changes the default layout engine and colour palettes, so flowcharts, state diagrams and class diagrams come out looking better with no code change.</p>
<p><strong>Richer ZenUML.</strong> ZenUML fences now support conditionals (<code>if/else</code>), loops (<code>while</code>), parallel blocks (<code>par</code>) and <code>try/catch</code> — useful when the sequence diagram you want is more than a straight list of messages.</p>
<p><strong>Centered, live SVG.</strong> Diagrams render centered inline and update as you edit, so a diagram that is too wide is obvious while you are writing rather than after you have pasted the whole file.</p>
<p>The full Mermaid 12 picture, including the syntax for every new type, is in <a class="" href="https://ngpilot.com/blog/mermaid-12-confluence-jira">Mermaid 12 in Confluence &amp; Jira</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="copy-paste-a-requirements-doc-with-a-v12-use-case-diagram">Copy-paste: a requirements doc with a v12 use case diagram<a href="https://ngpilot.com/blog/paste-mermaid-diagrams-into-confluence#copy-paste-a-requirements-doc-with-a-v12-use-case-diagram" class="hash-link" aria-label="Direct link to Copy-paste: a requirements doc with a v12 use case diagram" title="Direct link to Copy-paste: a requirements doc with a v12 use case diagram" translate="no">​</a></h2>
<p>This is the block to paste into the Markdown source. It is the use case diagram that could not be expressed in Markdown before v12:</p>
<div class="language-md codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-md codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token title important punctuation" style="color:#393A34">##</span><span class="token title important"> Checkout use cases</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token code punctuation" style="color:#393A34">```</span><span class="token code code-language">mermaid</span><span class="token code"></span><br></div><div class="token-line" style="color:#393A34"><span class="token code"></span><span class="token code code-block language-mermaid">usecase-beta</span><br></div><div class="token-line" style="color:#393A34"><span class="token code code-block language-mermaid">direction LR</span><br></div><div class="token-line" style="color:#393A34"><span class="token code code-block language-mermaid" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token code code-block language-mermaid">actor Customer</span><br></div><div class="token-line" style="color:#393A34"><span class="token code code-block language-mermaid">actor Admin</span><br></div><div class="token-line" style="color:#393A34"><span class="token code code-block language-mermaid" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token code code-block language-mermaid">systemBoundary Store("Online Store")</span><br></div><div class="token-line" style="color:#393A34"><span class="token code code-block language-mermaid">  UC1("Browse Products")</span><br></div><div class="token-line" style="color:#393A34"><span class="token code code-block language-mermaid">  UC2("Checkout")</span><br></div><div class="token-line" style="color:#393A34"><span class="token code code-block language-mermaid">end</span><br></div><div class="token-line" style="color:#393A34"><span class="token code code-block language-mermaid" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token code code-block language-mermaid">Customer --&gt; UC1</span><br></div><div class="token-line" style="color:#393A34"><span class="token code code-block language-mermaid">Customer --&gt; UC2</span><br></div><div class="token-line" style="color:#393A34"><span class="token code code-block language-mermaid">Admin --&gt; UC2</span><br></div><div class="token-line" style="color:#393A34"><span class="token code code-block language-mermaid">UC2 ..&gt; : include UC1</span><br></div><div class="token-line" style="color:#393A34"><span class="token code code-block language-mermaid">Admin --|&gt; Customer</span><br></div><div class="token-line" style="color:#393A34"><span class="token code code-block language-mermaid" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token code code-block language-mermaid">note for UC1 "Available 24/7"</span><span class="token code"></span><br></div><div class="token-line" style="color:#393A34"><span class="token code"></span><span class="token code punctuation" style="color:#393A34">```</span><br></div></code></pre></div></div>
<p>The preview shows actors connected to use cases inside the system boundary, with the include relationship and the note in place. The surrounding Markdown — the <code>## Checkout use cases</code> heading, any tables, any code samples — renders in the same pane, so the requirement, its diagram and its examples arrive as one document.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-happens-to-diagrams-you-already-published">What happens to diagrams you already published<a href="https://ngpilot.com/blog/paste-mermaid-diagrams-into-confluence#what-happens-to-diagrams-you-already-published" class="hash-link" aria-label="Direct link to What happens to diagrams you already published" title="Direct link to What happens to diagrams you already published" translate="no">​</a></h2>
<p>Nothing breaks. This matters enough to be precise:</p>
<ul>
<li class=""><strong>Existing Mermaid source keeps working unchanged.</strong> You do not need to rewrite a single diagram.</li>
<li class=""><strong>Flowchart, state and class diagrams may lay out slightly differently</strong>, because Mermaid 12 uses a new default layout engine and refreshed styling. A diagram can end up looking better with no code change — but if you had fine-tuned a layout by nudging shapes, the new engine may not reproduce it exactly.</li>
<li class=""><strong>Nothing is a stored image</strong>, so there is no migration to run. The source is the document; re-render and you get the new look.</li>
</ul>
<p>If a diagram does come out differently, pin the old appearance by overriding the theme in the fence, or re-check the ones with hand-tuned geometry first — those are the only pages worth reviewing after the upgrade.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="when-a-dedicated-diagram-app-is-the-better-choice">When a dedicated diagram app is the better choice<a href="https://ngpilot.com/blog/paste-mermaid-diagrams-into-confluence#when-a-dedicated-diagram-app-is-the-better-choice" class="hash-link" aria-label="Direct link to When a dedicated diagram app is the better choice" title="Direct link to When a dedicated diagram app is the better choice" translate="no">​</a></h2>
<p>Pasting Markdown is the right default for standard diagram types because the diagram arrives with the document that explains it. Reach for a dedicated Mermaid macro instead when you want:</p>
<ul>
<li class=""><strong>One-click templates</strong> for every diagram type, so nobody starts from a blank fence</li>
<li class=""><strong>Themes, custom colours and fonts</strong> to match your brand</li>
<li class=""><strong>An AI agent that works on the page</strong> — draft a diagram from a sentence, revise it in place, or convert code blocks already on the page into rendered diagrams</li>
<li class=""><strong>A diagram-only workflow</strong> when the page has no Markdown to preserve</li>
</ul>
<p>Our <a class="" href="https://ngpilot.com/blog/mermaid-vs-drawio-confluence">draw.io vs Mermaid in Confluence comparison</a> covers the text-native versus visual-editor trade-off in full, and <a class="" href="https://ngpilot.com/blog/confluence-diagram-tools-comparison">Confluence diagram tools compared</a> maps Mermaid, Excalidraw and Graphviz to the job each does well.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="frequently-asked-questions">Frequently asked questions<a href="https://ngpilot.com/blog/paste-mermaid-diagrams-into-confluence#frequently-asked-questions" class="hash-link" aria-label="Direct link to Frequently asked questions" title="Direct link to Frequently asked questions" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-do-mermaid-diagrams-not-render-when-i-paste-markdown-into-confluence">Why do Mermaid diagrams not render when I paste Markdown into Confluence?<a href="https://ngpilot.com/blog/paste-mermaid-diagrams-into-confluence#why-do-mermaid-diagrams-not-render-when-i-paste-markdown-into-confluence" class="hash-link" aria-label="Direct link to Why do Mermaid diagrams not render when I paste Markdown into Confluence?" title="Direct link to Why do Mermaid diagrams not render when I paste Markdown into Confluence?" translate="no">​</a></h3>
<p>Because Confluence's editor is WYSIWYG and has no Mermaid renderer, so a <code>mermaid</code> fence is imported as a plain code block and stays dead text. Paste into a Markdown macro that renders Mermaid instead — Enhanced Markdown for Confluence runs Mermaid 12, so flowcharts, sequence, class, state, ER, Gantt, pie, journey and the new UML use case diagrams all render in the live preview.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-does-mermaid-12-add-for-pasted-documentation">What does Mermaid 12 add for pasted documentation?<a href="https://ngpilot.com/blog/paste-mermaid-diagrams-into-confluence#what-does-mermaid-12-add-for-pasted-documentation" class="hash-link" aria-label="Direct link to What does Mermaid 12 add for pasted documentation?" title="Direct link to What does Mermaid 12 add for pasted documentation?" translate="no">​</a></h3>
<p>UML use case diagrams through the <code>usecase-beta</code> keyword — actors, <code>systemBoundary</code> blocks, <code>include</code>/<code>extend</code> relationships and notes — which is exactly the type requirements documents kept losing in the paste. Mermaid 12 also refreshes the default layout and colour palettes for flowchart, state and class diagrams, and ZenUML fences gain conditionals, loops, parallel blocks and <code>try/catch</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="will-my-existing-diagrams-break-after-the-mermaid-12-upgrade">Will my existing diagrams break after the Mermaid 12 upgrade?<a href="https://ngpilot.com/blog/paste-mermaid-diagrams-into-confluence#will-my-existing-diagrams-break-after-the-mermaid-12-upgrade" class="hash-link" aria-label="Direct link to Will my existing diagrams break after the Mermaid 12 upgrade?" title="Direct link to Will my existing diagrams break after the Mermaid 12 upgrade?" translate="no">​</a></h3>
<p>No. Existing Mermaid source keeps working unchanged. Flowchart, state and class diagrams may lay out slightly differently because Mermaid 12 uses a new default layout engine and refreshed styling, so a diagram can look better with no code change. Nothing needs rewriting, and because nothing is stored as an image there is no migration to run.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="should-i-paste-a-whole-markdown-file-or-convert-it-once">Should I paste a whole Markdown file or convert it once?<a href="https://ngpilot.com/blog/paste-mermaid-diagrams-into-confluence#should-i-paste-a-whole-markdown-file-or-convert-it-once" class="hash-link" aria-label="Direct link to Should I paste a whole Markdown file or convert it once?" title="Direct link to Should I paste a whole Markdown file or convert it once?" translate="no">​</a></h3>
<p>Paste it into the macro. That keeps the Markdown as re-editable source on the page, so you update a diagram by editing a line instead of re-importing the file. A one-time conversion makes more sense only when non-technical editors will maintain the page afterwards, since they get the WYSIWYG view instead of the source.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="is-a-dedicated-diagram-app-better-than-pasting-mermaid-in-markdown">Is a dedicated diagram app better than pasting Mermaid in Markdown?<a href="https://ngpilot.com/blog/paste-mermaid-diagrams-into-confluence#is-a-dedicated-diagram-app-better-than-pasting-mermaid-in-markdown" class="hash-link" aria-label="Direct link to Is a dedicated diagram app better than pasting Mermaid in Markdown?" title="Direct link to Is a dedicated diagram app better than pasting Mermaid in Markdown?" translate="no">​</a></h3>
<p>For standard types, pasting is faster and brings the math and code blocks in the same document. A dedicated Mermaid macro wins when you want one-click templates per diagram type, themes and custom colours, or an AI agent that drafts and revises diagrams in place on the page.</p>
<hr>
<p><em>Render every Mermaid 12 diagram type inside a Markdown document with <a href="https://marketplace.atlassian.com/apps/1237026/enhanced-markdown-for-confluence/" target="_blank" rel="noopener noreferrer" class="">Enhanced Markdown for Confluence</a> — free for up to 10 users.</em></p><div class="margin-top--lg margin-bottom--lg" style="padding:1.25rem 1.5rem;border-left:4px solid var(--ifm-color-primary);background-color:var(--ifm-color-emphasis-100);border-radius:var(--ifm-global-radius)"><p style="margin-bottom:0.5rem;font-weight:600">Try <!-- -->Mermaid Plus Diagrams &amp; AI Agent for Confluence</p><p style="margin-bottom:0.75rem;font-size:0.95rem">All 30 Mermaid diagram types plus a Rovo AI agent, with live preview and one-click templates — free for up to 10 users.</p><a href="https://marketplace.atlassian.com/apps/1236814/mermaid-plus-diagrams-ai-agent-for-confluence?utm_source=ngpilot.com&amp;utm_medium=website&amp;utm_campaign=mermaid-plus-for-confluence" target="_blank" rel="noopener noreferrer" class="button button--primary button--sm">Get it on the Atlassian Marketplace</a></div><div class="margin-top--xl padding-top--lg"><h2 class="anchor anchorWithStickyNavbar_LWe7">Related guides</h2><ul><li><a href="https://ngpilot.com/blog/how-to-create-mermaid-diagrams-jira">How to Create Mermaid Diagrams in Jira</a></li><li><a href="https://ngpilot.com/blog/export-jira-issues-to-excel">Export Jira Issues to Excel or CSV</a></li><li><a href="https://ngpilot.com/blog/bulk-download-jira-attachments">Bulk Download Jira Attachments</a></li><li><a href="https://ngpilot.com/blog/how-to-migrate-confluence-content">How to Migrate Confluence Content</a></li><li><a href="https://ngpilot.com/blog/block-quote-confluence">How to Add a Block Quote in Confluence</a></li></ul></div><div style="display:flex;flex-wrap:wrap;gap:0.75rem;justify-content:center;margin-top:2.5rem;margin-bottom:1rem;padding-top:1.5rem;border-top:1px solid var(--ifm-color-emphasis-200)"><span style="font-size:0.875rem;font-weight:600;color:var(--ifm-color-emphasis-500);align-self:center;width:100%;text-align:center;margin-bottom:0.25rem">Explore NGPILOT</span><a class="button button--secondary button--sm" href="https://ngpilot.com/solutions">Browse Solutions</a><a class="button button--secondary button--sm" href="https://ngpilot.com/apps">All Apps</a><a class="button button--secondary button--sm" href="https://ngpilot.com/blog/archive">All Posts</a><a href="https://marketplace.atlassian.com/vendors/1226848/?utm_source=ngpilot.com&amp;utm_medium=blog&amp;utm_campaign=hub-links" class="button button--secondary button--sm" target="_blank" rel="noopener noreferrer">Atlassian Marketplace →</a></div>]]></content>
        <author>
            <name>NGPilot</name>
            <uri>https://ngpilot.com</uri>
        </author>
        <category label="confluence" term="confluence"/>
        <category label="markdown" term="markdown"/>
        <category label="mermaid" term="mermaid"/>
        <category label="mermaid-12" term="mermaid-12"/>
        <category label="usecase-diagram" term="usecase-diagram"/>
        <category label="how-to" term="how-to"/>
        <category label="developer-tools" term="developer-tools"/>
    </entry>
</feed>