<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Yamuno Software</title>
    <description>The latest articles on DEV Community by Yamuno Software (yamuno-software).</description>
    <link>https://dev.to/yamuno-software</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F13140%2Fd41c5044-6751-4ab9-a469-3e694b97eab4.png</url>
      <title>DEV Community: Yamuno Software</title>
      <link>https://dev.to/yamuno-software</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yamuno-software"/>
    <language>en</language>
    <item>
      <title>Script Toolkit for Jira is live on the Marketplace</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Thu, 15 Oct 2026 06:44:44 +0000</pubDate>
      <link>https://dev.to/yamuno-software/script-toolkit-for-jira-is-live-on-the-marketplace-1fi</link>
      <guid>https://dev.to/yamuno-software/script-toolkit-for-jira-is-live-on-the-marketplace-1fi</guid>
      <description>&lt;h1&gt;
  
  
  Script Toolkit for Jira is live on the Marketplace
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; &lt;a href="https://dev.to/products/script-toolkit-for-jira"&gt;Script Toolkit for Jira&lt;/a&gt; is now on the &lt;a href="https://marketplace.atlassian.com/apps/1984972638/script-toolkit-for-jira" rel="noopener noreferrer"&gt;Atlassian Marketplace&lt;/a&gt;, and it's free. It lets Jira admins extend Jira Cloud with JavaScript: your own panels on work items, dashboard gadgets, web triggers for other systems, scheduled jobs, scripted fields and workflow validators. Everything runs on Atlassian Forge, inside your Jira site, and backend scripts are read only unless you allow writes.&lt;/p&gt;

&lt;p&gt;Most Jira teams have a short list of small things they wish Jira did. Show the linked deployment on every work item. Post a comment when CI finishes. Count overdue work every morning. Refuse a transition when a field is empty. Each one is a few lines of code, but until now each one meant building and hosting a whole app, or living without it. Script Toolkit gives those few lines a place to run.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you can build
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Try code in the Script Console
&lt;/h3&gt;

&lt;p&gt;Open &lt;strong&gt;Jira settings → Apps → Script Toolkit → Script Console&lt;/strong&gt;, write JavaScript, and press &lt;strong&gt;⌘↵&lt;/strong&gt; (Ctrl+↵ on Windows). The console runs in your browser with your own Jira permissions and saves nothing, so it's a safe place to explore the Jira REST API before you turn code into a script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;requestJira&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/rest/api/3/search/approximate-count&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;jql&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;statusCategory != Done AND assignee = currentUser()&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; open work items assigned to you`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;await&lt;/code&gt; works at the top level, and whatever you return is shown under the editor. The &lt;a href="https://dev.to/docs/script-toolkit-for-jira/script-console"&gt;Script Console guide&lt;/a&gt; lists every global you can use.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fragments: your own panels inside Jira
&lt;/h3&gt;

&lt;p&gt;A fragment is HTML, CSS and JavaScript that Script Toolkit shows inside Jira. Put it in a panel on every work item, in a dialog opened from the work item's &lt;strong&gt;•••&lt;/strong&gt; menu, on a project page or in project settings. Several fragments in the same place appear as tabs.&lt;/p&gt;

&lt;p&gt;Fragments run in the viewer's browser and call Jira as the viewer, so people only ever see what they could already see. Use Atlassian design tokens and your panel follows Jira's light and dark themes. The &lt;a href="https://dev.to/docs/script-toolkit-for-jira/fragments"&gt;fragments guide&lt;/a&gt; has a minimal example you can paste and save.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dashboard gadgets
&lt;/h3&gt;

&lt;p&gt;Gadget scripts work like fragments, but on a dashboard. Add the &lt;strong&gt;Script Toolkit Gadget&lt;/strong&gt;, pick one of your gadget scripts, and each gadget on the dashboard can show a different one. Each viewer sees their own data. See &lt;a href="https://dev.to/docs/script-toolkit-for-jira/gadgets"&gt;Gadgets&lt;/a&gt; for the setup. If what you need is a standard chart rather than custom code, &lt;a href="https://dev.to/products/charts-for-jira-dashboard"&gt;Charts for Jira Dashboard&lt;/a&gt; is the quicker route.&lt;/p&gt;

&lt;h3&gt;
  
  
  Web triggers for other systems
&lt;/h3&gt;

&lt;p&gt;A web trigger gives a script a secure URL with its own secret. A CI pipeline, a monitoring alert or a form can call it, and whatever the script returns comes back as JSON. Calls without the right secret get a 401 before any script runs, and you can rotate the secret at any time. The &lt;a href="https://dev.to/docs/script-toolkit-for-jira/web-triggers"&gt;web triggers guide&lt;/a&gt; shows a full example that comments on a work item when a deploy finishes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scheduled jobs
&lt;/h3&gt;

&lt;p&gt;Run a backend script on a cron schedule in UTC: a morning count of overdue work, a weekly clean-up, a nightly sync with another tool. Jobs are checked every five minutes and can run for up to five minutes each. See &lt;a href="https://dev.to/docs/script-toolkit-for-jira/scheduled-jobs"&gt;Scheduled jobs&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scripted fields
&lt;/h3&gt;

&lt;p&gt;Create a custom field whose value a script computes when the work item is shown: text, number, user, date or date time. For example, the number of done subtasks, or a due date worked out from other fields. Field runs have their own daily limit, so heavy browsing can't use up the budget your jobs and triggers need. See &lt;a href="https://dev.to/docs/script-toolkit-for-jira/scripted-fields"&gt;Scripted fields&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Workflow validators and post-functions
&lt;/h3&gt;

&lt;p&gt;Attach a script to a transition. A validator can block it and tell the user why, for example "Assign this work item first." A post-function runs after the transition, to add a comment or set a field. A validator that fails or times out allows the transition, so a broken script can never lock a workflow. See &lt;a href="https://dev.to/docs/script-toolkit-for-jira/workflow-extensions"&gt;Workflow extensions&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bulk tools for people who aren't admins
&lt;/h3&gt;

&lt;p&gt;Script Toolkit also includes seven ready-made bulk tools for work items: transition, set resolution, assign, add a comment, edit labels, set priority, and copy one custom field into another. You open each tool to admins, chosen groups or everyone. People run a tool on a JQL query, up to 5,000 work items at a time, and it uses their own Jira permissions, so access to a tool grants no new rights. The &lt;a href="https://dev.to/docs/script-toolkit-for-jira/tools"&gt;tools guide&lt;/a&gt; covers access and limits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Safe by default
&lt;/h2&gt;

&lt;p&gt;Running code inside Jira should not mean giving up control, so the defaults are strict:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Only Jira admins write scripts.&lt;/strong&gt; Everyone else only sees the results, or runs the bulk tools you open to them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend scripts are read only&lt;/strong&gt; unless you set a script's Jira access to Read and write. Any request that would change data is refused before it is sent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Outbound calls happen only if you allow them&lt;/strong&gt;, either to a list of hosts you choose or to any public https host. Private and internal addresses are always refused.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secrets stay secret.&lt;/strong&gt; API keys live in Forge's encrypted secret storage, can't be read back from the UI, and are masked in logs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every run has limits&lt;/strong&gt;: a time limit per run and daily limits per site, which admins can adjust within set ranges.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every run is logged&lt;/strong&gt;, grouped by run and filterable by script, with a retention you set.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Backend scripts run in an isolated JavaScript sandbox inside the app, on Atlassian's infrastructure. Yamuno runs no servers for Script Toolkit and receives none of your data. The &lt;a href="https://dev.to/docs/script-toolkit-for-jira/data-and-privacy"&gt;data and privacy page&lt;/a&gt; lists what the app stores and each permission it asks for, and our &lt;a href="https://dev.to/blogs/forge-native-vs-externally-hosted-apps-security-checklist"&gt;Forge security checklist&lt;/a&gt; explains what "runs on Atlassian" means when you compare apps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who it's for
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Jira admins&lt;/strong&gt; who keep getting asked for "just one small panel" or "one more rule on this transition"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Platform and DevOps teams&lt;/strong&gt; connecting CI, deploys and monitoring to Jira through web triggers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team leads and support staff&lt;/strong&gt; who need bulk changes without becoming Jira admins&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anyone reporting from Jira&lt;/strong&gt; who wants a computed field or a scheduled count instead of a manual spreadsheet; our guide to &lt;a href="https://dev.to/blogs/jira-reporting-for-product-managers"&gt;Jira reporting for product managers&lt;/a&gt; covers where those numbers fit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you also need to see what changed on work items and how long they sat in each status, &lt;a href="https://dev.to/products/issue-history-for-jira"&gt;Issue History+ for Jira&lt;/a&gt; works well alongside it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Install &lt;a href="https://marketplace.atlassian.com/apps/1984972638/script-toolkit-for-jira" rel="noopener noreferrer"&gt;Script Toolkit for Jira&lt;/a&gt; from the Atlassian Marketplace.&lt;/li&gt;
&lt;li&gt;Open &lt;strong&gt;Jira settings → Apps → Script Toolkit → Script Console&lt;/strong&gt; and click &lt;strong&gt;Run&lt;/strong&gt; on the starter script.&lt;/li&gt;
&lt;li&gt;Open &lt;strong&gt;Scripts&lt;/strong&gt;, choose &lt;strong&gt;Fragment&lt;/strong&gt;, test it against a work item key in the &lt;strong&gt;Test&lt;/strong&gt; tab, and save it.&lt;/li&gt;
&lt;li&gt;Open that work item and find your fragment in the &lt;strong&gt;Script Toolkit&lt;/strong&gt; panel.&lt;/li&gt;
&lt;li&gt;Create a &lt;strong&gt;Web trigger&lt;/strong&gt; and call it with the example command under &lt;strong&gt;How to call it&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The &lt;a href="https://dev.to/docs/script-toolkit-for-jira/getting-started/quick-start"&gt;quick start&lt;/a&gt; walks through all of this in about fifteen minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  How much does Script Toolkit cost?
&lt;/h3&gt;

&lt;p&gt;It's free on the Atlassian Marketplace.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which language are scripts written in?
&lt;/h3&gt;

&lt;p&gt;JavaScript. Fragments and gadgets are HTML with JavaScript that runs in the viewer's browser. Backend scripts are modern JavaScript with top-level &lt;code&gt;await&lt;/code&gt;, run in an isolated sandbox inside the app. There is no Node.js, so no &lt;code&gt;require&lt;/code&gt; or file system.&lt;/p&gt;

&lt;h3&gt;
  
  
  Who can write scripts?
&lt;/h3&gt;

&lt;p&gt;Only Jira admins. Fragments and gadgets then run for everyone who views them, with each viewer's own permissions, and bulk tools can be opened to chosen groups.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do scripts run on external servers?
&lt;/h3&gt;

&lt;p&gt;No. Everything runs on Atlassian Forge, inside your Jira site. Yamuno runs no servers for the app.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can a backend script change Jira?
&lt;/h3&gt;

&lt;p&gt;Only if you allow it. Each backend script is read only by default; set its Jira access to Read and write when it needs to create or change data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I test a script before it goes live?
&lt;/h3&gt;

&lt;p&gt;Yes. The editor's &lt;strong&gt;Test&lt;/strong&gt; tab runs the unsaved code once, against a work item key or a request body, and fragments and gadgets can be previewed under the editor before you save.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://marketplace.atlassian.com/apps/1984972638/script-toolkit-for-jira" rel="noopener noreferrer"&gt;Install Script Toolkit for Jira&lt;/a&gt; and run your first script in the console. Questions or feedback? Reach us through our &lt;a href="https://yamuno.atlassian.net/servicedesk/customer/portals" rel="noopener noreferrer"&gt;support portal&lt;/a&gt;. Your input shapes what we build next.&lt;/p&gt;

</description>
      <category>jira</category>
      <category>atlassian</category>
      <category>productlaunch</category>
      <category>automation</category>
    </item>
    <item>
      <title>Issue History+ for Jira is live on the Marketplace</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Tue, 13 Oct 2026 16:43:42 +0000</pubDate>
      <link>https://dev.to/yamuno-software/issue-history-for-jira-is-live-on-the-marketplace-1mbp</link>
      <guid>https://dev.to/yamuno-software/issue-history-for-jira-is-live-on-the-marketplace-1mbp</guid>
      <description>&lt;h1&gt;
  
  
  Issue History+ for Jira is live on the Marketplace
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; &lt;a href="https://dev.to/products/issue-history-for-jira"&gt;Issue History+ for Jira&lt;/a&gt; is now on the &lt;a href="https://marketplace.atlassian.com/apps/1031564177/issue-history-by-yamuno" rel="noopener noreferrer"&gt;Atlassian Marketplace&lt;/a&gt;, and it's free. It reads the change history Jira already records and lets you search it for a whole project, sprint or JQL query, see how long work spends in each status, and find stuck work, rework and SLA breaches. It runs on Atlassian Forge, so your issue data never leaves Atlassian.&lt;/p&gt;

&lt;p&gt;Jira writes down every change to every issue: who moved it, who reassigned it, who rewrote the description, and when. Reading that record is the hard part. The History tab shows one issue at a time, so answering "who moved these tickets back to In Progress last week?" means opening them one by one. We built Issue History+ to answer that kind of question in one search.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the app does
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Search the change history of many issues at once
&lt;/h3&gt;

&lt;p&gt;Open &lt;strong&gt;Apps → Issue History&lt;/strong&gt;, pick a project and a date range, and click &lt;strong&gt;Search&lt;/strong&gt;. You get every field change for the matching issues in one table. There are three ways to choose the issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Standard&lt;/strong&gt;: project, sprint, issue type, assignee, reporter, label, group and date range&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JQL&lt;/strong&gt;: paste a query you already use, with autocomplete and validation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bulk&lt;/strong&gt;: a list of issue keys, for example from a release note&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Group the results by issue, project, author or field, or read them as a feed. Summary and description edits show word-level differences, so you can see exactly which words changed instead of comparing two long paragraphs. &lt;strong&gt;Highlight&lt;/strong&gt; marks every change one person made. The &lt;a href="https://dev.to/docs/issue-history-for-jira/features/searching-history"&gt;searching history guide&lt;/a&gt; covers each option.&lt;/p&gt;

&lt;h3&gt;
  
  
  Time in status
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;Time in Status&lt;/strong&gt; tab shows, for each status, the median time per visit and the time 85% of visits finish within. We chose those over averages on purpose: one issue forgotten in review for three months can drag an average far from what a typical issue experiences, while the median and the 85th percentile stay honest.&lt;/p&gt;

&lt;p&gt;Time runs from the moment an issue enters a status until it leaves, and repeat visits are added up. You can count calendar time or business hours, and set an SLA per status so breaching issues are marked. A per-issue table lets you sort by any status to find the issues that spent longest there. The &lt;a href="https://dev.to/docs/issue-history-for-jira/features/time-in-status"&gt;time in status guide&lt;/a&gt; explains how each number is calculated.&lt;/p&gt;

&lt;h3&gt;
  
  
  Status timeline
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;Status Timeline&lt;/strong&gt; tab draws each issue's path through your workflow as one bar, coloured by status category. It makes ping-pong between In Progress and In Review easy to spot, which is hard to see in a list of changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Insights
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Insights&lt;/strong&gt; summarises the current search:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Completed and in-progress issues&lt;/li&gt;
&lt;li&gt;Median cycle time and the cycle time 85% of issues finish within&lt;/li&gt;
&lt;li&gt;Reopened issues: anything that left Done at least once&lt;/li&gt;
&lt;li&gt;Inactive work: issues that are not done and have had no status change for 7, 14 or 30 days&lt;/li&gt;
&lt;li&gt;Rework: the share of status moves that go backwards&lt;/li&gt;
&lt;li&gt;SLA breaches, worst first&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also shows issues completed per week, the most common status changes, when changes happen during the week, and who changes what. Every metric is defined in the &lt;a href="https://dev.to/docs/issue-history-for-jira/features/insights"&gt;Insights guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Because the app uses each status's Jira category (To Do, In Progress, Done), custom statuses such as Shipped or Won't Fix count correctly without any setup.&lt;/p&gt;

