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!
Prototype status
This is a prototype shared through an RFC for feedback only. It is not an EAP, beta, preview, or GA feature, and it should not be treated as a production-ready capability.
Use only non-production apps and data.
Project summary
As a follow up to RFC-128: Local development mocks for Forge Storage, we are developing a Docker-backed local development experience for Forge Storage. This RFC goes through what problems we’re looking to improve in the local development experience, how we propose to do it and where we would like your feedback
We are committed to releasing this capability, and so the prototype we’re releasing is not a proof of concept but a validation that what is built will help solve the problems we’ve identified for you or if further iteration is required.
-
Publish: Sep 24, 2026
-
Discuss: Oct 8, 2026
-
Resolve: Oct 15, 2026
Why we are doing this
For development and testing, Forge apps that use Forge Storage can have slower feedback loops, more work in maintaining test data, and require CI suites to provision and interact with real Forge Environments when production-like infrastructure is not needed
In our previous RFC, the feedback we got helped to define the following requirements for an improved development experience:
-
Local mocks for Forge KVS and SQL, usable in tunnel mode
-
Strong API parity (pagination, query behaviour, SQL syntax/dialect)
-
Data seeding and reset to support repeatable tests
-
Direct SQL access through a MySQL client to inspect and manage local test data
We have used that feedback to build a working prototype. We want to understand if what we have built, fits well into your existing workflows and CI environments.
Prototype capabilities
The prototype includes an experimental Forge CLI release and experimental versions of the two Forge Storage SDKs:
-
@forge/kvs, covering Key-Value Store, Custom Entity Store, and Secret Store; -
@forge/sql, covering Forge SQL.
Existing calls through these SDKs are routed to local emulators when the local-storage tunnel is enabled. Developers should not need to add separate mock implementations or change their application logic.
The forge tunnel command now has a new argument for enabling local-storage which does the following:
-
Reads the app manifest to determine which storage services are required;
-
Automatically pulls missing public emulator images;
-
Starts only the required Docker services and waits for readiness;
-
Creates an isolated, deterministic namespace for the app;
-
Routes supported SDK calls to that namespace during a Forge tunnel;
-
Preserves local data between normal stop/start cycles;
-
Provides commands to seed, inspect the status of, reset, and stop local storage.
No manual docker pull should be required during the normal workflow.
Developers will not need to submit an app ID or request allowlisting to access the public prototype. The experimental CLI, SDK packages, and emulator images will be publicly accessible using the documented setup flow.
Try the prototype
Prerequisites
-
A Forge app using KVS and/or Forge SQL.
-
A supported Forge Node.js environment.
-
Docker Desktop or another compatible Docker Engine with Docker Compose v2.
Install the experimental CLI and SDKs
Install the experimental Forge CLI produced by our prototype release pipeline:
npm install -g @forge/cli@14.1.0-next.1-experimental-13c2f8d
From the Forge app directory, install the experimental SDK package or packages used by the app:
npm install @forge/api@8.1.1-next.0-experimental-13c2f8d
@forge/bridge@7.0.1-next.0-experimental-13c2f8d
@forge/bundler@7.2.3-next.1-experimental-13c2f8d
@forge/cache@2.0.7-next.0-experimental-13c2f8d
@forge/cli-shared@9.7.0-next.1-experimental-13c2f8d
@forge/csp@6.3.1-experimental-13c2f8d
@forge/dashboards-bridge@1.3.1-next.1-experimental-13c2f8d
@forge/events@3.0.7-next.0-experimental-13c2f8d
@forge/feature-flags@2.0.7-next.0-experimental-13c2f8d
@forge/feature-flags-node@4.0.7-next.0-experimental-13c2f8d
@forge/hooks@1.2.1-next.1-experimental-13c2f8d
@forge/jira-bridge@1.2.0-next.0-experimental-13c2f8d
@forge/kvs@2.0.7-next.0-experimental-13c2f8d
@forge/lint@6.2.3-next.1-experimental-13c2f8d
@forge/llm@1.0.7-next.0-experimental-13c2f8d
@forge/manifest@13.5.1-next.0-experimental-13c2f8d
@forge/metrics@1.0.7-next.0-experimental-13c2f8d
@forge/migrations@3.0.7-next.0-experimental-13c2f8d
@forge/notification@1.0.7-next.0-experimental-13c2f8d
@forge/object-store@3.0.1-next.0-experimental-13c2f8d
@forge/os@4.0.6-next.0-experimental-13c2f8d
@forge/react@12.3.0-next.1-experimental-13c2f8d
@forge/sql@4.0.7-next.0-experimental-13c2f8d
@forge/teamwork-graph@5.2.1-next.0-experimental-13c2f8d
@forge/tunnel@7.1.4-next.1-experimental-13c2f8d
Equivalent Yarn commands can be used. Direct dependencies on other @forge/* packages may also need to use versions from the same experimental release.
Use local storage with Forge tunnel
From the app directory, run:
forge tunnel --local-storage
The CLI will pull missing images, start the manifest-configured storage services, wait for them to be ready, and route normal @forge/kvs and @forge/sql calls to local storage. Without --local-storage, Forge tunnel behaviour remains unchanged.
Please exercise your normal app workflows through the tunnel. We particularly want to understand whether this feels like a drop-in development experience and whether anything would prevent you from adopting it.
Manage local storage directly
The prototype also provides standalone commands:
forge storage local start
forge storage local status
forge storage local seed --kvs ./kvs-seed.json
forge storage local seed --sql ./sql-seed.sql
forge storage local reset --kvs
forge storage local reset --sql
forge storage local reset
forge storage local stop
-
startstarts the services required by the current manifest and waits for readiness. -
statusreports the configured services and their local runtime health. -
seedloads repeatable KVS/Custom Entity/Secret Store or SQL test data. -
resetclears one configured storage offering, or all configured offerings when no flag is given. -
stopstops the containers while preserving local data for a later start.
We expect these commands could be useful both during local development and in CI.
An example CI flow is:
forge storage local start
forge storage local seed --kvs ./test-data/kvs.json --sql ./test-data/sql.sql
# Run the app's integration or end-to-end tests.
forge storage local stop
Current boundaries
The local emulators aim for SDK and query compatibility, but they are not a complete production simulation. The first release is not intending to reproduce:
-
Production rate limits or connection limits;
-
Production latency or performance characteristics;
-
Fault/error injection;
-
All platform permission and authentication checks;
-
Production durability or security guarantees.
Only products that are in GA are covered. The emulator images will be publicly pullable for the prototype, but making the emulator source code open source is not part of this proposal.
Testing against a real Forge environment will remain important for production confidence. Local storage is intended to make the development and automated-test loop faster and easier, not to replace every hosted integration test.
Feedback we are asking for
Please try the prototype, and let us know your feedback in this thread. We are particularly interested to hear about:
-
What worked well? Which parts of the prototype were most useful, intuitive, or reliable in your workflow? What, if anything, is missing before you could rely on it? Please be specific about the features or commands where you can.
-
What would stop you from adopting this? We have tested it to the best of our ability, but developers often have more complex and larger apps than the ones available to us. What would you want changed or improved in this experience? Please call out any difference that would prevent meaningful development or testing.
-
Does tunnelling work naturally? Did
forge tunnel --local-storagework with your existing application code and SDK usage? -
Where do the standalone commands fit? Which of
start,status,seed,reset, andstopwould you use during local development? Which would you use in CI? -
Does it fit your CI pipeline? If not, what capabilities, configuration, output, or lifecycle behaviour would need to be added?
To help us compare feedback across different workflows, please include:
-
Which storage surfaces you tested: KVS, Custom Entity Store, Secret Store, and/or Forge SQL;
-
Whether you tested locally, in CI, or both;
-
Your Docker environment and CI provider where relevant.
Do not share credentials, application data, or other secrets.
Please share feedback in this RFC thread first so other developers can react, compare workflows, and add context. If a deeper walkthrough would help, use the scheduling link in the post to book time with the team.
What happens after the RFC
The feedback period will remain open for one week. During that time, we will answer questions and use the thread to understand whether reported gaps are adoption blockers or follow-up improvements.
At the end of the week, we will summarise the feedback and close the RFC thread. Based on the quality, depth, and sentiment of the feedback, we will determine whether this capability can progress directly toward a Preview release or if an intermediate formal EAP is needed for deeper validation.