<?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: Mikhail Klimenko</title>
    <description>The latest articles on DEV Community by Mikhail Klimenko (@mikhailklimenko).</description>
    <link>https://dev.to/mikhailklimenko</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4111646%2F512278b1-27fa-4800-a2b5-316bb50e0700.jpg</url>
      <title>DEV Community: Mikhail Klimenko</title>
      <link>https://dev.to/mikhailklimenko</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mikhailklimenko"/>
    <language>en</language>
    <item>
      <title>How to find all restricted pages in Confluence Cloud</title>
      <dc:creator>Mikhail Klimenko</dc:creator>
      <pubDate>Sat, 31 Oct 2026 15:12:19 +0000</pubDate>
      <link>https://dev.to/mikhailklimenko/how-to-find-all-restricted-pages-in-confluence-cloud-54f6</link>
      <guid>https://dev.to/mikhailklimenko/how-to-find-all-restricted-pages-in-confluence-cloud-54f6</guid>
      <description>&lt;p&gt;&lt;strong&gt;Short answer.&lt;/strong&gt; For one space, open the space's &lt;strong&gt;Restricted&lt;/strong&gt; report, which sits in space settings; the direct address is &lt;code&gt;/wiki/pages/listpermissionpages.action?key=SPACEKEY&lt;/code&gt;. It lists every page with a view or edit restriction and who is allowed in. It does &lt;strong&gt;not&lt;/strong&gt; list child pages that are hidden only because their parent is restricted. For the whole site, including those inherited cases, use the REST API; a short script is below. CQL cannot do it: it has no field for restrictions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The space report
&lt;/h2&gt;

&lt;p&gt;The report describes itself as showing all pages and live docs whose access is restricted at the content level and allowed only to specific users or groups. On our test space it listed, for each restricted page, the title, the type of restriction (view or edit), the allowed user or group, the author and the creation date. A page restricted for viewing appeared with both its view and its edit restriction; a page restricted only for editing appeared once, as edit.&lt;/p&gt;

&lt;p&gt;Three limits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One space at a time.&lt;/strong&gt; There is no site-wide version; for fifty spaces you open it fifty times.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inherited restrictions are missing.&lt;/strong&gt; View restrictions cascade: a child page under a view-restricted page is hidden from the same people. In our test that child page did not appear in the report at all, because nothing is set on the child itself. These are exactly the pages that confuse people, since the page looks unrestricted when you open its own settings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It lives in space settings&lt;/strong&gt;, so in practice it is a tool for space admins.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why CQL cannot help
&lt;/h2&gt;

&lt;p&gt;CQL, the query language behind Confluence search, has no condition for restrictions. We tried &lt;code&gt;restriction&lt;/code&gt;, &lt;code&gt;restricted&lt;/code&gt;, &lt;code&gt;content.restriction&lt;/code&gt; and &lt;code&gt;hasRestrictions&lt;/code&gt;; each was rejected with an error saying the field does not exist. Any answer that offers a CQL query for this is guessing. More on what CQL can do in our &lt;a href="https://horizonventures.app/docs/confluence-cql-cheat-sheet.html" rel="noopener noreferrer"&gt;CQL cheat sheet&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The whole site, including inherited restrictions
&lt;/h2&gt;

&lt;p&gt;The REST API returns the restrictions of any page: &lt;code&gt;GET /wiki/rest/api/content/{id}/restriction?expand=restrictions.user,restrictions.group&lt;/code&gt; gives a list of operations (read for view, update for edit) with the users and groups on each. For the child page in our test it returned nothing, which matches the report: the restriction lives on the parent. So a complete list needs one more step, checking each page's ancestors.&lt;/p&gt;

&lt;p&gt;This Python script does both. It needs only Python 3 and an &lt;a href="https://id.atlassian.com/manage-profile/security/api-tokens" rel="noopener noreferrer"&gt;Atlassian API token&lt;/a&gt;; we ran it against our test site and it found all three test pages, the child one included:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# List every page in Confluence Cloud that is restricted directly or through a parent.
# Usage: python restricted_pages.py https://your-site.atlassian.net you@example.com API_TOKEN
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;

&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;auth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Basic &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;b64encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;req&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Accept&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;restrictions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;page_id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/wiki/rest/api/content/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;page_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/restriction&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
               &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;?expand=restrictions.user,restrictions.group&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;results&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[]):&lt;/span&gt;
        &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;restrictions&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
        &lt;span class="n"&gt;who&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;displayName&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;accountId&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{}).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;results&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[])]&lt;/span&gt;
        &lt;span class="n"&gt;who&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;group&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{}).&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;results&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[])]&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;who&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;operation&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;who&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt;

&lt;span class="n"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/wiki/api/v2/pages?limit=250&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;pages&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;results&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;nxt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;_links&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;next&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/wiki&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;nxt&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;nxt&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;nxt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/wiki&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;nxt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;direct&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="nf"&gt;restrictions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;own&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;direct&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;own&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; | restricted here | &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;own&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;continue&lt;/span&gt;
    &lt;span class="n"&gt;ancestors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/wiki/api/v2/pages/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/ancestors&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;results&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;locked&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ancestors&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;read&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;direct&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;{})]&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;locked&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; | view restricted through parent page &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;locked&lt;/span&gt;&lt;span class="p"&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="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On our test site the output was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Restriction probe: view restricted | restricted here | {'read': [...], 'update': [...]}
Restriction probe: child of restricted | view restricted through parent page 26378267
Restriction probe: edit restricted | restricted here | {'update': [...]}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two things to know before you run it on a large site. It makes one or two requests per page, so a site with ten thousand pages takes a while; run it overnight rather than during a review meeting. And it can only see what the account behind the token can see: a page restricted to people other than you will not appear. Run it with an account that is part of the restrictions you need to audit, or ask each space admin to run the space report.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we could not test
&lt;/h2&gt;

&lt;p&gt;Our test site has a single user, so we could not check what someone outside a restriction sees in the report, or whether the report shows pages that are restricted from the admin running it. Higher Confluence plans also list a permission inspection tool among their admin features; we have not tested it.&lt;/p&gt;

&lt;p&gt;If the question is why one person cannot open one page, start with &lt;a href="https://horizonventures.app/docs/why-cannot-see-confluence-page.html" rel="noopener noreferrer"&gt;how space permissions and page restrictions interact&lt;/a&gt;.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  How do I see all restricted pages in a space?
&lt;/h3&gt;

&lt;p&gt;Open the Restricted report in space settings, directly at &lt;code&gt;/wiki/pages/listpermissionpages.action?key=SPACEKEY&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does the report show child pages of a restricted page?
&lt;/h3&gt;

&lt;p&gt;No. Pages hidden only through a restricted parent are not listed. Use the REST API with an ancestor check.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can CQL find restricted pages?
&lt;/h3&gt;

&lt;p&gt;No. CQL has no field for restrictions.&lt;/p&gt;

&lt;p&gt;Related: &lt;a href="https://horizonventures.app/docs/why-cannot-see-confluence-page.html" rel="noopener noreferrer"&gt;Confluence page restrictions: why someone can't see a page&lt;/a&gt;, &lt;a href="https://horizonventures.app/docs/confluence-cql-cheat-sheet.html" rel="noopener noreferrer"&gt;Confluence CQL cheat sheet&lt;/a&gt;, and &lt;a href="https://horizonventures.app/docs/find-stale-pages-confluence.html" rel="noopener noreferrer"&gt;finding pages nobody maintains&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>confluence</category>
      <category>atlassian</category>
      <category>security</category>
      <category>python</category>
    </item>
    <item>
      <title>Broken image in Confluence Cloud: what the placeholder tells you</title>
      <dc:creator>Mikhail Klimenko</dc:creator>
      <pubDate>Sat, 31 Oct 2026 14:30:36 +0000</pubDate>
      <link>https://dev.to/mikhailklimenko/broken-image-in-confluence-cloud-what-the-placeholder-tells-you-pic</link>
      <guid>https://dev.to/mikhailklimenko/broken-image-in-confluence-cloud-what-the-placeholder-tells-you-pic</guid>
      <description>&lt;p&gt;&lt;strong&gt;Short answer.&lt;/strong&gt; A grey box with a &lt;strong&gt;file icon&lt;/strong&gt; and a "preview unavailable" message means the image's attachment is missing from the page, usually because someone deleted it; restore it from the space trash. The same box with a &lt;strong&gt;picture icon&lt;/strong&gt; means the image is linked from an outside address that no longer answers; upload the image to the page instead. A small grey &lt;strong&gt;"unknown attachment"&lt;/strong&gt; label means the image came from another page that has been deleted; restore that page from the trash or re-upload the image here.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three placeholders
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you see&lt;/th&gt;
&lt;th&gt;Cause&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Grey box, file icon, preview unavailable&lt;/td&gt;
&lt;td&gt;The attachment is not on the page: deleted, or never uploaded&lt;/td&gt;
&lt;td&gt;Restore it from the space trash, or upload the file again&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Grey box, picture icon, preview unavailable&lt;/td&gt;
&lt;td&gt;The image is an external link and the address no longer returns an image&lt;/td&gt;
&lt;td&gt;Save the image and upload it to the page as an attachment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Small grey "unknown attachment" label&lt;/td&gt;
&lt;td&gt;The image is an attachment of another page, and that page was deleted&lt;/td&gt;
&lt;td&gt;Restore the other page from the trash, or upload the image to this page&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Our test site runs in Russian, so the English wording of the messages may differ slightly; the icons and the shape of each placeholder are what to go by.&lt;/p&gt;

&lt;p&gt;Two details from the test that save time. A deleted attachment and one that was never uploaded look exactly the same, so the trash is the only way to tell them apart. And a working external image displays normally, so a picture icon in the box really does mean the outside address is the problem, not Confluence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting a deleted image back
&lt;/h2&gt;

&lt;p&gt;Deleting an attachment does not destroy it straight away. In our test the deleted file appeared in the &lt;strong&gt;space trash&lt;/strong&gt;, listed by name together with the page it came from, with a Restore action next to it. Confluence asks for a confirmation, and after that the image was back on the page in place of the grey box. The deleted page behind an "unknown attachment" label was in the same list. The trash for a space is at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://your-site.atlassian.net/wiki/pages/viewtrash.action?key=SPACEKEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace &lt;code&gt;SPACEKEY&lt;/code&gt; with the space key from the page address. Once someone empties the trash, the file is gone for good, and the only way back is a site backup or the original file.&lt;/p&gt;

&lt;p&gt;If you have many pages and want to know which ones lost an image, the REST API lists a page's trashed attachments with &lt;code&gt;GET /wiki/api/v2/pages/{id}/attachments?status=trashed&lt;/code&gt;; on our test page it returned exactly the deleted file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why external images break
&lt;/h2&gt;

&lt;p&gt;An image inserted from a web address is not copied into Confluence; every reader's browser fetches it from that address each time. When the other site moves the file, takes it down or blocks outside use, the picture disappears from your page, and nobody on your side changed anything. For anything that has to stay, download the image and upload it to the page: then it lives in Confluence with the page.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we could not test
&lt;/h2&gt;

&lt;p&gt;Images on pages with restrictions. Our test site is on the Free plan, which has no page restrictions, so we could not check what a reader without access to the source page sees. If an image is broken for one colleague and fine for you, permissions are the first thing to look at.&lt;/p&gt;