&lt;h3&gt;
  
  
  Issue Insights on every issue
&lt;/h3&gt;

&lt;p&gt;Each issue gets an &lt;strong&gt;Issue Insights&lt;/strong&gt; tab in its Activity section. It shows that issue's total time in each status, its status timeline and every change, newest first. You don't need to leave the issue to see where it has been.&lt;/p&gt;

&lt;h3&gt;
  
  
  Restore
&lt;/h3&gt;

&lt;p&gt;For status, assignee, priority and summary, &lt;strong&gt;Restore&lt;/strong&gt; puts the field back to the value it had before a change. It uses Jira's normal edit and transition permissions, so it only works where you could make that change in Jira yourself.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reports for people outside Jira
&lt;/h3&gt;

&lt;p&gt;Export the current search to CSV, Excel or a PDF report with your company name and logo. Excel and PDF exports include SLA thresholds and how many issues went over them. You can also save a search as a private bookmark, and your last ten searches are one click away.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your data stays in Atlassian
&lt;/h2&gt;

&lt;p&gt;Issue History+ runs entirely on Atlassian Forge and declares no egress, so issue data is never sent to an external server. Every request runs as the signed-in user, which means people only see history for issues they can already browse in Jira.&lt;/p&gt;

&lt;p&gt;The app stores only each user's saved searches, recent searches, settings and PDF branding, in Forge storage for your site. It doesn't store issue data, names or email addresses. The &lt;a href="https://dev.to/docs/issue-history-for-jira/data-and-privacy"&gt;data and privacy page&lt;/a&gt; lists everything it reads and stores, along with each permission it asks for. If you are comparing apps on this point, our &lt;a href="https://dev.to/blogs/forge-native-vs-externally-hosted-apps-security-checklist"&gt;Forge security checklist&lt;/a&gt; explains what "runs on Atlassian" means in practice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who it's for
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scrum masters and team leads&lt;/strong&gt; who want to see where work waits and which issues have gone quiet, before stand-up&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jira admins&lt;/strong&gt; answering "who changed this field, and when?" for many issues at once&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Support and service teams&lt;/strong&gt; tracking time in each status against an SLA&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Product and delivery managers&lt;/strong&gt; who need cycle time and throughput without building a spreadsheet; our guide to &lt;a href="https://dev.to/blogs/jira-reporting-for-product-managers"&gt;Jira reporting for product managers&lt;/a&gt; shows where it fits alongside Jira's own reports&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anyone reporting to stakeholders&lt;/strong&gt; who don't use Jira, through PDF and Excel exports&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a walkthrough of a full setup, from measuring time in status to setting SLAs, see the &lt;a href="https://dev.to/use-cases/jira-time-in-status-and-issue-history"&gt;time in status and issue history use case&lt;/a&gt;. If you also want charts on your Jira dashboard, &lt;a href="https://dev.to/products/charts-for-jira-dashboard"&gt;Charts for Jira Dashboard&lt;/a&gt; works well next to it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Install &lt;a href="https://marketplace.atlassian.com/apps/1031564177/issue-history-by-yamuno" rel="noopener noreferrer"&gt;Issue History+ for Jira&lt;/a&gt; from the Atlassian Marketplace.&lt;/li&gt;
&lt;li&gt;Open &lt;strong&gt;Apps → Issue History&lt;/strong&gt;, choose a project and keep the default last 30 days.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Search&lt;/strong&gt;, then open the &lt;strong&gt;Time in Status&lt;/strong&gt; and &lt;strong&gt;Insights&lt;/strong&gt; tabs.&lt;/li&gt;
&lt;li&gt;Open any issue and choose &lt;strong&gt;Issue Insights&lt;/strong&gt; under Activity.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Export&lt;/strong&gt; to share a report.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The &lt;a href="https://dev.to/docs/issue-history-for-jira/getting-started/quick-start"&gt;quick start&lt;/a&gt; takes about ten minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  How much does Issue History+ cost?
&lt;/h3&gt;

&lt;p&gt;It's free on the Atlassian Marketplace.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where does the history come from?
&lt;/h3&gt;

&lt;p&gt;From Jira's own changelog, read through the Jira REST API as the signed-in user. The app fetches the complete history of each issue, not only the most recent changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can people see history for issues they can't access?
&lt;/h3&gt;

&lt;p&gt;No. Every request runs with the viewing user's Jira permissions, so people only see history for issues they can already browse.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does it work with company-managed and team-managed projects?
&lt;/h3&gt;

&lt;p&gt;Yes. Both project types record the standard Jira changelog, which is what the app reads.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does it change anything in Jira?
&lt;/h3&gt;

&lt;p&gt;Only when someone clicks &lt;strong&gt;Restore&lt;/strong&gt;, and only for status, assignee, priority or summary. Everything else is read only.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://marketplace.atlassian.com/apps/1031564177/issue-history-by-yamuno" rel="noopener noreferrer"&gt;Install Issue History+ for Jira&lt;/a&gt; and run your first search. Questions or feedback? Reach us through our &lt;a href="https://yamuno.atlassian.net/servicedesk/customer/portals" rel="noopener noreferrer"&gt;support portal&lt;/a&gt;. Your input shapes what we build next.&lt;/p&gt;

</description>
      <category>jira</category>
      <category>atlassian</category>
      <category>productlaunch</category>
      <category>analytics</category>
    </item>
    <item>
      <title>PDF Exporter adds scheduled exports and a REST API</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Tue, 13 Oct 2026 07:58:10 +0000</pubDate>
      <link>https://dev.to/yamuno-software/pdf-exporter-adds-scheduled-exports-and-a-rest-api-78d</link>
      <guid>https://dev.to/yamuno-software/pdf-exporter-adds-scheduled-exports-and-a-rest-api-78d</guid>
      <description>&lt;h1&gt;
  
  
  PDF Exporter adds scheduled exports and a REST API
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; the 13 October 2026 release of &lt;a href="https://dev.to/products/pdf-exporter-for-confluence"&gt;PDF Exporter for Confluence&lt;/a&gt; is the biggest since launch. Large exports now run on Atlassian's servers in the background, so you can close the page while they finish. Schedules export a space or page tree every week or month and attach a dated PDF to an archive page. And a REST API lets scripts and CI/CD pipelines start exports with an API token.&lt;/p&gt;

&lt;p&gt;Until now, every export was built in your browser. That works well for a handful of pages, but a 400-page space export meant keeping a tab open, and a monthly compliance snapshot meant someone remembering to click Export on the first of the month. This release is about taking both of those jobs off people's hands.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8bel2ghlz2q20z447fu8.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8bel2ghlz2q20z447fu8.jpg" alt="My exports with an export running, one waiting in line and finished files" width="799" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Background exports and My exports
&lt;/h2&gt;

&lt;p&gt;The exporter's sidebar has a new &lt;strong&gt;Where to generate&lt;/strong&gt; option:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Auto (recommended):&lt;/strong&gt; small exports are built in your browser, large ones go to the server. The exporter tells you which it picked and why.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;This browser:&lt;/strong&gt; always build locally. Fastest for a few pages, but the page has to stay open.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server (background):&lt;/strong&gt; always build on the server, and leave whenever you like.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With Auto, an export moves to the server when it has more than 30 pages, more than 60 attachments, or more than 50 MB of attachments.&lt;/p&gt;

&lt;p&gt;A progress card shows each step (fetching pages, rendering, laying out the PDF). When it's done you can download from the card, or find the file later under &lt;strong&gt;My exports&lt;/strong&gt; in the sidebar. If you close the exporter mid-export, the card comes back the next time you open it.&lt;/p&gt;

&lt;p&gt;My exports keeps your server exports for 7 days by default. Large ZIP exports come in parts, download links are created when you click, and exports attached to a page have an &lt;strong&gt;Open on page&lt;/strong&gt; link. Site admins set the retention period (1 to 90 days) and a storage limit for the site under &lt;strong&gt;Confluence Settings → PDF Exporter → Exports &amp;amp; storage&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Background exports run on Atlassian Forge and the files sit in Atlassian's own storage. Nothing leaves Atlassian. The &lt;a href="https://dev.to/docs/pdf-exporter-for-confluence/features/background-exports"&gt;background exports docs&lt;/a&gt; cover the details.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scheduled exports
&lt;/h2&gt;

&lt;p&gt;Schedules are for teams that keep audit or retention copies of their documentation, or anyone who needs a monthly "as it was" copy.&lt;/p&gt;

&lt;p&gt;Open &lt;strong&gt;Apps → PDF Exporter for Confluence&lt;/strong&gt;, choose &lt;strong&gt;Schedules&lt;/strong&gt; in the sidebar and click &lt;strong&gt;New schedule&lt;/strong&gt;. A schedule has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What to export:&lt;/strong&gt; a page and its children, or a whole space&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Style Template:&lt;/strong&gt; any saved template; template edits apply to the next run&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Output:&lt;/strong&gt; one merged PDF or a ZIP of PDFs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How often:&lt;/strong&gt; weekly on a weekday, or monthly on a date from 1 to 28&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Where it goes:&lt;/strong&gt; attached to an archive page you choose, or kept in My exports only&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notify by email:&lt;/strong&gt; every run, only failures, or off&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When a run attaches its file to an archive page, the file is named with the schedule name and the run date, for example &lt;code&gt;Compliance snapshot 2026-11-01.pdf&lt;/code&gt;. The page's attachments then list every run in order, and those files stay until someone deletes them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fflrl7g24qfjn5w9dnyn3.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fflrl7g24qfjn5w9dnyn3.jpg" alt="A weekly schedule with its run history, and the comment thread it keeps on the archive page" width="799" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Email notifications without noise
&lt;/h3&gt;

&lt;p&gt;Notifications use Confluence itself. After a run, the app comments on the archive page and @mentions the people you picked, and Confluence emails them as it does for any mention. Each schedule keeps one comment thread and adds every later run as a reply, so a weekly schedule doesn't bury the page in comments after a year. &lt;strong&gt;Only failures&lt;/strong&gt; keeps the thread quiet unless something goes wrong.&lt;/p&gt;

&lt;h3&gt;
  
  
  Failures you can act on
&lt;/h3&gt;

&lt;p&gt;A failed run shows its reason in plain words, such as "Archive page was deleted". Problems that can't fix themselves (a deleted archive page, a deleted space, an owner who left) pause the schedule straight away. Other failures pause it after three in a row. &lt;strong&gt;Run now&lt;/strong&gt; runs a schedule immediately without moving its regular dates, which is handy for a first test. Site admins see every schedule on the site, with its owner, status and next run.&lt;/p&gt;

&lt;p&gt;Each run uses the access of the person who created the schedule, so it only exports pages they can view. The &lt;a href="https://dev.to/docs/pdf-exporter-for-confluence/features/scheduled-exports"&gt;scheduled exports docs&lt;/a&gt; list every option. For the bigger picture on audit copies, see &lt;a href="https://dev.to/blogs/confluence-pdf-export-for-compliance-teams"&gt;Confluence PDF export for compliance teams&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  A REST API for scripts and pipelines
&lt;/h2&gt;

&lt;p&gt;Some exports belong to a process rather than a person: release notes at the end of a deployment, a spec frozen when a project closes, a nightly copy of a runbook space. The new REST API covers those.&lt;/p&gt;

&lt;p&gt;A site admin creates a token under &lt;strong&gt;Confluence Settings → PDF Exporter → API&lt;/strong&gt;, choosing an expiry of 30 days, 90 days, 180 days or 1 year. Then one request starts an export:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s1"&gt;'YOUR_ENDPOINT_URL'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Authorization: Bearer YOUR_TOKEN'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"pageId": "123456", "name": "Release notes"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A &lt;code&gt;202&lt;/code&gt; response means the export started. The request can export a page, a page tree or a space, use any saved template, attach the file to a page and @mention up to 10 people. Send a &lt;code&gt;requestId&lt;/code&gt; and a retried request starts nothing new. Each token has a &lt;strong&gt;Recent calls&lt;/strong&gt; log of its last 25 requests, and only a hash of the token is stored.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdhhxjg5u4ezofus6vuqe.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdhhxjg5u4ezofus6vuqe.jpg" alt="A curl request from a release pipeline, the token's recent calls, and the PDF in My exports" width="799" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One design choice is worth knowing about. API responses are fixed messages and carry no page data, and no data is sent out of Atlassian. That keeps PDF Exporter eligible for Atlassian's Runs on Atlassian program. It also means the response tells you the export started, not where the file is: you pick it up in My exports, on the page you attached it to, or from the mention email. The &lt;a href="https://dev.to/docs/pdf-exporter-for-confluence/rest-api"&gt;REST API guide&lt;/a&gt; and &lt;a href="https://dev.to/docs/pdf-exporter-for-confluence/rest-api/examples"&gt;examples&lt;/a&gt; show common jobs.&lt;/p&gt;

&lt;p&gt;If you already automate Confluence content, the same token-based approach is used by the &lt;a href="https://dev.to/blogs/markdown-importer-rest-api-launch"&gt;Markdown Importer REST API&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fair use: one server export at a time
&lt;/h2&gt;

&lt;p&gt;Server exports run one at a time per site, and that includes scheduled runs and API calls. When another export is running, yours shows &lt;strong&gt;Waiting in Line&lt;/strong&gt; with its place in the queue and a &lt;strong&gt;Cancel&lt;/strong&gt; button, and starts on its own.&lt;/p&gt;

&lt;p&gt;Each site can render 10,000 pages a month on the server. Browser exports don't count toward that, and the allowance resets on the first of each month (UTC). Admins see this month's usage under &lt;strong&gt;Server exports this month&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Because server exports need new permissions, sites on an older version see a notice that an update is waiting, with a link to &lt;strong&gt;Manage apps&lt;/strong&gt; for admins.&lt;/p&gt;

&lt;h2&gt;
  
  
  Smaller changes and fixes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The exporter and the settings page now use a sidebar, and remember the open section in the page address&lt;/li&gt;
&lt;li&gt;Clicking &lt;strong&gt;Export&lt;/strong&gt; shows &lt;strong&gt;Preparing Export&lt;/strong&gt; straight away, and the button can't be clicked twice&lt;/li&gt;
&lt;li&gt;Custom emoji keep their image, panels keep their background colour and decision items keep their formatting&lt;/li&gt;
&lt;li&gt;Table of contents zone macros are no longer left out&lt;/li&gt;
&lt;li&gt;Long code lines without spaces wrap instead of running off the page&lt;/li&gt;
&lt;li&gt;Embeds without a source show a named "not included" note&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The full list is in the &lt;a href="https://dev.to/docs/pdf-exporter-for-confluence/release-notes"&gt;release notes&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Do I need to do anything to get the new features?
&lt;/h3&gt;

&lt;p&gt;A site admin needs to approve the update in &lt;strong&gt;Manage apps&lt;/strong&gt;, because server exports use new permissions. Until then the exporter shows a notice with a link.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do small exports still happen in my browser?
&lt;/h3&gt;

&lt;p&gt;Yes. With &lt;strong&gt;Where to generate&lt;/strong&gt; set to Auto, exports of up to 30 pages (and within the attachment limits) are still built in your browser and download straight away. You can also force either option.&lt;/p&gt;

