
<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Apparent Software</title>
	<atom:link href="https://blog.apparentsoft.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.apparentsoft.com/</link>
	<description>News and articles from Apparent Software</description>
	<lastBuildDate>Mon, 24 Nov 2025 14:48:27 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>Black Friday Cyber Monday Deals 2025</title>
		<link>https://blog.apparentsoft.com/announcements/2408/black-friday-cyber-monday-deals-2025/</link>
		
		<dc:creator><![CDATA[Jacob Gorban]]></dc:creator>
		<pubDate>Mon, 24 Nov 2025 14:48:26 +0000</pubDate>
				<category><![CDATA[Announcements]]></category>
		<category><![CDATA[Black Friday]]></category>
		<category><![CDATA[Cyber Monday]]></category>
		<category><![CDATA[deals]]></category>
		<category><![CDATA[sales]]></category>
		<guid isPermaLink="false">https://blog.apparentsoft.com/?p=2408</guid>

					<description><![CDATA[<p>The post <a href="https://blog.apparentsoft.com/announcements/2408/black-friday-cyber-monday-deals-2025/">Black Friday Cyber Monday Deals 2025</a> appeared first on <a href="https://blog.apparentsoft.com">Apparent Software</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<div class="et_pb_section et_pb_section_0 et_pb_with_background et_section_regular" >
				
				
				
				
				
				
				<div class="et_pb_row et_pb_row_0">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_0  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_text et_pb_text_0  et_pb_text_align_left et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_text_inner"><p><!-- divi:paragraph --></p>
<p class="p1">We’ve put pretty much everything on sale for Black Friday-Cyber Monday this year, so if there are any Apparent Software titles you’re missing, now is a great time to complete your collection.</p>
<p class="p1">Sale prices un through Monday Dec 2nd. Here are all the details, with prices shown in USD:</p>
<p class="p1"><a href="https://apps.apple.com/us/app/cashculator-personal-finance/id1591642644?mt=12"><strong><span style="font-size: large;">Cashculator — Personal Finance for Mac</span></strong></a><span style="font-size: large;">. </span><span><strong>Save <span style="color: #e02b20;">50% ($65)</span> off the lifetime (one-time payment) option</strong>. This significant discount was never available </span><span>before. Note that there are no discounts to the subscriptions, for technical reasons. </span></p>
<p><span style="font-size: large;"><strong><a href="https://www.apparentsoft.com/trickster">Trickster: Recently Used Files</a></strong>. Save 50% off Trickster’s regular pay-up-front price. Pay just $14.99 for this time-saving productivity powerhouse!</span><br />At its simplest, Trickster answers “Where is that file I was just working on?” But it’s also packed with power user settings and integrations with <a href="https://hookproductivity.com/">Hookmark</a> and <a href="https://www.devontechnologies.com/apps/devonthink">DEVONthink</a> so you can work faster and more easily with all your files.</p>
<p class="p1"><span style="font-size: large;"><strong><a href="https://imageframer.net">ImageFramer. Your Art. Showcased</a>.</strong></span> All tiers of ImageFramer digital photo and art framing on the Mac as well as all its add-on frame &amp; overlay packs, are 50% off. This includes the Card Creator Pack, which contains elements to craft beautiful greeting cards right within ImageFramer. Learn more about ImageFramer <a href="https://imageframer.net">here</a>.</p>
<p class="p1"><span style="font-size: large;"><a href="https://apps.apple.com/us/app/eter-streaming-internet-radio/id1523221566"><strong>Eter: Streaming Internet Radio</strong></a> is a free iOS, macOS, CarPlay, watchOS, and tvOS app that plays any internet radio</span>.<br />If you want to save your own favorites (which then work across all the app’s platforms) or use the sleep timer to drift off to your favorite station, you would usually pay $8.99 for a one-time in-app purchase to unlock these premium features. That’s a ridiculously low price already, but hey, the holidays are on the way, so we also made <a href="https://apps.apple.com/us/app/eter-streaming-internet-radio/id1523221566">Eter</a> half off right now, bringing the price to <span style="color: #e02b20;">just $4.49</span>!</p>
<p class="p1"><span style="font-size: large;"><a href="https://apps.apple.com/us/app/calm-my-dog-anxiety-trainer/id1629500193"><strong>Calm My Dog: Anxiety Training </strong></a>is the newest addition to our app portfolio and came out of our designer’s real-life experiences with his dog</span>.<br />Squeaks, a pandemic pup, needed gradual desensitization training to learn to stay home alone. Anyone who’s using this method knows it’s hard work and part of that work is tracking and timing the training sessions, which this iPhone app does for you. <span>During our Black Friday sale, purchase lifetime (one-time payment) access for half off, at </span><span><strong>just $49.99 (less than most trainer&#8217;s sessions)</strong></span><span>. Note: you can add as many dogs as you like, so this tool works for trainers as well as individual owners. Learn more about </span><span>Calm My Dog</span><span> and download free training resources </span><a target="_blank" rel="noopener noreferrer nofollow" href="https://calmmydog.app/"><span><u>here</u></span></a><span>. </span></p>
<p><!-- /divi:paragraph --></p></div>
			</div>
			</div>
				
				
				
				
			</div>
				
				
			</div>
<p>The post <a href="https://blog.apparentsoft.com/announcements/2408/black-friday-cyber-monday-deals-2025/">Black Friday Cyber Monday Deals 2025</a> appeared first on <a href="https://blog.apparentsoft.com">Apparent Software</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>App Clips, universal &#038; deep links: how we added station sharing to Eter</title>
		<link>https://blog.apparentsoft.com/programming/2325/implementing-station-sharing-in-eter/</link>
		
		<dc:creator><![CDATA[Krystian Kozerawski]]></dc:creator>
		<pubDate>Mon, 09 Dec 2024 19:00:42 +0000</pubDate>
				<category><![CDATA[Programming]]></category>
		<guid isPermaLink="false">https://blog.apparentsoft.com/?p=2325</guid>

					<description><![CDATA[<p>Learn how we implemented station sharing in Eter: Streaming Internet Radio using universal links, deep links, and App Clips. From server configuration to project setup in Xcode, this guide provides practical steps and lessons learned.</p>
<p>The post <a href="https://blog.apparentsoft.com/programming/2325/implementing-station-sharing-in-eter/">App Clips, universal &amp; deep links: how we added station sharing to Eter</a> appeared first on <a href="https://blog.apparentsoft.com">Apparent Software</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>One of the new features that we recently added to <a href="https://apps.apple.com/us/app/eter-streaming-internet-radio/id1523221566">Eter: Streaming Internet Radio</a> is the ability to share a radio station via a universal link and a special station web profile. If you&#8217;re interested in implementing universal links and App Clips in your own app, read on to learn from Eter&#8217;s lead developer, Krystian Kozerawski:</p>



<ol class="wp-block-list">
<li>How to configure universal link support on your server.</li>



<li>How to add universal link and deep link support to your project in Xcode.</li>



<li>How to add App Clip support in Xcode.</li>
</ol>



<p>Eter users can now easily share a particular radio station&#8217;s special universal link, which, depending on the situation, will:</p>



<ul class="wp-block-list">
<li>Open the Eter app on an iPhone, iPad or Mac.</li>
</ul>



<ul class="wp-block-list">
<li>Open a special web page in the <code>eter.apparentsoft.com</code> domain with the station&#8217;s profile.</li>
</ul>



<ul class="wp-block-list">
<li>In the case of an iPhone that doesn’t yet have Eter installed, open a special version of the app that will play the shared station in the form of an <a href="https://developer.apple.com/documentation/appclip">App Clip</a>, which functions as a mini-version of Eter, that gets temporarily installed directly from the App Store.&nbsp;</li>
</ul>



<p>Here’s a working example of a shared station: <a href="https://eter.apparentsoft.com/stations/Shady%20Pines%20Radio/C0F5033F-77EE-42D3-A05A-6266F7BB6988">Shady Pines radio</a>.&nbsp;</p>



<p>Supporting universal links and App Clips is actually one topic. It requires similar moves on the server side, on the domain to whose subpage the universal link refers, as well as similar steps in the project configuration in Xcode.&nbsp;First, let&#8217;s look at what you need to configure on your web server to support universal links.</p>



<h2 class="wp-block-heading">Configuring universal link support on your server</h2>



<p>A station profile web page, in the domain referenced by a link, which is also supposed to act as a universal link requires special configuration on the server in the form of a JSON file named <strong>apple-app-site-association</strong> (without extension) placed in the <strong>.well-known</strong> folder.&nbsp;</p>



<p>So the proper form of the address of such JSON configuration file is:</p>



<p><code>https://[YOUR.DOMAIN]/.well-known/apple-app-site-association</code></p>



<p>In the case of Eter, this file can be found at: <a href="https://eter.apparentsoft.com/.well-known/apple-app-site-association">https://eter.apparentsoft.com/.well-known/apple-app-site-association</a>.&nbsp;</p>



<p>Importantly, the domain must use the secure HTTPS protocol.&nbsp;</p>



<p>In the case of Eter, that JSON configuration file looks like this:&nbsp;</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#1E1E1E;font-style:italic;color:#D4D4D4"><span style="border-bottom:1px solid rgba(234, 191, 191, 0.2)">JSON</span></span><span role="button" tabindex="0" data-code="{
	&quot;applinks&quot;: {
		&quot;details&quot;: [{
			&quot;appIDs&quot;: [&quot;G22F34V2HZ.com.mackozer.NewWorldRadioPlayer&quot;],
			&quot;paths&quot;: [&quot;/stations/*&quot;, ]
		}]
	},
	&quot;appclips&quot;: {
		&quot;apps&quot;: [&quot;G22F34V2HZ.com.mackozer.NewWorldRadioPlayer.Clip&quot;]
	}
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #9CDCFE">&quot;applinks&quot;</span><span style="color: #D4D4D4">: {</span></span>
<span class="line"><span style="color: #D4D4D4">		</span><span style="color: #9CDCFE">&quot;details&quot;</span><span style="color: #D4D4D4">: [{</span></span>
<span class="line"><span style="color: #D4D4D4">			</span><span style="color: #9CDCFE">&quot;appIDs&quot;</span><span style="color: #D4D4D4">: [</span><span style="color: #CE9178">&quot;G22F34V2HZ.com.mackozer.NewWorldRadioPlayer&quot;</span><span style="color: #D4D4D4">],</span></span>
<span class="line"><span style="color: #D4D4D4">			</span><span style="color: #9CDCFE">&quot;paths&quot;</span><span style="color: #D4D4D4">: [</span><span style="color: #CE9178">&quot;/stations/*&quot;</span><span style="color: #D4D4D4">, ]</span></span>
<span class="line"><span style="color: #D4D4D4">		}]</span></span>
<span class="line"><span style="color: #D4D4D4">	},</span></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #9CDCFE">&quot;appclips&quot;</span><span style="color: #D4D4D4">: {</span></span>
<span class="line"><span style="color: #D4D4D4">		</span><span style="color: #9CDCFE">&quot;apps&quot;</span><span style="color: #D4D4D4">: [</span><span style="color: #CE9178">&quot;G22F34V2HZ.com.mackozer.NewWorldRadioPlayer.Clip&quot;</span><span style="color: #D4D4D4">]</span></span>
<span class="line"><span style="color: #D4D4D4">	}</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p>As you can see, it consists of two dictionaries, one under the key <strong><code>applinks</code></strong>, referring to proper universal links, and the other under the key <strong>appclips</strong>, as you can easily guess, referring to App Clips.&nbsp;</p>



<p>For universal links (<strong><code>applinks</code></strong>), you need to provide an array of bundle identifiers with Application Identifier Prefix in the following format:<code> <strong>[ApplicationIdentifierPrefix].[BundleID]</strong></code>.</p>



<p>Your organization&#8217;s Application Identifier Prefix can be found on your developer profile (<a href="http://developer.apple.com/">developer.apple.com</a>) in the Certificates list view in the upper right corner under the name of your developer account.</p>



<figure class="wp-block-image size-large"><a href="https://blog.apparentsoft.com/wp-content/uploads/2024/11/cert-app-id-prefix.png"><img fetchpriority="high" decoding="async" width="1024" height="682" src="https://blog.apparentsoft.com/wp-content/uploads/2024/11/cert-app-id-prefix-1024x682.png" alt="" class="wp-image-2342" srcset="https://blog.apparentsoft.com/wp-content/uploads/2024/11/cert-app-id-prefix-1024x682.png 1024w, https://blog.apparentsoft.com/wp-content/uploads/2024/11/cert-app-id-prefix-980x653.png 980w, https://blog.apparentsoft.com/wp-content/uploads/2024/11/cert-app-id-prefix-480x320.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></figure>



<p>The second array in the configuration file for Eter is <strong><code>paths</code></strong>. Here we specify paths without subdomains. In our case, all addresses containing <strong><code>eter.apparentsoft.com/stations</code></strong> will be treated as universal links.&nbsp;</p>



<p>It should be mentioned that instead of <strong><code>paths</code></strong> you can use an array of <strong><code>components</code></strong>, in which you specify the components of the path, while having the option to specify whether a component should be included in the address or not.&nbsp;</p>



<p>The altered JSON on the Eter page would look like this:&nbsp;</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#1E1E1E;font-style:italic;color:#D4D4D4"><span style="border-bottom:1px solid rgba(234, 191, 191, 0.2)">JSON</span></span><span role="button" tabindex="0" data-code="{
    &quot;applinks&quot;:{
        &quot;details&quot;:[
            {
                &quot;appIDs&quot;:[
                    &quot;G22F34V2HZ.com.mackozer.NewWorldRadioPlayer&quot;,
                ],
                &quot;components&quot;: [
               {
                  &quot;/&quot;: &quot;/stations/*&quot;,
                  &quot;comment&quot;: &quot;Any URL in Eter subdomain with a path that starts with /stations/*&quot;
               }
                ]
            }
        ]
    },
    &quot;appclips&quot;: {
        &quot;apps&quot;: [
            &quot;G22F34V2HZ.com.mackozer.NewWorldRadioPlayer.Clip&quot;
        ]
    }
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">&quot;applinks&quot;</span><span style="color: #D4D4D4">:{</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">&quot;details&quot;</span><span style="color: #D4D4D4">:[</span></span>
<span class="line"><span style="color: #D4D4D4">            {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">&quot;appIDs&quot;</span><span style="color: #D4D4D4">:[</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #CE9178">&quot;G22F34V2HZ.com.mackozer.NewWorldRadioPlayer&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                ],</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">&quot;components&quot;</span><span style="color: #D4D4D4">: [</span></span>
<span class="line"><span style="color: #D4D4D4">               {</span></span>
<span class="line"><span style="color: #D4D4D4">                  </span><span style="color: #9CDCFE">&quot;/&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;/stations/*&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                  </span><span style="color: #9CDCFE">&quot;comment&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;Any URL in Eter subdomain with a path that starts with /stations/*&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">               }</span></span>
<span class="line"><span style="color: #D4D4D4">                ]</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">        ]</span></span>
<span class="line"><span style="color: #D4D4D4">    },</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">&quot;appclips&quot;</span><span style="color: #D4D4D4">: {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">&quot;apps&quot;</span><span style="color: #D4D4D4">: [</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #CE9178">&quot;G22F34V2HZ.com.mackozer.NewWorldRadioPlayer.Clip&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        ]</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p>The second dictionary, <strong>appclips</strong>, contains an array with the identifiers of individual App Clips, each beginning with an Application Identifier Prefix. The principle here is the same as for application identifiers.&nbsp;</p>



<p>Here’s a sample JSON app-association file from Apple&#8217;s documentation:&nbsp;</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#1E1E1E;font-style:italic;color:#D4D4D4"><span style="border-bottom:1px solid rgba(234, 191, 191, 0.2)">JSON</span></span><span role="button" tabindex="0" data-code="{
  &quot;applinks&quot;: {
      &quot;details&quot;: [
           {
             &quot;appIDs&quot;: [ &quot;ABCDE12345.com.example.app&quot;, &quot;ABCDE12345.com.example.app2&quot; ],
             &quot;components&quot;: [
               {
                  &quot;#&quot;: &quot;no_universal_links&quot;,
                  &quot;exclude&quot;: true,
                  &quot;comment&quot;: &quot;Matches any URL with a fragment that equals no_universal_links and instructs the system not to open it as a universal link.&quot;
               },
               {
                  &quot;/&quot;: &quot;/buy/*&quot;,
                  &quot;comment&quot;: &quot;Matches any URL with a path that starts with /buy/.&quot;
               },
               {
                  &quot;/&quot;: &quot;/help/website/*&quot;,
                  &quot;exclude&quot;: true,
                  &quot;comment&quot;: &quot;Matches any URL with a path that starts with /help/website/ and instructs the system not to open it as a universal link.&quot;
               },
               {
                  &quot;/&quot;: &quot;/help/*&quot;,
                  &quot;?&quot;: { &quot;articleNumber&quot;: &quot;????&quot; },
                  &quot;comment&quot;: &quot;Matches any URL with a path that starts with /help/ and that has a query item with name 'articleNumber' and a value of exactly four characters.&quot;
               }
             ]
           }
       ]
   },
   &quot;webcredentials&quot;: {
      &quot;apps&quot;: [ &quot;ABCDE12345.com.example.app&quot; ]
   },
    &quot;appclips&quot;: {
        &quot;apps&quot;: [&quot;ABCDE12345.com.example.MyApp.Clip&quot;]
    }
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">&quot;applinks&quot;</span><span style="color: #D4D4D4">: {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">&quot;details&quot;</span><span style="color: #D4D4D4">: [</span></span>
<span class="line"><span style="color: #D4D4D4">           {</span></span>
<span class="line"><span style="color: #D4D4D4">             </span><span style="color: #9CDCFE">&quot;appIDs&quot;</span><span style="color: #D4D4D4">: [ </span><span style="color: #CE9178">&quot;ABCDE12345.com.example.app&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;ABCDE12345.com.example.app2&quot;</span><span style="color: #D4D4D4"> ],</span></span>
<span class="line"><span style="color: #D4D4D4">             </span><span style="color: #9CDCFE">&quot;components&quot;</span><span style="color: #D4D4D4">: [</span></span>
<span class="line"><span style="color: #D4D4D4">               {</span></span>
<span class="line"><span style="color: #D4D4D4">                  </span><span style="color: #9CDCFE">&quot;#&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;no_universal_links&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                  </span><span style="color: #9CDCFE">&quot;exclude&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                  </span><span style="color: #9CDCFE">&quot;comment&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;Matches any URL with a fragment that equals no_universal_links and instructs the system not to open it as a universal link.&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">               },</span></span>
<span class="line"><span style="color: #D4D4D4">               {</span></span>
<span class="line"><span style="color: #D4D4D4">                  </span><span style="color: #9CDCFE">&quot;/&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;/buy/*&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                  </span><span style="color: #9CDCFE">&quot;comment&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;Matches any URL with a path that starts with /buy/.&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">               },</span></span>
<span class="line"><span style="color: #D4D4D4">               {</span></span>
<span class="line"><span style="color: #D4D4D4">                  </span><span style="color: #9CDCFE">&quot;/&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;/help/website/*&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                  </span><span style="color: #9CDCFE">&quot;exclude&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                  </span><span style="color: #9CDCFE">&quot;comment&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;Matches any URL with a path that starts with /help/website/ and instructs the system not to open it as a universal link.&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">               },</span></span>
<span class="line"><span style="color: #D4D4D4">               {</span></span>
<span class="line"><span style="color: #D4D4D4">                  </span><span style="color: #9CDCFE">&quot;/&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;/help/*&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                  </span><span style="color: #9CDCFE">&quot;?&quot;</span><span style="color: #D4D4D4">: { </span><span style="color: #9CDCFE">&quot;articleNumber&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;????&quot;</span><span style="color: #D4D4D4"> },</span></span>
<span class="line"><span style="color: #D4D4D4">                  </span><span style="color: #9CDCFE">&quot;comment&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;Matches any URL with a path that starts with /help/ and that has a query item with name &#39;articleNumber&#39; and a value of exactly four characters.&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">               }</span></span>
<span class="line"><span style="color: #D4D4D4">             ]</span></span>
<span class="line"><span style="color: #D4D4D4">           }</span></span>
<span class="line"><span style="color: #D4D4D4">       ]</span></span>
<span class="line"><span style="color: #D4D4D4">   },</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #9CDCFE">&quot;webcredentials&quot;</span><span style="color: #D4D4D4">: {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">&quot;apps&quot;</span><span style="color: #D4D4D4">: [ </span><span style="color: #CE9178">&quot;ABCDE12345.com.example.app&quot;</span><span style="color: #D4D4D4"> ]</span></span>
<span class="line"><span style="color: #D4D4D4">   },</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">&quot;appclips&quot;</span><span style="color: #D4D4D4">: {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">&quot;apps&quot;</span><span style="color: #D4D4D4">: [</span><span style="color: #CE9178">&quot;ABCDE12345.com.example.MyApp.Clip&quot;</span><span style="color: #D4D4D4">]</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p>If we put the JSON file in the mentioned folder (<code>./well-known</code>), that&#8217;s half done. We can update the file at any time by adding more bundle IDs, paths or components.&nbsp;</p>



<p><strong>Have patience; the update takes time</strong></p>



<p>Apple&#8217;s web robots will not immediately read this file. Sometimes it takes several hours for it to be updated in the Apple database. You can check the current status / contents of the app-site-association JSON file at:</p>



<p><code>https://app-site-association.cdn-apple.com/a/v1/YOURDOMAIN.</code></p>



<p>In the case of Eter, this address is: <a href="https://app-site-association.cdn-apple.com/a/v1/eter.apparentsoft.com">https://app-site-association.cdn-apple.com/a/v1/eter.apparentsoft.com</a>.</p>



<h2 class="wp-block-heading">Adding universal and deep link support to your Xcode project</h2>



<p>Now it’s time to configure the project appropriately so that, depending on whether the user has an application installed or not, the universal link opens either that application or its App Clip.&nbsp;</p>



<p>To add support for universal links to your app, you need to add&nbsp;the<strong> Associated Domains capability</strong>. This is done in the <strong>Signing &amp; Capabilities</strong> tab of the project view in Xcode. Click the <strong>+ Capabilities</strong> button and select <strong>Associated Domains</strong> from the list,. Then, add two domains with the appropriate prefixes to the domains list. In case of Eter, it looks like this:</p>



<figure class="wp-block-image size-large"><a href="https://blog.apparentsoft.com/wp-content/uploads/2024/11/associated-domains.png"><img loading="lazy" decoding="async" width="1024" height="624" src="https://blog.apparentsoft.com/wp-content/uploads/2024/11/associated-domains-1024x624.png" alt="" class="wp-image-2338" srcset="https://blog.apparentsoft.com/wp-content/uploads/2024/11/associated-domains-980x598.png 980w, https://blog.apparentsoft.com/wp-content/uploads/2024/11/associated-domains-480x293.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></figure>



<p><br>As you can see we added not only associated domains to support universal links (applinks) but also to support App Clips.&nbsp;</p>



<p>A universal link will not always work. For example, when the link is tapped in Facebook or X/Twitter for iOS, these applications use their own built-in browsers. In such cases, a page in the <strong>eter.apparentsoft.com</strong> domain will open in this built-in browser with the profile of the given radio station and a button to open the station directly in Eter. This button is a deep link, which the application must also support.</p>



<h2 class="wp-block-heading">Configuring deep links</h2>



<p>As&nbsp; mentioned, if a universal link opens in a browser that does not support it (like the internal web browser in the Facebook or X apps for iOS), a page with the profile of the given station will be displayed. There is a button with a deep link on it, which will open Eter and start playing (receiving) the given radio station stream.</p>



<p>A deep link with a coded stream address, station name and its identifier starts with the prefix <strong>com.apparentsoft.eter://</strong> and the system must recognize this prefix to open Eter. Therefore, it should be added to the list of URL types in the project settings in Xcode in the <strong>Info</strong> tab.</p>



<p>Click the <strong>+</strong> button in the <strong>URL Types </strong>section and enter the identifier (preferably one that will describe the purpose of the deep link). In the <strong>URL Schemes</strong> field, enter your deep link address prefix, which will inform the system that it should open your application. In the case of Eter, we decided to use the classic format for bundle ID. Leave <strong>Role</strong> set to <strong>Viewer</strong>, its default value.</p>



<figure class="wp-block-image size-large"><a href="https://blog.apparentsoft.com/wp-content/uploads/2024/11/url-types.png"><img loading="lazy" decoding="async" width="1024" height="680" src="https://blog.apparentsoft.com/wp-content/uploads/2024/11/url-types-1024x680.png" alt="" class="wp-image-2340" srcset="https://blog.apparentsoft.com/wp-content/uploads/2024/11/url-types-980x651.png 980w, https://blog.apparentsoft.com/wp-content/uploads/2024/11/url-types-480x319.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></figure>



<p>Note that you can add as many URL Types (deep links) as your app needs. Each deep link can be used for different features.&nbsp;&nbsp;&nbsp;</p>



<h2 class="wp-block-heading">Handling universal and deep links with onOpenURL</h2>



<p>Now that we&#8217;ve added support for universal links and deep links to our project, it&#8217;s time to handle those incoming links in our app. In SwiftUI, we can catch the universal link events and deep link events using the view modifier <strong>.onOpenURL</strong>.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#1E1E1E;font-style:italic;color:#D4D4D4"><span style="border-bottom:1px solid rgba(234, 191, 191, 0.2)">Swift</span></span><span role="button" tabindex="0" data-code="struct ContentView: View {
    var body: some View {
	      Text(&quot;Hello World!&quot;)
	          .onOpenURL { incomingURL in
                handleIncomingURL(incomingURL)
            }
    }
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">struct</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">ContentView</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">View </span><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> body: </span><span style="color: #C586C0">some</span><span style="color: #D4D4D4"> View {</span></span>
<span class="line"><span style="color: #D4D4D4">	      </span><span style="color: #DCDCAA">Text</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;Hello World!&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">	          .</span><span style="color: #DCDCAA">onOpenURL</span><span style="color: #D4D4D4"> { incomingURL </span><span style="color: #C586C0">in</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #DCDCAA">handleIncomingURL</span><span style="color: #D4D4D4">(incomingURL)</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p>In the <strong>handleIncomingURL(_ url: URL)</strong> method, we extract the stream URL hidden in the deep link or universal link, along with the station name and its ID.</p>



<p>However, if we’re working in UIKit and we use an app delegate, we can use the following method:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 0 16px;font-size:0.8em;width:100%;text-align:left;background-color:#1E1E1E;font-style:italic;color:#D4D4D4"><span style="border-bottom:1px solid rgba(234, 191, 191, 0.2)">Swift</span></span><span role="button" tabindex="0" data-code="func application(_ application: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any]) -&gt; Bool {
    /// Handle incoming url accordingly
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">func</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">application</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">_</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">application</span><span style="color: #D4D4D4">: UIApplication, </span><span style="color: #DCDCAA">open</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">url</span><span style="color: #D4D4D4">: URL, </span><span style="color: #DCDCAA">options</span><span style="color: #D4D4D4">: [UIApplication.OpenURLOptionsKey : </span><span style="color: #4EC9B0">Any</span><span style="color: #D4D4D4">]) -&gt; </span><span style="color: #4EC9B0">Bool</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955">/// Handle incoming url accordingly</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p>It is now a simple matter to extract the stream link, station name or identifier embedded in such a deep link and establish a connection and start receiving the stream if the address is correct. We also need to handle possible errors, including unreadable deep links.</p>



<p>In the case of Eter, the same method supports deep links from the profile page of a given station in the <code>eter.apparentsoft.com</code> domain as well as the data contained in a universal link.</p>



<p>All of this is enough to handle both universal and deep links placed on a station&#8217;s profile page, but the App Clip requires a bit more work.</p>



<h2 class="wp-block-heading">Adding an App Clip target to your project&nbsp;</h2>



<p>When we were considering ways to implement sharing stations via their profile websites on the <code>eter.apparentsoft.com</code> domain, we immediately had the idea to implement an App Clip, so that people who do not have Eter installed could open a universal link and listen to a given station. An App Clip would be a kind of a demo of the full application for them, which is why it is, to some extent, a mini version of Eter, with an available list of radio stations recommended by us.</p>



<p>Technically, an App Clip is a separate application. To add an App Clip to your project, you need to add it as a new target:  <strong>File</strong> menu -&gt; <strong>New</strong> -&gt; <strong>Target</strong>.</p>



<figure class="wp-block-image size-large"><a href="https://blog.apparentsoft.com/wp-content/uploads/2024/11/app-clip-target.png"><img loading="lazy" decoding="async" width="1024" height="680" src="https://blog.apparentsoft.com/wp-content/uploads/2024/11/app-clip-target-1024x680.png" alt="" class="wp-image-2344" srcset="https://blog.apparentsoft.com/wp-content/uploads/2024/11/app-clip-target-980x651.png 980w, https://blog.apparentsoft.com/wp-content/uploads/2024/11/app-clip-target-480x319.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></figure>



<p>Creating a mini version of Eter was not difficult. In the case of most files, we added AppClip to the Target Membership list of each of them. We only created a separate view of the simplified list, and added the aforementioned <strong>.onOpenURL</strong> modifier to the <strong>VStack</strong> in the <strong>body</strong> property of<strong> ContentView</strong>.</p>



<p>All that remains is to add the<strong> Associated Domains </strong>capability for the App Clip. The process is exactly the same as for the main application target. In the <strong>Signing &amp; Capabilities </strong>tab in the project, click the <strong>+ Capabilities</strong> button and add, this time only <strong>appclips:eter.apparentsoft.com</strong>.</p>



<figure class="wp-block-image size-large"><a href="https://blog.apparentsoft.com/wp-content/uploads/2024/11/app-clip-associated-domains.png"><img loading="lazy" decoding="async" width="1024" height="666" src="https://blog.apparentsoft.com/wp-content/uploads/2024/11/app-clip-associated-domains-1024x666.png" alt="" class="wp-image-2346" srcset="https://blog.apparentsoft.com/wp-content/uploads/2024/11/app-clip-associated-domains-980x637.png 980w, https://blog.apparentsoft.com/wp-content/uploads/2024/11/app-clip-associated-domains-480x312.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></figure>



<p>And that&#8217;s pretty much it for the project configuration and code. The last part is App Store Connect.&nbsp;</p>



<h2 class="wp-block-heading">Configuring an App Clip in App Store Connect</h2>



<p>First of all, you should push a new build of the app that includes the App Clip to App Store Connect.&nbsp; It’s worth mentioning that the App Clip can be tested via TestFlight; however, it is tested as a separate build. This means that testers will test the main app and the App Clip separately.&nbsp;</p>



<p>When you are ready to submit the app, and when you choose the build that includes the App Clip in the submission form, you’ll see a new App Clip section. You need to provide a header image that will be presented when the universal link opens and the main app is not installed, as well as providing a subtitle and an the action description (in case of Eter it is just “play”).&nbsp;</p>



<p>With all of this accomplished, when the new build is accepted and released, your app will support universal links, deep links and the App Clip!&nbsp;</p>



<h2 class="wp-block-heading">Testing universal links and App Clips</h2>



<p>When testing universal links, remember that they are supported by the default web browser in the system, both in iOS and macOS, but the link is not opened in the browser but a dedicated application opens the link instead (in our case, Eter). However, do not paste the universal link into the browser&#8217;s address bar. This will not work. We made this mistake ourselves at first and it seemed that universal links did not work. However, if you paste the link, for example, to the system Notes app and then tap (or click) on it, the universal link should work and the application associated with it should open.</p>



<p>We also noticed that universal links do not always work in the simulator or with an application built with Xcode. However, they do work with the test beta version downloaded from TestFlight.</p>



<p>On the other hand, we encountered no problems with testing deep links. These can be pasted into the browser&#8217;s address bar, which should result in opening the application associated with such a deep link. This should work in the simulator as well.</p>



<p>As for the App Clip, the app build containing it should be sent to App Store Connect. The App Clip itself is tested in TestFlight as a separate app. Keep in mind that the App Clip is ultimately a mini app temporarily installed ad hoc from the App Store — it is not part of the actual app.</p>



<p>We hope that in sharing our experience adding universal links, deep links, and App Clips to <a href="https://apps.apple.com/us/app/eter-streaming-internet-radio/id1523221566">Eter: Streaming Internet Radio</a>, you too can find interesting uses for these features and implement with a bit less trial and error than we encountered. For the ultimate programming productivity boost, we recommend streaming your favorite internet radio station as you work. And, hey, we have an app for that!</p>
<p>The post <a href="https://blog.apparentsoft.com/programming/2325/implementing-station-sharing-in-eter/">App Clips, universal &amp; deep links: how we added station sharing to Eter</a> appeared first on <a href="https://blog.apparentsoft.com">Apparent Software</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Black Friday Cyber Monday Deals 2024</title>
		<link>https://blog.apparentsoft.com/announcements/2000/black-friday-cyber-monday-deals-2024/</link>
		
		<dc:creator><![CDATA[Susannah]]></dc:creator>
		<pubDate>Mon, 25 Nov 2024 14:53:03 +0000</pubDate>
				<category><![CDATA[Announcements]]></category>
		<category><![CDATA[Black Friday]]></category>
		<category><![CDATA[Cyber Monday]]></category>
		<category><![CDATA[deals]]></category>
		<category><![CDATA[sales]]></category>
		<guid isPermaLink="false">https://blog.apparentsoft.com/?p=2000</guid>

					<description><![CDATA[<p>The post <a href="https://blog.apparentsoft.com/announcements/2000/black-friday-cyber-monday-deals-2024/">Black Friday Cyber Monday Deals 2024</a> appeared first on <a href="https://blog.apparentsoft.com">Apparent Software</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><div class="et_pb_section et_pb_section_1 et_pb_with_background et_section_regular" >
				
				
				
				
				
				
				<div class="et_pb_row et_pb_row_1">
				<div class="et_pb_column et_pb_column_4_4 et_pb_column_1  et_pb_css_mix_blend_mode_passthrough et-last-child">
				
				
				
				
				<div class="et_pb_module et_pb_text et_pb_text_1  et_pb_text_align_left et_pb_bg_layout_light">
				
				
				
				
				<div class="et_pb_text_inner"><!-- divi:paragraph --></p>
<p class="p1">We’ve put pretty much everything on sale for Black Friday-Cyber Monday this year, so if there are any Apparent Software titles you’re missing, now is a great time to complete your collection.</p>
<p class="p1">Sale prices un through Monday Dec 2nd. Here are all the details, with prices shown in USD:</p>
<p class="p1"><a href="https://apps.apple.com/us/app/cashculator-personal-finance/id1591642644?mt=12"><strong><span style="font-size: large;">Cashculator — Personal Finance for Mac</span></strong></a><span style="font-size: large;">. Save 50% off the first year of an annual subscription. <strong><span style="text-decoration: underline;"><a href="https://apps.apple.com/redeem?ctx=offercodes&amp;id=1591642644&amp;code=BLACKFRIDAY24">It only works by clicking on this special link to apply the coupon code in the Mac App Store</a></span></strong>.</span> <br />That means you get a year of access to easy-to-use cash flow forecasting and budgeting for just $24.99. You might save more than that the very first month you start taking a closer look at your finances with Cashculator! Note: Cashculator is always free to use with up to five income or expense categories, perfect for simple budgets, teaching financial concepts, or just to try before you buy. You can also choose to subscribe monthly, in which case you can use it with unlimited categories for the first week for free and then pay $5.99 a month thereafter. Learn more about Cashculator <a href="https://cashculator.app">here</a>.</p>
<p><span style="font-size: large;"><strong><a href="https://www.apparentsoft.com/trickster">Trickster: Recently Used Files</a></strong>. Save 50% off Trickster’s regular pay-up-front price. Pay just $14.99 for this time-saving productivity powerhouse!</span> <br />At its simplest, Trickster answers “Where is that file I was just working on?” But it’s also packed with power user settings and integrations with <a href="https://hookproductivity.com/">Hookmark</a> and <a href="https://www.devontechnologies.com/apps/devonthink">DEVONthink</a> so you can work faster and more easily with all your files.</p>
<p class="p1"><span style="font-size: large;"><strong><a href="https://imageframer.net">ImageFramer. Your Art. Showcased</a>.</strong></span> All tiers of ImageFramer digital photo and art framing on the Mac as well as all its add-on frame &amp; overlay packs, are 50% off. This includes the Card Creator Pack, which contains elements to craft beautiful greeting cards right within ImageFramer. Learn more about ImageFramer <a href="https://imageframer.net">here</a>.</p>
<p class="p1"><span style="font-size: large;"><a href="https://apps.apple.com/us/app/eter-streaming-internet-radio/id1523221566"><strong>Eter: Streaming Internet Radio</strong></a> is a free iOS, macOS, CarPlay, watchOS, and tvOS app that plays any internet radio</span>. <br />If you want to save your own favorites (which then work across all the app’s platforms) or use the sleep timer to drift off to your favorite station, you would usually pay $4.99 for a one-time in-app purchase to unlock these premium features. That’s a ridiculously low price already, but hey, the holidays are on the way, so we also made <a href="https://apps.apple.com/us/app/eter-streaming-internet-radio/id1523221566">Eter</a> half off right now, bringing the price to just $2.49!</p>
<p class="p1"><span style="font-size: large;"><a href="https://apps.apple.com/us/app/calm-my-dog-anxiety-trainer/id1629500193"><strong>Calm My Dog: Anxiety Training </strong></a>is the newest addition to our app portfolio and came out of our designer’s real-life experiences with his dog</span>. <br />Squeaks, a pandemic pup, needed gradual desensitization training to learn to stay home alone. Anyone who’s using this method knows it’s hard work and part of that work is tracking and timing the training sessions, which this iPhone app does for you. During our Black Friday sale, get a 50% discount for the first year <a href="https://apps.apple.com/redeem?ctx=offercodes&amp;id=1629500193&amp;code=BLACKFRIDAY24">using this App Store link</a>. Note: you can add as many dogs as you like, so this tool works for trainers as well as individual owners. Learn more about Calm My Dog and download free training resources <a href="https://calmmydog.app">here</a>.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><!-- /divi:paragraph --></div>
			</div>
			</div>
				
				
				
				
			</div>
				
				
			</div></p>
<p>The post <a href="https://blog.apparentsoft.com/announcements/2000/black-friday-cyber-monday-deals-2024/">Black Friday Cyber Monday Deals 2024</a> appeared first on <a href="https://blog.apparentsoft.com">Apparent Software</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Alfred workflow for Trickster and DEVONthink v1.2</title>
		<link>https://blog.apparentsoft.com/trickster/2301/alfred-workflow-for-trickster-and-devonthink-v1-2/</link>
		
		<dc:creator><![CDATA[Jacob Gorban]]></dc:creator>
		<pubDate>Fri, 10 May 2024 01:01:06 +0000</pubDate>
				<category><![CDATA[Trickster]]></category>
		<category><![CDATA[alfred]]></category>
		<category><![CDATA[devonthink]]></category>
		<category><![CDATA[integrations]]></category>
		<guid isPermaLink="false">https://blog.apparentsoft.com/?p=2301</guid>

					<description><![CDATA[<p>We&#8217;ve released a new version of the Alfred workflow (now at version 1.2) for Trickster. It started with one customer (thank you, Sebastian) updating our existing workflow to work better with Alfred 5.5 and we took it from there, giving it better interoperation with DEVONthink items in your Trickster. Download link is at the bottom. [&#8230;]</p>
<p>The post <a href="https://blog.apparentsoft.com/trickster/2301/alfred-workflow-for-trickster-and-devonthink-v1-2/">Alfred workflow for Trickster and DEVONthink v1.2</a> appeared first on <a href="https://blog.apparentsoft.com">Apparent Software</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>We&#8217;ve released a new version of the Alfred workflow (now at version 1.2) for <a href="https://www.apparentsoft.com/trickster">Trickster</a>. It started with one customer (thank you, Sebastian) updating our existing workflow to work better with Alfred 5.5 and we took it from there, giving it better interoperation with <a href="https://www.devontechnologies.com/apps/devonthink">DEVONthink</a> items in your Trickster. <a href="#download">Download</a> link is at the bottom. For older Alfred versions (below 5): use the previous version of the workflow, see this <a href="https://blog.apparentsoft.com/trickster/1018/alfred-workflow-for-trickster/">older post</a>.</p>



<p>So, what can you do with this new workflow:</p>



<h2 class="wp-block-heading">Get the latest 30 items from Trickster and show them in Alfred</h2>



<p>Invoke it with the <code>ttr</code> command in Alfred or with the global hotkey <code>⌘⌥Z</code>. You can filter the list further by name by typing. This is similar to what you can already do in Trickster, of course, but if you prefer Alfred interface or have further actions that you&#8217;d like on them in Alfred and are not possible in Trickster, this is the way.</p>



<h2 class="wp-block-heading">Open the items by pressing return</h2>



<p>For regular files, holding Command key will allow to continue browsing the files in Alfred for all the operations that it provides.</p>



<h2 class="wp-block-heading">Open DEVONthink items in DEVONthink</h2>



<p>With items that came from DEVONthink (which are also files), pressing Option-Return will open the item directly in DEVONthink instead of in the default application in the system. This is similar to how they open from Trickster by default but now it also works in Alfred. Notice how Alfred also displays the path to items from DEVONthink in the format: DEVONthink 3: [DATABASE NAME]/Path in the database instead of the regular file path.</p>



<div class="wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-ad2f72ca wp-block-group-is-layout-flex">
<figure class="wp-block-image size-full"><a href="https://blog.apparentsoft.com/wp-content/uploads/2024/05/Screenshot-2024-04-24-at-23.48.59.png"><img loading="lazy" decoding="async" width="1528" height="1080" src="https://blog.apparentsoft.com/wp-content/uploads/2024/05/Screenshot-2024-04-24-at-23.48.59.png" alt="screenshot of Alfred showing Trickster workflow in action, highlighting Open in DEVONthink command on a list item." class="wp-image-2302" srcset="https://blog.apparentsoft.com/wp-content/uploads/2024/05/Screenshot-2024-04-24-at-23.48.59.png 1528w, https://blog.apparentsoft.com/wp-content/uploads/2024/05/Screenshot-2024-04-24-at-23.48.59-1280x905.png 1280w, https://blog.apparentsoft.com/wp-content/uploads/2024/05/Screenshot-2024-04-24-at-23.48.59-980x693.png 980w, https://blog.apparentsoft.com/wp-content/uploads/2024/05/Screenshot-2024-04-24-at-23.48.59-480x339.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) and (max-width: 1280px) 1280px, (min-width: 1281px) 1528px, 100vw" /></a></figure>



<p></p>
</div>



<h2 class="wp-block-heading" id="download">Download the workflow</h2>



<p>This is what you were looking for. </p>



<p>Click the image below to download the workflow. Then double-click the file (Get latest files from Trickster.alfredworkflow) to open it in Alfred and continue there with installing it.</p>



<figure class="wp-block-image aligncenter size-full"><a href="https://dl.apparentsoft.com/trickster/Get%20latest%20files%20from%20Trickster.alfredworkflow"><img loading="lazy" decoding="async" width="250" height="300" src="https://blog.apparentsoft.com/wp-content/uploads/2024/05/Alfred-workflow-for-Trickster-3.png" alt="Click the image to download the 
&quot;Get latest files from Trickster&quot; 
Alfred workflow for Trickster" class="wp-image-2306"/></a><figcaption class="wp-element-caption">Click the image to download the <br>&#8220;Get latest files from Trickster&#8221; <br>Alfred workflow for Trickster</figcaption></figure>
<p>The post <a href="https://blog.apparentsoft.com/trickster/2301/alfred-workflow-for-trickster-and-devonthink-v1-2/">Alfred workflow for Trickster and DEVONthink v1.2</a> appeared first on <a href="https://blog.apparentsoft.com">Apparent Software</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Trickster 3.9.3 Update</title>
		<link>https://blog.apparentsoft.com/trickster/2291/trickster-3-9-3-update/</link>
		
		<dc:creator><![CDATA[Jacob Gorban]]></dc:creator>
		<pubDate>Fri, 03 May 2024 13:39:34 +0000</pubDate>
				<category><![CDATA[Announcements]]></category>
		<category><![CDATA[Trickster]]></category>
		<category><![CDATA[release notes]]></category>
		<guid isPermaLink="false">https://blog.apparentsoft.com/?p=2291</guid>

					<description><![CDATA[<p>Full Release Notes:</p>
<p>The post <a href="https://blog.apparentsoft.com/trickster/2291/trickster-3-9-3-update/">Trickster 3.9.3 Update</a> appeared first on <a href="https://blog.apparentsoft.com">Apparent Software</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Full Release Notes:</h2>



<ul class="wp-block-list">
<li><a href="https://www.apparentsoft.com/trickster">Trickster</a> will now refresh previews for modified files that are already in the list</li>



<li>Fix Configure Tracking Settings button in Preferences not always working</li>



<li>Add checks when adding watched folders:
<ul class="wp-block-list">
<li>&nbsp;Prohibit adding home and root folders</li>



<li>&nbsp;Skip folders that are already in the list</li>



<li>&nbsp;For newly added folders that are children of watched folders, confirm that they should be added</li>



<li>&nbsp;For newly added folders that are parents of watched folders, suggest removing the children watched folders</li>
</ul>
</li>



<li>Fix text for right-click menu commands when more than one file is selected</li>
</ul>
<p>The post <a href="https://blog.apparentsoft.com/trickster/2291/trickster-3-9-3-update/">Trickster 3.9.3 Update</a> appeared first on <a href="https://blog.apparentsoft.com">Apparent Software</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Eter 2.0: New Look, New Features!</title>
		<link>https://blog.apparentsoft.com/announcements/2061/eter-2-0-new-look-new-features/</link>
		
		<dc:creator><![CDATA[Braden]]></dc:creator>
		<pubDate>Thu, 29 Feb 2024 23:29:50 +0000</pubDate>
				<category><![CDATA[Announcements]]></category>
		<category><![CDATA[article]]></category>
		<category><![CDATA[Eter]]></category>
		<category><![CDATA[eter]]></category>
		<category><![CDATA[music]]></category>
		<category><![CDATA[music app]]></category>
		<category><![CDATA[radio]]></category>
		<category><![CDATA[radio app]]></category>
		<category><![CDATA[radio stations]]></category>
		<category><![CDATA[streaming]]></category>
		<guid isPermaLink="false">https://blog.apparentsoft.com/?p=2061</guid>

					<description><![CDATA[<p>Eter: Streaming Internet Radio&#160;is not just a radio app—it’s your portal to over 40,000 global radio stations and it’s filled with great features! Before we tell you more, let&#8217;s first step back in time… the story of how Eter came to Apparent Software is an interesting one. It starts at Macworld 2011. Apparent founder and [&#8230;]</p>
<p>The post <a href="https://blog.apparentsoft.com/announcements/2061/eter-2-0-new-look-new-features/">Eter 2.0: New Look, New Features!</a> appeared first on <a href="https://blog.apparentsoft.com">Apparent Software</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p><a href="http://eter.apparentsoft.com">Eter: Streaming Internet Radio</a>&nbsp;is not just a radio app—it’s your portal to over 40,000 global radio stations and it’s filled with great features!</p>



<p><em>Before we tell you more, let&#8217;s first step back in time…</em> the story of how Eter came to Apparent Software is an interesting one. It starts at Macworld 2011. Apparent founder and senior dev Jacob had a booth there at Macworld and, of course, met a lot of press back in those days when there were loads of people writing articles on slim slices of dead trees. One of them was Krystian Kozerawski, a Polish tech blogger (see the photo from back then below). Jacob and Krystian became fast friends, in part because of their common love for similar music and both being guitarists, having played in bands. They kept in touch and a few years later Krystian decided to become a Swift developer and then he joined Apparent Software as a Junior Developer, more than 5 years ago. He <a href="https://mackozer.medium.com/eter-how-i-created-universal-radio-app-for-iphone-ipad-mac-and-apple-tv-646a1abab893">developed Eter as a side-project</a> and it became quite popular in Poland. He then suggested to bring it into Apparent Software’s fold because, as he says, he treats us like a rock band and the app is like a song that he brings to the band. Which is a really nice notion, if you ask us. And now, back to the app!</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="559" src="https://blog.apparentsoft.com/wp-content/uploads/2024/02/eter_device_lineup-min-1-1024x559.png" alt="Apple device lineup for Eter radio streaming app" class="wp-image-2042" srcset="https://blog.apparentsoft.com/wp-content/uploads/2024/02/eter_device_lineup-min-1-980x535.png 980w, https://blog.apparentsoft.com/wp-content/uploads/2024/02/eter_device_lineup-min-1-480x262.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></figure>



<p>Whether you’re on the hunt for fresh music or seeking solace in familiar tunes, Eter is your musical companion. If you haven’t experienced the magic of Eter yet, now is the perfect time to dive in, as Eter 2.0 has arrived with a plethora of new features to elevate your listening experience. Here is what’s waiting for you:</p>



<ul class="wp-block-list">
<li><strong>Fresh Design:</strong>&nbsp;Embark on a visual journey with a fresh design overhaul led by our Winnipeg-based designer, Brady Froese, alongside a new app icon that encapsulates the essence of Eter’s evolution.<br><br></li>



<li><strong>Expanded Search Functionality:</strong>&nbsp;Explore the vast world of radio stations with ease through an expanded search feature. Discover stations by genre, location, or tags, unlocking a world of musical exploration at your fingertips.<br><br></li>



<li><strong>Enhanced Playback Experience for Premium Users:</strong>&nbsp;Dive into your listening history with a feature that allows Premium users to view recently played tracks and seamlessly open them in Apple Music, bridging the gap between discovery and engagement.<br><br></li>



<li><strong>Mac Exclusive Features:</strong> Mac users can now indulge in a new mini-player for the menu bar, providing quick access to controls. With the option to hide the Dock icon and support for media keys, the Mac experience is tailored to enrich your journey through music, extending compatibility to iPads with attached keyboards.<br></li>
</ul>



<p>Ready to explore the world of Eter? Available on all Apple devices including CarPlay, immerse yourself in seamless radio streaming with Eter 2.0.<strong>&nbsp;For more information and to discover all that Eter has to offer, visit our&nbsp;</strong><a href="https://eter.apparentsoft.com/"><strong>website</strong></a><strong>.</strong></p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Why Eter 2.0 is the Must-Have Mac, iPhone, &amp; CarPlay Radio App of 2024" width="1080" height="608" src="https://www.youtube.com/embed/rewcmOYa7Kc?feature=oembed"  allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<figure class="wp-block-image aligncenter size-full is-style-default"><a href="https://apps.apple.com/us/app/eter-streaming-internet-radio/id1523221566"><img loading="lazy" decoding="async" width="720" height="540" src="https://blog.apparentsoft.com/wp-content/uploads/2024/02/KK-and-JG-2011.jpg" alt="Krystian Kozerawski and Jacob Gorban at Macworld 2011" class="wp-image-2077" srcset="https://blog.apparentsoft.com/wp-content/uploads/2024/02/KK-and-JG-2011.jpg 720w, https://blog.apparentsoft.com/wp-content/uploads/2024/02/KK-and-JG-2011-480x360.jpg 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 720px, 100vw" /></a></figure>
<p>The post <a href="https://blog.apparentsoft.com/announcements/2061/eter-2-0-new-look-new-features/">Eter 2.0: New Look, New Features!</a> appeared first on <a href="https://blog.apparentsoft.com">Apparent Software</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Trickster 3.9.2 Release Notes</title>
		<link>https://blog.apparentsoft.com/business/2039/trickster-3-9-2-release-notes/</link>
		
		<dc:creator><![CDATA[Jacob Gorban]]></dc:creator>
		<pubDate>Tue, 27 Feb 2024 03:16:46 +0000</pubDate>
				<category><![CDATA[Business]]></category>
		<guid isPermaLink="false">https://blog.apparentsoft.com/?p=2039</guid>

					<description><![CDATA[<p>DEVONthink integration improvements Half of improvements in Trickster 3.9.2 are related to a better integration with DEVONthink. For items originating from DEVONthink: Improvements for the new Dropbox and iCloud Desktop/Documents Now, for the new Dropbox macOS integration (when the Dropbox folder is inside &#8220;Locations&#8221;), the path inside Dropbox will be correctly shown, like it was [&#8230;]</p>
<p>The post <a href="https://blog.apparentsoft.com/business/2039/trickster-3-9-2-release-notes/">Trickster 3.9.2 Release Notes</a> appeared first on <a href="https://blog.apparentsoft.com">Apparent Software</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">DEVONthink integration improvements</h2>



<p>Half of improvements in <a href="https://www.apparentsoft.com/trickster">Trickster</a> 3.9.2 are related to a better integration with <a href="https://www.devontechnologies.com/apps/devonthink">DEVONthink</a>. For items originating from DEVONthink:</p>



<ul class="wp-block-list">
<li>Copying URLs will copy a callback URL that opens the item in DEVONthink. This helps with copying DEVONthink items, for example</li>



<li>Option-Double-Click or Option-Return will open the file using a default app for the type instead of inside DEVONthink.</li>
</ul>



<h2 class="wp-block-heading">Improvements for the new Dropbox and iCloud Desktop/Documents</h2>



<p>Now, for the new Dropbox macOS integration (when the Dropbox folder is inside &#8220;Locations&#8221;), the path inside Dropbox will be correctly shown, like it was showing for older Dropbox versions</p>



<p>Similarly, when customers use iCloud Desktop/Documents option on the macOS, Trickster will now correctly display the path in these folders instead of an empty path.</p>



<figure class="wp-block-image aligncenter size-large is-resized"><a href="https://blog.apparentsoft.com/wp-content/uploads/2024/02/Screenshot-2024-02-26-at-21.09.32.png"><img loading="lazy" decoding="async" width="1024" height="562" src="https://blog.apparentsoft.com/wp-content/uploads/2024/02/Screenshot-2024-02-26-at-21.09.32-1024x562.png" alt="Trickster 3.9.2 showing paths in Dropbox and Desktop in iCloud" class="wp-image-2040" style="width:509px;height:auto" srcset="https://blog.apparentsoft.com/wp-content/uploads/2024/02/Screenshot-2024-02-26-at-21.09.32-1024x562.png 1024w, https://blog.apparentsoft.com/wp-content/uploads/2024/02/Screenshot-2024-02-26-at-21.09.32-980x538.png 980w, https://blog.apparentsoft.com/wp-content/uploads/2024/02/Screenshot-2024-02-26-at-21.09.32-480x263.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></figure>



<h2 class="wp-block-heading">Integration with Hookmark in Setapp</h2>



<p>Lastly, Trickster fixes its integration with the <a href="https://go.setapp.com/stp255?refAppID=357">Setapp</a> version of <a href="https://hookproductivity.com">Hookmark</a>.</p>
<p>The post <a href="https://blog.apparentsoft.com/business/2039/trickster-3-9-2-release-notes/">Trickster 3.9.2 Release Notes</a> appeared first on <a href="https://blog.apparentsoft.com">Apparent Software</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Better integrations and Favorites in Trickster 3.9.1</title>
		<link>https://blog.apparentsoft.com/trickster/1992/better-integrations-and-favorites-in-trickster-3-9-1/</link>
		
		<dc:creator><![CDATA[Jacob Gorban]]></dc:creator>
		<pubDate>Tue, 07 Mar 2023 00:44:20 +0000</pubDate>
				<category><![CDATA[Trickster]]></category>
		<guid isPermaLink="false">https://blog.apparentsoft.com/?p=1992</guid>

					<description><![CDATA[<p>The new version of Trickster introduces the following changes:</p>
<p>The post <a href="https://blog.apparentsoft.com/trickster/1992/better-integrations-and-favorites-in-trickster-3-9-1/">Better integrations and Favorites in Trickster 3.9.1</a> appeared first on <a href="https://blog.apparentsoft.com">Apparent Software</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>The new version of Trickster introduces the following changes:</p>



<ul class="wp-block-list">
<li>Improved integration with <a href="https://hookproductivity.com/" target="_blank" rel="noreferrer noopener">Hookmark</a> and <a href="https://www.devontechnologies.com/apps/devonthink" target="_blank" rel="noreferrer noopener">DEVONthink</a>
<ul class="wp-block-list">
<li>Change name from Hook to its rebrand name Hookmark.</li>



<li>Display Hookmark button for tracked DEVONthink documents that have hooks.</li>



<li>Invoking Hookmark on a DEVONthink item in Trickster will provide expected URL to DEVONthink.</li>
</ul>
</li>



<li>What was called Preferences is now called Settings on macOS Ventura and Trickster is now following that convention</li>



<li>Added a setting to select what should be displayed in the Favorites sidebar: Icon, Title or Both (like previously).</li>
</ul>



<figure class="wp-block-image aligncenter size-full is-resized is-style-default"><a href="https://blog.apparentsoft.com/wp-content/uploads/2023/03/Trickster-favorites-icons-only.png"><img loading="lazy" decoding="async" src="https://blog.apparentsoft.com/wp-content/uploads/2023/03/Trickster-favorites-icons-only.png" alt="The new favorites sidebar, with only icons visible" class="wp-image-1994" width="566" height="504"/></a><figcaption class="wp-element-caption">The new favorites sidebar, with only icons visible</figcaption></figure>
<p>The post <a href="https://blog.apparentsoft.com/trickster/1992/better-integrations-and-favorites-in-trickster-3-9-1/">Better integrations and Favorites in Trickster 3.9.1</a> appeared first on <a href="https://blog.apparentsoft.com">Apparent Software</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Getting Started with Trickster</title>
		<link>https://blog.apparentsoft.com/trickster/1930/getting-started-with-trickster/</link>
		
		<dc:creator><![CDATA[Braden]]></dc:creator>
		<pubDate>Fri, 23 Dec 2022 19:12:25 +0000</pubDate>
				<category><![CDATA[article]]></category>
		<category><![CDATA[Trickster]]></category>
		<guid isPermaLink="false">https://blog.apparentsoft.com/?p=1930</guid>

					<description><![CDATA[<p>Getting up and running with Trickster: Recently Used Files is easy, and takes only a few minutes. Follow along to learn how to install the app on your Mac, choose which files and folders to track, and how to prevent specific file types from being tracked. Get ready to boost your productivity by always having [&#8230;]</p>
<p>The post <a href="https://blog.apparentsoft.com/trickster/1930/getting-started-with-trickster/">Getting Started with Trickster</a> appeared first on <a href="https://blog.apparentsoft.com">Apparent Software</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Getting up and running with <a href="https://apps.apple.com/us/app/trickster-recently-used-files/id509641724?mt=12">Trickster: Recently Used Files</a> is easy, and takes only a few minutes. Follow along to learn how to install the app on your Mac, choose which files and folders to track, and how to prevent specific file types from being tracked. Get ready to boost your productivity by always having the files you need right at hand! If you&#8217;d like to watch a video of this process, you can visit our <a href="https://www.youtube.com/watch?v=vOmNtieLRHQ&amp;ab_channel=ApparentSoftware">YouTube channel</a>.</p>



<figure class="wp-block-image size-large"><a href="https://blog.apparentsoft.com/wp-content/uploads/2022/12/trickster_first_look_screenshots_.jpg"><img loading="lazy" decoding="async" width="1024" height="512" src="https://blog.apparentsoft.com/wp-content/uploads/2022/12/trickster_first_look_screenshots_-1024x512.jpg" alt="" class="wp-image-1936" srcset="https://blog.apparentsoft.com/wp-content/uploads/2022/12/trickster_first_look_screenshots_-1024x512.jpg 1024w, https://blog.apparentsoft.com/wp-content/uploads/2022/12/trickster_first_look_screenshots_-980x490.jpg 980w, https://blog.apparentsoft.com/wp-content/uploads/2022/12/trickster_first_look_screenshots_-480x240.jpg 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></figure>



<h2 class="wp-block-heading">Installing Trickster</h2>



<p>Installing Trickster is easy. Just <a href="https://www.apparentsoft.com/trickster/download">download Trickster</a> from our website. You can download Trickster with your favorite web browser, but if you have any issues try using Safari. Web browsers save files to the Downloads folder by default, so that&#8217;s probably where it&#8217;s waiting.</p>



<p>The Trickster app icon looks like a top hat with a rabbit popping out. If you see an icon that looks like a sheet of paper with a zipper instead, just double-click it to expand the app. Now you can drag the Trickster top hat icon to your Applications folder. Once it&#8217;s there, double-click the Trickster icon to get started.</p>



<figure class="wp-block-image size-large"><a href="https://blog.apparentsoft.com/wp-content/uploads/2022/12/01_installing_trickster.jpg"><img loading="lazy" decoding="async" width="1024" height="512" src="https://blog.apparentsoft.com/wp-content/uploads/2022/12/01_installing_trickster-1024x512.jpg" alt="" class="wp-image-1938" srcset="https://blog.apparentsoft.com/wp-content/uploads/2022/12/01_installing_trickster-1024x512.jpg 1024w, https://blog.apparentsoft.com/wp-content/uploads/2022/12/01_installing_trickster-980x490.jpg 980w, https://blog.apparentsoft.com/wp-content/uploads/2022/12/01_installing_trickster-480x240.jpg 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></figure>



<h2 class="wp-block-heading">Understanding Trickster&#8217;s Interface</h2>



<p>Trickster adds a top hat to your Mac&#8217;s menu bar so you have quick access to your files. Click it to open the Trickster window where you can see your recently added, opened, or modified documents and folders. The left edge of the window lets you quickly filter what you see. Click the file drawer, for example, to see all recently modified files and folders. Click the photo to see just images and other graphics files, and click the folder to see the folders where the contents have recently changed.</p>



<p>The window&#8217;s bottom bar includes <a href="https://discourse.apparentsoft.com/docs?ascending=true&amp;order=title&amp;tags=trickster-manual&amp;topic=32">several handy tools</a>. Working from left to right, here&#8217;s what you&#8217;ll find:</p>



<ul class="wp-block-list">
<li><strong>Filters Menu</strong>: From here, you can add and remove tracked folders, and make filters for controlling what Trickster shows you.<br></li>



<li><strong>Active App Filter</strong>: Click this to show files for just the currently active app. If you&#8217;re working on a report in Pages, for example, only Pages documents will appear.<br></li>



<li><strong>Row Style Options</strong>: Compact Row shows file, folder, or app names along with small icons. Extended Row shows the item name and path with large icons.<br></li>



<li><strong>Sort Options</strong>: These options let you sort items by most recently active, or alphabetically.<br></li>



<li><strong>Search</strong>: The search field lets you look for items by name.<br></li>



<li><strong>Main Menu</strong>: This is where to go to find Tricker&#8217;s preferences, check for app updates, and more.</li>
</ul>



<figure class="wp-block-image size-large"><a href="https://blog.apparentsoft.com/wp-content/uploads/2022/12/02_understanding_the_trickster_interface.jpg"><img loading="lazy" decoding="async" width="1024" height="512" src="https://blog.apparentsoft.com/wp-content/uploads/2022/12/02_understanding_the_trickster_interface-1024x512.jpg" alt="" class="wp-image-1940" srcset="https://blog.apparentsoft.com/wp-content/uploads/2022/12/02_understanding_the_trickster_interface-1024x512.jpg 1024w, https://blog.apparentsoft.com/wp-content/uploads/2022/12/02_understanding_the_trickster_interface-980x490.jpg 980w, https://blog.apparentsoft.com/wp-content/uploads/2022/12/02_understanding_the_trickster_interface-480x240.jpg 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></figure>



<h2 class="wp-block-heading">Adding Watched Folders to Trickster</h2>



<p>To get the most out of Trickster, you need to <a href="https://discourse.apparentsoft.com/t/2-configure-file-tracking/33">track the folders</a> and documents that are most important to you. That could be your Downloads folder, client projects, the Documents folder, or a photos folder, for example.</p>



<p>While the idea of letting Trickster monitor your entire Home directory may sound appealing—after all, seeing every recently changed file or folder sounds pretty handy—you should be more deliberate and specific with your choices. macOS makes and modifies a lot of files behind the scenes that you probably don&#8217;t need filling up your Trickster views.</p>



<p>To add new tracked folders, start by clicking the Trickster menu bar item, then click the Filters Menu button in the app window&#8217;s lower left corner. Now click Configure File Tracking. Next, click Watched Folders and drag the folders you want to track into the right-side column. When you&#8217;re done adding folders, click Apply Changes.</p>



<p>Trickster automatically monitors everything inside the folders you add, so changes in subfolders show up, too. Here&#8217;s an example: Let&#8217;s say you add your Documents folder to the Watched Folders list. If you make a new folder called &#8220;My Favorite Recipes&#8221; inside Documents, new and edited documents in the &#8220;My Favorite Recipes&#8221; folder are also tracked by Trickster.</p>



<figure class="wp-block-image size-large"><a href="https://blog.apparentsoft.com/wp-content/uploads/2022/12/03_add_watched_folders_to_trickster.jpg"><img loading="lazy" decoding="async" width="1024" height="512" src="https://blog.apparentsoft.com/wp-content/uploads/2022/12/03_add_watched_folders_to_trickster-1024x512.jpg" alt="" class="wp-image-1939" srcset="https://blog.apparentsoft.com/wp-content/uploads/2022/12/03_add_watched_folders_to_trickster-1024x512.jpg 1024w, https://blog.apparentsoft.com/wp-content/uploads/2022/12/03_add_watched_folders_to_trickster-980x490.jpg 980w, https://blog.apparentsoft.com/wp-content/uploads/2022/12/03_add_watched_folders_to_trickster-480x240.jpg 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></figure>



<h2 class="wp-block-heading">Excluding Items You Don’t Want to Track</h2>



<p>Just because you want to see your recent files and folders in an easy to use interface doesn&#8217;t necessarily mean you want to see every file. Let&#8217;s say, for example, you don&#8217;t need to see .XML files.</p>



<p>Start by clicking the Filters Menu button, then click Configure File Tracking. Click Excluded Extensions, then click the plus button to add an extension. Now enter the extension without a period at the beginning. If you don&#8217;t want to see .XML files, for example, enter &#8220;XML&#8221; in the field. Now click Apply Changes.</p>



<figure class="wp-block-image size-large"><a href="https://blog.apparentsoft.com/wp-content/uploads/2022/12/04_excluding_items_you_dont_want_to_track.jpg"><img loading="lazy" decoding="async" width="1024" height="512" src="https://blog.apparentsoft.com/wp-content/uploads/2022/12/04_excluding_items_you_dont_want_to_track-1024x512.jpg" alt="" class="wp-image-1941" srcset="https://blog.apparentsoft.com/wp-content/uploads/2022/12/04_excluding_items_you_dont_want_to_track-1024x512.jpg 1024w, https://blog.apparentsoft.com/wp-content/uploads/2022/12/04_excluding_items_you_dont_want_to_track-980x490.jpg 980w, https://blog.apparentsoft.com/wp-content/uploads/2022/12/04_excluding_items_you_dont_want_to_track-480x240.jpg 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></figure>



<h2 class="wp-block-heading">Favoriting Folders and Files</h2>



<p>You can quickly access the files and folders you use most by adding them to Trickster&#8217;s <a href="https://discourse.apparentsoft.com/t/4-favorites-sidebar/35">Favorites sidebar</a>. If you don&#8217;t see the Favorites bar, click the star in the upper right corner of the Trickster window.</p>



<p>To add folders or documents to Favorites, just click and drag the item from any of Trickster&#8217;s recent files lists into the Favorites sidebar. Double-clicking an item in Favorites automatically opens it. You can also move or copy items by dragging them from the Finder onto folders in Trickster&#8217;s Favorites sidebar.</p>



<figure class="wp-block-image size-large"><a href="https://blog.apparentsoft.com/wp-content/uploads/2022/12/05_favorite_folders_and_files.jpg"><img loading="lazy" decoding="async" width="1024" height="512" src="https://blog.apparentsoft.com/wp-content/uploads/2022/12/05_favorite_folders_and_files-1024x512.jpg" alt="" class="wp-image-1942" srcset="https://blog.apparentsoft.com/wp-content/uploads/2022/12/05_favorite_folders_and_files-1024x512.jpg 1024w, https://blog.apparentsoft.com/wp-content/uploads/2022/12/05_favorite_folders_and_files-980x490.jpg 980w, https://blog.apparentsoft.com/wp-content/uploads/2022/12/05_favorite_folders_and_files-480x240.jpg 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></figure>



<h2 class="wp-block-heading">Getting Even More Out of Trickster</h2>



<p>With Trickster set up to track just what you want, you can find the files you need without spending time manually searching through lots of folders. You can copy, move, rename, and delete files, just like you do in the Finder. Just select the item in the Trickster window, and drag it like you normally do, or click the gear icon to the right of the item&#8217;s name to do more, such as rename, show in Finder, and move to the Trash.</p>



<p>Read what Apple loves about Trickster in their App Store feature story, &#8220;<a href="https://apps.apple.com/us/story/id1466985828">Files at Your Fingertips</a>.&#8221;</p>



<p>To learn even more about what makes Trickster great, check out the <a href="https://www.apparentsoft.com/trickster/manual">online user manual</a> for more tips and tricks or watch the video below!</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Getting Started With Trickster: the Mac Menu Bar Productivity App to Find Recent Files" width="1080" height="608" src="https://www.youtube.com/embed/vOmNtieLRHQ?feature=oembed"  allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div></figure>
<p>The post <a href="https://blog.apparentsoft.com/trickster/1930/getting-started-with-trickster/">Getting Started with Trickster</a> appeared first on <a href="https://blog.apparentsoft.com">Apparent Software</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Cashculator 2.1 brings CSV export</title>
		<link>https://blog.apparentsoft.com/cashculator/1953/cashculator-2-1-brings-csv-export/</link>
		
		<dc:creator><![CDATA[Jacob Gorban]]></dc:creator>
		<pubDate>Fri, 23 Dec 2022 14:55:21 +0000</pubDate>
				<category><![CDATA[Announcements]]></category>
		<category><![CDATA[Cashculator]]></category>
		<guid isPermaLink="false">https://blog.apparentsoft.com/?p=1953</guid>

					<description><![CDATA[<p>Cashculator 2.1 is available on the Mac App Store. Here are the release notes: We have also started work on importing transactions from a CSV file</p>
<p>The post <a href="https://blog.apparentsoft.com/cashculator/1953/cashculator-2-1-brings-csv-export/">Cashculator 2.1 brings CSV export</a> appeared first on <a href="https://blog.apparentsoft.com">Apparent Software</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p><a href="https://cashculator.app">Cashculator</a> 2.1 is available on the <a href="https://apps.apple.com/app/cashculator-easy-finances/id1591642644">Mac App Store</a>. Here are the release notes:</p>



<ul class="wp-block-list">
<li>NEW: Export to a CSV file.
<ul class="wp-block-list">
<li>Export any table (including reconciliation and reports)</li>



<li>Export list of transactions.</li>



<li>Find “Export” commands in the File menu.</li>
</ul>
</li>



<li>NEW: Disabling of categories.
<ul class="wp-block-list">
<li>Disabled categories don’t affect totals and allow for quick simple “what-ifs”.</li>



<li>Find “Disable” commands in a category’s context menu (right-click on a category), or in the Categories submenu in Edit menu.</li>
</ul>
</li>



<li>IMPROVED: Standalone “new document” window</li>



<li>UX improvements and Bug fixes</li>
</ul>



<p>We have also started work on importing transactions from a CSV file</p>
<p>The post <a href="https://blog.apparentsoft.com/cashculator/1953/cashculator-2-1-brings-csv-export/">Cashculator 2.1 brings CSV export</a> appeared first on <a href="https://blog.apparentsoft.com">Apparent Software</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
