<?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.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>Export Confluence Pages to Polished PDFs — Introducing PDF Exporter for Confluence</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Thu, 23 Apr 2026 14:04:25 +0000</pubDate>
      <link>https://dev.to/yamuno-software/export-confluence-pages-to-polished-pdfs-introducing-pdf-exporter-for-confluence-3okl</link>
      <guid>https://dev.to/yamuno-software/export-confluence-pages-to-polished-pdfs-introducing-pdf-exporter-for-confluence-3okl</guid>
      <description>&lt;h1&gt;
  
  
  Introducing PDF Exporter for Confluence
&lt;/h1&gt;

&lt;p&gt;We're excited to announce that &lt;a href="https://marketplace.atlassian.com/apps/726790413" rel="noopener noreferrer"&gt;&lt;strong&gt;PDF Exporter for Confluence&lt;/strong&gt;&lt;/a&gt; is now live on the Atlassian Marketplace.&lt;/p&gt;

&lt;p&gt;Confluence's built-in PDF export is minimal — no cover page, no custom headers, no watermarks, and certainly no reusable templates. For teams sharing documentation with clients, stakeholders, or regulators, "minimal" doesn't cut it.&lt;/p&gt;

&lt;p&gt;PDF Exporter fills that gap.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxyprmc8cwfkfhyt5g9xb.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxyprmc8cwfkfhyt5g9xb.jpg" alt="PDF Exporter for Confluence" width="800" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is PDF Exporter for Confluence?
&lt;/h2&gt;

&lt;p&gt;PDF Exporter is a Forge-native Confluence Cloud app that lets you export any page, page hierarchy, or entire space to a professionally formatted PDF — without leaving Confluence and without sending your data anywhere outside Atlassian's infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Single Page, Hierarchy, or Full Space
&lt;/h3&gt;

&lt;p&gt;Export exactly what you need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Single page&lt;/strong&gt; — export any Confluence page to PDF in one click&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Page tree&lt;/strong&gt; — select a parent page and include all child pages in one export&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full space&lt;/strong&gt; — export an entire Confluence space as a packaged ZIP of PDFs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Multi-page exports are automatically bundled into a ZIP download.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reusable Templates
&lt;/h3&gt;

&lt;p&gt;Admins can define export templates from Confluence Settings → PDF Exporter. Each template controls fonts, layout, cover page style, header and footer content, watermarks, and page numbering.&lt;/p&gt;

&lt;p&gt;Once a template is saved, every user on the instance can apply it — no more inconsistent formatting across teams.&lt;/p&gt;

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

&lt;p&gt;Choose from six built-in cover page layouts and customise them with your accent color, company logo, author name, and subtitle. Every exported PDF looks like it came from your design team.&lt;/p&gt;

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

&lt;p&gt;Enable the TOC option and the exporter automatically generates a clickable table of contents from your page headings — with configurable depth so you control how detailed it gets.&lt;/p&gt;

&lt;h3&gt;
  
  
  Headers, Footers &amp;amp; Watermarks
&lt;/h3&gt;

&lt;p&gt;Add custom text, page numbers, or a watermark to every page of the exported PDF. Useful for draft reviews, confidential documents, or any output where you need persistent labelling.&lt;/p&gt;

&lt;h3&gt;
  
  
  Runs Entirely on Atlassian Forge
&lt;/h3&gt;

&lt;p&gt;PDF Exporter is 100% Forge-native. All processing happens inside Atlassian's infrastructure — exported PDFs are delivered directly to your browser and never stored on external servers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who Is It For?
&lt;/h2&gt;

&lt;p&gt;PDF Exporter is built for teams that share documentation beyond Confluence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Technical writers&lt;/strong&gt; producing release notes, product specs, or user guides for external distribution&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solutions engineers&lt;/strong&gt; creating polished client-facing proposals or handover documents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compliance and legal teams&lt;/strong&gt; archiving Confluence content with consistent formatting and watermarks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Project managers&lt;/strong&gt; sharing status reports and project documentation with stakeholders who don't have Confluence access&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Install the app&lt;/strong&gt; 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;Open any Confluence page and click &lt;strong&gt;•••&lt;/strong&gt; (More actions) → &lt;strong&gt;Export to PDF&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Choose a template (or use the default)&lt;/li&gt;
&lt;li&gt;Select the scope — single page, page tree, or space&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Export&lt;/strong&gt; and download your PDF&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Admins can create and manage templates from &lt;strong&gt;Confluence Settings → PDF Exporter&lt;/strong&gt;.&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;




&lt;p&gt;&lt;em&gt;Questions or feedback? Reach out via our &lt;a href="https://yamuno.atlassian.net/servicedesk/customer/portals" rel="noopener noreferrer"&gt;support portal&lt;/a&gt; — we'd love to hear how your team is using it.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to Migrate Your GitHub or GitLab Docs to Confluence (Step-by-Step)</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Thu, 23 Apr 2026 13:59:26 +0000</pubDate>
      <link>https://dev.to/yamuno-software/how-to-migrate-your-github-or-gitlab-docs-to-confluence-step-by-step-5117</link>
      <guid>https://dev.to/yamuno-software/how-to-migrate-your-github-or-gitlab-docs-to-confluence-step-by-step-5117</guid>
      <description>&lt;h1&gt;
  
  
  How to Migrate Your GitHub or GitLab Docs to Confluence
&lt;/h1&gt;

&lt;p&gt;Engineering teams often end up with documentation scattered across two places: a &lt;code&gt;docs/&lt;/code&gt; folder in the repo, and a Confluence space that slowly falls behind. This guide shows you how to close that gap — whether you want a one-time migration, a bulk import, or a fully automated sync that keeps Confluence updated on every push.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Teams Move Docs to Confluence
&lt;/h2&gt;

&lt;p&gt;Keeping docs in Git is great for developers, but it creates friction for everyone else. Product managers, support teams, and stakeholders usually live in Confluence — not in GitHub. When your README and architecture docs live in a repo, they become invisible to half the company.&lt;/p&gt;

&lt;p&gt;At the same time, manually copy-pasting markdown into Confluence is tedious and breaks formatting. The goal is to do this once, correctly, and then keep it in sync automatically.&lt;/p&gt;




&lt;h2&gt;
  
  
  What You Need
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Confluence Cloud (any plan)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://marketplace.atlassian.com/apps/1231894/markdown-importer-for-confluence?hosting=cloud&amp;amp;tab=overview" rel="noopener noreferrer"&gt;Markdown Exporter &amp;amp; Importer for Confluence&lt;/a&gt; installed&lt;/li&gt;
&lt;li&gt;Your markdown files from GitHub or GitLab (as a ZIP or local clone)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Option 1 — Import a Single File
&lt;/h2&gt;

&lt;p&gt;Best for: migrating a single README, architecture doc, or changelog.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the target Confluence page where you want the content to live&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;•••&lt;/strong&gt; (More actions) menu → &lt;strong&gt;Markdown Importer &amp;amp; Exporter&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Import&lt;/strong&gt; and choose your &lt;code&gt;.md&lt;/code&gt; or &lt;code&gt;.mdx&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;Preview the output, then click &lt;strong&gt;Import&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Your markdown — including headers, tables, code blocks, and images — is converted to native Confluence content.&lt;/p&gt;




&lt;h2&gt;
  
  
  Option 2 — Bulk Import from a ZIP Archive
&lt;/h2&gt;

&lt;p&gt;Best for: migrating an entire &lt;code&gt;docs/&lt;/code&gt; folder from a repo in one shot.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1 — Clone and zip your docs folder
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/your-org/your-repo.git
&lt;span class="nb"&gt;cd &lt;/span&gt;your-repo
zip &lt;span class="nt"&gt;-r&lt;/span&gt; docs-export.zip docs/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For GitLab, it's the same process — or use the GitLab UI: &lt;strong&gt;Repository → Files → docs/ → Download this directory&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2 — Import the ZIP into Confluence
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;In Confluence, navigate to the space or page where you want the docs imported&lt;/li&gt;
&lt;li&gt;Open the &lt;strong&gt;•••&lt;/strong&gt; menu → &lt;strong&gt;Markdown Importer &amp;amp; Exporter&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Import&lt;/strong&gt; and upload your &lt;code&gt;docs-export.zip&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Review the file tree — the importer shows all files and their resolved hierarchy before importing&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 3 — Confirm hierarchy
&lt;/h3&gt;

&lt;p&gt;The importer converts your folder structure into a Confluence page tree. A structure like:&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/
    installation.md
    quick-start.md
  api/
    overview.md
    authentication.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;…becomes parent/child pages in Confluence exactly as you'd expect — no manual reorganisation needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4 — Handle images and attachments
&lt;/h3&gt;

&lt;p&gt;If your markdown references local images (e.g. &lt;code&gt;![diagram](./assets/arch.png)&lt;/code&gt;), include the assets folder in the ZIP. The importer uploads them as Confluence attachments and rewires the image references automatically.&lt;/p&gt;




&lt;h2&gt;
  
  
  Option 3 — Automate with CI/CD (GitHub Actions / GitLab CI)
&lt;/h2&gt;

&lt;p&gt;Best for: keeping Confluence permanently in sync with your repo. Every push updates the docs without anyone touching Confluence manually.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;p&gt;You'll need two things from the Markdown Importer app:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In Confluence, go to &lt;strong&gt;Settings → Apps → Markdown Importer for Confluence → API tab&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create New Token&lt;/strong&gt;, give it a label (e.g. &lt;code&gt;ci-cd-pipeline&lt;/code&gt;), set an expiration, and copy it immediately&lt;/li&gt;
&lt;li&gt;On the same page, copy your unique &lt;strong&gt;API endpoint URL&lt;/strong&gt; — it looks like:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;   https://your-site.atlassian.net/wiki/apps/&amp;lt;app-id&amp;gt;/&amp;lt;env-id&amp;gt;/webtrigger
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Store both as secrets in your repo:

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;code&gt;Settings → Secrets&lt;/code&gt; → &lt;code&gt;CONFLUENCE_API_ENDPOINT&lt;/code&gt; + &lt;code&gt;CONFLUENCE_API_TOKEN&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;GitLab: &lt;code&gt;Settings → CI/CD → Variables&lt;/code&gt; → same two variables&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You'll also need your Confluence &lt;strong&gt;space ID&lt;/strong&gt; and &lt;strong&gt;parent page ID&lt;/strong&gt; — both are visible in the app's space and page selectors.&lt;/p&gt;




