<?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</title>
    <description>The latest articles on DEV Community by Yamuno (@yamuno101).</description>
    <link>https://dev.to/yamuno101</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%2Fuser%2Fprofile_image%2F3894350%2F6becc7cb-035b-4a32-98a2-71b6857aa7fd.png</url>
      <title>DEV Community: Yamuno</title>
      <link>https://dev.to/yamuno101</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yamuno101"/>
    <language>en</language>
    <item>
      <title>Jira Reporting for Product Managers: Charts, Metrics, and Dashboards</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Tue, 14 Jul 2026 10:00:30 +0000</pubDate>
      <link>https://dev.to/yamuno-software/jira-reporting-for-product-managers-charts-metrics-and-dashboards-4a1e</link>
      <guid>https://dev.to/yamuno-software/jira-reporting-for-product-managers-charts-metrics-and-dashboards-4a1e</guid>
      <description>&lt;h1&gt;
  
  
  Jira Reporting for Product Managers: Charts, Metrics, and Dashboards
&lt;/h1&gt;

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

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




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

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

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

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




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

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

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

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

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

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

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

&lt;/div&gt;






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

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

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

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

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

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




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

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

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

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

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

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




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

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

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

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

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

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




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

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

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

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

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

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




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

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

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

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

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

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




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

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

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




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

</description>
    </item>
    <item>
      <title>How to Add a Cover Page to Confluence PDF Exports</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Wed, 08 Jul 2026 10:21:04 +0000</pubDate>
      <link>https://dev.to/yamuno-software/how-to-add-a-cover-page-to-confluence-pdf-exports-8dc</link>
      <guid>https://dev.to/yamuno-software/how-to-add-a-cover-page-to-confluence-pdf-exports-8dc</guid>
      <description>&lt;h1&gt;
  
  
  How to Add a Cover Page to Confluence PDF Exports
&lt;/h1&gt;

&lt;p&gt;Confluence's built-in PDF export produces the page content and nothing else. No title page, no table of contents, no company logo — just the raw content starting at the top of page one. For internal drafts that's workable. For anything going to a client, a stakeholder, or an external auditor, a document that starts abruptly with content and no cover page looks unfinished.&lt;/p&gt;

&lt;p&gt;PDF Exporter for Confluence adds a cover page option with six built-in styles, full branding control, and a live preview so you can see exactly how the cover looks before exporting.&lt;/p&gt;

&lt;p&gt;This guide covers how to set it up.&lt;/p&gt;




&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Install &lt;a href="https://marketplace.atlassian.com/apps/726790413" rel="noopener noreferrer"&gt;PDF Exporter for Confluence&lt;/a&gt; from the Atlassian Marketplace. Cover page configuration is done through the template system, which requires Confluence admin access.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1 — Open the Template Editor
&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, click &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;li&gt;Either create a &lt;strong&gt;New Template&lt;/strong&gt; or click the edit (pencil) icon on an existing one&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Step 2 — Enable the Cover Page
&lt;/h2&gt;

&lt;p&gt;In the template editor, find the &lt;strong&gt;Cover Page&lt;/strong&gt; section and toggle it to enabled.&lt;/p&gt;

&lt;p&gt;Once enabled, the cover page configuration expands to show:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cover style selector&lt;/li&gt;
&lt;li&gt;Accent color picker&lt;/li&gt;
&lt;li&gt;Subtitle field&lt;/li&gt;
&lt;li&gt;Author field&lt;/li&gt;
&lt;li&gt;Logo upload&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A &lt;strong&gt;live preview&lt;/strong&gt; on the right side of the editor updates as you make changes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3 — Choose a Cover Style
&lt;/h2&gt;

&lt;p&gt;Six built-in styles are available:&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;Best for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Classic&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;General-purpose documents, internal wikis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Corporate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Client-facing deliverables, formal proposals&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Modern&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Product documentation, technical guides&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Executive&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Board reports, executive summaries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bold&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Internal team reports, product launches&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Minimal&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;When you only need the title with no decoration&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Click through the styles in the selector — the preview updates immediately so you can compare them without saving.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recommendation for client-facing documents:&lt;/strong&gt; Corporate or Executive. Both have a restrained, professional look that works across industries. Avoid Bold for external documents — it's visually strong but can feel informal in a business context.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4 — Set the Accent Color
&lt;/h2&gt;

&lt;p&gt;The accent color controls the decorative elements on the cover: the color bar in Corporate style, the accent line in Executive style, the overlay block in Modern style, and so on.&lt;/p&gt;

&lt;p&gt;Click the color field and enter your hex value. Use your company's primary brand color.&lt;/p&gt;