&lt;p&gt;For SVG files that show up as a flat picture with dead links rather than a broken one, see &lt;a href="https://horizonventures.app/docs/confluence-svg-flat-image.html" rel="noopener noreferrer"&gt;why Confluence Cloud turns your SVG into a flat image&lt;/a&gt;. That one is not a fault but how Confluence shows SVG.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Why is an image broken on my Confluence page?
&lt;/h3&gt;

&lt;p&gt;The attachment was deleted, the external address died, or the image came from a page that was deleted. The placeholder tells you which.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I restore a deleted image?
&lt;/h3&gt;

&lt;p&gt;Yes, from the space trash, until someone empties it.&lt;/p&gt;

&lt;h3&gt;
  
  
  What does "unknown attachment" mean?
&lt;/h3&gt;

&lt;p&gt;The image belongs to another page that no longer exists. Restore that page or upload the image again.&lt;/p&gt;

&lt;p&gt;Related: &lt;a href="https://horizonventures.app/docs/confluence-svg-flat-image.html" rel="noopener noreferrer"&gt;why Confluence turns SVG into a flat image&lt;/a&gt;, &lt;a href="https://horizonventures.app/docs/confluence-clickable-image.html" rel="noopener noreferrer"&gt;how to make an image clickable&lt;/a&gt;, and &lt;a href="https://horizonventures.app/docs/find-unpublished-drafts-confluence.html" rel="noopener noreferrer"&gt;where unpublished drafts go&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>confluence</category>
      <category>atlassian</category>
      <category>troubleshooting</category>
      <category>documentation</category>
    </item>
    <item>
      <title>How to export multiple Confluence pages to Word</title>
      <dc:creator>Mikhail Klimenko</dc:creator>
      <pubDate>Sat, 31 Oct 2026 14:08:07 +0000</pubDate>
      <link>https://dev.to/mikhailklimenko/how-to-export-multiple-confluence-pages-to-word-3bcf</link>
      <guid>https://dev.to/mikhailklimenko/how-to-export-multiple-confluence-pages-to-word-3bcf</guid>
      <description>&lt;p&gt;&lt;strong&gt;Short answer.&lt;/strong&gt; Confluence Cloud has no built-in way to put several pages into one Word document. The Word export on a page exports that page only, and the space export offers PDF, HTML, XML and CSV but not Word. The free route is to export the pages you need into &lt;strong&gt;one PDF&lt;/strong&gt; (the space PDF export lets you pick them) and open that PDF in Word. If the document has to look right or is produced regularly, use an app that exports a page tree straight to Word.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Confluence does natively
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Word export: one page, no children
&lt;/h3&gt;

&lt;p&gt;Every page has an Export to Word option in its actions menu; the same export sits at &lt;code&gt;/wiki/exportword?pageId=&lt;/code&gt; followed by the page ID. We tested it on a parent page with two child pages: the file contained the parent page and nothing from either child. The file Confluence produces has a &lt;code&gt;.doc&lt;/code&gt; extension but is a web page archive inside, which is worth knowing if your company's document templates or macros expect a real &lt;code&gt;.docx&lt;/code&gt;; save it as &lt;code&gt;.docx&lt;/code&gt; from Word before you pass it on.&lt;/p&gt;

&lt;h3&gt;
  
  
  Space export: no Word option
&lt;/h3&gt;

&lt;p&gt;The space export page offers four formats on our site: PDF, HTML, XML and CSV. Word is not among them.&lt;/p&gt;

&lt;h3&gt;
  
  
  PDF export: you can choose the pages
&lt;/h3&gt;

&lt;p&gt;The space PDF export gives two options: export everything, or &lt;strong&gt;choose what to export&lt;/strong&gt; and tick the pages you want. The result is one PDF. This is the only native way we found to get a chosen set of pages into a single file.&lt;/p&gt;

&lt;h2&gt;
  
  
  The free route: one PDF, then Word
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open the space PDF export and choose the pages you need.&lt;/li&gt;
&lt;li&gt;Download the PDF.&lt;/li&gt;
&lt;li&gt;Open the PDF in Microsoft Word with File, Open. Word converts it into an editable document.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Microsoft says the conversion &lt;a href="https://support.microsoft.com/en-us/word/training/edit-a-pdf" rel="noopener noreferrer"&gt;works best with documents that are mostly text&lt;/a&gt;; complex layouts may not line up exactly. We did not test the Word side of this ourselves, so check tables and images in the result before you send it. For a document that is mostly headings, paragraphs and simple tables it is a reasonable free answer, and it costs about five minutes.&lt;/p&gt;

&lt;p&gt;Two other free routes, both slower: export each page to Word and paste them into one document, which is fine for three pages and painful for thirty; or use the HTML space export and open the files in Word one by one.&lt;/p&gt;

&lt;h2&gt;
  
  
  When an app is worth it
&lt;/h2&gt;

&lt;p&gt;If someone needs the same handbook as a Word file every month, or the document must follow a corporate template with a title page and numbered headings, an exporter app saves the manual work. Figures from the Atlassian Marketplace on 31 October 2026:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;App&lt;/th&gt;
&lt;th&gt;Installs&lt;/th&gt;
&lt;th&gt;What it exports&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Scroll Word Exporter (K15t)&lt;/td&gt;
&lt;td&gt;4,537&lt;/td&gt;
&lt;td&gt;Single pages, page trees or whole spaces to Word, with templates&lt;/td&gt;
&lt;td&gt;$5 a month up to 10 users, then per user&lt;/td&gt;
&lt;td&gt;Forge, updated October 2026. The established choice.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Content Exporter (META-INF)&lt;/td&gt;
&lt;td&gt;1,079&lt;/td&gt;
&lt;td&gt;Pages or whole page trees to PDF, Word and HTML, with page selection&lt;/td&gt;
&lt;td&gt;$6 a month up to 10 users, then per user&lt;/td&gt;
&lt;td&gt;Forge, updated August 2026.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PDF, HTML and Word exporter (miniOrange)&lt;/td&gt;
&lt;td&gt;183&lt;/td&gt;
&lt;td&gt;Pages to PDF and Word with templates&lt;/td&gt;
&lt;td&gt;$4 a month up to 10 users&lt;/td&gt;
&lt;td&gt;Runs on Connect, last updated January 2024; Connect support ends 31 January 2027.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Both of the first two describe exporting a whole page tree into one document in their listings. We have not run either of them, so try the free trial on a real page tree of yours before you commit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; I build &lt;a href="https://horizonventures.app/word-import.html" rel="noopener noreferrer"&gt;Word Import for Confluence&lt;/a&gt;, which does the opposite job: it turns a long Word document into a tree of Confluence pages. If your situation is the reverse of this article, that is where to look; for exporting to Word, the routes above are the honest answer.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Can Confluence export several pages to one Word file?
&lt;/h3&gt;

&lt;p&gt;Not natively. Export the pages to one PDF and open it in Word, or use an exporter app.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does exporting a parent page to Word include its children?
&lt;/h3&gt;

&lt;p&gt;No. Only the page you export ends up in the file.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I pick which pages go into a PDF export?
&lt;/h3&gt;

&lt;p&gt;Yes, the space PDF export lets you choose the pages and gives you one PDF.&lt;/p&gt;

&lt;p&gt;Related: &lt;a href="https://horizonventures.app/docs/confluence-space-export-explained.html" rel="noopener noreferrer"&gt;what a Confluence space export actually gives you&lt;/a&gt;, &lt;a href="https://horizonventures.app/docs/import-word-into-confluence.html" rel="noopener noreferrer"&gt;importing Word documents into Confluence&lt;/a&gt;, and &lt;a href="https://horizonventures.app/docs/split-word-document-confluence-pages.html" rel="noopener noreferrer"&gt;splitting a Word document into several pages&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>confluence</category>
      <category>atlassian</category>
      <category>word</category>
      <category>documentation</category>
    </item>
    <item>
      <title>Find every Confluence Cloud page that uses a macro</title>
      <dc:creator>Mikhail Klimenko</dc:creator>
      <pubDate>Tue, 27 Oct 2026 14:30:37 +0000</pubDate>
      <link>https://dev.to/mikhailklimenko/find-every-confluence-cloud-page-that-uses-a-macro-ljo</link>
      <guid>https://dev.to/mikhailklimenko/find-every-confluence-cloud-page-that-uses-a-macro-ljo</guid>
      <description>&lt;p&gt;&lt;strong&gt;Short answer.&lt;/strong&gt; For the count, a Confluence admin opens &lt;strong&gt;Settings → Data management → Macro usage&lt;/strong&gt;: it lists every app, the names of its macros and how many content items use each. For the list of pages, run the CQL query &lt;code&gt;type = page AND macro = "macro-name"&lt;/code&gt; through the REST search endpoint, adding &lt;code&gt;AND space = KEY&lt;/code&gt; to narrow it to one space. Use the macro name exactly as the Macro usage report shows it. For apps built on Forge that name is the module key, and anything else returns zero.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The Macro usage report: how many
&lt;/h2&gt;

&lt;p&gt;The report sits in Confluence administration under Data management, at &lt;code&gt;/wiki/admin/macro-usage&lt;/code&gt;. It has two parts.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;All macros&lt;/strong&gt; lists each app, bundled or installed, with its macro names and the number of content items that contain them. On our test site it showed our own Forge app as &lt;code&gt;clickable-svg(9)&lt;/code&gt;, which matched the nine pages we knew had it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unused macros&lt;/strong&gt; lists macros from installed apps that appear nowhere. The report itself says what this is for: checking that an app is not used before you disable or remove it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Three limits, the first two stated on the report page itself. It only counts content you are allowed to see, so pages with restrictions you are not part of are missing from the numbers. Archived spaces are left out. And on our site it gave counts per macro, not links to the pages, with no space filter or export; an admin on the community forum &lt;a href="https://community.atlassian.com/forums/discussion/3175473/macro-usage-search-in-confluence-cloud" rel="noopener noreferrer"&gt;described the same&lt;/a&gt; when trying to count one macro in one space. For the page list you need search.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. CQL: which pages
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type = page AND macro = "drawio"
type = page AND macro = "drawio" AND space = DEV
type = page AND macro IN ("drawio", "gliffy")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The quickest way to run it is in a browser where you are logged in: &lt;code&gt;https://your-site.atlassian.net/wiki/rest/api/content/search?cql=&lt;/code&gt; followed by the query. The response is JSON; &lt;code&gt;totalSize&lt;/code&gt; is the count and each result has the page title and link. It returns pages, not macros: a page with five old diagrams is one result, which matters when you estimate how much replacing is left. Change &lt;code&gt;type = page&lt;/code&gt; to &lt;code&gt;type IN (page, blogpost)&lt;/code&gt; if blogs use the macro too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four cases where the result is zero and should not be
&lt;/h2&gt;

&lt;h3&gt;
  
  
  macroName: in the search box
&lt;/h3&gt;

&lt;p&gt;Many answers, including old Atlassian pages, suggest typing &lt;code&gt;macroName:drawio&lt;/code&gt; into search. That is Data Center syntax. In Cloud it is treated as ordinary text: on our site it returned files with "drawio" in their names and not the page that actually had the draw.io macro. Use the CQL &lt;code&gt;macro&lt;/code&gt; field instead.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Forge app's macro under its full key
&lt;/h3&gt;