&lt;h3&gt;
  
  
  GitHub Actions Workflow
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;.github/workflows/sync-docs.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="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&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="s2"&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;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;Import README 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;CONTENT=$(cat docs/README.md | jq -Rs .)&lt;/span&gt;
          &lt;span class="s"&gt;curl -X POST "${{ secrets.CONFLUENCE_API_ENDPOINT }}" \&lt;/span&gt;
            &lt;span class="s"&gt;-H "Authorization: Bearer ${{ secrets.CONFLUENCE_API_TOKEN }}" \&lt;/span&gt;
            &lt;span class="s"&gt;-H "Content-Type: application/json" \&lt;/span&gt;
            &lt;span class="s"&gt;-d "{\"spaceId\":\"DOCS\",\"parentId\":\"123456789\",\"pageTitle\":\"README\",\"content\":$CONTENT,\"overwrite\":true}"&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 API docs&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;CONTENT=$(cat docs/api.md | jq -Rs .)&lt;/span&gt;
          &lt;span class="s"&gt;curl -X POST "${{ secrets.CONFLUENCE_API_ENDPOINT }}" \&lt;/span&gt;
            &lt;span class="s"&gt;-H "Authorization: Bearer ${{ secrets.CONFLUENCE_API_TOKEN }}" \&lt;/span&gt;
            &lt;span class="s"&gt;-H "Content-Type: application/json" \&lt;/span&gt;
            &lt;span class="s"&gt;-d "{\"spaceId\":\"DOCS\",\"parentId\":\"123456789\",\"pageTitle\":\"API Reference\",\"content\":$CONTENT,\"overwrite\":true}"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The API sends one page per request as JSON — add a step per file you want to keep in sync. The workflow only triggers when files under &lt;code&gt;docs/&lt;/code&gt; change.&lt;/p&gt;




&lt;h3&gt;
  
  
  GitLab CI Pipeline
&lt;/h3&gt;

&lt;p&gt;Add to &lt;code&gt;.gitlab-ci.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;stages&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;deploy-docs&lt;/span&gt;

&lt;span class="na"&gt;deploy-confluence&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;stage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deploy-docs&lt;/span&gt;
  &lt;span class="na"&gt;only&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;script&lt;/span&gt;&lt;span class="pi"&gt;:&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 "$CONFLUENCE_API_ENDPOINT" \&lt;/span&gt;
        &lt;span class="s"&gt;-H "Authorization: Bearer $CONFLUENCE_API_TOKEN" \&lt;/span&gt;
        &lt;span class="s"&gt;-H "Content-Type: application/json" \&lt;/span&gt;
        &lt;span class="s"&gt;-d "{&lt;/span&gt;
          &lt;span class="s"&gt;\"spaceId\": \"DOCS\",&lt;/span&gt;
          &lt;span class="s"&gt;\"parentId\": \"123456789\",&lt;/span&gt;
          &lt;span class="s"&gt;\"pageTitle\": \"API Documentation\",&lt;/span&gt;
          &lt;span class="s"&gt;\"content\": $(cat docs/api.md | jq -Rs .),&lt;/span&gt;
          &lt;span class="s"&gt;\"overwrite\": true&lt;/span&gt;
        &lt;span class="s"&gt;}"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Store &lt;code&gt;CONFLUENCE_API_ENDPOINT&lt;/code&gt;, &lt;code&gt;CONFLUENCE_API_TOKEN&lt;/code&gt; as masked CI/CD variables in GitLab.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tips for a Clean Migration
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Organise before you import.&lt;/strong&gt; Rename files with a numeric prefix if you care about order (&lt;code&gt;01-overview.md&lt;/code&gt;, &lt;code&gt;02-installation.md&lt;/code&gt;). The importer preserves file order when importing via the UI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Handle frontmatter.&lt;/strong&gt; If your docs use YAML frontmatter (like many Docusaurus or MkDocs setups), the importer reads &lt;code&gt;title&lt;/code&gt; from frontmatter and uses it as the Confluence page title. No need to strip it out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check internal links.&lt;/strong&gt; Links between pages (e.g. &lt;code&gt;[see here](../api/overview.md)&lt;/code&gt;) are resolved relative to the page hierarchy during import. Cross-check a few after importing to confirm they resolve correctly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run a test import first.&lt;/strong&gt; Pick a small subfolder, import it into a sandbox space, and confirm the output looks right before running the full migration.&lt;/p&gt;




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

&lt;p&gt;Install &lt;a href="https://marketplace.atlassian.com/apps/1231894/markdown-importer-for-confluence?hosting=cloud&amp;amp;tab=overview" rel="noopener noreferrer"&gt;Markdown Exporter &amp;amp; Importer for Confluence&lt;/a&gt; from the Atlassian Marketplace — it's free to try.&lt;/p&gt;

&lt;p&gt;For the CI/CD approach, check out the &lt;a href="https://dev.to/docs/markdown-importer-for-confluence/rest-api"&gt;REST API documentation&lt;/a&gt; for the full list of parameters, authentication details, and code examples in Node.js, Python, and Go.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Questions or edge cases? Reach out via our &lt;a href="https://yamuno.atlassian.net/servicedesk/customer/portals" rel="noopener noreferrer"&gt;support portal&lt;/a&gt; — we're happy to help with migration planning.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Markdown Importer v6.0.0 is Here – Early Conflict Detection, Performance Updates &amp; UI Enhancements!</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Thu, 23 Apr 2026 13:59:12 +0000</pubDate>
      <link>https://dev.to/yamuno-software/markdown-importer-v600-is-here-early-conflict-detection-performance-updates-ui-enhancements-144c</link>
      <guid>https://dev.to/yamuno-software/markdown-importer-v600-is-here-early-conflict-detection-performance-updates-ui-enhancements-144c</guid>
      <description>&lt;h1&gt;
  
  
  Markdown Importer v6.0.0 is Here 🚀
&lt;/h1&gt;

&lt;p&gt;We're excited to announce the release of &lt;a href="https://marketplace.atlassian.com/apps/1231894/markdown-importer-for-confluence?hosting=cloud&amp;amp;tab=overview" rel="noopener noreferrer"&gt;&lt;strong&gt;Markdown Importer for Confluence v6.0.0&lt;/strong&gt;&lt;/a&gt;! This update brings powerful new features, performance improvements, and a refreshed interface to make importing Markdown files into &lt;a href="https://www.atlassian.com/software/confluence" rel="noopener noreferrer"&gt;Confluence&lt;/a&gt; easier and more reliable than ever.&lt;/p&gt;

&lt;h2&gt;
  
  
  🌟 What's New in v6.0.0
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔍 Early Conflict Detection
&lt;/h3&gt;

&lt;p&gt;One of the biggest challenges when importing files into Confluence is dealing with duplicate names for pages and folders. With v6.0.0, we've introduced &lt;strong&gt;early conflict detection&lt;/strong&gt; to identify these issues before they cause problems. You'll now be able to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Detect conflicting files and folders before importing&lt;/li&gt;
&lt;li&gt;Choose whether to skip, or resolve conflicts directly&lt;/li&gt;
&lt;li&gt;Save time and avoid messy post-import cleanups&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmarketplace.atlassian.com%2Fproduct-listing%2Ffiles%2F06a1e19e-8602-4cd3-9c0b-5fc2bbc9538b%3Fwidth%3D1840%26height%3D900" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmarketplace.atlassian.com%2Fproduct-listing%2Ffiles%2F06a1e19e-8602-4cd3-9c0b-5fc2bbc9538b%3Fwidth%3D1840%26height%3D900" alt="Folder Hierarchy Import" width="1840" height="900"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚡ Performance Updates
&lt;/h3&gt;

&lt;p&gt;Large imports can now be processed faster and more efficiently. We've optimized our backend logic to handle heavy workloads, so whether you're importing a small set of documents or an entire knowledge base, you'll experience smoother and quicker performance.&lt;/p&gt;

&lt;h3&gt;
  
  
  🎨 UI Enhancements
&lt;/h3&gt;

&lt;p&gt;We've refreshed the user interface to make the importing process more intuitive. Cleaner layouts, improved navigation, and a more modern look ensure that you can focus on your content without friction.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmarketplace.atlassian.com%2Fproduct-listing%2Ffiles%2F26d83e5c-2493-4603-bba6-52cf7bef5f79%3Fwidth%3D1840%26height%3D900" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmarketplace.atlassian.com%2Fproduct-listing%2Ffiles%2F26d83e5c-2493-4603-bba6-52cf7bef5f79%3Fwidth%3D1840%26height%3D900" alt="Preview Interface" width="1840" height="900"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  💡 Why This Matters
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://marketplace.atlassian.com/apps/1231894/markdown-importer-for-confluence?hosting=cloud&amp;amp;tab=overview" rel="noopener noreferrer"&gt;Markdown Importer&lt;/a&gt; is designed to help teams seamlessly bring their existing documentation into Confluence. With these improvements, you'll spend less time fixing issues and more time collaborating on what matters most. Check out our &lt;a href="https://dev.to/docs/markdown-importer-for-confluence"&gt;documentation&lt;/a&gt; to learn more about all the features.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔗 Try It Now
&lt;/h2&gt;

&lt;p&gt;Upgrade to the latest version and experience the improvements yourself:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://marketplace.atlassian.com/apps/1231894/markdown-importer-for-confluence?hosting=cloud&amp;amp;tab=overview" rel="noopener noreferrer"&gt;Markdown Importer for Confluence on Atlassian Marketplace&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We'd love to hear your feedback! Reach out via our &lt;a href="https://yamuno.atlassian.net/servicedesk/customer/portals" rel="noopener noreferrer"&gt;support channel&lt;/a&gt;. Your input helps us continue improving the app to better fit your workflows.&lt;/p&gt;

&lt;p&gt;Want to see the full changelog? Visit our &lt;a href="https://dev.to/docs/markdown-importer-for-confluence/release-notes"&gt;release notes&lt;/a&gt; page.&lt;/p&gt;

&lt;p&gt;✅ Ready to import smarter, faster, and more reliably?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://marketplace.atlassian.com/apps/1231894/markdown-importer-for-confluence?hosting=cloud&amp;amp;tab=overview" rel="noopener noreferrer"&gt;Update to Markdown Importer v6.0.0 today!&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>New Features in Markdown Importer for Confluence – Unlimited Bulk Import, Hierarchy Support, and More!</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Thu, 23 Apr 2026 13:53:46 +0000</pubDate>
      <link>https://dev.to/yamuno-software/new-features-in-markdown-importer-for-confluence-unlimited-bulk-import-hierarchy-support-and-5g1l</link>
      <guid>https://dev.to/yamuno-software/new-features-in-markdown-importer-for-confluence-unlimited-bulk-import-hierarchy-support-and-5g1l</guid>
      <description>&lt;h2&gt;
  
  
  🚀 Big Update for Markdown Importer for Confluence!
&lt;/h2&gt;

&lt;p&gt;We’ve just rolled out a major upgrade to make importing your Markdown content into Confluence faster, smarter, and more powerful than ever.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✨ What’s New
&lt;/h3&gt;

&lt;h4&gt;
  
  
  ✅ Unlimited Bulk Import
&lt;/h4&gt;

&lt;p&gt;Bring in as many files as you need — all at once.&lt;/p&gt;

&lt;h4&gt;
  
  
  ✅ Folder &amp;amp; File Hierarchy Support
&lt;/h4&gt;

&lt;p&gt;Upload ZIP files while preserving your original folder and file structure.&lt;/p&gt;

&lt;h4&gt;
  
  
  ✅ Attachment Upload Support
&lt;/h4&gt;

&lt;p&gt;Automatically include all attachments referenced in your files.&lt;/p&gt;

&lt;h4&gt;
  
  
  ✅ Multiple Access Modes
&lt;/h4&gt;

&lt;p&gt;Choose between &lt;strong&gt;global&lt;/strong&gt; or &lt;strong&gt;per-page&lt;/strong&gt; access controls for better security and collaboration.&lt;/p&gt;