&lt;p&gt;If you don't have a specific brand color, &lt;code&gt;#1e40af&lt;/code&gt; (dark blue) or &lt;code&gt;#1d4ed8&lt;/code&gt; (medium blue) works well for most professional contexts. Avoid very light colors — they disappear against a white background on some cover styles.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5 — Add Your Logo
&lt;/h2&gt;

&lt;p&gt;Click &lt;strong&gt;Upload Logo&lt;/strong&gt; and select your company logo (PNG, JPG, or SVG). The logo appears on the cover page alongside the document title.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Logo tips:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use a horizontal logo variant if available — it fits better in most cover layouts&lt;/li&gt;
&lt;li&gt;PNG with a transparent background looks cleanest against the cover page background&lt;/li&gt;
&lt;li&gt;SVG scales perfectly at any size&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The logo is stored per template, so you upload it once and it appears on every export using this template.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 6 — Configure Subtitle and Author
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Subtitle:&lt;/strong&gt; Optional text displayed below the document title. Use this for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Version numbers ("Version 2.3 — April 2026")&lt;/li&gt;
&lt;li&gt;Confidentiality notice ("Confidential — Not for External Distribution")&lt;/li&gt;
&lt;li&gt;Document type ("Technical Specification")&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Author:&lt;/strong&gt; Optional name displayed on the cover. For team-produced documents, use a team or department name ("Solutions Engineering," "Product Team") rather than an individual's name — it ages better and is more appropriate for documents that will be revised over time.&lt;/p&gt;




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

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

&lt;p&gt;To test it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open 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 template from the dropdown&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Preview&lt;/strong&gt; (don't export yet — preview first)&lt;/li&gt;
&lt;li&gt;Check the cover page in the preview modal&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The preview shows the actual cover with your logo, accent color, and the Confluence page title as the document title. If anything looks off — logo too large, color doesn't match, subtitle missing — go back to the template and adjust.&lt;/p&gt;




&lt;h2&gt;
  
  
  How the Cover Page Interacts with the Rest of the PDF
&lt;/h2&gt;

&lt;p&gt;The cover page is always the first page. It does not count in page numbering — if you have page numbers enabled, they start from "1" on the first content page after the cover.&lt;/p&gt;

&lt;p&gt;If you also have a table of contents enabled, it appears after the cover page and before the content — the standard structure for a professional document.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Cover Page]
[Table of Contents]  ← if enabled
[Content Pages]      ← page numbers start here
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Exporting Without a Cover Page (When Needed)
&lt;/h2&gt;

&lt;p&gt;Sometimes you want a clean export without a cover — a raw content dump for internal review, or a quick single-page export that doesn't need a title page.&lt;/p&gt;

&lt;p&gt;The easiest approach is to keep a second "No Cover" template (or use the built-in Default template) for these cases. Users select the right template at export time based on what the document needs.&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/features/cover-page"&gt;Read the documentation →&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to Migrate from Notion to Confluence (Step-by-Step Guide)</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Fri, 03 Jul 2026 10:38:34 +0000</pubDate>
      <link>https://dev.to/yamuno-software/how-to-migrate-from-notion-to-confluence-step-by-step-guide-22l9</link>
      <guid>https://dev.to/yamuno-software/how-to-migrate-from-notion-to-confluence-step-by-step-guide-22l9</guid>
      <description>&lt;h1&gt;
  
  
  How to Migrate from Notion to Confluence
&lt;/h1&gt;

&lt;p&gt;Teams migrate from Notion to Confluence for different reasons — Atlassian ecosystem consolidation, enterprise SSO requirements, tighter Jira integration, or simply an organizational decision after a company merger. Whatever the reason, the migration path is more practical than it looks.&lt;/p&gt;

&lt;p&gt;Notion exports your content as markdown (or HTML). Confluence can import markdown. The gap between those two facts is what this guide covers: what the export gives you, what needs cleanup, and how to get everything into Confluence cleanly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1 — Export Your Notion Workspace to Markdown
&lt;/h2&gt;

