<?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>Exporting Confluence Documentation for Clients: A Practical Guide</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Wed, 24 Jun 2026 10:52:41 +0000</pubDate>
      <link>https://dev.to/yamuno-software/exporting-confluence-documentation-for-clients-a-practical-guide-4lce</link>
      <guid>https://dev.to/yamuno-software/exporting-confluence-documentation-for-clients-a-practical-guide-4lce</guid>
      <description>&lt;h1&gt;
  
  
  Exporting Confluence Documentation for Clients
&lt;/h1&gt;

&lt;p&gt;Most Confluence documentation is written for internal audiences — people who have access to the instance and can navigate the space directly. But plenty of documentation ends up going to people who don't have Confluence access: clients receiving a project handover, stakeholders reviewing a technical spec, partners getting onboarded, or auditors requesting documentation exports.&lt;/p&gt;

&lt;p&gt;Confluence's built-in PDF export exists, but it produces bare output: no cover page, no custom headers, no watermarks, and no way to save a consistent format so the next export looks like this one. For internal drafts that's fine. For a client deliverable, it's not.&lt;/p&gt;

&lt;p&gt;This guide covers how to export professional, consistently formatted PDFs from Confluence for external distribution 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 Setup: Admin Creates a Template, Users Apply It
&lt;/h2&gt;

&lt;p&gt;The key to consistent output across a team is templates. An admin creates a "Client Deliverable" template once in Confluence Settings. After that, any team member exporting for a client selects that template and gets the same cover page, header, and formatting — without touching any configuration themselves.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Admin step (one time):&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Confluence Settings → PDF Exporter → Templates → New Template&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Name it "Client Deliverable"&lt;/li&gt;
&lt;li&gt;Configure it as described below&lt;/li&gt;
&lt;li&gt;Save&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;User step (every export):&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the Confluence page or parent page to export&lt;/li&gt;
&lt;li&gt;••• → Export to PDF&lt;/li&gt;
&lt;li&gt;Select "Client Deliverable" template&lt;/li&gt;
&lt;li&gt;Choose scope (single page, page tree, or space)&lt;/li&gt;
&lt;li&gt;Export and download&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Recommended Template Settings for Client-Facing PDFs
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Cover Page
&lt;/h3&gt;

&lt;p&gt;Enable the cover page. For client deliverables, &lt;strong&gt;Corporate&lt;/strong&gt; or &lt;strong&gt;Executive&lt;/strong&gt; style works best:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Corporate&lt;/strong&gt; — left-aligned with a solid color accent bar, professional and structured&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Executive&lt;/strong&gt; — minimal with a thin accent line, suits formal proposals and executive-level documents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Set the accent color to your company's primary brand color (hex). Upload your company logo. Add a subtitle field — "Prepared for [Client Name]" or "Confidential — [Date]" — as a manual step per export.&lt;/p&gt;

&lt;h3&gt;
  
  
  Header
&lt;/h3&gt;

&lt;p&gt;Enable the header with your company name or document series title, centered. This appears on every content page and reinforces the source of the document even when pages are printed individually.&lt;/p&gt;

&lt;h3&gt;
  
  
  Footer
&lt;/h3&gt;

&lt;p&gt;Add page numbers (right-aligned) and a confidentiality notice (left-aligned):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Confidential — [Company Name]                                       Page 1 of 10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This combination is standard for client-facing documentation in most professional services contexts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Watermark
&lt;/h3&gt;

&lt;p&gt;For documents that are drafts or under review, enable the watermark with "DRAFT" at 0.15 opacity. Remove it from the template (or create a separate "Client Draft" template) when the document is final.&lt;/p&gt;

&lt;h3&gt;
  
  
  Table of Contents
&lt;/h3&gt;

&lt;p&gt;Enable for any multi-page export. Set depth to 2 (H1 and H2). This is especially important for handover packages and technical specs where clients need to navigate to specific sections.&lt;/p&gt;

&lt;h3&gt;
  
  
  Page Breaks
&lt;/h3&gt;

&lt;p&gt;Enable "Break before H1" so each major section starts on a new page. For longer documents, also enable "Break before H2."&lt;/p&gt;




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

&lt;h3&gt;
  
  
  Project Handover Package
&lt;/h3&gt;

&lt;p&gt;A handover package typically spans multiple Confluence pages — architecture overview, runbooks, configuration guides, contact lists. Export the entire section as a page tree:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Navigate to the parent page of the handover section&lt;/li&gt;
&lt;li&gt;••• → Export to PDF&lt;/li&gt;
&lt;li&gt;Select the page tree — uncheck any internal-only pages you don't want in the client copy&lt;/li&gt;
&lt;li&gt;Select "Client Deliverable" template&lt;/li&gt;
&lt;li&gt;Export — downloads as a ZIP with each section as a separate PDF&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Alternatively, if you want a single combined PDF, check all pages under one parent. The exporter bundles them in page tree order.&lt;/p&gt;

&lt;h3&gt;
  
  
  Technical Specification
&lt;/h3&gt;

&lt;p&gt;A single-page export is appropriate for a spec document or proposal:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the spec page&lt;/li&gt;
&lt;li&gt;••• → Export to PDF&lt;/li&gt;
&lt;li&gt;Select "Client Deliverable" template&lt;/li&gt;
&lt;li&gt;Export — single PDF download&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the spec has an H1-level structure with multiple major sections, the table of contents and page breaks make it easy to navigate without Confluence access.&lt;/p&gt;

&lt;h3&gt;
  
  
  Compliance Documentation Export
&lt;/h3&gt;

&lt;p&gt;For regulatory submissions or audit requests, use a separate "Compliance Archive" template with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Executive&lt;/strong&gt; cover style&lt;/li&gt;
&lt;li&gt;Watermark: "ARCHIVED" or "CONFIDENTIAL" at 0.2 opacity&lt;/li&gt;
&lt;li&gt;Footer: department name and export date&lt;/li&gt;
&lt;li&gt;No table of contents unless required by the submission format&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Create this template with watermark enabled by default so it's never accidentally omitted on a compliance export.&lt;/p&gt;

&lt;h3&gt;
  
  
  Recurring Status Report
&lt;/h3&gt;

&lt;p&gt;If you export a weekly or monthly status report page to send to a client, the template eliminates the manual formatting step entirely. Update the Confluence page with new content, export with the "Client Deliverable" template, and the output is ready to send. The cover page, header, and formatting are consistent every time without any effort.&lt;/p&gt;




&lt;h2&gt;
  
  
  Space Export for Full Documentation Sets
&lt;/h2&gt;

&lt;p&gt;For clients receiving a complete documentation set (e.g., a full product documentation space), use the space export:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;From the global Apps menu, open &lt;strong&gt;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;Select all pages or deselect internal-only pages&lt;/li&gt;
&lt;li&gt;Apply the template&lt;/li&gt;
&lt;li&gt;Export — downloads as a ZIP of PDFs matching the space hierarchy&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is useful for project completion handovers, vendor certifications, or any situation where the client needs a complete copy of a documentation space they won't have ongoing access to.&lt;/p&gt;




&lt;h2&gt;
  
  
  Before You Send
&lt;/h2&gt;