&lt;p&gt;Whether you’re migrating projects, organizing documentation, or collaborating at scale, this update makes it seamless.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Check it out here:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://marketplace.atlassian.com/apps/1231894/markdown-importer-for-confluence?hosting=cloud&amp;amp;tab=overview" rel="noopener noreferrer"&gt;Markdown Importer for Confluence – Atlassian Marketplace&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📚 Read the docs: &lt;a href="https://dev.to/docs/markdown-importer-for-confluence"&gt;Markdown Importer for Confluence Documentation&lt;/a&gt;&lt;/p&gt;




</description>
    </item>
    <item>
      <title>Introducing REST API for Markdown Importer – Automate Your Documentation Workflow!</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Thu, 23 Apr 2026 13:53:32 +0000</pubDate>
      <link>https://dev.to/yamuno-software/introducing-rest-api-for-markdown-importer-automate-your-documentation-workflow-5587</link>
      <guid>https://dev.to/yamuno-software/introducing-rest-api-for-markdown-importer-automate-your-documentation-workflow-5587</guid>
      <description>&lt;h1&gt;
  
  
  Introducing REST API for Markdown Importer 🚀
&lt;/h1&gt;

&lt;p&gt;We're thrilled to announce a game-changing addition to &lt;a href="https://marketplace.atlassian.com/apps/1231894/markdown-importer-for-confluence?hosting=cloud&amp;amp;tab=overview" rel="noopener noreferrer"&gt;&lt;strong&gt;Markdown Importer for Confluence&lt;/strong&gt;&lt;/a&gt; – a powerful &lt;strong&gt;REST API&lt;/strong&gt; that unlocks automation and integration possibilities for your documentation workflow!&lt;/p&gt;

&lt;p&gt;Say goodbye to manual imports and hello to seamless, programmatic documentation updates directly from your CI/CD pipeline, external applications, or custom automation scripts.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmarketplace.atlassian.com%2Fproduct-listing%2Ffiles%2Fcbfd51ed-8e6a-468b-96ed-86aa4b949dee%3Fwidth%3D1840%26height%3D900" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmarketplace.atlassian.com%2Fproduct-listing%2Ffiles%2Fcbfd51ed-8e6a-468b-96ed-86aa4b949dee%3Fwidth%3D1840%26height%3D900" alt="API Token Management" width="1840" height="900"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🌟 What's New in v6.4.0
&lt;/h2&gt;

&lt;p&gt;The new REST API transforms how you manage Confluence documentation by enabling &lt;strong&gt;programmatic markdown imports&lt;/strong&gt; from anywhere. Whether you're syncing docs from GitHub, deploying from GitLab CI/CD, or building custom integrations, the API makes it effortless.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;🔐 Secure Token Management&lt;/strong&gt;&lt;br&gt;
Generate and manage API tokens with JWT-based authentication, fine-grained expiration control (1-30 days), and the ability to create up to 50 tokens for different environments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🚀 Simple HTTP Requests&lt;/strong&gt;&lt;br&gt;
Import markdown content with a straightforward POST request – no complex setup required.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔄 Smart Conflict Handling&lt;/strong&gt;&lt;br&gt;
Choose to create new pages or update existing ones with built-in overwrite support and clear error handling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📚 Comprehensive Documentation&lt;/strong&gt;&lt;br&gt;
From getting started guides to production best practices, we've got you covered with complete API documentation, code examples in multiple languages, and CI/CD workflow templates.&lt;/p&gt;

&lt;h2&gt;
  
  
  💡 Perfect For
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;CI/CD Pipelines&lt;/strong&gt;&lt;br&gt;
Automatically sync documentation with every code push. Keep your Confluence pages updated alongside your codebase without manual intervention.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Documentation Migration&lt;/strong&gt;&lt;br&gt;
Moving from another platform? Script your migration and import hundreds of markdown files programmatically with consistent formatting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Automated Updates&lt;/strong&gt;&lt;br&gt;
Trigger documentation updates from external systems, webhooks, or scheduled jobs. Perfect for keeping release notes, changelogs, and API docs fresh.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Custom Workflows&lt;/strong&gt;&lt;br&gt;
Build exactly the integration you need – whether it's generating docs from code comments, syncing from multiple sources, or creating dynamic content.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎯 Why It Matters
&lt;/h2&gt;

&lt;p&gt;Documentation should evolve with your product, not lag behind it. The REST API eliminates the manual bottleneck, letting you:&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Automate&lt;/strong&gt; repetitive import tasks&lt;br&gt;
✅ &lt;strong&gt;Synchronize&lt;/strong&gt; docs with code changes automatically&lt;br&gt;
✅ &lt;strong&gt;Scale&lt;/strong&gt; from single files to enterprise-wide migrations&lt;br&gt;
✅ &lt;strong&gt;Integrate&lt;/strong&gt; with your existing tools and workflows&lt;/p&gt;

&lt;h2&gt;
  
  
  📖 Ready to Get Started?
&lt;/h2&gt;

&lt;p&gt;We've prepared comprehensive documentation to help you integrate the API into your workflow:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://dev.to/docs/markdown-importer-for-confluence/rest-api"&gt;View Complete API Documentation&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Our documentation includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quick start guide with step-by-step token setup&lt;/li&gt;
&lt;li&gt;Complete API reference with all endpoints and parameters&lt;/li&gt;
&lt;li&gt;Ready-to-use code examples in cURL, Node.js, Python, Go, and more&lt;/li&gt;
&lt;li&gt;CI/CD workflow templates for GitHub Actions and GitLab&lt;/li&gt;
&lt;li&gt;Production-ready best practices and troubleshooting tips&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎉 Try It Now
&lt;/h2&gt;

&lt;p&gt;The REST API is available now for all &lt;a href="https://marketplace.atlassian.com/apps/1231894/markdown-importer-for-confluence?hosting=cloud&amp;amp;tab=overview" rel="noopener noreferrer"&gt;Markdown Importer for Confluence&lt;/a&gt; users!&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Included with your license&lt;/strong&gt; – No additional cost&lt;br&gt;
✅ &lt;strong&gt;Available during trial&lt;/strong&gt; – Test it before you buy&lt;br&gt;
✅ &lt;strong&gt;Production-ready&lt;/strong&gt; – Built for scale and reliability&lt;/p&gt;

&lt;h2&gt;
  
  
  💬 We Want Your Feedback
&lt;/h2&gt;

&lt;p&gt;We'd love to hear how you're using the REST API! Share your use cases, integrations, or feedback:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📧 &lt;a href="https://yamuno.atlassian.net/servicedesk/customer/portals" rel="noopener noreferrer"&gt;Contact Support&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📝 &lt;a href="https://dev.to/docs/markdown-importer-for-confluence/release-notes"&gt;View Full Changelog&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://marketplace.atlassian.com/apps/1231894/markdown-importer-for-confluence?hosting=cloud&amp;amp;tab=overview" rel="noopener noreferrer"&gt;Get Markdown Importer for Confluence&lt;/a&gt;&lt;/strong&gt; and start automating your documentation workflow today!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Ready to automate your documentation? The REST API is waiting for you!&lt;/em&gt; 🚀&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Introducing Markdown Exporter – Now Part of Markdown Importer for Confluence (v7.0.0)</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Thu, 23 Apr 2026 13:48:06 +0000</pubDate>
      <link>https://dev.to/yamuno-software/introducing-markdown-exporter-now-part-of-markdown-importer-for-confluence-v700-lda</link>
      <guid>https://dev.to/yamuno-software/introducing-markdown-exporter-now-part-of-markdown-importer-for-confluence-v700-lda</guid>
      <description>&lt;h1&gt;
  
  
  🚀 Introducing Markdown Exporter – Now Part of Markdown Importer for Confluence (v7.0.0)
&lt;/h1&gt;

&lt;p&gt;We’re excited to announce &lt;strong&gt;v7.0.0&lt;/strong&gt; of &lt;strong&gt;Markdown Importer for Confluence&lt;/strong&gt;, now featuring the &lt;strong&gt;all-new Markdown Exporter&lt;/strong&gt;! 🎉&lt;/p&gt;

&lt;p&gt;With this update, the app transitions from being &lt;strong&gt;Markdown Import-only&lt;/strong&gt; to a full &lt;strong&gt;two-way Markdown solution&lt;/strong&gt; — enabling teams to &lt;strong&gt;import Markdown files into Confluence&lt;/strong&gt; and &lt;strong&gt;export Confluence pages back to clean Markdown&lt;/strong&gt;. 💪&lt;/p&gt;

&lt;p&gt;This addition makes documentation workflows &lt;strong&gt;more flexible, efficient, and automation-friendly&lt;/strong&gt;, whether you’re syncing content with external tools, managing backups, or integrating with CI/CD pipelines.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✨ Key Features of the Exporter
&lt;/h2&gt;

&lt;h3&gt;
  
  
  📤 Export Confluence Pages to Markdown
&lt;/h3&gt;

&lt;p&gt;Easily export Confluence pages to &lt;strong&gt;structured Markdown files&lt;/strong&gt;, preserving &lt;strong&gt;page hierarchy, attachments, and formatting&lt;/strong&gt; for smooth version control and external documentation workflows. 🗂️&lt;/p&gt;

&lt;h3&gt;
  
  
  📥 Import Markdown Files (Existing Feature)
&lt;/h3&gt;

&lt;p&gt;Continue to import Markdown files with &lt;strong&gt;seamless bulk support&lt;/strong&gt;, &lt;strong&gt;preserved folder structures&lt;/strong&gt;, and &lt;strong&gt;accurate formatting&lt;/strong&gt;. ⚡&lt;/p&gt;

&lt;h3&gt;
  
  
  🔗 Automation &amp;amp; REST API Support
&lt;/h3&gt;

&lt;p&gt;Use &lt;strong&gt;REST API&lt;/strong&gt; with &lt;strong&gt;JWT authentication&lt;/strong&gt; and &lt;strong&gt;expiring API tokens&lt;/strong&gt; to automate imports and exports. Built-in conflict detection ensures your workflows remain smooth. 🤖&lt;/p&gt;

&lt;h3&gt;
  
  
  🌙 User-Friendly Interface
&lt;/h3&gt;

&lt;p&gt;Bulk operations are simple with &lt;strong&gt;dark mode&lt;/strong&gt; and an &lt;strong&gt;intuitive UI&lt;/strong&gt;, ideal for large-scale documentation projects. 🖥️&lt;/p&gt;

&lt;h2&gt;
  
  
  💡 Why Teams Love It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;⏱ Save Time:&lt;/strong&gt; No manual copy-paste between Markdown and Confluence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;✅ Maintain Accuracy:&lt;/strong&gt; Formatting, attachments, and hierarchy remain intact&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🚀 Boost Productivity:&lt;/strong&gt; Integrate with automated workflows, CI/CD, and external tools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;⚡ Designed for Fast-Moving Teams:&lt;/strong&gt; Lightweight, efficient, and reliable&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎯 Get Started Today
&lt;/h2&gt;