&lt;p&gt;In the page storage format a Forge macro carries a key like &lt;code&gt;&amp;lt;app-id&amp;gt;/&amp;lt;environment-id&amp;gt;/static/&amp;lt;module-key&amp;gt;&lt;/code&gt;. CQL matches only the module key, the part after &lt;code&gt;static/&lt;/code&gt;. With our own Forge macro on nine pages, &lt;code&gt;macro = "clickable-svg"&lt;/code&gt; found all nine; the full key and the app ID returned zero, with no error. The module key is also what the Macro usage report shows, so copy it from there. Vendors choose module keys themselves, so two apps can share one; open a couple of results to be sure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Info, note, tip and warning panels
&lt;/h3&gt;

&lt;p&gt;These used to be four separate macros, and the old names still appear in the storage format. In Cloud they are stored as one native panel element. On a fresh test page with an info panel, &lt;code&gt;macro = "info"&lt;/code&gt; returned nothing and &lt;code&gt;macro = "panel"&lt;/code&gt; found it, together with every other coloured panel on the site. The Macro usage report goes the same way: on our site it listed info, note, tip and warning under Unused macros while info and warning panels were in use. These macros ship with Confluence, so you will not uninstall them, but it shows that an "unused" verdict is only as good as the names behind it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Status lozenges and code blocks
&lt;/h3&gt;

&lt;p&gt;Same story, without a workaround in CQL. On the same test page &lt;code&gt;macro = "status"&lt;/code&gt; and &lt;code&gt;macro = "code"&lt;/code&gt; both returned zero while the page had both elements; &lt;code&gt;toc&lt;/code&gt; and &lt;code&gt;expand&lt;/code&gt; on that page were found within seconds. We did not find a CQL condition that lists pages with a status or a code block.&lt;/p&gt;

&lt;h2&gt;
  
  
  A ten-minute check before you uninstall
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open Macro usage and write down the app's macro names and counts.&lt;/li&gt;
&lt;li&gt;For each macro, run the CQL query and compare &lt;code&gt;totalSize&lt;/code&gt; with the count. A large gap means restricted pages you cannot see, archived spaces, or a wrong name.&lt;/li&gt;
&lt;li&gt;Ask someone with access to restricted content to run the same query, or check with your space admins, before you rely on a zero.&lt;/li&gt;
&lt;li&gt;Only then disable the app, and leave it disabled for a week or two before you uninstall it, so anyone who finds a broken page can tell you while it is still easy to switch back.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For the wider audit of apps that run on Connect, see &lt;a href="https://horizonventures.app/docs/connect-end-of-life.html" rel="noopener noreferrer"&gt;what a Confluence admin actually has before Connect end of life&lt;/a&gt;, and the &lt;a href="https://horizonventures.app/docs/confluence-cql-cheat-sheet.html" rel="noopener noreferrer"&gt;CQL cheat sheet&lt;/a&gt; for the rest of the query syntax.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; I build Forge replacements for three Connect-era apps: &lt;a href="https://horizonventures.app/docs/svg-out-alternative.html" rel="noopener noreferrer"&gt;SVG out&lt;/a&gt;, &lt;a href="https://horizonventures.app/docs/table-exporter-alternative.html" rel="noopener noreferrer"&gt;Table Exporter&lt;/a&gt; and &lt;a href="https://horizonventures.app/docs/cql-search-alternative.html" rel="noopener noreferrer"&gt;CQL Search&lt;/a&gt;. The pages behind those links explain what each old app did and what to use instead, ours included. Finding the pages, as described above, needs nothing but Confluence itself.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  How do I find all pages that use a macro?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;type = page AND macro = "macro-name"&lt;/code&gt; in CQL, with the name taken from the Macro usage report.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does macroName: work in Confluence Cloud?
&lt;/h3&gt;

&lt;p&gt;No. It is Data Center syntax; in Cloud it searches for the words as text.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why does CQL return nothing for a Forge app?
&lt;/h3&gt;

&lt;p&gt;You probably used the full extension key or the app name. Use the module key, the part after &lt;code&gt;static/&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I find pages with info panels or status lozenges?
&lt;/h3&gt;

&lt;p&gt;Panels yes, all colours together, with &lt;code&gt;macro = "panel"&lt;/code&gt;. Status and code blocks, not with CQL as far as we could find.&lt;/p&gt;

&lt;p&gt;Related: &lt;a href="https://horizonventures.app/docs/connect-end-of-life.html" rel="noopener noreferrer"&gt;Connect app end of life&lt;/a&gt;, &lt;a href="https://horizonventures.app/docs/confluence-cql-cheat-sheet.html" rel="noopener noreferrer"&gt;Confluence CQL cheat sheet&lt;/a&gt;, and &lt;a href="https://horizonventures.app/docs/what-to-check-before-installing-app.html" rel="noopener noreferrer"&gt;what to check before installing a Confluence app&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>confluence</category>
      <category>atlassian</category>
      <category>cql</category>
      <category>sysadmin</category>
    </item>
    <item>
      <title>Graphviz in Confluence Cloud: free and paid options</title>
      <dc:creator>Mikhail Klimenko</dc:creator>
      <pubDate>Fri, 23 Oct 2026 19:38:39 +0000</pubDate>
      <link>https://dev.to/mikhailklimenko/graphviz-in-confluence-cloud-free-and-paid-options-4ao2</link>
      <guid>https://dev.to/mikhailklimenko/graphviz-in-confluence-cloud-free-and-paid-options-4ao2</guid>
      <description>&lt;p&gt;&lt;strong&gt;Short answer.&lt;/strong&gt; Confluence Cloud has no built-in Graphviz macro, so you need an app. If you want to write DOT directly on the page, install &lt;strong&gt;Graphviz Diagrams for Confluence&lt;/strong&gt; by Appfire: it is the long-standing Graphviz app, runs on Atlassian's current Forge platform, was updated in September 2026, and is free for sites with up to 10 users. If your diagrams are generated somewhere else (a script, a build pipeline, a docs-as-code repository) and you only need to show the resulting SVG with working links, read the section on attached SVG files below.&lt;/p&gt;

&lt;h2&gt;
  
  
  The apps that render DOT in Confluence Cloud
&lt;/h2&gt;

&lt;p&gt;Figures are from the Atlassian Marketplace on 23 October 2026. "Free up to 10" means the app costs nothing on a site with 10 users or fewer and is priced per user above that.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;App&lt;/th&gt;
&lt;th&gt;What it is&lt;/th&gt;
&lt;th&gt;Installs&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Graphviz Diagrams for Confluence (Appfire)&lt;/td&gt;
&lt;td&gt;Dedicated Graphviz app: digraph, graph, flowchart, graph-from-table and space graph macros&lt;/td&gt;
&lt;td&gt;610&lt;/td&gt;
&lt;td&gt;Free up to 10, then $1.20 per user per month on sites up to 100 users&lt;/td&gt;
&lt;td&gt;Forge, updated September 2026. The default choice.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Just Add+ (Modus Create)&lt;/td&gt;
&lt;td&gt;Renders many formats from text or Git: Markdown, PlantUML, Mermaid, Graphviz and more&lt;/td&gt;
&lt;td&gt;8,085 (all formats)&lt;/td&gt;
&lt;td&gt;Free up to 10&lt;/td&gt;
&lt;td&gt;Forge, updated October 2026. Good if you also need Markdown or code from Git.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kroki Diagrams for Confluence&lt;/td&gt;
&lt;td&gt;Renders many text diagram languages through Kroki, Graphviz among them&lt;/td&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;td&gt;Free up to 10&lt;/td&gt;
&lt;td&gt;Forge, updated March 2026.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PlantUML, Mermaid UML, Graphviz for Confluence (Fulstech)&lt;/td&gt;
&lt;td&gt;Three languages in one app&lt;/td&gt;
&lt;td&gt;88&lt;/td&gt;
&lt;td&gt;Free up to 10&lt;/td&gt;
&lt;td&gt;Runs on Connect, the older platform Atlassian is retiring.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Graphviz Cloud (Addteq)&lt;/td&gt;
&lt;td&gt;Dedicated Graphviz app&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;$3 a month up to 10, then per user&lt;/td&gt;
&lt;td&gt;Connect, last updated March 2022. We would not start with it today.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For most teams the choice is between the first two. Appfire's app is the Graphviz specialist, with macros that build a graph from a Confluence table or from the page tree of a space. Just Add+ makes sense if Graphviz is one of several text formats you want on your pages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Clickable nodes
&lt;/h2&gt;

&lt;p&gt;Graphviz can attach a link to any node, edge or cluster with the &lt;code&gt;URL&lt;/code&gt; attribute, and a hover text with &lt;code&gt;tooltip&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dot"&gt;&lt;code&gt;&lt;span class="k"&gt;digraph&lt;/span&gt; &lt;span class="nv"&gt;services&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;rankdir&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;LR&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;node&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;box&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"rounded,filled"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fillcolor&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"#eef3fb"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nv"&gt;web&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Web app"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="n"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/web"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tooltip&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Web app runbook"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nv"&gt;api&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"API"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="n"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/api"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tooltip&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"API docs"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nv"&gt;db&lt;/span&gt;  &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Database"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/db"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="n"&gt;tooltip&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Schema"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nv"&gt;web&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;api&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;db&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;Inside Appfire's macros this works in Cloud: their Cloud documentation, &lt;a href="https://support.appfire.com/space/GVIZ/70224107" rel="noopener noreferrer"&gt;How to add links to graphviz images&lt;/a&gt;, shows &lt;code&gt;URL&lt;/code&gt; and &lt;code&gt;tooltip&lt;/code&gt; on nodes and edges, and even Confluence-style links such as &lt;code&gt;[Page title|SPACE]&lt;/code&gt; as targets. For the other apps in the table we did not test whether node links stay clickable, so try it on one diagram before you rely on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  When the SVG is made outside Confluence
&lt;/h2&gt;

&lt;p&gt;Many teams do not write DOT in Confluence at all. The diagram is generated: a script draws the service map from a config file, a build job runs &lt;code&gt;dot -Tsvg services.dot -o services.svg&lt;/code&gt;, a tool exports its dependency graph. The SVG then gets attached to a Confluence page, and the links Graphviz put on every node are the whole point of it.&lt;/p&gt;

&lt;p&gt;We tested exactly that. We rendered the DOT above with real Graphviz, confirmed that the SVG contains three links with their tooltips, attached it to a page on a Confluence Cloud test site and inserted it the normal way, as an image. Confluence displayed it as a flat picture (an &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; element): the diagram looks right, but none of the nodes can be clicked and the tooltips are gone. This is the same behaviour we describe in &lt;a href="https://horizonventures.app/docs/confluence-svg-flat-image.html" rel="noopener noreferrer"&gt;why Confluence Cloud turns your SVG into a flat image&lt;/a&gt;, and it is how browsers treat any SVG shown as an image, not a Graphviz problem.&lt;/p&gt;

&lt;p&gt;Your options here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep the DOT source and paste it into one of the apps above, so the app renders it on the page with links. Fine if the diagram changes rarely.&lt;/li&gt;
&lt;li&gt;Link to the SVG file itself under the image, so people who need the links open it in a new tab. Free, but most readers will not.&lt;/li&gt;
&lt;li&gt;Show the attached SVG with an app that keeps its links.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; I build &lt;a href="https://horizonventures.app/clickable-svg.html" rel="noopener noreferrer"&gt;Clickable SVG for Confluence&lt;/a&gt;, which does the third. In the same test, the same attached file shown through our macro kept all three node links and their tooltips, and the reader can zoom and search inside the diagram. It does not render DOT: it shows an SVG you already have. It is free for teams of up to 10 people, then $2 per user per month. If you write your diagrams on the page, Appfire's Graphviz app is the better fit, and if your case is simpler than clickable nodes, take the free option.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Does Confluence Cloud support Graphviz natively?
&lt;/h3&gt;