&lt;p&gt;Before the PDF goes to the client:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use the &lt;strong&gt;Preview&lt;/strong&gt; option in the exporter to verify the cover page, header, and first few pages look correct&lt;/li&gt;
&lt;li&gt;Check that the subtitle on the cover page reflects the correct client name or document version&lt;/li&gt;
&lt;li&gt;Confirm the watermark is absent if the document is final (or present if it's still a draft)&lt;/li&gt;
&lt;li&gt;Open the downloaded PDF to verify the table of contents links work and the page numbering is correct&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The preview step takes 30 seconds and catches the issues — wrong accent color, missing logo, leftover watermark — that would otherwise be visible to the client.&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 Manage Confluence Attachments at Scale</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Sat, 20 Jun 2026 10:34:44 +0000</pubDate>
      <link>https://dev.to/yamuno-software/how-to-manage-confluence-attachments-at-scale-2i6g</link>
      <guid>https://dev.to/yamuno-software/how-to-manage-confluence-attachments-at-scale-2i6g</guid>
      <description>&lt;h1&gt;
  
  
  How to Manage Confluence Attachments at Scale
&lt;/h1&gt;

&lt;p&gt;Confluence storage fills up in a predictable way. Teams upload screenshots, export files, and old versions of diagrams. Pages get reorganized or deleted. The attachments stay. After a year or two, a significant portion of your Confluence storage is files that are no longer referenced by any page — orphaned attachments that cost storage budget without serving any purpose.&lt;/p&gt;

&lt;p&gt;Cleaning this up manually is impractical at any scale. This guide covers how to audit and manage Confluence attachments systematically using &lt;a href="https://marketplace.atlassian.com/apps/1228602938" rel="noopener noreferrer"&gt;Advanced Attachment Manager for Confluence&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Core Problem: Unused Attachments
&lt;/h2&gt;

&lt;p&gt;An unused attachment is a file that was uploaded to Confluence but is no longer referenced anywhere in page content. This happens when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A page is deleted but its attachments remain&lt;/li&gt;
&lt;li&gt;An image is uploaded, replaced by a newer version, and the old version is left&lt;/li&gt;
&lt;li&gt;A file is attached to a page during a draft but never embedded in the final content&lt;/li&gt;
&lt;li&gt;Content is migrated from one space to another and the source attachments are left behind&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Confluence's native attachment view shows you files per page. It doesn't have a cross-space view, doesn't flag unused files, and doesn't support bulk operations. Advanced Attachment Manager does.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1 — Find Unused Attachments
&lt;/h2&gt;

&lt;p&gt;Open Advanced Attachment Manager from the Confluence global navigation: &lt;strong&gt;Apps → Advanced Attachment Manager&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The first filter to apply: &lt;strong&gt;Usage Status → Unused&lt;/strong&gt;. This surfaces every attachment in the selected scope (page, space, or instance-wide) that isn't currently referenced by any page content.&lt;/p&gt;

&lt;p&gt;For most Confluence instances that haven't been audited recently, this list is longer than expected. Sort by &lt;strong&gt;File Size (descending)&lt;/strong&gt; to see the biggest storage consumers first — a handful of large video files or exported PDFs often account for a disproportionate share.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2 — Filter Down to What's Safe to Delete
&lt;/h2&gt;

&lt;p&gt;Not every unused attachment should be deleted. Some are referenced in archived pages. Some are version history that someone may need to reference. Apply additional filters to narrow to what's clearly safe:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Filter by file type:&lt;/strong&gt; Images and exported PDFs are the most common orphans. Filter to &lt;code&gt;Images&lt;/code&gt; or &lt;code&gt;Documents&lt;/code&gt; to work through the most common cases first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Filter by upload date:&lt;/strong&gt; Files uploaded more than 12 months ago and never used are strong candidates for deletion. Set the upload date range to filter out recent uploads.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Filter by uploader:&lt;/strong&gt; If a departed team member uploaded most of the unused files, filtering by uploader gives you a focused list to review.&lt;/p&gt;

&lt;p&gt;Use shift-click and ctrl/cmd-click to select individual files, or &lt;strong&gt;Select All&lt;/strong&gt; after applying filters to select the entire filtered result set.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3 — Download Before Deleting (When Uncertain)
&lt;/h2&gt;

&lt;p&gt;For any batch where you're not 100% confident, use &lt;strong&gt;Bulk Download&lt;/strong&gt; before deleting. This downloads all selected files as a ZIP archive to your local machine.&lt;/p&gt;

&lt;p&gt;Bulk Download is also useful for migration and archival purposes — before decommissioning a Confluence space, download all attachments to preserve them outside Confluence.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4 — Bulk Delete
&lt;/h2&gt;

&lt;p&gt;With the files selected:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;Delete Selected&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Review the confirmation dialog — it shows the count and total size being freed&lt;/li&gt;
&lt;li&gt;Confirm the deletion&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Deletions are logged to the audit trail immediately. If you delete something that turns out to be needed, check the audit log first to confirm what was removed, then check if it can be recovered from Confluence's trash.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5 — Review the Audit Log
&lt;/h2&gt;

&lt;p&gt;Every action taken in Advanced Attachment Manager — views, downloads, deletions — is recorded in the audit log. Access it from the app sidebar.&lt;/p&gt;

&lt;p&gt;The audit log shows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Action type (deleted, downloaded, viewed)&lt;/li&gt;
&lt;li&gt;File name and size&lt;/li&gt;
&lt;li&gt;Space and page the file was attached to&lt;/li&gt;
&lt;li&gt;User who performed the action&lt;/li&gt;
&lt;li&gt;Timestamp&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is important for compliance-sensitive environments: you have a complete record of what was removed, by whom, and when.&lt;/p&gt;




&lt;h2&gt;
  
  
  Scheduling Regular Cleanups
&lt;/h2&gt;

&lt;p&gt;Attachment management is most effective as a recurring process rather than a one-time cleanup. A quarterly cadence works for most teams:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Filter to unused attachments uploaded more than 90 days ago&lt;/li&gt;
&lt;li&gt;Sort by size, work through the top 50 by size&lt;/li&gt;
&lt;li&gt;Bulk delete the clearly obsolete ones&lt;/li&gt;
&lt;li&gt;Download and archive anything uncertain&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After two or three cycles, the backlog of orphaned files is small enough that the quarterly review takes 15–20 minutes instead of hours.&lt;/p&gt;




&lt;h2&gt;
  
  
  Space-Level vs. Instance-Level Audits
&lt;/h2&gt;

&lt;p&gt;Advanced Attachment Manager supports two scopes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Space-level:&lt;/strong&gt; Scope the view to a specific Confluence space. Useful for space owners doing routine maintenance on their own space.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Instance-level:&lt;/strong&gt; Confluence admins can view attachments across the entire instance. This is the right starting point for a storage audit — see total consumption by space, identify which spaces are the biggest consumers, and then drill into each one.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Note on Storage Recovery
&lt;/h2&gt;

&lt;p&gt;After bulk deletion, Confluence doesn't immediately reclaim storage — deleted files go to Confluence trash first. A Confluence admin needs to empty the trash to release the storage.&lt;/p&gt;

&lt;p&gt;Go to &lt;strong&gt;Confluence Administration → Trash → Empty Trash&lt;/strong&gt;. After emptying, the storage reduction is reflected in your instance's storage usage.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://marketplace.atlassian.com/apps/1228602938" rel="noopener noreferrer"&gt;Install Advanced Attachment Manager for Confluence →&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to Embed Interactive Charts in Confluence with HTML Macro</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Tue, 16 Jun 2026 12:56:22 +0000</pubDate>
      <link>https://dev.to/yamuno-software/how-to-embed-interactive-charts-in-confluence-with-html-macro-4ai3</link>
      <guid>https://dev.to/yamuno-software/how-to-embed-interactive-charts-in-confluence-with-html-macro-4ai3</guid>
      <description>&lt;h1&gt;
  
  
  How to Embed Interactive Charts in Confluence with HTML Macro
&lt;/h1&gt;

&lt;p&gt;Confluence is where a lot of teams track project status, document KPIs, and share team metrics. But when it comes to actually visualizing that data, the options are limited. You can paste a static image (which goes stale), use a third-party integration (which requires a separate subscription), or accept that your Confluence page just won't have charts.&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;HTML Macro for Confluence&lt;/a&gt; opens a fourth option: embed Chart.js directly inside a Confluence page. The charts are interactive (hover for tooltips, click to toggle series), render instantly, and live alongside your documentation — no external service required.&lt;/p&gt;

&lt;p&gt;This guide covers four chart types with copy-paste code for each.&lt;/p&gt;




&lt;h2&gt;
  
  
  Before You Start
&lt;/h2&gt;

&lt;p&gt;Install &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; from the Atlassian Marketplace. It's free and runs on Atlassian Forge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security note:&lt;/strong&gt; The examples below load Chart.js from a CDN (&lt;code&gt;cdn.jsdelivr.net&lt;/code&gt;). Your Confluence admin needs to add that domain to the HTML Macro whitelist. Go to &lt;strong&gt;Confluence Settings → HTML Macro → Security Settings&lt;/strong&gt; and add &lt;code&gt;https://cdn.jsdelivr.net&lt;/code&gt; to the allowed domains.&lt;/p&gt;

&lt;p&gt;Once that's done, add the macro to any Confluence page (Insert → Macro → HTML Macro), paste the code, and use the live preview to verify it before saving.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bar Chart — Team Metrics or Sprint Data
&lt;/h2&gt;

&lt;p&gt;Good for: comparing values across categories — issues by status, story points per sprint, bugs per team member.&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;canvas&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"barChart"&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"700"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"350"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/canvas&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.jsdelivr.net/npm/chart.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Chart&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="s1"&gt;barChart&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;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bar&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;labels&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;To Do&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;In Progress&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;In Review&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;Done&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="na"&gt;datasets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
        &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Issues&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;34&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="na"&gt;backgroundColor&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;#94a3b8&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;#3b82f6&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;#f59e0b&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;#22c55e&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="na"&gt;borderRadius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6&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;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;responsive&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Issue Status — Sprint 42&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;font&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;600&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#1e293b&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;span class="na"&gt;scales&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;beginAtZero&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#f1f5f9&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="na"&gt;ticks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#64748b&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;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="na"&gt;ticks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#64748b&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;span class="p"&gt;}&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;Replace the &lt;code&gt;labels&lt;/code&gt; and &lt;code&gt;data&lt;/code&gt; arrays with your actual values. Each label maps to the corresponding data value by index.&lt;/p&gt;




&lt;h2&gt;
  
  
  Line Chart — Velocity Trend or Weekly Progress
&lt;/h2&gt;

&lt;p&gt;Good for: showing trends over time — sprint velocity, bug discovery rate, weekly active users, anything with a time axis.&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;canvas&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"lineChart"&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"700"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"350"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/canvas&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.jsdelivr.net/npm/chart.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Chart&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="s1"&gt;lineChart&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;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;line&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;labels&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;Sprint 37&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;Sprint 38&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;Sprint 39&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;Sprint 40&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;Sprint 41&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;Sprint 42&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="na"&gt;datasets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
        &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Story Points Completed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;38&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;52&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;49&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;55&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="na"&gt;borderColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#6366f1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;backgroundColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;rgba(99, 102, 241, 0.08)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;borderWidth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;pointBackgroundColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#6366f1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;pointRadius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;tension&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.3&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;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;responsive&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;top&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Sprint Velocity — Last 6 Sprints&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;font&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;600&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#1e293b&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;span class="na"&gt;scales&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;beginAtZero&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#f1f5f9&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="na"&gt;ticks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#64748b&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;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="na"&gt;ticks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#64748b&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;span class="p"&gt;}&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;h2&gt;
  
  
  Pie Chart — Issue Type or Priority Distribution
&lt;/h2&gt;

&lt;p&gt;Good for: showing how a total is distributed — issue types, budget allocation, time spent by category. Keep it to five segments or fewer.&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;canvas&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"pieChart"&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"500"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"400"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/canvas&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.jsdelivr.net/npm/chart.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Chart&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="s1"&gt;pieChart&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;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pie&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;labels&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;Bug&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;Feature&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;Task&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;Tech Debt&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;Spike&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="na"&gt;datasets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
        &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="na"&gt;backgroundColor&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;#ef4444&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;#6366f1&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;#3b82f6&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;#f59e0b&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;#94a3b8&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;borderWidth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;borderColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#fff&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;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;responsive&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;right&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Open Issues by Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;font&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;600&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#1e293b&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;span class="p"&gt;}&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;h2&gt;
  
  
  Doughnut Chart — Goal Progress or Completion Status
&lt;/h2&gt;

&lt;p&gt;Good for: showing a single metric against a target — sprint completion, budget consumed, onboarding progress.&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;"position:relative; width:400px; margin:0 auto;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;canvas&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"doughnutChart"&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"400"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"400"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/canvas&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;"position:absolute; top:50%; left:50%; transform:translate(-50%,-50%); text-align:center; 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;"font-size:36px; font-weight:700; color:#1e293b;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;72%&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;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;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&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.jsdelivr.net/npm/chart.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Chart&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="s1"&gt;doughnutChart&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;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;doughnut&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;datasets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
        &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;72&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="na"&gt;backgroundColor&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;#6366f1&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;#f1f5f9&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="na"&gt;borderWidth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;cutout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;78%&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;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;responsive&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;tooltip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&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;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 &lt;code&gt;72&lt;/code&gt; and &lt;code&gt;28&lt;/code&gt; values (they must add to 100) and update the center label to match.&lt;/p&gt;




&lt;h2&gt;
  
  
  Multi-Dataset Line Chart — Compare Two Teams or Products
&lt;/h2&gt;

&lt;p&gt;When you want to compare two data series on the same time axis:&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;canvas&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"multiLineChart"&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"700"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"350"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/canvas&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.jsdelivr.net/npm/chart.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Chart&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="s1"&gt;multiLineChart&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;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;line&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;labels&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;Week 1&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;Week 2&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;Week 3&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;Week 4&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;Week 5&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;Week 6&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="na"&gt;datasets&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;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Team Alpha&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
          &lt;span class="na"&gt;borderColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#6366f1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;backgroundColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;transparent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;borderWidth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;pointRadius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;tension&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.3&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;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Team Beta&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
          &lt;span class="na"&gt;borderColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#22c55e&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;backgroundColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;transparent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;borderWidth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;pointRadius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;tension&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.3&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;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;responsive&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;top&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Weekly Issues Resolved&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;font&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;600&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#1e293b&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;span class="na"&gt;scales&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;beginAtZero&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#f1f5f9&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;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&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;span class="p"&gt;}&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;h2&gt;
  
  
  Tips for Production Use
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Hard-code the data for now.&lt;/strong&gt; Chart.js in Confluence can't call your Jira API or database — the data lives in the HTML. If your metrics change weekly, treat the Confluence page as a weekly snapshot: update the arrays when you update the commentary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use &lt;code&gt;width&lt;/code&gt; and &lt;code&gt;height&lt;/code&gt; attributes directly on &lt;code&gt;&amp;lt;canvas&amp;gt;&lt;/code&gt;.&lt;/strong&gt; Don't rely on &lt;code&gt;responsive: true&lt;/code&gt; inside Confluence — the macro iframe has fixed dimensions and responsive sizing can behave unexpectedly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Each chart needs a unique &lt;code&gt;id&lt;/code&gt;.&lt;/strong&gt; If you put multiple charts on the same page, give each canvas a different id (&lt;code&gt;barChart&lt;/code&gt;, &lt;code&gt;lineChart&lt;/code&gt;, etc.) to avoid conflicts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test in the live preview before saving.&lt;/strong&gt; HTML Macro's side-by-side preview shows you exactly what Confluence page visitors will see — including CDN scripts loading.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Note on the CDN Whitelist
&lt;/h2&gt;

&lt;p&gt;Your admin needs to whitelist &lt;code&gt;https://cdn.jsdelivr.net&lt;/code&gt; in HTML Macro's security settings for the Chart.js scripts to load. If the charts appear blank, that's the most common cause. Check the browser console for a CSP error and confirm the domain is in the allowlist.&lt;/p&gt;

&lt;p&gt;For environments where all external CDNs are blocked, you can paste the minified Chart.js source directly into the &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag — it's about 60KB minified, which is manageable.&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>How to Sync Docs from GitHub to Confluence Automatically</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Wed, 10 Jun 2026 11:40:41 +0000</pubDate>
      <link>https://dev.to/yamuno-software/how-to-sync-docs-from-github-to-confluence-automatically-1l53</link>
      <guid>https://dev.to/yamuno-software/how-to-sync-docs-from-github-to-confluence-automatically-1l53</guid>
      <description>&lt;h1&gt;
  
  
  How to Sync Docs from GitHub to Confluence Automatically
&lt;/h1&gt;

&lt;p&gt;Documentation drift is one of the most common problems in engineering teams. The markdown files in your GitHub repo are accurate — they're updated as part of the same PR that changes the code. The Confluence pages that were supposed to mirror them were last updated six months ago by someone who has since left the team.&lt;/p&gt;

&lt;p&gt;This guide shows how to wire GitHub and Confluence together so your repo is the single source of truth and Confluence stays in sync automatically, without anyone manually copying content between the two.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Setup
&lt;/h2&gt;

&lt;p&gt;The approach uses the &lt;a href="https://marketplace.atlassian.com/apps/1228589694" rel="noopener noreferrer"&gt;Markdown Importer for Confluence&lt;/a&gt; REST API combined with a GitHub Actions workflow. When a push lands on your main branch, the workflow calls the API to import the updated markdown files into the right Confluence pages.&lt;/p&gt;

&lt;p&gt;You need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Markdown Importer for Confluence installed on your Confluence Cloud instance&lt;/li&gt;
&lt;li&gt;A Confluence API token&lt;/li&gt;
&lt;li&gt;A GitHub repository with markdown documentation&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 1 — Generate a Confluence API Token
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://id.atlassian.com/manage-profile/security/api-tokens" rel="noopener noreferrer"&gt;id.atlassian.com/manage-profile/security/api-tokens&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create API token&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Give it a name ("GitHub Actions — Confluence Sync")&lt;/li&gt;
&lt;li&gt;Copy the token immediately — it's only shown once&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Store it as a GitHub Actions secret: &lt;code&gt;CONFLUENCE_API_TOKEN&lt;/code&gt;. Also store your Confluence email as &lt;code&gt;CONFLUENCE_EMAIL&lt;/code&gt; and your Confluence base URL as &lt;code&gt;CONFLUENCE_BASE_URL&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2 — Find the Target Page ID
&lt;/h2&gt;

&lt;p&gt;Each import needs a target Confluence page ID — the parent page where the markdown will be created or updated.&lt;/p&gt;

&lt;p&gt;To find a page ID:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the target Confluence page&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;•••&lt;/strong&gt; → &lt;strong&gt;Page Information&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The ID is in the URL: &lt;code&gt;...confluence/pages/edit-v2/123456789&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Or use the Confluence REST API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://your-instance.atlassian.net/wiki/rest/api/content?title=Your+Page+Name&amp;amp;spaceKey=YOURSPACE
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Store the page ID as a GitHub Actions variable (&lt;code&gt;CONFLUENCE_PAGE_ID&lt;/code&gt;).&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3 — Create the GitHub Actions Workflow
&lt;/h2&gt;

&lt;p&gt;Create &lt;code&gt;.github/workflows/sync-docs-to-confluence.yml&lt;/code&gt;:&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="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Sync Docs to Confluence&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;main&lt;/span&gt;
    &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;docs/**'&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;sync&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Zip docs folder&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;zip -r docs.zip docs/&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Import to Confluence&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;curl -X POST \&lt;/span&gt;
            &lt;span class="s"&gt;"https://your-instance.atlassian.net/wiki/rest/api/content/${{ vars.CONFLUENCE_PAGE_ID }}/child/page" \&lt;/span&gt;
            &lt;span class="s"&gt;-u "${{ secrets.CONFLUENCE_EMAIL }}:${{ secrets.CONFLUENCE_API_TOKEN }}" \&lt;/span&gt;
            &lt;span class="s"&gt;-H "Content-Type: multipart/form-data" \&lt;/span&gt;
            &lt;span class="s"&gt;-F "file=@docs.zip" \&lt;/span&gt;
            &lt;span class="s"&gt;-F "pageHierarchy=true" \&lt;/span&gt;
            &lt;span class="s"&gt;-F "overwrite=true"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;paths&lt;/code&gt; filter means the workflow only triggers when files inside &lt;code&gt;docs/&lt;/code&gt; change — not on every push to main.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4 — Use the Markdown Importer REST API Directly
&lt;/h2&gt;

&lt;p&gt;The Markdown Importer REST API gives you more control than the UI. The key endpoint for automation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /wiki/rest/atlassian-connect/1/addons/com.yamuno.markdown-importer/resources/api/import
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Request body (multipart/form-data):&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;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;file&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ZIP archive of markdown files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;parentPageId&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Target parent page ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spaceKey&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Target Confluence space key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pageHierarchy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;true&lt;/code&gt; to preserve folder structure as page hierarchy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;overwrite&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;true&lt;/code&gt; to update existing pages instead of creating duplicates&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Authentication:&lt;/strong&gt; HTTP Basic — email + API token.&lt;/p&gt;

&lt;p&gt;A more complete workflow that handles individual files:&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="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# sync-to-confluence.sh&lt;/span&gt;

&lt;span class="nv"&gt;BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CONFLUENCE_BASE_URL&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;EMAIL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CONFLUENCE_EMAIL&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CONFLUENCE_API_TOKEN&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;PAGE_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CONFLUENCE_PAGE_ID&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;SPACE_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CONFLUENCE_SPACE_KEY&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Create ZIP from docs folder&lt;/span&gt;
zip &lt;span class="nt"&gt;-r&lt;/span&gt; docs.zip docs/

&lt;span class="c"&gt;# Call the import API&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;BASE_URL&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/wiki/rest/atlassian-connect/1/addons/com.yamuno.markdown-importer/resources/api/import"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;EMAIL&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TOKEN&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"file=@docs.zip"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"parentPageId=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PAGE_ID&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"spaceKey=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SPACE_KEY&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"pageHierarchy=true"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"overwrite=true"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | jq &lt;span class="s1"&gt;'.'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 5 — Preserve Folder Structure as Confluence Hierarchy
&lt;/h2&gt;

&lt;p&gt;If your docs folder looks like this:&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
├── how-to/
│   ├── first-steps.md
│   └── advanced-usage.md
└── reference/
    ├── api.md
    └── config.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With &lt;code&gt;pageHierarchy=true&lt;/code&gt;, the importer creates a matching Confluence page tree:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Getting Started
Installation
How To
  ├── First Steps
  └── Advanced Usage
Reference
  ├── API
  └── Config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each folder becomes a parent page. The markdown file names become page titles (with hyphens replaced by spaces and the first letter capitalized).&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 6 — Handle Frontmatter
&lt;/h2&gt;

&lt;p&gt;Markdown Importer reads YAML frontmatter and uses it to set page metadata:&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;API&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Reference"&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a &lt;code&gt;title&lt;/code&gt; field is present, the importer uses it as the Confluence page title instead of the filename. This lets you have &lt;code&gt;api.md&lt;/code&gt; in the repo but "API Reference" as the Confluence page title.&lt;/p&gt;

&lt;p&gt;Other frontmatter fields are ignored for the import but preserved if you export back to markdown.&lt;/p&gt;




&lt;h2&gt;
  
  
  Testing the Workflow
&lt;/h2&gt;

&lt;p&gt;Push a small change to a doc file on main and watch the Actions tab in GitHub. The workflow should:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Trigger on the &lt;code&gt;push&lt;/code&gt; event&lt;/li&gt;
&lt;li&gt;Zip the docs folder&lt;/li&gt;
&lt;li&gt;Call the import API&lt;/li&gt;
&lt;li&gt;Return a 200 with the list of pages created or updated&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Check Confluence to confirm the pages reflect the changes. The first import creates the pages; subsequent imports update them in place (because &lt;code&gt;overwrite=true&lt;/code&gt;).&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Patterns
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Sync only changed files:&lt;/strong&gt; Use &lt;code&gt;git diff --name-only HEAD~1 HEAD -- docs/&lt;/code&gt; in the workflow to identify which files changed, then import just those files instead of the full folder. Faster and avoids unnecessary Confluence page updates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multiple doc sources:&lt;/strong&gt; Run the import step multiple times with different source folders and target page IDs. You can sync &lt;code&gt;docs/public/&lt;/code&gt; to a customer-facing space and &lt;code&gt;docs/internal/&lt;/code&gt; to an internal space in the same workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Preview before merging:&lt;/strong&gt; Add the sync workflow to pull request branches targeting a staging Confluence space. Reviewers can check how the docs render in Confluence before the PR merges.&lt;/p&gt;




&lt;h2&gt;
  
  
  Result
&lt;/h2&gt;

&lt;p&gt;Once the workflow is running, your documentation process is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Edit markdown in the repo&lt;/li&gt;
&lt;li&gt;Open a PR, get it reviewed, merge&lt;/li&gt;
&lt;li&gt;Confluence updates automatically within minutes&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No manual copying. No drift. The engineers writing the code are the same people keeping the docs current — because it's the same commit.&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/rest-api"&gt;Read the REST API documentation →&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to Create Custom PDF Templates in Confluence</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Sat, 06 Jun 2026 10:07:14 +0000</pubDate>
      <link>https://dev.to/yamuno-software/how-to-create-custom-pdf-templates-in-confluence-dce</link>
      <guid>https://dev.to/yamuno-software/how-to-create-custom-pdf-templates-in-confluence-dce</guid>
      <description>&lt;h1&gt;
  
  
  How to Create Custom PDF Templates in Confluence
&lt;/h1&gt;

&lt;p&gt;If your team exports Confluence pages to PDF regularly, you've probably run into this problem: every export looks different. One person adds a cover page, another doesn't. Headers are inconsistent. Some PDFs have page numbers, others don't. When the document goes to a client or a regulator, it looks like it came from three different organizations.&lt;/p&gt;

&lt;p&gt;The fix is a shared template. Create it once, and every export from the instance uses it automatically — no manual configuration each time.&lt;/p&gt;

&lt;p&gt;This guide covers how to set up PDF export templates in Confluence 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;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;PDF Exporter for Confluence installed from the &lt;a href="https://marketplace.atlassian.com/apps/726790413" rel="noopener noreferrer"&gt;Atlassian Marketplace&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Confluence admin access (templates are configured in Confluence Settings)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Regular users can apply templates but cannot create or edit them.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1 — Open Template Management
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Confluence Settings&lt;/strong&gt; (gear icon, top-right)&lt;/li&gt;
&lt;li&gt;In the left sidebar, find &lt;strong&gt;PDF Exporter&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Templates&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You'll see the template list. New instances have three built-in templates: Default, Report, and Minimal. You can edit these or create new ones.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2 — Create a New Template
&lt;/h2&gt;

&lt;p&gt;Click &lt;strong&gt;New Template&lt;/strong&gt; and give it a name. Use something descriptive — "Client Deliverable," "Internal Report," "Compliance Archive" — so team members know which template to pick.&lt;/p&gt;

&lt;p&gt;Add an optional description explaining when to use this template.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3 — Configure Page Layout
&lt;/h2&gt;

&lt;p&gt;Under &lt;strong&gt;Page Layout&lt;/strong&gt;, set:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Page Size&lt;/strong&gt; — A4 for international use, Letter for North America, Legal for formal legal documents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orientation&lt;/strong&gt; — Portrait for most documentation, Landscape for wide tables or diagrams&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Font Size&lt;/strong&gt; — Medium is the default and works for most use cases; Large if the document will be read on screen rather than printed&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 4 — Set Up the Cover Page
&lt;/h2&gt;

&lt;p&gt;Cover pages are one of the most visible differences between a professional-looking PDF and a bare export. Turn them on under &lt;strong&gt;Cover Page&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Style options:&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;Style&lt;/th&gt;
&lt;th&gt;When to use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Classic&lt;/td&gt;
&lt;td&gt;General internal documents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Corporate&lt;/td&gt;
&lt;td&gt;Client-facing deliverables with a formal tone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modern&lt;/td&gt;
&lt;td&gt;Product documentation with a contemporary feel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Executive&lt;/td&gt;
&lt;td&gt;Board reports, executive summaries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bold&lt;/td&gt;
&lt;td&gt;Team-facing reports where visual impact matters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Minimal&lt;/td&gt;
&lt;td&gt;When you only need the title and author, no decoration&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Accent Color&lt;/strong&gt; — set a hex value to match your brand palette. The default is Yamuno purple (&lt;code&gt;#504DC4&lt;/code&gt;); change it to your company's primary color&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subtitle&lt;/strong&gt; — optional text below the page title (e.g., "Confidential — Not for Distribution" or "Version 2.1")&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Author&lt;/strong&gt; — appears on the cover. Use a team name ("Solutions Engineering") rather than a person's name if the template will be shared&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logo&lt;/strong&gt; — upload a PNG, JPG, or SVG. The logo is stored per template and appears on the cover automatically&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The template editor shows a live preview as you configure, so you can see exactly how the cover will look before saving.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5 — Configure Headers and Footers
&lt;/h2&gt;

&lt;p&gt;Headers and footers appear on every content page (not the cover).&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Enable it and add text — typically a document title, project name, or team name&lt;/li&gt;
&lt;li&gt;Position: Left, Center, or Right&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Enable it and add text — typically a confidentiality notice, date, or department name&lt;/li&gt;
&lt;li&gt;Position: Left, Center, or Right&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Page Numbers:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enable separately from the footer&lt;/li&gt;
&lt;li&gt;Format options: &lt;code&gt;1&lt;/code&gt;, &lt;code&gt;1 / 10&lt;/code&gt;, or &lt;code&gt;Page 1 of 10&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Position: Left, Center, or Right&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A common layout: document title centered in the header, page numbers right-aligned in the footer, confidentiality notice left-aligned in the footer.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 6 — Add a Watermark (Optional)
&lt;/h2&gt;

&lt;p&gt;Watermarks are useful for draft reviews, confidential documents, or compliance archives.&lt;/p&gt;

&lt;p&gt;Enable &lt;strong&gt;Watermark&lt;/strong&gt;, enter the text (e.g., "DRAFT," "CONFIDENTIAL," "FOR REVIEW ONLY"), and set the opacity. The default opacity of 0.15 is visible without dominating the content. Go lower for a more subtle mark, higher if the watermark needs to be unmissable.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 7 — Table of Contents
&lt;/h2&gt;

&lt;p&gt;For multi-page exports, a table of contents makes the document navigable.&lt;/p&gt;

&lt;p&gt;Enable &lt;strong&gt;Table of Contents&lt;/strong&gt; and set the depth:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Depth 1: H1 headings only&lt;/li&gt;
&lt;li&gt;Depth 2: H1 and H2&lt;/li&gt;
&lt;li&gt;Depth 3: H1, H2, and H3&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For technical documentation, Depth 2 is usually the right balance. Depth 3 can make the TOC longer than some sections.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 8 — Page Breaks
&lt;/h2&gt;

&lt;p&gt;Under &lt;strong&gt;Page Breaks&lt;/strong&gt;, you can configure the exporter to insert automatic page breaks before H1 and/or H2 headings. This keeps major sections starting on a fresh page, which looks significantly cleaner in multi-topic exports.&lt;/p&gt;

&lt;p&gt;Enable "Break before H1" at minimum. Enable "Break before H2" for documents with long subsections.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 9 — Save and Test
&lt;/h2&gt;

&lt;p&gt;Click &lt;strong&gt;Save&lt;/strong&gt;. The template is immediately available to all users on the Confluence instance.&lt;/p&gt;

&lt;p&gt;To verify it works:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Navigate to any Confluence page&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 your new template from the dropdown&lt;/li&gt;
&lt;li&gt;Use the &lt;strong&gt;Preview&lt;/strong&gt; option before downloading&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Check the cover page, headers, and watermark. If anything looks off, go back to Settings → PDF Exporter → Templates → Edit.&lt;/p&gt;




&lt;h2&gt;
  
  
  Managing Multiple Templates
&lt;/h2&gt;

&lt;p&gt;For most teams, two or three templates covers the range of use cases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Client-facing&lt;/strong&gt; — cover page (Corporate style), branded header, confidentiality footer, page numbers, no watermark&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Internal draft&lt;/strong&gt; — cover page (Minimal), watermark "DRAFT," page numbers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compliance archive&lt;/strong&gt; — cover page (Executive), watermark "ARCHIVED," page numbers, department footer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Archive templates you no longer want used (rather than deleting them) — the Archive option hides them from user dropdowns while preserving the settings for reference.&lt;/p&gt;




&lt;h2&gt;
  
  
  Result
&lt;/h2&gt;

&lt;p&gt;Once your templates are set up, the export workflow for every user is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the page → ••• → Export to PDF&lt;/li&gt;
&lt;li&gt;Pick a template&lt;/li&gt;
&lt;li&gt;Click Export&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No formatting decisions. No inconsistent output. The same cover, the same header, the same page layout — every time.&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>Best Jira Dashboard Widgets and Charts in 2026</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Tue, 02 Jun 2026 12:06:39 +0000</pubDate>
      <link>https://dev.to/yamuno-software/best-jira-dashboard-widgets-and-charts-in-2026-1cap</link>
      <guid>https://dev.to/yamuno-software/best-jira-dashboard-widgets-and-charts-in-2026-1cap</guid>
      <description>&lt;h1&gt;
  
  
  Best Jira Dashboard Widgets and Charts in 2026
&lt;/h1&gt;

&lt;p&gt;Most Jira dashboards fail the same way: too many gadgets, none of them useful. A pie chart of issue types nobody asked for. A filter results table showing 200 tickets. A sprint burndown that's three sprints out of date.&lt;/p&gt;

&lt;p&gt;The best dashboards answer one or two specific questions for a specific audience. This guide covers the widgets and chart types that consistently deliver value — and the setups that make them useful in practice.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Right Frame Before You Start
&lt;/h2&gt;

&lt;p&gt;Before picking any widget, decide who the dashboard is for and what decision it needs to support.&lt;/p&gt;

&lt;p&gt;A dashboard for a sprint team answers: "Are we on track this week?" It needs velocity, blocked issues, and scope change.&lt;/p&gt;

&lt;p&gt;A dashboard for an engineering manager answers: "Where are the bottlenecks?" It needs cycle time, work in progress by assignee, and escalated bugs.&lt;/p&gt;

&lt;p&gt;A dashboard for a product stakeholder answers: "What shipped and what's coming?" It needs release status, feature progress, and open defects.&lt;/p&gt;

&lt;p&gt;If you try to serve all three audiences on one dashboard, you serve none of them.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bar Chart — Issue Distribution by Status or Assignee
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Sprint planning, workload reviews, standup summaries.&lt;/p&gt;

&lt;p&gt;A bar chart with issues grouped by status (To Do / In Progress / In Review / Done) gives you the distribution at a glance. When combined with a sprint or fix version filter, it answers "where is everything right now?" in one view.&lt;/p&gt;

&lt;p&gt;Grouped by assignee, the same chart becomes a workload visualization. If one person has 18 open issues and another has 3, that's visible immediately — no one needs to pull a report.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setup in Charts for Jira Dashboard:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chart type: Bar&lt;/li&gt;
&lt;li&gt;Group by: Status or Assignee&lt;/li&gt;
&lt;li&gt;Filter: Current sprint or active fix version&lt;/li&gt;
&lt;li&gt;Orientation: Horizontal for assignee view (names read better)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Line Chart — Velocity Trend Over Time
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Sprint retrospectives, capacity planning, stakeholder updates.&lt;/p&gt;

&lt;p&gt;A single sprint's velocity is nearly meaningless. A six-sprint trend tells you whether the team is improving, declining, or stable. That context is what makes capacity planning possible.&lt;/p&gt;

&lt;p&gt;Set the X-axis to sprint and the Y-axis to story points completed. Add a trend line. The slope tells you more than any individual data point.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to avoid:&lt;/strong&gt; Reporting velocity in isolation without noting team size changes. A jump in velocity after two people joined isn't an improvement — it's headcount. Track points per person if you want a clean signal.&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;X-axis: Sprint&lt;/li&gt;
&lt;li&gt;Y-axis: Story points (completed)&lt;/li&gt;
&lt;li&gt;Enable: Trend line&lt;/li&gt;
&lt;li&gt;Filter: Last 6–8 sprints&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Pie Chart — Issue Type or Priority Breakdown
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Bug triage, backlog health checks, executive summaries.&lt;/p&gt;

&lt;p&gt;Pie charts are often overused but have a legitimate place for proportion data. The question "what percentage of open work is bugs vs. features vs. tech debt?" is a proportion question — a pie chart answers it directly.&lt;/p&gt;

&lt;p&gt;Keep it to five slices or fewer. Beyond that, the chart becomes a color matching exercise.&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&lt;/li&gt;
&lt;li&gt;Group by: Issue type or Priority&lt;/li&gt;
&lt;li&gt;Filter: Open issues in the relevant project&lt;/li&gt;
&lt;li&gt;Labels: Show percentages&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Area Chart — Cumulative Flow
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Identifying bottlenecks, WIP limit enforcement, kanban teams.&lt;/p&gt;

&lt;p&gt;A cumulative flow diagram shows how issues accumulate and drain through each status over time. When one band (say "In Review") grows noticeably wider, it means work is piling up there — a bottleneck you can address before it delays the sprint.&lt;/p&gt;

&lt;p&gt;This is the most analytically powerful chart on this list and the one teams are most likely to underuse.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Chart type: Area (stacked)&lt;/li&gt;
&lt;li&gt;X-axis: Date&lt;/li&gt;
&lt;li&gt;Y-axis: Issue count&lt;/li&gt;
&lt;li&gt;Group by: Status&lt;/li&gt;
&lt;li&gt;Filter: Active sprint or last 30 days&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Scatter Chart — Effort vs. Completion Time
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Estimation calibration, cycle time analysis.&lt;/p&gt;

&lt;p&gt;Plot story points on the X-axis and actual days to complete on the Y-axis. Each issue is a dot. What you're looking for: are small-point issues actually completing faster? Are there outliers — high-point issues that took surprisingly little time, or vice versa?&lt;/p&gt;

&lt;p&gt;This chart is most useful for teams trying to improve their estimation accuracy. After a few sprints, the pattern (or lack of one) tells you whether your point scale correlates with actual effort.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Chart type: Scatter&lt;/li&gt;
&lt;li&gt;X-axis: Story points&lt;/li&gt;
&lt;li&gt;Y-axis: Cycle time (days)&lt;/li&gt;
&lt;li&gt;Filter: Completed issues, last 3 months&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Table View — Blocked Issues and Escalations
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Daily standup, impediment tracking, management escalation.&lt;/p&gt;

&lt;p&gt;Sometimes you don't need a visualization — you need a list. A table filtered to "Blocked" issues with columns for assignee, block reason, and days blocked is more actionable in a standup than any chart.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;View type: Table&lt;/li&gt;
&lt;li&gt;Filter: Status = Blocked, or Label = "escalated"&lt;/li&gt;
&lt;li&gt;Columns: Issue key, Summary, Assignee, Days open&lt;/li&gt;
&lt;li&gt;Sort: Days open (descending)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  One Dashboard, One Audience
&lt;/h2&gt;

&lt;p&gt;The practical setup that works: one dashboard per team type, pinned as the default for that team's Jira project.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sprint team:&lt;/strong&gt; Velocity line + status bar + blocked table&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Engineering manager:&lt;/strong&gt; Workload bar + cumulative flow area + cycle time scatter&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Product stakeholder:&lt;/strong&gt; Release progress bar + priority pie + escalation table&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each dashboard has three gadgets. Three is usually enough. If you need a fourth, something on the existing board isn't earning its space.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&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;Charts - Reports and Graphs for Jira Dashboard&lt;/a&gt; is available on the Atlassian Marketplace. Add it to any Jira dashboard gadget, choose your chart type, connect it to a project or JQL filter, and it renders immediately from your live Jira data.&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>
    <item>
      <title>How Finance Teams Document Quantitative Models in Confluence</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Fri, 29 May 2026 11:32:11 +0000</pubDate>
      <link>https://dev.to/yamuno-software/how-finance-teams-document-quantitative-models-in-confluence-33g0</link>
      <guid>https://dev.to/yamuno-software/how-finance-teams-document-quantitative-models-in-confluence-33g0</guid>
      <description>&lt;h1&gt;
  
  
  How Finance Teams Document Quantitative Models in Confluence
&lt;/h1&gt;

&lt;p&gt;Most quantitative model documentation is a mess — not because quants don't care about documentation, but because the tools for writing math and the tools for sharing knowledge with a team don't overlap.&lt;/p&gt;

&lt;p&gt;The model lives in Python or R. The derivations live in a LaTeX PDF that took three days to write and is now orphaned in a shared drive folder nobody navigates. The assumptions are in a Word document last edited in 2023. The backtesting results are in Excel. A new analyst joining the team has to reconstruct the model's intent by reading code comments and asking questions.&lt;/p&gt;

&lt;p&gt;Confluence is where team knowledge should live. But until recently, Confluence had no good way to write actual math — which meant quant teams had the choice between prose approximations that lose precision, or screenshots of equations that become wrong the moment the model changes.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Quantitative Model Documentation Should Include
&lt;/h2&gt;

&lt;p&gt;Good model documentation isn't just the formula. It's the context that makes the formula meaningful to someone who didn't build it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model purpose and scope&lt;/strong&gt; — what decision this model informs, what asset class or portfolio it applies to, and what it explicitly does not cover. This section is often skipped and is often the most important.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Assumptions&lt;/strong&gt; — every model has them. Write them down explicitly. Which distributional assumptions are you making? What market conditions does the model assume? Where does it break down?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Formula derivation&lt;/strong&gt; — the derivation from first principles, or a clear reference to where that derivation lives. Not just the final formula, but why it takes that form.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Input and output specification&lt;/strong&gt; — what goes in, what comes out, what units, what frequency, what data sources. A table is cleaner than prose here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Backtesting and validation results&lt;/strong&gt; — summary statistics, time period, benchmark comparison. These change as you re-run validation; note the date.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limitations and known failure modes&lt;/strong&gt; — where the model underperforms, what conditions make it unreliable, what it should not be used for. This is the section that protects the team.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Version and change history&lt;/strong&gt; — when the model was last updated, what changed, and why.&lt;/p&gt;




&lt;h2&gt;
  
  
  Writing Formulas in Confluence with LaTeX
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://marketplace.atlassian.com/apps/1602849193/latex-math-for-confluence-formulas-equations?hosting=cloud&amp;amp;tab=overview" rel="noopener noreferrer"&gt;LaTeX Math for Confluence&lt;/a&gt; adds a &lt;code&gt;/latex&lt;/code&gt; macro to Confluence that renders LaTeX equations live on the page. Type the macro, write the LaTeX source, and the rendered equation appears — inline or as a block. No screenshots, no external editors, no export-and-upload cycle.&lt;/p&gt;

&lt;p&gt;Here's what real quant model documentation looks like with it.&lt;/p&gt;




&lt;h3&gt;
  
  
  Option Pricing: Black-Scholes
&lt;/h3&gt;

&lt;p&gt;The Black-Scholes formula for a European call option:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;C = S&lt;span class="p"&gt;_&lt;/span&gt;0 &lt;span class="k"&gt;\,&lt;/span&gt; N(d&lt;span class="p"&gt;_&lt;/span&gt;1) - K e&lt;span class="p"&gt;^{&lt;/span&gt;-rT&lt;span class="p"&gt;}&lt;/span&gt; N(d&lt;span class="p"&gt;_&lt;/span&gt;2)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;d&lt;span class="p"&gt;_&lt;/span&gt;1 = &lt;span class="k"&gt;\frac&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\ln&lt;/span&gt;(S&lt;span class="p"&gt;_&lt;/span&gt;0 / K) + (r + &lt;span class="k"&gt;\tfrac&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;1&lt;span class="p"&gt;}{&lt;/span&gt;2&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="k"&gt;\sigma&lt;/span&gt;&lt;span class="p"&gt;^&lt;/span&gt;2)T&lt;span class="p"&gt;}{&lt;/span&gt;&lt;span class="k"&gt;\sigma\sqrt&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;T&lt;span class="p"&gt;}}&lt;/span&gt;
&lt;span class="k"&gt;\qquad&lt;/span&gt;
d&lt;span class="p"&gt;_&lt;/span&gt;2 = d&lt;span class="p"&gt;_&lt;/span&gt;1 - &lt;span class="k"&gt;\sigma\sqrt&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;T&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And $N(\cdot)$ is the standard normal CDF. Documenting the variable definitions inline is straightforward — you can mix inline LaTeX like $S_0$ (current price), $K$ (strike), $r$ (risk-free rate), $\sigma$ (volatility), $T$ (time to expiry) into a paragraph without switching formats.&lt;/p&gt;




&lt;h3&gt;
  
  
  Portfolio Risk: Variance and Volatility
&lt;/h3&gt;

&lt;p&gt;Portfolio variance for a two-asset portfolio:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;&lt;span class="k"&gt;\sigma&lt;/span&gt;&lt;span class="p"&gt;_&lt;/span&gt;p&lt;span class="p"&gt;^&lt;/span&gt;2 = w&lt;span class="p"&gt;_&lt;/span&gt;1&lt;span class="p"&gt;^&lt;/span&gt;2 &lt;span class="k"&gt;\sigma&lt;/span&gt;&lt;span class="p"&gt;_&lt;/span&gt;1&lt;span class="p"&gt;^&lt;/span&gt;2 + w&lt;span class="p"&gt;_&lt;/span&gt;2&lt;span class="p"&gt;^&lt;/span&gt;2 &lt;span class="k"&gt;\sigma&lt;/span&gt;&lt;span class="p"&gt;_&lt;/span&gt;2&lt;span class="p"&gt;^&lt;/span&gt;2 + 2 w&lt;span class="p"&gt;_&lt;/span&gt;1 w&lt;span class="p"&gt;_&lt;/span&gt;2 &lt;span class="k"&gt;\sigma&lt;/span&gt;&lt;span class="p"&gt;_&lt;/span&gt;1 &lt;span class="k"&gt;\sigma&lt;/span&gt;&lt;span class="p"&gt;_&lt;/span&gt;2 &lt;span class="k"&gt;\rho&lt;/span&gt;&lt;span class="p"&gt;_{&lt;/span&gt;12&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Generalised to $n$ assets using the covariance matrix $\Sigma$:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;&lt;span class="k"&gt;\sigma&lt;/span&gt;&lt;span class="p"&gt;_&lt;/span&gt;p&lt;span class="p"&gt;^&lt;/span&gt;2 = &lt;span class="k"&gt;\mathbf&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;w&lt;span class="p"&gt;}^&lt;/span&gt;&lt;span class="k"&gt;\top&lt;/span&gt; &lt;span class="k"&gt;\Sigma&lt;/span&gt; &lt;span class="k"&gt;\,&lt;/span&gt; &lt;span class="k"&gt;\mathbf&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;w&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where $\mathbf{w}$ is the vector of portfolio weights. This is the kind of expression that, written in plain text, requires three sentences to explain what a single line of math conveys unambiguously.&lt;/p&gt;




&lt;h3&gt;
  
  
  Performance Metrics: Sharpe and Sortino Ratios
&lt;/h3&gt;

&lt;p&gt;Sharpe ratio:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;S = &lt;span class="k"&gt;\frac&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\mathbb&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;E&lt;span class="p"&gt;}&lt;/span&gt;[R&lt;span class="p"&gt;_&lt;/span&gt;p - R&lt;span class="p"&gt;_&lt;/span&gt;f]&lt;span class="p"&gt;}{&lt;/span&gt;&lt;span class="k"&gt;\sigma&lt;/span&gt;&lt;span class="p"&gt;_&lt;/span&gt;p&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sortino ratio, which penalises only downside volatility:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;&lt;span class="k"&gt;\text&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;Sortino&lt;span class="p"&gt;}&lt;/span&gt; = &lt;span class="k"&gt;\frac&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\mathbb&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;E&lt;span class="p"&gt;}&lt;/span&gt;[R&lt;span class="p"&gt;_&lt;/span&gt;p - R&lt;span class="p"&gt;_&lt;/span&gt;f]&lt;span class="p"&gt;}{&lt;/span&gt;&lt;span class="k"&gt;\sigma&lt;/span&gt;&lt;span class="p"&gt;_&lt;/span&gt;d&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;\qquad&lt;/span&gt;
&lt;span class="k"&gt;\sigma&lt;/span&gt;&lt;span class="p"&gt;_&lt;/span&gt;d = &lt;span class="k"&gt;\sqrt&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\mathbb&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;E&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="k"&gt;\left&lt;/span&gt;&lt;span class="na"&gt;[\min(R_p - R_f,\, 0)^2\right]&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Documenting both on the same page with their formulas makes clear why you might prefer one over the other for a strategy with asymmetric return distributions — which is precisely the kind of reasoning that should be captured in model documentation.&lt;/p&gt;




&lt;h3&gt;
  
  
  Risk Models: Value at Risk
&lt;/h3&gt;

&lt;p&gt;Parametric VaR at confidence level $\alpha$:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;&lt;span class="k"&gt;\text&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;VaR&lt;span class="p"&gt;}_&lt;/span&gt;&lt;span class="k"&gt;\alpha&lt;/span&gt; = &lt;span class="k"&gt;\mu&lt;/span&gt;&lt;span class="p"&gt;_&lt;/span&gt;p - z&lt;span class="p"&gt;_&lt;/span&gt;&lt;span class="k"&gt;\alpha&lt;/span&gt; &lt;span class="k"&gt;\,&lt;/span&gt; &lt;span class="k"&gt;\sigma&lt;/span&gt;&lt;span class="p"&gt;_&lt;/span&gt;p
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Historical simulation VaR — defined as the $(1-\alpha)$ quantile of the empirical return distribution ${r_t}_{t=1}^T$:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;&lt;span class="k"&gt;\text&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;VaR&lt;span class="p"&gt;}_&lt;/span&gt;&lt;span class="k"&gt;\alpha&lt;/span&gt; = -Q&lt;span class="p"&gt;_{&lt;/span&gt;1-&lt;span class="k"&gt;\alpha&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="k"&gt;\left&lt;/span&gt;(&lt;span class="k"&gt;\{&lt;/span&gt;r&lt;span class="p"&gt;_&lt;/span&gt;t&lt;span class="k"&gt;\}\right&lt;/span&gt;)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Conditional VaR (Expected Shortfall):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;&lt;span class="k"&gt;\text&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;CVaR&lt;span class="p"&gt;}_&lt;/span&gt;&lt;span class="k"&gt;\alpha&lt;/span&gt; = -&lt;span class="k"&gt;\mathbb&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;E&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="k"&gt;\left&lt;/span&gt;&lt;span class="na"&gt;[R \mid R \leq -\text{VaR}_\alpha\right]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These three measures are often discussed together but have meaningfully different properties in tail events. Having all three on one page with their exact definitions eliminates the ambiguity that shows up in verbal descriptions.&lt;/p&gt;




&lt;h3&gt;
  
  
  Fixed Income: Duration and Convexity
&lt;/h3&gt;

&lt;p&gt;Modified duration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;D&lt;span class="p"&gt;_{&lt;/span&gt;mod&lt;span class="p"&gt;}&lt;/span&gt; = -&lt;span class="k"&gt;\frac&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;1&lt;span class="p"&gt;}{&lt;/span&gt;P&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;\frac&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;dP&lt;span class="p"&gt;}{&lt;/span&gt;dy&lt;span class="p"&gt;}&lt;/span&gt; = &lt;span class="k"&gt;\frac&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;D&lt;span class="p"&gt;_{&lt;/span&gt;mac&lt;span class="p"&gt;}}{&lt;/span&gt;1 + y/m&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where $D_{mac}$ is Macaulay duration, $y$ is yield to maturity, and $m$ is the number of coupon periods per year.&lt;/p&gt;

&lt;p&gt;Convexity:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;C = &lt;span class="k"&gt;\frac&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;1&lt;span class="p"&gt;}{&lt;/span&gt;P&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;\frac&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;d&lt;span class="p"&gt;^&lt;/span&gt;2P&lt;span class="p"&gt;}{&lt;/span&gt;dy&lt;span class="p"&gt;^&lt;/span&gt;2&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Price change approximation incorporating both:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;&lt;span class="k"&gt;\frac&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\Delta&lt;/span&gt; P&lt;span class="p"&gt;}{&lt;/span&gt;P&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;\approx&lt;/span&gt; -D&lt;span class="p"&gt;_{&lt;/span&gt;mod&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;\cdot&lt;/span&gt; &lt;span class="k"&gt;\Delta&lt;/span&gt; y + &lt;span class="k"&gt;\frac&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;1&lt;span class="p"&gt;}{&lt;/span&gt;2&lt;span class="p"&gt;}&lt;/span&gt; C &lt;span class="k"&gt;\cdot&lt;/span&gt; (&lt;span class="k"&gt;\Delta&lt;/span&gt; y)&lt;span class="p"&gt;^&lt;/span&gt;2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Structuring a Model Documentation Page in Confluence
&lt;/h2&gt;

&lt;p&gt;A consistent page template makes model docs easier to write and easier to audit. Here's a structure that works:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Model: [Model Name]
├── 1. Overview
│   ├── Purpose
│   ├── Scope and applicable instruments
│   └── Owner and last review date
├── 2. Assumptions
│   └── Numbered list — be specific
├── 3. Model Specification
│   ├── Notation table (define every symbol)
│   ├── Derivation (or reference)
│   └── Final formula(s) as block equations
├── 4. Inputs and Outputs
│   └── Table: variable, type, source, frequency
├── 5. Implementation Notes
│   ├── Code reference (link to repo/file)
│   └── Numerical considerations (overflow, precision)
├── 6. Validation and Backtesting
│   ├── Methodology
│   ├── Time period
│   └── Results summary (table)
├── 7. Limitations
│   └── Explicit failure modes
└── 8. Change Log
    └── Date | Change | Author
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;strong&gt;notation table&lt;/strong&gt; in section 3 is often skipped and almost always needed. Every symbol used in the formulas should appear in a table with its definition, units, and typical range. A reader who wasn't in the original modelling sessions shouldn't have to guess what $\lambda$ refers to.&lt;/p&gt;




&lt;h2&gt;
  
  
  Keeping Model Documentation Up to Date
&lt;/h2&gt;

&lt;p&gt;Model documentation drifts for the same reason all documentation drifts: updating it is a separate step from updating the model.&lt;/p&gt;

&lt;p&gt;A few practices that help:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Treat the Confluence page as part of the model.&lt;/strong&gt; Link to it from the code repository — a comment in the main model file pointing to the Confluence page URL. When a developer opens the file to make changes, the docs link is visible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Add a documentation review step to your model validation process.&lt;/strong&gt; Most quant teams already have a formal model validation workflow. Add a checkpoint: has the Confluence page been updated to match the current implementation?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use the change log section.&lt;/strong&gt; It doesn't need to be exhaustive — a one-line entry per model update (date, what changed, who changed it) is enough to give future readers context. This is much cheaper to maintain than reconstructing history from git blame.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep equations as LaTeX source, not images.&lt;/strong&gt; The point of using &lt;a href="https://marketplace.atlassian.com/apps/1602849193/latex-math-for-confluence-formulas-equations?hosting=cloud&amp;amp;tab=overview" rel="noopener noreferrer"&gt;LaTeX Math for Confluence&lt;/a&gt; is that the source is editable in place. When a formula changes, you edit the LaTeX directly on the Confluence page — two minutes of work, not an export-and-upload cycle. That lower friction is what makes it realistic to keep docs in sync.&lt;/p&gt;




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

&lt;p&gt;Install &lt;a href="https://marketplace.atlassian.com/apps/1602849193/latex-math-for-confluence-formulas-equations?hosting=cloud&amp;amp;tab=overview" rel="noopener noreferrer"&gt;LaTeX Math for Confluence&lt;/a&gt; from the Atlassian Marketplace. On any Confluence page, type &lt;code&gt;/latex&lt;/code&gt; to insert a block equation or use the inline variant for in-paragraph math.&lt;/p&gt;

&lt;p&gt;Full documentation is at &lt;a href="https://dev.to/docs/latex-math-for-confluence"&gt;LaTeX Math for Confluence docs&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 to Use Confluence as a Developer Wiki</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Sat, 23 May 2026 09:56:30 +0000</pubDate>
      <link>https://dev.to/yamuno-software/how-to-use-confluence-as-a-developer-wiki-1bc2</link>
      <guid>https://dev.to/yamuno-software/how-to-use-confluence-as-a-developer-wiki-1bc2</guid>
      <description>&lt;h1&gt;
  
  
  How to Use Confluence as a Developer Wiki
&lt;/h1&gt;

&lt;p&gt;Confluence has a reputation problem with developers. It's slow. The editor is clunky. Markdown support used to be nonexistent. Half the team wants to write docs in GitHub, the other half uses Notion, and Confluence ends up as a graveyard of stale meeting notes and quarterly plans nobody reads.&lt;/p&gt;

&lt;p&gt;That reputation is partially deserved and partially outdated. There are cases where Confluence is genuinely the right choice for a developer wiki — and when it is, there's a right way to set it up so developers will actually use it.&lt;/p&gt;




&lt;h2&gt;
  
  
  When Confluence Makes Sense for Developers
&lt;/h2&gt;

&lt;p&gt;Don't reach for Confluence just because your company already has a license. Use it when these conditions are true:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your team already uses Jira.&lt;/strong&gt; The Jira ↔ Confluence integration is genuinely useful — linking a runbook to an incident, embedding a sprint's Jira issues in a planning page, referencing an ADR from a ticket. If your team lives in Jira, having docs one click away is real value.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You need docs linked to project history.&lt;/strong&gt; GitHub wikis are disconnected from non-code work. Notion has no Jira integration worth mentioning. Confluence lets you tie documentation to the projects, releases, and sprints that produced it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compliance or audit requirements exist.&lt;/strong&gt; If your team needs documented approval workflows, page history with authors and timestamps, or access controls on specific documentation, Confluence handles this natively. Most alternatives don't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your organization is large enough that discoverability matters.&lt;/strong&gt; In a 10-person team, everyone knows where docs live. In a 200-person engineering organization, cross-team search across a unified Confluence instance is worth a lot. Fragmented Notion workspaces and GitHub wikis across dozens of repos don't have that.&lt;/p&gt;

&lt;p&gt;If none of these apply, Notion or a docs-as-code approach (MDX files in a repo, rendered with a tool like Docusaurus) is probably the better call. Confluence is not the right tool for every team.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Structure a Developer Wiki in Confluence
&lt;/h2&gt;

&lt;p&gt;The most common failure mode is dumping everything into one space with no structure. Within a year it's unsearchable. The second failure mode is over-structuring — five levels of nesting that nobody can navigate.&lt;/p&gt;

&lt;p&gt;A practical structure for an engineering team's Confluence space:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Engineering (space root)
├── Onboarding
│   ├── New Engineer Setup
│   ├── Development Environment
│   ├── Access &amp;amp; Permissions Request
│   └── First Week Checklist
├── Architecture
│   ├── System Overview
│   ├── Architecture Decision Records (ADRs)
│   │   ├── ADR-001: Use PostgreSQL for primary storage
│   │   ├── ADR-002: Adopt event-driven architecture
│   │   └── ADR-003: ...
│   └── Data Flow Diagrams
├── Services
│   ├── auth-service
│   │   ├── Overview &amp;amp; Runbook
│   │   ├── API Reference
│   │   └── Known Issues
│   └── payments-service
│       └── ...
├── Runbooks
│   ├── Incident Response
│   ├── Database Failover
│   ├── Deployment Rollback
│   └── On-Call Handoff Template
├── Incident Postmortems
│   ├── 2026-04-12 Payment Processing Outage
│   └── 2026-03-07 Auth Service Latency Spike
└── Release Notes
    └── (one page per release or sprint)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A few principles behind this structure:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Runbooks get their own section&lt;/strong&gt; — not buried under individual services. When something is on fire at 2am, you want fast access without knowing which service owns the runbook.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ADRs live in Architecture&lt;/strong&gt; and follow a consistent template (context, decision, consequences). They're written once and rarely updated — that's fine, they're meant to capture a decision at a point in time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Incident Postmortems are first-class content.&lt;/strong&gt; Don't hide them or let them expire. They're the most valuable institutional knowledge a team produces.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Services have a lightweight, consistent structure&lt;/strong&gt; — not every possible sub-page, just overview, runbook, and API reference at minimum.&lt;/p&gt;




&lt;h2&gt;
  
  
  Making Confluence Actually Dev-Friendly
&lt;/h2&gt;

&lt;p&gt;The editor is where most developers tap out. The default Confluence editor is fine for business users writing prose, but it's friction for developers who think in markdown.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Markdown support.&lt;/strong&gt; &lt;a href="https://marketplace.atlassian.com/apps/1238017/markdown-renderer-for-confluence?hosting=cloud&amp;amp;tab=overview" rel="noopener noreferrer"&gt;Markdown Renderer for Confluence&lt;/a&gt; lets you write and maintain Confluence pages in pure markdown — including fenced code blocks with syntax highlighting, tables written as markdown tables, and inline formatting that looks exactly like it does in a README. No dealing with the visual editor for technical content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Importing existing docs.&lt;/strong&gt; If your team already has markdown documentation in a GitHub repo or a folder of &lt;code&gt;.md&lt;/code&gt; files, &lt;a href="https://marketplace.atlassian.com/apps/1231894/markdown-importer-for-confluence-markdown-exporter?hosting=cloud&amp;amp;tab=overview" rel="noopener noreferrer"&gt;Markdown Importer for Confluence&lt;/a&gt; can pull those in directly — preserving heading hierarchy, code blocks, internal links, and images — without a manual copy-paste operation for each file. For teams migrating from a GitHub wiki or a docs folder, this is the fastest path.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code blocks.&lt;/strong&gt; Confluence has native code block macros. Use them. Always specify the language. Unformatted terminal output and code snippets in regular text boxes are unusable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Labels and page properties.&lt;/strong&gt; Use labels consistently (e.g., &lt;code&gt;runbook&lt;/code&gt;, &lt;code&gt;adr&lt;/code&gt;, &lt;code&gt;postmortem&lt;/code&gt;, &lt;code&gt;service:auth&lt;/code&gt;) and you get free filtering. The Confluence built-in page properties macro lets you build tables that auto-populate from child pages — useful for a service catalog or ADR index.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Not to Do
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Don't put everything in Confluence.&lt;/strong&gt; Real-time communication belongs in Slack. Code review discussion belongs in GitHub. Work-in-progress thinking belongs in personal notes. Confluence is for stable, findable reference material — runbooks, specs, decisions, and onboarding docs. If it's likely to change daily, it probably shouldn't be in Confluence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't create pages without linking them to Jira.&lt;/strong&gt; The Jira integration is the main reason to choose Confluence over alternatives. If you're writing an ADR for a significant architecture decision, link it to the epic. If you're writing a runbook for a service, link the relevant Confluence page from the Jira project. Orphaned documentation gets stale because nobody finds it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't make pages too long.&lt;/strong&gt; Confluence has no natural incentive to keep pages short. A 10,000-word page that should be five linked pages is common and terrible. If you're scrolling for more than two screens to find what you need, split the page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't treat Confluence as a ticket system.&lt;/strong&gt; Action items and tasks go in Jira. Using Confluence pages to track work that should be in a Jira board is how you end up with two half-maintained systems instead of one.&lt;/p&gt;




&lt;h2&gt;
  
  
  An Honest Assessment
&lt;/h2&gt;

&lt;p&gt;Confluence is a real tradeoff. The editor is slower than a markdown file in VS Code. Search is good but not great for code snippets. Free-tier teams will find the cost steep. And it requires active maintenance — without someone periodically reviewing and archiving stale pages, it degrades into a documentation graveyard.&lt;/p&gt;

&lt;p&gt;What it's genuinely better at: stable, findable reference documentation for teams inside larger organizations that already run Jira. If that describes your situation, invest in a clear structure from day one, get markdown support in place so developers don't fight the editor, and keep the scope tight. A small, well-maintained Confluence space beats a large, neglected one every time.&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 to Document APIs in Confluence</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Wed, 20 May 2026 10:53:44 +0000</pubDate>
      <link>https://dev.to/yamuno-software/how-to-document-apis-in-confluence-4kja</link>
      <guid>https://dev.to/yamuno-software/how-to-document-apis-in-confluence-4kja</guid>
      <description>&lt;h1&gt;
  
  
  How to Document APIs in Confluence
&lt;/h1&gt;

&lt;p&gt;API docs fail for the same reasons every time: they live in too many places, nobody owns them, and updating them feels optional.&lt;/p&gt;

&lt;p&gt;The Postman collection is the real reference. The Swagger file is six months behind the code. The Confluence page was accurate once. The README has a curl example that stopped working in v2. Developers new to the codebase have to triangulate between all of them and ask a colleague anyway.&lt;/p&gt;

&lt;p&gt;Centralizing API documentation in Confluence doesn't fix all of this automatically — but it gives you a single place to link from everywhere else, and the right structure makes it far easier to keep up to date.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why API Documentation Gets Stale
&lt;/h2&gt;

&lt;p&gt;The core problem isn't that people are lazy. It's that documentation lives in a different tool than the code, so every change requires two actions: update the code, then update the docs. That second step gets skipped when deadlines are tight, and it never catches up.&lt;/p&gt;

&lt;p&gt;Secondary problems layer on top:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No clear owner.&lt;/strong&gt; The developer who built it moves on. Nobody else knows enough to update it confidently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wrong format.&lt;/strong&gt; Prose descriptions of request bodies are ambiguous. Code examples with no explanation assume too much. A mix of both with no consistent structure is the worst of both worlds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swagger/OpenAPI as the only source.&lt;/strong&gt; Auto-generated docs show you what the API does, not why, what the gotchas are, or what the actual production behavior looks like in edge cases.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Good API documentation combines auto-generated spec output with hand-written context. Confluence is where the hand-written context should live.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Good API Documentation Includes
&lt;/h2&gt;

&lt;p&gt;For each API (or logical group of endpoints), your documentation should cover:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Authentication and authorization&lt;/strong&gt; — how to get credentials, token lifetime, scope requirements, which endpoints need which permissions. This is the most-asked question from new integrators and the hardest to find in auto-generated docs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Base URL and versioning&lt;/strong&gt; — current version, how versioning works, deprecation policy. A table showing v1/v2 differences is worth more than a paragraph.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Endpoint reference&lt;/strong&gt; — for each endpoint: method, path, description, request parameters (path, query, header, body), example request, example response, error codes. See the template at the bottom of this post.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Error codes&lt;/strong&gt; — a dedicated table of all error codes, what they mean, and what the caller should do about them. &lt;code&gt;400 Bad Request&lt;/code&gt; is not useful documentation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Changelog&lt;/strong&gt; — what changed between versions and when. The changelog is the first thing an existing integrator checks when something breaks after a release.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rate limits and quotas&lt;/strong&gt; — numbers, what triggers throttling, what the response looks like, how to handle retry.&lt;/p&gt;




&lt;h2&gt;
  
  
  Structuring API Docs in Confluence
&lt;/h2&gt;

&lt;p&gt;A Confluence space structure that works well for a team maintaining one or more APIs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;API Documentation (space root)
├── Getting Started
│   ├── Authentication
│   ├── Rate Limits &amp;amp; Quotas
│   └── SDKs &amp;amp; Client Libraries
├── API Reference
│   ├── Users API
│   │   ├── GET /users
│   │   ├── POST /users
│   │   ├── GET /users/{id}
│   │   └── DELETE /users/{id}
│   └── Orders API
│       └── ...
├── Changelog
│   ├── v3.0.0 (2026-04-01)
│   ├── v2.5.0 (2025-12-10)
│   └── ...
└── Guides
    ├── Handling Pagination
    ├── Webhook Setup
    └── Error Handling Patterns
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keep the API Reference section flat within each API group — one page per endpoint. Deep nesting makes the sidebar useless. The Changelog and Guides sections are where you write prose; the Reference section is where you write specs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Writing Request and Response Examples in Confluence
&lt;/h2&gt;

&lt;p&gt;This is where most Confluence API docs fall apart. People write prose descriptions of JSON fields, or paste unformatted request examples that are impossible to scan.&lt;/p&gt;

&lt;p&gt;The right approach is structured code blocks with clear labels. &lt;a href="https://marketplace.atlassian.com/apps/1238017/markdown-renderer-for-confluence?hosting=cloud&amp;amp;tab=overview" rel="noopener noreferrer"&gt;Markdown Renderer for Confluence&lt;/a&gt; lets you write these directly in markdown on any Confluence page — including fenced code blocks with language hints that render with syntax highlighting.&lt;/p&gt;

&lt;p&gt;A request example written in markdown on a Confluence page:&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="gs"&gt;**Request**&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
http&lt;br&gt;
POST /v3/orders&lt;br&gt;
Authorization: Bearer {token}&lt;br&gt;
Content-Type: application/json&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "customer_id": "cus_8f3k2",&lt;br&gt;
  "items": [&lt;br&gt;
    { "sku": "WIDGET-001", "quantity": 2 },&lt;br&gt;
    { "sku": "GADGET-042", "quantity": 1 }&lt;br&gt;
  ],&lt;br&gt;
  "shipping_address": {&lt;br&gt;
    "line1": "123 Main St",&lt;br&gt;
    "city": "Austin",&lt;br&gt;
    "state": "TX",&lt;br&gt;
    "zip": "78701"&lt;br&gt;
  }&lt;br&gt;
}&lt;br&gt;
&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Response — 201 Created&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;json&lt;br&gt;
{&lt;br&gt;
  "order_id": "ord_9g4m1",&lt;br&gt;
  "status": "pending",&lt;br&gt;
  "created_at": "2026-05-20T14:32:00Z",&lt;br&gt;
  "total_cents": 4799&lt;br&gt;
}&lt;br&gt;
&lt;/code&gt; ``&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
This renders cleanly in Confluence via Markdown Renderer, and it's easy to edit. No Confluence macro hunting, no storage format XML — just write markdown.

---

## Keeping Docs in Sync with Code

The documentation drift problem doesn't go away with better structure — it needs a process fix too.

**Link the Confluence page from the code.** Add a comment in the route handler or controller pointing to the Confluence page. When a developer changes the endpoint, the link is right there.

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
python&lt;/p&gt;
&lt;h1&gt;
  
  
  POST /v3/orders
&lt;/h1&gt;
&lt;h1&gt;
  
  
  Docs: &lt;a href="https://yourspace.atlassian.net/wiki/x/AbCdEf" rel="noopener noreferrer"&gt;https://yourspace.atlassian.net/wiki/x/AbCdEf&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;@app.route("/v3/orders", methods=["POST"])&lt;br&gt;
def create_order():&lt;br&gt;
    ...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
**Add the docs update to your PR checklist.** If your team uses a PR template, add a checkbox: "Updated API docs in Confluence if endpoints changed." It sounds obvious but it works.

**Use the Confluence REST API for automated updates.** For teams with documentation-as-code workflows, the Confluence REST API lets you push page updates from CI. Your OpenAPI spec can be auto-rendered into a Confluence page on every merge to main, and the hand-written context pages stay separate and stable.

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
bash&lt;/p&gt;

&lt;h1&gt;
  
  
  Update a Confluence page via REST API
&lt;/h1&gt;

&lt;p&gt;curl -X PUT \&lt;br&gt;
  "&lt;a href="https://yoursite.atlassian.net/wiki/rest/api/content/%7BpageId%7D" rel="noopener noreferrer"&gt;https://yoursite.atlassian.net/wiki/rest/api/content/{pageId}&lt;/a&gt;" \&lt;br&gt;
  -H "Authorization: Bearer $CONFLUENCE_TOKEN" \&lt;br&gt;
  -H "Content-Type: application/json" \&lt;br&gt;
  -d '{&lt;br&gt;
    "version": { "number": 12 },&lt;br&gt;
    "title": "GET /users/{id}",&lt;br&gt;
    "type": "page",&lt;br&gt;
    "body": {&lt;br&gt;
      "storage": {&lt;br&gt;
        "value": "&lt;/p&gt;
&lt;p&gt;Updated content here&lt;/p&gt;",&lt;br&gt;
        "representation": "storage"&lt;br&gt;
      }&lt;br&gt;
    }&lt;br&gt;
  }'&lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
---

## Page Template: API Endpoint Reference

Here's a practical template for a single endpoint page. Copy it, fill it in, repeat per endpoint.

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;&lt;br&gt;
markdown&lt;/p&gt;

&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;Brief description of what this endpoint does and when to use it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Request
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Method &amp;amp; Path:&lt;/strong&gt; &lt;code&gt;POST /v3/users&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Authentication:&lt;/strong&gt; Bearer token required. Scope: &lt;code&gt;users:write&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Headers
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Header&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Authorization&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Bearer {token}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Content-Type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;&lt;code&gt;application/json&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Body Parameters
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;email&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;User's email address&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Display name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;role&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;One of: &lt;code&gt;admin&lt;/code&gt;, &lt;code&gt;member&lt;/code&gt;, &lt;code&gt;viewer&lt;/code&gt;. Default: &lt;code&gt;member&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Example Request
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /v3/users
Authorization: Bearer eyJhb...
Content-Type: application/json

{
  "email": "alex@example.com",
  "name": "Alex Kim",
  "role": "member"
}
` ``

## Response

### 201 Created

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
json&lt;br&gt;
{&lt;br&gt;
  "user_id": "usr_7c2p9",&lt;br&gt;
  "email": "&lt;a href="mailto:alex@example.com"&gt;alex@example.com&lt;/a&gt;",&lt;br&gt;
  "name": "Alex Kim",&lt;br&gt;
  "role": "member",&lt;br&gt;
  "created_at": "2026-05-20T10:00:00Z"&lt;br&gt;
}&lt;br&gt;
&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;h2&gt;
  
  
  Error Codes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;400&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Missing required field&lt;/td&gt;
&lt;td&gt;Check request body against schema&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;409&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Email already registered&lt;/td&gt;
&lt;td&gt;Use existing account or change email&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;422&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Invalid role value&lt;/td&gt;
&lt;td&gt;Use one of: admin, member, viewer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;429&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Rate limit exceeded&lt;/td&gt;
&lt;td&gt;Back off and retry after &lt;code&gt;Retry-After&lt;/code&gt; header&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Notes
&lt;/h2&gt;

&lt;p&gt;Any gotchas, rate limit specifics, or behavior that differs from the general rules.&lt;br&gt;
&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;




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

&lt;p&gt;Install &lt;a href="https://marketplace.atlassian.com/apps/1238017/markdown-renderer-for-confluence?hosting=cloud&amp;amp;tab=overview" rel="noopener noreferrer"&gt;Markdown Renderer for Confluence&lt;/a&gt; from the Atlassian Marketplace to write and edit API docs in markdown directly on Confluence pages — code blocks, tables, and all.&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>
      <category>api</category>
      <category>productivity</category>
      <category>tooling</category>
      <category>writing</category>
    </item>
    <item>
      <title>How Engineering Teams Use Confluence Effectively</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Fri, 15 May 2026 10:27:11 +0000</pubDate>
      <link>https://dev.to/yamuno-software/how-engineering-teams-use-confluence-effectively-d80</link>
      <guid>https://dev.to/yamuno-software/how-engineering-teams-use-confluence-effectively-d80</guid>
      <description>&lt;h1&gt;
  
  
  How Engineering Teams Use Confluence Effectively
&lt;/h1&gt;

&lt;p&gt;Most engineering teams have a love-hate relationship with Confluence. They hate writing in it, but they rely on it when they need to find something — architecture decisions, onboarding docs, incident runbooks. The problem is that the content is usually out of date, hard to find, or both.&lt;/p&gt;

&lt;p&gt;This post is about the structural and cultural patterns that make Confluence actually work for engineering teams — not just as a place to store things, but as a resource people actively use.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Engineering Documentation Fails
&lt;/h2&gt;

&lt;p&gt;Before talking about what works, it's worth being honest about why it usually doesn't.&lt;/p&gt;

&lt;h3&gt;
  
  
  Docs Written Once, Never Touched Again
&lt;/h3&gt;

&lt;p&gt;The most common failure mode: documentation is written at project kick-off or system launch, never updated, and goes stale within a quarter. Engineers stop trusting it. When they stop trusting it, they stop reading it. When they stop reading it, nobody updates it because nobody's reading it.&lt;/p&gt;

&lt;p&gt;Stale documentation is worse than no documentation in one specific way: it creates false confidence. A runbook that worked 18 months ago and has been superseded by infrastructure changes will mislead the on-call engineer who follows it.&lt;/p&gt;

&lt;h3&gt;
  
  
  No Structure, Everything in Tickets
&lt;/h3&gt;

&lt;p&gt;Jira tickets are not documentation. They capture decisions in the context of a sprint, not in a form that's navigable six months later. Teams that default to "it's all in the tickets" are actually defaulting to "we have no documentation."&lt;/p&gt;

&lt;p&gt;Tickets are ephemeral by design. Documentation needs to be durable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Flat Spaces With No Hierarchy
&lt;/h3&gt;

&lt;p&gt;A Confluence space with 300 pages at the root level is a search problem disguised as a documentation problem. If the only way to find something is to know its exact title and search for it, your information architecture has failed.&lt;/p&gt;




&lt;h2&gt;
  
  
  What High-Performing Teams Do Differently
&lt;/h2&gt;

&lt;h3&gt;
  
  
  One Space Per Team or Service
&lt;/h3&gt;

&lt;p&gt;The clearest organizing principle that works at scale: one Confluence space per team or service domain, not per project or initiative.&lt;/p&gt;

&lt;p&gt;Projects come and go. Teams and services are durable. If your documentation is organized around projects, it fragments and orphans over time. If it's organized around teams, there's always a clear owner and a natural home for new content.&lt;/p&gt;

&lt;p&gt;A backend services team might have one space. Inside that space: onboarding, system architecture, runbooks, ADRs, deployment guides. Every page has a clear home because every page belongs to the team, not to a project that ended.&lt;/p&gt;

&lt;h3&gt;
  
  
  Clear Page Templates
&lt;/h3&gt;

&lt;p&gt;Consistency reduces the activation energy for writing documentation. When engineers have to invent the structure from scratch, many just don't. When there's a template, the blank page is already half-filled.&lt;/p&gt;

&lt;p&gt;Useful templates for engineering teams:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RFC (Request for Comments)&lt;/strong&gt; — for proposing significant changes before implementation. Sections: Background, Proposal, Alternatives Considered, Open Questions, Decision. The goal is to force structured thinking before anyone writes code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ADR (Architecture Decision Record)&lt;/strong&gt; — for recording decisions after they're made. Shorter than an RFC. Sections: Context, Decision, Status, Consequences. ADRs are valuable specifically because they capture the &lt;em&gt;why&lt;/em&gt;, not just the &lt;em&gt;what&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Runbook&lt;/strong&gt; — for operational procedures. Sections: Purpose, When to Use This, Prerequisites, Steps, Rollback, Escalation. A runbook that doesn't have a rollback section isn't complete.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Incident Post-Mortem&lt;/strong&gt; — for documenting what went wrong, why, and what changes. Sections: Timeline, Root Cause, Contributing Factors, Action Items. No blame, lots of specificity.&lt;/p&gt;

&lt;p&gt;Create these as Confluence templates in your space. When someone creates a new page and selects the template, the structure is there immediately.&lt;/p&gt;

&lt;h3&gt;
  
  
  Linking Jira and Confluence Intentionally
&lt;/h3&gt;

&lt;p&gt;Confluence and Jira are designed to interoperate, but most teams use them in parallel rather than together. The patterns that work:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Link Jira epics to Confluence specs.&lt;/strong&gt; When you start planning a significant feature, create the Confluence RFC or spec first, then link it from the Jira epic. Every engineer who opens that epic can navigate to the detailed context without searching.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Link Confluence runbooks to Jira service requests.&lt;/strong&gt; If your team uses Jira Service Management, link the relevant runbooks to request types. On-call engineers get the runbook in context, not as a bookmark to remember.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reference ADRs from Jira epics that implement them.&lt;/strong&gt; When a decision is made and recorded as an ADR, link it from every Jira epic that implements or is affected by it. This gives future engineers the context for why things are built the way they are.&lt;/p&gt;

&lt;p&gt;These links don't take long to add and pay significant dividends when someone is debugging or onboarding six months later.&lt;/p&gt;




&lt;h2&gt;
  
  
  Writing Docs Engineers Will Actually Read
&lt;/h2&gt;

&lt;p&gt;The content matters as much as the structure. Documentation that engineers actually read shares a few traits:&lt;/p&gt;

&lt;h3&gt;
  
  
  Short and Specific
&lt;/h3&gt;

&lt;p&gt;Documentation that tries to cover everything is documentation nobody reads. A runbook should cover exactly what it says it covers. An ADR should explain the decision, not the entire history of the system.&lt;/p&gt;

&lt;p&gt;Write for the person who has a specific question, not the person who's reading from the beginning.&lt;/p&gt;

&lt;h3&gt;
  
  
  Code-First Where Relevant
&lt;/h3&gt;

&lt;p&gt;For engineering documentation, showing beats telling. If you're documenting how to configure a service, show the config file. If you're documenting an API, show the request and response. If you're documenting a deployment process, show the commands.&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="c"&gt;# Deploy to staging&lt;/span&gt;
git tag &lt;span class="nt"&gt;-a&lt;/span&gt; v1.4.2 &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Release v1.4.2"&lt;/span&gt;
git push origin v1.4.2
&lt;span class="c"&gt;# CI picks up the tag and deploys automatically&lt;/span&gt;
&lt;span class="c"&gt;# Monitor at: https://grafana.internal/d/deploy-status&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is clearer and more useful than three paragraphs describing the same process.&lt;/p&gt;

&lt;h3&gt;
  
  
  Acknowledge When Things Are Outdated
&lt;/h3&gt;

&lt;p&gt;Teams that add a "Last verified: [date]" note to runbooks and architecture docs create a signal that helps readers calibrate. A runbook last verified six months ago warrants more skepticism than one verified last week. It also creates a natural trigger for review — if you see a last-verified date that's too old, update it when you next use the doc.&lt;/p&gt;

&lt;h3&gt;
  
  
  Markdown-Friendly
&lt;/h3&gt;

&lt;p&gt;Engineers are comfortable with markdown. They use it in pull requests, READMEs, and issue comments. Forcing them into the Confluence rich text editor creates friction that compounds over time — small enough to ignore, large enough to matter.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.atlassian.com/apps/1238017/markdown-renderer-for-confluence?hosting=cloud&amp;amp;tab=overview" rel="noopener noreferrer"&gt;Markdown Renderer for Confluence&lt;/a&gt; lets engineers write documentation in markdown syntax directly inside Confluence pages. The macro renders it properly — tables, code blocks, task lists — without requiring them to change their writing workflow.&lt;/p&gt;

&lt;p&gt;For teams migrating existing documentation from GitHub wikis, Notion, or internal docs sites, &lt;a href="https://marketplace.atlassian.com/apps/1231894/markdown-importer-for-confluence-markdown-exporter?hosting=cloud&amp;amp;tab=overview" rel="noopener noreferrer"&gt;Markdown Importer for Confluence&lt;/a&gt; handles bulk imports — preserving hierarchy, converting links, and pulling content directly from a repository URL.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Onboarding Test
&lt;/h2&gt;

&lt;p&gt;Here's a practical way to evaluate whether your Confluence space is working: give a new engineer exactly 30 minutes to find the answers to these questions using only Confluence:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;How do I set up my local development environment?&lt;/li&gt;
&lt;li&gt;Where does service X store its data, and what's the schema?&lt;/li&gt;
&lt;li&gt;Who do I contact if the payment pipeline is down?&lt;/li&gt;
&lt;li&gt;What was the reasoning behind the message queue architecture choice?&lt;/li&gt;
&lt;li&gt;How do I deploy to staging?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If a new engineer can't answer these questions from your documentation in 30 minutes, the structure isn't working — regardless of whether the information technically exists somewhere.&lt;/p&gt;

&lt;p&gt;Run this test every six months. Use the results to drive documentation sprints, not individual blame.&lt;/p&gt;




&lt;h2&gt;
  
  
  Keeping It Current
&lt;/h2&gt;

&lt;p&gt;Documentation maintenance isn't glamorous, but it's the actual hard part. A few practices that help:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Assign page ownership.&lt;/strong&gt; Every page in a team space should have an owner — the person responsible for keeping it current. Confluence's page properties feature can track this. Without clear ownership, pages decay by default.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Review runbooks during incidents.&lt;/strong&gt; If you follow a runbook during an incident, update it immediately after. You have fresh context on what worked, what didn't, and what's missing. Incident reviews are the best documentation maintenance sessions you'll ever have.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Documentation as part of definition of done.&lt;/strong&gt; If your team has a Definition of Done for Jira tickets, add "relevant documentation updated" as a criterion for anything that changes system behavior, configuration, or process. This is cultural, not technical — it requires enforcement through code review and sprint retrospectives.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quarterly cleanup sprints.&lt;/strong&gt; Once a quarter, allocate a half-day for the team to review and update documentation. Not create new docs — review and update existing ones. Archive pages that are no longer relevant. Fix links that are broken. Update last-verified dates.&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Confluence works for engineering teams when the structure is clear (one space per team, templates for common doc types), when it's connected to Jira intentionally, and when the documentation is written the way engineers think — short, specific, code-first.&lt;/p&gt;

&lt;p&gt;The tooling helps. Markdown support removes friction for engineers who'd rather write in a text editor. Structured import handles migrations. But the structure and discipline are the foundation. Get those right and the rest follows.&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>Best Atlassian Marketplace Apps for Technical Documentation in 2026</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Tue, 12 May 2026 10:34:21 +0000</pubDate>
      <link>https://dev.to/yamuno-software/best-atlassian-marketplace-apps-for-technical-documentation-in-2026-3cc9</link>
      <guid>https://dev.to/yamuno-software/best-atlassian-marketplace-apps-for-technical-documentation-in-2026-3cc9</guid>
      <description>&lt;h1&gt;
  
  
  Best Atlassian Marketplace Apps for Technical Documentation in 2026
&lt;/h1&gt;

&lt;p&gt;Confluence out of the box is solid for general team documentation. For technical documentation specifically — API references, runbooks, architecture records, data science notebooks, engineering wikis — it has gaps. The native editor isn't built for developers, math rendering doesn't exist, and moving content in and out requires manual reformatting.&lt;/p&gt;

&lt;p&gt;The Marketplace fills most of these gaps. This is a category-by-category look at which apps are worth installing for technical teams, covering markdown support, math/equations, HTML embeds, and attachment management.&lt;/p&gt;




&lt;h2&gt;
  
  
  Category 1: Markdown Support
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Problem
&lt;/h3&gt;

&lt;p&gt;Developers write in markdown. Confluence doesn't speak markdown natively. This creates a translation tax — content written in a repo, a README, or a docs-as-code workflow has to be manually reformatted when it enters Confluence.&lt;/p&gt;

&lt;p&gt;The inverse is also true: documentation written in Confluence can't easily leave it. Export options produce mediocre HTML or PDFs, not clean markdown that can live in a Git repo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Markdown Renderer for Confluence
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://marketplace.atlassian.com/apps/1238017/markdown-renderer-for-confluence?hosting=cloud&amp;amp;tab=overview" rel="noopener noreferrer"&gt;Markdown Renderer for Confluence&lt;/a&gt; adds a macro to the Confluence editor that renders markdown inline. Paste markdown into the macro body, save the page, and it renders — tables, code blocks, math, task lists, all of it. No conversion step.&lt;/p&gt;

&lt;p&gt;This is the right tool when you want to write and maintain markdown directly inside Confluence without migrating your workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good for:&lt;/strong&gt; developers who prefer writing in markdown, teams embedding markdown content from other sources, documentation where the source needs to stay readable as plain text.&lt;/p&gt;

&lt;h3&gt;
  
  
  Markdown Importer &amp;amp; Exporter for Confluence
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://marketplace.atlassian.com/apps/1231894/markdown-importer-for-confluence-markdown-exporter?hosting=cloud&amp;amp;tab=overview" rel="noopener noreferrer"&gt;Markdown Importer for Confluence &amp;amp; Markdown Exporter&lt;/a&gt; handles bulk movement of content: import a ZIP of markdown files, a GitHub repository, or a single file — and export Confluence pages back to markdown.&lt;/p&gt;

&lt;p&gt;It preserves hierarchy (folder structure becomes page tree), converts internal links, handles frontmatter, and exposes a REST API for CI/CD pipeline integration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good for:&lt;/strong&gt; migrating documentation from GitHub, GitLab, Notion, or any markdown-native source into Confluence; maintaining docs-as-code workflows where Confluence is the published output.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Other options:&lt;/strong&gt; There are a few other markdown import tools on the Marketplace. Most are Connect-based (externally hosted), which introduces data routing concerns for teams with strict data residency requirements. Markdown Importer is Forge-native — all processing happens inside Atlassian infrastructure.&lt;/p&gt;




&lt;h2&gt;
  
  
  Category 2: Math and Equations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Problem
&lt;/h3&gt;

&lt;p&gt;Technical documentation for engineering, data science, and academic teams frequently needs equations. Confluence has no native math rendering. Your options without an app are: screenshots (bad for accessibility and editability), plain text approximations, or external image generators with manual embed.&lt;/p&gt;

&lt;h3&gt;
  
  
  LaTeX Math for Confluence
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://marketplace.atlassian.com/apps/1238016/latex-math-for-confluence?hosting=cloud&amp;amp;tab=overview" rel="noopener noreferrer"&gt;LaTeX Math for Confluence&lt;/a&gt; adds a Forge-native LaTeX macro that renders equations server-side. Write standard LaTeX syntax, get rendered math on the page — both inline and display (block) modes supported.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;&lt;span class="k"&gt;\int&lt;/span&gt;&lt;span class="p"&gt;_{&lt;/span&gt;0&lt;span class="p"&gt;}^{&lt;/span&gt;&lt;span class="k"&gt;\infty&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; e&lt;span class="p"&gt;^{&lt;/span&gt;-x&lt;span class="p"&gt;^&lt;/span&gt;2&lt;span class="p"&gt;}&lt;/span&gt; dx = &lt;span class="k"&gt;\frac&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\sqrt&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\pi&lt;/span&gt;&lt;span class="p"&gt;}}{&lt;/span&gt;2&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The macro handles the full LaTeX math environment: fractions, summations, integrals, matrices, Greek letters, operator names — anything in the standard math mode command set.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good for:&lt;/strong&gt; machine learning documentation, engineering specifications, scientific research, academic writing published to Confluence, or any technical content where equations need to be editable (not screenshots).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Other options:&lt;/strong&gt; MathJax-based browser-side renderers exist on the Marketplace. They work, but rendering happens client-side — which can produce flash-of-unstyled-content issues and inconsistency across exported PDFs. Server-side rendering (Forge) is more reliable for documentation that needs to be exported or printed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Category 3: Diagrams and Visuals
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Problem
&lt;/h3&gt;

&lt;p&gt;Architecture diagrams, flow charts, and sequence diagrams are core to technical documentation. They need to be editable by team members, not just the original author who exported a PNG from their laptop.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's Available
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;draw.io / Diagrams.net for Confluence&lt;/strong&gt; is the dominant tool here. It's widely used, has good Confluence integration, and supports UML, BPMN, network diagrams, and general flowcharts. It's a Connect app (externally hosted by JGraph), which is worth knowing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gliffy&lt;/strong&gt; is the other major option — similar capabilities, longer history in the Confluence ecosystem. Also Connect-based.&lt;/p&gt;

&lt;p&gt;For code-based diagrams (Mermaid, PlantUML, Graphviz), there are several Forge-native apps emerging that let you write diagram definitions as text and render them inline. This fits well with docs-as-code workflows where diagrams should be version-controllable.&lt;/p&gt;

&lt;p&gt;Yamuno doesn't currently publish a diagram app. The draw.io and Gliffy integrations are solid choices for general diagram needs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Category 4: HTML and Code Embeds
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Problem
&lt;/h3&gt;

&lt;p&gt;Some technical documentation needs custom HTML — embedded interactive demos, styled tables that go beyond Confluence's native capabilities, custom callout boxes, or content migrated from an HTML-based documentation system.&lt;/p&gt;

&lt;p&gt;Confluence strips raw HTML by default for security reasons. The native editor provides no HTML passthrough.&lt;/p&gt;

&lt;h3&gt;
  
  
  HTML Macro for Confluence
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://marketplace.atlassian.com/apps/1238018/html-macro-for-confluence?hosting=cloud&amp;amp;tab=overview" rel="noopener noreferrer"&gt;HTML Macro for Confluence&lt;/a&gt; adds a Forge-native macro that renders raw HTML on Confluence pages. Write or paste HTML into the macro body and it renders in-page.&lt;/p&gt;

&lt;p&gt;This is useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Interactive embeds&lt;/strong&gt; — API sandbox widgets, embedded iframes, interactive demos&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom styled tables&lt;/strong&gt; — when the native Confluence table editor isn't flexible enough&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Migrated content&lt;/strong&gt; — documentation originally written in HTML that needs to land in Confluence without losing formatting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom callout layouts&lt;/strong&gt; — info boxes, warning panels, or custom visual elements not available natively&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Security note: HTML rendering is controlled by Confluence admins. The macro respects Confluence's content security policies — scripts and external resource loading are subject to the same controls as the rest of the instance.&lt;/p&gt;




&lt;h2&gt;
  
  
  Category 5: Attachment Management
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Problem
&lt;/h3&gt;

&lt;p&gt;Technical documentation accumulates attachments — build artifacts, design files, exported reports, architecture diagrams, release packages. Over time, Confluence spaces fill with orphaned attachments, duplicate files, and files nobody can find because there's no organization layer.&lt;/p&gt;

&lt;p&gt;The native Confluence attachment experience is minimal: files attached to pages, a basic list view, no folder structure, no bulk operations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Advanced Attachment Manager for Confluence
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://marketplace.atlassian.com/apps/1238019/advanced-attachment-manager-for-confluence?hosting=cloud&amp;amp;tab=overview" rel="noopener noreferrer"&gt;Advanced Attachment Manager for Confluence&lt;/a&gt; adds structured attachment management to Confluence pages — folder organization, version tracking, bulk upload/download, and better search across attachments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good for:&lt;/strong&gt; teams that use Confluence pages to distribute files (release packages, build artifacts, design assets), engineering teams running design review or release management in Confluence, documentation spaces where attachments are first-class content.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Evaluate Marketplace Apps
&lt;/h2&gt;

&lt;p&gt;Two things worth checking before installing any Marketplace app:&lt;/p&gt;

&lt;h3&gt;
  
  
  Forge vs Connect
&lt;/h3&gt;

&lt;p&gt;Forge apps run inside Atlassian's infrastructure. Your data never routes through an external server. This matters for teams with data residency requirements, SOC 2 compliance obligations, or strict network policies.&lt;/p&gt;

&lt;p&gt;Connect apps (labeled "server" or with an external vendor hosting model) route data through the vendor's servers. This is fine for many teams but is worth understanding upfront — especially for apps that process documentation content.&lt;/p&gt;

&lt;p&gt;All Yamuno apps are Forge-native. On any app's Marketplace listing, the hosting model is listed under the app details.&lt;/p&gt;

&lt;h3&gt;
  
  
  Permissions and Scopes
&lt;/h3&gt;

&lt;p&gt;Check what Confluence and Jira permissions an app requests at install time. A diagram app that requests write access to your entire Confluence space should prompt questions. Most legitimate apps request narrow, sensible scopes — if something seems excessive, read the privacy policy and check the vendor's security documentation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Need&lt;/th&gt;
&lt;th&gt;App&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Write markdown in Confluence&lt;/td&gt;
&lt;td&gt;Markdown Renderer for Confluence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Import/export markdown in bulk&lt;/td&gt;
&lt;td&gt;Markdown Importer &amp;amp; Exporter for Confluence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LaTeX equations&lt;/td&gt;
&lt;td&gt;LaTeX Math for Confluence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Diagrams&lt;/td&gt;
&lt;td&gt;draw.io or Gliffy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Raw HTML embeds&lt;/td&gt;
&lt;td&gt;HTML Macro for Confluence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Attachment organization&lt;/td&gt;
&lt;td&gt;Advanced Attachment Manager for Confluence&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All Yamuno apps are available on the &lt;a href="https://marketplace.atlassian.com/vendors/1225473" rel="noopener noreferrer"&gt;Atlassian Marketplace&lt;/a&gt; — free to try, Forge-native.&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>Building a Jira Dashboard That Actually Tells You Something</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Thu, 07 May 2026 10:26:51 +0000</pubDate>
      <link>https://dev.to/yamuno-software/building-a-jira-dashboard-that-actually-tells-you-something-43m0</link>
      <guid>https://dev.to/yamuno-software/building-a-jira-dashboard-that-actually-tells-you-something-43m0</guid>
      <description>&lt;h1&gt;
  
  
  Building a Jira Dashboard That Actually Tells You Something
&lt;/h1&gt;

&lt;p&gt;Most Jira dashboards are abandoned within a month of being created. They start with good intentions — someone sets up a few gadgets, shares the link in Slack, and declares victory. Two sprints later, nobody opens it because the numbers don't mean anything or the widgets are always stale.&lt;/p&gt;

&lt;p&gt;The problem isn't Jira. It's that dashboards get built around what's easy to surface rather than what decisions they're supposed to support.&lt;/p&gt;

&lt;p&gt;This post covers how to think about Jira dashboards, what metrics actually matter, and how to set up charts that a real team will check daily.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Makes a Dashboard Useless
&lt;/h2&gt;

&lt;p&gt;Before getting into what works, it's worth naming the failure modes. Most bad Jira dashboards share a few characteristics:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Too many widgets.&lt;/strong&gt; A dashboard with 12 gadgets isn't 4x as useful as one with 3 — it's less useful because nothing stands out. If everything is visible, nothing is.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wrong time horizon.&lt;/strong&gt; A sprint burndown chart that resets every two weeks doesn't help you plan the quarter. A velocity trend over one sprint isn't a trend. Match the widget to the time horizon of the question you're asking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Metrics that measure activity, not outcomes.&lt;/strong&gt; "Issues created this week" tells you your team is logging tickets. It doesn't tell you whether the project is on track. Issues closed vs committed is a more honest number.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No audience.&lt;/strong&gt; A dashboard built for standup looks completely different from one built for an exec review. Mixing those purposes produces something that's mediocre for both.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Metrics That Actually Matter
&lt;/h2&gt;

&lt;p&gt;Here are the five metrics worth tracking for most software teams, and why:&lt;/p&gt;

&lt;h3&gt;
  
  
  Sprint Burndown
&lt;/h3&gt;

&lt;p&gt;The most immediate signal. Are you on track to complete your sprint commitment? A healthy burndown slopes steadily toward zero. A flat line mid-sprint means work isn't getting closed. A cliff at the end means scope wasn't broken down properly.&lt;/p&gt;

&lt;p&gt;Track it per sprint. The shape matters as much as the final number.&lt;/p&gt;

&lt;h3&gt;
  
  
  Velocity (Rolling Average)
&lt;/h3&gt;

&lt;p&gt;Sprint velocity — story points or issue count completed per sprint — is useful when you look at it over 4–8 sprints. A single sprint's velocity is noise. A rolling average is a planning input.&lt;/p&gt;

&lt;p&gt;Watch for velocity swings greater than ±30% — those usually point to estimation drift, unplanned work, or sprint scope changes worth discussing in retrospectives.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cycle Time
&lt;/h3&gt;

&lt;p&gt;How long does an issue take from "In Progress" to "Done"? Cycle time is one of the most diagnostic metrics in software delivery. High cycle times for small issues usually indicate blockers, review bottlenecks, or unclear acceptance criteria. High variance means your process is inconsistent.&lt;/p&gt;

&lt;p&gt;This is the metric most teams skip and then wonder why estimates are always wrong.&lt;/p&gt;

&lt;h3&gt;
  
  
  Blockers by Assignee
&lt;/h3&gt;

&lt;p&gt;How many blocked issues does each person have? This is a team health metric disguised as a workload metric. If one person has 5 blocked issues and everyone else has zero, that's a structural problem — not an individual one.&lt;/p&gt;

&lt;p&gt;Surface this in your standup dashboard so blockers get visibility before they become incidents.&lt;/p&gt;

&lt;h3&gt;
  
  
  Issues Without Assignees
&lt;/h3&gt;

&lt;p&gt;Work that's been created but not picked up. In a healthy sprint this number should be low. In a backlog it's expected. When it climbs during a sprint, it usually means scope crept in through the side door.&lt;/p&gt;




&lt;h2&gt;
  
  
  Setting Up Charts with Charts for Jira Dashboard
&lt;/h2&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;Charts - Reports and Graphs for Jira Dashboard&lt;/a&gt; is a Forge-native gadget that adds a proper charting layer to Jira dashboards. It supports bar charts, line charts, pie charts, and burndown-style visualizations — all configured directly in the dashboard without needing external tools or BI integrations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adding a Chart Gadget
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open your Jira dashboard (or create a new one)&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add gadget&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Search for &lt;strong&gt;Charts&lt;/strong&gt; — select the Charts gadget&lt;/li&gt;
&lt;li&gt;Configure the data source: choose your project, board, or a saved JQL filter&lt;/li&gt;
&lt;li&gt;Select the chart type&lt;/li&gt;
&lt;li&gt;Set your grouping dimension — status, assignee, priority, sprint, label, component&lt;/li&gt;
&lt;li&gt;Set the time range&lt;/li&gt;
&lt;li&gt;Save&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The gadget renders immediately and stays live — data updates automatically as issues change.&lt;/p&gt;

&lt;h3&gt;
  
  
  Grouping Options Worth Knowing
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Group by status&lt;/strong&gt; gives you a distribution view — how many issues are in each workflow state. Useful for spotting pileups (10 issues in "In Review," 2 in "Done" — something's blocking review).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Group by assignee&lt;/strong&gt; shows workload distribution. Combine with a filter for a specific sprint and you can see at a glance if load is balanced.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Group by label or component&lt;/strong&gt; is useful for teams that run mixed-project sprints — you can see how effort is distributed across workstreams.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Group by sprint&lt;/strong&gt; over multiple sprints gives you the velocity trend you need for planning conversations.&lt;/p&gt;




&lt;h2&gt;
  
  
  Three Dashboard Layouts for Different Audiences
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Standup Dashboard
&lt;/h3&gt;

&lt;p&gt;Audience: the team. Time horizon: current sprint.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Widget&lt;/th&gt;
&lt;th&gt;What It Shows&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sprint burndown&lt;/td&gt;
&lt;td&gt;Are we on track?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blocked issues by assignee&lt;/td&gt;
&lt;td&gt;What needs unblocking?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Issues in each status&lt;/td&gt;
&lt;td&gt;Where is work piling up?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Issues without assignees&lt;/td&gt;
&lt;td&gt;What hasn't been picked up?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Keep this to 4 widgets maximum. The goal is a 60-second read at 9am.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exec / Stakeholder Dashboard
&lt;/h3&gt;

&lt;p&gt;Audience: non-engineering leadership. Time horizon: current quarter.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Widget&lt;/th&gt;
&lt;th&gt;What It Shows&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Velocity trend (rolling 6 sprints)&lt;/td&gt;
&lt;td&gt;Is the team's throughput stable?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Epic progress (% complete)&lt;/td&gt;
&lt;td&gt;Are we hitting roadmap milestones?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Issues by priority (open)&lt;/td&gt;
&lt;td&gt;What's the risk surface?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Releases completed this quarter&lt;/td&gt;
&lt;td&gt;Shipping cadence&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Avoid sprint-level detail here. Execs want quarter-level signal, not sprint noise.&lt;/p&gt;

&lt;h3&gt;
  
  
  Retrospective Dashboard
&lt;/h3&gt;

&lt;p&gt;Audience: the team. Time horizon: completed sprint.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Widget&lt;/th&gt;
&lt;th&gt;What It Shows&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sprint burndown (completed sprint)&lt;/td&gt;
&lt;td&gt;Did we hit the commitment?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cycle time distribution&lt;/td&gt;
&lt;td&gt;Were estimates accurate?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unresolved issues carried over&lt;/td&gt;
&lt;td&gt;What spilled?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Velocity vs previous sprint&lt;/td&gt;
&lt;td&gt;Did throughput improve?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This dashboard exists to feed the retro conversation, not to survive past it. Create it, run the retro, archive it.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Note on JQL Filters
&lt;/h2&gt;

&lt;p&gt;Every chart in Charts for Jira is backed by a JQL filter. Learning a few patterns makes dashboard configuration much faster:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Current sprint, this project
project = MYPROJ AND sprint in openSprints()

-- Blocked issues
project = MYPROJ AND status = "Blocked"

-- Issues completed in last 30 days
project = MYPROJ AND status = Done AND resolutiondate &amp;gt;= -30d

-- High priority, unassigned
project = MYPROJ AND priority = High AND assignee is EMPTY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save your most-used filters in Jira's filter management — then reference them by name when configuring gadgets rather than re-entering JQL each time.&lt;/p&gt;




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

&lt;p&gt;Install &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;Charts - Reports and Graphs for Jira Dashboard&lt;/a&gt; from the Atlassian Marketplace. It's Forge-native and works on Jira Cloud.&lt;/p&gt;

&lt;p&gt;Full documentation is at &lt;a href="https://dev.to/docs/charts-for-jira-dashboard"&gt;/docs/charts-for-jira-dashboard&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>
  </channel>
</rss>