&lt;p&gt;Experience the power of &lt;strong&gt;Markdown Exporter &amp;amp; Importer for Confluence (v7.0.0)&lt;/strong&gt;. Import Markdown, export Confluence pages, and automate your documentation workflows with ease.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.atlassian.com/apps/1231894/markdown-importer-for-confluence?hosting=cloud&amp;amp;tab=overview" rel="noopener noreferrer"&gt;👉 Get it on the Atlassian Marketplace&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Switching LaTeX Math Apps in Confluence? We Made It Painless.</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Thu, 23 Apr 2026 13:47:53 +0000</pubDate>
      <link>https://dev.to/yamuno-software/switching-latex-math-apps-in-confluence-we-made-it-painless-44a5</link>
      <guid>https://dev.to/yamuno-software/switching-latex-math-apps-in-confluence-we-made-it-painless-44a5</guid>
      <description>&lt;h1&gt;
  
  
  Switching LaTeX Math Apps in Confluence? We Made It Painless.
&lt;/h1&gt;

&lt;p&gt;If you've ever tried to switch from one LaTeX math app to another in Confluence, you know the pain. Hundreds of pages, thousands of equations, all locked into a vendor-specific format. Manually re-entering every formula is not an option.&lt;/p&gt;

&lt;p&gt;That's why we built &lt;strong&gt;Migration Support&lt;/strong&gt; directly into &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;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Teams across engineering, academia, and finance rely on LaTeX equations in their Confluence documentation. But what happens when your current math app doesn't cut it anymore? Maybe the rendering is slow. Maybe it lacks features you need. Maybe the pricing changed.&lt;/p&gt;

&lt;p&gt;Whatever the reason, you're stuck. Your formulas are embedded in a proprietary macro format, scattered across dozens of spaces and hundreds of pages. Moving to a new app means either:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Manually finding and re-entering every single equation, or&lt;/li&gt;
&lt;li&gt;Living with an app that no longer meets your needs.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Neither is acceptable.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution: One-Click Migration
&lt;/h2&gt;

&lt;p&gt;LaTeX Math for Confluence now includes a built-in migration tool that automatically finds, converts, and replaces equations from other LaTeX math apps across your entire Confluence instance.&lt;/p&gt;

&lt;p&gt;Here's how it works:&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Choose Your Source App
&lt;/h3&gt;

&lt;p&gt;Open the migration tab in the app's configuration settings. Select the app you're migrating from. We currently support:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LaTeX and MathJax&lt;/strong&gt; by The Plugin People&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LaTeX Math&lt;/strong&gt; by Appfire&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LaTeX Math Lite&lt;/strong&gt; by Appfire&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LaTeX Math (Easy Math)&lt;/strong&gt; by Narva Software&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Need to migrate from an app not on the list? The &lt;strong&gt;Advanced tab&lt;/strong&gt; lets you enter any macro name manually.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Search Your Spaces
&lt;/h3&gt;

&lt;p&gt;Select a Confluence space to scan, or search across your entire instance. The tool uses Confluence's query language under the hood to find every page that contains equations from your source app.&lt;/p&gt;

&lt;p&gt;Results are displayed in a clear table showing the page title, space, and last modified date so you know exactly what you're working with.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Migrate
&lt;/h3&gt;

&lt;p&gt;Select the pages you want to migrate and hit the button. The tool handles the rest:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Extracts the LaTeX formula from the old macro format&lt;/li&gt;
&lt;li&gt;Converts it to the LaTeX Math for Confluence format&lt;/li&gt;
&lt;li&gt;Preserves alignment settings (left, center, right)&lt;/li&gt;
&lt;li&gt;Maps inline equations to inline macros and block equations to block macros&lt;/li&gt;
&lt;li&gt;Updates the page with proper version tracking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every migration is recorded in the page's version history, so you always have a clear audit trail.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Makes This Different
&lt;/h2&gt;

&lt;h3&gt;
  
  
  It Handles the Format Chaos
&lt;/h3&gt;

&lt;p&gt;Different apps store LaTeX in wildly different ways. Some use XML parameters, others use rich text bodies, others use ADF extensions. Some wrap formulas in CDATA sections, others encode them as plain parameters.&lt;/p&gt;

&lt;p&gt;Our migration engine understands all of these formats. It extracts your LaTeX from whatever structure the source app used and converts it cleanly.&lt;/p&gt;

&lt;h3&gt;
  
  
  It's Safe
&lt;/h3&gt;

&lt;p&gt;Migration doesn't delete your original content. Confluence's version history means you can always roll back any page to its pre-migration state. The tool also reports success and failure counts for every batch, so you know immediately if something needs attention.&lt;/p&gt;

&lt;h3&gt;
  
  
  It Scales
&lt;/h3&gt;

&lt;p&gt;Whether you have 10 pages or 10,000, the migration tool handles pagination and batch processing. It works through your pages methodically, updating each one and moving on, without overwhelming the Confluence API.&lt;/p&gt;

&lt;h3&gt;
  
  
  It's Built for Real Teams
&lt;/h3&gt;

&lt;p&gt;We didn't build this for a demo. We built it because real users asked for it. Teams running thousands of equations across enterprise Confluence instances need a way to switch apps without losing a week of productivity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Advanced Mode
&lt;/h2&gt;

&lt;p&gt;For power users and admins dealing with custom or less common apps, the Advanced tab offers full control:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enter any macro name to search for&lt;/li&gt;
&lt;li&gt;Filter by body content&lt;/li&gt;
&lt;li&gt;Target specific spaces&lt;/li&gt;
&lt;li&gt;Handle edge cases that the standard wizard might not cover&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Get Started
&lt;/h2&gt;

&lt;p&gt;Migration support is available now in &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;. Open your app configuration, navigate to the &lt;strong&gt;"Migrate from other apps"&lt;/strong&gt; tab, and run your first search. You'll see exactly how many equations you can migrate before committing to anything.&lt;/p&gt;

&lt;p&gt;No manual work. No lost formulas. No downtime.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your equations deserve better. Move them in minutes, not months.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;LaTeX Math for Confluence supports both KaTeX and MathJax rendering, inline and block equations, chemical formulas, physics notation, and more. Available on the &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;Atlassian Marketplace&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Beautiful Mathematical Equations in Confluence – Introducing LaTeX Math for Confluence!</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Thu, 23 Apr 2026 13:42:29 +0000</pubDate>
      <link>https://dev.to/yamuno-software/beautiful-mathematical-equations-in-confluence-introducing-latex-math-for-confluence-445h</link>
      <guid>https://dev.to/yamuno-software/beautiful-mathematical-equations-in-confluence-introducing-latex-math-for-confluence-445h</guid>
      <description>&lt;h1&gt;
  
  
  Introducing LaTeX Math for Confluence
&lt;/h1&gt;

&lt;p&gt;We're excited to announce the launch of &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;&lt;strong&gt;LaTeX Math for Confluence&lt;/strong&gt;&lt;/a&gt;! Finally, you can create professional, publication-quality mathematical equations directly in your &lt;a href="https://www.atlassian.com/software/confluence" rel="noopener noreferrer"&gt;Confluence&lt;/a&gt; documentation with the power and precision of LaTeX.&lt;/p&gt;

&lt;h2&gt;
  
  
  🌟 What Makes LaTeX Math for Confluence Special
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🧮 Professional Math Rendering
&lt;/h3&gt;

&lt;p&gt;Create beautiful mathematical equations using the industry-standard LaTeX syntax, powered by KaTeX for fast, crisp rendering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Comprehensive LaTeX Support&lt;/strong&gt;: Fractions, matrices, integrals, summations, Greek symbols, and more&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crystal-Clear Output&lt;/strong&gt;: High-quality rendering that looks perfect at any size&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Publication-Ready&lt;/strong&gt;: Professional typesetting suitable for technical documentation, research papers, and educational materials&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frs6zjmke7uzf81ngxvzx.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frs6zjmke7uzf81ngxvzx.jpg" alt="LaTeX Math Editor" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚡ Live Preview Editor
&lt;/h3&gt;

&lt;p&gt;See your equations come to life as you type:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Real-Time Rendering&lt;/strong&gt;: Watch your LaTeX code transform into beautiful equations instantly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error Detection&lt;/strong&gt;: Catch syntax errors before saving&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instant Feedback&lt;/strong&gt;: No more guessing how your equation will look&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft3je30dloox3rnwcmhik.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft3je30dloox3rnwcmhik.jpg" alt="Live Preview" width="800" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  📝 Flexible Macro Options
&lt;/h3&gt;

&lt;p&gt;Choose the perfect format for your equations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Inline Macros&lt;/strong&gt;: Embed equations within text paragraphs (like (x^2 + y^2 = r^2))&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Block Macros&lt;/strong&gt;: Display equations prominently on their own line with proper spacing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Easy Insertion&lt;/strong&gt;: Type &lt;code&gt;/latex&lt;/code&gt; or &lt;code&gt;/math&lt;/code&gt; to insert a macro anywhere on your page&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔒 Enterprise-Grade Security
&lt;/h3&gt;

&lt;p&gt;Built on Atlassian Forge for maximum security and reliability:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Runs on Atlassian Infrastructure&lt;/strong&gt;: No external dependencies or third-party servers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Access Control&lt;/strong&gt;: Configure who can view and edit equations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User Whitelisting&lt;/strong&gt;: Restrict equation editing to specific users or groups&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permission Management&lt;/strong&gt;: Granular control over macro usage&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🌗 Dark Mode Support
&lt;/h3&gt;

&lt;p&gt;Perfect viewing experience in any environment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Automatic Theme Detection&lt;/strong&gt;: Equations adapt to your Confluence theme&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comfortable Viewing&lt;/strong&gt;: Optimized contrast for both light and dark modes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consistent Experience&lt;/strong&gt;: Professional appearance regardless of theme preference&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📊 Usage Analytics
&lt;/h3&gt;

&lt;p&gt;Track and monitor equation usage across your instance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Usage Statistics&lt;/strong&gt;: See how many equations are being created&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adoption Metrics&lt;/strong&gt;: Track macro usage over time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Administrative Insights&lt;/strong&gt;: Understand how your team uses mathematical documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💡 Why Your Team Needs This
&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; solves the challenge of documenting technical and mathematical concepts. Instead of using screenshots, external equation editors, or compromising with plain text, you get:&lt;/p&gt;