&lt;p&gt;No. There is no built-in macro for DOT source in Confluence Cloud. You need an app.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is there a free Graphviz app for Confluence Cloud?
&lt;/h3&gt;

&lt;p&gt;Yes, for small sites. Appfire's Graphviz app, Just Add+ and Kroki Diagrams are free for sites with up to 10 users.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why are the links in my Graphviz SVG not clickable in Confluence?
&lt;/h3&gt;

&lt;p&gt;Because Confluence shows an attached SVG as an ordinary image, and an image cannot contain working links. Render the DOT with a Graphviz app, or show the SVG with an app that keeps links.&lt;/p&gt;

&lt;p&gt;Related: &lt;a href="https://horizonventures.app/docs/plantuml-confluence-alternative.html" rel="noopener noreferrer"&gt;PlantUML in Confluence Cloud&lt;/a&gt;, &lt;a href="https://horizonventures.app/docs/mermaid-confluence-alternative.html" rel="noopener noreferrer"&gt;Mermaid in Confluence Cloud&lt;/a&gt;, &lt;a href="https://horizonventures.app/docs/diagrams-in-confluence-compared.html" rel="noopener noreferrer"&gt;diagram apps for Confluence compared&lt;/a&gt;, and &lt;a href="https://horizonventures.app/docs/clickable-diagram-confluence.html" rel="noopener noreferrer"&gt;how to make a diagram clickable&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>confluence</category>
      <category>atlassian</category>
      <category>graphviz</category>
      <category>documentation</category>
    </item>
    <item>
      <title>How to find unpublished drafts in Confluence Cloud</title>
      <dc:creator>Mikhail Klimenko</dc:creator>
      <pubDate>Fri, 23 Oct 2026 19:22:14 +0000</pubDate>
      <link>https://dev.to/mikhailklimenko/how-to-find-unpublished-drafts-in-confluence-cloud-2c1g</link>
      <guid>https://dev.to/mikhailklimenko/how-to-find-unpublished-drafts-in-confluence-cloud-2c1g</guid>
      <description>&lt;p&gt;&lt;strong&gt;Short answer.&lt;/strong&gt; Open &lt;strong&gt;Recent&lt;/strong&gt; in the left sidebar of the Confluence home. Unpublished pages are listed there with a &lt;strong&gt;Draft&lt;/strong&gt; label. The same draft also sits in the space's content tree under the page you created it from, again with a Draft label, and on the Confluence home page in the block for picking up where you left off. Search and CQL will not return it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the draft shows up
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Recent
&lt;/h3&gt;

&lt;p&gt;The Recent menu lists what you touched lately, newest first; a page that was never published carries a &lt;strong&gt;Draft&lt;/strong&gt; label next to its title. At the bottom of the menu there is a link to all recent items, a full page with tabs that narrow the list to pages you worked on or own. There is no separate "drafts only" filter, so on a busy week the label is what you scan for.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The space content tree
&lt;/h3&gt;

&lt;p&gt;In our test the draft appeared in the sidebar tree of its space, in the place where it will be published, with the same Draft label. If you remember roughly where you created the page, this is the quickest way back to it.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The home page
&lt;/h3&gt;

&lt;p&gt;Confluence home has a block at the top for continuing recent work. A fresh draft showed up there first, above published pages.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The draft opens from these places through an address of the form &lt;code&gt;/wiki/pages/resumedraft.action?draftId=…&lt;/code&gt;. Bookmark it if you will come back to a long draft over several days.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why search does not find it
&lt;/h2&gt;

&lt;p&gt;Confluence search, and CQL behind it, return published content. We created a draft with a unique word in its title, waited for the search index to catch up (about a minute, which is enough for published pages), and searched for that word: no result. CQL also has no condition for draft status; a query with &lt;code&gt;status = draft&lt;/code&gt; is rejected as invalid. So "it must be somewhere, let me search harder" does not help. Use the places above instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we could not find a way to do
&lt;/h2&gt;

&lt;p&gt;Listing &lt;em&gt;other people's&lt;/em&gt; unpublished drafts. We found no screen and no search query in Confluence Cloud for it, and Atlassian's Cloud documentation does not describe one; the pages about drafts in Atlassian's documentation that describe a Drafts list in the profile are written for Confluence Data Center. If a colleague has a page you need that was never published, the practical route is to ask them to publish it or share the draft with you.&lt;/p&gt;

&lt;p&gt;If you know a way that works in Cloud, write to &lt;a href="mailto:support@horizonventures.app"&gt;support@horizonventures.app&lt;/a&gt; and we will update this page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keeping drafts from piling up
&lt;/h2&gt;

&lt;p&gt;Drafts do not show up in search, so they are easy to forget: the procedure someone started rewriting in March is still a draft in October, and the published version is still the old one. Two habits help. Publish early with a "work in progress" status on the page rather than keeping a private draft for weeks. And once a month, open Recent and either publish or delete every Draft you see.&lt;/p&gt;

&lt;p&gt;The published side of the same problem, pages nobody has updated in a year, is easier to catch, because those pages are searchable. That is covered in &lt;a href="https://horizonventures.app/docs/find-stale-pages-confluence.html" rel="noopener noreferrer"&gt;how to find the Confluence pages nobody maintains&lt;/a&gt; and in the &lt;a href="https://horizonventures.app/docs/confluence-cql-cheat-sheet.html" rel="noopener noreferrer"&gt;CQL cheat sheet&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; I build &lt;a href="https://horizonventures.app/smart-search.html" rel="noopener noreferrer"&gt;Smart Search for Confluence&lt;/a&gt;, which shows live lists of published pages, including "not updated for N days". It uses the same search as Confluence, so it cannot list drafts either; for drafts, Recent is the answer.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Where is my unpublished draft?
&lt;/h3&gt;

&lt;p&gt;In Recent with a Draft label, in the space content tree under its parent page, and on the home page.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why can't I find my draft with search?
&lt;/h3&gt;

&lt;p&gt;Search only covers published content. A draft will not show up however long you wait.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can an admin see other people's drafts?
&lt;/h3&gt;

&lt;p&gt;We found no way to do it in Confluence Cloud. Ask the author to publish or share the draft.&lt;/p&gt;

&lt;p&gt;Related: &lt;a href="https://horizonventures.app/docs/confluence-cql-cheat-sheet.html" rel="noopener noreferrer"&gt;Confluence CQL cheat sheet&lt;/a&gt;, &lt;a href="https://horizonventures.app/docs/find-orphaned-pages-confluence.html" rel="noopener noreferrer"&gt;finding orphaned pages&lt;/a&gt;, and &lt;a href="https://horizonventures.app/docs/find-stale-pages-confluence.html" rel="noopener noreferrer"&gt;finding pages nobody maintains&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>confluence</category>
      <category>atlassian</category>
      <category>productivity</category>
      <category>documentation</category>
    </item>
    <item>
      <title>How to see your starred pages in Confluence Cloud</title>
      <dc:creator>Mikhail Klimenko</dc:creator>
      <pubDate>Fri, 23 Oct 2026 19:22:07 +0000</pubDate>
      <link>https://dev.to/mikhailklimenko/how-to-see-your-starred-pages-in-confluence-cloud-aeh</link>
      <guid>https://dev.to/mikhailklimenko/how-to-see-your-starred-pages-in-confluence-cloud-aeh</guid>
      <description>&lt;p&gt;&lt;strong&gt;Short answer.&lt;/strong&gt; On the Confluence home, open &lt;strong&gt;Starred&lt;/strong&gt; in the left sidebar. It lists the pages you starred. At the bottom, &lt;strong&gt;View all starred items&lt;/strong&gt; opens the full list with a filter box, at &lt;code&gt;https://your-site.atlassian.net/wiki/home/starred&lt;/code&gt;. To star a page, open its &lt;strong&gt;More actions&lt;/strong&gt; menu (three dots) and choose &lt;strong&gt;Star&lt;/strong&gt;, or press &lt;strong&gt;Ctrl+Alt+F&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the list is
&lt;/h2&gt;

&lt;p&gt;The Starred menu in the sidebar is the quick view: click it and your starred pages drop down right there, without leaving the page you are on.&lt;/p&gt;

&lt;p&gt;Spaces have their own stars. Starred spaces appear in a separate section of the same sidebar, not in the Starred pages menu.&lt;/p&gt;

&lt;p&gt;For a list you can bookmark in the browser or share with yourself on another device, use the full page at &lt;code&gt;/wiki/home/starred&lt;/code&gt;. Typing in its search box narrows the list as you type.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to star a page
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;On the page: &lt;strong&gt;More actions&lt;/strong&gt; (three dots at the top right) → &lt;strong&gt;Star&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Keyboard: &lt;strong&gt;Ctrl+Alt+F&lt;/strong&gt; on the page.&lt;/li&gt;
&lt;li&gt;From the full &lt;strong&gt;Recent&lt;/strong&gt; list: each row has its own Star button, handy when you want to star several pages you visited today.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Starred pages as a query
&lt;/h2&gt;

&lt;p&gt;The same list is available through CQL, the query language behind Confluence search:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;favourite&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;currentUser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The American spelling &lt;code&gt;favorite&lt;/code&gt; works too. On our test site the query returned exactly the page we had starred a minute earlier. You can combine it with other conditions, for example your starred pages in one space that nobody has edited for half a year:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;favourite = currentUser() AND space = DEV AND lastmodified &amp;lt; now("-26w")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;More ready-made queries in our &lt;a href="https://horizonventures.app/docs/confluence-cql-cheat-sheet.html" rel="noopener noreferrer"&gt;CQL cheat sheet&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you cannot do
&lt;/h2&gt;

&lt;p&gt;See someone else's stars. Stars are personal, and Atlassian's CQL documentation states that the favourite condition only returns the favourites of the person running the query. If a team needs a shared list of important pages, a label works better than stars: everyone can see it, and a page list built on a label updates itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; I build &lt;a href="https://horizonventures.app/smart-search.html" rel="noopener noreferrer"&gt;Smart Search for Confluence&lt;/a&gt;, which shows a live list of pages by label, space or "not updated for N days" right on a page, so a team list does not depend on anyone's personal stars. For your own bookmarks, the built-in Starred list above is all you need.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Where are my starred pages?
&lt;/h3&gt;

&lt;p&gt;Starred in the left sidebar of the Confluence home, or the full list at &lt;code&gt;/wiki/home/starred&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is there a keyboard shortcut to star a page?
&lt;/h3&gt;

&lt;p&gt;Yes, Ctrl+Alt+F on the page. It is also in the More actions menu.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I see what a colleague starred?
&lt;/h3&gt;

&lt;p&gt;No. Stars are visible only to the person who set them.&lt;/p&gt;

