<?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: PermitCore</title>
    <description>The latest articles on DEV Community by PermitCore (@permitcore).</description>
    <link>https://dev.to/permitcore</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4119717%2F8a675fea-fa4b-4688-b41b-64247900bc69.png</url>
      <title>DEV Community: PermitCore</title>
      <link>https://dev.to/permitcore</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/permitcore"/>
    <language>en</language>
    <item>
      <title>Offline licensing for a Python desktop app without calling home on every launch</title>
      <dc:creator>PermitCore</dc:creator>
      <pubDate>Tue, 29 Sep 2026 18:48:19 +0000</pubDate>
      <link>https://dev.to/permitcore/offline-licensing-for-a-python-desktop-app-without-calling-home-on-every-launch-292</link>
      <guid>https://dev.to/permitcore/offline-licensing-for-a-python-desktop-app-without-calling-home-on-every-launch-292</guid>
      <description>&lt;p&gt;Some desktop applications cannot depend on an internet connection every time they start. The useful security model in that case is not to hide a shared secret inside the Python package. It is to verify a signed license token locally with a public key.&lt;/p&gt;

&lt;p&gt;The server keeps the private signing key. The application receives only the public verification key, so it can verify authenticity without gaining the ability to create new valid licenses.&lt;/p&gt;

&lt;p&gt;I wrote a practical PermitCore guide for this flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;permitcore[offline]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On the first run, verify the signed token and bind it to the device:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;permitcore&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;PermitCoreClient&lt;/span&gt;

&lt;span class="n"&gt;activated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PermitCoreClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;activate_offline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;public_key_base64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;device_id&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;activated&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_valid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;activated&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Later launches can validate the stored activation locally, with zero network calls:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PermitCoreClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;validate_offline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;device_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A good test is to change one character in the activation token and confirm that signature verification fails. I would also test expired tokens, the wrong device, a missing local cache, and the customer workflow for moving to replacement hardware.&lt;/p&gt;

&lt;p&gt;For device identity, avoid treating a raw MAC address as a permanent machine ID. It can change, it is privacy-sensitive, and virtual/network adapters make it unreliable. Use a stable identifier appropriate for the platform and define an explicit transfer policy.&lt;/p&gt;

&lt;p&gt;The same product can then be published in PermitCore's built-in Store. The Store uses your Stripe account, takes 0% PermitCore commission, and delivers the license after checkout. That completes the full &lt;strong&gt;create → implement → sell&lt;/strong&gt; path even for an offline-ready desktop edition.&lt;/p&gt;

&lt;h2&gt;
  
  
  Full walkthrough
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://permitcore.dev/tutorials/offline-licensing-python" rel="noopener noreferrer"&gt;How to add offline licensing to a Python desktop app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://permitcore.dev" rel="noopener noreferrer"&gt;PermitCore&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PermitCore is an early-stage developer-first startup, so feedback on the offline workflow and the guide is very welcome. 🙂🚀&lt;/p&gt;

</description>
      <category>python</category>
      <category>security</category>
      <category>tutorial</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Where license validation belongs in an Electron app</title>
      <dc:creator>PermitCore</dc:creator>
      <pubDate>Tue, 29 Sep 2026 18:47:25 +0000</pubDate>
      <link>https://dev.to/permitcore/where-license-validation-belongs-in-an-electron-app-2on8</link>
      <guid>https://dev.to/permitcore/where-license-validation-belongs-in-an-electron-app-2on8</guid>
      <description>&lt;p&gt;If an Electron app checks its license in renderer code, a customer can inspect the same code that makes the allow-or-block decision. That does not make the app impossible to protect, but it puts an important decision in the easiest process to inspect and modify.&lt;/p&gt;