&lt;h3&gt;
  
  
  🎓 Perfect for Education
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Course Materials&lt;/strong&gt;: Create lecture notes, problem sets, and study guides&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Research Documentation&lt;/strong&gt;: Document mathematical proofs and research findings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Student Collaboration&lt;/strong&gt;: Enable students to contribute mathematical content&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assignment Templates&lt;/strong&gt;: Build reusable templates for mathematical coursework&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔬 Ideal for Technical Teams
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Engineering Documentation&lt;/strong&gt;: Document algorithms, formulas, and technical specifications&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Science&lt;/strong&gt;: Share statistical models, machine learning equations, and data analysis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Physics &amp;amp; Chemistry&lt;/strong&gt;: Create scientific documentation with complex equations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architecture Diagrams&lt;/strong&gt;: Include mathematical specifications in design documents&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📚 Enhanced Knowledge Sharing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Searchable Content&lt;/strong&gt;: Unlike images, LaTeX equations remain searchable and accessible&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Easy Updates&lt;/strong&gt;: Edit equations directly without recreating images&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Version Control&lt;/strong&gt;: Track changes to equations just like any other Confluence content&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copy &amp;amp; Paste&lt;/strong&gt;: Users can copy LaTeX code for reuse in other documents&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🚀 Common Use Cases
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Research &amp;amp; Development
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Technical Specifications&lt;/strong&gt;: Document mathematical models and algorithms&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Research Papers&lt;/strong&gt;: Collaborate on technical documentation before publication&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Patent Documentation&lt;/strong&gt;: Include precise mathematical descriptions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scientific Reports&lt;/strong&gt;: Create comprehensive technical reports with proper notation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Education &amp;amp; Training
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Course Materials&lt;/strong&gt;: Build complete courses with integrated mathematical content&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tutorial Documentation&lt;/strong&gt;: Create step-by-step mathematical tutorials&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reference Guides&lt;/strong&gt;: Maintain equation libraries and formula sheets&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Practice Problems&lt;/strong&gt;: Share problem sets with solutions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Engineering &amp;amp; Data Science
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Algorithm Documentation&lt;/strong&gt;: Explain complex algorithms with mathematical precision&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Statistical Analysis&lt;/strong&gt;: Document statistical methods and data models&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Machine Learning&lt;/strong&gt;: Share model architectures and optimization functions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance Metrics&lt;/strong&gt;: Define KPIs and measurement formulas&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Finance &amp;amp; Quantitative Analysis
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Financial Models&lt;/strong&gt;: Document pricing models and risk calculations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Investment Strategies&lt;/strong&gt;: Share quantitative trading algorithms&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Economic Analysis&lt;/strong&gt;: Present economic models and forecasts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Actuarial Documentation&lt;/strong&gt;: Create actuarial tables and calculations&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔗 Get Started Today
&lt;/h2&gt;

&lt;p&gt;Ready to bring professional mathematical notation to your Confluence workspace?&lt;/p&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;Install LaTeX Math for Confluence&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Quick Start Guide
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Install the App&lt;/strong&gt;: Add LaTeX Math from the Atlassian Marketplace&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Insert a Macro&lt;/strong&gt;: Type &lt;code&gt;/latex&lt;/code&gt; or &lt;code&gt;/math&lt;/code&gt; on any Confluence page&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Choose Your Style&lt;/strong&gt;: Select inline (within text) or block (standalone) macro&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write LaTeX&lt;/strong&gt;: Enter your LaTeX equation code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;See It Live&lt;/strong&gt;: Watch the real-time preview as you type&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Save &amp;amp; Share&lt;/strong&gt;: Publish your page with beautiful mathematical equations&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Example LaTeX Snippets to Try
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Quadratic Formula:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;x = &lt;span class="k"&gt;\frac&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;-b &lt;span class="k"&gt;\pm&lt;/span&gt; &lt;span class="k"&gt;\sqrt&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;b&lt;span class="p"&gt;^&lt;/span&gt;2 - 4ac&lt;span class="p"&gt;}}{&lt;/span&gt;2a&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pythagorean Theorem:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;a&lt;span class="p"&gt;^&lt;/span&gt;2 + b&lt;span class="p"&gt;^&lt;/span&gt;2 = c&lt;span class="p"&gt;^&lt;/span&gt;2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Integral:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;&lt;span class="k"&gt;\int&lt;/span&gt;&lt;span class="p"&gt;_{&lt;/span&gt;a&lt;span class="p"&gt;}^{&lt;/span&gt;b&lt;span class="p"&gt;}&lt;/span&gt; f(x) &lt;span class="k"&gt;\,&lt;/span&gt; dx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Matrix:&lt;/strong&gt;&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="nt"&gt;\begin{bmatrix}&lt;/span&gt;
a &lt;span class="p"&gt;&amp;amp;&lt;/span&gt; b &lt;span class="k"&gt;\\&lt;/span&gt;
c &lt;span class="p"&gt;&amp;amp;&lt;/span&gt; d
&lt;span class="nt"&gt;\end{bmatrix}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📚 Learn More
&lt;/h2&gt;

&lt;p&gt;Explore our comprehensive documentation to master all features:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://dev.to/docs/latex-math-for-confluence"&gt;LaTeX Math for Confluence Documentation&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Need Help?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Quick Reference&lt;/strong&gt;: Browse our LaTeX syntax guide in the documentation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Support Team&lt;/strong&gt;: Reach out via our &lt;a href="https://yamuno.atlassian.net/servicedesk/customer/portals" rel="noopener noreferrer"&gt;support portal&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FAQs&lt;/strong&gt;: Check our documentation for common questions and solutions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ✨ Transform Your Technical Documentation
&lt;/h2&gt;

&lt;p&gt;Whether you're documenting complex algorithms, teaching advanced mathematics, or sharing scientific research, LaTeX Math for Confluence gives you the tools to communicate with precision and clarity.&lt;/p&gt;

&lt;p&gt;&lt;strong&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;Start creating beautiful equations today!&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have questions or feedback? We'd love to hear from you via our &lt;a href="https://yamuno.atlassian.net/servicedesk/customer/portals" rel="noopener noreferrer"&gt;support portal&lt;/a&gt;. Your input helps us continue improving our apps to better serve your team's needs.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How Data Science Teams Document ML Models in Confluence</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Thu, 23 Apr 2026 13:42:16 +0000</pubDate>
      <link>https://dev.to/yamuno-software/how-data-science-teams-document-ml-models-in-confluence-1ahn</link>
      <guid>https://dev.to/yamuno-software/how-data-science-teams-document-ml-models-in-confluence-1ahn</guid>
      <description>&lt;h1&gt;
  
  
  How Data Science Teams Document ML Models in Confluence
&lt;/h1&gt;

&lt;p&gt;Most data science teams have the same documentation problem: the math lives somewhere else.&lt;/p&gt;

&lt;p&gt;Loss functions in a Jupyter notebook. Model architecture equations in a Google Doc. Evaluation metrics in a Slack thread. Confluence ends up as a project tracker rather than a real knowledge base — because there was no good way to write math in it.&lt;/p&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; changes that. Here's how teams are using it to actually document their models.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem with Screenshots and Plain Text
&lt;/h2&gt;

&lt;p&gt;The two common workarounds both have obvious failure modes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Screenshots&lt;/strong&gt; look fine on day one. Then the model changes, the screenshot is wrong, and nobody updates it because re-exporting from LaTeX or Overleaf and re-uploading feels like too much work. Six months later, the page has equations that don't match the code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Plain text approximations&lt;/strong&gt; (&lt;code&gt;loss = -sum(y * log(y_hat))&lt;/code&gt;) are readable to the author but lose precision fast. No Greek letters, no proper fractions, no summation notation. Anyone reading the doc has to mentally parse notation that doesn't match what they'd write on a whiteboard.&lt;/p&gt;




&lt;h2&gt;
  
  
  Documenting Models with LaTeX in Confluence
&lt;/h2&gt;

&lt;p&gt;With LaTeX Math, you type &lt;code&gt;/latex&lt;/code&gt; or &lt;code&gt;/math&lt;/code&gt; on any Confluence page and get a live editor. Equations render in real time as you type, and you can choose inline (within a sentence) or block (standalone, centered) layout.&lt;/p&gt;

&lt;p&gt;Here's how it maps to the kinds of things data science teams actually write.&lt;/p&gt;




&lt;h3&gt;
  
  
  Loss Functions
&lt;/h3&gt;

&lt;p&gt;The cross-entropy loss for a classification model:&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;\mathcal&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;L&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;N&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;\sum&lt;/span&gt;&lt;span class="p"&gt;_{&lt;/span&gt;i=1&lt;span class="p"&gt;}^{&lt;/span&gt;N&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;\sum&lt;/span&gt;&lt;span class="p"&gt;_{&lt;/span&gt;c=1&lt;span class="p"&gt;}^{&lt;/span&gt;C&lt;span class="p"&gt;}&lt;/span&gt; y&lt;span class="p"&gt;_{&lt;/span&gt;ic&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;\log&lt;/span&gt;(&lt;span class="k"&gt;\hat&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;y&lt;span class="p"&gt;}_{&lt;/span&gt;ic&lt;span class="p"&gt;}&lt;/span&gt;)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mean squared error:&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;\mathcal&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;L&lt;span class="p"&gt;}_{&lt;/span&gt;MSE&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;N&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;\sum&lt;/span&gt;&lt;span class="p"&gt;_{&lt;/span&gt;i=1&lt;span class="p"&gt;}^{&lt;/span&gt;N&lt;span class="p"&gt;}&lt;/span&gt; (y&lt;span class="p"&gt;_&lt;/span&gt;i - &lt;span class="k"&gt;\hat&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;y&lt;span class="p"&gt;}_&lt;/span&gt;i)&lt;span class="p"&gt;^&lt;/span&gt;2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Binary cross-entropy:&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;\mathcal&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;L&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;N&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;\sum&lt;/span&gt;&lt;span class="p"&gt;_{&lt;/span&gt;i=1&lt;span class="p"&gt;}^{&lt;/span&gt;N&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;\left&lt;/span&gt;&lt;span class="na"&gt;[ y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i) \right]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These go inline in a model card, in a section right next to the architecture description and training configuration — all in one Confluence page that anyone on the team can find.&lt;/p&gt;




&lt;h3&gt;
  
  
  Activation Functions
&lt;/h3&gt;

&lt;p&gt;Documenting why you chose a particular activation is easier when you can show it properly.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;f(x) = &lt;span class="k"&gt;\max&lt;/span&gt;(0, x)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sigmoid:&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;(x) = &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;1 + e&lt;span class="p"&gt;^{&lt;/span&gt;-x&lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Softmax (for a vector &lt;strong&gt;z&lt;/strong&gt; of length &lt;em&gt;K&lt;/em&gt;):&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;softmax&lt;span class="p"&gt;}&lt;/span&gt;(z&lt;span class="p"&gt;_&lt;/span&gt;j) = &lt;span class="k"&gt;\frac&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;e&lt;span class="p"&gt;^{&lt;/span&gt;z&lt;span class="p"&gt;_&lt;/span&gt;j&lt;span class="p"&gt;}}{&lt;/span&gt;&lt;span class="k"&gt;\sum&lt;/span&gt;&lt;span class="p"&gt;_{&lt;/span&gt;k=1&lt;span class="p"&gt;}^{&lt;/span&gt;K&lt;span class="p"&gt;}&lt;/span&gt; e&lt;span class="p"&gt;^{&lt;/span&gt;z&lt;span class="p"&gt;_&lt;/span&gt;k&lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GELU (common in transformer models):&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;GELU&lt;span class="p"&gt;}&lt;/span&gt;(x) = x &lt;span class="k"&gt;\cdot&lt;/span&gt; &lt;span class="k"&gt;\Phi&lt;/span&gt;(x)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Evaluation Metrics
&lt;/h3&gt;

&lt;p&gt;Precision and recall written in plain text are fine. Written as equations they're unambiguous:&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;Precision&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;TP&lt;span class="p"&gt;}{&lt;/span&gt;TP + FP&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;\qquad&lt;/span&gt;
&lt;span class="k"&gt;\text&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;Recall&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;TP&lt;span class="p"&gt;}{&lt;/span&gt;TP + FN&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;F1 score:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;F&lt;span class="p"&gt;_&lt;/span&gt;1 = 2 &lt;span class="k"&gt;\cdot&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;\text&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;Precision&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;\cdot&lt;/span&gt; &lt;span class="k"&gt;\text&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;Recall&lt;span class="p"&gt;}}{&lt;/span&gt;&lt;span class="k"&gt;\text&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;Precision&lt;span class="p"&gt;}&lt;/span&gt; + &lt;span class="k"&gt;\text&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;Recall&lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;AUROC is harder to describe in words than in math:&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;AUROC&lt;span class="p"&gt;}&lt;/span&gt; = &lt;span class="k"&gt;\int&lt;/span&gt;&lt;span class="p"&gt;_&lt;/span&gt;0&lt;span class="p"&gt;^&lt;/span&gt;1 &lt;span class="k"&gt;\text&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;TPR&lt;span class="p"&gt;}&lt;/span&gt;(t) &lt;span class="k"&gt;\,&lt;/span&gt; d(&lt;span class="k"&gt;\text&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;FPR&lt;span class="p"&gt;}&lt;/span&gt;(t))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Regularisation and Optimisers
&lt;/h3&gt;