&lt;p&gt;Related: &lt;a href="https://horizonventures.app/docs/find-unpublished-drafts-confluence.html" rel="noopener noreferrer"&gt;how to find unpublished drafts&lt;/a&gt;, &lt;a href="https://horizonventures.app/docs/confluence-cql-cheat-sheet.html" rel="noopener noreferrer"&gt;Confluence CQL cheat sheet&lt;/a&gt;, and &lt;a href="https://horizonventures.app/docs/find-stale-pages-confluence.html" rel="noopener noreferrer"&gt;finding pages nobody maintains&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>confluence</category>
      <category>atlassian</category>
      <category>productivity</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Confluence CQL cheat sheet: queries you can copy</title>
      <dc:creator>Mikhail Klimenko</dc:creator>
      <pubDate>Fri, 23 Oct 2026 13:57:31 +0000</pubDate>
      <link>https://dev.to/mikhailklimenko/confluence-cql-cheat-sheet-queries-you-can-copy-1a3o</link>
      <guid>https://dev.to/mikhailklimenko/confluence-cql-cheat-sheet-queries-you-can-copy-1a3o</guid>
      <description>&lt;p&gt;&lt;strong&gt;Short answer.&lt;/strong&gt; A CQL query is &lt;code&gt;field operator value&lt;/code&gt;, joined with &lt;code&gt;AND&lt;/code&gt;, &lt;code&gt;OR&lt;/code&gt; and &lt;code&gt;NOT&lt;/code&gt;, optionally followed by &lt;code&gt;ORDER BY&lt;/code&gt;. Pages nobody touched in six months: &lt;code&gt;type = page AND lastmodified &amp;lt; now("-26w")&lt;/code&gt;. Pages with two labels at once: &lt;code&gt;label = "policy" AND label = "hr"&lt;/code&gt;, not &lt;code&gt;label IN (...)&lt;/code&gt;, which means "any of". Your starred pages: &lt;code&gt;favourite = currentUser()&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to run it
&lt;/h2&gt;

&lt;p&gt;Atlassian documents CQL as part of the Confluence REST API (&lt;a href="https://developer.atlassian.com/cloud/confluence/advanced-searching-using-cql/" rel="noopener noreferrer"&gt;Advanced searching using CQL&lt;/a&gt;). The quickest way to try a query, with your own permissions, is to open this address in a browser where you are logged in to Confluence, with your query at the end:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://your-site.atlassian.net/wiki/rest/api/content/search?cql=type = page AND space = DEV
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The browser fills in the encoding. You get JSON: titles, IDs and links in &lt;code&gt;results&lt;/code&gt;, the total in &lt;code&gt;totalSize&lt;/code&gt;. Scripts and apps use the same endpoint, which is why a query that works here works there too.&lt;/p&gt;

&lt;h2&gt;
  
  
  The building blocks
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;What it matches&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;page, blogpost, comment, attachment, whiteboard, database, folder&lt;/td&gt;
&lt;td&gt;&lt;code&gt;type IN (page, blogpost)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;space&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Space key&lt;/td&gt;
&lt;td&gt;&lt;code&gt;space = DEV&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Title, exact or contains&lt;/td&gt;
&lt;td&gt;&lt;code&gt;title ~ "policy"&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;text&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Words anywhere in the content&lt;/td&gt;
&lt;td&gt;&lt;code&gt;text ~ "vacation policy"&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;label&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Labels&lt;/td&gt;
&lt;td&gt;&lt;code&gt;label = "onboarding"&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;created&lt;/code&gt;, &lt;code&gt;lastmodified&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Dates, with functions&lt;/td&gt;
&lt;td&gt;&lt;code&gt;lastmodified &amp;lt; now("-180d")&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;creator&lt;/code&gt;, &lt;code&gt;contributor&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Who created or edited&lt;/td&gt;
&lt;td&gt;&lt;code&gt;contributor = currentUser()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;favourite&lt;/code&gt;, &lt;code&gt;watcher&lt;/code&gt;, &lt;code&gt;mention&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Starred by, watched by, mentioning a user&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mention = currentUser()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;parent&lt;/code&gt;, &lt;code&gt;ancestor&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Direct children, whole tree below a page&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ancestor = 123456&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;macro&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pages using a macro&lt;/td&gt;
&lt;td&gt;&lt;code&gt;macro = "drawio"&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pageStatus&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The status lozenge on a page&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pageStatus = "Verified"&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Operators: &lt;code&gt;=&lt;/code&gt;, &lt;code&gt;!=&lt;/code&gt;, &lt;code&gt;&amp;lt;&lt;/code&gt;, &lt;code&gt;&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;=&lt;/code&gt;, &lt;code&gt;&amp;gt;=&lt;/code&gt; (dates), &lt;code&gt;IN&lt;/code&gt;, &lt;code&gt;NOT IN&lt;/code&gt;, and &lt;code&gt;~&lt;/code&gt;, &lt;code&gt;!~&lt;/code&gt; (contains, for title and text). Date functions: &lt;code&gt;now("-4w")&lt;/code&gt;, &lt;code&gt;startOfDay()&lt;/code&gt;, &lt;code&gt;startOfWeek("-1w")&lt;/code&gt;, &lt;code&gt;startOfMonth()&lt;/code&gt;, &lt;code&gt;startOfYear()&lt;/code&gt; and their &lt;code&gt;endOf&lt;/code&gt; pairs. User functions: &lt;code&gt;currentUser()&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Queries for real tasks
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Stale content
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type = page AND lastmodified &amp;lt; now("-26w") ORDER BY lastmodified ASC
type = page AND space = DEV AND lastmodified &amp;lt; now("-180d")
type = page AND lastmodified &amp;lt; startOfYear()
type = page AND lastmodified &amp;lt; now("-180d") AND NOT label = "archived"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Oldest first is the useful order: the top of the list is where the forgotten pages are. More on what to do with them in &lt;a href="https://horizonventures.app/docs/find-stale-pages-confluence.html" rel="noopener noreferrer"&gt;how to find the Confluence pages nobody maintains&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Labels
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;label = "policy" AND label = "hr"          (both labels)
label IN ("policy", "hr")                  (either label)
type = page AND label NOT IN ("archived")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  You and your colleagues
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;favourite = currentUser()                  (your starred pages)
creator = currentUser() AND type = page    (pages you created)
contributor = currentUser() ORDER BY lastmodified DESC
mention = currentUser()                    (pages that @mention you)
watcher = currentUser()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For another person, use their account ID instead of &lt;code&gt;currentUser()&lt;/code&gt;: names do not work in Confluence Cloud, which only matches users by account ID.&lt;/p&gt;

&lt;h3&gt;
  
  
  A section of the tree
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;parent = 123456      (direct children only)
ancestor = 123456    (everything below, at any depth)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The number is the page ID, the digits in the page address after &lt;code&gt;/pages/&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  By content
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;title ~ "policy" AND type = page
text ~ "vacation policy"
macro = "drawio"                 (pages with a draw.io diagram)
type = attachment AND title ~ "docx"
pageStatus = "Rough draft"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Recent activity
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;created &amp;gt;= startOfWeek("-1w") AND type = blogpost
type IN (page, blogpost) AND space IN (DEV, OPS) ORDER BY created DESC
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Traps that return the wrong pages
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;m&lt;/code&gt; is minutes, &lt;code&gt;M&lt;/code&gt; is months.&lt;/strong&gt; On our test site &lt;code&gt;lastmodified &amp;gt; now("-6m")&lt;/code&gt; returned nothing and &lt;code&gt;now("-6M")&lt;/code&gt; returned every page. Use &lt;code&gt;d&lt;/code&gt; or &lt;code&gt;w&lt;/code&gt; if you want to avoid the question.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A name returns nothing, without an error.&lt;/strong&gt; &lt;code&gt;creator = "Mikhail"&lt;/code&gt; came back empty while &lt;code&gt;creator = currentUser()&lt;/code&gt; found every page of the same person. In Confluence Cloud user fields take account IDs; a name is not rejected, it just matches no one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;label IN&lt;/code&gt; means any, not all.&lt;/strong&gt; We checked on two test pages, one with labels A and B, one with only A: &lt;code&gt;label IN ("A", "B")&lt;/code&gt; returned both pages, &lt;code&gt;label = "A" AND label = "B"&lt;/code&gt; returned one. Label case does not matter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A query cannot start with a negative clause.&lt;/strong&gt; Atlassian's documentation says so: put &lt;code&gt;NOT label = "archived"&lt;/code&gt; after a positive condition such as &lt;code&gt;type = page AND&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Without parentheses, conditions are read left to right.&lt;/strong&gt; Mixing AND and OR without brackets gives surprising results; bracket every OR group.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not every field can be sorted.&lt;/strong&gt; Ordering by a field a page can have several values of, labels for example, is not supported.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Brand new pages show up a little later.&lt;/strong&gt; In our test a page created a minute earlier did not appear yet; after about a minute it did. Search runs on an index.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Results are capped when you ask for page bodies.&lt;/strong&gt; Atlassian notes that with &lt;code&gt;expand=body.storage.value&lt;/code&gt; the endpoint returns at most 50 results, whatever limit you ask for.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The arithmetic
&lt;/h2&gt;

&lt;p&gt;Writing a query takes a minute once you know the fields. The cost is elsewhere: CQL results live in a JSON response or a script, not on a page your colleagues read. A monthly "pages not updated in six months" list for five teams means someone runs five queries, turns JSON into something readable and posts it, every month. That is roughly an hour a month for one person, and it stops the month that person is busy.&lt;/p&gt;

&lt;p&gt;If you only need an answer for yourself once, the browser address above is free and enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  When the list should live on a page
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; I build &lt;a href="https://horizonventures.app/smart-search.html" rel="noopener noreferrer"&gt;Smart Search for Confluence&lt;/a&gt;. It builds the CQL for you from simple settings (space, labels, words, "not updated for N days") and shows the result as a live list on a Confluence page, so readers see it without running anything. Several labels mean all of them, as most people expect. It runs inside Atlassian's infrastructure and is free for teams up to ten people.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  How do I find pages not updated in 6 months?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;type = page AND lastmodified &amp;lt; now("-26w") ORDER BY lastmodified ASC&lt;/code&gt;. Offsets like &lt;code&gt;-180d&lt;/code&gt; or &lt;code&gt;-6M&lt;/code&gt; work too; lowercase &lt;code&gt;-6m&lt;/code&gt; is six minutes.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I find pages with two labels at once?
&lt;/h3&gt;

&lt;p&gt;One condition per label, joined with AND. &lt;code&gt;label IN&lt;/code&gt; returns pages with any of them.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I list my starred pages?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;favourite = currentUser()&lt;/code&gt;. It only ever shows your own starred pages, never someone else's.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the difference between ancestor and parent?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;parent&lt;/code&gt; gives direct children, &lt;code&gt;ancestor&lt;/code&gt; the whole tree below a page.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I search by a person's name?
&lt;/h3&gt;

&lt;p&gt;Not in Confluence Cloud: user fields take account IDs. &lt;code&gt;currentUser()&lt;/code&gt; covers the common case of searching for yourself.&lt;/p&gt;