&lt;p&gt;In Notion:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Settings &amp;amp; Members&lt;/strong&gt; → &lt;strong&gt;Settings&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Export all workspace content&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;Markdown &amp;amp; CSV&lt;/strong&gt; as the export format&lt;/li&gt;
&lt;li&gt;Enable &lt;strong&gt;Include subpages&lt;/strong&gt; and &lt;strong&gt;Create folders for subpages&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Export&lt;/strong&gt; and download the ZIP&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The export produces a ZIP with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One &lt;code&gt;.md&lt;/code&gt; file per Notion page&lt;/li&gt;
&lt;li&gt;Subpages nested in folders matching the page hierarchy&lt;/li&gt;
&lt;li&gt;Images saved as local files (usually in a folder alongside each page)&lt;/li&gt;
&lt;li&gt;Database tables exported as &lt;code&gt;.csv&lt;/code&gt; files&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 2 — Understand What Transfers Well and What Doesn't
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Transfers cleanly:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Text content, headings, paragraphs&lt;/li&gt;
&lt;li&gt;Bold, italic, inline code&lt;/li&gt;
&lt;li&gt;Bulleted and numbered lists&lt;/li&gt;
&lt;li&gt;Code blocks with language tags&lt;/li&gt;
&lt;li&gt;Images (as embedded files)&lt;/li&gt;
&lt;li&gt;Basic tables&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Needs manual attention:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Notion databases&lt;/strong&gt; — exported as CSV, not as Confluence pages. Plan to recreate these as Confluence tables or use a Jira integration for structured data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Toggle blocks&lt;/strong&gt; — exported as regular text; the expand/collapse behavior is lost&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notion-specific embeds&lt;/strong&gt; (YouTube, Figma, etc.) — exported as plain URLs, not embedded. You'll need to re-embed them in Confluence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linked databases and relations&lt;/strong&gt; — not preserved in markdown export&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comments and mentions&lt;/strong&gt; — not included in the export&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a large workspace, do a test export and import of a small section first to understand what the output looks like for your specific content before committing to a full migration.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3 — Clean Up the Exported Markdown
&lt;/h2&gt;

&lt;p&gt;Before importing, a few cleanup steps save time:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Remove Notion IDs from filenames.&lt;/strong&gt; Notion appends a unique ID to every file and folder name (e.g., &lt;code&gt;Engineering Wiki a3f2c1b4d5e6.md&lt;/code&gt;). You can strip these with a script or a bulk rename tool. The Markdown Importer uses the filename as the Confluence page title, so cleaner names give you cleaner page titles.&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;# macOS/Linux — remove Notion IDs from .md filenames&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;f &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;.md&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;&lt;span class="nv"&gt;newname&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'s/ [a-f0-9]\{32\}\.md$/.md/'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$newname&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;mv&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$newname&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Convert CSV databases to markdown tables.&lt;/strong&gt; For Notion databases that you want in Confluence as pages (not Jira issues), convert the CSV to a markdown table:&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;# Quick CSV to markdown table conversion (Python)&lt;/span&gt;
python3 &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"
rows = list(csv.reader(open(sys.argv[1])))
print('| ' + ' | '.join(rows[0]) + ' |')
print('| ' + ' | '.join(['---'] * len(rows[0])) + ' |')
for row in rows[1:]:
    print('| ' + ' | '.join(row) + ' |')
"&lt;/span&gt; your-database.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Organize the folder structure.&lt;/strong&gt; Notion's export mirrors its page hierarchy as nested folders. Review the structure and reorganize if needed — the folder structure becomes the Confluence page hierarchy.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4 — Import into Confluence
&lt;/h2&gt;

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

&lt;p&gt;&lt;strong&gt;For a small migration (up to 20–30 pages):&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the target Confluence page (where the imported pages should live)&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;•••&lt;/strong&gt; → &lt;strong&gt;Markdown Importer &amp;amp; Exporter&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Select your cleaned-up markdown files or the ZIP archive&lt;/li&gt;
&lt;li&gt;Enable &lt;strong&gt;Page Hierarchy&lt;/strong&gt; to preserve folder structure as Confluence parent/child pages&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Import&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;For a large migration:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use the ZIP upload option. Zip your cleaned-up Notion export folder (after stripping IDs and reorganizing) and upload it as a single archive. The importer processes the entire folder tree and creates the Confluence page hierarchy in one operation.&lt;/p&gt;

&lt;p&gt;If you're migrating multiple Notion workspaces or sections to different Confluence spaces, you can target different parent pages and spaces in separate import operations.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5 — Handle Images
&lt;/h2&gt;

&lt;p&gt;Notion's markdown export embeds images as relative file paths:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Markdown Importer reads the ZIP archive and uploads images as Confluence attachments, replacing the relative paths with Confluence attachment references automatically. This works when you import via ZIP — the images need to be inside the ZIP alongside the markdown files.&lt;/p&gt;

&lt;p&gt;If you're importing individual &lt;code&gt;.md&lt;/code&gt; files without a ZIP, images won't transfer automatically — you'll need to upload them to Confluence and update the image references manually.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 6 — Post-Import Cleanup
&lt;/h2&gt;

