RFC-136: Forge staticView Macro for Confluence, Connect Migration & Feedback

Will there be support for switching from staticView to the dynamic macro view on demand?

Our goal is to use staticView as a performance optimization for macros that are primarily viewed but occasionally interacted with.

In the proposed design, a macro initially renders dynamically, generates a snapshot, and subsequently renders as static ADF. However, many of our macros support user interactions such as filtering, sorting, and other data manipulations that require the dynamic iframe experience.

Would it be possible to programmatically switch from a rendered staticView snapshot to the dynamic macro view (for example, via a “Switch to interactive mode” button)?

A possible workflow would be:

  1. The page initially loads the ADF snapshot for fast rendering.

  2. The user clicks a button to enter interactive mode.

  3. The dynamic macro loads and allows filtering, sorting, and other interactions.

  4. When the user changes the state, the application updates the snapshot.

  5. Future page loads again benefit from the updated static snapshot.

As an additional optimization, would it make sense to support preloading the dynamic iframe in the background while displaying the static snapshot? This would allow an almost instant transition to interactive mode without waiting for the iframe to initialize after the user clicks the button.

What are the expected Forge Function costs for keeping staticView snapshots up to date at scale?

One of our concerns is that snapshot maintenance appears to shift rendering costs from page views to snapshot generation and refresh operations.

In real-world scenarios, snapshot updates may be triggered by page updates, macro configuration changes, user actions, scheduled jobs, or changes in external data sources. For apps with many macro instances across large customer sites, this could result in a significant number of snapshot refreshes.

Is the expectation that these refresh operations will be performed through Forge Functions (e.g. scheduled triggers, event triggers, or other Lambda-like execution mechanisms)?

If so, could Atlassian provide guidance on:

  • The expected cost model for maintaining snapshots at scale.

  • The impact on Forge invocation quotas and usage limits.

  • Recommended patterns for minimizing invocation costs.

  • Whether there are plans for platform-level optimizations (e.g. bulk updates, event aggregation, built-in caching, or other mechanisms) to reduce the operational cost of keeping snapshots fresh.

We are particularly interested in understanding whether large apps with thousands of macro instances could end up generating substantial Forge usage solely for snapshot maintenance.

How should applications handle concurrent usage and snapshot ownership when multiple users interact with the same macro?

One concern we have is how staticView behaves when multiple users are working with the same page and macro.

For example:

  • User A opens the macro in interactive mode and changes filters, sorting, or other view settings.

  • The application generates and stores an updated snapshot.

  • User B opens the same page later.

In this scenario:

  • Is the updated snapshot expected to become the new default view for all users?

  • Should snapshots be considered shared page-level state or user-specific state?

  • What is the recommended approach when user interactions modify only the presentation of the data rather than the underlying data itself?

We are concerned that one user’s view customization could unintentionally affect the experience of other users if snapshots are shared across all viewers.

Does Atlassian envision any platform support or recommended patterns for handling this type of collaborative scenario?

Hi @remie,

Thanks for the feedback. Would showing a warning to the user before fetching and rendering links address your concern here?

Hi @AndreasEbert,

Thanks for the feedback and providing answer to all questions. Much appreciated.

Given you are not rendering many macros on a single page but need installation level custom content, would dynamic macros work for your usecase? Would that solve the problem for you or you have other concerns taking that approach?

You mentioned the most extreme case is ~70 macros on page. Are these installation level static content or relevant to a page? can these be defined as custom content on those pages to improve performance but not for smaller numbers?

Also re `macro config changed` event, as that is not available today, there are two possible approaches:

  • handle as part of page update event
  • have custom edit for macro and handle updating the custom content when macro config is edited.

Thanks.

No, I’d rather have CME be Runs-on-Atlassian compliant

Hi @andreas1,

Thanks for providing detailed feedback.

  • We are actively looking into localId/macro.id-based lookup mechanism.
  • Providing bulk action APIs is in our radar. So stay tuned for that.
  • Intra-page anchor targets is not supported in ADF. We need to investigate possibility of this further.
  • Re cross-page snapshot, would creating snapshots per space work for you? or you need snapshots to work across spaces as well?

