Jekyll2024-01-23T21:43:43+00:00https://cdf1982.com/feed.xmlcdf1982.comCiao, I’m Cesare. I'm an indie Mac and iOS developer and this is the home for my apps and blog.Cesare ForelliHappy birthday, Macintosh2024-01-23T00:00:00+00:002024-01-23T00:00:00+00:00https://cdf1982.com/2024/01/23/happy_40th_birthday_mac<p>I believe the <strong>Mac’s 40th birthday</strong> really deserves a celebration and I hope Apple will do something special tomorrow <em>(not <a href="https://everymac.com/systems/apple/20th_mac/specs/20th-anniversary-mac.html">that</a> special, a nice home page will do…)</em>.</p>
<p>As much as I would like to say I’ve been here for the whole journey, that would have made me a pretty precocious <em>2-year old</em>…</p>
<p><strong>The oldest memory I have of the Macintosh is from a few weeks before Christmas 1992</strong> when I was on the market for the first computer my parents were going to purchase for me: an early adopter friend of my brother, who later became my brother-in-law, showed me his Quadra 950 with a gorgeous 20” monitor; I was enchanted, but then he explained I would hardly have any game to play on it and recommended I buy a PC instead.<br />
As a 10-year-old, that made lots of sense <em>(games!)</em>, so I specced out a 486 DX2 66Mhz with 4 megs of RAM, 170 megabytes of hard disk, and a mediocre 14” monitor and went on with my days of Monkey Island, Syndicate, Theme Park, Scream and so many more games I fondly remember… But rest assured, <strong>to this day I still give my brother-in-law grief for that suggestion</strong>, which I suspect had more to do with him not wanting to provide tech support to a pestiferous kid!</p>
<p>Then, I didn’t really pay much attention to Apple Computers inc. for many years, with the Newton being the only Apple device in my home in the late Nineties; the first iMac looked interesting, but maybe a bit of a toy to the eyes of a M$ teenager busy installing Windows 98 over and over on a Pentium II with the case open more often than closed.</p>
<p>Jump to 2006, when Windows betrayed me for the last time (I’m still <em>mad</em>), costing me all the data on my Vaio 17” “laptop” (<a href="https://www.ebay.co.uk/itm/134900797920?hash=item1f68b6d1e0:g:aZMAAOSwD~ZlrTwT">this thing</a>), which at that point was work stuff, so quite a big deal.<br />
I instantly decided to pull the trigger on a <a href="https://en.wikipedia.org/wiki/Power_Mac_G5">PowerMac G5 Quad</a>, with an essential factor being the instant love I developed for the 30” Cinema Display (and true love it was: I ended up buying two more in the next couple years, becoming a true <a href="https://www.reddit.com/r/Monitors/comments/mjuett/history_al_gore_sitting_in_front_of_three_30/">Al Gore</a>… and two of those displays are still in use today!).<br />
<strong>I remember like it’s yesterday that for days – weeks really – I admired in disbelief Tiger’s interface while enjoying so much screen real estate I wasn’t really sure what to do with it…</strong> <em>(spoiler alert: I’ve found plenty of ways!)</em>
And don’t get me started on how it looked when you opened it, so clean and beautiful (on this front, I believe Apple peaked with the <a href="https://images.anandtech.com/doci/15218/360__b0vqz8pfgqoi_large.jpg">2019 Mac Pro</a>, a true masterpiece, and a computer I’d really love to purchase used someday).<br />
Back to my first Mac, I’ve never smiled so much at a computer since those days, which is kind of a good sign for my mental stability, but also a very fond memory.</p>
<p>From that moment, I’ve never looked back: at the time I worked in a city and lived in another 200 miles away, so the next year I purchased a Core 2 Duo iMac for home, by far the least used computer of my life because the CPU was miserably slow and having a second desktop computer – before cloud sync – in a different city wasn’t the best laid out plan in the first place.</p>
<p>In 2008 I “promoted” my G5 to the role of server at work because the Mac Pro 8 core was <em>just too tempting</em>. And I was right… wow, what a computer it was: fast like anything else I’ve seen before, 16 GB of RAM, 4 SAS drives in RAID (hardware!) spinning at 10.000 rpm, 3 GPUs (one per monitor, I don’t know <em>why</em> I did that).<br />
<strong>That Mac Pro lasted me a really long time, months shy of TEN years</strong>, during which I added RAM, replaced drives and graphic cards, bought new batteries for the RAID card, and even replaced the logic board after a storm. You know, the things we used to be able to do with computers. And when Apple stopped providing OS updates, <a href="http://dosdude1.com">dosdude1</a> saved the day. <em>Dude, thank you, really!</em></p>
<p>I’d hate not to mention the 17” MacBook Pro I used for work between 2009 and 2013, the best built and most solid laptop/military ship I’ve ever seen, which of course I <em>destroyed</em> carrying it around daily, and a 2011 Dual Core Mac Mini which I used way too much considering how not-fast it was.</p>
<p>Then there’s an odd parenthesis (<em>betrayal!</em>): when my Mac Pro was starting to get long in the tooth, especially for the Swift compiler, I didn’t really find a Mac that was in my budget <em>and my dreams</em> at the same time. But leaving macOS wasn’t – <em>isn’t, ever will be</em> – an option, so I did build a couple Hackintoshes – one for home, one for work – and extracted years of great performance for really little money. No regrets, really, because I still had what really mattered to me, the Mac’s soul, macOS.</p>
<p>But then came Apple silicon and Cupertino won me back on the hardware side as well, and they did so big time.<br />
I had a hunch it was going to happen when I got a DTK for starting early development of a native version of <a href="https://www.glancecam.app">GlanceCam</a>: if an iPad chip ran macOS <em>like that</em>, the future of the Mac was really bright. Exciting times ahead, just a few years after a dark period in which we all worried Apple wasn’t invested in the Mac anymore.</p>
<p>Obviously, I resisted only a few months when the first M1s launched, and then purchased a maxed-out M1 Air, a computer I still find hard to wrap my head around: performance-wise, it had nothing less to offer than my liquid-cooled, overclocked 70 pounds i7 Hackintosh, but in a feather format with mind-blowing battery life.<br />
<strong>To me, the best Mac of <em>my life</em> will probably always be the 2008 Mac Pro, but the best Mac <em>EVER</em> has to be the M1 Air.</strong></p>
<p>And yet just last week I sold the best Mac ever, after getting a nice M3 Max in December. And oh, I have <em>so. much. to. say.</em> about this computer. Anyone around me knows I can’t stop talking about it 😬: tech life is all about tradeoffs, and I am happier than I’d have imagined to have given up <em>the silent feather</em> for this ferociously fast beast with an amazingly bright display and definitely noticeable fans. I’ll probably blog about this computer in a few weeks, for now I’m still measuring up what it can do, and I find no end.</p>
<p>In a way, it seems to lack perspective to close a “happy birthday” post for the Mac by praising the last computer Apple launched, but it’s also a testament to the journey the platform had: like the Ship of Theseus, with 4 CPU architectures and two major operating systems, the Mac changed every bit and component, but at its core is still exactly the same: the best computing platform by 10.000 miles, capable of empowering people to do anything they set their mind to while remaining beautiful to look at <em>(even tough macOS is a bit too grey for me these days, and I won’t cry the day Alan Dye will retire)</em> and easy to use.</p>
<p>You are truly a unique technological wonder, Mac. <strong>Happy birthday, and keep smiling!</strong></p>Cesare ForelliI believe the Mac’s 40th birthday really deserves a celebration and I hope Apple will do something special tomorrow (not that special, a nice home page will do…).Best of 20232023-12-28T00:00:00+00:002023-12-28T00:00:00+00:00https://cdf1982.com/2023/12/28/best_of_2023<p>It appears that in 2022 I wasn’t in the mood for writing my <em>usual</em> <a href="https://cdf1982.com/tag/best-of-the-year">best-of-the-year</a> post, which is odd because I mostly collect things throughout the year and I quite enjoy writing (and reading) such collections.</p>
<p>Here’s my picks for 2023, using the same categories of the years before; as always, no affiliate links, just stuff I enjoyed.</p>
<p><strong>Best song</strong>: Don’t know if you’ve heard of this Taylor Swift gal… <a href="https://music.apple.com/it/album/castles-crumbling-taylors-version-from-the-vault-feat/1690839749?i=1690841083">Castles Crumbling</a> is a pretty great song, and the fact it also features Hayley Williams is the perfect cherry on top.</p>
<p><strong>Best album</strong>: So, there’s this emerging artist that released a good album, <a href="https://music.apple.com/it/album/midnights/1649434004">Midnights</a>…</p>
<p><strong>Best book</strong>: Don Winslow’s <a href="https://books.apple.com/it/book/missing-new-york/id931769335">Missing - New York</a> was hard to put down.</p>
<p><strong>Best movie</strong>: <a href="https://www.imdb.com/title/tt2937898/">A Most Violent Year</a> came out in 2014, but I only found out about it this year and it was so superior to anything else I’ve watched that it easily takes the <em>award</em>.</p>
<p><strong>Best TV show</strong>: This is extremely hard, I’ve seen multiple excellent shows, old and new, and my (not-so) short list includes:</p>
<ul>
<li><a href="https://www.imdb.com/title/tt3581920/?ref_=rt_li_tt">The Last of Us</a></li>
<li><a href="https://www.imdb.com/title/tt8111088/?ref_=rt_li_tt">The Mandalorian</a></li>
<li><a href="https://www.imdb.com/title/tt0412253/?ref_=rt_li_tt">Veronica Mars</a> (3rd rewatch)</li>
<li><a href="https://www.imdb.com/title/tt3230854/?ref_=rt_li_tt">The Expanse</a></li>
<li><a href="https://www.imdb.com/title/tt14688458/?ref_=rt_li_tt">Silo</a></li>
<li><a href="https://www.imdb.com/title/tt13111078/?ref_=rt_li_tt">Special Ops Lioness</a></li>
</ul>
<p>… but I can only pick one.</p>
<p><em>After All These Years, Do You Not Instinctively…</em> know it’s Veronica Mars?
Oh, and the obligatory <em>fuck you Rob Thomas</em> goes here.</p>
<p><strong>Best podcast</strong>: <a href="https://overcast.fm/+2hmWyOQ7c">This is Love episode 63 - Sampson and Baylor</a>, and keep tissues at hand. Also good: <a href="https://overcast.fm/+5K6al4LGU">Cautionary Tales - The Hero Who Rode His Segway Off a Cliff</a></p>
<p><strong>Best article I read</strong>: Before AI fatigue kicked in, I did really enjoy Kevin Roose’s <a href="https://www.nytimes.com/2023/02/16/technology/bing-chatbot-microsoft-chatgpt.html">A Conversation With Bing’s Chatbot Left Me Deeply Unsettled</a>, but I don’t know if I’d feel the same reading it now for the first time.</p>
<p><strong>Best Mac app</strong>: A new entry! <a href="https://rectangleapp.com/pro">Rectangle Pro</a> is by far, and I mean <em>by far</em>, the best window manager I’ve tried. And I tried them all.</p>
<p><strong>Best iOS app</strong>: If you met me, you know <a href="https://www.omnigroup.com/omnifocus">OmniFocus</a> always <em>makes the list</em>, and with the recent release of version 4, great on all platforms but especially versatile and fast on iOS, it’s an extremely easy pick.</p>
<p><strong>Best videogame</strong>: <a href="https://zelda.nintendo.com/tears-of-the-kingdom/">Tears of the Kingdom</a> or <a href="https://returntomonkeyisland.com">Return to Monkey Island</a>? Just getting one game that’s so good would make a year shine. But in the end, Guybrush will always have my loyalty, even if the ending really made me sad.</p>
<p><strong>Best video</strong>: Tough choice: humans <a href="https://www.youtube.com/watch?v=SGPjFFMD3c0&list=FLn0XxNj34RZDB05nByGXdjQ&index=22">make incredible things</a>, <a href="https://www.youtube.com/watch?v=mLrVxEJ7pZ8&list=FLn0XxNj34RZDB05nByGXdjQ&index=15">really</a>. But I think this <a href="https://www.youtube.com/watch?v=OLudqeJRsCw&list=FLn0XxNj34RZDB05nByGXdjQ&index=4">Dog Mountain</a> video is the best thing I’ve watched in a long time.</p>
<p>Thanks for reading, I hope you’ve found something interesting here!</p>
<p><strong>Wish you a very happy 2024! 🥂</strong></p>Cesare ForelliIt appears that in 2022 I wasn’t in the mood for writing my usual best-of-the-year post, which is odd because I mostly collect things throughout the year and I quite enjoy writing (and reading) such collections.5002023-11-30T00:00:00+00:002023-11-30T00:00:00+00:00https://cdf1982.com/2023/11/30/500<p>Just taking a quick moment to acknowledge a significant milestone for <a href="https://www.glancecam.app">GlanceCam</a>: today my beloved IP camera viewer for Mac <strong>reached 500 Mac App Store ratings</strong>.</p>
<p>The 4.2 average might not sound like much, but for a niche and nerdy app that requires some network knowledge and a bit of setup – therefore getting the occasional 1-star from people who didn’t really <em>read the label</em> – is actually pretty good, and I feel great because it’s only going up.</p>
<p>It took 5.5 years to get here, but I am determined to get to 1.000 – with at least 4.5 stars average – by March 29, 2025, GlanceCam’s <a href="https://cdf1982.com/2018/03/29/glancecam_is_here.html">7th birthday</a>. A bit ambitious, but isn’t that what goals are for?</p>Cesare ForelliJust taking a quick moment to acknowledge a significant milestone for GlanceCam: today my beloved IP camera viewer for Mac reached 500 Mac App Store ratings.Bitten by URL initialisation changes2023-11-26T00:00:00+00:002023-11-26T00:00:00+00:00https://cdf1982.com/2023/11/26/url-initialisation-changes-in-ios-17-and-macos-sonoma<p>In early October I read a <a href="https://augmentedcode.io/2023/10/02/changes-to-url-string-parsing-in-ios-17/">blog post by Toomas Vahter</a> describing a change introduced in Xcode 15 beta 5 over the summer and that I didn’t notice in the release notes at the time <em>(guilty, I don’t read them for every beta)</em>.</p>
<p>The post detailed the effects of the change, summarised in the following disclaimer Apple added to <a href="https://developer.apple.com/documentation/foundation/url/3126806-init">URL’s documentation</a>:</p>
<blockquote>
<p>For apps linked on or after iOS 17 and aligned OS versions, <a href="https://developer.apple.com/documentation/foundation/url"><code class="language-plaintext highlighter-rouge">URL</code></a> parsing has updated from the obsolete RFC 1738/1808 parsing to the same <a href="https://www.ietf.org/rfc/rfc3986.txt">RFC 3986</a> parsing as <a href="https://developer.apple.com/documentation/foundation/urlcomponents"><code class="language-plaintext highlighter-rouge">URL</code></a>. This unifies the parsing behaviors of the <code class="language-plaintext highlighter-rouge">URL</code> and <code class="language-plaintext highlighter-rouge">URLComponents</code> APIs. Now, <code class="language-plaintext highlighter-rouge">URL</code> automatically percent- and IDNA-encodes invalid characters to help create a valid URL.</p>
</blockquote>
<p>After reading that post, I reviewed the official documentation, since I make <a href="https://www.glancecam.app">a Mac app</a> that allows Users to enter their IP camera URLs for streaming purposes; I also ran additional tests on Sonoma, even if I had been using the new macOS and Xcode betas on my main computer all summer, without noticing any issue.
Since everything was fine, I concluded that my initial interpretation of the note – <em>“For apps <strong>linked on or after</strong> iOS 17 and aligned OS versions”</em> – was correct and that I would not need to deal with the change until I would have raised the deployment target of my app from macOS 10.14 to Sonoma or newer.</p>
<p>My assumption was <strong>quite the mistake</strong>: <del><em>linked on</em> does not mean targeting, turns out™ that Apple means <em>running on</em>. Most certainly a native English speaker would have had a better month than I had…</del></p>
<blockquote>
<p><strong>Next day update #1:</strong> As <a href="https://mastodon.social/@lapcatsoftware/111477120131417551">Jeff Johnson</a> and <a href="https://social.blach.io/@lextar/111478870807601367">Alexander Blach</a> kindly and patiently explained, <em>linked on</em> refers to the SDK version: as soon as my app compiled with Xcode 15 (which includes the macOS 14 SDK) runs on macOS 14 Sonoma, the new URL behavior is used. I really appreciate their help in clarifying the meaning and implications of that note!</p>
</blockquote>
<p>Here’s a quick recap of the long journey that reminded me, again, that words matter <em>a lot</em> and, most importantly, <strong>what you might need to know if you deal with URLs in an app running on Apple platforms</strong>.</p>
<p>A bit of context: my app does not have a large user-base, we’re talking very few thousands Users; on Sonoma launch day, I had a new version ready and for 99% of the Users who updated macOS, it was smooth sailing; I had a hiccup that required a quick update for Users still on 10.14, because <a href="https://developer.apple.com/documentation/xcode-release-notes/xcode-15-release-notes#Linking">Xcode 15 made a bit of a mess with linking</a>, but everything went well after that, as I did expect after running the app on Sonoma all summer.</p>
<p>Then, over the following weeks, 5 different Users contacted me reporting a <strong>crash at launch</strong>; reinstalling a previous version of my app that I provided patched the problem, allowing them to immediately resume using the app, but any new beta I sent trying to investigate what was going on would crash and burn immediately at launch, and the crash reports they kindly provided pointed me to code that had been left unchanged for years.</p>
<p>There was no common hardware or software denominator among them, only that they ran Sonoma and had previously been using my app for a while.
As for me, I could not reproduce the crash, and taking out every single line changed in last releases did not help: the same source code of the previous version they had installed and were using successfully immediately crashed after recompiling it.
All of these Users have been so patient and supportive, I can’t thank them enough for helping me throughout very frustrating weeks.</p>
<p>Finally, I built a beta with logging on file for each single step the app performs at launch, and found this message logged:</p>
<div class="language-swift highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="nf">dataCorrupted</span><span class="p">(</span>
<span class="kt">Swift</span><span class="o">.</span><span class="kt">DecodingError</span><span class="o">.</span><span class="kt">Context</span><span class="p">(</span>
<span class="nv">codingPath</span><span class="p">:</span> <span class="p">[</span><span class="nf">_JSONKey</span><span class="p">(</span><span class="nv">stringValue</span><span class="p">:</span> <span class="s">"Index 3"</span><span class="p">,</span> <span class="nv">intValue</span><span class="p">:</span> <span class="mi">3</span><span class="p">),</span> <span class="kt">CodingKeys</span><span class="p">(</span><span class="nv">stringValue</span><span class="p">:</span> <span class="s">"webcamStreamURL"</span><span class="p">,</span> <span class="nv">intValue</span><span class="p">:</span> <span class="kc">nil</span><span class="p">)],</span>
<span class="nv">debugDescription</span><span class="p">:</span> <span class="s">"Invalid URL string."</span><span class="p">,</span>
<span class="nv">underlyingError</span><span class="p">:</span> <span class="kc">nil</span>
<span class="p">)</span>
<span class="p">)</span>
</code></pre></div></div>
<p>One by one, all Users’ logs showed a similar message, so I immediately thought about that URL change that <em>would not be relevant for me right now</em>. But why only for these 5 people, and not hundreds of other Users who were using Sonoma without any issue?</p>
<p>I asked some of the 5 Users about their URLs, and found out they had special characters in their passwords. Uhm, interesting. Never been a problem, but I certainly could try using the new <a href="https://developer.apple.com/documentation/foundation/url/4191020-init"><code class="language-plaintext highlighter-rouge">URL(string:encodingInvalidCharacters:)</code></a> initialised with <code class="language-plaintext highlighter-rouge">false</code> and see if it helped.</p>
<p>It did not.</p>
<p>What certainly helped was discovering that just adding a @ inside a password would cause the last version of my app to crash, but not the previous ones. Oh, <strong>the joy of finally being able to reproduce a bug</strong>.</p>
<p>Manually escaping those special characters, or changing passwords to alphanumerical ones, also was a relevant discovery.</p>
<p>mmm.</p>
<p>Thanks to a precious suggestion <a href="https://mastodon.social/@mattiem/111459775491506431">from a friend who systematically saves my bacon</a>, I then learned that a URL could be decoded as String; that piece of knowledge snowballed into learning very interesting – and to me unexpected – things.</p>
<p>So, let’s jump into what I did find out today, doing experiments with a Playground.</p>
<p>First, let’s <strong>review the URL behavior I have serenely enjoyed for over five years</strong>:</p>
<p><img src="/assets/images/blog/2023-11-26-url-initialisation-changes-in-sonoma-ios17/01_Ventura_Xcode14_NO_special_characters.png" alt="" /></p>
<p><img src="/assets/images/blog/2023-11-26-url-initialisation-changes-in-sonoma-ios17/02_Ventura_Xcode14_WITH_special_characters.png" alt="" /></p>
<p><img src="/assets/images/blog/2023-11-26-url-initialisation-changes-in-sonoma-ios17/03_Ventura_Xcode15_WITH_special_characters.png" alt="" /></p>
<p>All three screenshots were taken on <strong>Ventura</strong>, <strong>both with Xcode 14 and 15</strong>.</p>
<p>You can see that <strong>the URL initialises successfully even when a “special character” is included in the password</strong>.</p>
<p>Now, <strong>look at what happens on Sonoma with Xcode 15</strong> <em>(daily I use 15.0, but the latest version available at this date – 15.1 beta 3 – behaves exactly the same)</em>:</p>
<p><img src="/assets/images/blog/2023-11-26-url-initialisation-changes-in-sonoma-ios17/04_Sonoma_Xcode15_NO_special_characters.png" alt="" /></p>
<p><img src="/assets/images/blog/2023-11-26-url-initialisation-changes-in-sonoma-ios17/05_Sonoma_Xcode15_WITH_special_characters.png" alt="" /></p>
<p>Saw that on line 10? <strong>Just throw in a special character into the password and the URL is nil</strong>; fine, circa, at least now I know where my last weeks went <em>(actually very annoying to have a breaking change like this one poorly documented)</em>.</p>
<p>But what about the new URL initialiser that has a parameter that enforces the previous behavior?
Yeah, using that one – on line 11 – does not change the result, still nil. <del>This is quite the surprise.</del></p>
<blockquote>
<p><strong>Next day update #2:</strong> Yeah, not so much of a surprise: the initialiser’s new parameter is called <code class="language-plaintext highlighter-rouge">encodingInvalidCharacters:</code>, and when I think about it, a space is an invalid character in an URL, but an @ is not, so it makes sense that it is not encoding it. This debugging experience feels like a minefield of onions, each one with layers and ready to explode if you make one wrong assumption…</p>
</blockquote>
<p><del>Luckily, I (and you, if you found this on Google) can <strong>dance in and out of the problem by manually percent-encoding and decoding the string before using it to initialise the URL</strong>.</del></p>
<blockquote>
<p><strong>Next day update #3:</strong> Not so fast, kiddo. <strong>Manually adding the percent-encoding results in a non-nil URL, but having a URL that successfully resolves is a completely different story</strong>… in my case, <em>“the dance”</em> results in <em>valid</em> URLs that do not actually connect to the cameras. The solution for me will therefore likely be to manually handle specific special characters (so far, I’m sure about @ and /, but I’ll basically have to manually test most non-alphanumeric characters) <em>strictly</em> inside the credential components.</p>
</blockquote>
<p>I still need to implement the change into my app <em>(I will be very, very careful: the last thing I want and need in my life after the last month is to go from 5/X.000 users with a problem to X.000/X.000)</em>, but I wanted to blog about this because I cannot be the only person that has been bit by this change.</p>
<p>I wonder if there’s Feedback for Apple into this. Maybe about the docs?
I now understand that I should have not stored and initialised URLs the way I did, but the fact that they just worked fine for years caught me by complete surprise when this change in URL behavior happened, and certainly this was not easy to debug.</p>
<p>I’ll think more about this, after I’ll have fixed my app for those extraordinary Users without breaking anything for the others; in the meantime I hope my <em>fun fun fun</em> journey at least helps some fellow developer.</p>Cesare ForelliIn early October I read a blog post by Toomas Vahter describing a change introduced in Xcode 15 beta 5 over the summer and that I didn’t notice in the release notes at the time (guilty, I don’t read them for every beta).Default apps2023-11-12T00:00:00+00:002023-11-12T00:00:00+00:00https://cdf1982.com/2023/11/12/default-apps<p>There’s a fun trend on Mastodon, listing one’s default apps; here’s mine.</p>
<p>Everything’s been very stable for years, with a couple new entries in 2023: GoodLinks replaced Pocket, iTerm stole Terminal.app job and VSCode, surprisingly, entered my life despite being a disgusting Electron app.</p>
<p>Oh, I was to lazy to add links (with one exception ;) and there are a couple additional sections I didn’t see in other lists at the bottom.</p>
<ul>
<li>📨 Mail Client: <strong>Mail.app on all devices</strong></li>
<li>📮 Mail Service: <strong>iCloud, including custom domains</strong></li>
<li>📝 Notes: <strong>Drafts and Notes.app</strong></li>
<li>✅ To-Do: <strong>OmniFocus</strong></li>
<li>📓 Scratchpad: <strong>Drafts</strong></li>
<li>📷 iPhone Photo Shooting: <strong>Camera.app</strong></li>
<li>🎇 Photo Editing: <strong>Pixelmator Pro</strong></li>
<li>🟦 Photo Management: <strong>Photos.app</strong></li>
<li>📆 Calendar: <strong>BusyCal on macOS and Calendar.app on iOS</strong></li>
<li>📁 Cloud File Storage: <strong>iCloud Drive, Dropbox (via Maestral), BackBlaze</strong></li>
<li>📖 RSS: <strong>News Explorer</strong></li>
<li>🙍🏻♂️ Contacts: <strong>Contacts.app</strong></li>
<li>🌐 Browser: <strong>Safari, occasionally Edge</strong></li>
<li>💬 Chat: <strong>iMessage and Slack</strong></li>
<li>🔖 Bookmarks: <strong>GoodLinks</strong></li>
<li>📑 Read It Later: <strong>GoodLinks</strong></li>
<li>📔 Journal: <strong>Day One</strong></li>
<li>🛒 Shopping Lists: <strong>Shoppylist</strong></li>
<li>🍴 Meal Planning: <em>nope</em></li>
<li>🎥 Media Tracking: <strong>Plex</strong></li>
<li>🎵 Music: <strong>Apple Music</strong></li>
<li>🎤 Podcasts: <strong>Overcast</strong></li>
<li>🔐 Password Management: <strong>1Password SEVEN</strong></li>
<li>🐘 Mastodon: <strong>Ivory</strong></li>
<li>⌨️ Launcher: <strong>Alfred</strong></li>
<li>🛤️ Habit etc. Tracking: <strong>Streaks</strong></li>
<li>🌤️ Weather: <strong>Weather.app and Yahoo Weather</strong></li>
<li>👨🏻💻 Terminal: <strong>iTerm</strong></li>
<li>
<p>🧮 Code Editor: <strong>Xcode and VSCode</strong></p>
</li>
<li>🍿 Video player: <strong>VLC</strong></li>
<li>📁 Database: <strong>Airtable</strong></li>
<li>🤖 Automation: <strong>Keyboard Maestro, Hazel</strong></li>
<li>👀 IP Camera Viewer: <strong><a href="https://glancecam.app">GlanceCam</a></strong></li>
</ul>Cesare ForelliThere’s a fun trend on Mastodon, listing one’s default apps; here’s mine.GlanceCam 4.1 for macOS Sonoma2023-09-26T00:00:00+00:002023-09-26T00:00:00+00:00https://cdf1982.com/2023/09/26/glancecam_4_1-for-sonoma<p>The launch of <strong><a href="/glancecam">GlanceCam 4.0</a></strong> in June was so busy and intense that I didn’t find the time to <em>properly</em> blog about it: I didn’t want to just copy and paste the <em>(very detailed)</em> release notes, and I ended up writing nothing instead 😩.<br />
So, if you want to learn more about <em><a href="https://cdf1982.com/glancecam/faqs#glancegrid">GlanceGrids</a></em>, <em>Roll Up</em> and the many other features and improvements introduced with that recent major release, I recommend you take a look at GlanceCam’s <a href="https://www.glancecam.app">website</a>, read the aforementioned <a href="/glancecam/glancecam-release-notes#4_0">release notes</a> and watch the updated promo video:</p>
<p align="center">
<iframe src="https://player.vimeo.com/video/517800053" width="640" height="360" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen=""></iframe>
</p>
<p>Today,<strong>I’m here to tell you that GlanceCam is 100% ready on day one for macOS 14 Sonoma</strong>, thanks to the free 4.1 update that is already <strong><a href="https://itunes.apple.com/us/app/glancecam-ip-webcam-viewer/id1360797896?l=it&ls=1&mt=12">available on the Mac App Store</a></strong>.</p>
<p>To be honest, I’ve been running macOS betas all summer on my main machine and GlanceCam 4.0 was already working great without any tweak, but there’s always space to make things better, and with version 4.1 I’ve had the chance to do that and also <strong>add multiple User-requested features and improvements</strong>:</p>
<ul>
<li>
<p><strong>It’s now possible to customise the double-click behavior for GlanceGrids</strong>: by default, double-clicking a GlanceGrid window will maximise the whole grid full-screen, but from the GlanceGrid settings panel you can now change it to send full-screen the single camera below the mouse pointer, or spun up a separate window for the camera you’re double-clicking. I want to thank Tim and Mike for suggesting this feature.</p>
</li>
<li>
<p><strong>Opening Settings from the gear icon in the upper right corner of a camera window now pre-selects that Glance in the Settings panel</strong>, instead of always defaulting to the first one in the list; special thanks to Dirk for recommending this feature, and also the next one!</p>
</li>
<li>
<p><strong>GlanceCam Pro can now optionally rotate a video stream by 90°, 180° or 270°</strong>; to learn more about this capability and enable it, please click on <em>Rotate stream</em> in the <em>Advanced stream tweaks</em> of a camera in Settings.</p>
</li>
<li>
<p>Thanks to Timo-Pekka’s’ suggestion, there are <strong>3 new AppleScript commands that extend the automation capabilities</strong> of GlanceCam: <strong>reload</strong> will, ahem, reload the stream in all windows, while <strong>stop playback</strong> and <strong>resume playback</strong> will allow to manually control playback for all the cameras that are currently streaming; please be advised that stopping/resuming a large number of cameras can occasionally cause issues. To learn more about GlanceCam’s AppleScript support and for syntax examples, please refer to the FAQs available in the <em>Support</em> menu > <em>Frequently Asked Questions</em>, and specifically to the <em>“Is it possible to automate GlanceCam in some ways?”</em> section.</p>
</li>
<li>
<p>Connected to the previous feature, there’s now a <strong>Stop / Resume</strong> Glance menu item to manually toggle on and off playback of the streaming of a single camera; this function can also be triggered by pressing the P key without modifiers while a window is active and might be useful if you don’t need to look at a camera for a while, but don’t want to close the window.</p>
</li>
<li>
<p>A bug when switching cameras while in full-screen, kindly reported by Cody, has been fixed.</p>
</li>
<li>
<p>The app now uses a new, future-proof approach for the <em>Launch automatically at login</em> feature; if you already had GlanceCam configured to open automatically when your Mac starts, that setting should migrate and work without the need for you to perform any action.</p>
</li>
<li>
<p>Starting with this release, GlanceCam adopts the latest version of the VLCKit video engine, with many improvements in performance and reliability.</p>
</li>
</ul>
<p><strong>As always, <a href="mailto:support@cdf1982.com">your feedback</a> is what keeps development going (<em>while your Pro upgrades and very kind tips keep the lights on</em> 😉)!</strong></p>Cesare ForelliThe launch of GlanceCam 4.0 in June was so busy and intense that I didn’t find the time to properly blog about it: I didn’t want to just copy and paste the (very detailed) release notes, and I ended up writing nothing instead 😩. So, if you want to learn more about GlanceGrids, Roll Up and the many other features and improvements introduced with that recent major release, I recommend you take a look at GlanceCam’s website, read the aforementioned release notes and watch the updated promo video:State of my Apps, hot summer 2023 edition2023-09-06T00:00:00+00:002023-09-06T00:00:00+00:00https://cdf1982.com/2023/09/06/state-of-my-apps-hot-summer-2023-edition<p>When it comes to the summer period that is coming to an end, the work I was able to put into my apps was much less than I would have hoped for after WWDC wrapped up. The experience Riccardo Mori eloquently described in the first part of a <a href="https://morrick.me/archives/9758">recent blog post</a> reflects mine as was as painful to read as it was to live: it’s been so excruciatingly hot in Northern Italy that I have been able to tackle much less than I usually do during the summer, instead devoting most on my energy to long, fun and very <a href="https://www.instagram.com/millakillapilla/">instagrammable</a> walks with Milla early in the morning, before the sun took away my drive to <em>do stuff</em>.</p>
<p>On a professional level, the limited progress I feel I made is kind of a bummer, with the feeling of having <em>misused many potential hours of work</em>. <strong>Taking stock of the progress of all my projects is something that therefore makes sense for me to do right now, to hopefully have a more productive sprint before Christmas</strong>, which if we’re honest is just around the corner. If you’re interested in any of my apps, or curious about the indie experience’s ups and downs (consider this <em>a down</em>), this post might be of some interest to you as well.</p>
<p><strong>Version 4.1 of my IP camera viewer <a href="https://glancecam.app">GlanceCam</a> is coming along and will be ready for Sonoma on day one</strong>; what matters the most to me is that the most used app I work on is already 100% compatible and reliable on the upcoming version of macOS <em>(I’ve been running the betas on my main machine all summer to be sure there were no hiccups)</em>, but the feature-set of the next update will not be vast: a few bug fixes, additional AppleScript commands, customisable double-click behavior for GlanceGrids (send the whole grid full-screen, or just the selected camera, or again spin up a separate window for the selection) and 90/180/270° rotation support.<br />
My hope for August was to also make progress on ONVIF support, but I haven’t been able to touch this extensive and challenging protocol.<br />
I also had a wild dream to devote the hot months to <em>GlanceCam for visionOS</em> and did submit a request for a developer kit, but I haven’t heard back and that’s a sign I’m willing to accept that my focus should be devoted to more commercially viable projects in the near future.</p>
<p><strong><a href="https://apps.apple.com/us/app/id1524351956">Link HUB</a>, my URL dashboard with widgets app</strong>, is also in a reasonably good place: I’ve been testing the app, widgets, and lock-screen widgets on iOS 17, iPadOS 17 and Sonoma and everything looks good, without the need of a compatibility update: there are scenarios, like with the Desktop widgets on macOS, where the default contrast might not be perfect depending on the wallpaper, but all widgets already offer a <em>High contrast</em> option that is sufficient to address those scenarios.<br />
I’ve also thought about interactive widgets – clearly, the new shiny things this autumn – but honestly Link HUB is first and foremost a launcher, so I don’t really see a use case for them. Yet.</p>
<p>Thorough iOS 17 and iPadOS 17 testing also confirmed that both <strong><a href="https://apps.apple.com/us/app/photosupload-ftp-uploader/id1441656535">PhotosUpload</a></strong>, my niche app for uploading photos to FTP servers, and my iPhone pedometer <strong><a href="https://itunes.apple.com/us/app/walk-more-powerful-pedometer/id1198077980?mt=88">Walk More</a></strong> are working fine without needing specific updates for the new OSes.</p>
<p><strong><a href="https://apps.apple.com/us/app/moushero-for-safari/id6447680045">MousHero</a></strong>, the Safari extension to trigger URLs from the browser that I shipped just a few months ago works well on Sonoma and isn’t demanding much attention right now <em>(or ever again? It’s basically done, which is not something I’m used to with my other projects)</em>, but I still have a challenging bug to investigate as soon as I will find the time: sometimes the contextual menu item is not displayed until the MousHero icon in the Safari menu bar is activated once, which is something I’ve never seen Safari extensions require and that doesn’t really make sense to me, happening in such random fashion.</p>
<p>Before discussing what’s next for my other apps, I would like to address another major hindrance to my productivity (and spirit), and something I’ve meant to write about in the hope of providing some help to fellow developers googling for a similar obscure issue: in early August I started experiencing a <a href="https://iosdev.space/@cdf1982/110848679619674337">code-signing issue</a> when trying to submit a minor update to one of my Mac apps (TameTime), which quickly turned into a major roadblock to shipping updates for 3 of my desktop projects, including GlanceCam!<br />
What happened: <strong>when submitting any update from Xcode (14.3.0…15b8), the binaries successfully uploaded, but a few minutes later I systematically received an <em>ITMS-90238: Invalid Signature</em> + <em>ITMS-90296: App sandbox not enabled</em> rejection email that explicitly referred to the embedded helper app I’ve been using for years to provide a <em>Launch at login</em> functionality</strong>, and that obviously has always been sandboxed and signed.<br />
I am sure this rejection is caused by server-side changes on Apple’s analysis of the binaries after submission because reverting to previously approved versions of those apps and submitting them with older versions of Xcode (i.e. 14.3.0) is still to this day causing the same delayed rejection.<br />
This issue has been pretty scary (again, I wasn’t able to submit any updates to my apps) and demotivating, but it was also too hot to fight against a black box, so I kept circling around it hoping for a breakthrough, mostly focusing on a blog post from <a href="https://micro.virtualsanity.com/2023/06/22/app-store-connect.html">John Brayton</a> that referred to a strikingly similar situation (same ITMS error codes emailed after successful uploads), even though in the end it proved to be a different problem from his.<br />
Luckily, in the last couple of days (thanks to lower temperatures and renewed energy) I have been able to work <em>around</em> that rejected binaries issue: I still don’t know what changed in Apple’s SPI review process, but <strong>I figured that taking out my embedded helper app from the binaries and replacing my (established and so far perfectly fine) manual approach with a well respected and widely used <a href="https://github.com/sindresorhus/LaunchAtLogin">library from Sindre Sorhus</a> could help</strong>, and as a matter of fact it does; clearly the <em>LaunchAtLogin</em> library handles the procedure better, in a more compliant way than my previously fine – but likely borderline – approach.<br /></p>
<p>This <em>lateral success</em> finally unlocked a couple of small updates to my other Mac apps that I had put together during my August holiday and that have been successfully approved by Apple today:</p>
<ul>
<li>
<p><strong><a href="https://apps.apple.com/us/app/clipbar-pasteboard-viewer/id1541739143">ClipBar 1.6</a></strong> allows Users to manually reset the menu bar’s pasteboard preview (the utility’s purpose is to display what you last copied in the upper right corner of your screen, with some additional bells and whistles) by right-clicking on the app in the menu bar and selecting <em>Clear ClipBar</em>; this does not erase the content of your Mac’s pasteboard but removes the preview from the menu bar, which in some cases can be useful for privacy reasons. Special thanks to connectionfailure’s App Store review for suggesting the feature!</p>
</li>
<li>
<p><strong><a href="https://apps.apple.com/us/app/tametime-awareness-timer/id1479326723">TameTime 1.5</a></strong> also includes two new features, both recommended by Kenneth, whom I thank for helping me improve my utility to fight RSI and remember to move around: it’s now possible to manually reset the timer by clicking on TameTime in the menu bar and selecting <em>Reset timer</em>; most importantly, Users can now set custom and independent flash-screen messages for the Minor and Major alerts, or omit them completely and only have the 3-seconds dark screen as visual clue to take a break.</p>
</li>
</ul>
<p>It’s a secret I cannot mention in their release notes, but both these apps also work great on Sonoma.<br />
Sadly, though, there’s also a catch to the updates above (and most likely it will be an annoying reality that will also apply to GlanceCam 4.1): due to the fact that I needed to replace the <em>Launch at login</em> mechanism, Users who previously set those apps to open automatically when their Mac started will need to manually re-enable that behavior. I don’t love this, and I mention it in their release notes in the hope of causing limited disruption, but at least I was able to move past that super-worrying submission block and now these apps are “in the <a href="https://mjtsai.com/blog/2022/10/27/venturas-open-at-login-vs-allow-in-the-background/">right section</a>” of macOS Settings, which is more professional and therefore a welcome bonus at the end of this ordeal.</p>
<p>Finally, there should be another project on this list: early this summer I started working on <strong><a href="https://iosdev.space/@cdf1982/110525181071932096">Quee</a></strong>, an app that has been on my mind for years and a possible playground for improving my SwiftUI experience and especially testing out SwiftData; the idea behind Quee remains interesting to me, especially with the upcoming Journaling APIs, but I must admit development quickly stalled (the fact that SwiftData surprisingly <a href="https://iosdev.space/@cdf1982/110564452650274777">doesn’t support inheritance</a> didn’t help) and I have so much going on already that’s impossible to also devote time to a new project in the immediate future. <strong>Maybe if it had not been so hot…</strong></p>Cesare ForelliWhen it comes to the summer period that is coming to an end, the work I was able to put into my apps was much less than I would have hoped for after WWDC wrapped up. The experience Riccardo Mori eloquently described in the first part of a recent blog post reflects mine as was as painful to read as it was to live: it’s been so excruciatingly hot in Northern Italy that I have been able to tackle much less than I usually do during the summer, instead devoting most on my energy to long, fun and very instagrammable walks with Milla early in the morning, before the sun took away my drive to do stuff.MousHero for Safari2023-04-17T00:00:00+00:002023-04-17T00:00:00+00:00https://cdf1982.com/2023/04/17/moushero-extension-for-safari-launch<p>So… last week one of my automation journeys took an unexpected turn, and today I’m happy to introduce <strong><a href="https://cdf1982.com/moushero-for-safari">MousHero for Safari</a></strong>, a brand new extension to bring URL-scheme superpowers to your browsing experience.</p>
<p>MousHero allows to trigger URL actions by adding up to 3 <strong>custom context menu items to Safari’s right-click menu</strong>.<br />
Just by right-clicking on a webpage, the User is able to <strong>launch apps, services and automations</strong> <em>(for instance with third party applications such as Shortcuts, Keyboard Maestro, Drafts, etc.)</em>, optionally passing the currently selected text as parameter.</p>
<p>For the longest time, I wanted to be able to <em>“do something”</em> with the selected text in Safari, easily and quickly passing what I see in the browser to automations I have built mostly in <a href="https://getdrafts.com">Drafts</a>, but also Shortcuts and <a href="http://www.keyboardmaestro.com/">Keyboard Maestro</a>.</p>
<p>While Share extensions offer some export capabilities, they strictly allow the User to perform what they were coded for, usually requiring multiple clicks, while <strong>MousHero can trigger anything that has a URL</strong>.</p>
<p>I am not aware of any other Safari extension that allows such flexibility, so I built MousHero first and foremost for myself, but <strong>if you like to save time and do cool things with your Mac, I’m pretty sure there’s a use case for you</strong> too… Here’s a few things that are just a right-click away with this extension:</p>
<ul>
<li>Run Shortcuts passing the selection as parameter;</li>
<li>Create a new note in Drafts with the selected text, or skip the note creation altogether and run the Drafts action on the selection directly;</li>
<li>Open the Inbox project in <a href="https://www.omnigroup.com/omnifocus/">OmniFocus</a> or add the selected text as task;</li>
<li>Run a Keyboard Maestro macro passing the selection;</li>
<li>Open a specific website in a new panel;</li>
<li>Search the selected text on StackOverflow, Google Maps or any other website.</li>
</ul>
<p>Want to learn more and see additional use cases and URL examples? <strong><a href="https://cdf1982.com/moushero-for-safari/moushero-documentation-and-examples.html">Check out the documentation</a>!</strong></p>
<p>You can <strong><a href="https://apps.apple.com/us/app/moushero-for-safari/id6447680045">get MousHero on the Mac App Store</a> now</strong>, and I hope you’ll find it useful every day!</p>Cesare ForelliSo… last week one of my automation journeys took an unexpected turn, and today I’m happy to introduce MousHero for Safari, a brand new extension to bring URL-scheme superpowers to your browsing experience.GlanceCam is 5 year old 🎂🎂🎂🎂🎂2023-03-29T00:00:00+00:002023-03-29T00:00:00+00:00https://cdf1982.com/2023/03/29/glancecam-is-5-year-old<p>5 years is a long time to work on an app, and yet I feel very lucky that I still love devoting my early mornings and week-ends to building new features for <a href="https://glancecam.app">GlanceCam</a>, my IP camera viewer for Mac.</p>
<p>I believe the most fun is actually yet to come, with the new <em>FlexiGlanceGrid</em> mode debuting with GlanceCam 4 later this year, and many other nerdy and fun things I already have planned both for the standard and Pro versions. So much fun work ahead!</p>
<p><strong>I’m especially thankful for the Users who chose GlanceCam and provided me invaluable feedback and support</strong>. I still find it incredible that something so niche I built for myself is used daily, and loved, by thousands of like-minded enthusiasts from all over this large, small world.</p>
<p>I appreciate you coming along for this journey and joining me wishing Happy Birthday, <a href="https://apps.apple.com/us/app/glancecam-ip-webcam-viewer/id1360797896?l=it&ls=1&mt=12">GlanceCam</a>!</p>
<p><em>P.S. I had this banner image from the <a href="https://cdf1982.com/2019/03/29/glancecam_is_one_year_old.html">first birthday</a> and seemed like a nice throwback to simpler times, but of course these days the app sports the much more cool app icon made by <a href="https://beckyhansmeyer.com">Becky</a> for GlanceCam 3, not that original clumsy attempt ad graphic design…</em></p>Cesare Forelli5 years is a long time to work on an app, and yet I feel very lucky that I still love devoting my early mornings and week-ends to building new features for GlanceCam, my IP camera viewer for Mac.Photo2023-03-13T00:00:00+00:002023-03-13T00:00:00+00:00https://cdf1982.com/2023/03/13/photoCesare Forelli