&lt;p&gt;After the import, walk through the imported pages:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check page titles.&lt;/strong&gt; The importer uses filenames as titles. If you missed some Notion IDs in the cleanup step, some pages will have IDs in their titles — rename them in Confluence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Re-embed external content.&lt;/strong&gt; Notion embeds for YouTube, Figma, Loom, or other services come through as plain URLs. Add Confluence macros or HTML Macro embeds to restore the embedded experience where it matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Review tables.&lt;/strong&gt; Notion tables with select, multi-select, or date columns export as text — the structured data type is lost. Verify these look reasonable in Confluence or recreate them using Confluence's table macro.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update internal links.&lt;/strong&gt; Links between Notion pages are relative paths in the export and may not resolve correctly after import. Run a search in Confluence for &lt;code&gt;notion.so&lt;/code&gt; URLs to find any that were hardcoded, and update them to Confluence page links.&lt;/p&gt;




&lt;h2&gt;
  
  
  What to Expect at Scale
&lt;/h2&gt;

&lt;p&gt;For a workspace with 200–500 pages, the full migration — export, cleanup, import — typically takes a day of dedicated effort. Larger workspaces benefit from dividing the work by Notion workspace section and importing incrementally rather than all at once.&lt;/p&gt;

&lt;p&gt;The most time-consuming part is usually the post-import cleanup: reviewing imported pages, fixing database content, and re-embedding media. Budget more time for this than for the import itself.&lt;/p&gt;




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

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

</description>
    </item>
    <item>
      <title>How to Track Jira Issues with Charts and Graphs</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Tue, 30 Jun 2026 11:11:57 +0000</pubDate>
      <link>https://dev.to/yamuno-software/how-to-track-jira-issues-with-charts-and-graphs-1nhf</link>
      <guid>https://dev.to/yamuno-software/how-to-track-jira-issues-with-charts-and-graphs-1nhf</guid>
      <description>&lt;h1&gt;
  
  
  How to Track Jira Issues with Charts and Graphs
&lt;/h1&gt;

&lt;p&gt;Jira stores detailed data about every issue — status, assignee, priority, type, labels, sprint, creation date, resolution date. The challenge isn't getting the data into Jira. It's getting anything useful out of it without building a spreadsheet report from scratch every week.&lt;/p&gt;

&lt;p&gt;This guide covers the most practical chart setups for tracking Jira issues — what to visualize, how to configure it, and what to look for in the output.&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; adds chart gadgets to Jira dashboards. Install it from the Atlassian Marketplace, then add a gadget to any Jira dashboard by clicking &lt;strong&gt;Add gadget → Charts for Jira Dashboard&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Each gadget is configured independently — choose the chart type, data source (project, JQL query, or label filter), grouping, and visual options.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Status Distribution — Where Is Everything Right Now?
&lt;/h2&gt;

&lt;p&gt;The most immediate question for any sprint or project is: how many issues are in each status?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chart type:&lt;/strong&gt; Bar (horizontal)&lt;br&gt;
&lt;strong&gt;Group by:&lt;/strong&gt; Status&lt;br&gt;
&lt;strong&gt;Filter:&lt;/strong&gt; Current sprint or open issues in the project&lt;/p&gt;

&lt;p&gt;A horizontal bar chart with one bar per status — To Do, In Progress, In Review, Done — gives you the snapshot at a glance. When "In Review" is twice as wide as "In Progress," you know reviews are backing up.&lt;/p&gt;

&lt;p&gt;For a kanban team without sprints, filter to "all open issues" and group by status. The relative bar lengths show your work in progress distribution and immediately reveal if one column is accumulating more than expected.&lt;/p&gt;


&lt;h2&gt;
  
  
  2. Assignee Workload — Is Work Distributed Evenly?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Chart type:&lt;/strong&gt; Bar (vertical or horizontal)&lt;br&gt;
&lt;strong&gt;Group by:&lt;/strong&gt; Assignee&lt;br&gt;
&lt;strong&gt;Filter:&lt;/strong&gt; Open issues in current sprint or project&lt;/p&gt;

&lt;p&gt;This chart answers the question that comes up in every sprint planning meeting: is the work actually balanced? One bar per team member, height representing open issue count.&lt;/p&gt;

&lt;p&gt;The useful insight isn't just the current distribution — it's the pattern over multiple sprints. If the same one or two people consistently have the highest bars, that's a structural problem worth addressing, not a one-sprint anomaly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Refinement:&lt;/strong&gt; Add a second dataset for "In Progress" issues only (by adding a JQL filter &lt;code&gt;status = "In Progress"&lt;/code&gt;). Now you can see not just who has the most assigned, but who is actively working on the most issues simultaneously — which is a better signal for overload.&lt;/p&gt;