&lt;p&gt;Related: &lt;a href="https://horizonventures.app/docs/list-confluence-pages-without-cql.html" rel="noopener noreferrer"&gt;how to list Confluence pages on a page without writing CQL&lt;/a&gt;, &lt;a href="https://horizonventures.app/docs/find-stale-pages-confluence.html" rel="noopener noreferrer"&gt;finding pages nobody maintains&lt;/a&gt;, and &lt;a href="https://horizonventures.app/docs/cql-search-alternative.html" rel="noopener noreferrer"&gt;what to use now that CQL Search is ending&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>confluence</category>
      <category>atlassian</category>
      <category>cql</category>
      <category>productivity</category>
    </item>
    <item>
      <title>"Text is not SVG - cannot display": why draw.io labels break in SVG</title>
      <dc:creator>Mikhail Klimenko</dc:creator>
      <pubDate>Fri, 23 Oct 2026 01:36:29 +0000</pubDate>
      <link>https://dev.to/mikhailklimenko/text-is-not-svg-cannot-display-why-drawio-labels-break-in-svg-58an</link>
      <guid>https://dev.to/mikhailklimenko/text-is-not-svg-cannot-display-why-drawio-labels-break-in-svg-58an</guid>
      <description>&lt;p&gt;&lt;strong&gt;Short answer.&lt;/strong&gt; draw.io writes most labels as HTML inside &lt;code&gt;foreignObject&lt;/code&gt; elements of the SVG, with a short plain-text copy next to each one as a fallback. Wherever that HTML is not rendered, you see the fallback: one line, cut off, no formatting, no links, plus the warning "Text is not SVG - cannot display". Fix it in the export with &lt;strong&gt;Convert Labels to SVG&lt;/strong&gt;, or by turning off formatted text. Labels with links cannot be converted, so for those you need a viewer that renders the HTML.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is inside the file
&lt;/h2&gt;

&lt;p&gt;Open an exported &lt;code&gt;.svg&lt;/code&gt; in a text editor and look at one shape. You will find a &lt;code&gt;&amp;lt;switch&amp;gt;&lt;/code&gt; with two children: a &lt;code&gt;&amp;lt;foreignObject&amp;gt;&lt;/code&gt; holding a few nested &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; elements with your label, its line breaks, bold text and links, and after it a plain &lt;code&gt;&amp;lt;text&amp;gt;&lt;/code&gt; element with a shortened copy. A viewer that renders foreignObject shows the first; anything else falls through to the second.&lt;/p&gt;

&lt;p&gt;draw.io documents this in &lt;a href="https://www.drawio.com/doc/faq/svg-export-text-problems" rel="noopener noreferrer"&gt;Why text in exported SVG images may not display correctly&lt;/a&gt;: it uses foreignObject "to allow complex HTML labels on shapes", and viewers that cannot render them show a shortened label and the "Text is not SVG - cannot display" message.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who renders it and who does not
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Where the SVG ends up&lt;/th&gt;
&lt;th&gt;What you see&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Modern browser opening the file&lt;/td&gt;
&lt;td&gt;Full labels, working links&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inkscape, some editors and converters&lt;/td&gt;
&lt;td&gt;Fallback text, warning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Some tools that sanitize SVG for safety&lt;/td&gt;
&lt;td&gt;Strip foreignObject entirely, because HTML inside an SVG can carry scripts, so you get the fallback&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Confluence Cloud, SVG attached and shown on the page&lt;/td&gt;
&lt;td&gt;Shown as a flat image: labels may look fine, but no link works&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The Confluence case is the most confusing, because the labels look right and only the clicks fail. That one is about how Confluence displays images, which we covered in &lt;a href="https://horizonventures.app/docs/confluence-svg-flat-image.html" rel="noopener noreferrer"&gt;why Confluence turns your SVG into a flat image&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fixes in draw.io, from simplest
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Convert Labels to SVG
&lt;/h3&gt;

&lt;p&gt;Select the shapes, open the &lt;strong&gt;Text&lt;/strong&gt; tab, and under &lt;strong&gt;Advanced&lt;/strong&gt; tick &lt;strong&gt;Convert Labels to SVG&lt;/strong&gt;. The labels become native SVG text that every viewer shows. The catch, from draw.io's own documentation: "Labels containing tables, lists, links, or elements with background colours are not supported", and the checkbox is disabled for them.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Turn off Formatted Text and Word Wrap
&lt;/h3&gt;

&lt;p&gt;Select all, then untick &lt;strong&gt;Formatted Text&lt;/strong&gt; and &lt;strong&gt;Word Wrap&lt;/strong&gt; in the Text tab. Plain labels are written as SVG text. You lose bold and colours inside labels and may need to add line breaks by hand.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Embed Fonts
&lt;/h3&gt;

&lt;p&gt;Useful when the text shows up in the wrong typeface. It does nothing for labels that are not rendered at all: there the problem is the foreignObject, not the font.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Through PDF
&lt;/h3&gt;

&lt;p&gt;draw.io also suggests exporting to PDF and converting that to SVG in a tool like Inkscape, which turns every label into real text or outlines. It works, and it is a lot of steps for a diagram that changes every month.&lt;/p&gt;

&lt;h3&gt;
  
  
  What does not help
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;svg-warning=0&lt;/code&gt; URL parameter hides the warning. The labels stay broken.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The trade-off people hit: a label with a link cannot be converted, and converting the rest gives a diagram where some labels are SVG text and the linked ones still depend on foreignObject. If links are the point of the diagram, conversion is not the answer.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The arithmetic
&lt;/h2&gt;

&lt;p&gt;An architecture diagram with 40 shapes, a dozen of them linking to runbooks. Converting the plain labels takes a minute. Rewriting the twelve linked labels so they carry the link on the shape instead of inside the text takes about half an hour, and the next person who edits the diagram will put links back into labels, because that is the natural way to do it in draw.io. Choosing a viewer that renders the HTML safely is usually cheaper than fighting the format.&lt;/p&gt;

&lt;p&gt;If your diagrams have no links in labels, Convert Labels to SVG is free and solves it. Use that.&lt;/p&gt;

&lt;h2&gt;
  
  
  Showing these diagrams in Confluence with links working
&lt;/h2&gt;

&lt;p&gt;Two routes keep the links. The draw.io app for Confluence renders from the source file, so nothing is lost, at the price of the app. Or an app that renders the exported SVG as live SVG on the page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; I build &lt;a href="https://horizonventures.app/clickable-svg.html" rel="noopener noreferrer"&gt;Clickable SVG for Confluence&lt;/a&gt;, which does the second. Honest detail: until 22 October 2026 our own sanitizer removed foreignObject completely, for the safety reason above, so draw.io labels showed as the cut-off fallback and links inside labels were lost. It now keeps the HTML of the labels through an allowlist (text, formatting and links only; scripts, forms and frames are removed), so labels and their links come through. It runs inside Atlassian's infrastructure and is free for teams up to ten people.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  What does "Text is not SVG - cannot display" mean?
&lt;/h3&gt;

&lt;p&gt;The viewer did not render the HTML part of the labels and fell back to the plain-text copies. The diagram itself is fine.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why is the Convert Labels to SVG checkbox greyed out?
&lt;/h3&gt;

&lt;p&gt;The selected label contains a link, a list, a table or a background colour. draw.io cannot express those as plain SVG text.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why do links work when I open the SVG in a browser but not in Confluence?
&lt;/h3&gt;

&lt;p&gt;The browser renders the file as a live document. Confluence shows an attached SVG as an image, and an image cannot have clickable parts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I stop draw.io from creating foreignObject at all?
&lt;/h3&gt;

&lt;p&gt;In self-hosted or embedded draw.io, the editor configuration option &lt;code&gt;simpleLabels&lt;/code&gt; makes it write plain labels. On the hosted editor, untick Formatted Text instead.&lt;/p&gt;

&lt;p&gt;Related: &lt;a href="https://horizonventures.app/docs/clickable-diagram-confluence.html" rel="noopener noreferrer"&gt;how to make a diagram clickable in Confluence Cloud&lt;/a&gt;, &lt;a href="https://horizonventures.app/docs/confluence-svg-flat-image.html" rel="noopener noreferrer"&gt;why Confluence turns your SVG into a flat image&lt;/a&gt;, and &lt;a href="https://horizonventures.app/docs/diagrams-in-confluence-compared.html" rel="noopener noreferrer"&gt;diagram tools in Confluence compared&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>confluence</category>
      <category>drawio</category>
      <category>svg</category>
      <category>atlassian</category>
    </item>
    <item>
      <title>Why Confluence's Word import drops text and images</title>
      <dc:creator>Mikhail Klimenko</dc:creator>
      <pubDate>Thu, 22 Oct 2026 15:06:48 +0000</pubDate>
      <link>https://dev.to/mikhailklimenko/why-confluences-word-import-drops-text-and-images-4ffj</link>
      <guid>https://dev.to/mikhailklimenko/why-confluences-word-import-drops-text-and-images-4ffj</guid>
      <description>&lt;p&gt;&lt;strong&gt;Short answer.&lt;/strong&gt; There are four separate problems that look alike. Images in formats Confluence does not support, and all Word shapes and SmartArt, become placeholders by design. Documents with many images can fail partially, which Atlassian tracks as a known issue. Inline images can arrive at their original size, also a known issue. And since March 2026 people report imports that bring in only the title, with no official explanation yet. Most of it is fixed in the .docx, before importing, in a few minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the built-in import accepts
&lt;/h2&gt;

&lt;p&gt;Confluence Cloud imports a .docx as a new page, keeping headings, lists, tables and images. Atlassian's &lt;a href="https://support.atlassian.com/confluence-cloud/docs/import-content-into-confluence-cloud/" rel="noopener noreferrer"&gt;import documentation&lt;/a&gt; sets the limits:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Limit&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Document text, without attachments&lt;/td&gt;
&lt;td&gt;5 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Attachments (images) in the document&lt;/td&gt;
&lt;td&gt;100 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bulk import&lt;/td&gt;
&lt;td&gt;Up to 30 files, 50 MB in total, no file over 10 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Image formats&lt;/td&gt;
&lt;td&gt;BMP, CUR, DDS, GIF, ICO, JPG, PNG, PSD, SVG, WEBP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shapes drawn in Word&lt;/td&gt;
&lt;td&gt;Replaced with placeholders&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The last two rows explain most "missing image" reports. Anything outside the format list is replaced with placeholder text, and so is every shape.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem 1: images became placeholders
&lt;/h2&gt;

&lt;p&gt;The usual culprit is not a photo but a pasted object. A chart pasted from Excel usually lands in Word as an embedded chart rather than a picture, and a range pasted as a picture or a diagram copied from Visio is often stored as an EMF or WMF vector image. None of these is on Atlassian's list. The same goes for shapes, arrows and SmartArt drawn directly in Word.&lt;/p&gt;

&lt;p&gt;The fix is in Word, before importing. Right-click the chart, diagram or SmartArt and choose &lt;strong&gt;Save as Picture&lt;/strong&gt;, save it as PNG, then delete the original and insert the PNG in its place. Microsoft documents this for Word for Microsoft 365 in &lt;a href="https://support.microsoft.com/office/graphics-visuals/save-a-picture-or-other-graphic-as-a-separate-file" rel="noopener noreferrer"&gt;Save a picture or other graphic as a separate file&lt;/a&gt;. For a document with ten diagrams that is ten minutes, and you know exactly what will arrive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem 2: many images, different ones missing each time
&lt;/h2&gt;

&lt;p&gt;Atlassian tracks this as &lt;a href="https://jira.atlassian.com/browse/CONFCLOUD-76949" rel="noopener noreferrer"&gt;CONFCLOUD-76949&lt;/a&gt;: a document with many images imports partially with "Some images couldn't be imported", and the reporter saw different images fail on each attempt with the same file. The ticket is unresolved, and Atlassian's suggested workaround is to split the document into smaller ones, import them one by one, and combine the results on a single page.&lt;/p&gt;

