RFCs are a way for Atlassian to share what we’re working on with our valued developer community.
It’s a document for building shared understanding of a topic. It expresses a technical solution, but can also communicate how it should be built or even document standards. The most important aspect of an RFC is that a written specification facilitates feedback and drives consensus. It is not a tool for approving or committing to ideas, but more so a collaborative practice to shape an idea and to find serious flaws early.
Please respect our community guidelines: keep it welcoming and safe by commenting on the idea not the people (especially the author); keep it tidy by keeping on topic; empower the community by keeping comments constructive. Thanks!
Project Summary
Today, Connect supports the ability to register for dynamic modules or dynamic webhooks and many apps are using this feature today. This project seeks to explore how to make dynamic modules available in Forge, allowing Connect apps to migrate to Forge without compromising on the existing flexibility and scalability of dynamic modules.
- Publish: Jun 5, 2025
- Discuss: Jun 19, 2025
- Resolve: Jul 3, 2025
Problem
Dynamic Modules
Dynamic modules and triggers provide numerous benefits such as on-demand feature delivery, reduced app size, and enhanced user experience. By loading only the essential modules at runtime, developers can easily introduce new features or tailor the app to various environments without necessitating app updates.
Users enjoy the flexibility of dynamic modules as it allows them to flexibly customize their Atlassian experience. For instance, a task management app may allow users to activate or deactivate modules for features like calendar integrations or notification preferences based on their workflows. Each installation of an app can use different dynamic module configurations making it a popular feature.
Example Jira trigger module with Jira expression filtering:
A user configured for a work item to be auto assigned to the user based on the work item’s priority. This should work for any work item in project “xxx” (dynamically specified by the user). The app dynamically registers a new trigger listening for ‘avi:jira:created:issue’ and ‘avi:jira:updated:issue’ with expression based filter to receive events only for “xxx” project. As a result, the app will populate the assignee field with the user’s name based on selected priority.
Proposed Solution
Dynamic modules are modules that are added to a specific installation during an app’s runtime. Instead of defining all modules in the manifest file, these modules would be added during app execution. As is the case for static modules today, a resolver for dynamic modules has to be defined in the code for the app to know where the module can be found and loaded at runtime.
To start with, we are proposing a limit of 100 dynamic modules per tenancy.
New APIs
We are proposing the following new APIs for dynamic modules
- get a list of previously set dynamic modules
- register for module types of interest
- update registered modules
- delete registered modules
Once the app has registered for one or more dynamic modules, they will be made available to that app installation on demand.
Apps will make requests on behalf of a user using GraphQL asUser()
. asApp
is not supported, meaning dynamic modules cannot be added by scheduled jobs.
Admin experience
The customer experience is driven by the developer of the app. Customers’ app configuration preferences will determine when a dynamic module is triggered and executed.
We are proposing the configuration of dynamic modules to require the Product Admin role. This will reduce the amount of dynamic modules set. Once dynamic modules are defined, end users can use them on their instance.
Delivery
We are planning to deliver dynamic modules in an iterative manner. This means we will make some dynamic modules available earlier than others. We will likely start with trigger modules for Jira.
As we progress, we will gradually expand our offerings to include additional module types and covering Confluence as well.
Asks
While we would appreciate any reactions you have to this RFC, we’re especially interested in hearing more about:
- Does this implementation make sense for your app(s)?
- Will this unlock new use cases for you on Forge which were previously inaccessible?
- Is there anything you believe we are missing, or which should be reconsidered in the above proposal?
- What filtering options would you expect to become available to you for dynamic modules?