Publish your macOS App outside the App Store

Seeing the potential of tools like Cursor, I set out to work on a new idea: a very simple image converter that I could use in my day-to-day work. In general, I was quite annoyed by having to go to the browser, open the image converter tab, upload my images, and then wait for them to be uploaded to the cloud and downloaded again.

Picmal demo

I wanted something that worked on my computer, without needing an internet connection, and that was fast.

That’s why I said: I’m going to make it native. I had never made a 100% native application before, so this was a challenge. Thanks mainly to Cursor, I was able to launch a prototype in a short period of time.

After paying for my Apple Developer license, I realized that when I saved images generated with Picmal, a terrible window would appear, asking the user for permission to save the image to their computer. And I didn’t want that. This was due to Apple restrictions, so the only solution was to publish the app outside of the Apple Store.

After looking for a few solutions, I found an easy way to distribute my app: Gumroad. Here’s how I did it:

Step 1: Build and Export the App from Xcode

Once your app is ready for release, do the following:

  1. In Xcode, go to Product > Archive. Select the method “Direct distribution”.
  2. Wait until the build status shows “Ready for Distribution”.
  3. Click on “Export” and you will export the .app file.

Step 2: Create a DMG Installer

To give users a better experience in order to install the app, I used create-dmg, a simple CLI tool that outputs a polished DMG file.

In the terminal you need to execute this:

# Install create-dmg if you haven't already
brew install create-dmg

# Create the DMG installer
create-dmg \
  --volname "Your App Name" \
  --window-pos 200 120 \
  --window-size 600 300 \
  --icon-size 100 \
  --icon "YourApp.app" 175 120 \
  --hide-extension "YourApp.app" \
  --app-drop-link 425 120 \
  "YourApp.dmg" \
  "source_folder/"

Once it’s done you will have your DMG installer ready, but you need to do an extra step, which is notarize this DMG too to avoid getting an error like this:

Step 3: Notarize DMG installer

First I highly recommend you to create a profile so that every time you have to notarize your new releases you don’t need to remember the password:

xcrun notarytool store-credentials --apple-id "your-email@example.com" \
  --team-id "YOUR_TEAM_ID_HERE" \
  --password "your-app-specific-password" \
  your-app-profile

Note: The password you use here must be an app-specific password generated from your Apple ID account. Regular Apple ID passwords will not work for notarization. If you haven’t created one before, follow Apple’s instructions to generate an app-specific password for use with notarytool.

After creating the profile you need to notarize the DMG file with your newly created profile:

xcrun notarytool submit YourApp.dmg --keychain-profile "your-app-profile" --wait

Now you need to staple the DMG:

xcrun stapler staple YourApp.dmg

And finally you are almost ready, just to check that this process has worked, you can check it in your terminal using:

spctl --assess --type open --context context:primary-signature -v YourApp.dmg

# Expected output:
# YourApp.dmg: accepted
# source=Notarized Developer ID

If you see something like this message, you’re done. You can upload your DMG to Gumroad (or wherever you prefer) and start selling. Here is how it looks my app in Gumroad:

Picmal app listing on Gumroad

If you’re interested in experiencing Picmal, you can buy the app and start using it today.

Subscribe to my newsletter

Get updates whenever I publish new posts about my projects, creativity, health, and living independently.