&lt;p&gt;For a paid Electron app, I prefer this boundary:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;validate in the main process;&lt;/li&gt;
&lt;li&gt;keep &lt;code&gt;contextIsolation&lt;/code&gt; enabled;&lt;/li&gt;
&lt;li&gt;expose only the minimum license status through a narrow preload/IPC API;&lt;/li&gt;
&lt;li&gt;scope every validation request to the product ID;&lt;/li&gt;
&lt;li&gt;test the packaged build, not only development mode.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The core integration can remain straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;electron&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;PermitCoreClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@permitcore/permitcore&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;PermitCoreClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.permitcore.dev&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;licenseKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getVersion&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="nx"&gt;productId&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isValid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;quit&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I wrote a complete walkthrough covering installation, activation, product-scoped validation, offline grace, revoked-key testing, and the main-process/renderer boundary.&lt;/p&gt;

&lt;p&gt;It also covers the step that licensing tutorials often omit: selling the application. PermitCore includes a branded Store, so the same product can have a checkout that uses your Stripe account, creates the license after payment, and delivers it to the customer. PermitCore takes 0% sales commission.&lt;/p&gt;

&lt;p&gt;The intended workflow is &lt;strong&gt;create → implement → sell&lt;/strong&gt;, without maintaining a separate storefront and webhook bridge just to issue keys.&lt;/p&gt;

&lt;h2&gt;
  
  
  Full walkthrough
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://permitcore.dev/tutorials/license-sell-electron-app" rel="noopener noreferrer"&gt;How to license and sell an Electron app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://permitcore.dev" rel="noopener noreferrer"&gt;PermitCore&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you ship Electron applications, I would be interested to hear how you currently separate licensing logic from renderer code and how you handle offline customers. 🙂🚀&lt;/p&gt;

</description>
      <category>electron</category>
      <category>javascript</category>
      <category>security</category>
      <category>node</category>
    </item>
    <item>
      <title>A practical license-key flow for a .NET desktop app, including the sale</title>
      <dc:creator>PermitCore</dc:creator>
      <pubDate>Tue, 29 Sep 2026 18:41:28 +0000</pubDate>
      <link>https://dev.to/permitcore/a-practical-license-key-flow-for-a-net-desktop-app-including-the-sale-a1j</link>
      <guid>https://dev.to/permitcore/a-practical-license-key-flow-for-a-net-desktop-app-including-the-sale-a1j</guid>
      <description>&lt;p&gt;Adding a license check to a .NET desktop app is easy to underestimate. The first API call is usually the simple part. Production behavior is where the real work begins: product scoping, device activation, offline grace, license transfer, failed payments, and getting the key into the customer's hands.&lt;/p&gt;

&lt;p&gt;I put together a .NET tutorial that treats licensing as a complete product flow rather than one &lt;code&gt;IsValid&lt;/code&gt; check.&lt;/p&gt;

&lt;p&gt;Install the client:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet add package PermitCore.Client
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then validate the key against the application version and the exact product:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;PermitCore&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Reflection&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;PermitCoreClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"https://api.permitcore.dev"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Assembly&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetEntryAssembly&lt;/span&gt;&lt;span class="p"&gt;()?.&lt;/span&gt;&lt;span class="nf"&gt;GetName&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;Version&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="s"&gt;"1.0.0"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ValidateAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;licenseKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;expectedProductId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;productId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsValid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;ShowActivationWindow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before shipping, I would test at least these cases in the packaged application:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the correct license and product;&lt;/li&gt;
&lt;li&gt;a valid license for a different product;&lt;/li&gt;
&lt;li&gt;an expired or revoked license;&lt;/li&gt;
&lt;li&gt;a device over its activation limit;&lt;/li&gt;
&lt;li&gt;a temporary network failure while offline grace is available;&lt;/li&gt;
&lt;li&gt;releasing an activation and moving the license to another computer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The tutorial also finishes the commercial side. You can create a matching Store product, use one-time or recurring Stripe pricing, and have checkout generate and email the license. PermitCore uses the vendor's Stripe account and takes 0% PermitCore commission.&lt;/p&gt;