&lt;p&gt;L2 regularisation added to a loss term:&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;\mathcal&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;L&lt;span class="p"&gt;}_{&lt;/span&gt;reg&lt;span class="p"&gt;}&lt;/span&gt; = &lt;span class="k"&gt;\mathcal&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;L&lt;span class="p"&gt;}&lt;/span&gt; + &lt;span class="k"&gt;\lambda&lt;/span&gt; &lt;span class="k"&gt;\sum&lt;/span&gt;&lt;span class="p"&gt;_{&lt;/span&gt;j&lt;span class="p"&gt;}&lt;/span&gt; w&lt;span class="p"&gt;_&lt;/span&gt;j&lt;span class="p"&gt;^&lt;/span&gt;2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adam update rule — the kind of thing that should live in your training runbook:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;m&lt;span class="p"&gt;_&lt;/span&gt;t = &lt;span class="k"&gt;\beta&lt;/span&gt;&lt;span class="p"&gt;_&lt;/span&gt;1 m&lt;span class="p"&gt;_{&lt;/span&gt;t-1&lt;span class="p"&gt;}&lt;/span&gt; + (1 - &lt;span class="k"&gt;\beta&lt;/span&gt;&lt;span class="p"&gt;_&lt;/span&gt;1) g&lt;span class="p"&gt;_&lt;/span&gt;t
&lt;span class="k"&gt;\qquad&lt;/span&gt;
v&lt;span class="p"&gt;_&lt;/span&gt;t = &lt;span class="k"&gt;\beta&lt;/span&gt;&lt;span class="p"&gt;_&lt;/span&gt;2 v&lt;span class="p"&gt;_{&lt;/span&gt;t-1&lt;span class="p"&gt;}&lt;/span&gt; + (1 - &lt;span class="k"&gt;\beta&lt;/span&gt;&lt;span class="p"&gt;_&lt;/span&gt;2) g&lt;span class="p"&gt;_&lt;/span&gt;t&lt;span class="p"&gt;^&lt;/span&gt;2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;&lt;span class="k"&gt;\hat&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;m&lt;span class="p"&gt;}_&lt;/span&gt;t = &lt;span class="k"&gt;\frac&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;m&lt;span class="p"&gt;_&lt;/span&gt;t&lt;span class="p"&gt;}{&lt;/span&gt;1 - &lt;span class="k"&gt;\beta&lt;/span&gt;&lt;span class="p"&gt;_&lt;/span&gt;1&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;
&lt;span class="k"&gt;\hat&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;v&lt;span class="p"&gt;}_&lt;/span&gt;t = &lt;span class="k"&gt;\frac&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;v&lt;span class="p"&gt;_&lt;/span&gt;t&lt;span class="p"&gt;}{&lt;/span&gt;1 - &lt;span class="k"&gt;\beta&lt;/span&gt;&lt;span class="p"&gt;_&lt;/span&gt;2&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;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;&lt;span class="k"&gt;\theta&lt;/span&gt;&lt;span class="p"&gt;_{&lt;/span&gt;t+1&lt;span class="p"&gt;}&lt;/span&gt; = &lt;span class="k"&gt;\theta&lt;/span&gt;&lt;span class="p"&gt;_&lt;/span&gt;t - &lt;span class="k"&gt;\frac&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\eta&lt;/span&gt;&lt;span class="p"&gt;}{&lt;/span&gt;&lt;span class="k"&gt;\sqrt&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\hat&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;v&lt;span class="p"&gt;}_&lt;/span&gt;t&lt;span class="p"&gt;}&lt;/span&gt; + &lt;span class="k"&gt;\epsilon&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;\hat&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;m&lt;span class="p"&gt;}_&lt;/span&gt;t
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Bayesian and Probabilistic Models
&lt;/h3&gt;

