<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Alberto Gallego</title>
    <description>The latest articles on DEV Community by Alberto Gallego (@albertogalca_58).</description>
    <link>https://dev.to/albertogalca_58</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3506105%2F233275c2-1f0b-4ae4-828c-7aaa18dd043f.jpeg</url>
      <title>DEV Community: Alberto Gallego</title>
      <link>https://dev.to/albertogalca_58</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/albertogalca_58"/>
    <language>en</language>
    <item>
      <title>Everything I found while researching license managers for my Mac app</title>
      <dc:creator>Alberto Gallego</dc:creator>
      <pubDate>Mon, 23 Feb 2026 07:36:40 +0000</pubDate>
      <link>https://dev.to/albertogalca_58/everything-i-found-while-researching-license-managers-for-my-mac-app-3d1g</link>
      <guid>https://dev.to/albertogalca_58/everything-i-found-while-researching-license-managers-for-my-mac-app-3d1g</guid>
      <description>&lt;p&gt;A few months ago I chose Lemon Squeezy for &lt;a href="https://picmal.app" rel="noopener noreferrer"&gt;Picmal&lt;/a&gt; because it offered two things at once: payments and license management, with affiliate support included.&lt;/p&gt;

&lt;p&gt;But after using it for a few months, I ran into two real problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The checkout process is unreliable. I've seen developers who switched to Stripe improve their conversion rate just by making that change.&lt;/li&gt;
&lt;li&gt;Each licence is linked to a customer and a purchase. That works fine for direct sales, but it breaks down with platforms like TheAppSquad, which buy a batch of licences in advance and handle their own sales.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I looked for alternatives. I spoke to the founder of Creem, emailed Polar, and spent a few evenings going through options. Here's what I found.&lt;/p&gt;

&lt;h2&gt;
  
  
  A distinction that matters first
&lt;/h2&gt;

&lt;p&gt;Most licence tools work in one of two ways:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Licenses that are ready to be purchased&lt;/strong&gt; — created after a purchase, always linked to the customer. This is how most platforms usually work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Standalone licenses&lt;/strong&gt; are generated independently and are not linked to any specific purchase. This is a must if you want to work with resellers.&lt;/p&gt;

&lt;p&gt;If you're only doing direct sales, you'll never reach this point. But if you ever want to expand how you distribute your work, this distinction becomes very important.&lt;/p&gt;




&lt;h2&gt;
  
  
  The tools
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://lemonsqueezy.com" rel="noopener noreferrer"&gt;Lemon Squeezy&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;The all-in-one option is the one most indie developers go for first. Everything you need to manage payments, licences and affiliates is in one place. It deals with VAT as a Merchant of Record, which is important if you're selling worldwide.&lt;/p&gt;

&lt;p&gt;The problems I had were that the checkout didn't always work properly, which meant I lost sales, and I couldn't get standalone licenses without buying something. If you need licensing that is suitable for resellers, this won't work for you.&lt;/p&gt;

&lt;p&gt;This is best for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;direct sales&lt;/li&gt;
&lt;li&gt;simple products&lt;/li&gt;
&lt;li&gt;getting started quickly&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://creem.io" rel="noopener noreferrer"&gt;Creem&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;I spoke to the person who started the company. It's reliable, and it's easy to sign up. It works in a similar way to the Lemon Squeezy, but costs less.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://polar.sh" rel="noopener noreferrer"&gt;Polar.sh&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;It is developed with the developer in mind and is open-source friendly. It was a nice, clean experience. We've got the same problem though – the licenses are linked to purchases, and they've confirmed that they're not planning to change this.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="//licenseseat.com"&gt;LicenseSeat&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;This one is different. It's just a tool for creating licenses, and it costs a monthly fee. It lets you make your own licenses, which is exactly what I needed for the reseller use case. It works with Stripe, so you can link payments without having to start from scratch.&lt;/p&gt;

