<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://kankoda.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://kankoda.com/" rel="alternate" type="text/html" /><updated>2026-03-30T10:05:58+00:00</updated><id>https://kankoda.com/feed.xml</id><title type="html">Kankoda</title><subtitle>Kankoda builds apps and products for iOS, iPadOS, tvOS, macOS and watchOS, using technologies like Swift, SwiftUI and Swift Package Manager. </subtitle><entry><title type="html">KeyboardKit - Brand Redesign In Progress</title><link href="https://kankoda.com/blog/2026/03/30/brand-redesign-in-progress" rel="alternate" type="text/html" title="KeyboardKit - Brand Redesign In Progress" /><published>2026-03-30T07:00:00+00:00</published><updated>2026-03-30T07:00:00+00:00</updated><id>https://kankoda.com/blog/2026/03/30/brand-redesign-in-progress</id><content type="html" xml:base="https://kankoda.com/blog/2026/03/30/brand-redesign-in-progress"><![CDATA[<p>KeyboardKit is getting a new icon! We’re moving from a glowing keyboard key to an abstract design with two Ks on a gradient background that carries over from the old icon.</p>

<p><img src="/assets/blog/26/0330/image.jpg" alt="Post Image" /></p>

<h2 id="the-previous-design">The previous design</h2>

<p>The previous icon has been with us for a while. Designed by digital artist <a href="https://matthewskiles.com">Matthew Skiles</a>, it added a glass-like, glowing design to the original, plain keyboard key design.</p>

<p><img src="/assets/icon-old/icon-header.png" alt="Old Icon" width="300" class="plain" /></p>

<p>While we absolutely loved this design, we have struggled with explaining what the A in the old icon stands for. All attempts to tweak it to better communicate KeyboardKit have been unsuccessful.</p>

<h2 id="the-new-design">The new design</h2>

<p>The new design takes a more abstract approach. Rather than having a literal keyboard key, it has two discrete, K-like glass-shapes set against the gradient background from the previous icon.</p>

<p><img src="/assets/icon/header.png" alt="New Icon" width="300" class="plain" /></p>

<p>This design lets us carry over the color identity from the original icon and stay true to the brand’s visual roots, while taking the brand in a new, exciting direction.</p>

<h2 id="implementation">Implementation</h2>

<p>The new icon is a work in progress. We’re trying it out in the open rather than waiting for a perfect result behind closed doors, and we expect to tweak it as we see how it looks in different contexts.</p>