&lt;p&gt;That is the distinction I wanted when building it: developers can &lt;strong&gt;create the license, implement it, and sell the software&lt;/strong&gt; without maintaining a separate checkout-to-license webhook system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Full walkthrough
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://permitcore.dev/tutorials/add-license-keys-dotnet" rel="noopener noreferrer"&gt;How to add license keys to a .NET application&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://permitcore.dev" rel="noopener noreferrer"&gt;PermitCore&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is still an early-stage startup and I would especially appreciate feedback from people who ship WPF, WinUI, Avalonia, MAUI, or other desktop applications. 🙂🚀&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>csharp</category>
      <category>security</category>
      <category>showdev</category>
    </item>
    <item>
      <title>How I added licensing and checkout to a Unity project without building two more systems</title>
      <dc:creator>PermitCore</dc:creator>
      <pubDate>Tue, 29 Sep 2026 18:29:54 +0000</pubDate>
      <link>https://dev.to/permitcore/how-i-added-licensing-and-checkout-to-a-unity-project-without-building-two-more-systems-1ak9</link>
      <guid>https://dev.to/permitcore/how-i-added-licensing-and-checkout-to-a-unity-project-without-building-two-more-systems-1ak9</guid>
      <description>&lt;p&gt;When I started working on software licensing, the part that bothered me was not only validating a key. A paid Unity game or asset needs the whole path: a product, a license policy, SDK integration, payment, and finally a way to deliver the right key to the customer.&lt;/p&gt;

&lt;p&gt;Most licensing services stop after validation. You still need to connect a separate storefront, handle payment webhooks, generate the license, and send it to the buyer. That can become a second product to maintain before the actual game or tool has made its first sale.&lt;/p&gt;

&lt;p&gt;I wrote a practical Unity guide showing the complete flow with PermitCore:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a product and choose device, version, and offline rules.&lt;/li&gt;
&lt;li&gt;Install the Unity SDK through Package Manager.&lt;/li&gt;
&lt;li&gt;Validate the license against the expected product ID.&lt;/li&gt;
&lt;li&gt;Test revoked, expired, wrong-product, and activation-limit responses.&lt;/li&gt;
&lt;li&gt;Publish the same product in a branded Store, connect your Stripe account, and let checkout issue and deliver the license automatically.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The integration itself stays small:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;PermitCore&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;UnityEngine&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;PermitCoreClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"https://api.permitcore.dev"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ValidateAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;licenseKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;productId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsValid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;ShowLicenseScreen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important detail is &lt;code&gt;productId&lt;/code&gt;. A structurally valid key should not unlock the wrong game, asset, edition, or DLC. I also recommend testing a revoked key in the actual release build rather than stopping after the happy path works in the editor.&lt;/p&gt;

&lt;p&gt;PermitCore's Store uses your own Stripe account and takes 0% PermitCore sales commission. The goal is to keep licensing and selling in one workflow: &lt;strong&gt;create → implement → sell&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Full walkthrough
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://permitcore.dev/tutorials/sell-unity-game-asset-licenses" rel="noopener noreferrer"&gt;How to sell licenses for a Unity game or asset&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://permitcore.dev" rel="noopener noreferrer"&gt;PermitCore&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I am building this as a small developer-first startup, so feedback from Unity developers is very welcome. If something in the guide is unclear, you can reach me through Contact Us on the site. 🙂🚀&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>csharp</category>
      <category>tutorial</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Why a licensing API is only half of the product</title>
      <dc:creator>PermitCore</dc:creator>
      <pubDate>Mon, 21 Sep 2026 18:13:51 +0000</pubDate>
      <link>https://dev.to/permitcore/why-a-licensing-api-is-only-half-of-the-product-2nme</link>
      <guid>https://dev.to/permitcore/why-a-licensing-api-is-only-half-of-the-product-2nme</guid>
      <description>&lt;p&gt;When we first looked at software licensing, the problem seemed straightforward: create a license key, validate it inside the application, and manage activations.&lt;/p&gt;