&lt;p&gt;This is perfect for anyone who needs to give out licenses through other companies or for those who want to separate licensing from payments.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://amore.computer" rel="noopener noreferrer"&gt;Amore&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Lucas is the developer behind Amore. I know him, and he's really serious about solving the problem of getting Mac apps that aren't from the App Store without all the usual hassle. So it's a really good choice.&lt;/p&gt;

&lt;p&gt;It puts Sparkle (the main way to update macOS) into a simple interface. You can drag and drop your app, write release notes, and publish. It also automatically creates DMG, supports beta channels, phased rollouts, and signing — all in one place. There's even a command-line interface (CLI) if you want to automate releases or integrate with continuous integration/continuous delivery (CI/CD).&lt;/p&gt;

&lt;p&gt;Payments and licences are on the roadmap, built on Stripe. This is worth keeping an eye on if you want everything in one place for Mac distribution.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://keygen.sh" rel="noopener noreferrer"&gt;Keygen.sh&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;It's powerful and flexible. You can use it in different ways, like with floating licenses, node-locked, offline validation and complex entitlement models. If you're creating something for businesses or teams, it's worth checking out. You can also self-host, which is a good option.&lt;/p&gt;

&lt;p&gt;For a simple indie product, it's probably more than you need.&lt;/p&gt;




&lt;p&gt;None of these tools solve the reseller case in a single, easy-to-understand place. If you're into direct sales, Creem is definitely an upgrade from Lemon Squeezy. If you want a standalone licence, the only real option is LicenseSeat. Amore is the one to watch if you want everything to be put together for Mac distribution in the future.&lt;/p&gt;

&lt;p&gt;I hope this helps you understand the options and helps you decide which one to choose. If you have a different approach in mind, please let me know. I haven't made my mind up yet.&lt;/p&gt;

</description>
      <category>mac</category>
      <category>licenses</category>
      <category>swift</category>
      <category>stripe</category>
    </item>
    <item>
      <title>Publish your macOS App outside the App Store</title>
      <dc:creator>Alberto Gallego</dc:creator>
      <pubDate>Tue, 16 Sep 2025 09:47:46 +0000</pubDate>
      <link>https://dev.to/albertogalca_58/publish-your-macos-app-outside-the-app-store-408b</link>
      <guid>https://dev.to/albertogalca_58/publish-your-macos-app-outside-the-app-store-408b</guid>
      <description>&lt;p&gt;When I first started building &lt;a href="https://picmal.app" rel="noopener noreferrer"&gt;Picmal&lt;/a&gt;, a simple image converter for macOS, the App Store was the obvious destination. That changed quickly.&lt;/p&gt;

&lt;p&gt;After paying for the Apple Developer license and getting my first version ready, I hit an unexpected wall: every time users tried to save an image, a permission dialog appeared. It was intrusive and ruined the experience. The cause? Apple’s sandbox restrictions.&lt;/p&gt;

&lt;p&gt;The only way around it was to skip the App Store entirely and distribute the app independently.&lt;/p&gt;

&lt;p&gt;But before that, let me tell you why I built Picmal in the first place. The idea came from a daily frustration: opening a browser, finding an online converter, uploading images, waiting for them to process in the cloud, and then downloading them again. I wanted something simple, fast, and offline.&lt;/p&gt;

&lt;p&gt;So I decided to make it native, even though I had never built a fully native app before. That was challenge number one. Challenge number two was finding a smooth way to share it without the App Store.&lt;/p&gt;

&lt;p&gt;After some research, I discovered &lt;a href="https://gumroad.com" rel="noopener noreferrer"&gt;Gumroad&lt;/a&gt;. It turned out to be the simplest way to sell and distribute my app directly. Here’s how I did it:&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Build and Export the App from Xcode
&lt;/h2&gt;

&lt;p&gt;Once your app is ready for release, do the following:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftn2b334eocq74sxtyi5f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftn2b334eocq74sxtyi5f.png" alt="Xcode direct distribution option for exporting macOS app outside App Store" width="800" height="524"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In Xcode, go to &lt;strong&gt;Product &amp;gt; Archive&lt;/strong&gt;. Select the method &lt;strong&gt;"Direct distribution"&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Wait until the build status shows &lt;strong&gt;"Ready for Distribution"&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click on &lt;strong&gt;"Export"&lt;/strong&gt; and you will export the &lt;code&gt;.app&lt;/code&gt; file.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnsvd8tsam4l7y8vcwr2a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnsvd8tsam4l7y8vcwr2a.png" alt="Xcode export dialog showing app ready for distribution" width="800" height="524"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Create a DMG Installer
&lt;/h2&gt;