&lt;h2&gt;
  
  
  3. Priority Breakdown — Where Are the Critical Issues?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Chart type:&lt;/strong&gt; Pie or bar&lt;br&gt;
&lt;strong&gt;Group by:&lt;/strong&gt; Priority&lt;br&gt;
&lt;strong&gt;Filter:&lt;/strong&gt; Open issues in the project&lt;/p&gt;

&lt;p&gt;A priority pie chart shows the proportion of Critical, High, Medium, and Low issues in your backlog. This is most useful for bug tracking and escalation management.&lt;/p&gt;

&lt;p&gt;If you're watching this chart over time (check it at the start of each sprint), a growing "Critical" slice is an early warning sign that something in your triage process or product isn't working. A shrinking "High" slice alongside increasing "Critical" might mean labels are being inflated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practical use:&lt;/strong&gt; Share this chart in your sprint retrospective. If the team sees that 40% of issues tagged Critical are consistently de-prioritized, the label is losing meaning — worth a conversation.&lt;/p&gt;


&lt;h2&gt;
  
  
  4. Issue Type Distribution — What Kind of Work Are We Doing?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Chart type:&lt;/strong&gt; Pie or donut&lt;br&gt;
&lt;strong&gt;Group by:&lt;/strong&gt; Issue type&lt;br&gt;
&lt;strong&gt;Filter:&lt;/strong&gt; Issues created in the last 30 days, or current sprint&lt;/p&gt;

&lt;p&gt;Jira issue types (Bug, Feature, Task, Story, Spike, Tech Debt) tell you the composition of what the team is actually working on. If your roadmap says "feature development sprint" but the chart shows 60% bugs, you have a planning alignment issue.&lt;/p&gt;

&lt;p&gt;This chart is most useful at the project or team level, not the sprint level — one sprint's composition can be an anomaly. The 30-day or 90-day view shows the actual pattern.&lt;/p&gt;


&lt;h2&gt;
  
  
  5. Sprint Progress — Are We on Track to Complete?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Chart type:&lt;/strong&gt; Bar (grouped or stacked)&lt;br&gt;
&lt;strong&gt;Group by:&lt;/strong&gt; Status&lt;br&gt;
&lt;strong&gt;Filter:&lt;/strong&gt; Current sprint&lt;/p&gt;

&lt;p&gt;A grouped bar chart with two bars — "Completed" and "Remaining" — is a straightforward sprint progress view. Set it up at sprint start and check it mid-sprint. The relative bar heights tell you immediately whether you're ahead, on track, or behind.&lt;/p&gt;

&lt;p&gt;For a more nuanced view, use a stacked bar grouped by status: a single bar per sprint with segments for To Do, In Progress, In Review, and Done. This shows not just completed vs. remaining, but where the remaining work is sitting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JQL for current sprint:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;project&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;YOURPROJECT&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;sprint&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;openSprints&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. Label-Based Tracking — Custom Dimensions
&lt;/h2&gt;

&lt;p&gt;Jira labels are underused for reporting. If your team uses consistent labels — "customer-request," "regression," "tech-debt," "blocked" — you can build charts that filter to those labels.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; A bar chart filtered to &lt;code&gt;label = "customer-request"&lt;/code&gt; grouped by status shows how many customer-requested issues are open vs. in progress vs. done. This is the chart that goes in a customer success update without you needing to manually compile a list.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; A count of &lt;code&gt;label = "blocked"&lt;/code&gt; issues over time (if you're logging blocked state via label) reveals whether your impediment rate is stable or trending up.&lt;/p&gt;




&lt;h2&gt;
  
  
  Building a Dashboard Around These Charts
&lt;/h2&gt;

&lt;p&gt;A practical dashboard for a sprint team: three gadgets on one board.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Gadget&lt;/th&gt;
&lt;th&gt;Chart&lt;/th&gt;
&lt;th&gt;Data&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Status distribution (bar)&lt;/td&gt;
&lt;td&gt;Current sprint issues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Assignee workload (bar)&lt;/td&gt;
&lt;td&gt;Open issues, current sprint&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Priority breakdown (pie)&lt;/td&gt;
&lt;td&gt;Open bugs in the project&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That's enough to run a 15-minute sprint check-in without opening any Jira filters. Everyone looks at the same charts, asks questions from the same data, and the meeting moves faster.&lt;/p&gt;

&lt;p&gt;Add a date filter at the top of the dashboard and make it the single control that drives all three gadgets. When stakeholders ask "what did we do last month," you change the date range and the answer is visible immediately.&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>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>
  </channel>
</rss>