&lt;p&gt;Then we reached the part where somebody actually has to buy the license.&lt;/p&gt;

&lt;p&gt;That turns licensing into a much larger project. You need a product page, pricing, checkout, payment verification, customers, orders, subscriptions, license fulfillment, delivery, and somewhere for the customer to find what they purchased. The license API may be ready, but the commercial workflow is still another product to build and maintain.&lt;/p&gt;

&lt;p&gt;That is the gap we are trying to close with PermitCore.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create → implement → sell
&lt;/h2&gt;

&lt;p&gt;PermitCore connects the full workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a product and define its license rules.&lt;/li&gt;
&lt;li&gt;Add validation with the REST API or one of eight official SDKs: .NET, Node.js, Python, Java, C++, PHP, Go, and Unity.&lt;/li&gt;
&lt;li&gt;Publish the product in a customer-facing Store under your own brand.&lt;/li&gt;
&lt;li&gt;Accept payment through your connected Stripe account.&lt;/li&gt;
&lt;li&gt;Generate and deliver the working license automatically after checkout.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Products, prices, orders, customers, subscriptions, entitlements, and licenses stay connected instead of being split across a licensing dashboard, a custom checkout service, and several webhook handlers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why we made the Store part of licensing
&lt;/h2&gt;

&lt;p&gt;Many licensing platforms treat commerce as an integration boundary.&lt;/p&gt;

&lt;p&gt;For example, Keygen documents a Stripe flow where Stripe communicates with the licensing service through webhooks. LicenseSpring connects license fulfillment to services such as Stripe, FastSpring, and Shopify. Those are valid approaches, especially if a team already has a mature commerce stack.&lt;/p&gt;

&lt;p&gt;But for an indie developer or a small software team, the missing checkout and fulfillment layer can become a second application. It has its own security work, failure states, support burden, and maintenance cost.&lt;/p&gt;

&lt;p&gt;PermitCore takes a different approach: the Store is part of the licensing product. A vendor can go from defining a license to publishing the product for sale without building a separate commerce backend.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your Stripe account, 0% PermitCore commission
&lt;/h2&gt;

&lt;p&gt;Payments go directly through the vendor's connected Stripe account. PermitCore does not take a percentage of software sales.&lt;/p&gt;

&lt;p&gt;That means the Store removes integration work without becoming a marketplace that sits between the vendor and the customer. Stripe still handles the payment relationship, while PermitCore connects a successful checkout to the correct order, entitlement, and license delivery.&lt;/p&gt;

&lt;h2&gt;
  
  
  When a separate commerce platform still makes sense
&lt;/h2&gt;

&lt;p&gt;The built-in Store will not be the right answer for every business. If you already run a large Shopify, WooCommerce, or custom commerce operation, keeping that system and connecting fulfillment may make more sense.&lt;/p&gt;

&lt;p&gt;Our goal is to give developers a complete default path when they do not want to build that entire layer themselves.&lt;/p&gt;

&lt;p&gt;We are still a startup and continuing to produce documentation and videos, so our social channels are smaller than the product today. If you need anything while evaluating PermitCore, use the Contact Us page and we will help directly.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://permitcore.dev" rel="noopener noreferrer"&gt;https://permitcore.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Store overview: &lt;a href="https://permitcore.dev/solutions/sell-license-keys" rel="noopener noreferrer"&gt;https://permitcore.dev/solutions/sell-license-keys&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Product video: &lt;a href="https://www.youtube.com/watch?v=148yf66x9IM" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=148yf66x9IM&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;YouTube: &lt;a href="https://www.youtube.com/@PermitCore" rel="noopener noreferrer"&gt;https://www.youtube.com/@PermitCore&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;X: &lt;a href="https://x.com/permitcore" rel="noopener noreferrer"&gt;https://x.com/permitcore&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How are you handling this in your own products: a custom checkout, an external commerce platform, or one connected licensing and sales workflow?&lt;/p&gt;