&lt;p&gt;If the document is long anyway, splitting it is often what you want: a 60-page manual reads better as a page tree than as one page. We wrote up &lt;a href="https://horizonventures.app/docs/split-word-document-confluence-pages.html" rel="noopener noreferrer"&gt;how to split a Word document into Confluence pages&lt;/a&gt; separately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem 3: inline images at the wrong size
&lt;/h2&gt;

&lt;p&gt;Tracked as &lt;a href="https://jira.atlassian.com/browse/CONFCLOUD-82098" rel="noopener noreferrer"&gt;CONFCLOUD-82098&lt;/a&gt;: images set to "In line with text" in Word sometimes import at their original pixel size instead of the size shown in the document. It sits in Atlassian's long-term backlog, and the only workaround listed is to resize and realign the images by hand after import. Before importing, it helps to crop and resize screenshots in an image editor rather than in Word, so the original size is already the size you want.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem 4: only the title came through
&lt;/h2&gt;

&lt;p&gt;Since March 2026 there is a Community thread, &lt;a href="https://community.atlassian.com/forums/Confluence-questions/Urgent-Confluence-Import-function-broken-Pls-fix/qaq-p/3207198" rel="noopener noreferrer"&gt;"[Urgent] Confluence Import function broken"&lt;/a&gt;, where documents that used to import fine now produce a page with the title and nothing else. A reply from April 2026 reports the same after weeks of working imports. There is no official answer in the thread, and Atlassian has not published a cause. So what follows is not a diagnosis of Atlassian's converter, which we cannot see, but the cheap checks to run on the document.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Content controls.&lt;/strong&gt; Documents made from corporate templates often keep whole sections inside content controls, the boxes with "Click here to enter text". A converter that reads only plain paragraphs skips them, section headings included. In Word, right-click each control and choose &lt;strong&gt;Remove Content Control&lt;/strong&gt;: the box goes, the text stays. If the option is missing, the control is locked; unlock it in the control's Properties on the Developer tab.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Text boxes.&lt;/strong&gt; Text inside a text box is not part of the normal flow. Move it into ordinary paragraphs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A fresh copy.&lt;/strong&gt; Save the cleaned document as a new .docx, choosing the ordinary "Word Document" type, and import the copy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a clean copy still comes in empty, the problem is on Atlassian's side, and a support ticket with the file attached is the way to get it looked at.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We know the content-control case from our own code. While preparing this article we ran a test document through our importer and found it skipped sections inside content controls in exactly this way. We fixed it, but it shows how easily a converter drops a section without any error.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The arithmetic
&lt;/h2&gt;

&lt;p&gt;Take a 40-page policy with 25 images, eight of them charts pasted from Excel. A plain import gives you eight placeholders, possibly a partial failure on the images, and screenshots at full width. Finding which picture belongs where, re-exporting the charts and resizing the rest on the page takes an hour or more. The same work done in Word before importing takes about fifteen minutes, because in Word you can still see what each picture was.&lt;/p&gt;

&lt;p&gt;If your document is short, uses real heading styles and has ordinary JPG or PNG pictures, the built-in import handles it. Use it, it is free.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where a separate importer helps
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; I build &lt;a href="https://horizonventures.app/word-import.html" rel="noopener noreferrer"&gt;Word Import &amp;amp; Page Tree Builder for Confluence&lt;/a&gt;. It reads the .docx in your browser and splits it by headings into a page tree, which the built-in import does not do. It takes sections out of content controls and text boxes, keeps images in their place in the text and in table cells, keeps links, and runs inside Atlassian's infrastructure, so the file is not sent to us. It is free for teams up to ten people.&lt;/p&gt;

&lt;p&gt;It has the same hard limits as anyone: browsers cannot display EMF or WMF, so convert those pictures to PNG first, and SmartArt needs Save as Picture whichever importer you use.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Why does Confluence import only the title of my Word document?
&lt;/h3&gt;

&lt;p&gt;No official cause has been published. Check content controls and text boxes first, remove the controls in Word, save a fresh copy and import that. If it still fails, open a ticket with Atlassian and attach the file.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why do some images become placeholders?
&lt;/h3&gt;

&lt;p&gt;Their format is not supported, or they are shapes. Pictures pasted from Excel and Visio are often EMF or WMF. Save them as PNG and re-insert them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I import into an existing page?
&lt;/h3&gt;

&lt;p&gt;Not with the built-in import, which always creates a new page. We covered &lt;a href="https://horizonventures.app/docs/import-word-existing-confluence-page.html" rel="noopener noreferrer"&gt;the workarounds for importing into an existing page&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Are comments and tracked changes imported?
&lt;/h3&gt;

&lt;p&gt;Do not count on it. Accept or reject tracked changes and delete comments before importing, so the page shows exactly the text you agreed on.&lt;/p&gt;

&lt;p&gt;Related: &lt;a href="https://horizonventures.app/docs/import-word-into-confluence.html" rel="noopener noreferrer"&gt;how to import a Word document into Confluence&lt;/a&gt;, &lt;a href="https://horizonventures.app/docs/split-word-document-confluence-pages.html" rel="noopener noreferrer"&gt;splitting a Word document into pages&lt;/a&gt;, and &lt;a href="https://horizonventures.app/docs/import-google-doc-into-confluence.html" rel="noopener noreferrer"&gt;importing a Google Doc&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>confluence</category>
      <category>atlassian</category>
      <category>word</category>
      <category>documentation</category>
    </item>
    <item>
      <title>Why a Confluence table breaks when pasted into Excel</title>
      <dc:creator>Mikhail Klimenko</dc:creator>
      <pubDate>Mon, 19 Oct 2026 23:07:37 +0000</pubDate>
      <link>https://dev.to/mikhailklimenko/why-a-confluence-table-breaks-when-pasted-into-excel-1ij1</link>
      <guid>https://dev.to/mikhailklimenko/why-a-confluence-table-breaks-when-pasted-into-excel-1ij1</guid>
      <description>&lt;p&gt;&lt;strong&gt;Short answer.&lt;/strong&gt; The "random" merged cells come from cells that hold more than one line. Excel turns every line into its own row and then merges the neighbouring cells to keep the table aligned. The other damage comes from Excel guessing types: &lt;code&gt;007&lt;/code&gt; becomes 7, a 19-digit ID loses everything after the 15th digit, and &lt;code&gt;1-2&lt;/code&gt; becomes a date. Unmerge and flatten the multi-line cells before copying, or export the table to a file that tells Excel what each cell is.&lt;/p&gt;

&lt;p&gt;The question has been sitting on the Atlassian Community for years under titles like &lt;a href="https://community.atlassian.com/forums/Confluence-questions/unable-to-get-very-large-confluence-tables-out-into-excel-cells/qaq-p/2395308" rel="noopener noreferrer"&gt;"unable to get very large Confluence tables out into Excel, cells will randomly merge"&lt;/a&gt;. Here is what is going on.&lt;/p&gt;

&lt;h2&gt;
  
  
  The test
&lt;/h2&gt;

&lt;p&gt;We put a small table on the clipboard exactly the way a browser hands it over when you copy from a Confluence page: as HTML, with one cell spanning two rows, one spanning two columns, and one cell holding two paragraphs. Then we pasted it into a blank sheet in desktop Excel with a plain Ctrl+V.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;In Confluence&lt;/th&gt;
&lt;th&gt;What Excel made of it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A cell with two paragraphs&lt;/td&gt;
&lt;td&gt;Three rows: the first line, an empty row, the second line. Every other cell in that row merged vertically across all three.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;007&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;7, stored as a number&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;1234567890123456789&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1.23E+18, stored as 1234567890123450000. The last four digits are gone.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;1-2&lt;/code&gt; and &lt;code&gt;3/4&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Dates: 1 February and 3 April with day-first regional settings, 2 January and 4 March with month-first ones&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;1200.50&lt;/code&gt; with comma-decimal settings&lt;/td&gt;
&lt;td&gt;Text, so &lt;code&gt;SUM&lt;/code&gt; skips it, while &lt;code&gt;80&lt;/code&gt; in the same column is a number&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A merged "Total" cell&lt;/td&gt;
&lt;td&gt;A merged cell in Excel too&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Then we tried to sort the result by amount. Excel refused: &lt;em&gt;"To do this, all the merged cells need to be the same size."&lt;/em&gt; That message is usually where people give up and start fixing rows by hand.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The worst row is not the one that looks broken. The ID that lost four digits looks like a perfectly normal number. Nobody notices until a lookup against the real system finds nothing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why it works this way
&lt;/h2&gt;

&lt;p&gt;When you copy from a web page, the clipboard carries HTML. Excel reads that HTML the same way it reads an old web-page workbook, and two of its rules cause all the trouble.&lt;/p&gt;

&lt;p&gt;First, a line break inside a cell, whether a &lt;code&gt;&amp;lt;br&amp;gt;&lt;/code&gt; or a second paragraph, means "new row" to Excel's HTML reader. To keep the other columns lined up, Excel merges them across the new rows. People have been reporting this in Microsoft's forum &lt;a href="https://learn.microsoft.com/en-us/answers/questions/5045569/excel-breaking-cell-value-into-multiple-rows" rel="noopener noreferrer"&gt;since at least 2020&lt;/a&gt;, for tables copied from email as well as from the web.&lt;/p&gt;

&lt;p&gt;Second, Excel guesses the type of every value. Microsoft documents the conversions it applies when you paste external data: it removes leading zeros, keeps only the first 15 digits of long numbers, reads digits around the letter E as scientific notation, and turns date-like strings into dates. See &lt;a href="https://support.microsoft.com/en-us/excel/set-automatic-data-conversions" rel="noopener noreferrer"&gt;Set automatic data conversions&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Confluence itself offers
&lt;/h2&gt;

&lt;p&gt;Confluence Cloud exports whole pages to PDF and Word, and whole spaces to PDF, CSV, HTML or XML. The space CSV is a dump of content for moving between systems, &lt;a href="https://horizonventures.app/docs/confluence-space-export-explained.html" rel="noopener noreferrer"&gt;not a spreadsheet of your tables&lt;/a&gt;. There is no export for a single table. So for most people the clipboard is the route, and the fixes below are about making the clipboard behave.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fixes that work, and one that does not
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Flatten multi-line cells before copying
&lt;/h3&gt;

&lt;p&gt;In the Confluence editor, replace line breaks inside cells with a separator such as "; " and unmerge spanned cells, repeating the value in each cell. Then copy. Tedious, but it removes the cause of the merges completely. On a copy of the page, not the original, if other people rely on its layout.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Turn off Excel's automatic conversions
&lt;/h3&gt;

&lt;p&gt;In Excel for Microsoft 365 and Excel 2024: &lt;strong&gt;File → Options → Data → Automatic Data Conversion&lt;/strong&gt;, on a Mac &lt;strong&gt;Excel → Preferences → Edit&lt;/strong&gt;. Untick the options you do not want. This is per computer, so everyone who pastes needs to do it, and older Excel versions do not have the setting at all.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Route a multi-line table through Google Sheets
&lt;/h3&gt;