&lt;h3&gt;
  
  
  How long are background exports kept?
&lt;/h3&gt;

&lt;p&gt;Seven days by default. Admins can set anything from 1 to 90 days, plus a storage limit for the site. Files that a schedule or API call attached to a Confluence page stay on that page until someone deletes them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can a scheduled export run at a set time of day?
&lt;/h3&gt;

&lt;p&gt;No. Schedules run once on their day, and Confluence picks the time. Dates are in UTC, so a schedule says "every Monday", not "every Monday at 9:00".&lt;/p&gt;

&lt;h3&gt;
  
  
  What can the REST API export?
&lt;/h3&gt;

&lt;p&gt;A single page, a page tree or a whole space, with any saved template, as one merged PDF (up to 500 pages) or a ZIP of separate PDFs (up to 2,000 pages). Each token can start 30 exports an hour.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does any of this send data outside Atlassian?
&lt;/h3&gt;

&lt;p&gt;No. Background and scheduled exports run on Atlassian Forge and store files in Atlassian's storage, and API responses carry no page data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Install &lt;a href="https://marketplace.atlassian.com/apps/726790413" rel="noopener noreferrer"&gt;PDF Exporter for Confluence&lt;/a&gt; from the Atlassian Marketplace, or update it under &lt;strong&gt;Manage apps&lt;/strong&gt; if you already have it. New to the app? Start with &lt;a href="https://dev.to/blogs/how-to-export-confluence-to-pdf"&gt;how to export Confluence to PDF&lt;/a&gt; or the &lt;a href="https://dev.to/docs/pdf-exporter-for-confluence/getting-started"&gt;getting started guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Questions or feedback? Reach out via our &lt;a href="https://yamuno.atlassian.net/servicedesk/customer/portals" rel="noopener noreferrer"&gt;support portal&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Confluence Markup: Wiki Markup vs Markdown in Cloud</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Tue, 13 Oct 2026 07:57:58 +0000</pubDate>
      <link>https://dev.to/yamuno-software/confluence-markup-wiki-markup-vs-markdown-in-cloud-45l4</link>
      <guid>https://dev.to/yamuno-software/confluence-markup-wiki-markup-vs-markdown-in-cloud-45l4</guid>
      <description>&lt;h1&gt;
  
  
  Confluence Markup: Wiki Markup vs Markdown in Cloud
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; Confluence markup, also called Confluence wiki markup or the Confluence markup language, is Atlassian's own text syntax (&lt;code&gt;h1.&lt;/code&gt;, &lt;code&gt;*bold*&lt;/code&gt;, &lt;code&gt;{code}&lt;/code&gt;), and Markdown is the syntax most developers write everywhere else (&lt;code&gt;#&lt;/code&gt;, &lt;code&gt;**bold**&lt;/code&gt;, triple backticks). The Confluence Cloud editor no longer accepts wiki markup, but it does turn common Markdown shortcuts into formatting as you type. If you want to keep Markdown as the source of a page, you need a Markdown macro or an importer.&lt;/p&gt;

&lt;p&gt;If you have been using Confluence for a while, you probably learned wiki markup first. If you came from GitHub, GitLab or a docs-as-code setup, you think in Markdown. Both describe the same things, headings, lists, tables, code, but the symbols are different, and only one of them still has a place in the Cloud editor. This guide puts the two side by side and explains what to use today.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Confluence markup?
&lt;/h2&gt;

&lt;p&gt;Confluence markup is the plain-text format the original Confluence editor was built around. Atlassian calls it wiki markup, and Jira Data Center and Jira's version 2 REST API use the same syntax. Before the rich text editor took over, you wrote pages as text with markup and Confluence rendered them. A heading was &lt;code&gt;h2. Release notes&lt;/code&gt;, a table header row was &lt;code&gt;||Name||Owner||&lt;/code&gt;, and a code sample sat between &lt;code&gt;{code}&lt;/code&gt; tags.&lt;/p&gt;

&lt;p&gt;That syntax still exists in a few places:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Confluence Data Center&lt;/strong&gt; still documents and supports wiki markup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The legacy Confluence Cloud editor&lt;/strong&gt; has an &lt;strong&gt;Insert &amp;gt; Markup&lt;/strong&gt; dialog that accepts wiki markup or Markdown and converts it into rich text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Older pages and scripts.&lt;/strong&gt; Content written years ago, and tools built on Jira's version 2 REST API, which takes rich text fields as wiki markup, still use it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the current Confluence Cloud editor, Atlassian states plainly that markup insertion is not supported. You cannot open a page and edit its wiki markup source either; the page is stored in Confluence's own format and you work on it as rich text.&lt;/p&gt;

&lt;h2&gt;
  
  
  Markdown in the Confluence Cloud editor
&lt;/h2&gt;

&lt;p&gt;What the Cloud editor does have is autoformatting that follows Markdown conventions. Type these and Confluence converts them on the spot:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;#&lt;/code&gt; followed by a space for Heading 1, up to &lt;code&gt;######&lt;/code&gt; for Heading 6&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;**bold**&lt;/code&gt;, &lt;code&gt;*italic*&lt;/code&gt; and &lt;code&gt;~~strikethrough~~&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;`code`&lt;/code&gt; for inline code, and three backticks followed by a space for a code block&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;*&lt;/code&gt; followed by a space for a bulleted list, &lt;code&gt;1.&lt;/code&gt; followed by a space for a numbered list&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;[]&lt;/code&gt; followed by a space for an action item (a task)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;gt;&lt;/code&gt; followed by a space for a quote, and &lt;code&gt;---&lt;/code&gt; followed by a space for a divider&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;[link text](https://example.com)&lt;/code&gt; for a link&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is handy when you write a page by hand. The catch is that it is a typing shortcut, not a Markdown mode. Once the text is formatted, the Markdown is gone. You cannot switch the page back to its Markdown source, and there is no table shortcut, so tables still come from the toolbar or the slash command. For more on code specifically, see &lt;a href="https://dev.to/blogs/confluence-inline-code-and-code-blocks"&gt;inline code and code blocks in Confluence&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wiki markup vs Markdown, side by side
&lt;/h2&gt;