&lt;p&gt;🙂🚀&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>saas</category>
      <category>webdev</category>
      <category>security</category>
    </item>
    <item>
      <title>Why we built PermitCore: software licensing shouldn’t become a second product</title>
      <dc:creator>PermitCore</dc:creator>
      <pubDate>Thu, 10 Sep 2026 17:41:53 +0000</pubDate>
      <link>https://dev.to/permitcore/why-we-built-permitcore-software-licensing-shouldnt-become-a-second-product-21p6</link>
      <guid>https://dev.to/permitcore/why-we-built-permitcore-software-licensing-shouldnt-become-a-second-product-21p6</guid>
      <description>&lt;p&gt;Hey DEV community,&lt;/p&gt;

&lt;p&gt;I want to introduce &lt;strong&gt;PermitCore&lt;/strong&gt;, a software licensing platform we built for independent developers and software teams.&lt;/p&gt;

&lt;p&gt;The idea came from a problem we kept running into ourselves. Whenever we built software that needed licensing, we also had to build and maintain a separate system for license keys, device activations, expiration rules and customer access.&lt;/p&gt;

&lt;p&gt;That infrastructure quickly started feeling like another product we had to maintain.&lt;/p&gt;

&lt;p&gt;So we built PermitCore to handle it.&lt;/p&gt;

&lt;p&gt;PermitCore currently supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;License key creation and management&lt;/li&gt;
&lt;li&gt;Device activation limits&lt;/li&gt;
&lt;li&gt;Expiration and revocation&lt;/li&gt;
&lt;li&gt;Offline license validation&lt;/li&gt;
&lt;li&gt;Floating licenses and concurrent seats&lt;/li&gt;
&lt;li&gt;Entitlements and feature access&lt;/li&gt;
&lt;li&gt;Customer and reseller portals&lt;/li&gt;
&lt;li&gt;Payments and webhooks&lt;/li&gt;
&lt;li&gt;Zero-knowledge encryption&lt;/li&gt;
&lt;li&gt;A REST API and SDKs for .NET, Node.js, Python, Java, C++, PHP, Go and Unity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is a &lt;strong&gt;free plan that stays free&lt;/strong&gt;, because we want indie developers to have something useful while getting their first products off the ground. We also offer a &lt;strong&gt;three-month free trial&lt;/strong&gt; for anyone who wants to test the wider feature set without commitment.&lt;/p&gt;

&lt;p&gt;PermitCore is still an early startup, and we’re continuing to improve both the product and our documentation. Our social channels are also fairly new, so I hope you won’t mind that there isn’t a huge amount of content there yet.&lt;/p&gt;

&lt;p&gt;I’d really appreciate feedback from developers who have built licensing systems before or are currently deciding how to protect and sell their software.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://permitcore.dev" rel="noopener noreferrer"&gt;https://permitcore.dev&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Documentation:&lt;/strong&gt; &lt;a href="https://permitcore.dev/docs/getting-started" rel="noopener noreferrer"&gt;https://permitcore.dev/docs/getting-started&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;YouTube:&lt;/strong&gt; &lt;a href="https://www.youtube.com/@PermitCore" rel="noopener noreferrer"&gt;https://www.youtube.com/@PermitCore&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;X:&lt;/strong&gt; &lt;a href="https://x.com/permitcore" rel="noopener noreferrer"&gt;https://x.com/permitcore&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;If you have any questions or need help integrating it, feel free to reach us through the &lt;strong&gt;Contact Us&lt;/strong&gt; page on the website.&lt;/p&gt;

&lt;p&gt;Thanks for taking a look 🙂 👋&lt;/p&gt;

</description>
      <category>saas</category>
      <category>showdev</category>
      <category>security</category>
      <category>api</category>
    </item>
  </channel>
</rss>