<p>As such, you may find that the previous icon is still being used in some places. We’ll update these as the rollout continues, and would love to hear what you think.</p>]]></content><author><name>danielsaidi</name></author><category term="sdks" /><category term="keyboardkit" /><summary type="html"><![CDATA[KeyboardKit is getting a new icon! We’re moving from a glowing keyboard key to an abstract design with two Ks on a gradient background that carries over from the old icon.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kankoda.com/assets/blog/26/0330/image.jpg" /><media:content medium="image" url="https://kankoda.com/assets/blog/26/0330/image.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Wally 5.3 is out</title><link href="https://kankoda.com/blog/2025/07/10/wally-5-3" rel="alternate" type="text/html" title="Wally 5.3 is out" /><published>2025-07-10T06:00:00+00:00</published><updated>2025-07-10T06:00:00+00:00</updated><id>https://kankoda.com/blog/2025/07/10/wally-5-3</id><content type="html" xml:base="https://kankoda.com/blog/2025/07/10/wally-5-3"><![CDATA[<p>Wally 5.3 is out, with support for custom fonts, a new denim skin, and a corduroy skin collection! It also makes it easier to customize the main menu.</p>

<p><img src="/assets/headers/apps/wally_5_3.jpg" alt="Blog post header" /></p>

<p>Wally 5.3 lets you pick a custom font for navigation titles and decorative texts. You can pick between two hand-drawn fonts, a font for dyslexia, and all system fonts.</p>

<p>This version also adds a new denim skin and a brand new corduroy skin collection with four skins.</p>

<p>You can read more about this update on the <a href="https://wally.app/blog/2025/07/10/wally-5-3">Wally website</a></p>]]></content><author><name>danielsaidi</name></author><category term="apps" /><summary type="html"><![CDATA[Wally 5.3 is out, with support for custom fonts, a new denim skin, and a corduroy skin collection! It also makes it easier to customize the main menu.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kankoda.com/assets/headers/apps/wally_5_3.jpg" /><media:content medium="image" url="https://kankoda.com/assets/headers/apps/wally_5_3.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">New app versions</title><link href="https://kankoda.com/blog/2025/05/29/new-app-versions" rel="alternate" type="text/html" title="New app versions" /><published>2025-05-29T06:00:00+00:00</published><updated>2025-05-29T06:00:00+00:00</updated><id>https://kankoda.com/blog/2025/05/29/new-app-versions</id><content type="html" xml:base="https://kankoda.com/blog/2025/05/29/new-app-versions"><![CDATA[<p>Kankoda has released brand new versions of several of our apps, including KeyboardKit, Wally, and EmojiKit. These updates adds new features and fixes some bugs and minor flaws.</p>

<p><img src="/assets/headers/kankoda.jpg" alt="Blog post header" /></p>

<h2 id="emoji-picker">Emoji Picker</h2>

<p>Emoji Picker 1.4 adds a new, adorable icon/mascot. Picky fits right into your dock and home screen, and brightens your day with a smile. The app also improves performance, and keyboard navigation.</p>

<h2 id="keyboardkit">KeyboardKit</h2>

<p>The KeyboardKit app improves the theme editor. You can now long press any color picker to copy and paste colors. The app also fixes some theme bugs.</p>

<h2 id="one-touch-paste">One Touch Paste</h2>

<p>One Touch Paste 1.6 improves the keyboard performance, adds support for many new languages (73 in total), and adds support for Emoji 16. English autocorrection is also drastically improved.</p>

<h2 id="wally">Wally</h2>

<p>Wally 5.2 lets you scan things to quickly add them to your wallet. Just snap a photo of your card, ID, etc. and Wally will automatically extract it from the photo. The app also adds a quick-edit mode.</p>

<h2 id="conclusion">Conclusion</h2>

<p>These app updates are nice improvements that polish the overall in-app experience. Download the apps from the <a href="https://apps.apple.com/us/developer/kankoda-sweden-ab/id516398918">the Kankoda App Store page</a> and let us know what you think.</p>

<section class="app-store-button noselect" style="text-align: center;">
  <a href="https://apps.apple.com/us/developer/kankoda-sweden-ab/id516398918">
    <img src="/assets/app-store.png" alt="App Store badge" title="Download on the App Store" class="" />
  </a>
</section>]]></content><author><name>danielsaidi</name></author><category term="apps" /><summary type="html"><![CDATA[Kankoda has released brand new versions of several of our apps, including KeyboardKit, Wally, and EmojiKit. These updates adds new features and fixes some bugs and minor flaws.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kankoda.com/assets/headers/kankoda.jpg" /><media:content medium="image" url="https://kankoda.com/assets/headers/kankoda.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">New SDK - Vietnamese Input</title><link href="https://kankoda.com/blog/2025/05/29/new-sdk-vietnamese-input" rel="alternate" type="text/html" title="New SDK - Vietnamese Input" /><published>2025-05-29T06:00:00+00:00</published><updated>2025-05-29T06:00:00+00:00</updated><id>https://kankoda.com/blog/2025/05/29/new-sdk-vietnamese-input</id><content type="html" xml:base="https://kankoda.com/blog/2025/05/29/new-sdk-vietnamese-input"><![CDATA[<p>Kankoda has released a brand new SDK called <a href="/sdks/vietnameseinput">Vietnamese Input</a>, which brings Vietnamese input support with TELEX, VNI &amp; VIQR to all Apple platforms.</p>

<p><img src="/assets/blog/25/0608/image.jpg" alt="Blog post header" /></p>

<p>Vietnamese Input has been extracted from <a href="https://keyboardkit.com">KeyboardKit Pro</a>’s Vietnamese typing support, and has improved the input logic a great deal.</p>

<p>The SDK has an input engine that lets you type a sequence of characters into a string, using any of the three main input methods - TELEX, VNI &amp; VIQR - without switching to a Vietnamese keyboard.</p>

<p>Vietnamese Input works on iOS, iPadOS, macOS, tvOS, visionOS, and watchOS, and can be used in both apps and SDKs.</p>

<h2 id="commercial-license">Commercial License</h2>

<p><a href="/sdks/vietnameseinput">Vietnamese Input</a> requires a commercial license to be used. We’re currently working on getting it up on Paddle. Until this is done, you can <a href="mailto:info@kankoda.com">reach out</a> to sign up for a license with regular invoicing.</p>]]></content><author><name>danielsaidi</name></author><category term="sdks" /><category term="vietnamese-input" /><summary type="html"><![CDATA[Kankoda has released a brand new SDK called Vietnamese Input, which brings Vietnamese input support with TELEX, VNI &amp; VIQR to all Apple platforms.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kankoda.com/assets/blog/25/0608/image.jpg" /><media:content medium="image" url="https://kankoda.com/assets/blog/25/0608/image.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Using LicenseKit to protect your apps &amp;amp; libraries with commercial licenses</title><link href="https://kankoda.com/blog/2025/04/24/using-licensekit-to-protect-your-apps-and-libraries-with-commercial-licenses" rel="alternate" type="text/html" title="Using LicenseKit to protect your apps &amp;amp; libraries with commercial licenses" /><published>2025-04-24T06:00:00+00:00</published><updated>2025-04-24T06:00:00+00:00</updated><id>https://kankoda.com/blog/2025/04/24/using-licensekit-to-protect-your-apps-and-libraries-with-commercial-licenses</id><content type="html" xml:base="https://kankoda.com/blog/2025/04/24/using-licensekit-to-protect-your-apps-and-libraries-with-commercial-licenses"><![CDATA[<p>This article describes how you can use <a href="/sdks/licensekit">LicenseKit by Kankoda</a> to protect your apps &amp; libraries with commercial licenses on all major Apple platforms (iOS, macOS, tvOS, watchOS &amp; visionOS).</p>

<p><img src="/assets/blog/25/0424/header.jpg" alt="Blog header" /></p>

<h2 id="what-is-licensekit">What is LicenseKit?</h2>

<p>LicenseKit is a Swift SDK that lets you protect your software with commercial licenses. You can use it with boths apps and libraries, to require users to purchase a license in order to use your software.</p>

<p>LicenseKit lets you define licenses in code, read licenses from plain or encrypted files, fetch licenses from any custom APIs, and integrate with services like <a href="https://gumroad.com">Gumroad</a>, <a href="https://paddle.com">Paddle</a> and <a href="https://lemonsqueezy.com">Lemon Squeezy</a>.</p>

<p>LicenseKit can validate expiration date, platform, bundle ID, tier, environment, features, etc. It also lets you handle temporary connectivity loss, and combine many data sources for flexible validation.</p>

<p>LicenseKit is free to start using, using the limited “FREE” license key, and affordable to scale. You can then purchase a license or try out a free, unlimited trial from the <a href="/sdks/licensekit">LicenseKit website</a>.</p>

<h2 id="getting-started">Getting Started</h2>

<p>With LicenseKit, first create a <code class="language-plaintext highlighter-rouge">LicenseEngine</code> with the license key that you get when you sign up for LicenseKit, and define which <code class="language-plaintext highlighter-rouge">LicenseServiceType</code> you want to use to use to fetch customer licenses.</p>

<p>For instance, this would create a license engine with two licenses that are defined with source code and that will be validated on-device:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">let</span> <span class="nv">licenseEngine</span> <span class="o">=</span> <span class="k">try</span> <span class="k">await</span> <span class="kt">LicenseEngine</span><span class="p">(</span>
    <span class="nv">licenseKey</span><span class="p">:</span> <span class="s">"your-license-key"</span><span class="p">,</span>
    <span class="nv">licenseService</span><span class="p">:</span> <span class="p">{</span> <span class="o">.</span><span class="nf">binary</span><span class="p">(</span>
        <span class="nv">licenses</span><span class="p">:</span> <span class="p">[</span>
            <span class="kt">License</span><span class="p">(</span><span class="nv">licenseKey</span><span class="p">:</span> <span class="s">"license-key-1"</span><span class="p">,</span> <span class="o">...</span><span class="p">),</span>
            <span class="kt">License</span><span class="p">(</span><span class="nv">licenseKey</span><span class="p">:</span> <span class="s">"license-key-2"</span><span class="p">,</span> <span class="o">...</span><span class="p">)</span>
        <span class="p">]</span>
    <span class="p">)}</span>
<span class="p">)</span>
</code></pre></div></div>

<p>There are many service types to choose from, as described in the <a href="https://kankoda.github.io/LicenseKit">documentation</a>. You can define a license collection with source code, read licenses from plain or encrypted files, fetch licenses from a custom API, integrate with services like <a href="https://gumroad.com">Gumroad</a>, <a href="https://paddle.com">Paddle</a> and <a href="https://lemonsqueezy.com">Lemon Squeezy</a>, etc.</p>

<p>Once you have an engine, you can use its <code class="language-plaintext highlighter-rouge">getLicense(withKey:)</code> function to get &amp; validate customer licenses by providing a way for your customers to enter <em>their</em> license key.</p>

<p>An app can have a UI for this, while a library can have a well-defined, central setup/unlock function:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Place this kind of function in your library, where it makes sense. </span>
<span class="c1">// You don't need a license key when you use encrypted license files.</span>
<span class="kd">public</span> <span class="kd">static</span> <span class="kd">func</span> <span class="nf">unlock</span><span class="p">(</span>
    <span class="n">withLicenseKey</span> <span class="nv">key</span><span class="p">:</span> <span class="kt">String</span>
<span class="p">)</span> <span class="k">async</span> <span class="k">throws</span> <span class="p">{</span>
    <span class="k">let</span> <span class="nv">license</span> <span class="o">=</span> <span class="k">try</span> <span class="k">await</span> <span class="n">engine</span><span class="o">.</span><span class="nf">getLicense</span><span class="p">(</span><span class="nv">for</span><span class="p">:</span> <span class="s">"license-key-1"</span><span class="p">)</span>
    <span class="c1">// Perform further license validations, if needed.</span>
    <span class="c1">// Set up your app/SDK with the license, if it's valid.</span>
    <span class="c1">// Store the license for the current session, etc.</span>
<span class="p">}</span>
</code></pre></div></div>

<p>The engine will fetch licenses with the service(s) you defined, then validate any matching license for the current platform, bundle, and date. You can perform more validations after getting the license.</p>

<h2 id="license-validation">License Validation</h2>

<p>The <code class="language-plaintext highlighter-rouge">LicenseEngine</code> will automatically validate any fetched license for the current platform, product bundle and date, and will throw a <code class="language-plaintext highlighter-rouge">License.ValidationError</code> if a license isn’t valid for the app/library.</p>

<p>This means that any license that the engine returns to you <em>is</em> valid for the current app/library. You can then perform additional validations to ensure that a license meets any additional requirements.</p>

<p>For instance, you can define a custom <code class="language-plaintext highlighter-rouge">LicenseFeature</code> and make sure that a license can access it:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">enum</span> <span class="kt">MyLibraryFeature</span><span class="p">:</span> <span class="kt">String</span><span class="p">,</span> <span class="kt">LicenseFeature</span> <span class="p">{</span>

    <span class="c1">// Define various features that your app/library provides.</span>
    <span class="k">case</span> <span class="n">maps</span><span class="p">,</span> <span class="n">weather</span><span class="p">,</span> <span class="o">...</span>

    <span class="c1">// A feature ID should be returned for all features.</span>
    <span class="c1">// It's optional since some enums may not handle all cases as features.</span>
    <span class="k">var</span> <span class="nv">featureId</span><span class="p">:</span> <span class="kt">String</span><span class="p">?</span> <span class="p">{</span> <span class="n">rawValue</span> <span class="p">}</span>

    <span class="c1">// You can validate a feature either directly, or implicitly by tier.</span>
    <span class="k">var</span> <span class="nv">unlockedByTier</span><span class="p">:</span> <span class="kt">License</span><span class="o">.</span><span class="kt">Tier</span><span class="p">?</span> <span class="p">{</span>
        <span class="k">switch</span> <span class="k">self</span> <span class="p">{</span>
        <span class="k">case</span> <span class="o">.</span><span class="nv">maps</span><span class="p">:</span> <span class="k">return</span> <span class="o">.</span><span class="n">silver</span>
        <span class="k">case</span> <span class="o">.</span><span class="nv">weather</span><span class="p">:</span> <span class="k">return</span> <span class="o">.</span><span class="n">gold</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>You can then validate these features when creating certain types, and throw an error if the current license doesn’t have the right access to that specific feature:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">class</span> <span class="kt">MyBasicFeature</span> <span class="p">{</span>

    <span class="c1">// Validate that an optional license is set and is valid.</span>
    <span class="kd">public</span> <span class="nf">init</span><span class="p">()</span> <span class="k">throws</span> <span class="p">{</span>
        <span class="k">try</span> <span class="kt">License</span><span class="o">.</span><span class="nf">validate</span><span class="p">(</span><span class="n">license</span><span class="p">)</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="kd">public</span> <span class="kd">class</span> <span class="kt">MyMapsFeature</span> <span class="p">{</span>

    <span class="c1">// Validate that an optional license is set and is valid,</span>
    <span class="c1">// and also gives access to the required feature.</span>
    <span class="kd">public</span> <span class="nf">init</span><span class="p">()</span> <span class="k">throws</span> <span class="p">{</span>
        <span class="k">try</span> <span class="kt">License</span><span class="o">.</span><span class="nf">validate</span><span class="p">(</span><span class="n">license</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">try</span> <span class="nv">$0</span><span class="o">.</span><span class="nf">validateFeature</span><span class="p">(</span><span class="kt">MyLibraryFeature</span><span class="o">.</span><span class="n">maps</span><span class="p">)</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>This means that you can make it impossible to create certain types in your library, or access certain features, if a license doesn’t meet certain, custom conditions.</p>

<h2 id="license-store">License Store</h2>

<p>Most apps and libraries will have a single user at a time, per running instance. For these cases, you can use a <code class="language-plaintext highlighter-rouge">LicenseStore</code> to store the current valid license in a thread-safe way.</p>

<p>For instance, consider that you have a single license store singleton for your entire app or library:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">extension</span> <span class="kt">LicenseStore</span> <span class="p">{</span>

    <span class="kd">static</span> <span class="k">var</span> <span class="nv">myLicenseStore</span> <span class="o">=</span> <span class="kt">LicenseStore</span><span class="p">()</span>
<span class="p">}</span>
</code></pre></div></div>

<p>You can then use its <code class="language-plaintext highlighter-rouge">storeLicense(_:)</code> function to store a license you receive with a license engine, or inject the store into the <code class="language-plaintext highlighter-rouge">LicenseEngine</code> to make the engine auto-persist the last fetched license:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">let</span> <span class="nv">myLicenseEngine</span> <span class="o">=</span> <span class="k">try</span> <span class="k">await</span> <span class="kt">LicenseEngine</span><span class="p">(</span>
    <span class="nv">licenseKey</span><span class="p">:</span> <span class="s">"your-license-key"</span><span class="p">,</span>
    <span class="nv">licenseStore</span><span class="p">:</span> <span class="o">.</span><span class="n">myLicenseStore</span><span class="p">,</span>
    <span class="nv">licenseService</span><span class="p">:</span> <span class="p">{</span> <span class="o">.</span><span class="nf">binary</span><span class="p">(</span>
            <span class="nv">licenses</span><span class="p">:</span> <span class="p">[</span>
                <span class="kt">License</span><span class="p">(</span><span class="nv">licenseKey</span><span class="p">:</span> <span class="s">"license-key-1"</span><span class="p">,</span> <span class="o">...</span><span class="p">),</span>
                <span class="kt">License</span><span class="p">(</span><span class="nv">licenseKey</span><span class="p">:</span> <span class="s">"license-key-2"</span><span class="p">,</span> <span class="o">...</span><span class="p">)</span>
            <span class="p">]</span>
        <span class="p">)</span>
    <span class="p">}</span>
<span class="p">)</span>
</code></pre></div></div>

<p>After performing a successful license retrieval, the engine will automatically persist the fetched and validated license. You can then use <code class="language-plaintext highlighter-rouge">License.validate(myLicenseStore.license, ...)</code> with that license, to both validate that a valid license exists, and to perform additional validations.</p>

<p>To simplify things, you can create a <code class="language-plaintext highlighter-rouge">License</code> extension to access the current license, for instance:</p>

<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">extension</span> <span class="kt">License</span> <span class="p">{</span>

    <span class="kd">static</span> <span class="k">var</span> <span class="nv">current</span><span class="p">:</span> <span class="k">Self</span><span class="p">?</span> <span class="p">{</span>
        <span class="kt">LicenseStore</span><span class="o">.</span><span class="n">myLicenseStore</span><span class="o">.</span><span class="n">license</span>
    <span class="p">}</span>
<span class="p">}</span> 
</code></pre></div></div>

<p>You can then use <code class="language-plaintext highlighter-rouge">License.validate(.current, ...)</code> without having to refer to the store in your code.</p>

<p><strong>Important!</strong> Make sure to keep your license store and engine internal, to avoid that your customers are able to access them, which could make it possible to inject fake licenses into the store.</p>

<h2 id="apps-vs-libraries">Apps vs. libraries</h2>

<p>You will have to set up your license engine and validation a bit differently when using LicenseKit in an app vs. when using it in a library.</p>

<h3 id="managing-licenses-for-an-app">Managing licenses for an app</h3>

<p>An app can create a <code class="language-plaintext highlighter-rouge">LicenseEngine</code> on launch, or whenever needed. You can then have a UI where users can enter their license key to unlock more features in the app.</p>

<p>Licenses can be used as an better alternative to in-app purchases or subscriptions, as long as you also offer any of those options. Otherwise, Apple may reject your app.</p>

<p>LicenseKit will provide pre-made license unlock screens in a future update of the library, to make it easier to add license unlocks to any app. <a href="mailto:info@kankoda.com">Reach out</a> if this is important to you, and we’ll prioritize it.</p>

<h3 id="managing-licenses-for-a-library">Managing licenses for a library</h3>

<p>A library should provide a way for developers to set up the library with their license key, or with an encrypted license file that is added to the main bundle.</p>

<h2 id="demo-apps-and-inspiration">Demo apps and inspiration</h2>

<p>Have a look at the demo app and demo library in the <a href="">LicenseKit GitHub repository</a> for examples on how to do set up LicenseKit for an app and libray.</p>

<p>LicenseKit doesn’t put any restrictions on how you use the <code class="language-plaintext highlighter-rouge">LicenseEngine</code> or <code class="language-plaintext highlighter-rouge">LicenseStore</code>, but you can use these demos for inspiration.</p>

<h2 id="further-reading">Further reading</h2>

<p>See the online documentation’s <a href="https://kankoda.github.io/LicenseKit">license article</a> for more information about the LicenseKit license model, and the <a href="https://kankoda.github.io/LicenseKit">service article</a> for more information about the available license services types.</p>]]></content><author><name>danielsaidi</name></author><category term="sdks" /><category term="licensekit" /><summary type="html"><![CDATA[This article describes how you can use LicenseKit by Kankoda to protect your apps &amp; libraries with commercial licenses on all major Apple platforms (iOS, macOS, tvOS, watchOS &amp; visionOS).]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kankoda.com/assets/blog/25/0424/image.jpg" /><media:content medium="image" url="https://kankoda.com/assets/blog/25/0424/image.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Wally 5.1 is out</title><link href="https://kankoda.com/blog/2025/03/21/wally-5-1" rel="alternate" type="text/html" title="Wally 5.1 is out" /><published>2025-03-21T06:00:00+00:00</published><updated>2025-03-21T06:00:00+00:00</updated><id>https://kankoda.com/blog/2025/03/21/wally-5-1</id><content type="html" xml:base="https://kankoda.com/blog/2025/03/21/wally-5-1"><![CDATA[<p>Wally 5.1 is out! This update has a cleaner design and adds support for new item types like ID cards and travel documents. It also lets you change images of already added items.</p>

<p><img src="/assets/blog/25/0321/image.jpg" alt="iOS device using the new Diesel skin" /></p>

<h2 id="cleaner-design">Cleaner Design</h2>

<p>Wally 5.1 cleans up and simplifies the app design. It aims to keep the classic, skeumorphic design while also making the app cleaner and easier to use.</p>

<div class="grid col3">
    <img src="/assets/blog/25/0321/screenshot-menu.jpg" />
    <img src="/assets/blog/25/0321/screenshot-wallet.jpg" />
    <img src="/assets/blog/25/0321/screenshot-skins.jpg" />
</div>

<p>The new design provides more screen estate, to give your things room to breathe. It also removes most of the onboarding hints, and replaces them with new, easily dismissable panels.</p>

<p>Item types have been adjusted to no longer have any “premium” item types. As such, all types are shown in the menu. You can hide types you don’t use in Settings.</p>

<h2 id="improved-item-screen">Improved Item Screen</h2>

<p>Wally 5.1 cleans up the item screen and makes it easier to manage the information of your things.</p>

<div class="grid col2">
    <img src="/assets/blog/25/0321/screenshot-item.jpg" />
    <img src="/assets/blog/25/0321/screenshot-edit.jpg" />
</div>

<p>You can now edit the front and back image of any already added item, add more information to your things and easily export and delete items directly from the item screen.</p>

<h2 id="more-item-types">More Item Types</h2>

<p>Wally 5.1 adds support for IDs, travel documents, and tickets. You can now add identity cards and driver’s licenses that don’t have a card aspect ratio, and add travel and event tickets to the app.</p>

<h2 id="conclusion">Conclusion</h2>

<p>Wally 5.1 is much cleaner than earlier versions. It streamlines the app, adds support for more item types, and lets you add more information to your things.</p>

<section class="app-store-button noselect" style="text-align: center;">
  <a href="https://apps.apple.com/us/developer/kankoda-sweden-ab/id516398918">
    <img src="/assets/app-store.png" alt="App Store badge" title="Download on the App Store" class="" />
  </a>
</section>

<p>You can <a href="https://apps.apple.com/us/developer/kankoda-sweden-ab/id516398918">download Wally 5.1 from the App Store</a>. We hope that you will love these changes, and hope that you reach out with any suggestions you may have.</p>]]></content><author><name>danielsaidi</name></author><category term="apps" /><summary type="html"><![CDATA[Wally 5.1 is out! This update has a cleaner design and adds support for new item types like ID cards and travel documents. It also lets you change images of already added items.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kankoda.com/assets/blog/25/0321/image.jpg" /><media:content medium="image" url="https://kankoda.com/assets/blog/25/0321/image.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Subscribe to the Kankoda newsletter</title><link href="https://kankoda.com/blog/2024/08/21/newsletter" rel="alternate" type="text/html" title="Subscribe to the Kankoda newsletter" /><published>2024-08-21T06:00:00+00:00</published><updated>2024-08-21T06:00:00+00:00</updated><id>https://kankoda.com/blog/2024/08/21/newsletter</id><content type="html" xml:base="https://kankoda.com/blog/2024/08/21/newsletter"><![CDATA[<p>Even though this website and our social media channels are periodically updated with information about our products and services, the <a href="https://kankoda.gumroad.com/subscribe">Kankoda Newsletter</a> lets you subscribe to the latest news.</p>

<p><img src="/assets/headers/kankoda.jpg" alt="EmojiKit header" /></p>

<p>The <a href="https://kankoda.gumroad.com/subscribe">Kankoda Newsletter</a> is managed through <a href="https://kankoda.gumroad.com">our Gumroad account</a> and is used to send periodic updates about our products.</p>

<p>While this site isn’t always updated with the latest information on products that have their own sites and social media accounts, like <a href="https://keyboardkit.com">KeyboardKit</a>, the newsletter is a holistic source of news.</p>

<div style="text-align: center;">
    <form class="input-with-button" action="https://app.gumroad.com/follow_from_embed_form" method="post" id="gumroad-follow-form-embed">
        <input type="hidden" name="seller_id" value="4816870321966" />
        <input id="gumroad-follow-form-embed-input" type="email" placeholder="Enter your e-mail address" name="email" value="" />
        <button class="button primary" type="submit" id="gumroad-follow-form-embed-button">Subscribe</button>
    </form>
</div>

<p>So sign up today, and we’ll update you when something significant happens to us and our products.</p>]]></content><author><name>danielsaidi</name></author><category term="general" /><summary type="html"><![CDATA[Even though this website and our social media channels are periodically updated with information about our products and services, the Kankoda Newsletter lets you subscribe to the latest news.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kankoda.com/assets/headers/kankoda.jpg" /><media:content medium="image" url="https://kankoda.com/assets/headers/kankoda.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Important EmojiKit changes</title><link href="https://kankoda.com/blog/2024/06/23/important-EmojiKit-changes" rel="alternate" type="text/html" title="Important EmojiKit changes" /><published>2024-06-23T06:00:00+00:00</published><updated>2024-06-23T06:00:00+00:00</updated><id>https://kankoda.com/blog/2024/06/23/important-EmojiKit-changes</id><content type="html" xml:base="https://kankoda.com/blog/2024/06/23/important-EmojiKit-changes"><![CDATA[<p>After not being able to scale EmojiKit Pro to a commercial product, Kankoda will migrate EmojiKit back to an open-source library.</p>

<p><img src="/assets/headers/emojikit.png" alt="EmojiKit header" /></p>

<p>This will affect the <a href="https://github.com/danielsaidi/emojipicker">EmojiKit GitHub project</a>, which has been transferred to <a href="https://github.com/danielsaidi">the founder’s personal GitHub account</a>. It will from now on be listed together with his other <a href="https://danielsaidi.com/opensource">open-source projects</a>.</p>

<p>This also affects the Gumroad product, which has been deleted, as well as all EmojiKit-related pages on this website.</p>]]></content><author><name>danielsaidi</name></author><category term="sdks" /><summary type="html"><![CDATA[After not being able to scale EmojiKit Pro to a commercial product, Kankoda will migrate EmojiKit back to an open-source library.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kankoda.com/assets/headers/emojikit.png" /><media:content medium="image" url="https://kankoda.com/assets/headers/emojikit.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Important product updates</title><link href="https://kankoda.com/blog/2023/11/13/important-product-updates" rel="alternate" type="text/html" title="Important product updates" /><published>2023-11-13T06:00:00+00:00</published><updated>2023-11-13T06:00:00+00:00</updated><id>https://kankoda.com/blog/2023/11/13/important-product-updates</id><content type="html" xml:base="https://kankoda.com/blog/2023/11/13/important-product-updates"><![CDATA[<p>As Kankoda creates more products, having separate web sites and social media accounts for each product isn’t viable. These sites and accounts will therefore be merged with Kankoda’s.</p>

<p><img src="/assets/headers/kankoda.jpg" alt="LicenseKit header" /></p>

<p>The affected products will be converted to product pages on this website and product news will be posted on Kankoda’s <a href="https://twitter.com/kankodahq">X</a> and <a href="https://mastodon.social/@kankoda">Mastodon</a> accounts and on the <a href="/blog">Kankoda blog</a>.</p>

<p>The GitHub repos for affected SDK products will also be moved into the <a href="https://github.com/kankoda">Kankoda organization</a>.</p>

<p>This change applies to <a href="/licensekit">LicenseKit</a>, which means that <a href="https://getlicensekit.com">the old LicenseKit website</a> is now a <a href="/licensekit">product page</a> on this website, and the GitHub account is now found <a href="https://github.com/kankoda/LicenseKit">here</a>.</p>

<p>This change will for now not apply to <a href="https://keyboardkit.com">KeyboardKit</a>, <a href="https://appamini.com">Appamini</a> or <a href="https://wally.app">Wally</a>, which for now keeps their own sites and accounts.</p>]]></content><author><name>danielsaidi</name></author><category term="general" /><summary type="html"><![CDATA[As Kankoda creates more products, having separate web sites and social media accounts for each product isn’t viable. These sites and accounts will therefore be merged with Kankoda’s.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kankoda.com/assets/headers/kankoda.jpg" /><media:content medium="image" url="https://kankoda.com/assets/headers/kankoda.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Say hello to EmojiKit</title><link href="https://kankoda.com/blog/2023/11/08/emojikit" rel="alternate" type="text/html" title="Say hello to EmojiKit" /><published>2023-11-08T06:00:00+00:00</published><updated>2023-11-08T06:00:00+00:00</updated><id>https://kankoda.com/blog/2023/11/08/emojikit</id><content type="html" xml:base="https://kankoda.com/blog/2023/11/08/emojikit"><![CDATA[<p>Say hello to <a href="/emojikit">EmojiKit</a> - a brand new SDK brings emoji features to Swift-based apps and libraries on all major Apple platforms (iOS, iPadOS, macOS, tvOS and watchOS).</p>

<p><img src="/assets/headers/emojikit.png" alt="LicenseKit header" /></p>

<p>EmojiKit was just released as a first 0.1 beta version. There are still work being done on the logo, the header, demo apps, etc. but you can find out more information about it on <a href="/emojikit">the product site</a>.</p>]]></content><author><name>danielsaidi</name></author><category term="sdks" /><summary type="html"><![CDATA[Say hello to EmojiKit - a brand new SDK brings emoji features to Swift-based apps and libraries on all major Apple platforms (iOS, iPadOS, macOS, tvOS and watchOS).]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://kankoda.com/assets/headers/emojikit.png" /><media:content medium="image" url="https://kankoda.com/assets/headers/emojikit.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>