&lt;p&gt;The accepted answer in that Microsoft thread is to paste into Google Sheets first and copy from there into Excel; according to the people who confirmed it, Sheets keeps the lines inside one cell. We have not tested this route ourselves, but for a one-off it is quick to try.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Paste into a single cell in edit mode
&lt;/h3&gt;

&lt;p&gt;For one stubborn cell: double-click it, or press F2, and paste. The text stays in that cell. Useless for a whole table, handy for the last two cells that went wrong.&lt;/p&gt;

&lt;h3&gt;
  
  
  What does not help: formatting the column as Text first
&lt;/h3&gt;

&lt;p&gt;This is the most common advice, and with a normal paste it did nothing in our test. We set the whole sheet to Text, pasted, and still got 7, 1.23E+18 and dates. The pasted HTML brings its own formatting and overrides yours. Format as Text works for typing and for plain-text imports, not for a table pasted from a browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  The arithmetic
&lt;/h2&gt;

&lt;p&gt;Take a 120-row status table where a third of the rows have a multi-line "Notes" cell. After a plain paste you have roughly 200 rows, about 40 of them blank or half-empty, and a block of merged cells that blocks sorting and filtering. Unmerging, deleting the empty rows and pulling the notes back together is half an hour of careful work, and the IDs that lost digits cannot be repaired at all: you have to copy them again from the source. If the table is exported every month, that is six hours a year spent cleaning the same mess.&lt;/p&gt;

&lt;p&gt;If your table is short, has no line breaks inside cells and no codes with leading zeros, none of this applies. Copy, paste, done. Take the free route.&lt;/p&gt;

&lt;h2&gt;
  
  
  What an export tool has to get right
&lt;/h2&gt;

&lt;p&gt;An export file can tell Excel what each cell is instead of letting it guess: keep line breaks inside the cell, mark codes, long IDs and date-like ranges as text, mark real numbers as numbers so sums work under any regional settings, and repeat merged values so every row has the same columns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; I build table export apps for Confluence. While writing this article I ran the same test against our own Excel file and found it had the line-break and type problems too, so we fixed them. The free &lt;a href="https://horizonventures.app/docs/table-export-lite/" rel="noopener noreferrer"&gt;Table Export Lite&lt;/a&gt; now writes the file the way described above; it exports any single table on a page to Excel or CSV, runs inside Atlassian's infrastructure, and is in Marketplace review as I write this. For every table on a page, or every table in a space in one workbook, there is the full &lt;a href="https://horizonventures.app/table-export.html" rel="noopener noreferrer"&gt;Table Export&lt;/a&gt;, free for teams up to ten people.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Why do cells merge randomly when I paste a Confluence table into Excel?
&lt;/h3&gt;

&lt;p&gt;Because some cells contain more than one line or paragraph. Excel splits each line into its own row and merges the other cells in that row to keep things aligned. Look next to any merged block: there is a multi-line cell.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why did 007 become 7?
&lt;/h3&gt;

&lt;p&gt;Excel treats it as a number and drops the zeros. Turn off "Remove leading zeros and convert to number" under Automatic Data Conversion, or make sure the value arrives marked as text.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why did a long order number turn into 1.23E+18?
&lt;/h3&gt;

&lt;p&gt;Excel stores at most 15 significant digits. A longer number is rounded, and the digits after the 15th become zeros. Widening the column will not bring them back.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does Paste Special → Text avoid all this?
&lt;/h3&gt;

&lt;p&gt;It avoids the formatting and the merged cells, which is why our &lt;a href="https://horizonventures.app/docs/export-confluence-table-to-excel.html" rel="noopener noreferrer"&gt;guide to getting a table into Excel&lt;/a&gt; recommends it for simple tables. The type guessing still applies to plain text, so codes and long IDs can still be converted.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does Google Sheets have the same problems?
&lt;/h3&gt;

&lt;p&gt;Users in Microsoft's forum report that Sheets keeps multi-line cells in one cell, which is why it works as a stepping stone. Sheets also guesses types for numbers and dates, so check codes and IDs there too.&lt;/p&gt;

&lt;p&gt;Related: &lt;a href="https://horizonventures.app/docs/export-confluence-table-to-excel.html" rel="noopener noreferrer"&gt;how to get a Confluence table into Excel&lt;/a&gt;, &lt;a href="https://horizonventures.app/docs/sum-column-confluence-table.html" rel="noopener noreferrer"&gt;how to sum a column in a Confluence table&lt;/a&gt;, and &lt;a href="https://horizonventures.app/docs/table-exporter-alternative.html" rel="noopener noreferrer"&gt;what to use now that Table Exporter is ending&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>confluence</category>
      <category>excel</category>
      <category>atlassian</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to put a Visio diagram into Confluence Cloud</title>
      <dc:creator>Mikhail Klimenko</dc:creator>
      <pubDate>Mon, 05 Oct 2026 20:29:14 +0000</pubDate>
      <link>https://dev.to/mikhailklimenko/how-to-put-a-visio-diagram-into-confluence-cloud-d0f</link>
      <guid>https://dev.to/mikhailklimenko/how-to-put-a-visio-diagram-into-confluence-cloud-d0f</guid>
      <description>&lt;p&gt;You attach the .vsdx, click it to check, and the browser downloads the file instead of showing the drawing. That is not a permissions problem or a broken upload. Confluence Cloud simply does not preview this format, and it is not going to start.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short answer.&lt;/strong&gt; Attaching the file works; previewing it does not. To get the diagram visible on a page you either export it from Visio as &lt;strong&gt;SVG&lt;/strong&gt; and insert that, or import the .vsdx into a diagramming app inside Confluence and keep it editable there. Export to PNG only if the picture is small and finished forever. Which one you want depends on a single question: does the diagram change, and do its shapes carry links?&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the attachment does not show
&lt;/h2&gt;

&lt;p&gt;Confluence Cloud previews a long list of formats on the page. The modern Visio format is not on it: a .vsdx attachment downloads rather than opening. Atlassian has a ticket for exactly this, &lt;strong&gt;CONFCLOUD-68619&lt;/strong&gt;, and the honest part is how it ended. It was raised in 2019, it says in plain words that there is no known workaround, and in October 2023 it was closed as &lt;em&gt;timed out&lt;/em&gt; — not fixed, just expired. The older .vsd format did preview, which is why people with long memories insist this used to work.&lt;/p&gt;

&lt;p&gt;So the decision is not whether to convert, but into what.&lt;/p&gt;

&lt;h2&gt;
  
  
  The four routes, and what each costs later
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Export to PNG
&lt;/h3&gt;

&lt;p&gt;The fastest and the most common. File, Export, PNG, drag onto the page, done in a minute.&lt;/p&gt;

&lt;p&gt;The cost shows up later. A PNG is pixels, so the text inside the boxes turns to mush the moment somebody zooms to read a label — and architecture diagrams exist to be zoomed into. Any hyperlink you attached to a shape in Visio is gone, because pixels cannot hold a link. And every edit means exporting and re-uploading by hand.&lt;/p&gt;

&lt;h3&gt;
  
  
  Export to PDF
&lt;/h3&gt;

&lt;p&gt;Sharper than PNG and it survives printing, which is why audit and compliance teams like it. But a PDF is a document sitting next to the page rather than a picture on it: the reader has to open an attachment, and the diagram stops being part of what they are reading. Fine as a formal record, poor as documentation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Export to SVG
&lt;/h3&gt;

&lt;p&gt;SVG is vector: it stays sharp at any zoom, the text stays text, and, crucially, the links attached to shapes travel inside the file. For a diagram with any text at all this is the right export format.&lt;/p&gt;

&lt;p&gt;There is a catch, and it is the thing people write to us about: Confluence renders an uploaded SVG as a flat image. The file still contains everything, but the viewer does not make it live, so your clickable boxes arrive looking perfect and behaving like a screenshot.&lt;/p&gt;

&lt;h3&gt;
  
  
  Import into a diagramming app and keep it editable
&lt;/h3&gt;

&lt;p&gt;If you want to stop depending on Visio altogether, import rather than export. The draw.io app for Confluence reads .vsdx: open a draw.io diagram, choose File then Import, pick the file. The result is an editable diagram living inside Confluence, so the next change is made where the documentation is, without a round trip through the desktop.&lt;/p&gt;

&lt;p&gt;Two honest caveats. Complex drawings usually need small corrections after import, because Visio stencils and draw.io shapes are not a perfect match. And this is a swap of tools, not a conversion trick: your colleagues who live in Visio will still be working in Visio.&lt;/p&gt;

&lt;h2&gt;
  
  
  The arithmetic nobody does
&lt;/h2&gt;

&lt;p&gt;Take one architecture diagram that gets a real edit once a month, which is modest for a system under active development.&lt;/p&gt;

&lt;p&gt;By the export route each change is: open Visio, edit, export, find the Confluence page, delete the old attachment, upload the new one, check the page still looks right. Call it ten minutes if nothing goes wrong, and it goes wrong often enough — somebody uploads the picture but forgets the page still shows the old attachment. Two hours a year per diagram, for a file that in theory you already finished.&lt;/p&gt;

&lt;p&gt;By the import route the edit happens on the page itself, and there is nothing to re-upload.&lt;/p&gt;

&lt;h2&gt;
  
  
  If the shapes have links on them
&lt;/h2&gt;

&lt;p&gt;This is the case worth separating out. A Visio diagram where each box links to the runbook, the service page or the owner's documentation is not a picture: it is navigation. Flattening it to PNG destroys exactly the part that made it useful, and nobody notices until a reader clicks a box and nothing happens.&lt;/p&gt;

&lt;p&gt;Export that diagram as SVG and the links survive in the file. Then they stop working in Confluence, for the viewer reason above.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I build the app that fixes this one.&lt;/em&gt; &lt;a href="https://horizonventures.app/clickable-svg.html" rel="noopener noreferrer"&gt;Clickable SVG&lt;/a&gt; renders the SVG as live markup rather than a flat picture, so the links your Visio shapes already carry keep working on the Confluence page: click a box, open the page behind it. Nothing leaves your site, and re-exporting after an edit does not mean redoing anything by hand.&lt;/p&gt;

&lt;p&gt;And if your diagram is a simple drawing with no links and no small text, export it to PNG and move on. It is free, it takes a minute, and this whole article is beside the point for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Questions people actually ask
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is there a Visio macro in Confluence Cloud?&lt;/strong&gt; No. There is no built-in macro that renders Visio files. The request has been open on Atlassian's tracker for years as CONFCLOUD-27877.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I at least show a thumbnail of the .vsdx?&lt;/strong&gt; Not natively. The file downloads rather than previewing, so there is nothing to thumbnail. Some file-preview apps on the Marketplace add Visio support if you need the raw file viewable in place.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does .vsd still preview?&lt;/strong&gt; The old binary format behaved differently from .vsdx, which is the source of a lot of confusion in forum threads. Do not plan around it: saving modern diagrams back to a legacy format to win a preview is a bad trade.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What about multi-page Visio files?&lt;/strong&gt; Export gives you one file per page, so a five-page drawing becomes five images and five uploads. The draw.io import handles multi-page .vsdx in one go, which is the main practical argument for importing when the drawing is large.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We are moving off Visio. Does that change the answer?&lt;/strong&gt; It simplifies it: import once, keep the diagram editable inside Confluence, and stop exporting anything.&lt;/p&gt;

</description>
      <category>confluence</category>
      <category>atlassian</category>
      <category>documentation</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
