Let me start by saying that if you haven’t checked out Setapp yet, you should. The number of quality apps available makes it ridiculous to not give it a try.

Now, for those who are using Setapp, it’s likely that you already own some of the apps on it. Every time you use the Setapp version of an app instead, you contribute part of the monthly subscription fee you’re already paying to the developers of the apps you love. Plus, those versions are automatically updated and include any in-app purchases you would need to make separately in a version from another platform. It’s worth it to make sure you’re using the Setapp version, both for you and the devs you love.

A Solution

To that end, I’ve written a quick Terminal script (Ruby, no dependencies, but see the next section if you’re not a “terminal” person) which will tell you what apps you have that also have a Setapp version, and which of those already have both a “regular” and Setapp version installed. You can delete the original versions of those apps to make sure you’re always running the Setapp version (be sure to back up your license codes, of course).

Aside, if you’re not using 1Password to store your license codes, I highly recommend it. Having them synced to all of your devices and automatically available after a new install is priceless. Plus, you can attach receipts and license files to each entry as appropriate.

Here’s the script you can run directly in Terminal (make it executable or run it with /usr/bin/env ruby onsetapp.rb).

onsetapp.rbraw
"
#!/usr/bin/env ruby
# encoding: utf-8

# Read /Applications/Setapp to get apps already installed
installed_setapp_apps = Dir.glob('/Applications/Setapp/*.app')
installed_setapp_apps.map! {|app|
  File.basename(app,'.app')
}

# Grab the All Apps page from Setapp to get all available apps
apps_page = `curl -SsL https://setapp.com/apps`
setapp_apps = apps_page.force_encoding('utf-8').scan(/<app-details\s*name=\"(.*?)\"/m).map {|match|
  match[0]
}

# Read /Applications for non-Setapp apps on the system
apps = Dir.glob('/Applications/*.app')
apps.map! {|app|
  basename = File.basename(app,'.app')
  # Setapp disallows version numbers in app names. Strip them from
  # /Application apps for consistency in matching
  basename.sub!(/\s*\d+$/,'')
  basename
}

setapp_apps.sort.uniq.each {|app|
  if apps.include?(app)
    # App is on Setapp
    out = "Setapp has: #{app}"
    if installed_setapp_apps.include?(app)
      # Setapp version is installed (or at least proxied)
      out += " (Installed)"
    end
    $stdout.puts out
  end
}

Example output:

Setapp has: Focus
Setapp has: Marked (Installed)
Setapp has: SQLPro for SQLite

An App Version

For those not already comfortable with Terminal, I’ve made a quick Automator App version of the script that will write the results to a file on your Desktop called “onsetapp.txt”. Just run it to find out what apps you could be using on Setapp instead.

Again, if you’re reading this even though you don’t already have Setapp, go check it out.