Thanks.

Hi @marc,

Thanks for you response. Just a couple of questions so we understand your usecase better:

  • You mentioned there’s mostly less than 15 macros on a page. The issue is mostly when they are used in page property report macros that often results in hundreds or thousands of render requests. Is this the case for all customers? Some partners have implemented an opt-in model for staticView when needed for customers that have performance issues and require that static snapshot. Would this also work for your usecase? Can you use dynamic macros instead for usecses that don’t require this?
  • What might be changed when a page is viewed? Page update event covers most cases like page status, edit date and last editor. Does other page events, or even a scheduled trigger to check the required information of the page and keep the snapshot up-to-date work for your usecase?

Thanks.

Hi @mtalebi,
Thank you for your reply.

We have 2 addons who use static content macros, and these 2 addons have different use cases, so one answer is about one addon, and the other about the other addon.

The page properties report macro is basically a table. In this table values from all pages in a space are aggregated. That means such a table can have hundreds to thousands of cells. We can’t show a dynamic macro in each table cell, and currently the connect macro just renders the static xhtml.

About the second case what changes when a page is viewed:

Our app need to check for content property changes. There is no update event for those, so we have to check them on page view. We would need to update the snapshot on each page property change, however we’re concerned how that interacts with rate limits and costs.

Actually, we already implemented dynamic macros in our Forge app. Those are working well in our use-case, except for the general performance problem that comes with having so many iframes. Tackling that performance-problem is our main goal with looking into a static macro alternative.

Yes, installation-level content, i.e. not depending on the page they are on. In fact, not even depending on the Atlassian site, because the content comes from external Microsoft Entra ID (except the macro instances’s config). Not sure of how much help page-level custom content would be. As stated by others, I worry about the overhead of having to update that periodically for each and every macro snapshot. Certainly doable, but unsure about performance and/or hitting limits of Forge or Confluence.

Thanks @AndreasEbert for clarifying.

Follow-up question re search behaviour of static macro content.
In Atlassian Connect, the output of a staticContentMacro is indexed by Confluence search meaning the content your macro renders is discoverable and appears in search results. With Forge staticView, the ADF snapshot stored as Custom Content is not currently indexed by Confluence search.
Two questions:

  1. Is search indexing of your macro’s rendered content important for your use case? For example, do your customers rely on being able to search for text or data that appears inside your macro’s output?
  2. If indexing were supported, would you want it to be configurable per macro — for example, opting in or out of indexing in the manifest? Or would you always want it on (or off)?

Thanks for your reply @marc,

Follow-up question re search behaviour of static macro content.
In Atlassian Connect, the output of a staticContentMacro is indexed by Confluence search meaning the content your macro renders is discoverable and appears in search results. With Forge staticView, the ADF snapshot stored as Custom Content is not currently indexed by Confluence search.
Two questions:

  1. Is search indexing of your macro’s rendered content important for your use case? For example, do your customers rely on being able to search for text or data that appears inside your macro’s output?

  2. If indexing were supported, would you want it to be configurable per macro — for example, opting in or out of indexing in the manifest? Or would you always want it on (or off)?

Hi @StepanBogatrjov ,

Thanks for providing feedback. We will take these into account.

Some follow-up question re search behaviour of static macro content.
In Atlassian Connect, the output of a staticContentMacro is indexed by Confluence search meaning the content your macro renders is discoverable and appears in search results. With Forge staticView, the ADF snapshot stored as Custom Content is not currently indexed by Confluence search.
Two questions:

  1. Is search indexing of your macro’s rendered content important for your use case? For example, do your customers rely on being able to search for text or data that appears inside your macro’s output?

  2. If indexing were supported, would you want it to be configurable per macro — for example, opting in or out of indexing in the manifest? Or would you always want it on (or off)?

