There are three main steps to get your Safe App in front of Safe{Wallet} users:
Fill out the listing form [Link]
Align on terms
Build your Safe App and meet listing requirements
1. Fill out the listing form
Because review capacity is limited, please start by filling out the Safe App listing request form. We get back in a few days.
In the form, share:
What your app does and who it’s for
App details
Contact details
This helps us quickly assess fit and prioritise review.
2. Align on terms
Once we’ve reviewed your request and see a fit, we’ll reach out to:
Align on commercial terms (e.g. listing fee, revenue share, launch support and campaigns)
Agree on a timeline for integration and launch
After we’ve aligned, you can move forward to implementation and listing.
3. Build your Safe App and get it listed
This step covers both how to build and what’s required to be listed.
3.1 Choose your integration path
Most teams start from an existing dApp. Use the guide below to pick the right package.
A. You already have a dApp
Do you use Onboard.js or Web3Modal?
Onboard.js / Web3Modal: integrate via safe-apps-web3modal
This keeps your existing wallet UX and adds Safe as a first-class option.
If not, do you use Web3React?
Yes, Web3React: use safe-apps-web3react
No: use the lower-level safe-apps-provider to plug Safe into your own wallet / provider logic.
Links to Docs:
This path lets you keep your existing dApp and only adapt the wallet connection layer to support Safe{Wallet}.
B. You’re building a new app or a dedicated Safe App
If you’re starting from scratch or spinning up a dedicated Safe App:
Use cra-template-safe-app to bootstrap a React-based Safe App
Use safe-apps-sdk + safe-apps-react-sdk for Safe-specific context and hooks
Links to Docs:
3.2 Technical requirements for all Safe Apps
Regardless of how you integrate, all Safe Apps must meet the same baseline requirements.
Manifest file
It's mandatory that your app exposes a manifest.json file in the root directory with this structure:
{
"name": "YourAppName",
"description": "A description of what your app does",
"iconPath": "myAppIcon.svg"
}
Note: iconPath is the public relative path where Safe will try to load your app icon. For this example, it should be https://yourAppUrl/myAppIcon.svg.
CORS
Safe needs to reach the manifest.json from the app. To allow this, it's required to enable Cross Site Requests by setting the CORS headers to the manifest.json.
The required headers are:
"Access-Control-Allow-Origin": "\*",
"Access-Control-Allow-Methods": "GET",
"Access-Control-Allow-Headers": "X-Requested-With, content-type, Authorization"
Follow the “Basic requirements” / “React development” sections in the docs for HTTPS local dev and recommended config.
Auto-connect to Safe
When opened inside Safe{Wallet}, your app should:
Detect that it is running as a Safe App
Automatically select the connected Safe as the active account
Fall back gracefully when opened outside Safe with another wallet
The examples in safe-apps-sdk, safe-apps-react-sdk, safe-apps-web3modal, safe-apps-web3react and safe-apps-provider show how to implement this.
3.3 Listing and Launch
To be listed in Safe{Wallet}, your app must use audited contracts, have a valid manifest.json + CORS setup, and pass a product/UX review (repo access, short test plan, any known limitations). You also need to provide ABIs (via Sourcify, ABI files, or verified explorer links) so we can decode transactions.
Once this is done, we add your app to staging for final checks, then promote it to production and coordinate launch. You can always test earlier by adding it as a Custom App in Safe{Wallet} and using supported testnets plus mainnet.
⚠️ Safe Apps aren't owned, controlled, maintained, or audited by Safe. Safe can list or delist apps from Safe{Wallet} at its sole discretion. ⚠️