&lt;p&gt;To give users a better experience in order to install the app, I used &lt;a href="https://github.com/sindresorhus/create-dmg" rel="noopener noreferrer"&gt;create-dmg&lt;/a&gt;{:target="_blank"}, a simple CLI tool that outputs a polished DMG file.&lt;/p&gt;

&lt;p&gt;In the terminal you need to execute this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install create-dmg if you haven't already&lt;/span&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;create-dmg

&lt;span class="c"&gt;# Create the DMG installer&lt;/span&gt;
create-dmg &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--volname&lt;/span&gt; &lt;span class="s2"&gt;"Your App Name"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--window-pos&lt;/span&gt; 200 120 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--window-size&lt;/span&gt; 600 300 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--icon-size&lt;/span&gt; 100 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--icon&lt;/span&gt; &lt;span class="s2"&gt;"YourApp.app"&lt;/span&gt; 175 120 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--hide-extension&lt;/span&gt; &lt;span class="s2"&gt;"YourApp.app"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--app-drop-link&lt;/span&gt; 425 120 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"YourApp.dmg"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"source_folder/"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq3b9610meswra2xqrcbg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq3b9610meswra2xqrcbg.png" alt="Terminal output showing create-dmg tool generating a DMG installer for macOS app" width="800" height="544"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;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:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F26mgrcf90pgomav6p1r5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F26mgrcf90pgomav6p1r5.png" alt="macOS security warning dialog showing malware detection for unsigned app" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Notarize DMG installer
&lt;/h2&gt;

&lt;p&gt;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:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;xcrun notarytool store-credentials &lt;span class="nt"&gt;--apple-id&lt;/span&gt; &lt;span class="s2"&gt;"your-email@example.com"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--team-id&lt;/span&gt; &lt;span class="s2"&gt;"YOUR_TEAM_ID_HERE"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--password&lt;/span&gt; &lt;span class="s2"&gt;"your-app-specific-password"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  your-app-profile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The password you use here must be an &lt;a href="https://support.apple.com/en-us/102654" rel="noopener noreferrer"&gt;app-specific password&lt;/a&gt; generated from your Apple ID account. Regular Apple ID passwords will not work for notarization. If you haven't created one before, follow &lt;a href="https://support.apple.com/en-us/102654" rel="noopener noreferrer"&gt;Apple's instructions&lt;/a&gt; to generate an app-specific password for use with &lt;code&gt;notarytool&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After creating the profile you need to notarize the DMG file with your newly created profile:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;xcrun notarytool submit YourApp.dmg &lt;span class="nt"&gt;--keychain-profile&lt;/span&gt; &lt;span class="s2"&gt;"your-app-profile"&lt;/span&gt; &lt;span class="nt"&gt;--wait&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you need to staple the DMG:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;xcrun stapler staple YourApp.dmg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And finally you are almost ready, just to check that this process has worked, you can check it in your terminal using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spctl &lt;span class="nt"&gt;--assess&lt;/span&gt; &lt;span class="nt"&gt;--type&lt;/span&gt; open &lt;span class="nt"&gt;--context&lt;/span&gt; context:primary-signature &lt;span class="nt"&gt;-v&lt;/span&gt; YourApp.dmg

&lt;span class="c"&gt;# Expected output:&lt;/span&gt;
&lt;span class="c"&gt;# YourApp.dmg: accepted&lt;/span&gt;
&lt;span class="c"&gt;# source=Notarized Developer ID&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you see something like this message, you’re done. You can upload your DMG to Gumroad (or wherever you prefer) and start selling.&lt;/p&gt;

</description>
      <category>swift</category>
      <category>appstore</category>
      <category>tutorial</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