Hi @jonlopezdeguerena ,

Thanks for the feedback. We will take these into account.

Just some follow-up questions re search behaviour of static macro content.
In Atlassian Connect, the output of a staticContentMacro is indexed by Confluence search meaning the content your macro renders is discoverable and appears in search results. With Forge staticView, the ADF snapshot stored as Custom Content is not currently indexed by Confluence search.
Two questions:

  1. Is search indexing of your macro’s rendered content important for your use case? For example, do your customers rely on being able to search for text or data that appears inside your macro’s output?

  2. If indexing were supported, would you want it to be configurable per macro — for example, opting in or out of indexing in the manifest? Or would you always want it on (or off)?

Hi @UmeshChaudhary1 ,

Thanks for the feedback.

Some follow-up questions re search behaviour of static macro content.
In Atlassian Connect, the output of a staticContentMacro is indexed by Confluence search meaning the content your macro renders is discoverable and appears in search results. With Forge staticView, the ADF snapshot stored as Custom Content is not currently indexed by Confluence search.
Two questions:

  1. Is search indexing of your macro’s rendered content important for your use case? For example, do your customers rely on being able to search for text or data that appears inside your macro’s output?

  2. If indexing were supported, would you want it to be configurable per macro — for example, opting in or out of indexing in the manifest? Or would you always want it on (or off)?

Hi @Corentin ,

Thanks for the response.

Some follow-up question re search behaviour of static macro content.
In Atlassian Connect, the output of a staticContentMacro is indexed by Confluence search meaning the content your macro renders is discoverable and appears in search results. With Forge staticView, the ADF snapshot stored as Custom Content is not currently indexed by Confluence search.
Two questions:

  1. Is search indexing of your macro’s rendered content important for your use case? For example, do your customers rely on being able to search for text or data that appears inside your macro’s output?

  2. If indexing were supported, would you want it to be configurable per macro — for example, opting in or out of indexing in the manifest? Or would you always want it on (or off)?

Hi @andreas1 ,

Some follow-up question re search behaviour of static macro content.
In Atlassian Connect, the output of a staticContentMacro is indexed by Confluence search meaning the content your macro renders is discoverable and appears in search results. With Forge staticView, the ADF snapshot stored as Custom Content is not currently indexed by Confluence search.
Two questions:

  1. Is search indexing of your macro’s rendered content important for your use case? For example, do your customers rely on being able to search for text or data that appears inside your macro’s output?

  2. If indexing were supported, would you want it to be configurable per macro — for example, opting in or out of indexing in the manifest? Or would you always want it on (or off)?

Thanks.

Hi @Chris_at_DigitalRose,

Some follow-up question re search behaviour of static macro content.
In Atlassian Connect, the output of a staticContentMacro is indexed by Confluence search meaning the content your macro renders is discoverable and appears in search results. With Forge staticView, the ADF snapshot stored as Custom Content is not currently indexed by Confluence search.
Two questions:

  1. Is search indexing of your macro’s rendered content important for your use case? For example, do your customers rely on being able to search for text or data that appears inside your macro’s output?

  2. If indexing were supported, would you want it to be configurable per macro — for example, opting in or out of indexing in the manifest? Or would you always want it on (or off)?

Thanks.

Dear @mtalebi . In our case indexing is NOT needed.

Dear @mtalebi ,

localId/macroId and bulk action would match 90% of our needs. We can handle the import use-case with the current approach or find another smart way.

Regarding anchors: we tried to compensate the Forge limitations by other means but some customers don’t like that approach - they want to get back the old look and feel which allowed them to jump from a single cite to the list of references and the other way round.

Thank you

Andreas

@mtalebi, for our use-case indexing is of low priority. There would be complications, like differing permissions/visibility of the 3rd-party content, so making sensitive external content accessible via Confluence search may have security concerns.

Regarding making it configurable per macro: I can see the benefit, yes.

@mtalebi
Indexing would be useful.
We have our own search bar and search syntax, but supporting the native search would be a plus.