&lt;p&gt;Here is how the same formatting is written in each syntax.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you want&lt;/th&gt;
&lt;th&gt;Confluence wiki markup&lt;/th&gt;
&lt;th&gt;Markdown&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Heading 2&lt;/td&gt;
&lt;td&gt;&lt;code&gt;h2. Title&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;## Title&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bold&lt;/td&gt;
&lt;td&gt;&lt;code&gt;*bold*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;**bold**&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Italic&lt;/td&gt;
&lt;td&gt;&lt;code&gt;_italic_&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;*italic*&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Strikethrough&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-deleted-&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~~deleted~~&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inline code&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{code}}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;`code`&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code block&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;{code:java}&lt;/code&gt; … &lt;code&gt;{code}&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;three backticks plus the language, then three backticks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bulleted list&lt;/td&gt;
&lt;td&gt;&lt;code&gt;* item&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;- item&lt;/code&gt; or &lt;code&gt;* item&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Numbered list&lt;/td&gt;
&lt;td&gt;&lt;code&gt;# item&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1. item&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Link&lt;/td&gt;
&lt;td&gt;`[title\&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://example.com%5D%60%7B%" rel="noopener noreferrer"&gt;https://example.com]`{%&lt;/a&gt; endraw %}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Table header&lt;/td&gt;
&lt;td&gt;{% raw %}`\&lt;/td&gt;
&lt;td&gt;\&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quote&lt;/td&gt;
&lt;td&gt;{% raw %}&lt;code&gt;bq. text&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;gt; text&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Horizontal rule&lt;/td&gt;
&lt;td&gt;&lt;code&gt;----&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;---&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three differences catch people out:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Asterisks mean different things.&lt;/strong&gt; In wiki markup &lt;code&gt;*text*&lt;/code&gt; is bold; in Markdown it is italic. Paste one into the other and the emphasis changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;#&lt;/code&gt; is a numbered list in wiki markup and a heading in Markdown.&lt;/strong&gt; A wiki-style numbered list pasted into a Markdown file turns into a stack of headings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Links put the title and URL in a different order and with a different separator.&lt;/strong&gt; Wiki markup uses &lt;code&gt;[title|url]&lt;/code&gt;, Markdown uses &lt;code&gt;[title](url)&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Confluence wiki markup cheat sheet
&lt;/h2&gt;

&lt;p&gt;Wiki markup also covers things standard Markdown has no syntax for, such as coloured text, panels and user mentions. These are the ones you are most likely to meet in older pages and Jira issue descriptions.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you want&lt;/th&gt;
&lt;th&gt;Confluence wiki markup&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Underline&lt;/td&gt;
&lt;td&gt;&lt;code&gt;+underlined+&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Superscript and subscript&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;^super^&lt;/code&gt; and &lt;code&gt;~sub~&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coloured text&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{color:red}text{color}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Line break&lt;/td&gt;
&lt;td&gt;&lt;code&gt;\\&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Image from an attachment&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;!diagram.png!&lt;/code&gt;, or `!diagram.png\&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Link to an attachment&lt;/td&gt;
&lt;td&gt;{% raw %}&lt;code&gt;[^report.pdf]&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Link to another page&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;[Page title]&lt;/code&gt; or &lt;code&gt;[SPACEKEY:Page title]&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mention a user&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[~username]&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anchor and link to it&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;{anchor:setup}&lt;/code&gt; and &lt;code&gt;[#setup]&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Table cell&lt;/td&gt;
&lt;td&gt;`\&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Info, note, tip, warning panels&lt;/td&gt;
&lt;td&gt;{% raw %}&lt;code&gt;{info}text{info}&lt;/code&gt;, &lt;code&gt;{note}&lt;/code&gt;, &lt;code&gt;{tip}&lt;/code&gt;, &lt;code&gt;{warning}&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Panel with a title&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{panel:title=Before you start}text{panel}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Preformatted text, no highlighting&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{noformat}text{noformat}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-line quote&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{quote}text{quote}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Table of contents&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{toc}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Anything in curly braces is a macro, which is why &lt;code&gt;{code}&lt;/code&gt;, &lt;code&gt;{info}&lt;/code&gt; and &lt;code&gt;{toc}&lt;/code&gt; look alike. Standard Markdown has no equivalent for most of them. In the Cloud editor you add the same things from the slash menu instead: type &lt;code&gt;/info&lt;/code&gt; for an Info panel or &lt;code&gt;/table of contents&lt;/code&gt; for a table of contents.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which one should you use?
&lt;/h2&gt;

&lt;p&gt;For new content, Markdown. It is what developers already write in READMEs, pull requests, chat and issue trackers, it is supported by almost every docs tool, and the Confluence Cloud editor's shortcuts follow it.&lt;/p&gt;

&lt;p&gt;Wiki markup still makes sense in two situations: you run Confluence Data Center and your team already knows it, or you maintain scripts that write to Jira's version 2 API. Outside of those, learning wiki markup today mostly means learning a syntax that only Atlassian products read.&lt;/p&gt;

&lt;h2&gt;
  
  
  Converting between the two
&lt;/h2&gt;

&lt;p&gt;There is no built-in converter in Confluence Cloud, so most teams handle it one of three ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;By hand, for a few pages.&lt;/strong&gt; The table above covers nearly everything. Watch the three traps: asterisks, &lt;code&gt;#&lt;/code&gt; and link order.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Export existing pages to Markdown.&lt;/strong&gt; If the content already lives in Confluence, export it rather than converting text. &lt;a href="https://dev.to/products/markdown-exporter-for-confluence"&gt;Markdown Exporter for Confluence&lt;/a&gt; exports a page, a page tree or a whole space to Markdown files with front matter. See &lt;a href="https://dev.to/blogs/how-to-export-confluence-to-markdown"&gt;how to export Confluence to Markdown&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Import Markdown into pages.&lt;/strong&gt; Going the other way, &lt;a href="https://dev.to/products/markdown-importer-for-confluence"&gt;Markdown Importer for Confluence&lt;/a&gt; turns &lt;code&gt;.md&lt;/code&gt; files, folders or a ZIP into a Confluence page tree. The walkthrough is in &lt;a href="https://dev.to/blogs/how-to-import-markdown-into-confluence"&gt;how to import Markdown into Confluence&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Search-and-replace scripts between the two syntaxes look easy and rarely are. Nested lists, code blocks that contain asterisks, and tables with links all break simple patterns, so test a converted page before you trust a batch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keeping Markdown as Markdown in Confluence
&lt;/h2&gt;

&lt;p&gt;The editor's shortcuts and the Insert &amp;gt; Markup dialog both convert Markdown into rich text. That is fine for a one-off page. It is a problem when the Markdown is the real source, a README, an API reference or a runbook that also lives in Git, because the next edit has to be made twice.&lt;/p&gt;

&lt;p&gt;Two ways keep the Markdown intact:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Write Markdown inside the page.&lt;/strong&gt; &lt;a href="https://dev.to/products/markdown-renderer-for-confluence"&gt;Markdown Macro+ for Confluence&lt;/a&gt; adds a macro with a split editor and live preview. You write GitHub-flavoured Markdown, including tables, task lists, code with syntax highlighting and KaTeX math, and the source stays editable afterwards. The &lt;a href="https://dev.to/docs/markdown-renderer-for-confluence/getting-started/quick-start"&gt;quick start&lt;/a&gt; takes a couple of minutes, and &lt;a href="https://dev.to/blogs/how-to-write-markdown-in-confluence"&gt;how to write Markdown in Confluence&lt;/a&gt; covers it in depth.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Publish from your repository.&lt;/strong&gt; Keep the &lt;code&gt;.md&lt;/code&gt; files in Git and push them to Confluence with Markdown Importer, by hand or from CI. This is the docs-as-code setup described on the &lt;a href="https://dev.to/use-cases/confluence-technical-documentation"&gt;technical documentation use case&lt;/a&gt; page.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both apps are built on Atlassian Forge, so the content stays on your Atlassian site.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is the Confluence markup language?
&lt;/h3&gt;

&lt;p&gt;It is Confluence wiki markup, the plain-text syntax Atlassian created for Confluence and Jira. Headings are &lt;code&gt;h1.&lt;/code&gt; to &lt;code&gt;h6.&lt;/code&gt;, bold is &lt;code&gt;*text*&lt;/code&gt;, code blocks sit between &lt;code&gt;{code}&lt;/code&gt; tags and macros are written in curly braces. The current Confluence Cloud editor no longer accepts it; Data Center and the legacy Cloud editor do.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does Confluence Cloud still support wiki markup?
&lt;/h3&gt;

&lt;p&gt;Not in the current editor. Atlassian's documentation says the new editor does not support markup insertion, and pages are not editable as wiki markup. The Insert &amp;gt; Markup dialog only exists in the legacy editor, and Confluence Data Center still supports wiki markup.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I write Markdown in Confluence Cloud?
&lt;/h3&gt;

&lt;p&gt;You can type Markdown shortcuts such as &lt;code&gt;##&lt;/code&gt;, &lt;code&gt;**bold**&lt;/code&gt; and three backticks, and the editor formats them as you type. The Markdown itself is not kept. To keep editable Markdown on a page, use a Markdown macro such as Markdown Macro+.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the difference between Confluence markup and Markdown?
&lt;/h3&gt;

&lt;p&gt;They describe the same formatting with different symbols. The biggest differences: &lt;code&gt;*text*&lt;/code&gt; is bold in wiki markup and italic in Markdown, &lt;code&gt;#&lt;/code&gt; starts a numbered list in wiki markup and a heading in Markdown, and links are &lt;code&gt;[title|url]&lt;/code&gt; versus &lt;code&gt;[title](url)&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I convert Confluence wiki markup to Markdown?
&lt;/h3&gt;

&lt;p&gt;For a few pages, convert by hand with a reference table like the one above. For content that is already in Confluence, export the pages to Markdown instead of converting text, for example with Markdown Exporter for Confluence.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I paste a README into Confluence and keep its formatting?
&lt;/h3&gt;

&lt;p&gt;Pasting raw Markdown into the Cloud editor does not reliably keep its formatting. Put it in a Markdown Macro+ macro on the page, or import the file with Markdown Importer so headings, tables and code blocks come through.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Write your next README-style page in Markdown and keep it that way: install &lt;a href="https://dev.to/products/markdown-renderer-for-confluence"&gt;Markdown Macro+ for Confluence&lt;/a&gt; from the Atlassian Marketplace, add the macro to a page and paste your Markdown in. If the docs live in Git, try &lt;a href="https://dev.to/products/markdown-importer-for-confluence"&gt;Markdown Importer&lt;/a&gt; on one folder first.&lt;/p&gt;

</description>
      <category>markdown</category>
      <category>confluence</category>
      <category>technicalwriting</category>
      <category>documentation</category>
    </item>
    <item>
      <title>LaTeX Inline Math: $...$, \\(...\\) and Display Math</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Thu, 08 Oct 2026 15:20:12 +0000</pubDate>
      <link>https://dev.to/yamuno-software/latex-inline-math-and-display-math-4al9</link>
      <guid>https://dev.to/yamuno-software/latex-inline-math-and-display-math-4al9</guid>
      <description>&lt;h1&gt;
  
  
  LaTeX Inline Math
&lt;/h1&gt;

&lt;p&gt;Inline math is an equation that sits inside a sentence, like "the roots are x = ±2" or "the loss is O(n log n)". LaTeX has two ways to write it, and a separate mode for equations that should stand on their own line. This guide covers both, what changes when math is inline, and how inline equations work outside a LaTeX document, in Markdown, Jupyter and Confluence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Inline math:&lt;/strong&gt; wrap the expression in single dollar signs, &lt;code&gt;$E = mc^2$&lt;/code&gt;, or in &lt;code&gt;\(E = mc^2\)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Display math&lt;/strong&gt; (its own centered line): use &lt;code&gt;\[E = mc^2\]&lt;/code&gt;. Avoid &lt;code&gt;$$...$$&lt;/code&gt; in LaTeX documents.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  $...$ or \(...\)?
&lt;/h2&gt;

&lt;p&gt;Both produce exactly the same inline equation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;The area of a circle is &lt;span class="p"&gt;$&lt;/span&gt;&lt;span class="nb"&gt;A &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt; &lt;/span&gt;&lt;span class="nv"&gt;\pi&lt;/span&gt;&lt;span class="nb"&gt; r&lt;/span&gt;&lt;span class="p"&gt;^&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;$&lt;/span&gt;.
The area of a circle is &lt;span class="p"&gt;\(&lt;/span&gt;&lt;span class="nb"&gt;A &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt; &lt;/span&gt;&lt;span class="nv"&gt;\pi&lt;/span&gt;&lt;span class="nb"&gt; r&lt;/span&gt;&lt;span class="p"&gt;^&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;\)&lt;/span&gt;.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;$...$&lt;/code&gt; is shorter and is what almost everyone types. &lt;code&gt;\(...\)&lt;/code&gt; is the LaTeX form: the opening and closing delimiters are different, so a missing one gives a clear error instead of silently swapping text and math for the rest of the paragraph. Pick one and use it consistently in a document.&lt;/p&gt;

&lt;p&gt;To print a literal dollar sign in text, escape it: &lt;code&gt;\$5&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Display math: \[...\], not $$...$$
&lt;/h2&gt;

&lt;p&gt;When an equation needs its own line, use display math:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;The solutions are
&lt;span class="p"&gt;\[&lt;/span&gt;&lt;span class="nb"&gt;
  x &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt; &lt;/span&gt;&lt;span class="nv"&gt;\frac&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;b &lt;/span&gt;&lt;span class="nv"&gt;\pm&lt;/span&gt;&lt;span class="nb"&gt; &lt;/span&gt;&lt;span class="nv"&gt;\sqrt&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;b&lt;/span&gt;&lt;span class="p"&gt;^&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="nb"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt; &lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="nb"&gt;ac&lt;/span&gt;&lt;span class="p"&gt;}}{&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="nb"&gt;a&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="nb"&gt;
&lt;/span&gt;&lt;span class="p"&gt;\]&lt;/span&gt;
for any quadratic with a ≠ 0.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;$$...$$&lt;/code&gt; also produces display math, but it is plain TeX syntax. In a LaTeX document it can give inconsistent spacing above and below the equation and doesn't work with the &lt;code&gt;fleqn&lt;/code&gt; option, so &lt;code&gt;\[...\]&lt;/code&gt; (or an environment such as &lt;code&gt;equation&lt;/code&gt; or &lt;code&gt;align&lt;/code&gt; from amsmath) is the recommended form. Many Markdown renderers and web tools do accept &lt;code&gt;$$...$$&lt;/code&gt;, which is why you see it so often online.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changes when math is inline
&lt;/h2&gt;

&lt;p&gt;LaTeX shrinks inline math so it doesn't push the lines of the paragraph apart:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sums, products and limits&lt;/strong&gt; put their limits to the side instead of above and below. &lt;code&gt;$\sum_{i=1}^{n} x_i$&lt;/code&gt; shows the i = 1 and n next to the sigma, not over and under it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fractions&lt;/strong&gt; are set smaller, with the numerator and denominator in a smaller font.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Big operators&lt;/strong&gt; such as integrals are smaller.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is usually what you want. When it isn't, you can override it:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Goal&lt;/th&gt;
&lt;th&gt;Write&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Limits above and below a sum, inline&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$\sum\limits_{i=1}^{n} x_i$&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A full-size fraction inline&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;$\dfrac{a}{b}$&lt;/code&gt; (amsmath)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A small fraction in display math&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;\[\tfrac{1}{2}\]&lt;/code&gt; (amsmath)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Display-size everything in one inline expression&lt;/td&gt;
&lt;td&gt;&lt;code&gt;$\displaystyle \sum_{i=1}^{n} \frac{1}{i}$&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Use these sparingly. A tall inline expression forces extra space between lines, and the paragraph looks uneven. If an inline equation needs &lt;code&gt;\displaystyle&lt;/code&gt; to be readable, it probably belongs on its own line.&lt;/p&gt;

&lt;h2&gt;
  
  
  Text and spacing inside inline math
&lt;/h2&gt;

&lt;p&gt;Inside math, letters are variables and spaces are ignored. So:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Words need &lt;code&gt;\text{}&lt;/code&gt;: &lt;code&gt;$x &amp;gt; 0 \text{ for all } x \in S$&lt;/code&gt;. Without it, "for all" prints as six italic variables with no spaces.&lt;/li&gt;
&lt;li&gt;Function names need their commands: &lt;code&gt;$\log n$&lt;/code&gt;, &lt;code&gt;$\sin x$&lt;/code&gt;, &lt;code&gt;$\max(a, b)$&lt;/code&gt;. See &lt;a href="https://dev.to/latex/symbols/log"&gt;log and ln in LaTeX&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Add space by hand when needed: &lt;code&gt;\,&lt;/code&gt; (thin), &lt;code&gt;\;&lt;/code&gt; (thick), &lt;code&gt;\quad&lt;/code&gt; (wide).&lt;/li&gt;
&lt;li&gt;Keep punctuation outside the math when it belongs to the sentence: &lt;code&gt;$x = 2$.&lt;/code&gt; rather than &lt;code&gt;$x = 2.$&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Inline math in Markdown, GitHub and Jupyter
&lt;/h2&gt;

&lt;p&gt;Most Markdown tools that support math use the same delimiters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt; renders &lt;code&gt;$...$&lt;/code&gt; inline and &lt;code&gt;$$...$$&lt;/code&gt; as a block in Markdown files, issues and pull requests. If a dollar sign gets misread, GitHub also accepts the form with backticks inside the dollars, a dollar sign then a backtick before the math and a backtick then a dollar sign after it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jupyter notebooks&lt;/strong&gt; render &lt;code&gt;$...$&lt;/code&gt; and &lt;code&gt;$$...$$&lt;/code&gt; in Markdown cells with MathJax.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Static site generators and docs tools&lt;/strong&gt; usually need a math plugin (KaTeX or MathJax) enabled before &lt;code&gt;$...$&lt;/code&gt; renders at all.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because &lt;code&gt;$&lt;/code&gt; also means money, some renderers only treat &lt;code&gt;$...$&lt;/code&gt; as math when there is no space just inside the dollar signs. &lt;code&gt;$x$&lt;/code&gt; works; &lt;code&gt;$ x $&lt;/code&gt; may not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inline math in Confluence
&lt;/h2&gt;

&lt;p&gt;Confluence Cloud has no built-in math, so you need an app. With &lt;a href="https://dev.to/products/latex-math-for-confluence"&gt;LaTeX Math for Confluence&lt;/a&gt;, type &lt;code&gt;/latex&lt;/code&gt; in the editor and choose &lt;strong&gt;LaTeX Math (Inline)&lt;/strong&gt; for an equation inside a sentence or &lt;strong&gt;LaTeX Math (Block)&lt;/strong&gt; for display math.&lt;/p&gt;

&lt;p&gt;Delimiters are optional in both macros. The inline macro accepts &lt;code&gt;E = mc^2&lt;/code&gt;, &lt;code&gt;$E = mc^2$&lt;/code&gt; or &lt;code&gt;\(E = mc^2\)&lt;/code&gt;, so you can paste LaTeX from a paper or a Markdown file as it is. If you paste display delimiters such as &lt;code&gt;$$...$$&lt;/code&gt; or &lt;code&gt;\[...\]&lt;/code&gt; into the inline macro, they are converted to inline math. Multi-line environments and large matrices belong in the block macro.&lt;/p&gt;

&lt;p&gt;The app renders with KaTeX, so the commands in our &lt;a href="https://dev.to/latex/symbols"&gt;LaTeX symbols reference&lt;/a&gt; that are marked as KaTeX-supported all work. For a full walkthrough, see &lt;a href="https://dev.to/blogs/how-to-add-math-equations-to-confluence"&gt;how to add math equations to Confluence&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistakes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Cause&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;The rest of the paragraph turns italic&lt;/td&gt;
&lt;td&gt;A missing closing &lt;code&gt;$&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Close the math, or switch to &lt;code&gt;\(...\)&lt;/code&gt; so the error is reported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Words inside an equation run together&lt;/td&gt;
&lt;td&gt;Text typed in math mode&lt;/td&gt;
&lt;td&gt;Wrap words in &lt;code&gt;\text{}&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;An inline fraction looks tiny&lt;/td&gt;
&lt;td&gt;Inline style is applied&lt;/td&gt;
&lt;td&gt;Use &lt;code&gt;\dfrac&lt;/code&gt; once, or move the equation to display math&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lines in the paragraph spread apart&lt;/td&gt;
&lt;td&gt;A tall inline expression&lt;/td&gt;
&lt;td&gt;Put the equation on its own line with &lt;code&gt;\[...\]&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A price prints as math&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;$&lt;/code&gt; read as a delimiter&lt;/td&gt;
&lt;td&gt;Escape it as &lt;code&gt;\$&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is the difference between $ and $$ in LaTeX?&lt;/strong&gt;&lt;br&gt;
Single dollars give inline math inside a sentence. Double dollars give display math on its own line, but in LaTeX documents &lt;code&gt;\[...\]&lt;/code&gt; is preferred.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I write inline math in LaTeX without dollar signs?&lt;/strong&gt;&lt;br&gt;
Use &lt;code&gt;\(&lt;/code&gt; and &lt;code&gt;\)&lt;/code&gt;. They behave exactly like &lt;code&gt;$...$&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I make a sum show its limits above and below inline?&lt;/strong&gt;&lt;br&gt;
Add &lt;code&gt;\limits&lt;/code&gt;: &lt;code&gt;$\sum\limits_{i=1}^{n}$&lt;/code&gt;. Or set the whole expression in display style with &lt;code&gt;\displaystyle&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I use inline math in a heading?&lt;/strong&gt;&lt;br&gt;
Yes in LaTeX, but use it sparingly, because the math also appears in the table of contents and in PDF bookmarks, where it may not render. In Confluence, put the equation in the body text instead.&lt;/p&gt;

</description>
      <category>latex</category>
      <category>math</category>
      <category>technicaldocumentation</category>
      <category>confluence</category>
    </item>
    <item>
      <title>Confluence Inline Code &amp; Code Blocks (Complete Guide)</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Tue, 06 Oct 2026 16:59:01 +0000</pubDate>
      <link>https://dev.to/yamuno-software/confluence-inline-code-code-blocks-complete-guide-2f6c</link>
      <guid>https://dev.to/yamuno-software/confluence-inline-code-code-blocks-complete-guide-2f6c</guid>
      <description>&lt;h1&gt;
  
  
  Inline Code and Code Blocks in Confluence
&lt;/h1&gt;

&lt;p&gt;If you write anything technical in Confluence, you need two things: a way to mark a command or file name as code in the middle of a sentence, and a proper block for anything longer than one line. Confluence Cloud has both, but the options for inline code and code blocks are spread over a toolbar menu, a few shortcuts and some Markdown that only works when you type it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Inline code:&lt;/strong&gt; type text between two backticks, like &lt;code&gt;&lt;span&gt;`npm install`&lt;/span&gt;&lt;/code&gt;, or select text and press &lt;strong&gt;Ctrl+Shift+M&lt;/strong&gt; (&lt;strong&gt;Cmd+Shift+M&lt;/strong&gt; on a Mac).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code block:&lt;/strong&gt; type three backticks (&lt;code&gt;&lt;span&gt;```&lt;/span&gt;&lt;/code&gt;) at the start of a line, or type &lt;code&gt;/code&lt;/code&gt; and pick &lt;strong&gt;Code snippet&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The rest of this guide covers every way to add each one, the settings a Confluence code block has, what changed from the old Code Block macro, and how to fix the things that usually go wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to use inline code vs a code block
&lt;/h2&gt;

&lt;p&gt;Use &lt;strong&gt;inline code&lt;/strong&gt; in Confluence for short things that sit inside a sentence: a command, a function name, a file path, a config key, an error message. For example: "Set &lt;code&gt;retryCount&lt;/code&gt; to 3 in &lt;code&gt;config.yaml&lt;/code&gt;."&lt;/p&gt;

&lt;p&gt;Use a &lt;strong&gt;code block&lt;/strong&gt; for anything you'd copy and run, anything longer than a line, and anything where indentation matters. Code blocks keep whitespace, get syntax highlighting and have a copy button, so readers don't pick up stray characters from the page.&lt;/p&gt;

&lt;p&gt;A simple rule we use: if someone will paste it into a terminal or editor, it goes in a block.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to add inline code in Confluence
&lt;/h2&gt;

&lt;p&gt;There are three ways to add Confluence inline code formatting. They all produce the same result, so pick whichever fits how you type.&lt;/p&gt;

&lt;h3&gt;
  
  
  Type backticks
&lt;/h3&gt;

&lt;p&gt;Type a backtick, your text, and a closing backtick: &lt;code&gt;&lt;span&gt;`kubectl get pods`&lt;/span&gt;&lt;/code&gt;. Confluence converts it to inline code the moment you type the closing backtick. This is the fastest way if you already write Markdown elsewhere.&lt;/p&gt;

&lt;p&gt;It only works when you type it. If you paste text that already contains backticks, they stay as plain characters. In that case use the shortcut below.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use the keyboard shortcut
&lt;/h3&gt;

