Skip to main content

How to build a Safe App and get it listed in Safe{Wallet}

Guide to getting your app listed on the SafeApp store.

Christoph Sonn avatar
Written by Christoph Sonn
Updated this week

There are three main steps to get your Safe App in front of Safe{Wallet} users:

  1. Fill out the listing form [Link]

  2. Align on terms

  3. 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.

diagram Safe Apps

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

  1. 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.

  2. 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:

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. ⚠️

Did this answer your question?