&lt;p&gt;Teams doing probabilistic modelling or Bayesian inference often have the worst documentation problem — Bayes' theorem in a Slack message is a disaster. In Confluence it's clean:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;P(&lt;span class="k"&gt;\theta&lt;/span&gt; &lt;span class="k"&gt;\mid&lt;/span&gt; X) = &lt;span class="k"&gt;\frac&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;P(X &lt;span class="k"&gt;\mid&lt;/span&gt; &lt;span class="k"&gt;\theta&lt;/span&gt;) &lt;span class="k"&gt;\,&lt;/span&gt; P(&lt;span class="k"&gt;\theta&lt;/span&gt;)&lt;span class="p"&gt;}{&lt;/span&gt;P(X)&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;KL divergence between two distributions:&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;KL&lt;span class="p"&gt;}&lt;/span&gt;(P &lt;span class="k"&gt;\|&lt;/span&gt; Q) = &lt;span class="k"&gt;\sum&lt;/span&gt;&lt;span class="p"&gt;_{&lt;/span&gt;x&lt;span class="p"&gt;}&lt;/span&gt; P(x) &lt;span class="k"&gt;\log&lt;/span&gt; &lt;span class="k"&gt;\frac&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;P(x)&lt;span class="p"&gt;}{&lt;/span&gt;Q(x)&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ELBO for variational inference:&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;\mathcal&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;L&lt;span class="p"&gt;}&lt;/span&gt;(&lt;span class="k"&gt;\phi&lt;/span&gt;, &lt;span class="k"&gt;\theta&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;q&lt;span class="p"&gt;_&lt;/span&gt;&lt;span class="k"&gt;\phi&lt;/span&gt;(z|x)&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;\left&lt;/span&gt;&lt;span class="na"&gt;[ \log p_\theta(x|z) \right]&lt;/span&gt; - D&lt;span class="p"&gt;_{&lt;/span&gt;KL&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="k"&gt;\left&lt;/span&gt;( q&lt;span class="p"&gt;_&lt;/span&gt;&lt;span class="k"&gt;\phi&lt;/span&gt;(z|x) &lt;span class="k"&gt;\|&lt;/span&gt; p(z) &lt;span class="k"&gt;\right&lt;/span&gt;)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What a Model Card Looks Like in Practice
&lt;/h2&gt;

&lt;p&gt;A typical model card in Confluence might be structured like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Overview&lt;/strong&gt; — what the model does, who it's for&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architecture&lt;/strong&gt; — layer counts, attention heads, embedding dimensions (inline equations for shapes)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Training objective&lt;/strong&gt; — loss function as a block equation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optimiser&lt;/strong&gt; — learning rate, weight decay, scheduler (formulas inline in a table)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evaluation&lt;/strong&gt; — metrics defined as equations, results as a table&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Known limitations&lt;/strong&gt; — plain text&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With LaTeX Math, the equations in that document are live, editable, and match the actual implementation. When a team member updates the model and changes the loss function, they update the equation directly — no re-exporting, no new screenshots, no broken images.&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 &lt;code&gt;/math&lt;/code&gt; for an inline equation.&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>5 Things You Can Build with HTML Macro for Confluence</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Thu, 23 Apr 2026 13:36:51 +0000</pubDate>
      <link>https://dev.to/yamuno-software/5-things-you-can-build-with-html-macro-for-confluence-484a</link>
      <guid>https://dev.to/yamuno-software/5-things-you-can-build-with-html-macro-for-confluence-484a</guid>
      <description>&lt;h1&gt;
  
  
  5 Things You Can Build with HTML Macro for Confluence
&lt;/h1&gt;

&lt;p&gt;Confluence is a solid documentation platform. But the moment you need a colored status badge, a countdown to your launch date, or a table that users can actually sort — you hit a wall. Native macros only go so far.&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; fills that gap. It lets you drop a full HTML/CSS/JS editor directly into any Confluence page. Live preview, CSP security controls, granular access permissions — and it runs entirely on Atlassian Forge with nothing sent to external servers.&lt;/p&gt;

&lt;p&gt;Here are five concrete things teams are building with it right now.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Custom Status Badge / Traffic Light Indicator
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The problem:&lt;/strong&gt; Your project status page needs a RAG (Red/Amber/Green) indicator that's quick to read and easy for editors to update. The native Confluence status macro is limited, and color-coded text doesn't stand out enough for at-a-glance checks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The solution:&lt;/strong&gt; A simple HTML/CSS badge with a colored circle and a label. Editors change one word to flip the status.&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="c"&gt;&amp;lt;!-- HTML --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"rag-badge"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"dot green"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"label"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;On Track&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* CSS */&lt;/span&gt;
&lt;span class="nc"&gt;.rag-badge&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;align-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;600&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.dot&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;18px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;18px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;50%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;inline-block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;flex-shrink&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.dot.green&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#22c55e&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt; &lt;span class="m"&gt;#22c55e88&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.dot.amber&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#f59e0b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt; &lt;span class="m"&gt;#f59e0b88&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.dot.red&lt;/span&gt;    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#ef4444&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt; &lt;span class="m"&gt;#ef444488&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.label&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#1e293b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it's useful:&lt;/strong&gt; Swap &lt;code&gt;green&lt;/code&gt; → &lt;code&gt;amber&lt;/code&gt; → &lt;code&gt;red&lt;/code&gt; on the dot class and update the label text. That's the entire update. No Confluence macros to reconfigure, no separate status apps to install. Engineers, PMs, and project leads can glance at a page and immediately know where things stand.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Embedded Countdown Timer
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The problem:&lt;/strong&gt; Your team has a product launch date, a sprint end, or a compliance deadline coming up. A static date in the page body gets ignored. Teams want something that actively reminds them how much runway is left.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The solution:&lt;/strong&gt; A JavaScript countdown that calculates days, hours, and minutes remaining from a target date, updating every second.&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="c"&gt;&amp;lt;!-- HTML --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"countdown-wrapper"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"countdown-title"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Launch Countdown&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"countdown-timer"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"unit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"days"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;--&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&amp;lt;label&amp;gt;&lt;/span&gt;Days&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"unit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"hours"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;--&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&amp;lt;label&amp;gt;&lt;/span&gt;Hours&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"unit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"minutes"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;--&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&amp;lt;label&amp;gt;&lt;/span&gt;Minutes&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* CSS */&lt;/span&gt;
&lt;span class="nc"&gt;.countdown-wrapper&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;24px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#f8fafc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.countdown-title&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;14px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;600&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;text-transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;uppercase&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;letter-spacing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.08em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#64748b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;margin-bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.countdown-timer&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;justify-content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="py"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;24px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.unit&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;flex-direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;align-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.unit&lt;/span&gt; &lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;48px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;700&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#1e293b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;line-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.unit&lt;/span&gt; &lt;span class="nt"&gt;label&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#94a3b8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;margin-top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;text-transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;uppercase&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;letter-spacing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.06em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// JavaScript — set your target date here&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;target&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2026-05-01T09:00:00&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;tick&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;target&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.countdown-timer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;p&amp;gt;We're live!&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;days&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;86400000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hours&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;86400000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;3600000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;minutes&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;3600000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;60000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;tick&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nf"&gt;setInterval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tick&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it's useful:&lt;/strong&gt; Change one date string and you have a live countdown that works for any milestone. Sprint reviews, feature freezes, go-live dates — it's a passive but effective nudge every time someone opens the page.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Interactive Decision Tree for Runbooks
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The problem:&lt;/strong&gt; Runbooks and incident response guides are often long, linear documents. Engineers in the middle of an incident don't want to read paragraphs — they want to answer a question and be told exactly what to do next.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The solution:&lt;/strong&gt; A clickable HTML/CSS decision tree that walks users through branching logic step by step. No external charting library required.&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="c"&gt;&amp;lt;!-- HTML --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"tree"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"tree"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"node active"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"q1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Is the service returning errors?&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"choices"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;onclick=&lt;/span&gt;&lt;span class="s"&gt;"show('q1-yes')"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Yes&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;onclick=&lt;/span&gt;&lt;span class="s"&gt;"show('q1-no')"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;No&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"node"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"q1-yes"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Are errors 5xx (server-side)?&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"choices"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;onclick=&lt;/span&gt;&lt;span class="s"&gt;"show('check-logs')"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Yes&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;onclick=&lt;/span&gt;&lt;span class="s"&gt;"show('check-upstream')"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;No&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"node answer"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"check-logs"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Check application logs in Datadog. Look for OOM errors or unhandled exceptions. Page the on-call engineer if needed.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;onclick=&lt;/span&gt;&lt;span class="s"&gt;"reset()"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Start over&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"node answer"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"check-upstream"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Likely a 4xx or gateway issue. Check upstream dependencies and API gateway logs.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;onclick=&lt;/span&gt;&lt;span class="s"&gt;"reset()"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Start over&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"node answer"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"q1-no"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Service appears healthy. Check monitoring dashboards for latency spikes or queue depth issues.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;onclick=&lt;/span&gt;&lt;span class="s"&gt;"reset()"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Start over&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* CSS */&lt;/span&gt;
&lt;span class="nc"&gt;.tree&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;480px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.node&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#e2e8f0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;margin-bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#fff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.node.active&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.node&lt;/span&gt; &lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;14px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;15px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#1e293b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;500&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.choices&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="py"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt; &lt;span class="m"&gt;18px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;6px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#6366f1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#fff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;14px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;pointer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#4f46e5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.answer&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#f0fdf4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;border-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#86efac&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.answer&lt;/span&gt; &lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#166534&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;400&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.answer&lt;/span&gt; &lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#64748b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// JavaScript&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.node&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;active&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;active&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;reset&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;q1&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it's useful:&lt;/strong&gt; Runbook authors can build arbitrarily deep trees using just HTML — no Mermaid, no Lucidchart license needed. The tree lives inside the Confluence page, is searchable, and can be updated by anyone with access to the macro editor.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Custom Data Table with Sort and Filter
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The problem:&lt;/strong&gt; Confluence tables are static. You can't click a column header to sort, and there's no filter input. For any table with more than a dozen rows — vendor lists, feature matrices, environment configs — this is a real usability problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The solution:&lt;/strong&gt; A vanilla JavaScript snippet that adds click-to-sort to any HTML table, plus a live filter input.&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="c"&gt;&amp;lt;!-- HTML --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"table-wrapper"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"filter"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Filter rows..."&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;table&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"data-table"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;thead&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;tr&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;th&amp;gt;&lt;/span&gt;Service&lt;span class="nt"&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;th&amp;gt;&lt;/span&gt;Owner&lt;span class="nt"&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;th&amp;gt;&lt;/span&gt;Status&lt;span class="nt"&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;th&amp;gt;&lt;/span&gt;SLA&lt;span class="nt"&gt;&amp;lt;/th&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/thead&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;tbody&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;/span&gt;Auth API&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;/span&gt;Platform&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;/span&gt;Healthy&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;/span&gt;99.9%&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;/span&gt;Billing&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;/span&gt;Payments&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;/span&gt;Degraded&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;/span&gt;99.5%&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;/span&gt;Notifications&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;/span&gt;Growth&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;/span&gt;Healthy&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;/span&gt;99.0%&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;/span&gt;Search&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;/span&gt;Platform&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;/span&gt;Healthy&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;/span&gt;99.9%&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;/span&gt;Analytics&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;/span&gt;Data&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;/span&gt;Maintenance&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;/span&gt;98.0%&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/tbody&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/table&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* CSS */&lt;/span&gt;
&lt;span class="nc"&gt;.table-wrapper&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;#filter&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;margin-bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#cbd5e1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;6px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;14px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;box-sizing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;border-box&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;table&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;border-collapse&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;collapse&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;14px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;th&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#f1f5f9&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt; &lt;span class="m"&gt;14px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;left&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;pointer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="py"&gt;user-select&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;border-bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#e2e8f0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#475569&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;th&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#e2e8f0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;td&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt; &lt;span class="m"&gt;14px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;border-bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#f1f5f9&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#1e293b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;tr&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="nt"&gt;td&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#f8fafc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;th&lt;/span&gt;&lt;span class="nc"&gt;.asc&lt;/span&gt;&lt;span class="nd"&gt;::after&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;" ▲"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;11px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;th&lt;/span&gt;&lt;span class="nc"&gt;.desc&lt;/span&gt;&lt;span class="nd"&gt;::after&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;" ▼"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;11px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// JavaScript&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;table&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;data-table&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tbody&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;table&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tbody&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;table&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;th&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;sortCol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;sortAsc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;th&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;th&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sortCol&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;sortAsc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;sortAsc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;sortCol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;sortAsc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;asc&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="s2"&gt;desc&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="nx"&gt;th&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sortAsc&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;asc&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="s2"&gt;desc&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tbody&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tr&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="nx"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;av&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cells&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cells&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;sortAsc&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;av&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;localeCompare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;bv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;localeCompare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;av&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="nx"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;tbody&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&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="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;filter&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;input&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;q&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;tbody&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tr&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;row&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;display&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;q&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="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;none&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it's useful:&lt;/strong&gt; Replace the &lt;code&gt;&amp;lt;tbody&amp;gt;&lt;/code&gt; rows with your actual data and you have a fully sortable, filterable table with zero dependencies. Works for service registries, on-call rosters, feature flags, release checklists — anything that lives in a Confluence table but deserves better UX.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Branded Announcement Banner
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The problem:&lt;/strong&gt; HR needs to announce open enrollment. Marketing wants to flag a product launch to all readers of a space. The built-in Confluence info panel is functional but bland — it doesn't match company branding and blends into the page noise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The solution:&lt;/strong&gt; A CSS-styled announcement banner with a company-colored left border, an icon, a headline, and body text. Completely customizable.&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="c"&gt;&amp;lt;!-- HTML --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"announcement"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"announcement-icon"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;📣&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"announcement-body"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"announcement-title"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Open Enrollment — Action Required&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"announcement-message"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      Benefits enrollment is open until &lt;span class="nt"&gt;&amp;lt;strong&amp;gt;&lt;/span&gt;April 30, 2026&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt;.
      Log in to Workday and complete your selections before the deadline.
      Contact &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"mailto:hr@company.com"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;hr@company.com&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt; with questions.
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* CSS */&lt;/span&gt;
&lt;span class="nc"&gt;.announcement&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;align-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex-start&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;18px&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#6366f1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#eef2ff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;680px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.announcement-icon&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;24px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;flex-shrink&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;margin-top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.announcement-title&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;15px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;700&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#3730a3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;margin-bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;6px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.announcement-message&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;14px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#1e293b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;line-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.announcement-message&lt;/span&gt; &lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#6366f1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;text-decoration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;500&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.announcement-message&lt;/span&gt; &lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;text-decoration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;underline&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it's useful:&lt;/strong&gt; Change the border color and background tint to match your brand palette, swap in your own headline and message, and you have a polished callout that actually gets noticed. No graphic design skills needed, and the same template works for IT alerts, policy updates, and event announcements.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Note on Security
&lt;/h2&gt;

&lt;p&gt;Embedding HTML and JavaScript in a documentation platform is a responsibility that admins need to control. HTML Macro for Confluence gives you three Content Security Policy modes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Block All&lt;/strong&gt; — the strictest setting. No external resources (scripts, fonts, images) can load. This is the right default for pure HTML/CSS snippets like the badge and banner examples above.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Whitelist&lt;/strong&gt; — you specify exactly which external domains are permitted. If your team uses Chart.js from a CDN or embeds a Google Map, you add those domains to the allowlist and nothing else gets through.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Allow All&lt;/strong&gt; — fully permissive. Appropriate for tightly controlled internal environments where you trust every editor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Combined with editor access control — which limits who can open the code editor in the first place — you can let most teams use the rendered output without ever exposing the source code.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It Free
&lt;/h2&gt;

&lt;p&gt;All five of the examples above work today, without any paid tier, without any external server, and without leaving Confluence.&lt;/p&gt;

&lt;p&gt;HTML Macro for Confluence is free on the Atlassian Marketplace. Install it, drop it into a page, and paste in one of the snippets above to see the live preview update as you type.&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;




&lt;p&gt;&lt;em&gt;Have a use case we didn't cover? We'd love to hear what your team builds. Reach out through our &lt;a href="https://yamuno.atlassian.net/servicedesk/customer/portals" rel="noopener noreferrer"&gt;support portal&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>documentation</category>
      <category>html</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Embed Custom HTML, CSS &amp; JavaScript in Confluence — Introducing HTML Macro for Confluence</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Thu, 23 Apr 2026 13:36:38 +0000</pubDate>
      <link>https://dev.to/yamuno-software/embed-custom-html-css-javascript-in-confluence-introducing-html-macro-for-confluence-3pfm</link>
      <guid>https://dev.to/yamuno-software/embed-custom-html-css-javascript-in-confluence-introducing-html-macro-for-confluence-3pfm</guid>
      <description>&lt;h1&gt;
  
  
  Introducing HTML Macro for Confluence
&lt;/h1&gt;

&lt;p&gt;We're thrilled to announce that &lt;a href="https://marketplace.atlassian.com/apps/1670180315/html-macro-for-confluence-free?hosting=cloud&amp;amp;tab=overview" rel="noopener noreferrer"&gt;&lt;strong&gt;HTML Macro for Confluence&lt;/strong&gt;&lt;/a&gt; is now live on the Atlassian Marketplace — and it's free!&lt;/p&gt;

&lt;p&gt;Confluence is great for documentation, but sometimes you need more than what native macros can offer. Now you can embed fully custom HTML, CSS, and JavaScript directly inside any Confluence page — interactive charts, branded sections, custom embeds, you name it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvs64ywos0a0qi7hxhvlv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvs64ywos0a0qi7hxhvlv.png" alt="HTML Macro for Confluence Banner" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is HTML Macro for Confluence?
&lt;/h2&gt;

&lt;p&gt;HTML Macro for Confluence is a Forge-native Confluence Cloud app that lets you insert a rich code editor directly into any page. Write HTML, CSS, and JavaScript with syntax highlighting, see a live preview as you type, and publish polished interactive content — all without leaving Confluence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Code Editor with Live Preview
&lt;/h3&gt;

&lt;p&gt;The macro opens a three-tab editor (HTML, CSS, JS) with syntax highlighting. A resizable split panel shows the rendered output in real time as you type — no more guessing how your code will look once saved.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuwwy4uu21qs9bnhmm9by.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuwwy4uu21qs9bnhmm9by.png" alt="Live Preview Editor" width="800" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Enterprise-Grade CSP Security
&lt;/h3&gt;

&lt;p&gt;Security is built in, not bolted on. Admins choose from three Content Security Policy modes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Block All&lt;/strong&gt; — no external resources allowed (strictest, default)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Whitelist&lt;/strong&gt; — only domains you explicitly approve can load resources&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Allow All&lt;/strong&gt; — unrestricted, for trusted internal environments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means you can let teams use Chart.js, Google Maps, or YouTube embeds safely — by whitelisting only the domains you trust.&lt;/p&gt;

&lt;h3&gt;
  
  
  Editor Access Control
&lt;/h3&gt;

&lt;p&gt;Not everyone on a page should be able to edit embedded code. HTML Macro lets admins whitelist specific users who can open the code editor. Everyone else sees only the rendered output — source code stays private.&lt;/p&gt;

&lt;h3&gt;
  
  
  Automatic iframe Height
&lt;/h3&gt;

&lt;p&gt;The macro auto-adjusts its iframe height to match the content — no fixed heights to set, no awkward blank space below your widget.&lt;/p&gt;

&lt;h3&gt;
  
  
  Macro Usage Analytics
&lt;/h3&gt;

&lt;p&gt;Admins get a dashboard showing every Confluence page using the HTML Macro across the entire instance, with space breakdowns and direct page links. Understand adoption and audit usage in seconds.&lt;/p&gt;

&lt;h3&gt;
  
  
  Runs Entirely on Atlassian Forge
&lt;/h3&gt;

&lt;p&gt;HTML Macro for Confluence is 100% Forge-native. All content is stored inside Atlassian's infrastructure. Nothing is sent to external servers — ever.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Can You Build?
&lt;/h2&gt;

&lt;p&gt;Here are a few things teams are already building with HTML Macro for Confluence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Interactive dashboards&lt;/strong&gt; using Chart.js or D3.js&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Branded internal landing pages&lt;/strong&gt; with custom CSS layouts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Embedded maps&lt;/strong&gt; via Google Maps or Leaflet&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Video embeds&lt;/strong&gt; (YouTube, Vimeo) with custom styling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom tables and data grids&lt;/strong&gt; with sorting and filtering&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Onboarding checklists&lt;/strong&gt; and interactive forms&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Countdown timers&lt;/strong&gt; and status banners&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you can build it with HTML, CSS, and JavaScript — you can put it in Confluence.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Install the app&lt;/strong&gt; from the &lt;a href="https://marketplace.atlassian.com/apps/1670180315/html-macro-for-confluence-free?hosting=cloud&amp;amp;tab=overview" rel="noopener noreferrer"&gt;Atlassian Marketplace&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Open any Confluence page and type &lt;code&gt;/HTML Macro&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Write your HTML, CSS, and JavaScript in the editor&lt;/li&gt;
&lt;li&gt;See the live preview update as you type&lt;/li&gt;
&lt;li&gt;Save and publish — your content is live&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Free on the Marketplace
&lt;/h2&gt;

&lt;p&gt;HTML Macro for Confluence is available for free. Install it today and start building richer Confluence pages in minutes.&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&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://dev.to/docs/html-macro-for-confluence"&gt;Read the Documentation&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Questions or feedback? Reach out via our &lt;a href="https://yamuno.atlassian.net/servicedesk/customer/portals" rel="noopener noreferrer"&gt;support portal&lt;/a&gt; — we'd love to hear what you build with it.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>documentation</category>
      <category>html</category>
      <category>javascript</category>
      <category>showdev</category>
    </item>
    <item>
      <title>How to Import Markdown Files into Confluence (Step-by-Step Guide)</title>
      <dc:creator>Yamuno</dc:creator>
      <pubDate>Thu, 23 Apr 2026 13:31:14 +0000</pubDate>
      <link>https://dev.to/yamuno-software/how-to-import-markdown-files-into-confluence-step-by-step-guide-4heh</link>
      <guid>https://dev.to/yamuno-software/how-to-import-markdown-files-into-confluence-step-by-step-guide-4heh</guid>
      <description>&lt;h1&gt;
  
  
  How to Import Markdown Files into Confluence
&lt;/h1&gt;

&lt;p&gt;Confluence is where your team documents things. Markdown is where developers write things. The problem is they don't naturally talk to each other — pasting markdown into Confluence turns your beautiful formatting into a wall of symbols.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.atlassian.com/apps/1231894/markdown-importer-for-confluence-markdown-exporter?hosting=cloud&amp;amp;tab=overview" rel="noopener noreferrer"&gt;Markdown Importer for Confluence &amp;amp; Markdown Exporter&lt;/a&gt; bridges that gap. Here's exactly how to use it to get markdown into Confluence — whether that's a single file, a folder of docs, or an entire GitHub repository.&lt;/p&gt;




&lt;h2&gt;
  
  
  Option 1 — Import a Single Markdown File
&lt;/h2&gt;

&lt;p&gt;Best for: a single README, a runbook, an architecture decision record, or any standalone document.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open any Confluence space and navigate to where you want the page&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Apps&lt;/strong&gt; → &lt;strong&gt;Markdown Importer&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Import Files&lt;/strong&gt; and upload your &lt;code&gt;.md&lt;/code&gt; or &lt;code&gt;.mdx&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;Preview the rendered output&lt;/li&gt;
&lt;li&gt;Select the parent page (or leave it at the space root)&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Import&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Your page is created with all formatting intact — headings, tables, code blocks, images, and lists all convert cleanly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Option 2 — Import a Folder of Markdown Files
&lt;/h2&gt;

&lt;p&gt;Best for: importing a docs folder from a project, a wiki from GitHub/GitLab, or any set of related documents that form a hierarchy.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Zip your markdown folder (preserving the folder structure)&lt;/li&gt;
&lt;li&gt;Open &lt;strong&gt;Markdown Importer&lt;/strong&gt; from the Apps menu&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Import Files&lt;/strong&gt; and upload the ZIP&lt;/li&gt;
&lt;li&gt;The importer reads your folder structure and maps it to a Confluence page hierarchy&lt;/li&gt;
&lt;li&gt;Preview the page tree — reorder or exclude pages as needed&lt;/li&gt;
&lt;li&gt;Select the parent page in Confluence&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Import&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The folder hierarchy becomes your 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;docs/
├── getting-started/
│   ├── index.md        → Getting Started (parent)
│   ├── installation.md → Installation (child)
│   └── quick-start.md  → Quick Start (child)
└── features/
    ├── index.md        → Features (parent)
    └── api.md          → API Reference (child)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Internal links between files are automatically converted to Confluence page links — cross-references stay intact.&lt;/p&gt;




&lt;h2&gt;
  
  
  Option 3 — Import from a GitHub or GitLab Repository
&lt;/h2&gt;

&lt;p&gt;Best for: syncing developer documentation directly from source control into Confluence — keeping your &lt;code&gt;/docs&lt;/code&gt; folder and your Confluence space in sync.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Markdown Importer&lt;/strong&gt; from the Apps menu&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Import from URL&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Paste your GitHub or GitLab repository URL (or a specific folder URL)&lt;/li&gt;
&lt;li&gt;The importer fetches your markdown files directly from the repo&lt;/li&gt;
&lt;li&gt;Preview the page tree&lt;/li&gt;
&lt;li&gt;Select the destination in Confluence&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Import&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is the fastest path from a Git repo to Confluence — no need to clone locally, zip files, or manually copy content.&lt;/p&gt;




&lt;h2&gt;
  
  
  Option 4 — Import via REST API (Automated Pipelines)
&lt;/h2&gt;

&lt;p&gt;Best for: CI/CD pipelines, documentation-as-code workflows, and teams that want to automatically sync docs on every commit.&lt;/p&gt;

&lt;p&gt;The Markdown Importer exposes a REST API that lets you trigger imports programmatically. Add it to your CI pipeline and your Confluence pages update automatically whenever your docs change.&lt;/p&gt;

&lt;p&gt;See the &lt;a href="https://dev.to/docs/markdown-importer-for-confluence/rest-api"&gt;REST API documentation&lt;/a&gt; for full details.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Gets Preserved
&lt;/h2&gt;

&lt;p&gt;The importer handles the full range of standard markdown formatting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Headings&lt;/strong&gt; — H1–H6 map to Confluence heading levels&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Text formatting&lt;/strong&gt; — bold, italic, strikethrough, inline code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tables&lt;/strong&gt; — including alignment and header rows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code blocks&lt;/strong&gt; — with language and syntax highlighting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lists&lt;/strong&gt; — ordered, unordered, nested, and task lists with checkboxes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Images&lt;/strong&gt; — uploaded as Confluence attachments and linked inline&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blockquotes&lt;/strong&gt; — converted to Confluence info/note panels&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Links&lt;/strong&gt; — external URLs preserved; internal &lt;code&gt;.md&lt;/code&gt; links converted to Confluence page links&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontmatter&lt;/strong&gt; — YAML frontmatter is parsed (title, date, author, tags can map to page properties)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Tips
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Check your image paths.&lt;/strong&gt; If your markdown references images with relative paths, make sure the images are included in your ZIP or accessible at the URL before importing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use frontmatter for page titles.&lt;/strong&gt; If your files have &lt;code&gt;title:&lt;/code&gt; in the YAML frontmatter, the importer uses that as the Confluence page title instead of the filename.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Import into a staging space first.&lt;/strong&gt; For large imports, run it in a test space before hitting production. It's easy to re-import if anything looks off.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bulk import is unlimited.&lt;/strong&gt; There's no cap on how many pages you can import in one go — import an entire repository if you need to.&lt;/p&gt;




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

&lt;p&gt;Install &lt;a href="https://marketplace.atlassian.com/apps/1231894/markdown-importer-for-confluence-markdown-exporter?hosting=cloud&amp;amp;tab=overview" rel="noopener noreferrer"&gt;Markdown Importer for Confluence &amp;amp; Markdown Exporter&lt;/a&gt; from the Atlassian Marketplace — free to try.&lt;/p&gt;

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




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

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