&lt;p&gt;Select the text and press:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Windows / Linux&lt;/td&gt;
&lt;td&gt;Ctrl + Shift + M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mac&lt;/td&gt;
&lt;td&gt;Cmd + Shift + M&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Press the same shortcut again to remove the formatting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use the toolbar
&lt;/h3&gt;

&lt;p&gt;Select the text, open the &lt;strong&gt;Format text&lt;/strong&gt; menu in the editor toolbar (the &lt;strong&gt;...&lt;/strong&gt; next to bold and italic) and choose &lt;strong&gt;Code&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;To stop typing in code format, press the right arrow key at the end of the inline code, or toggle the shortcut off.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to add a code block in Confluence
&lt;/h2&gt;

&lt;p&gt;There are four ways to insert a code block. Atlassian's editor calls it a &lt;strong&gt;code snippet&lt;/strong&gt;, so that's the name you'll see in menus.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Three backticks.&lt;/strong&gt; On an empty line, type &lt;code&gt;&lt;span&gt;```&lt;/span&gt;&lt;/code&gt; and a code block appears. You can type the language right after the backticks, like &lt;code&gt;&lt;span&gt;```python&lt;/span&gt;&lt;/code&gt;, before pressing Enter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slash command.&lt;/strong&gt; Type &lt;code&gt;/code&lt;/code&gt; and choose &lt;strong&gt;Code snippet&lt;/strong&gt; from the list.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Insert menu.&lt;/strong&gt; Click &lt;strong&gt;+&lt;/strong&gt; in the toolbar and choose &lt;strong&gt;Code snippet&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Convert existing text.&lt;/strong&gt; Paste your code, select it, and use one of the methods above. For multi-line code it's usually cleaner to insert the empty block first and paste into it, so the indentation stays intact.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Code blocks work in pages, live docs, templates and inside most other elements, including table cells and expand sections.&lt;/p&gt;

&lt;h2&gt;
  
  
  Confluence code block options
&lt;/h2&gt;

&lt;p&gt;Click inside a code block and a small toolbar appears with its settings.&lt;/p&gt;

&lt;h3&gt;
  
  
  Language and syntax highlighting
&lt;/h3&gt;

&lt;p&gt;New code blocks detect the language automatically for CSS, Go, HTML, Java, JavaScript, JSON, Python, Ruby, Rust, Shell, SQL and TypeScript. For anything else, or when detection guesses wrong, pick the language from the dropdown. Once you choose one manually, auto-detection is switched off for that block.&lt;/p&gt;

&lt;p&gt;Setting the language explicitly is worth the extra second. It gives correct highlighting, and readers can see at a glance whether a snippet is Bash or PowerShell.&lt;/p&gt;

&lt;h3&gt;
  
  
  Line numbers
&lt;/h3&gt;

&lt;p&gt;Line numbers are on by default. Select the block and choose &lt;strong&gt;Hide line numbers&lt;/strong&gt; to turn them off, which is handy for one-line commands. Choose &lt;strong&gt;Show line numbers&lt;/strong&gt; to bring them back.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wrapping long lines
&lt;/h3&gt;

&lt;p&gt;Long lines scroll sideways by default. Select &lt;strong&gt;Wrap code&lt;/strong&gt; to wrap them instead, or &lt;strong&gt;Unwrap code&lt;/strong&gt; to go back. The setting you choose while editing is saved with the page. When a reader toggles wrapping in view mode, it only changes their view.&lt;/p&gt;

&lt;h3&gt;
  
  
  Formatting code
&lt;/h3&gt;

&lt;p&gt;For JavaScript and JSX, JSON and SQL, Confluence can tidy spacing and indentation for you. This is useful for minified JSON from an API response or a long one-line SQL query.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed from the old Code Block macro
&lt;/h2&gt;

&lt;p&gt;If you've used Confluence Server, Data Center or the legacy Cloud editor, you'll remember the &lt;strong&gt;Code Block macro&lt;/strong&gt;. It had a few settings the new code snippet doesn't:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Old Code Block macro&lt;/th&gt;
&lt;th&gt;New code snippet&lt;/th&gt;
&lt;th&gt;Workaround&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Title shown in a header row&lt;/td&gt;
&lt;td&gt;No title&lt;/td&gt;
&lt;td&gt;Put a short heading or bold line above the block&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Collapsible&lt;/td&gt;
&lt;td&gt;Not collapsible&lt;/td&gt;
&lt;td&gt;Wrap the block in an &lt;strong&gt;Expand&lt;/strong&gt; element (&lt;code&gt;/expand&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;First line number setting&lt;/td&gt;
&lt;td&gt;Always starts at 1&lt;/td&gt;
&lt;td&gt;Add a note above the block, or use a comment for context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Themes (Midnight, Eclipse, RDark and others)&lt;/td&gt;
&lt;td&gt;Follows the Confluence theme, including dark mode&lt;/td&gt;
&lt;td&gt;Use an app if you need a custom look&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Language picked by hand&lt;/td&gt;
&lt;td&gt;Auto-detect plus manual picker&lt;/td&gt;
&lt;td&gt;None needed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Collapsible code snippets are an open feature request with Atlassian (&lt;a href="https://jira.atlassian.com/browse/CONFCLOUD-71495" rel="noopener noreferrer"&gt;CONFCLOUD-71495&lt;/a&gt;), so the Expand element is the practical answer for now. Atlassian is also retiring the legacy editor, so old pages will move to the new code snippet over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common problems and how to fix them
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Why it happens&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Backticks stay as text&lt;/td&gt;
&lt;td&gt;The shortcut only converts text as you type it, not pasted text&lt;/td&gt;
&lt;td&gt;Select the text and press Ctrl/Cmd+Shift+M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Indentation is lost after pasting&lt;/td&gt;
&lt;td&gt;Code was pasted into a normal paragraph first&lt;/td&gt;
&lt;td&gt;Insert an empty code block, then paste into it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wrong colours in the block&lt;/td&gt;
&lt;td&gt;Auto-detect guessed the wrong language&lt;/td&gt;
&lt;td&gt;Pick the language from the dropdown&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Readers scroll sideways forever&lt;/td&gt;
&lt;td&gt;Long lines with wrapping off&lt;/td&gt;
&lt;td&gt;Turn on &lt;strong&gt;Wrap code&lt;/strong&gt;, or break lines in the code itself&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Can't type normal text after inline code&lt;/td&gt;
&lt;td&gt;Cursor is still inside the code formatting&lt;/td&gt;
&lt;td&gt;Press the right arrow key, or toggle the shortcut off&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Page is a wall of code&lt;/td&gt;
&lt;td&gt;Whole files pasted into one block&lt;/td&gt;
&lt;td&gt;Split into short blocks with a sentence before each one&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Writing code in Markdown inside Confluence
&lt;/h2&gt;

&lt;p&gt;Some teams would rather write docs in Markdown and keep the same files in Git. Confluence's editor accepts Markdown shortcuts while you type, but it doesn't store or render a Markdown document as a whole. If you paste a README full of fenced code blocks, it won't come out as you expect. We cover the options in more detail in &lt;a href="https://dev.to/blogs/how-to-write-markdown-in-confluence"&gt;how to write Markdown in Confluence&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If that's your workflow, &lt;a href="https://dev.to/products/markdown-renderer-for-confluence"&gt;Markdown Renderer for Confluence&lt;/a&gt; renders GitHub-flavoured Markdown inside a macro, including &lt;a href="https://dev.to/docs/markdown-renderer-for-confluence/how-to-and-features/code-blocks"&gt;fenced code blocks with syntax highlighting&lt;/a&gt; and inline code in single backticks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Install&lt;/span&gt;

Run &lt;span class="sb"&gt;`npm install`&lt;/span&gt; first, then start the server:

&lt;span class="p"&gt;```&lt;/span&gt;&lt;span class="nl"&gt;bash
&lt;/span&gt;npm run dev &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--port&lt;/span&gt; 3000
&lt;span class="p"&gt;```&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The source stays as plain Markdown, so you can copy it between Confluence, GitHub and your editor without reformatting. For fully custom styling, such as a branded code block or a tabbed example, you can also build it yourself with &lt;a href="https://dev.to/products/html-macro-for-confluence"&gt;HTML Macro+ for Confluence&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tips for readable code in Confluence
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Keep blocks short.&lt;/strong&gt; One block per step reads better than one block for the whole procedure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explain before you show.&lt;/strong&gt; Add a sentence above each block saying what it does and where to run it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Always set the language&lt;/strong&gt; when auto-detect isn't sure. It's the quickest readability win.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use inline code for names, not emphasis.&lt;/strong&gt; If it isn't something you'd type, it doesn't need code formatting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Never paste secrets.&lt;/strong&gt; API keys and passwords in code blocks end up in page history, exports and search.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mark placeholders clearly&lt;/strong&gt;, for example &lt;code&gt;&amp;lt;your-api-key&amp;gt;&lt;/code&gt;, so nobody runs a command with a dummy value.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For bigger documentation projects, see our guides on &lt;a href="https://dev.to/blogs/how-to-document-apis-in-confluence"&gt;documenting APIs in Confluence&lt;/a&gt; and &lt;a href="https://dev.to/blogs/how-to-use-confluence-as-developer-wiki"&gt;using Confluence as a developer wiki&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  How do I format inline code in Confluence?
&lt;/h3&gt;

&lt;p&gt;Type the text between backticks, like &lt;code&gt;&lt;span&gt;`this`&lt;/span&gt;&lt;/code&gt;, or select it and press Ctrl+Shift+M (Cmd+Shift+M on a Mac). You can also choose &lt;strong&gt;Code&lt;/strong&gt; from the &lt;strong&gt;Format text&lt;/strong&gt; menu in the toolbar.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the keyboard shortcut for inline code in Confluence?
&lt;/h3&gt;

&lt;p&gt;Ctrl+Shift+M on Windows and Linux, Cmd+Shift+M on a Mac. Press it again to remove the formatting.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I insert a code block in Confluence?
&lt;/h3&gt;

&lt;p&gt;Type three backticks on an empty line, or type &lt;code&gt;/code&lt;/code&gt; and choose &lt;strong&gt;Code snippet&lt;/strong&gt;. You can also click &lt;strong&gt;+&lt;/strong&gt; in the toolbar and pick &lt;strong&gt;Code snippet&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I make a Confluence code block collapsible?
&lt;/h3&gt;

&lt;p&gt;Not directly. The new code snippet has no collapse option. Put the code block inside an &lt;strong&gt;Expand&lt;/strong&gt; element instead, so readers click to open it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I hide line numbers in a Confluence code block?
&lt;/h3&gt;

&lt;p&gt;Yes. Select the code block and choose &lt;strong&gt;Hide line numbers&lt;/strong&gt; from its toolbar.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do these shortcuts work in Jira?
&lt;/h3&gt;

&lt;p&gt;Jira Cloud uses the same editor for descriptions and comments, so backticks, three backticks and &lt;code&gt;/code&lt;/code&gt; work there too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;For Confluence inline code, type backticks or press Ctrl/Cmd+Shift+M. For a code block, type three backticks or &lt;code&gt;/code&lt;/code&gt;, set the language, and decide on line numbers and wrapping. If your team lives in Markdown, render it with a Markdown macro instead of fighting the editor.&lt;/p&gt;

&lt;p&gt;Have a Confluence formatting question we didn't cover? Ask us through our &lt;a href="https://yamuno.atlassian.net/servicedesk/customer/portals" rel="noopener noreferrer"&gt;support portal&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>5 Ways to Use HTML in Confluence Cloud (With Examples)</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Fri, 25 Sep 2026 07:33:16 +0000</pubDate>
      <link>https://dev.to/yamuno-software/5-ways-to-use-html-in-confluence-cloud-with-examples-3hcm</link>
      <guid>https://dev.to/yamuno-software/5-ways-to-use-html-in-confluence-cloud-with-examples-3hcm</guid>
      <description>&lt;h1&gt;
  
  
  5 Ways to Use HTML in Confluence Cloud (With Examples)
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; Confluence Cloud doesn't include an HTML macro. The one you may remember from Server and Data Center was never brought to Cloud, and even on Data Center it's disabled by default. In Cloud you have two options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The built-in &lt;strong&gt;iFrame macro&lt;/strong&gt; embeds another web page by URL. It can't run your own HTML, CSS or JavaScript, and many sites refuse to be embedded.&lt;/li&gt;
&lt;li&gt;An &lt;strong&gt;HTML macro app&lt;/strong&gt; from the Atlassian Marketplace adds a macro where you write your own code. It runs in a sandboxed frame, so it can't affect the rest of the page.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This guide uses &lt;a href="https://dev.to/products/html-macro-for-confluence"&gt;HTML Macro+ for Confluence&lt;/a&gt;, which is free and runs on Atlassian Forge, but the ideas apply to any HTML macro. The code examples are split into HTML, CSS and JavaScript, matching the editor's three tabs.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you want to do&lt;/th&gt;
&lt;th&gt;Native Confluence Cloud&lt;/th&gt;
&lt;th&gt;With an HTML macro&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Style a section beyond the built-in panels&lt;/td&gt;
&lt;td&gt;Limited to panels, colors and layouts&lt;/td&gt;
&lt;td&gt;Any CSS inside the macro&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Embed a video, map or design file&lt;/td&gt;
&lt;td&gt;iFrame macro, if the site allows embedding&lt;/td&gt;
&lt;td&gt;Your own iframe, wrapped in your own layout&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Show an existing &lt;code&gt;.html&lt;/code&gt; file&lt;/td&gt;
&lt;td&gt;Attach it as a download&lt;/td&gt;
&lt;td&gt;Render it on the page&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add interactive elements&lt;/td&gt;
&lt;td&gt;Not possible&lt;/td&gt;
&lt;td&gt;Any JavaScript, in a sandbox&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Keep migrated Data Center HTML pages working&lt;/td&gt;
&lt;td&gt;Shows "unknown macro"&lt;/td&gt;
&lt;td&gt;Pages keep rendering&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  1. Style a section with custom CSS
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;When you need it:&lt;/strong&gt; a landing page for your space, a styled call-out, a grid of link cards, or brand colors that the built-in panels don't offer.&lt;/p&gt;

&lt;p&gt;One thing to know first: CSS in an HTML macro styles &lt;strong&gt;what is inside the macro&lt;/strong&gt;, not the whole Confluence page. That's by design, because the macro renders in its own sandboxed frame. It means your styles can't break the Confluence UI, and Confluence's styles can't break yours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTML&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"cards"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/wiki/spaces/ENG/pages/onboarding"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card-kicker"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Start here&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h3&amp;gt;&lt;/span&gt;Engineering onboarding&lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Accounts, tools and your first week.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/wiki/spaces/ENG/pages/runbooks"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card-kicker"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;On call&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h3&amp;gt;&lt;/span&gt;Runbooks&lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Step-by-step fixes for common incidents.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"/wiki/spaces/ENG/pages/architecture"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card-kicker"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Reference&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h3&amp;gt;&lt;/span&gt;Architecture&lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;How our services fit together.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;CSS&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.cards&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;grid-template-columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auto-fit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;minmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;200px&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="py"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;-apple-system&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;BlinkMacSystemFont&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;"Segoe UI"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#dfe1e6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#172b4d&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;text-decoration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;border-color&lt;/span&gt; &lt;span class="m"&gt;0.15s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;box-shadow&lt;/span&gt; &lt;span class="m"&gt;0.15s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.card&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;border-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#0c66e4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;66&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.12&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.card-kicker&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;600&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;text-transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;uppercase&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;letter-spacing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.04em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#0c66e4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="nt"&gt;h3&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;17px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;14px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#44546f&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Links inside the macro open through Confluence's own navigation, so internal &lt;code&gt;/wiki/...&lt;/code&gt; links behave like normal page links.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Embed videos, maps and design files
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;When you need it:&lt;/strong&gt; a product demo video next to the release notes, an office map on the "Getting here" page, a Figma prototype in the design spec.&lt;/p&gt;

&lt;p&gt;The built-in iFrame macro works when the site allows embedding and you only need the embed itself. An HTML macro helps when you want the embed wrapped in your own layout, such as a responsive 16:9 frame with a caption, or several embeds side by side.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTML&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;figure&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"embed"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"frame"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;iframe&lt;/span&gt;
      &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://www.youtube.com/embed/VIDEO_ID"&lt;/span&gt;
      &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"Release 4.2 walkthrough"&lt;/span&gt;
      &lt;span class="na"&gt;allowfullscreen&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;figcaption&amp;gt;&lt;/span&gt;Release 4.2 walkthrough (6 minutes)&lt;span class="nt"&gt;&amp;lt;/figcaption&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/figure&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;CSS&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.embed&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.frame&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;relative&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;aspect-ratio&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt; &lt;span class="m"&gt;9&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;overflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;hidden&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#091e42&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.frame&lt;/span&gt; &lt;span class="nt"&gt;iframe&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;absolute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;inset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;figcaption&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;margin-top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;13px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#44546f&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace &lt;code&gt;VIDEO_ID&lt;/code&gt; with your video's ID. In HTML Macro+, unless your admin allows all domains, &lt;code&gt;youtube.com&lt;/code&gt; must be on the domain whitelist; until it is, the frame shows a "Content blocked" placeholder. The same applies to &lt;code&gt;google.com&lt;/code&gt; for Maps and &lt;code&gt;figma.com&lt;/code&gt; for Figma. See &lt;a href="https://dev.to/docs/html-macro-for-confluence/configuration/security-settings"&gt;security settings&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Show an existing HTML file on the page
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;When you need it:&lt;/strong&gt; you already have HTML output from another tool, like a test coverage report, a notebook exported to HTML, a generated API reference or a one-page prototype. Attached to a page, it's just a download link that most readers never open.&lt;/p&gt;

&lt;p&gt;HTML Macro+ includes an &lt;strong&gt;HTML from Attachment&lt;/strong&gt; macro for this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Attach the &lt;code&gt;.html&lt;/code&gt; file to the Confluence page, or upload it from your computer in the macro.&lt;/li&gt;
&lt;li&gt;Insert the &lt;strong&gt;HTML from Attachment&lt;/strong&gt; macro and pick the file.&lt;/li&gt;
&lt;li&gt;Publish. The file renders on the page, sized to its content, with the same security rules as any other macro.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When the report is regenerated, replace the attachment to show the new version, with no copying and pasting of generated code.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Add interactivity with JavaScript
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;When you need it:&lt;/strong&gt; content that's easier to read when readers can switch or filter it, such as tabs for different operating systems, a filterable list, a calculator or a chart.&lt;/p&gt;

&lt;p&gt;Here's a small tabbed panel. The same pattern works for any "show one of several" content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTML&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"tabs"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"tab-buttons"&lt;/span&gt; &lt;span class="na"&gt;role=&lt;/span&gt;&lt;span class="s"&gt;"tablist"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"active"&lt;/span&gt; &lt;span class="na"&gt;data-tab=&lt;/span&gt;&lt;span class="s"&gt;"mac"&lt;/span&gt; &lt;span class="na"&gt;role=&lt;/span&gt;&lt;span class="s"&gt;"tab"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;macOS&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;data-tab=&lt;/span&gt;&lt;span class="s"&gt;"windows"&lt;/span&gt; &lt;span class="na"&gt;role=&lt;/span&gt;&lt;span class="s"&gt;"tab"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Windows&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;data-tab=&lt;/span&gt;&lt;span class="s"&gt;"linux"&lt;/span&gt; &lt;span class="na"&gt;role=&lt;/span&gt;&lt;span class="s"&gt;"tab"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Linux&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"tab-panel active"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"mac"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Install with Homebrew: &lt;span class="nt"&gt;&amp;lt;code&amp;gt;&lt;/span&gt;brew install our-cli&lt;span class="nt"&gt;&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"tab-panel"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"windows"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Install with winget: &lt;span class="nt"&gt;&amp;lt;code&amp;gt;&lt;/span&gt;winget install OurCo.Cli&lt;span class="nt"&gt;&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"tab-panel"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"linux"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Install with apt: &lt;span class="nt"&gt;&amp;lt;code&amp;gt;&lt;/span&gt;sudo apt install our-cli&lt;span class="nt"&gt;&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;CSS&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.tabs&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;-apple-system&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;BlinkMacSystemFont&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;"Segoe UI"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.tab-buttons&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="py"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;border-bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#dfe1e6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.tab-buttons&lt;/span&gt; &lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt; &lt;span class="m"&gt;14px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="nb"&gt;transparent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;14px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#44546f&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;pointer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.tab-buttons&lt;/span&gt; &lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="nc"&gt;.active&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#0c66e4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;border-bottom-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#0c66e4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;600&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.tab-panel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;14px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.tab-panel.active&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;code&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#f1f2f4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt; &lt;span class="m"&gt;6px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;JavaScript&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.tab-buttons button&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;document&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.tab-buttons button, .tab-panel&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;active&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;active&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tab&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;active&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For bigger examples, see &lt;a href="https://dev.to/blogs/how-to-embed-interactive-charts-confluence-html-macro"&gt;how to embed interactive charts with Chart.js&lt;/a&gt; and &lt;a href="https://dev.to/blogs/how-to-build-custom-status-dashboard-confluence"&gt;how to build a status dashboard&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Keep migrated Data Center HTML pages working
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;When you need it:&lt;/strong&gt; you're moving from Confluence Server or Data Center, and some pages were built with the HTML macro. After migration, those pages show an "unknown macro" error in Cloud.&lt;/p&gt;

&lt;p&gt;HTML Macro+ recognizes both the Server/Data Center HTML macro and the Macro Toolbox for Cloud HTML macro. Once it's installed on your Cloud site, migrated pages render again without editing them one by one. You can then scan a space for the old macros, preview what will change, and convert them in bulk to the current macro. Pages stay live throughout.&lt;/p&gt;

&lt;p&gt;Before migrating, check which HTML macros use external scripts or images. Those domains need to be whitelisted in Cloud, or the content will show as blocked.&lt;/p&gt;




&lt;h2&gt;
  
  
  HTML macro not working?
&lt;/h2&gt;

&lt;p&gt;Most problems come down to a domain that isn't whitelisted, a script that runs before the page is ready, or restricted editor access. The &lt;a href="https://dev.to/docs/html-macro-for-confluence/troubleshooting"&gt;troubleshooting guide&lt;/a&gt; walks through each fix.&lt;/p&gt;




&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Can Confluence Cloud render HTML?&lt;/strong&gt;&lt;br&gt;
Not natively. Confluence Cloud has no HTML macro. You can embed other web pages with the iFrame macro, or install an HTML macro app to render your own HTML, CSS and JavaScript.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why doesn't Confluence Cloud have an HTML macro?&lt;/strong&gt;&lt;br&gt;
Letting any editor run their own code on a page is a security risk, especially cross-site scripting. HTML macro apps handle this by rendering code in a sandboxed frame and letting admins control which external sites can load.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I paste HTML into the Confluence editor?&lt;/strong&gt;&lt;br&gt;
Pasting copied web content keeps much of its formatting, but pasting raw HTML code shows it as text. To have code rendered, put it in an HTML macro.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is it safe to use JavaScript in Confluence Cloud?&lt;/strong&gt;&lt;br&gt;
It depends on the app. Look for sandboxed rendering, an admin-controlled domain whitelist, and editor permissions so only trusted people can change code. HTML Macro+ has all three, and runs on Atlassian Forge, so content stays inside Atlassian.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does CSS in the macro change the rest of my Confluence page?&lt;/strong&gt;&lt;br&gt;
No. Styles apply only to the content inside the macro.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://dev.to/products/html-macro-for-confluence"&gt;HTML Macro+ for Confluence&lt;/a&gt; is free on the Atlassian Marketplace. Start with the &lt;a href="https://dev.to/docs/html-macro-for-confluence/getting-started/installation"&gt;installation guide&lt;/a&gt;, then try any example above.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.atlassian.com/apps/1670180315/html-macro-for-confluence?hosting=cloud&amp;amp;tab=overview" rel="noopener noreferrer"&gt;Install HTML Macro+ — free on the Atlassian Marketplace&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>What Confluence's Built-In PDF Export Can't Do</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Wed, 23 Sep 2026 09:27:29 +0000</pubDate>
      <link>https://dev.to/yamuno-software/what-confluences-built-in-pdf-export-cant-do-3oke</link>
      <guid>https://dev.to/yamuno-software/what-confluences-built-in-pdf-export-cant-do-3oke</guid>
      <description>&lt;h1&gt;
  
  
  What Confluence's Built-In PDF Export Can't Do
&lt;/h1&gt;

&lt;p&gt;Confluence's native PDF export is fine when you need one page as a quick PDF. The moment you need more than that, a set of pages, a branded document, or a consistent format, you run into its limits fast. This is an honest list of what the built-in export cannot do, so you can tell when you have outgrown it.&lt;/p&gt;

&lt;p&gt;None of this is a knock on Confluence. The native export is a convenience feature, not a document tool. Knowing where it stops is the fastest way to decide whether you need something more.&lt;/p&gt;




&lt;h2&gt;
  
  
  It Exports One Page at a Time
&lt;/h2&gt;

&lt;p&gt;This is the big one. Native export is built around a single page. There is no way to select several pages, export a parent page together with all of its children, or export a whole space to PDF in one action.&lt;/p&gt;

&lt;p&gt;If you need to turn a 40-page documentation set into PDFs, native export means opening each page and exporting it individually, then dealing with 40 separate files. For anything beyond a handful of pages, that stops being practical.&lt;/p&gt;




&lt;h2&gt;
  
  
  No Cover Page
&lt;/h2&gt;

&lt;p&gt;There is no option to add a title page, a logo, a subtitle, or a document date to the front of the export. The PDF starts straight at the page content. For an internal draft that is fine. For a document going to a client or an executive, the missing cover is the first thing people notice.&lt;/p&gt;




&lt;h2&gt;
  
  
  No Custom Headers, Footers, or Page Numbers
&lt;/h2&gt;

&lt;p&gt;Native export gives you no control over headers and footers. You cannot add your company name, a document title, a confidentiality line, the export date, or page numbers. Everything a formal document usually carries in the margins is simply absent.&lt;/p&gt;




&lt;h2&gt;
  
  
  No Watermarks
&lt;/h2&gt;

&lt;p&gt;There is no way to stamp a PDF with "DRAFT", "CONFIDENTIAL", or "FOR REVIEW". For teams that share documents externally or work under compliance rules, a watermark is often a requirement rather than a nicety, and native export does not offer one.&lt;/p&gt;




&lt;h2&gt;
  
  
  No Reusable Templates
&lt;/h2&gt;

&lt;p&gt;Every native export is a one-off. There is no way to save a format and apply it again, so two exports of the same page a week apart can look different, and two people on the same team have no shared standard to work from. Consistency has to be enforced by hand, which means it usually is not.&lt;/p&gt;




&lt;h2&gt;
  
  
  No Table of Contents
&lt;/h2&gt;

&lt;p&gt;A single-page native export has no navigation. There is no auto-generated table of contents built from your headings, which is exactly what a longer document needs to be readable once it is a PDF.&lt;/p&gt;




&lt;h2&gt;
  
  
  Limited Control Over Layout
&lt;/h2&gt;

&lt;p&gt;Native export gives you no say over fonts, margins, line spacing, or page breaks. Wide tables and large images are handled with whatever defaults Confluence applies, and you cannot adjust them. When the output does not fit the page well, there is no setting to fix it.&lt;/p&gt;




&lt;h2&gt;
  
  
  When You've Outgrown Native Export
&lt;/h2&gt;

&lt;p&gt;If you only ever export the occasional single page for your own use, the built-in export is genuinely all you need, and there is no reason to add an app.&lt;/p&gt;

&lt;p&gt;You have outgrown it the moment any of these becomes true:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need to export &lt;strong&gt;more than a few pages at once&lt;/strong&gt;, or a whole space&lt;/li&gt;
&lt;li&gt;The PDF is &lt;strong&gt;going to someone outside your team&lt;/strong&gt;, so it needs a cover and branding&lt;/li&gt;
&lt;li&gt;You are exporting for &lt;strong&gt;compliance or retention&lt;/strong&gt;, so it needs watermarks, page numbers, and a repeatable format&lt;/li&gt;
&lt;li&gt;You want &lt;strong&gt;every export to look the same&lt;/strong&gt;, which means templates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the point where a dedicated export tool earns its place. &lt;a href="https://marketplace.atlassian.com/apps/726790413" rel="noopener noreferrer"&gt;PDF Exporter for Confluence&lt;/a&gt; adds exactly what the native export leaves out: bulk export of multiple pages, page trees, and whole spaces; cover pages, headers, footers, and watermarks; a table of contents; and reusable templates so every export is consistent. It runs on Atlassian Forge, so nothing leaves your instance.&lt;/p&gt;

&lt;p&gt;For a step-by-step walkthrough, see &lt;a href="https://dev.to/blogs/how-to-export-confluence-to-pdf"&gt;How to Export Confluence Pages to PDF&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;Install &lt;a href="https://marketplace.atlassian.com/apps/726790413" rel="noopener noreferrer"&gt;PDF Exporter for Confluence&lt;/a&gt; from the Atlassian Marketplace.&lt;/p&gt;

&lt;p&gt;Full documentation is at &lt;a href="https://dev.to/docs/pdf-exporter-for-confluence"&gt;/docs/pdf-exporter-for-confluence&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Questions? Reach out via our &lt;a href="https://yamuno.atlassian.net/servicedesk/customer/portals" rel="noopener noreferrer"&gt;support portal&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How Compliance Teams Export Confluence Content to PDF</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Wed, 29 Jul 2026 10:41:07 +0000</pubDate>
      <link>https://dev.to/yamuno-software/how-compliance-teams-export-confluence-content-to-pdf-25k0</link>
      <guid>https://dev.to/yamuno-software/how-compliance-teams-export-confluence-content-to-pdf-25k0</guid>
      <description>&lt;h1&gt;
  
  
  How Compliance Teams Export Confluence Content to PDF
&lt;/h1&gt;

&lt;p&gt;Compliance teams deal with a recurring documentation challenge: processes, policies, and controls are maintained in Confluence (where they're easy to update and collaborate on), but auditors, regulators, and legal teams need point-in-time PDF snapshots they can review, sign off on, or attach to a submission.&lt;/p&gt;

&lt;p&gt;Confluence's native PDF export works for basic cases but has no provisions for the requirements that matter in compliance contexts: consistent formatting across all exported documents, watermarks for draft and confidential status, a clear record of what was exported and when, and reusable templates that ensure every export looks the same regardless of who ran it.&lt;/p&gt;

&lt;p&gt;This guide covers how to set up a compliant export workflow using &lt;a href="https://marketplace.atlassian.com/apps/726790413" rel="noopener noreferrer"&gt;PDF Exporter for Confluence&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Core Requirements for Compliance Exports
&lt;/h2&gt;

&lt;p&gt;Before configuring anything, it helps to be specific about what compliance exports actually need:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consistency&lt;/strong&gt; — every exported document should look the same. If an auditor compares two policy documents and they have different headers, different page layouts, or different cover pages, it raises questions about process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Document identification&lt;/strong&gt; — the PDF should identify itself: what it is, who produced it, what classification it carries (confidential, internal, public). This information should be in the header, footer, or cover page — not just in the filename.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Watermarks where required&lt;/strong&gt; — draft documents under review must be marked as drafts. Confidential documents must be visibly marked. Documents that have been superseded should carry an "ARCHIVED" watermark.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Completeness&lt;/strong&gt; — when a compliance submission requires a set of documents (all policies in a space, all runbooks for a system), the export should cover the complete set, not a manually assembled selection that could be incomplete.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1 — Set Up Compliance Templates
&lt;/h2&gt;

&lt;p&gt;Create dedicated templates for compliance use cases. Log into Confluence as an admin, go to &lt;strong&gt;Settings → PDF Exporter → Templates&lt;/strong&gt;, and create the following:&lt;/p&gt;

&lt;h3&gt;
  
  
  Template 1: "Policy — Current"
&lt;/h3&gt;

&lt;p&gt;For active, approved policies shared with auditors or regulators.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cover style:&lt;/strong&gt; Executive (minimal, formal)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accent color:&lt;/strong&gt; Company primary color&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logo:&lt;/strong&gt; Company logo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Author:&lt;/strong&gt; "Compliance Team" or department name&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Header:&lt;/strong&gt; Document title, centered&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Footer (left):&lt;/strong&gt; "Confidential — [Company Name]"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Footer (right):&lt;/strong&gt; Page number (&lt;code&gt;Page 1 of 10&lt;/code&gt; format)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watermark:&lt;/strong&gt; Disabled&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Table of contents:&lt;/strong&gt; Enabled, depth 2&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Page breaks:&lt;/strong&gt; Before H1&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Template 2: "Policy — Draft"
&lt;/h3&gt;

&lt;p&gt;For documents under internal review before approval.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Same as "Policy — Current" except:&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watermark:&lt;/strong&gt; Enabled, text "DRAFT", opacity 0.20&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subtitle:&lt;/strong&gt; "For Internal Review Only"&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Template 3: "Compliance Archive"
&lt;/h3&gt;

&lt;p&gt;For historical snapshots being archived or submitted as evidence of past state.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Same as "Policy — Current" except:&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watermark:&lt;/strong&gt; Enabled, text "ARCHIVED", opacity 0.15&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Footer (left):&lt;/strong&gt; "Archived — [Company Name] — [Date]"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note: the footer date needs to be manually updated when creating each archive export, since templates don't have dynamic date fields.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2 — Export Individual Policies
&lt;/h2&gt;

&lt;p&gt;For exporting a single policy document:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the policy page in Confluence&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;•••&lt;/strong&gt; → &lt;strong&gt;Export to PDF&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Select the appropriate template ("Policy — Current" for finalized, "Policy — Draft" for review)&lt;/li&gt;
&lt;li&gt;Use the &lt;strong&gt;Preview&lt;/strong&gt; option to verify the cover page, watermark, and footer before downloading&lt;/li&gt;
&lt;li&gt;Download the PDF&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The preview step is important for compliance exports — it takes 15 seconds and catches issues (wrong watermark status, missing logo) that would be unprofessional in a submission.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3 — Export a Complete Policy Set
&lt;/h2&gt;

&lt;p&gt;When an audit requires a complete set of documents — all security policies, all change management procedures, all GDPR-related documentation — use the space export to capture everything in scope.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;From the Confluence global navigation, open &lt;strong&gt;Apps → PDF Exporter for Confluence&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The page tree for the current space is displayed&lt;/li&gt;
&lt;li&gt;Navigate the tree and select all pages in scope&lt;/li&gt;
&lt;li&gt;Uncheck any pages that are internal working drafts not intended for the submission&lt;/li&gt;
&lt;li&gt;Select the "Policy — Current" template&lt;/li&gt;
&lt;li&gt;Export&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The download is a ZIP file containing one PDF per page. The ZIP structure mirrors the Confluence page hierarchy — auditors can navigate it like a folder structure.&lt;/p&gt;

&lt;p&gt;If the submission requires a single combined document rather than individual PDFs, export a parent page with all child pages included — the output is still individual PDFs per page, but they can be manually combined using any PDF tool if a single-file format is required.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4 — Archive Snapshots
&lt;/h2&gt;

&lt;p&gt;Compliance often requires preserving point-in-time snapshots of policies — what did the data retention policy say on January 1, 2026? The page in Confluence may have been updated since then.&lt;/p&gt;

&lt;p&gt;The workflow for archive snapshots:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;When a policy is approved, export it immediately using the "Policy — Current" template&lt;/li&gt;
&lt;li&gt;Store the PDF in a designated archive location (shared drive, document management system)&lt;/li&gt;
&lt;li&gt;When the policy is updated and re-approved, export the updated version and archive the previous one using the "Compliance Archive" template (which adds the ARCHIVED watermark)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This gives you a complete versioned record: the current approved policy in Confluence, and a series of archived PDFs showing the policy's state at each approval milestone.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5 — Document the Export Process Itself
&lt;/h2&gt;

&lt;p&gt;For audits where the reviewer may ask "how do you ensure the exported documents are accurate?", document the export process itself in Confluence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which templates are used for which document types&lt;/li&gt;
&lt;li&gt;Who is authorized to run compliance exports&lt;/li&gt;
&lt;li&gt;How and where archived PDFs are stored&lt;/li&gt;
&lt;li&gt;The review/preview step that happens before each export&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This process documentation can itself be exported to PDF using the same templates. An auditor asking "what's your document control process?" gets a PDF produced by the same process it describes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Compliance Scenarios
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;SOC 2 audit preparation:&lt;/strong&gt; Export all security policies (access control, change management, incident response, business continuity) using the "Policy — Current" template. The cover page identifies the document; the consistent header and footer identify the producing organization; the table of contents makes it navigable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GDPR documentation submission:&lt;/strong&gt; Export privacy policy, data processing agreements, and DPIA records. Use the "Policy — Current" template. Ensure the footer carries the confidentiality classification appropriate for GDPR documentation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ISO 27001 evidence collection:&lt;/strong&gt; Export control documentation, risk assessment records, and procedure documents. For evidence of past state ("what did your risk assessment look like during the audit period?"), use archived snapshots from the archive workflow above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Legal hold:&lt;/strong&gt; When content in Confluence becomes subject to a legal hold, export the relevant pages immediately using the "Compliance Archive" template and store them outside Confluence where they can be produced on request.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://marketplace.atlassian.com/apps/726790413" rel="noopener noreferrer"&gt;Install PDF Exporter for Confluence →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/docs/pdf-exporter-for-confluence"&gt;Read the documentation →&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to Bulk Import Markdown Files into Confluence</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Thu, 23 Jul 2026 10:24:54 +0000</pubDate>
      <link>https://dev.to/yamuno-software/how-to-bulk-import-markdown-files-into-confluence-1pgn</link>
      <guid>https://dev.to/yamuno-software/how-to-bulk-import-markdown-files-into-confluence-1pgn</guid>
      <description>&lt;h1&gt;
  
  
  How to Bulk Import Markdown Files into Confluence
&lt;/h1&gt;

&lt;p&gt;If you're migrating documentation from GitHub, GitLab, Notion, or a static site generator, you're probably looking at more than a handful of markdown files. Importing them one at a time into Confluence isn't viable at scale. This guide covers how to bulk import — dozens or hundreds of files at once — with the page hierarchy, images, and formatting preserved.&lt;/p&gt;




&lt;h2&gt;
  
  
  What "Bulk Import" Means in Practice
&lt;/h2&gt;

&lt;p&gt;A bulk import takes a ZIP archive containing markdown files and a folder structure, and creates a matching set of Confluence pages with the same hierarchy. A folder in the ZIP becomes a parent page in Confluence. A markdown file becomes a Confluence page. Images referenced in the markdown are uploaded as attachments and linked correctly in the page content.&lt;/p&gt;

&lt;p&gt;The result: a ZIP with 80 files becomes 80 Confluence pages in the right hierarchy without anyone touching each one individually.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1 — Prepare Your Markdown Files
&lt;/h2&gt;

&lt;p&gt;Install &lt;a href="https://marketplace.atlassian.com/apps/1228589694" rel="noopener noreferrer"&gt;Markdown Importer for Confluence&lt;/a&gt; from the Atlassian Marketplace.&lt;/p&gt;

&lt;p&gt;Before creating the ZIP, organize your markdown files in the folder structure you want reflected in Confluence:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docs/
├── getting-started.md
├── installation.md
├── configuration/
│   ├── basic-setup.md
│   ├── advanced-options.md
│   └── environment-variables.md
├── how-to/
│   ├── first-steps.md
│   └── common-tasks.md
└── reference/
    ├── api.md
    └── cli.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each folder will become a parent page in Confluence. The nesting can be as deep as you need.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;File naming:&lt;/strong&gt; The importer uses the markdown filename (without the &lt;code&gt;.md&lt;/code&gt; extension) as the Confluence page title. Hyphens are replaced with spaces and the first letter is capitalized — &lt;code&gt;getting-started.md&lt;/code&gt; becomes "Getting Started." If a file has a &lt;code&gt;title&lt;/code&gt; field in its frontmatter, that takes precedence over the filename.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2 — Add Frontmatter (Optional but Recommended)
&lt;/h2&gt;

&lt;p&gt;YAML frontmatter at the top of each markdown file gives the importer more information to work with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Advanced&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Configuration&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Options"&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="c1"&gt;# Advanced Configuration Options&lt;/span&gt;

&lt;span class="s"&gt;Rest of the content...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a &lt;code&gt;title&lt;/code&gt; is present, the importer uses it as the Confluence page title. This lets you have descriptive filenames in the repo while setting human-readable titles in Confluence.&lt;/p&gt;

&lt;p&gt;Other frontmatter fields are not processed by the importer but are preserved if you later export back to markdown.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3 — Include Images in the ZIP
&lt;/h2&gt;

&lt;p&gt;If your markdown files reference local images, include them in the ZIP alongside the markdown files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docs/
├── getting-started.md          # references ./images/screenshot.png
├── images/
│   └── screenshot.png
└── reference/
    ├── api.md                  # references ../images/api-flow.png
    └── cli.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Image references in the markdown should be relative paths:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;![&lt;/span&gt;&lt;span class="nv"&gt;Screenshot&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;./images/screenshot.png&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The importer uploads the images as Confluence attachments and updates the references in the page content to point to the uploaded attachments. The relative path structure is resolved relative to the markdown file's location in the ZIP.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4 — Create the ZIP Archive
&lt;/h2&gt;

&lt;p&gt;On macOS or Linux:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /path/to/your
zip &lt;span class="nt"&gt;-r&lt;/span&gt; docs-import.zip docs/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Windows (PowerShell):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Compress-Archive&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;\docs\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-DestinationPath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;\docs-import.zip&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The ZIP should contain the root folder (&lt;code&gt;docs/&lt;/code&gt;), not just the contents. This preserves the top-level folder name, which becomes the title of the root-level parent page if you're importing the whole tree.&lt;/p&gt;

&lt;p&gt;If you'd rather the import start with the contents of the folder (not the folder itself as a parent page), zip the contents directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /path/to/your/docs
zip &lt;span class="nt"&gt;-r&lt;/span&gt; ../docs-import.zip &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 5 — Import the ZIP
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Navigate to the Confluence page that should be the parent of the imported content&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;•••&lt;/strong&gt; (More actions) → &lt;strong&gt;Markdown Importer &amp;amp; Exporter&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Upload&lt;/strong&gt; and select your ZIP archive&lt;/li&gt;
&lt;li&gt;Configure the import options:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Page Hierarchy&lt;/strong&gt; — enable this to create parent/child pages from the folder structure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overwrite existing pages&lt;/strong&gt; — enable if you're re-importing and want to update pages that already exist&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Import&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A progress indicator shows pages being processed. For large imports (100+ pages), this may take a few minutes. The importer processes pages in small batches to avoid hitting Confluence API rate limits.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 6 — Import from the Global Apps Menu (Multiple Spaces)
&lt;/h2&gt;

&lt;p&gt;If you're importing into multiple Confluence spaces in one operation, use the global access point instead of the page-level entry:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;Apps&lt;/strong&gt; in the Confluence global navigation&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Markdown Importer &amp;amp; Exporter&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Choose the target space and parent page from the dropdowns&lt;/li&gt;
&lt;li&gt;Upload your ZIP and configure options&lt;/li&gt;
&lt;li&gt;Import&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Admins can use this to import documentation across multiple spaces without navigating to each target page individually.&lt;/p&gt;




&lt;h2&gt;
  
  
  Handling Large Imports
&lt;/h2&gt;

&lt;p&gt;For very large imports (500+ pages), consider splitting the ZIP by section and importing in batches. This makes it easier to review the output after each batch and fix any issues before continuing.&lt;/p&gt;

&lt;p&gt;After the first batch, check a few imported pages to verify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Page titles are correct&lt;/li&gt;
&lt;li&gt;Images are displaying (not showing broken links)&lt;/li&gt;
&lt;li&gt;The hierarchy is correct in the page tree&lt;/li&gt;
&lt;li&gt;Formatting (code blocks, tables, headings) rendered properly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If something is off, it's usually a consistent issue (like image paths being wrong) that you can fix across all remaining files before the next batch.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Issues
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Broken image references:&lt;/strong&gt; Usually caused by images being outside the ZIP or using absolute paths instead of relative paths. Fix the markdown to use relative paths and ensure images are inside the ZIP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wrong page titles:&lt;/strong&gt; The filename is being used instead of frontmatter. Add &lt;code&gt;title:&lt;/code&gt; frontmatter to the affected files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hierarchy not matching the folder structure:&lt;/strong&gt; Page Hierarchy option was not enabled during import. Re-import with the option enabled — use "Overwrite" to update the existing pages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Import stops partway through:&lt;/strong&gt; Likely a rate limit from the Confluence API. Wait a few minutes and re-import the remaining files. Use "Overwrite" so already-imported pages are updated rather than duplicated.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://marketplace.atlassian.com/apps/1228589694" rel="noopener noreferrer"&gt;Install Markdown Importer for Confluence →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/docs/markdown-importer-for-confluence"&gt;Read the documentation →&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to Build a Custom Status Dashboard in Confluence</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Sat, 18 Jul 2026 09:35:48 +0000</pubDate>
      <link>https://dev.to/yamuno-software/how-to-build-a-custom-status-dashboard-in-confluence-1228</link>
      <guid>https://dev.to/yamuno-software/how-to-build-a-custom-status-dashboard-in-confluence-1228</guid>
      <description>&lt;h1&gt;
  
  
  How to Build a Custom Status Dashboard in Confluence
&lt;/h1&gt;

&lt;p&gt;Project status pages in Confluence often end up as paragraphs of text that nobody reads. A wall of prose with a last-updated date from three weeks ago doesn't communicate project health — it communicates that someone was busy when they wrote it.&lt;/p&gt;

&lt;p&gt;A visual status dashboard that shows RAG indicators, progress percentages, and days until key milestones is faster to read and easier to maintain. This guide walks through building one using &lt;a href="https://marketplace.atlassian.com/apps/1670180315/html-macro-for-confluence-free?hosting=cloud&amp;amp;tab=overview" rel="noopener noreferrer"&gt;HTML Macro for Confluence&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What We're Building
&lt;/h2&gt;

&lt;p&gt;A status dashboard with four components:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;RAG status cards&lt;/strong&gt; — one per workstream, color-coded by health&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Progress bars&lt;/strong&gt; — percentage complete for each initiative&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Milestone countdown&lt;/strong&gt; — days until the next key date&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Metric tiles&lt;/strong&gt; — key numbers at a glance&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each component is a separate HTML Macro on the page. You can use all four or just the ones that fit your context.&lt;/p&gt;




&lt;h2&gt;
  
  
  Component 1 — RAG Status Cards
&lt;/h2&gt;

&lt;p&gt;A row of status cards, one per workstream. Color-coded: green = on track, amber = at risk, red = blocked.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"display:flex; gap:16px; flex-wrap:wrap; font-family:sans-serif;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"flex:1; min-width:180px; padding:20px; border-radius:12px; background:#f0fdf4; border:1px solid #86efac;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-size:12px; font-weight:600; text-transform:uppercase; letter-spacing:0.08em; color:#15803d; margin-bottom:8px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Backend API&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"display:flex; align-items:center; gap:8px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"width:12px; height:12px; border-radius:50%; background:#22c55e; box-shadow:0 0 6px #22c55e88;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-size:15px; font-weight:700; color:#1e293b;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;On Track&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"margin-top:8px; font-size:13px; color:#64748b;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Sprint 3 of 4 complete&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"flex:1; min-width:180px; padding:20px; border-radius:12px; background:#fffbeb; border:1px solid #fcd34d;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-size:12px; font-weight:600; text-transform:uppercase; letter-spacing:0.08em; color:#92400e; margin-bottom:8px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Mobile App&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"display:flex; align-items:center; gap:8px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"width:12px; height:12px; border-radius:50%; background:#f59e0b; box-shadow:0 0 6px #f59e0b88;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-size:15px; font-weight:700; color:#1e293b;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;At Risk&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"margin-top:8px; font-size:13px; color:#64748b;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Design review delayed 3 days&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"flex:1; min-width:180px; padding:20px; border-radius:12px; background:#fef2f2; border:1px solid #fca5a5;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-size:12px; font-weight:600; text-transform:uppercase; letter-spacing:0.08em; color:#b91c1c; margin-bottom:8px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Integrations&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"display:flex; align-items:center; gap:8px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"width:12px; height:12px; border-radius:50%; background:#ef4444; box-shadow:0 0 6px #ef444488;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-size:15px; font-weight:700; color:#1e293b;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Blocked&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"margin-top:8px; font-size:13px; color:#64748b;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Waiting on vendor API access&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;To update a status:&lt;/strong&gt; change &lt;code&gt;#22c55e&lt;/code&gt; → &lt;code&gt;#f59e0b&lt;/code&gt; → &lt;code&gt;#ef4444&lt;/code&gt; on both the dot color and the card background/border colors, and update the label and note text.&lt;/p&gt;




&lt;h2&gt;
  
  
  Component 2 — Progress Bars
&lt;/h2&gt;

&lt;p&gt;Visual progress indicators for each initiative. The percentage is shown as a filled bar with a label.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-family:sans-serif; max-width:560px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"margin-bottom:18px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"display:flex; justify-content:space-between; margin-bottom:6px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-size:14px; font-weight:600; color:#1e293b;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Backend API&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-size:14px; font-weight:700; color:#6366f1;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;75%&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"background:#e2e8f0; border-radius:99px; height:8px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"background:#6366f1; width:75%; height:8px; border-radius:99px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"margin-bottom:18px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"display:flex; justify-content:space-between; margin-bottom:6px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-size:14px; font-weight:600; color:#1e293b;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Mobile App&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-size:14px; font-weight:700; color:#f59e0b;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;48%&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"background:#e2e8f0; border-radius:99px; height:8px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"background:#f59e0b; width:48%; height:8px; border-radius:99px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"margin-bottom:18px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"display:flex; justify-content:space-between; margin-bottom:6px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-size:14px; font-weight:600; color:#1e293b;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Integrations&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-size:14px; font-weight:700; color:#ef4444;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;20%&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"background:#e2e8f0; border-radius:99px; height:8px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"background:#ef4444; width:20%; height:8px; border-radius:99px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;To update:&lt;/strong&gt; change the &lt;code&gt;width&lt;/code&gt; percentage on the filled div and the number in the label. Match the bar color to the RAG status from Component 1.&lt;/p&gt;




&lt;h2&gt;
  
  
  Component 3 — Milestone Countdown
&lt;/h2&gt;

&lt;p&gt;A JavaScript countdown to the next key date.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-family:sans-serif; display:inline-flex; align-items:center; gap:24px; padding:20px 28px; background:#f8fafc; border:1px solid #e2e8f0; border-radius:14px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-size:12px; font-weight:600; text-transform:uppercase; letter-spacing:0.08em; color:#64748b; margin-bottom:4px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Launch Date&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-size:14px; color:#1e293b; font-weight:500;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;August 15, 2026&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"display:flex; gap:16px; text-align:center;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"cd-days"&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-size:40px; font-weight:800; color:#1e293b; line-height:1;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;--&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-size:11px; color:#94a3b8; text-transform:uppercase; letter-spacing:0.06em; margin-top:3px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Days&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-size:32px; color:#e2e8f0; font-weight:300; padding-top:4px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;:&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"cd-hours"&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-size:40px; font-weight:800; color:#1e293b; line-height:1;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;--&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-size:11px; color:#94a3b8; text-transform:uppercase; letter-spacing:0.06em; margin-top:3px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Hours&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;target&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2026-08-15T09:00:00&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;tick&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;target&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cd-days&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cd-hours&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cd-days&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;86400000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cd-hours&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;86400000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;3600000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nf"&gt;tick&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nf"&gt;setInterval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tick&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Change the date string in &lt;code&gt;new Date("2026-08-15T09:00:00")&lt;/code&gt; to your actual milestone date.&lt;/p&gt;




&lt;h2&gt;
  
  
  Component 4 — Metric Tiles
&lt;/h2&gt;

&lt;p&gt;Key numbers at a glance — open issues, completed stories, team size, or any other project metric.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"display:flex; gap:16px; flex-wrap:wrap; font-family:sans-serif;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"flex:1; min-width:140px; padding:20px; border-radius:12px; background:#fff; border:1px solid #e2e8f0; text-align:center;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-size:36px; font-weight:800; color:#6366f1;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;34&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-size:13px; color:#64748b; margin-top:4px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Issues Closed&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"flex:1; min-width:140px; padding:20px; border-radius:12px; background:#fff; border:1px solid #e2e8f0; text-align:center;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-size:36px; font-weight:800; color:#22c55e;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;12&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-size:13px; color:#64748b; margin-top:4px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Open Bugs&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"flex:1; min-width:140px; padding:20px; border-radius:12px; background:#fff; border:1px solid #e2e8f0; text-align:center;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-size:36px; font-weight:800; color:#f59e0b;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;3&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-size:13px; color:#64748b; margin-top:4px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Blocked Items&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"flex:1; min-width:140px; padding:20px; border-radius:12px; background:#fff; border:1px solid #e2e8f0; text-align:center;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-size:36px; font-weight:800; color:#1e293b;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;8&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-size:13px; color:#64748b; margin-top:4px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Team Members&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;To update:&lt;/strong&gt; change the number inside the large &lt;code&gt;div&lt;/code&gt; and the label below it. Update the color to reflect the health of the metric if relevant (green for good, amber for concerning, red for problem).&lt;/p&gt;




&lt;h2&gt;
  
  
  Putting It Together
&lt;/h2&gt;

&lt;p&gt;On the Confluence page, add four HTML Macro blocks stacked vertically:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;RAG Status Cards&lt;/strong&gt; at the top&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Metric Tiles&lt;/strong&gt; below&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Progress Bars&lt;/strong&gt; in the middle&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Milestone Countdown&lt;/strong&gt; at the bottom&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Add a native Confluence "Last Updated" text or use the &lt;code&gt;@date&lt;/code&gt; mention to timestamp the page. This tells readers whether the data is current.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Weekly update workflow:&lt;/strong&gt; At the start of each week, open the page, click Edit, and update the RAG color/label in each card, the progress bar percentages, and the metric numbers. It takes 5–10 minutes and the page communicates project health clearly to anyone who opens it.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://marketplace.atlassian.com/apps/1670180315/html-macro-for-confluence-free?hosting=cloud&amp;amp;tab=overview" rel="noopener noreferrer"&gt;Install HTML Macro for Confluence — free on the Atlassian Marketplace&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Jira Reporting for Product Managers: Charts, Metrics, and Dashboards</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Tue, 14 Jul 2026 10:00:30 +0000</pubDate>
      <link>https://dev.to/yamuno-software/jira-reporting-for-product-managers-charts-metrics-and-dashboards-4a1e</link>
      <guid>https://dev.to/yamuno-software/jira-reporting-for-product-managers-charts-metrics-and-dashboards-4a1e</guid>
      <description>&lt;h1&gt;
  
  
  Jira Reporting for Product Managers: Charts, Metrics, and Dashboards
&lt;/h1&gt;

&lt;p&gt;Product managers and engineering teams look at the same Jira data and need completely different things from it. Engineering wants sprint health, cycle time, and blocked issue counts. Product management wants feature progress, release readiness, customer-reported bug trends, and backlog composition.&lt;/p&gt;

&lt;p&gt;Most Jira dashboards are set up by or for engineering teams. If you're a PM who has tried to get useful reporting out of Jira and ended up with a page full of gadgets that don't answer your actual questions, this guide is for you.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Four Questions a PM Dashboard Should Answer
&lt;/h2&gt;

&lt;p&gt;Before picking any chart, start with the questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;What's the state of the current release?&lt;/strong&gt; — Feature completion, open bugs, scope changes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What's the trend for customer-reported issues?&lt;/strong&gt; — Bug volume over time, resolution rate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What does the backlog look like?&lt;/strong&gt; — Priority distribution, backlog by product area&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What shipped recently?&lt;/strong&gt; — Completed features, closed bugs, release notes fodder&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If your dashboard can answer these four questions without anyone opening a filter or running a query, it's doing its job.&lt;/p&gt;




&lt;h2&gt;
  
  
  Chart 1 — Release Progress Bar
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The question:&lt;/strong&gt; How far along are we in the current release?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setup:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chart type: Bar (stacked)&lt;/li&gt;
&lt;li&gt;Filter: &lt;code&gt;fixVersion = "Your Release Name"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Group by: Status&lt;/li&gt;
&lt;li&gt;Show: To Do, In Progress, In Review, Done as stacked segments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A stacked bar with one bar showing all four statuses tells you at a glance: how much is done, how much is in flight, and how much hasn't started. When the Done segment is 80%+ of the bar with a week left in the release, you're in good shape. When To Do still represents 40% with the release date looming, you have a scope problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JQL filter:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;project&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;YOURPROJECT&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;fixVersion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;"v2.4"&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;issueType&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Story&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Bug&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Chart 2 — Customer-Reported Bug Trend
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The question:&lt;/strong&gt; Is the volume of customer-reported bugs stable, increasing, or decreasing?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setup:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chart type: Line&lt;/li&gt;
&lt;li&gt;Filter: &lt;code&gt;label = "customer-reported"&lt;/code&gt; (or however your team tags customer bugs)&lt;/li&gt;
&lt;li&gt;X-axis: Week or month&lt;/li&gt;
&lt;li&gt;Y-axis: Issue count created in that period&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This chart is most useful over a 90-day window. A stable horizontal line means your product quality is consistent. An upward trend after a release means the release introduced regressions. A downward trend is good news — though confirm it's not just a drop in reporting.&lt;/p&gt;

&lt;p&gt;If your team doesn't use a consistent label for customer-reported issues, this is the right time to establish one. The reporting value is significant.&lt;/p&gt;




&lt;h2&gt;
  
  
  Chart 3 — Feature vs. Bug Ratio in the Backlog
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The question:&lt;/strong&gt; Is the backlog dominated by one type of work?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setup:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chart type: Pie or donut&lt;/li&gt;
&lt;li&gt;Filter: Open issues in the project&lt;/li&gt;
&lt;li&gt;Group by: Issue type&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a product team, the ideal ratio depends on the product maturity stage. A new product might be 80% features and 20% bugs. A mature product with a large install base might be 50/50. What you're watching for is a trend — if the bug proportion grows every quarter, quality investment is falling behind.&lt;/p&gt;

&lt;p&gt;This is also useful for product strategy conversations: when engineering says they need a "bug bash sprint," this chart gives you the data to support (or challenge) the request.&lt;/p&gt;




&lt;h2&gt;
  
  
  Chart 4 — Backlog by Priority
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The question:&lt;/strong&gt; How much of the backlog is urgent?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setup:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chart type: Bar (horizontal)&lt;/li&gt;
&lt;li&gt;Filter: Open issues in backlog&lt;/li&gt;
&lt;li&gt;Group by: Priority&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A priority bar chart shows how the backlog breaks down by Critical, High, Medium, and Low. The ratio matters: a backlog that's 30% Critical and 40% High is telling you that your priority labels have inflated to the point of meaninglessness, or that there's genuinely too much urgent work and the team can't keep up.&lt;/p&gt;

&lt;p&gt;Review this chart before each quarterly planning cycle. If the High bar keeps growing despite the team working on High-priority issues, capacity is mismatched with demand.&lt;/p&gt;




&lt;h2&gt;
  
  
  Chart 5 — Completed Work by Area
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The question:&lt;/strong&gt; What shipped this quarter, and in which product areas?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setup:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chart type: Bar&lt;/li&gt;
&lt;li&gt;Filter: &lt;code&gt;status = Done AND updated &amp;gt;= -90d&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Group by: Label (product area labels) or Component&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This chart is a retrospective view of where the team's output went. If you have labels for product areas ("auth," "billing," "reporting," "mobile"), a bar chart of completed issues by label shows what got attention. It's a useful starting point for "was this the quarter we said we'd focus on X?" conversations.&lt;/p&gt;

&lt;p&gt;Also useful for release notes compilation — filter to the release's fixVersion and group by issue type to see what categories of work shipped in that release.&lt;/p&gt;




&lt;h2&gt;
  
  
  Setting Up the PM Dashboard
&lt;/h2&gt;

&lt;p&gt;Create a dedicated Jira dashboard for product management. Don't share the sprint team's dashboard — the audiences and refresh cadences are different.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recommended layout — three columns:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Left column&lt;/th&gt;
&lt;th&gt;Center column&lt;/th&gt;
&lt;th&gt;Right column&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Release progress (bar)&lt;/td&gt;
&lt;td&gt;Customer bug trend (line)&lt;/td&gt;
&lt;td&gt;Backlog by priority (bar)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feature vs. bug ratio (pie)&lt;/td&gt;
&lt;td&gt;Completed by area (bar)&lt;/td&gt;
&lt;td&gt;&lt;em&gt;(empty or a filter results table)&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Add a date range selector at the top if Charts for Jira supports a shared filter — change the range and both time-based charts update together.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Share it:&lt;/strong&gt; Add the Confluence team, the engineering manager, and any design leads as viewers. A shared dashboard replaces the "can you pull the Jira report for the leadership update?" request with a link they can check themselves.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Good Jira Reporting Looks Like
&lt;/h2&gt;

&lt;p&gt;The sign that your dashboard is working: you open it in a meeting, look at it for 30 seconds, and can answer questions from it without typing a single JQL query. If you're still exporting to spreadsheet to get the answer you need, the dashboard isn't answering the right questions yet.&lt;/p&gt;

&lt;p&gt;Start with the release progress chart and the bug trend. Those two alone are more valuable than most Jira dashboards that have eight gadgets.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://marketplace.atlassian.com/apps/842672747/charts-reports-and-graphs-for-jira-dashboard?hosting=cloud&amp;amp;tab=overview" rel="noopener noreferrer"&gt;Install Charts for Jira Dashboard →&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
