Happy birthday, Macintosh

🔗 January 23, 2024

I 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…).

As much as I would like to say I’ve been here for the whole journey, that would have made me a pretty precocious 2-year old

The oldest memory I have of the Macintosh is from a few weeks before Christmas 1992 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.
As a 10-year-old, that made lots of sense (games!), 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, to this day I still give my brother-in-law grief for that suggestion, which I suspect had more to do with him not wanting to provide tech support to a pestiferous kid!

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.

Jump to 2006, when Windows betrayed me for the last time (I’m still mad), costing me all the data on my Vaio 17” “laptop” (this thing), which at that point was work stuff, so quite a big deal.
I instantly decided to pull the trigger on a PowerMac G5 Quad, 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 Al Gore… and two of those displays are still in use today!).
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… (spoiler alert: I’ve found plenty of ways!) 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 2019 Mac Pro, a true masterpiece, and a computer I’d really love to purchase used someday).
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.

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.

In 2008 I “promoted” my G5 to the role of server at work because the Mac Pro 8 core was just too tempting. 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 why I did that).
That Mac Pro lasted me a really long time, months shy of TEN years, 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, dosdude1 saved the day. Dude, thank you, really!

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 destroyed carrying it around daily, and a 2011 Dual Core Mac Mini which I used way too much considering how not-fast it was.

Then there’s an odd parenthesis (betrayal!): 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 and my dreams at the same time. But leaving macOS wasn’t – isn’t, ever will be – 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.

But then came Apple silicon and Cupertino won me back on the hardware side as well, and they did so big time.
I had a hunch it was going to happen when I got a DTK for starting early development of a native version of GlanceCam: if an iPad chip ran macOS like that, 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.

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.
To me, the best Mac of my life will probably always be the 2008 Mac Pro, but the best Mac EVER has to be the M1 Air.

And yet just last week I sold the best Mac ever, after getting a nice M3 Max in December. And oh, I have so. much. to. say. 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 the silent feather 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.

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 (even tough macOS is a bit too grey for me these days, and I won’t cry the day Alan Dye will retire) and easy to use.

You are truly a unique technological wonder, Mac. Happy birthday, and keep smiling!


Best of 2023

🔗 December 28, 2023

It 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.

Here’s my picks for 2023, using the same categories of the years before; as always, no affiliate links, just stuff I enjoyed.

Best song: Don’t know if you’ve heard of this Taylor Swift gal… Castles Crumbling is a pretty great song, and the fact it also features Hayley Williams is the perfect cherry on top.

Best album: So, there’s this emerging artist that released a good album, Midnights

Best book: Don Winslow’s Missing - New York was hard to put down.

Best movie: A Most Violent Year 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 award.

Best TV show: This is extremely hard, I’ve seen multiple excellent shows, old and new, and my (not-so) short list includes:

… but I can only pick one.

After All These Years, Do You Not Instinctively… know it’s Veronica Mars? Oh, and the obligatory fuck you Rob Thomas goes here.

Best podcast: This is Love episode 63 - Sampson and Baylor, and keep tissues at hand. Also good: Cautionary Tales - The Hero Who Rode His Segway Off a Cliff

Best article I read: Before AI fatigue kicked in, I did really enjoy Kevin Roose’s A Conversation With Bing’s Chatbot Left Me Deeply Unsettled, but I don’t know if I’d feel the same reading it now for the first time.

Best Mac app: A new entry! Rectangle Pro is by far, and I mean by far, the best window manager I’ve tried. And I tried them all.

Best iOS app: If you met me, you know OmniFocus always makes the list, 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.

Best videogame: Tears of the Kingdom or Return to Monkey Island? 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.

Best video: Tough choice: humans make incredible things, really. But I think this Dog Mountain video is the best thing I’ve watched in a long time.

Thanks for reading, I hope you’ve found something interesting here!

Wish you a very happy 2024! 🥂


500

🔗 November 30, 2023

Just 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.

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 read the label – is actually pretty good, and I feel great because it’s only going up.

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 7th birthday. A bit ambitious, but isn’t that what goals are for?


Bitten by URL initialisation changes

🔗 November 26, 2023

In 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).

The post detailed the effects of the change, summarised in the following disclaimer Apple added to URL’s documentation:

For apps linked on or after iOS 17 and aligned OS versions, URL parsing has updated from the obsolete RFC 1738/1808 parsing to the same RFC 3986 parsing as URL. This unifies the parsing behaviors of the URL and URLComponents APIs. Now, URL automatically percent- and IDNA-encodes invalid characters to help create a valid URL.

After reading that post, I reviewed the official documentation, since I make a Mac app 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 – “For apps linked on or after iOS 17 and aligned OS versions” – 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.

My assumption was quite the mistake: linked on does not mean targeting, turns out™ that Apple means running on. Most certainly a native English speaker would have had a better month than I had…

Next day update #1: As Jeff Johnson and Alexander Blach kindly and patiently explained, linked on 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!

Here’s a quick recap of the long journey that reminded me, again, that words matter a lot and, most importantly, what you might need to know if you deal with URLs in an app running on Apple platforms.

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 Xcode 15 made a bit of a mess with linking, but everything went well after that, as I did expect after running the app on Sonoma all summer.

Then, over the following weeks, 5 different Users contacted me reporting a crash at launch; 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.

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.

Finally, I built a beta with logging on file for each single step the app performs at launch, and found this message logged:

 dataCorrupted(
            Swift.DecodingError.Context(
                codingPath: [_JSONKey(stringValue: "Index 3", intValue: 3), CodingKeys(stringValue: "webcamStreamURL", intValue: nil)],
                debugDescription: "Invalid URL string.",
                underlyingError: nil
            )
        )

One by one, all Users’ logs showed a similar message, so I immediately thought about that URL change that would not be relevant for me right now. But why only for these 5 people, and not hundreds of other Users who were using Sonoma without any issue?

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 URL(string:encodingInvalidCharacters:) initialised with false and see if it helped.

It did not.

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, the joy of finally being able to reproduce a bug.

Manually escaping those special characters, or changing passwords to alphanumerical ones, also was a relevant discovery.

mmm.

Thanks to a precious suggestion from a friend who systematically saves my bacon, 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.

So, let’s jump into what I did find out today, doing experiments with a Playground.

First, let’s review the URL behavior I have serenely enjoyed for over five years:

All three screenshots were taken on Ventura, both with Xcode 14 and 15.

You can see that the URL initialises successfully even when a “special character” is included in the password.

Now, look at what happens on Sonoma with Xcode 15 (daily I use 15.0, but the latest version available at this date – 15.1 beta 3 – behaves exactly the same):

Saw that on line 10? Just throw in a special character into the password and the URL is nil; fine, circa, at least now I know where my last weeks went (actually very annoying to have a breaking change like this one poorly documented).

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. This is quite the surprise.

Next day update #2: Yeah, not so much of a surprise: the initialiser’s new parameter is called encodingInvalidCharacters:, 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…

Luckily, I (and you, if you found this on Google) can dance in and out of the problem by manually percent-encoding and decoding the string before using it to initialise the URL.

Next day update #3: Not so fast, kiddo. Manually adding the percent-encoding results in a non-nil URL, but having a URL that successfully resolves is a completely different story… in my case, “the dance” results in valid 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) strictly inside the credential components.

I still need to implement the change into my app (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), but I wanted to blog about this because I cannot be the only person that has been bit by this change.

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.

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 fun fun fun journey at least helps some fellow developer.


Default apps

🔗 November 12, 2023

There’s a fun trend on Mastodon, listing one’s default apps; here’s mine.

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.

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.

  • 📨 Mail Client: Mail.app on all devices
  • 📮 Mail Service: iCloud, including custom domains
  • 📝 Notes: Drafts and Notes.app
  • ✅ To-Do: OmniFocus
  • 📓 Scratchpad: Drafts
  • 📷 iPhone Photo Shooting: Camera.app
  • 🎇 Photo Editing: Pixelmator Pro
  • 🟦 Photo Management: Photos.app
  • 📆 Calendar: BusyCal on macOS and Calendar.app on iOS
  • 📁 Cloud File Storage: iCloud Drive, Dropbox (via Maestral), BackBlaze
  • 📖 RSS: News Explorer
  • 🙍🏻‍♂️ Contacts: Contacts.app
  • 🌐 Browser: Safari, occasionally Edge
  • 💬 Chat: iMessage and Slack
  • 🔖 Bookmarks: GoodLinks
  • 📑 Read It Later: GoodLinks
  • 📔 Journal: Day One
  • 🛒 Shopping Lists: Shoppylist
  • 🍴 Meal Planning: nope
  • 🎥 Media Tracking: Plex
  • 🎵 Music: Apple Music
  • 🎤 Podcasts: Overcast
  • 🔐 Password Management: 1Password SEVEN
  • 🐘 Mastodon: Ivory
  • ⌨️ Launcher: Alfred
  • 🛤️ Habit etc. Tracking: Streaks
  • 🌤️ Weather: Weather.app and Yahoo Weather
  • 👨🏻‍💻 Terminal: iTerm
  • 🧮 Code Editor: Xcode and VSCode

  • 🍿 Video player: VLC
  • 📁 Database: Airtable
  • 🤖 Automation: Keyboard Maestro, Hazel
  • 👀 IP Camera Viewer: GlanceCam


GlanceCam 4.1 for macOS Sonoma

🔗 September 26, 2023

The 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:

Today,I’m here to tell you that GlanceCam is 100% ready on day one for macOS 14 Sonoma, thanks to the free 4.1 update that is already available on the Mac App Store.

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 add multiple User-requested features and improvements:

  • It’s now possible to customise the double-click behavior for GlanceGrids: 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.

  • Opening Settings from the gear icon in the upper right corner of a camera window now pre-selects that Glance in the Settings panel, instead of always defaulting to the first one in the list; special thanks to Dirk for recommending this feature, and also the next one!

  • GlanceCam Pro can now optionally rotate a video stream by 90°, 180° or 270°; to learn more about this capability and enable it, please click on Rotate stream in the Advanced stream tweaks of a camera in Settings.

  • Thanks to Timo-Pekka’s’ suggestion, there are 3 new AppleScript commands that extend the automation capabilities of GlanceCam: reload will, ahem, reload the stream in all windows, while stop playback and resume playback 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 Support menu > Frequently Asked Questions, and specifically to the “Is it possible to automate GlanceCam in some ways?” section.

  • Connected to the previous feature, there’s now a Stop / Resume 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.

  • A bug when switching cameras while in full-screen, kindly reported by Cody, has been fixed.

  • The app now uses a new, future-proof approach for the Launch automatically at login 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.

  • Starting with this release, GlanceCam adopts the latest version of the VLCKit video engine, with many improvements in performance and reliability.

As always, your feedback is what keeps development going (while your Pro upgrades and very kind tips keep the lights on 😉)!


State of my Apps, hot summer 2023 edition

🔗 September 6, 2023

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 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.

On a professional level, the limited progress I feel I made is kind of a bummer, with the feeling of having misused many potential hours of work. 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, 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 a down), this post might be of some interest to you as well.

Version 4.1 of my IP camera viewer GlanceCam is coming along and will be ready for Sonoma on day one; 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 (I’ve been running the betas on my main machine all summer to be sure there were no hiccups), 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.
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.
I also had a wild dream to devote the hot months to GlanceCam for visionOS 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.

Link HUB, my URL dashboard with widgets app, 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 High contrast option that is sufficient to address those scenarios.
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.

Thorough iOS 17 and iPadOS 17 testing also confirmed that both PhotosUpload, my niche app for uploading photos to FTP servers, and my iPhone pedometer Walk More are working fine without needing specific updates for the new OSes.

MousHero, 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 (or ever again? It’s basically done, which is not something I’m used to with my other projects), 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.

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 code-signing issue 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!
What happened: when submitting any update from Xcode (14.3.0…15b8), the binaries successfully uploaded, but a few minutes later I systematically received an ITMS-90238: Invalid Signature + ITMS-90296: App sandbox not enabled rejection email that explicitly referred to the embedded helper app I’ve been using for years to provide a Launch at login functionality, and that obviously has always been sandboxed and signed.
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.
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 John Brayton 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.
Luckily, in the last couple of days (thanks to lower temperatures and renewed energy) I have been able to work around that rejected binaries issue: I still don’t know what changed in Apple’s SPI review process, but 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 library from Sindre Sorhus could help, and as a matter of fact it does; clearly the LaunchAtLogin library handles the procedure better, in a more compliant way than my previously fine – but likely borderline – approach.

This lateral success 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:

  • ClipBar 1.6 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 Clear ClipBar; 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!

  • TameTime 1.5 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 Reset timer; 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.

It’s a secret I cannot mention in their release notes, but both these apps also work great on Sonoma.
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 Launch at login 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 right section” of macOS Settings, which is more professional and therefore a welcome bonus at the end of this ordeal.

Finally, there should be another project on this list: early this summer I started working on Quee, 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 doesn’t support inheritance 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. Maybe if it had not been so hot…


MousHero for Safari

🔗 April 17, 2023

So… 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.

MousHero allows to trigger URL actions by adding up to 3 custom context menu items to Safari’s right-click menu.
Just by right-clicking on a webpage, the User is able to launch apps, services and automations (for instance with third party applications such as Shortcuts, Keyboard Maestro, Drafts, etc.), optionally passing the currently selected text as parameter.

For the longest time, I wanted to be able to “do something” with the selected text in Safari, easily and quickly passing what I see in the browser to automations I have built mostly in Drafts, but also Shortcuts and Keyboard Maestro.

While Share extensions offer some export capabilities, they strictly allow the User to perform what they were coded for, usually requiring multiple clicks, while MousHero can trigger anything that has a URL.

I am not aware of any other Safari extension that allows such flexibility, so I built MousHero first and foremost for myself, but if you like to save time and do cool things with your Mac, I’m pretty sure there’s a use case for you too… Here’s a few things that are just a right-click away with this extension:

  • Run Shortcuts passing the selection as parameter;
  • 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;
  • Open the Inbox project in OmniFocus or add the selected text as task;
  • Run a Keyboard Maestro macro passing the selection;
  • Open a specific website in a new panel;
  • Search the selected text on StackOverflow, Google Maps or any other website.

Want to learn more and see additional use cases and URL examples? Check out the documentation!

You can get MousHero on the Mac App Store now, and I hope you’ll find it useful every day!


GlanceCam is 5 year old 🎂🎂🎂🎂🎂

🔗 March 29, 2023

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 GlanceCam, my IP camera viewer for Mac.

I believe the most fun is actually yet to come, with the new FlexiGlanceGrid 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!

I’m especially thankful for the Users who chose GlanceCam and provided me invaluable feedback and support. 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.

I appreciate you coming along for this journey and joining me wishing Happy Birthday, GlanceCam!

P.S. I had this banner image from the first birthday 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 Becky for GlanceCam 3, not that original clumsy attempt ad graphic design…


🔗 March 13, 2023


Reducing friction to hopefully blog more

🔗 March 12, 2023

In a Mastodon conversation with Lucas I mentioned that the workflow to publish to this Jekyll blog is one of the reasons I almost never publish on my blog. It’s either that, or an excuse, and since I’m being honest, the more I think about it, the more I believe it’s more of the latter…

But still:

  1. Open a text editor;
  2. Add Jekyll’s front matter;
  3. Actually write the blog post;
  4. Save the file with the expected file name structure;
  5. bundle exec jekyll serve locally to see if it renders okay;
  6. Catch a few typos;
  7. Repeat 5;
  8. Commit and push;
  9. Load the published post to double-check.

Is not an insignificant number of steps, and I’m lucky that I did place my blog folder on Dropbox from the beginning, so I at least don’t need to move files around if I’m on my phone or iPad.

Blot.in, mentioned by Lucas, immediately tempted me: save a file or an image into a Dropbox folder and have it immediately, automatically posted on a blog. A 2-steps process! At 4$ per month, not expensive either. But I know myself and I’d soon be fighting with the theme or discover some limitations, and I’d certainly want to migrate the current 118 posts, which would lead to building some automations… things would spiral a bit out of control, just like when people instead of completing tasks test 8 different task managers. I really don’t have the time and mental energy for that.

So I wondered if I could automate some of the steps of the current workflow, not really for long form posts, but to reduce friction for micro-blogging with the existing infrastructure of my website. If it’s a couple sentences on the go, maybe on my phone, I could certainly skip the local preview, but the commit and push step would remain annoying, even with Working Copy.

Enter gitwatch and a couple Drafts actions, and less than an hour later I feel I took away a decent part of the friction (excuse) to short form frequent blogging:

  1. A simple Drafts action inserts Jekyll’s front matter at the beginning of a draft (I’ll probably set a Keyboard Maestro text expansion as well, but I started with Drafts because this action will be available on every device);

  2. When I’m done writing a Post to blog Drafts action prompts for the slugified draft name, prepends the date in the format I use and saves it into the _posts folder on Dropbox, archiving the draft with the proper tags;

  3. gitwatch on my M1 Air monitors my _posts folder and automatically commits and push.

Perfect? No. Faster? Yup! Possible Improvements going forward:

  • Move gitwatch on my Mac VM running on Proxmox, instead of my Air, so it really runs all the time;
  • If I can find a way to pipe aicommits commit messages to gitwatch, I’d very much prefer those to the current “Scripted auto-commit on change (%DATE%) by gitwatch.sh” format… but I can live with it if achieving that would turn this quick excursion into “a whole project”;
  • Find a way to quickly post photos, no text, because the Blot.in way to publish images to a blog just by dragging a file into a folder really looked glorious.

This has been a fun, self-contained Sunday morning project. Now we’ll see if I’ll really blog more…

P.S. ça va sans dire, this blog post has been posted directly from Drafts on my iPad and has been auto-committed and published! 🤓


A few updates, later in the same Sunday:

  1. I’ve added link posts and photo entries to this site. Adding photos is interesting, as it involves Shortcuts saving the resized JPG into a folder watched by Hazel, which then renames and moves it in the Jekyll subfolder and freaking generates the markdown page as well directly in the Shell script. Just like for the Drafts automation this morning, commit and push are then automatic, courtesy of gitwatch.

  2. I’ve posted both Drafts actions to the Directory:
  3. I’d still like to improve a few things:
    • Actually having a caption for the photo posts based on the file name, which therefore should be specified in the Shortcut instead of being autogenerated by Hazel;
    • Maybe have separate RSS feeds, because currently everything (normal posts, link posts, photos) goes into https://cdf1982.com/feed.xml
    • Some mechanism for automatic cross-posting to Mastodon. All things that can wait until I actually prove to myself that I’ll blog more.


Testing the new link post feature I’ve added just now to my blog by linking to this very good and relatable post by Jordan Morgan

🔗 March 12, 2023


🔗 March 12, 2023


A busy October for GlanceCam

🔗 November 1, 2022

Per the title, October has been a busy month for GlanceCam:

  • GlanceCam 3.5 took performance to the next level with Apple silicon support;
  • GlanceCam 3.5.1 fixed a couple small things, making possible to create new windows at the center of the active display;
  • GlanceCam 3.6 perfected the app behavior on Ventura, right on the new macOS launch day and added an amazing Zoom feature you can learn more about in the FAQs:
  • GlanceCam 3.6.1 restored the beloved Out of my Way magic trick on Ventura after a regression in macOS 13 caused it to stop working (FB11723708, if you happen to know someone in the AppKit team at Apple ;)

So, time to rest? Not at all 💪!

Let’s kick off 🎃 November 🎃 with a cool update meant specifically for GlanceCam Pro Users: Cycle mode is now available in GlanceCam 3.7, which you can already download from the Mac App Store!

Before I detail what Cycle mode is, rest assured lots more is coming to all GlanceCam Users soon, but it’s been a while since the last “Pro-only” advanced feature was added, and this is a good one.

First of all, thank you to James, Steve and Shawn, who have asked for a way to cycle through different cameras in a single window.

Cycle mode makes that possible: choose one of your windows and have it rotate some or all of your Glances (cameras) according to a time interval you define. This is especially useful with a large window or while the app is full screen. While only one window can be put in Cycle mode, you can still keep as many others “single camera” windows open while this rotation is enabled.

By default, all cameras are included in Cycle mode with a 30 seconds time interval dedicated to each one, but you are free to decide which Glances you want to include and for how long they should remain on screen. Intervals can be configured in the 10 to 60 seconds range, in steps of 10 seconds, and can be different between cameras included in the cycle. Please note that longer intervals are preferable, especially for remote cameras, as the timer starts when loading the stream begins, not when the image appears; so, if a camera takes 5 seconds to show the image and the cycle is set to 10 seconds, you’d only see the image for 5 seconds before switching to the next one.

You can enable Cycle mode by selecting the Glance menu > Enable Cycle mode, or by pressing the C key without modifiers while the window you want to enable it for is active; the same menu item or keyboard shortcut disables it, as it does saving any change to Settings or quitting GlanceCam (Cycle mode is not persisted between launches of the app).

Here’s an example of how Cycle mode can be used:

Let’s say you have 3 Glances configured; you might include camera 1 in Cycle mode and keep it visible for 30 seconds, exclude camera 2 and include camera 3 for 10 seconds. When you turn on Cycle mode, camera 1 and 3 will alternate, with Glance 1 remaining visible for 30 seconds and Glance 3 only for 10, with a total duration for the cycle of 40 seconds before it starts again.

I hope you’ll love this new feature… it’s already one of my favorites! You can check if you agree with me by downloading GlanceCam 3.7 right now.

As always, your feedback at support@cdf1982.com is what keeps development going (while your Pro upgrades and tips keep the lights on 😉)


Ventura updates for GlanceCam, Link HUB, ClipBar and TameTime, plus an iOS 16 update for PhotosUpload

🔗 October 23, 2022

I’m happy to announce that all my Mac apps have just been updated for macOS 13 Ventura, which launches tomorrow:

  • GlanceCam 3.6 works great on macOS 13 Ventura and is amazing in combination with Stage Manager, behaving exactly as you’d expect: with Always on Top enabled, your cameras remain visible in all Stages, just like they did (and do) with Spaces; if you don’t use Always on Top in combination with Stage Manager, GlanceCam behaves like all other apps, moving to the side when you switch applications… but your camera preview remains live on the left sidebar even when it’s not on the main stage!
    This version also introduces an optional Zoom feature that’s been requested by some Users a while back (thank you both for the suggestion and patience, Gretar and Olof!); you can find out more about how Zoom mode works in GlanceCam in the release notes.

  • Link HUB 2.2.1 has been tweaked to be the best links manager and launcher on the latest version of macOS.

  • ClipBar 1.4.2 is a minor update – just to smooth things out for Ventura – to my utility for viewing the content of your Pasteboard from the status bar.

  • TameTime 1.4.2 perfects macOS 13 compatibility of my status bar utility built for reminding you of taking regular breaks, so you don’t spend too much time sitting at your computer and risk compromising your health.

And since pushing 2 GlanceCam versions in one week, plus Ventura updates for all three other Mac apps currently in my portfolio wasn’t enough, PhotosUpload 1.4.1, my FTP uploader for iPhone and iPad, has been updated for iOS and iPadOS 16 too!


GlanceCam 3.5 for Apple silicon

🔗 October 12, 2022

After 👏 SO 👏 MUCH 👏 WORK 👏 GlanceCam 3.5 for Apple silicon is now available in the App Store!!

GlanceCam is a powerful and beloved IP Camera viewer for Mac:

This new release – the 24th free update since launch in 2018 – lays the foundations for the next 10+ years of GlanceCam.

The performance difference you’ll notice on new Macs proves the effort was worth it: CPU and RAM usage decrease significantly, while everything else works as reliably as you’re used to!

Please know it wasn’t for lack of trying that this major update didn’t ship earlier: while Rosetta2 granted excellent performances in the transition period, I’ve been at work on native support since Apple’s announcement, getting a DTK on day one. After many challenges, and thanks to the kind Beta Testers who helped me make this new version work great, the future of GlanceCam is brighter than ever.

As for new features, rest assured that with this major step forward finally in Users’ hands, plenty is coming!

You can download GlanceCam 3.5! now; if you’re already a User, it would mean the world to me if you took a moment to leave a 5-star review 😉 or maybe even consider going Pro if you aren’t already (or leave a tip if you are). And, as always, please don’t hesitate to get in touch: I love feedback and feature requests!


#indielife

🔗 September 17, 2022

This post is a bit unusual: in the software development community, we’re used to announcing products and updates while celebrating milestones and successes. Over the years, I’ve written my share of both, but what follows will be different, as I’ll tell you all the ways a launch I worked on this summer failed, and why being indie means I (you?) will nevertheless keep going on.

I hope to find a way with words to successfully convey my thoughts and avoid coming across as whiny: my intent is not to complain. On the contrary, I believe writing about what didn’t go as hoped is often overlooked, but can be a powerful moment, both for those who are sharing, and for others facing similar scenarios.

Sometimes, this indie thing is hard: you work on something for a while, making it as good as you’re able to, and in the process, you accept sacrifices to take it to the finish line. Meanwhile, you try to let other people know your brand new creation exists, in the hope it will have a modicum of success and possibly earn you a buck or two when you’re ready to ship.

Then launch day comes, you tweet and blog about it, your closest friends retweet it and take time to send you encouraging words, and a few Users love the new features and let you know with heartwarming emails.

Now you wait.

Maybe someone in the press you’ve talked to said they were considering covering your announcement, but when the day comes you realize they’ve been swamped by requests and couldn’t possibly find the time to write about everything, and your beloved app didn’t make the cut. If you’re honest with yourself, marketing is not your strong suit, and being featured was a long shot all along… you accept you’ve reached out too late and contacted only a few people you know and occasionally talk to online (otherwise it would have felt dishonest and spammy to send blanket email announcements, right?).

In this phase, slightly worried, you tell yourself that maybe people will find your app in some other ways (which they rarely do because if you build it, they will come does not apply to the App Store)… possibly if you try Product Hunt you could stir up some interest?

A few days from your announcement, you look at the numbers and your heart sinks a bit: instead of the usual 5÷10 downloads per day of the free version of your (ahem…) product, since launch you’ve had 10÷15, and just a couple more subscriptions than usual were started. You understand this is your “spike” post-announcement 😔, and the temptation of dividing the extra revenue by the number of hours poured into the development process creeps in. Months of work… for this?

Well, at this point you know you’ve tanked your launch. As you’ve figured out, I feel I’ve tanked mine. Yes, it’s been less than a week, but we’ve been here before: often most downloads arrive immediately after launch, especially if you’re anchoring your release with some external factor (in my case, adopting a lead feature from the new version of iOS).

Let’s not kid ourselves, realizing that success – however you define it – is not coming kind of sucks. This is not a good moment, even if you never thought you’d have “real” success… you knew you were targeting a niche, and you were not so naive to think the idea you had was unique (in the App Store, it’s implied that other developers will build competing products and you always accept the chance they would either make a better job in terms of features, or tell a more compelling story marketing-wise, or both… ouch!). But it’s still quite depressing to see something you made struggling to fly.

Where does an indie go from here?

They lick their wounds and reflect on what went wrong (👋). If you’ve done this indie thing for a while (for me, it’s about 9 years since I watched my first programming course from Simon Allardice on Lynda.com… remember Lynda?), you also realize that making a list of “small victories” is as important as what they call the post-mortem (which by the way is a terrible name, as things might start slowly, but not be dead, and course can sometimes be corrected even after unsatisfactory beginnings).

I’ve found out – in years of experience building products so niche they didn’t even have a market – that, if you only focus on what went wrong, it becomes very hard to find the inner motivation to tackle the next thing.

So, here are my two lists, the good and the bad, after Link HUB 2.0 less-than-stellar launch…

Mistakes were made by the team, and sadly when you’re all the team, there’s nowhere else to point the finger than towards yourself:

  • I had the idea of customizable Lock screen widgets to launch URLs, and especially Shortcuts and apps, during WWDC keynote. I was sure lots of other developers had the same idea (they did) because it’s simply a good one that makes sense. Instead of building a new small app dedicated to this purpose, I’ve decided to expand an existing application of mine that was “adjacent” to the feature. While it made sense and is certainly good practice for existing Users, this took longer than it would have otherwise because I’ve had other things to tackle to make a proper 2.0 (regular widgets, as I was late to the party, but also converting a major view to SwiftUI);
  • As a consequence of deciding not to make a new laser-focused app, I’ve had less time to build features specific to the scope of my idea: from day one, I wanted a mechanism to import Shortcuts instead of only relying on the shortcuts:// URL scheme, and I settled on only offering custom SF Symbols for links, while also having custom images (or app icons fetched from App Store’s APIs) would have made sense. I’ve seen both features implemented on launch day by similar apps from other developers; kudos to them for being great at keeping their eyes on the good quality of life features: by all means, those who succeeded deserved it, and while I’m not happy for where I stand today, I will always be happy when another indie succeeds!
  • Having less time also meant failing at marketing: I think I’ve made good and colorful screenshots (mostly thanks to an amazing model, Milla…), but I wanted an App Store video too, and I’ve delayed it because didn’t have time. Most importantly, I’ve reached out to a few people I know / sometimes interact with in the press, but it was my usually small and late push.
  • Since my main feature, Lock screen widgets, is a major one, Apple would likely feature apps including it. So, I had the brilliant idea to forget to submit my update to the App Store team for consideration up until the Friday before iOS 16 launch, when I saw another developer tweet about it. This one is the most moronic of my mistakes… by no means, my app would have had a spot “guaranteed” in App Store features, but if you don’t even try…

So, a good share of errors could have been avoided. Still, I think I have conquered a few small victories that are cheering me up a bit as I list them in my mind:

  • The app might not be a resounding success so far (or ever? let’s hope it’s not ever!), but I’ve had a feature I wanted for myself “all summer long”, a way to launch apps and Shortcuts from the Lock screen: this is one of those things you build for yourself, and you cannot go wrong with that.
  • I finally jumped in with SwiftUI, not only learning about lock screen widgets and regular widgets (adding those, also a belated victory) but actually getting some mileage with the language while refactoring a major view to the future of development on Apple platforms; in return, I got much less code, some additional features (custom icons, a better UI and in general a more streamlined experience) and – most important – a better understanding of SwiftUI itself and where I’ll certainly want to use it again soon.
  • I’ve had fun: I was off work (classic indie, I have a day job in a different field) for three weeks this summer (classic Italy ;), and the bulk of work on Link HUB 2.0 happened during that period. It was enough coding to be interesting, and a small enough project not to take all my free time away from Milla.
  • Link HUB is in a good spot, including in comparison to the other apps that launched with lock screen widgets: as I’ve mentioned, other developers had the same idea at the same time and built focused apps around it; I’ve tried them, of course, and they are all very good, each one with strong aspects. But basically, the main things that Link HUB lacks are the two nice-to-have features that I had planned and postponed: importing from Shortcuts and adding custom photos and app icons for the links. I can and will add those as soon as I’ll have the time (I’m back at work on GlanceCam, because what’s more #indielife than juggling different projects?), but in the meantime Link HUB is still on iOS, iPadOS, and Mac, is a fully-featured launcher app with all home screen widget size classes, multitasking / Stage Manager support, iCloud sync, NFC read/write capabilities… in the short term, building a small, focused app would have been easier and (results at hand) more effective, but I still think that in the long run having a well-rounded and feature-rich product could be better for Users.

In many ways, this post was a form of therapy. It didn’t feel great to see the numbers barely go up (I’ve tried to tell myself it’s been a 300% increase in downloads, but a free app on 3 platforms that gets 10 new Users per day is still a flop, and I’m not one for sugarcoating things too much), but I think I see things with a better perspective now that I wrote this.

I am sure many Indie developers know the feeling of working hard and still not being able to reach the audience you had hoped for. While it’s not great, and my friends it is not, I think it’s okay, as long as you keep learning and getting better at what you do. #indielife means you’ll live and fight another day, on your terms.

P.S. My brain is not wired for oversharing and this is a way more personal post than usual… Since I’ll only publish it on my RSS feed and share it to my small Twitter circle, chances are that only my closest online friends will see it. But if you relate with my experience and think other Indies would too, I’m also okay with you sharing my ramblings… there’s no shame in trying something and not succeeding, and we should tell that ourselves more!


Link HUB 2.0 on Product Hunt

🔗 September 14, 2022

Just a few days after launching together with iOS 16, Link HUB 2.0 - URL Launcher & Widgets is on Product Hunt!

Download Link HUB 2.0 for free on the App Store and start launching apps, Shortcuts and URLs directly from your iPhone’s Lock screen, or from the app and widgets on your iPad and Mac too! And if you like it, please give it a boost 🚀 on Product Hunt with your upvote! 😺


Link HUB 2.0 with Lock screen widgets

🔗 September 12, 2022

Just as iOS 16 lands on your iPhone today, Link HUB 2.0 - URL Launcher & Widgets is also available on iPhone, iPad and Mac!

Download it now for free to unlock a level of speed and productivity unimaginable before!

Thanks to the new Lock screen Widgets for iOS 16, the apps, Shortcuts and URLs you rely upon the most are only one tap away, in any moment; all widgets sizes for the lock-screen are supported, and for each one you can choose if you want an opaque background or a less-intrusive look, so your iPhone can serve your needs while perfectly matching your style!

Just a few examples of what you can do directly from your iPhone’s lock screen with Link HUB’s superpowers:

  • Open any app you want, and in some of them – with the right URL – navigate to specific sections
  • Launch automations from Shortcuts… basically Link HUB is the shortcut to your Shortcuts’ shortcuts 🤪
  • Start a FaceTime call to your special someone
  • Jump directly into a conversation in Messages
  • Open any website

But there’s more: in Link HUB 2.0 widgets aren’t only on your lockscreen… you can now add as many super-high density “regular” Widgets as you like! While the small widget is a big convenient button for just one link, a medium widget can contain up to 8 links, a large one 16 and the extra-large widget on iPads makes 32 links available to you… that’s double of what most alternatives (including Shortcuts’ native ones 😉) offer, and you can have them on all platforms: iOS, iPadOS and macOS!

Version 2.0 also includes a redesigned (in SwiftUI!), clean and easy to use screen to add and edit URLs, the ability to finally select custom icons for every link, and improved speed and reliability.

Obviously, all the beloved features of Link HUB remain: it’s still free for up to 4 links, when you first launch the app there’s a quick tutorial and some example links to get you started even if you never worked with URL schemes before, everything syncs via iCloud, you can choose that some links should only appear on certain classes of devices, you can even program and read NFC tags (this nerdy and super-useful feature requires a subscription to Link HUB Pro, which also unlocks unlimited links for just $ 4.99 per year), or send HTTP GET requests 🤓 for IoT automations.

Link HUB 2.0 is the 8th free update since Link HUB’s launch 2 years ago and I think you’ll love it. I also hope that the convenience of having anything you want on the lock screen will be for you the game changer that’s already been for me during the months of development and refinement of the app this summer.

Get Link HUB for free from the App Store and immediately unlock the power of your iPhone’s lock screen!


Best of 2021

🔗 December 31, 2021

I’m compiling 2021’s list at the very last moment, in a bit of a rush and not really feeling it.

After this super-inspiring introduction, here’s what I picked for 2021 (same categories I used in my previous posts, and as always no affiliate links):

Best song: Chvrches’s Final Girl, and the whole album is great.

Best album: Cassadee Pope’s Thrive, and especially What the Stars See, Say it First and Break Too.

Best book: TFW you realize a year went by without you reading a decent book… 😬

Best movie: Danny Collins, which I saw on January 3. Honorable mentions: I Care a Lot and a pretty unknown and slow-paced movie, 10 Items or Less, which I very much enjoyed.

Best TV show: The O.C.. Yes, really. Runner up: The Americans. In other news, I believe 2021 was a rather terrible year for new shows…

Best podcast: My choice for the media category I dedicate most time falls on a big podcast I actually started enjoying so much more this year, Cortex.

Best tech podcast: I think I’m going to kill this award, it’s always the usual suspects…

Best investigative reporting podcast: The Dropout, which is actually so much better that Bad Blood The Final Chapter.

Best news article I read: How an Excel TikToker manifested her way to making six figures a day

Best Mac app: It took me a while to set it up just the way I want it, but this year’s winner is easily Timing.

Best iOS app: I’ve been using it for years, but I realize I never awarded one of my most used apps, News Explorer. Great on macOS too, actually.

Best videogame: It’s been the killer application convincing me to buy a Xbox Series S, and I understand I’m awarding it mostly for the graphics and the amazingly vast open world… but Forza Horizon 5 is an easy pick for me.

Best video: If you have a dozen hour or so, President Biden’s Inauguration is my choice, for all it represented. Can you believe January 6 is less than a year ago? Fun fact, it’s the second time Joe Biden wins this category. The guy will go places!

Happy new year! 🥂 to a best, safe and healthy 2022!


300

🔗 November 2, 2021

I haven’t blogged in a while, but a quick celebratory post is in order: today GlanceCam reached 300 ratings in the Mac App Store 🎉:

The average ratings value has been stable for quite some time. 4.1 is not where I’d want my main app to be, but a RTSP camera viewer is necessarily a bit technical to setup and therefore bound to have a few 1-stars ratings from Users who didn’t really read the App Store description or watch the video. Still, I’m confident to keep it grow over time.

Development of GlanceCam for Apple Silicon is ongoing, moving slower than I’d want due to a still-unfixed bug in VLCKit that it’s causing issues with the initial sizing of the streams, but I’m working on it and hopefully it won’t take too long for this highly anticipated version to ship (it won’t happen in November, though, as I am attempting a different kind of personal challenge this month… ✍️).

See you at 500! 😉


Goodbye, Weightrack

🔗 March 25, 2021

Last December I received an email from Apple informing me that my very first app Weightrack would require an update by March to remain in the App Store, because it was built with an old iOS SDK that could not be signed anymore.

While in the past I’ve been able to let go other apps, this one stayed in the back of my mind the whole time…

Weightrack, quite obviously if you look at what it does and how it does it, never saw big download numbers, totaling just 7.130 downloads since August 2014, with IAP sales barely surpassing 100 $ total; it’s a rudimental app, with basic functionality and a user interface I try really hard to be proud of but seriously, no…

Still, a couple months ago I spent a good part of a weekend trying to bring it to the latest screen sizes and SDK. I quickly realised it would be possible to keep it somewhat alive, thanks mostly to the fact it’s an Objective-C project, but my code was as bad as you can imagine, so I kept post-poning additional work on it.

I felt and feel some kind of obligation, because Weightrack not only is my first app, but it’s my first Xcode project and the thing I used to teach myself to program absolutely from zero, only with the help of Google and of some excellent Lynda.com courses… In those months of exciting development I learned about object oriented programming, Objective-C, Xcode, debugging, a bit about iCloud sync and integrating third party libraries, and possibly the most valuable thing, it taught me about shipping and submitting an app.

I actually still remember quite vividly popping a Corona, with my feet in the pool and enjoyining a warm August night, just after submitting it for review… I had no expectations of downloads, but was quite proud of having made it to the final line. It felt amazing and I am glad I took a moment to celebrate that first step. 😊

Back to reality, I am thankful because without those months of development I would not be here today, and yet I must admit it would be irrational, and utterly self-referential and nostalgic, to sink more time on Weightrack in 2021, so I’m letting it go when this month wraps.

If you want to see how basic my first attempt at iOS development was, and marvel at some really bright colors, I guess you have a few more days to download it for free and benevolently smile at it…


Mistakes were made, let's learn from them

🔗 March 15, 2021

GlanceCam 3 launched last week and, for such a niche product, I couldn’t be happier:

  • Lots of Users reached out via email to let me know they’ve been waiting for multi-windows for a long time and loved the implementation;
  • No dangerous bug or crash ruined the experience;
  • Sales spiked more than I have expected (the ratio among lifetime unlocks and yearly subscriptions also surprised me: it’s currently 4 to 1); of course the rush is now almost over, but still, it was nice while it lasted;
  • Cherry on top: iMore wrote about it!

So, I’ve decided to celebrate by reflecting on my mistakes in the 2 years that took me to launch GlanceCam 3, or I should say the mistakes I made causing me to take 2 years to ship it.

I’ll try to keep this of reasonable length and actionable to other indie developers:

  1. Lack of focus: I started working on multi-windows in March 2019 and since then I’ve shipped 5 medium-size updates to GlanceCam, launched 3 small new apps (PhotosUpload, Link HUB and ClipBar), updated Walk More and Tame Time, and spent 5 months on an unfinished Catalyst project I still very much hope to complete some day (it’s almost there…).
    With a day job (I work in a completely unrelated field to programming) I can’t do that: if I’m lucky (and able to actually get up at 4.30 a.m.) I have 2.5 hours per morning during the week and a little more time on Saturdays and Sundays to program.
    I need to pick my battles carefully and I can’t give myself the illusion of being productive because I work on too many things at once.
  2. You guessed it, as it goes hand in hand with the first mistake: lack of motivation. If you don’t make progress on something for a long time, you start procrastinating… maybe even launch 3 different apps instead of working on the only one that generates a little revenue.
    When you planned over and over to work on something and don’t make tangible progress, it’s a very dangerous place for that project to be in.
    Things need to keep moving or they die.
    I feel lucky to have been able to finally find the willpower to really put my head down and work for almost 300 hours on GlanceCam this year (since January, outside of my day job I haven’t done anything but coding, talking walks with Milla, eat, work and do very stupid things to my sleep-cycle), but I realise it was an unreasonable and unbalanced way to get both my and my app’s mojos back.
  3. Branching proliferation: I wanted a big 3.0 with multi-windows, new Preferences and much more, so my idea was to keep updating GlanceCam while working on the other features. Then, when I got stuck on difficult problems connected to multi-windows development, I started from scratch again and again (branches: multiwindows_take2, _take3 and _take4, which eventually shipped) while also concurrently working on Preferences and even custom one-off features I sent to some Users who asked for tweaks. Merging was a nightmare, because in the meantime the shipping app progressed.
    If time is constrained, I must do ONE thing, finish it, and then move to the next one.
  4. Aiming for the stars: a big 3.0 was a reasonable desire, and indeed I don’t think some press would have mentioned a camera viewer if it was a smaller update, but before this long release-cycle I was always smart enough to build small updates and ship them in a timely fashion.
    I’m returning to my better habits already, as GlanceCam 3.1 has already been submitted for review, but finding balance between frequent releases and their depth is very important, and probably will continue to be a struggle in the future, for instance when I’ll start thinking of GlanceCam 4 (or maybe of the much requested iOS version that’s more of a new app altogether… see, I am learning: I can foresee that, while promising in terms of market size, that’s also dangerous for focus and branching proliferation).
  5. Managing project-related informations: during the weekend I asked other developers about their tools for keeping track of their work, feature requests, bugs and ideas and got very good answers. In that thread I’ve also shared where my journey on this ended (not far from where it started, OmniFocus, but with better structure).
    Working on different things at the same time, in different directions and on multiple apps, I’ve let my to-do lists slip a bit, then more than a bit, until they got stale and their periodical review became painful and stopped happening.
    I know better than that: my mind works best if I have a single stop between home and work, a single and up-to-date bucket for everything that’s related on planning and developing a project.

I sure have made plenty of other mistakes (letting a single feature request derail my plans, allowing a review to mess with my mood, starting work on something before doing the appropriate research and due diligence, leaving marketing to the last few days, even building a whole new website the day before launch…), but this is probably enough introspection for me to go through in one sitting, and for you to read… thank you for coming along, hopefully there was some lesson for you to extract from my mistakes!


🚀 Introducing GlanceCam 3

🔗 March 11, 2021

Today marks an important milestone for my IP camera viewer for Mac: GlanceCam 3 is now available in the App Store! 🎉

Launching an update you’ve worked on for two years is a peculiar experience: it’s exciting to finally share something you’re proud of, it’s a relief to have those few frustrating moments finally behind you (it’s never all smooth sailing, isn’t it?), and it is also a bit terrifying to think all those hours of designing, coding, testing, making videos, timidly attempting some marketing and writing documentation might go unnoticed.

So, let’s take a deep breath and launch 🚀 GlanceCam 3: today is a big day and, since you are reading this, someone is noticing 🥰 grazie!

First, a 30 seconds introduction 🎬 to GlanceCam 3:

The new website glancecam.app also debuts today with lots details and screenshots.
There’s a Media Kit available to the Press and quite detailed release notes for those who want to know everything about the app.

A few key points about GlanceCam and its biggest update yet:

  • GlanceCam is a native IP camera viewer for Mac compatible with most models, because it supports standard streaming protocols.
    It’s a great way to stream in realtime without dealing with browsers, abandoned plugins and apps inspired by Windows 3.1 Hot Dog stand.

  • The app launched in 2018, costs $ 3.99 in the Mac App Store, received 20 free updates to date and is well liked in its small niche, with 215 App Store ratings averaging 4.1 stars as of today.

  • My focus for version 3 was to improve the first experience and configuration process, which inevitably is a bit technical because every camera manufacturer does things in their special way 🙄, while adding advanced features Users have been asking for (cough, multi-windows, cough).

  • With this update I am introducing GlanceCam Pro, a new optional tier for Users with advanced requirements.
    GlanceCam Pro is offered either as a life-time in-app purchase (buy once, keep it forever) at $ 22.99 or as a subscription at $ 8.99 per year; some Users strongly prefer one option over the other, so I made both available, but they share exactly the same feature-set:

    • Open as many cameras as you need in separate windows and independently resize and arrange them around your screen; their position is remembered when you relaunch the app, whenever technically possible (maybe 3% of the time macOS begs to differ, and macOS always wins… ;).
      Opening multiple cameras at the same time is by far what Users requested more often since launch, so it’s the tent-pole feature of GlanceCam 3 (and getting it right is the reason it took me 2 years to ship this update 🙃);
    • An optional Minimalistic user interface that hides everything but your camera when you’re not interacting with the app;
    • Custom aspect-ratios, including non-standard manual proportions;
    • Priority human support via email in less than 24 hours, Monday through Friday;
    • 14 funny alternative icons (most drawn by me, but you’ll certainly like those designed by my friends Becky Hansmeyer and Rob Poulter more!) are available while the app is running.
  • Obviously, GlanceCam Users who do not need such advanced features were also front and center in my mind the whole time, and the free update to the regular version is also a big one:

    • A new Preferences window makes the configuration process easier; I understand Preferences are often an afterthought, but for my app they are the first thing a User sees while dealing with the not-always-straightforward process of retrieving their camera parameters, so making them look better and actually simpler to use might be as important as multi-windows.
    • There’s a new, and gorgeous if I dare say so myself, app icon designed by my friend Becky; she did an amazing job, and you should buy her apps 😃!
    • Tooltips and help are everywhere, including in a new quick onboarding video (told you, I’m a videographer now 😎) that assists Users move their first steps in the configuration process; I am especially happy to have finally written extensive documentation in the form of Frequently Asked Questions;
    • Aspect-ratios are now auto-detected;
    • Insta-zoom (right-click and hold to temporarily maximise a camera), going in and out of full-screen and resizing in general are faster and more reliable (on ultra-wide screens too, now 😬);
    • One of the most essential features of GlanceCam, Always on top – a camera optionally hovering above all other windows – now has a (way less useful, IMHO) counterpart, but Users asked… you can now send a camera Behind everything. Like, behind your Desktop icons, at the same level of the background. Why, do you ask? I really don’t know, but I am only the carpenter here, and Users are always right.
  • Finally, there are a few obligatory 🐛🔫 & 🏋️‍♀️ (bug fixes and improvements).

It’s a substantial update, and I hope with all my heart Users will love it as much as I loved building it.

If you think GlanceCam 3 looks cool, please give it a boost 😺 on Product Hunt, making this launch day even more special!

Whenever you are a reader of my blog or new here (welcome, and please celebrate with me! 🥂), a long-time GlanceCam User who’s been waiting multi-windows for a while or again you’re just curious about IP cameras, I hope you’ll download GlanceCam 3 from the Mac App Store!

Finally, feedback is more than welcome. And 5-star reviews are great too 😉, if you are so inclined!


Solution for initial Time Machine backup way larger than source

🔗 January 11, 2021

For a few months, my Time Machine backup disk filled up way too fast: I know how incremental backups work, and it made no sense that, starting immediately after the initial backup, the Time Machine volume consistently had almost twice the space of the originating one occupied: with an internal drive of 1 TB capacity, 90% full, my 2 TB Time Machine drive immediately filled up over 80% 🤔.

Googling the issue showed other people complaining of similar problems in recent months, but no solutions were provided.

I repaired both disks, deleted Time Machine local snapshots before erasing the Time Machine drive (oh so many times), but nothing seemed to work.

I should mention I am still running the last version of Catalina, 10.15.7, and that my main drive is a M2 formatted with APFS, while the backup drive is a spinner formatted in HFS+ (as APFS for Time Machine drives is only supported starting with Big Sur).

Curiously, the exaggerated size of the backup was known to Time Machine even before starting the first backup: if I went into TM Preferences’ pane before doing the initial backup and removed a folder, the estimate size stayed consistently well above my internal drive occupied space.

This morning I figured out what was causing the problem for me, and I’m posting this so that it can maybe help somebody else from Google in the future.

I have a second hard disk in my computer which I use as a clone of the main drive; obviously I keep the clone disk unmounted at all times, and certainly when running Time Machine initial backup. Nevertheless, Time Machine was producing a backup way larger than the internal drive because, while the Clone volume was unmounted, Clone - Data wasn’t, and therefore TM backed up not only the files on my main drive, but for some unexplicable reasons also all the files on Clone - Data, a different hard disk! Please be advised that Clone - Data was not visible on my Desktop, but showed as mounted in Disk Utility, and that’s the reason I didn’t notice it being mounted before (also, I did expect that ejecting Clone from the Finder also would have ejected the Data APFS volume, but clearly that’s consistently not happening for me… so both Clone and Clone - Data are now excluded from auto-mounting in fstab).

Possibly, you are thinking this makes no sense. I agree. Something must have changed in the last few months, because I never noticed this issue before last summer (so, already on Catalina) while I’ve been using this setup for years, but here I am now, with a fully-unmounted Clone hard disk and a Time Machine initial backup roughly the same size of my internal drive.


Blog tags and other website improvements

🔗 January 6, 2021

Since forever, most posts on this blog have been tagged, but I never actually exposed those tags.

This changed today: now all my posts show their tag at the bottom, and there’s a page listing all tags for quick access to categories.

A big shoutout goes to this post from Long Qian that transformed a possibly complex task, adding tags to a Jekyll site hosted on GitHub Pages, into a breeze.

While I was working on my site, I also fixed an issue that prevented banner images from being shown inside the post pages (they only appeared in the main blog page 😬).

I challenged myself to blog more this year; subscribe to my RSS feed to see if I succeed!


Best of 2020

🔗 December 30, 2020

Oh boy, one year ago I had the courage to write I didn’t feel inspired to compile this kind of list… if only I knew what 2020 had planned for all of us, and yet here I am, very lucky to be able to do it once more.

On paper and unwillingly, I had more time - more than ever, really - to watch and listen and read and play. I won’t go into sad considerations about the awful year we had, or reflect on how that huge amount of time seems to have disappeared into very little, and (mostly) concentrate on the good stuff I discovered instead.

Here are the picks that made 2020 a little more bearable (same categories I used the past couple of years, and as always no affiliate links):

Best song: Last Hope by Paramore, and I especially and truly love this live version I linked to. I’ve occasionally listened to Paramore albums for over a decade, but somehow I never heard Last Hope before being in lockdown last March, and it feels perfect for this year, and one of the best songs I’ve ever listened to, period.

Best album: While I listened to many good singles this year, I couldn’t say I had a favorite album, and then Taylor Swift released Evermore and saved the day; I really like Willow (the photography and colors in the video are also great!), Marjorie, Long Story Short, ‘tis the damn season, Champagne problems… almost every song is good, and one has to wonder how did she do it, twice in one year.

Best book: Despite all the time I had on my hands, I read an unusual small number of books this year, and among them my favorite was (for the second year in a row) a novel by David Baldacci, The Christmas Train; not a masterpiece, but it was light and delightful during the uneasy months of the last spring. I also liked How to Fail at Almost Everything and Still Win Big by Scott Adams, even if it’s in a category of books I usually avoid.

Best movie: I have watched 21 movies this year, according to the ratings I usually leave for myself in IMDB. While I’ve seen a few pleasant titles (Togo, Wild Rose, Christmas in Conway and Jack of the Red Hearts all deserved a 7, and I had no higher ratings for “movie-movies” in 2020), and I watched the last four Star Wars movies (confession: I never saw any film of this saga before, and I skipped the originals going directly to The Last Jedi, which also was my favorite), I have a 10 that stands out in IMDB while not being a “real” movie - but sort of fits this category: Hamilton was everything, and more. Actually, I should watch it again…

Best TV show: The hours I didn’t spend watching movies and reading, very much went into TV shows. And it was a great year for TV. Honorable mentions: the second season of Castle Rock, Line of Duty, Home Before Dark, Defending Jacob and Mythic Quest (especially the 10th episode, Quarantine, which can only be appreciated after seeing the previous episodes, though). AppleTV+ played a big role in my entertainment this year, but the show of 2020 is certainly Homeland, which had a fantastic last season and the perfect finale.

Best podcast: On the top of my head, I would have not said that This is Love was my favorite podcast this year, but when I stopped and thought about it, 3 of 4 of my favorite podcast episodes in 2020 were from Criminal’s sister podcast in rose-colored glasses: The Wolves was a masterpiece and my favorite, with Gobi immediately behind and Something Large and Wild was also very good. In case you wonder what was the 4th podcast episode I really enjoyed, it was Modern Love’s Dusty-Danger Dog, even if it was really, really sad… “No, you’re crying” sad.

Best tech podcast: I renew my appreciation for Automators for the second year in a row, but to be honest tech podcasts don’t entertain me much anymore. I’ve started The Ladybug Podcast, which at least brings me some fresh perspective, and Cortex, though, and I think I might continue listening to both in 2021… so maybe there’s hope for tech?

Best investigative reporting podcast: oh well, I’m going to keep the category alive for the future, but I don’t have a pick this year.

Best news article I read: While I am breaking rules… this year I’ve had enough with the news. I am thankful, they played the most important role ever, and deserve to be praised, but I’m picking a blog post I very much enjoyed instead… go read Give Yourself More Playtime by Martin Rue today, instead of a news website, and you’ll thank me later.

Best Mac app: In 2020 I started using Drafts much more, and it’s being a useful and effective tool (but not the perfect single solution for my notes, because I need and want inline images), and yet I think the most delightful app for me to use this year was Pixelmator Pro.

Best iOS app: Shortcuts deserves the spot again this year (it was my pick in 2018 too)… thanks to its widget and the Airtable API I’ve built some neat automations, and had lots of fun doing it.

Best videogame: While my ankle kept me on the sofa for over a month, I did spend an unreasonable amount of time playing Butter Royal, and I regret nothing. Actually, I’ve just noticed that the game is now available on macOS too, so you might not see me for a while…

Best video: as much as I tried to ignore the elephant in the room for most of this post, 2020 was the year of a tragic pandemic and lockdowns, and I did find How to Be at Home moving and the perfect fit for this category. On a lighter note, 2020 by Ben Folds also deserves a mention…

Thank you for bearing with me while I remembered the few good things 2020 had to offer.

I want to leave you with my best wishes for a completely different - much better, safer, happier, vaccinated - new year, but also with the wise words of John Oliver about 2020, because they perfectly express my feelings towards a year that lasted a decade, and finally ends tomorrow 🍾.


Merry Christmas!

🔗 December 25, 2020

Me and Milla just wanted to take a moment and wish you all the best and most serene Christmas!


Goodbye Google Analytics, you won't be missed

🔗 December 10, 2020

In November 2018 I added Google Analytics to gain some aggregated insights about the traffic on this website; I did disable everything intrusive I could (no gender, age, etc. reports for me), but never actually loved the idea of having Google cookies associated with something I do.

While I’ve always been pretty straighforward with the cookie-consent message (This website uses Google Analytics. I’m only interested in aggregated traffic informations and on my side nothing creepy will derive from that knowledge. If you don’t consent to cookies, please leave this website and, possibly, the whole Internet, or Google (ironic, uh?) a way to block cookies.) and sarcastic with the Got it, thanks EU! button to dismiss it, I’m very happy to announce that this site is now Google, cookie, and cookie-consent free.

Following the lead of my friend Chris, I’ve just switched to CloudFlare Analytics, which only provides aggregated, user-first and privacy focused anonymous informations; I always only cared about page views, which is basically most of what CloudFlare is providing and now it’s all I got from a company that actually has a good track record and no involvement in advertising (they also give you device groups and countries of origin, but I find that of no interest).

Bonus points, Safari’s “shield” is now happy because my website does not contact any tracker.

I’ve also just requested the deletion of my Google Analytics “property”, which will be completed in 35 days, without even looking at it one last time or downloading it. Which tells you a lot about how much I really care about those data…

If you have a website, I encourage you to look into CloudFlare’s solution, the blog post I linked above is a good starting point, as it describes how they accomplish analytics without cookies or fingerprinting.


ClipBar 1.3

🔗 December 2, 2020

A couple of days ago ClipBar 1.3 became available in the Mac App Store with two handy features:

  • You can now share the current content of your pasteboard (be it text or an image) to other apps with the share button in the lower left corner of ClipBar’s popover (which appears when you click on the app in the Menu Bar).
  • ClipBar popover is now more effective when you have copied a bunch of text and want to keep only part of it: when the popover is visible, select the text you want to keep and either right-click and copy, or hit CMD+C.

I can’t express how grateful I am for how ClipBar has been welcomed: the app has reached over 180 upvotes on Product Hunt, pretty cool for a nerdy utility!


ClipBar's cool week

🔗 November 29, 2020

Busy week for ClipBar: Pasteboard Viewer, my new app that allows to quickly check what’s in your Mac’s pasteboard before actually pasting:

  • The app launched 5 days ago.
  • The next day, version 1.1 added the ability to view the untruncated pasteboard text by hovering the mouse on the app in the Menu Bar, and also fixed the inevitable bug that had to creep in before shipping version 1.0.
  • Yesterday ClipBar gained unexpected attention on Product Hunt, where it currently has 98 upvotes, an astonishing number for such a nerdy and niche utility.
  • Today I submitted a more significant update to Apple for review, and I am happy to announce that version 1.2 has already been approved!

Here’s what’s new in ClipBar 1.2, that you can already download from the Mac App Store:

  • A new popover appears when clicking the app in the Menu Bar, allowing to preview images & display longer texts/paths without truncating them (with the additional benefit that you can extract part of the copied text instead of pasting everything and then deleting what you don’t need…).
  • ClipBar now tries to conceal passwords, thanks to an agreement between some software developers at NSPasteBoard.org; while this is not perfect, nor 100% reliable as explained in the onboarding of the app, it improves privacy. But - to be 100% clear - this feature does not remove the need for you to evaluate if an app that keeps your pasteboard’s content in plain text on screen is acceptable considering your working environment, your employer’s rules, and your screen-sharing activity.

I am very happy for the unexpected interest in ClipBar. I can’t say I have a thousand more features to add, but stay tuned because a couple of ideas I’m cultivating might prove to be nice features!


ClipBar's great day on Product Hunt

🔗 November 28, 2020

A few days ago, my friend Chris made me the nicest gift and hunted my new app ClipBar on Product Hunt 😸.

Today, totally out of the blue, the app gained momentum on PH and – while I’m writing this – it has reached 60 upvotes, which I consider amazing for such a niche product!

If you’re into PH, and you should because it’s a lovely community centered on building up people and ideas, please take a look, let me know what you think and consider sharing it and/or showing your support with an upvote: I’m really proud for Clipbar achieving this unexpected result after less than 4 days from its under-the-radar launch, and I am working to release version 1.3 tomorrow, which will include a popover for previewing long text and images.

I almost forgot, ClipBar is available on the Mac App Store!


Black Friday 2020 spectacular

🔗 November 25, 2020

To honor and show my appreciation for my American friends, this year I have decided to put 4 of my apps on sale, worldwide, for 3 days!

  • GlanceCam - IP Cam Viewer is 40% off, now only $ 2.99. This is GlanceCam’s first sale since the launch 2.5 years ago and a unique opportunity to take advantage of inexpensive webcams on your Mac!
  • Link HUB - URL Dashboard & NFC 1 year subscription is 50% off! At $ 1.99, this is a steal for using the app to automate URLs on iOS, iPadOS and macOS!
  • TameTime: Awareness Times is also 50% off, and for only $ 1.99 is a great investment on your health, and a “must recommend” for your friends and family who sit long hours at their Mac.
  • PhotosUpload - FTP uploader is the nichest app of them all, allowing you to upload photos on a FTP server you have access to from your iPhone and iPad, and so it gets the biggest discount, only $ 0.99 (67% off the regular price!).

It might take a few hours for the App Store to propagate the price changes, but the apps are on sale until Friday!

Happy and safe Thanksgiving!


A small new Mac app, ClipBar: Pasteboard Viewer

🔗 November 24, 2020

As I mentioned on Twitter a few days ago, my brain has found a creative way to sabotage the work on my main app GlanceCam: instead of being plain unproductive, 🧠 screams 🐿 in different directions, knowing that I will eventually start the chase.

So, here I am to introduce you to my latest diversion, ClipBar: Pasteboard Viewer.

ClipBar is a small macOS utility that allows to quickly check what’s in your Mac’s pasteboard before actually pasting; if you have ever wondered what was the last thing you copied, this app is for you.

ClipBar lives in the Menu Bar and shows the last item you copied: if it’s text, the corresponding string is displayed (you can set the maximum length shown and where to clip the text if it’s longer: at the beginning, in the middle or at the end); for files, it shows the full path; and, finally, it displays the size of the images you copy. All this, with optional emojis 🎉.

I’m finding the ability to quickly glance at the content of my pasteboard surprisingly useful, and I believe it’s making me both faster and more accurate in my work, from emails to writing and programming.

The app is modern, small and efficient and works natively on Intel Macs and on Apple Silicon, being a good citizen both of Big Sur and of previous versions of macOS (starting with High Sierra); it’s not a clipboard manager, but it can complement yours, if you use one (for me, it’s Alfred).

Since your pasteboard’s data might be very sensitive, ClipBar only works locally on your Mac: no sync, to 3rd party libraries or frameworks, no analytics… actually no Internet connection at all! The app is fully sandboxed and does not persistently store your pasteboard contents on disk: it only keeps the last item in RAM while the app is running. More details con be found, in plain English, in the Terms of Service and Privacy Policy.
Speaking of terms, there is one thing that you should carefully consider before starting to use the app: ClipBar displays on your screen, in plain text, the last thing you copied, and that might include passwords or other privileged informations; if you work around other people or screenshare a lot, you need to evaluate if this is the right app for you, or at least remember to quit it before having collegues look at your screen. When you launch the app the first time, you can find more informations about this, to help you make a more informed choice.

I’d love for you to try ClipBar today, and maybe tell your techy friends about it! You can already find it in the Mac App Store, where it costs very little money – with no subscriptions or in-app purchases and, again, the peace of mind of knowing that your pasteboard’s content will remain securely confined on your device while being easily glanceable!


TameTime 1.3 for Apple Silicon and Big Sur

🔗 November 18, 2020

🚀 TameTime now natively supports Apple Silicon and is fully at home on macOS 11 Big Sur.

TameTime is my utility for being aware of the time spent in front of your Mac without taking breaks (which are automatically detected) and can help in fighting RSI and other computer-related stress… it helps me every day!

Download TameTime now on the Mac App Store!


TameTime 1.2 debuts today with a huge discount!

🔗 October 4, 2020

🚀 TameTime 1.2 debuts today in the App Store, 50% off for 1 week, to remind you to take regular breaks and avoid spending too much time sitting at your Mac at the expense of your health.

This new version adds manual pauses ⏸ for conference calls and the ability to repeat your custom alerts at multiples of your “minor” time threshold (i.e. every 10 minutes), and not only for the “major” one (i.e. every hour)!

Download TameTime now on the Mac App Store!


Introducing Link HUB for Mac

🔗 September 24, 2020

I am very happy to announce that, less than two months after its introduction on iPhone and iPad, Link HUB is now available on macOS too, thanks to Catalyst: version 1.5 is already in the Mac App Store and is free!

Link HUB is a dashboard from which you can quickly launch any URL (and I mean any: websites, URL schemes, HTTP GET calls for automation, deep-linking into apps, IFTTT webhooks and so on).

The app started as a small utility on iOS and iPadOS (where it’s a good multi-tasking citizen), but can sync links on all platforms with iCloud (while offering the option to have some links only available on certain devices, for instance only on Macs, or only on iPhones / iPads) and even supports NFC reading and writing; getting started with Link HUB is easy, thanks to the optional examples the app can add for you during the guided onboarding.

Link HUB 1.5 for iOS / iPadOS 14 is also available today in the App Store as a free update and introduces compatibility with the Mac version while adding full support for the latest release of Apple’s mobile operating system.

For Users who want more than 4 buttons and NFC support, an inexpensive subscription ($ 3.99 total for 1 year of Pro access on all platforms) is available as an option, and highly recommended to support the app’s future development.

It would mean the world to me if you decide to try Link HUB and tell your friends about it!


iOS 14 updates for Walk More and PhotosUpload

🔗 September 23, 2020

I’m a few days late with this post, as both updates are already available in the App Store:

  • Walk More 1.5 asks the User’s authorization before accessing the IDFA identifier of the device to show targeted ads in the free version; I think Apple did great introducing this, and I wanted my app to support this privacy-focused feature on day one, and indeed this update shipped the same day as iOS 14.

  • PhotosUpload 1.3 is a maintenance update for iOS 14 that also fixes some visual glitches on iOS 13.

Soon I’ll also have a major announcement regarding my newest app, Link HUB… stay tuned!


Link HUB is on Product Hunt

🔗 August 12, 2020

I’ve just posted Link HUB on Product Hunt 😸!

Please take a look, let me know what you think and consider sharing it and/or showing your support with an upvote: I’m really proud of the app after less than 10 days from its launch!

You can download Link HUB for free on the App Store.


Link HUB with NFC tags support

🔗 August 8, 2020

The 4th update to Link HUB, my iOS and iPadOS dashboard to launch any kind of URL and URL scheme, has just landed in the App Store, and it is the biggest one yet… actually, version 1.4 adds the feature the app was originally imagined for: you can now use inexpensive NFC tags to trigger the launch of URLs you saved in Link HUB: Shortcuts, home automations, direct calls and messages to specific contacts, websites, web-hooks, and so on…

A short video is worth a thousand words:

As you can see, this enables all kinds of automations: Link HUB can write cheap NFC stickers for you, to associate them to specific links. After Link HUB writes a tag with the specific informations it needs to recognise it later (and this procedure is very easy and completely automatic!), scanning it from inside the app will immediately launch the link; even better, tag reading even works when the app is not running, if your iPhone supports background NFC reading: for recent iPhone models you’ll receive a notification and, as soon as you’ll tap it, your link will be immediately launched.

NFC tag support is a really cool feature, implemented for the easiest and fastest usage possible, and requires the inexpensive - $ 3.99 total per year - Link HUB Pro subscription (and, obviously, some writable NFC tags).

Please read the Frequently Asked Questions for some human-understandable and not-too-nerdy informations to get you started with NFC… no previous experience with NFC required, as everything is completely automated by Link HUB!

I really hope you’ll love using NFC tags as much as I do!

You can download Link HUB for free in the App Store.


Not how you launch an app... introducing Link HUB

🔗 July 31, 2020

Once again, I miscalculated the timing of an app launch: this morning Link HUB, a fun project I started a couple of weeks ago, debuted in the App Store after a very fast review process.
I had a few launch images and the product page ready, but not this introductory post, so I rushed out a tweet and the app debuted into the world 🎉, actually with a warmer welcome than most of my iOS apps in recent years had: according to App Store Connect, which is showing me data for the last 8 hours as I write this, over 50 people downloaded it already!

For an hobbyist, self taught developer like myself, that’s a big number. Certainly most of these downloads came from the very precious retweets from Becky, Brent, Chris and Simon, who I want to really thank for their help ❤️!

I also sent a grand total of 2 tweets and one email to promote the app to people I follow and that have an audience I believe might be interested in this kind of product. I am not sure if this massive marketing effort produced any effects yet, but somehow I doubt that

And because haste makes waste, my rushed tweet actually bit me, because I promoted the app before its in-app purchase propagated in the App Store, something that actually pretty commonly requires a few hours after the app is approved (just like appearing in search results), but that I forgot about even if it already happened to me in the past. Do you see a pattern with my launch planning here?

And from there, my day spiralled in a bit of a mess between my day job, errands to run while outside there were 38° C (100° F) but still wearing a mask (obviously, only a crazy and irresponsible person wouldn’t), replying to a couple of support emails and submitting version 1.1 of the app to add duplication of items (Link HUB’s first feature request… thank you Scott!), fix a small bug and correct something that was really, really painful for me to see… I can honestly say that the “best” moment of the day was when I realised that I had a typo literally in the first screen of the onboarding:

Now that my day has settled a bit (I’m home, in front of a fan running at its max speed, eating watermelon 🍉 with Milla 🐺 while Link HUB 1.1 is waiting for review, and the in-app purchase is finally appearing for Users around the world… I even have my first subscriber!), I thought I’d share today’s story as a warning to myself, and maybe other developers: as you probably figured out by yourself, this is NOT how you launch an app.

If you ask me, I’ll tell you that I know it’s not enough to put a lot of effort in Xcode. If you’re an indie, you know it too.
We all read great posts on what it takes to execute a good launch, and yet when the app is ready you just want to let it fly into the world, where sadly it will probably crash because you didn’t prepare the way for it as well as you could.

So, after this — hopefully at least a bit entertaining — cautionary tale, let me finally tell you about Link HUB, an app that clearly is here despite my best efforts!
Its product page describes Link HUB in detail, so I won’t repeat everything here, especially because the app is free to use (with limits: 4 links in the free version) so you can just try it for yourself… let me just say that, if you’re interested in a dashboard from which you can quickly launch any URL (and I mean any: websites, URL schemes, HTTP GET calls for automation, deep-linking into apps, IFTTT webhooks and so on), the app works nicely on iOS and iPadOS (where it’s a good multi-tasking citizen), syncs with iCloud, helps you get started with optional examples and manages to have a few nice touches (my first app with haptics and menus!). For Users who want more than 4 buttons, an inexpensive subscription ($ 3.99 total for 1 year, I think it’s reasonable) is available as an option, and my hope is that the app can gain a niche big enough to make its future development sustainable, because I have ideas:

  • NFC support (origin story: the app exists because yours truly and his brother in law wanted to play around with NFC tags… indeed, the Xcode project and repository are still called NFC because I am too lazy to rename them).
  • A Mac version! I’m thinking “checkmark-Catalyst” (meaning, not too many differences from the iPadOS version, at least until I know there’s people interested), but I believe it could still be useful have it on all platforms even if it’s not the most native and chiseled Mac app ever.
  • Reordering links (another feature request from Scott, thanks for this one too, I love feedback!).
  • Search and maybe some sort of grouping? I don’t see folders in the immediate future, but if there’s demand I can look into that.
  • When iOS 14 and iPadOS 14 ship, most likely a widget. I am familiar with the “old style”, Notification Center widgets, having built them for Tasktic, Walk More and Always There, and I actually loved the fact that they were true mini-apps, but it really doesn’t make sense to make one of those today, only to have it replaced by a less-functional one in a couple of months. But I won’t make promises on this front yet, because I still can’t read Swift UI (required for the new Springboard, non-interactive widgets): my brain breaks when I see its syntax.

Thank you for coming along in the first day of this journey.
I hope you’ll like Link HUB (App Store link here, so you don’t have to dig around in the post to find it) and that you’ll tell people about it.
As YouTubers say, please like (review in the App Store!) and subscribe (in the app, but also to my RSS feed.
And please, don’t hesitate getting in touch at support@cdf1982.com, I take great pride in replying to all emails I receive!


Core Data + CloudKit app using NSPersistentCloudKitContainer only syncing at launch and not during execution

🔗 June 21, 2020

Hello visitor from Google, I hope you are well, but most likely you are not, because you are fighting with syncing issues.

I posted this on Stack Overflow earlier today, but it actually also makes sense to have it here on my blog.

In a new app I’m working on, I had syncing issues (not upon launch, when it synced fine, but only during the app being active but idle) in a project that uses Core Data + CloudKit with NSPersistentCloudKitContainer.

My app was built using Xcode’s 11 Master-Detail template with Core Data + CloudKit from the start, so I had to do very little to have syncing work initially:

  1. Enable Remote Notifications Background Mode in Signing & Capabilities for my target;
  2. Add the iCloud capability for CloudKit;
  3. Select the container iCloud.com.domain.AppName
  4. Add viewContext.automaticallyMergesChangesFromParent = true

Basically, I followed Getting Started With NSPersistentCloudKitContainer by Andrew Bancroft and this was enough to have the MVP sync between devices (Catalina, iOS 13, iPadOS 13) not only upon launch, but also when the app was running and active (thanks to step 4 above) and another device edited/added/deleted an object.
Being the Xcode template, it did not have the additional customisations / advanced behaviours of WWDC 2019’s sample project, but it actually accomplished the goal pretty well and I was satisfied, so I moved on to other parts of this app’s development and stopped thinking about sync.

A few days ago, I noticed that the iOS/iPadOS app was now only syncing upon launch, and not while the app was active and idle on screen; on macOS the behaviour was slightly different, because a simple command-tab triggered sync when reactivating the app, but again, if the Mac app was frontmost, no syncing for changes coming from other devices.

I initially blamed a couple of modifications I did in the meantime:

  • In order to have the sqlite accessible in a Share Extension, I moved the container in an app group by subclassing NSPersistentCloudKitContainer;
  • I changed the capitalisation in the name of the app and, since I could not delete the CloudKit database, I created a new container named iCloud.com.domain.AppnameApp (CloudKit is case insensitive, apparently, and yes, I should really start to care less about such things).

While I was pretty sure that I saw syncing work as well as before after each one of these changes, having sync (apparently) suddenly break convinced me, for at least a few hours, that either one of those modification from the default path caused the notifications to stop being received while the app was active, and that then the merge would only happen upon launch as I was seeing because the running app was not made aware of changes.

I should mention, because this could help others in my situation, that I was sure notifications were triggered upon Core Data context saves because CloudKit Dashboard was showing the notifications being sent:

So, I tried a few times clearing Derived Data (one never knows), deleting the apps on all devices and resetting the Development Environment in CloudKit’s Dashboard (something I already did periodically during development), but I still had the issue of the notifications not being received.

Finally, I realised that resetting the CloudKit environment and deleting the apps was indeed useful (and I actually rebooted everything just to be safe ;) but I also needed to delete the app data from iCloud (from iCloud’s Settings screen on the last iOS device where the app was still installed, after deleting from the others) if I really wanted a clean slate; otherwise, my somewhat messed up database would sync back to the newly installed app.

And indeed, a truly clean slate with a fresh Development Environment, newly installed apps and rebooted devices resumed the notifications being detected from the devices also when the apps are frontmost.
So, if you feel your setup is correct and have already read enough times that viewContext.automaticallyMergesChangesFromParent = true is the only thing you need, but still can’t see changes come from other devices, don’t exclude that something could have been messed up beyond your control (don’t get me wrong: I’m 100% sure that it must have been something that I did!) and try to have a fresh start… it might seem obscure, but what isn’t with the syncing method we are choosing for our app?


2020.12.02 - Update for Users who set NSPersistentStoreDescription to interact with public databases and are noticing delays in the updates.

A few days ago, Ben Radler brought to my attention a behavior that those who use public databases with CloudKit (I was using the private database in the original post) need to take into account when testing:

If you are setting the NSPersistentStoreDescription to interact with the public database rather than the private database (previous default before iOS 14 I believe) via description.cloudKitContainerOptions?.databaseScope = .public, it will only poll for changes from cloudkit every 30 minutes by design (see 10:30 into the WWDC 2020 session video on this topic).

I want to thank Ben for pointing this out, since it might also be a cause for head-scratching when testing CloudKit sync!


GlanceCam 2.10 with auto-reconnection & other neat tricks

🔗 June 7, 2020

I really need to start writing my announcement posts as soon as I hit submit in App Store Connect, because App Review did it again: GlanceCam 2.10, which I finished working on Saturday night, is already available for download as a free update.

I know this is not the multi-windows upgrade many Users are waiting for (I am very sorry, GlanceCam 3.0 is not 100% ready yet), but I didn’t want to hold back on some helpful features:

  • GlanceCam now tries to detect if the connection to a camera is disrupted and, instead of leaving a deceitful frozen image on-screen, it tries to reload the video stream 3 times over the next 90-ish seconds; if the connection cannot automatically be re-established, the User will know because the window will remain grey, with a small red warning, until it is manually reloaded. I think this is much better than believing a camera il working when it is not, and in the tests that myself and a few Users have done since January, it has worked very well, so the feature is on by default.

  • There are now “expert tweaks”, all coming from Users’ feedback and requests in the past few months (as Frasier would say, “I’m listening”), available in the app’s Preferences. These are not settings most Users will need to adjust, but can be very helpful for special setups and are especially neat because they don’t affect the entire app behaviour, but only specific cameras:

  1. For mirrored images, it is now possible to flip the stream vertically or horizontally (or both).

  2. By default, GlanceCam uses the RTSP over UDP protocol, which is perfect for most cameras and Users. For few Users who regularly experience some significant delay when initiating the connection to the camera, or for those who cannot establish a connection over a VPN (working from home, anybody?) or through a particularly aggressive firewall, I have added the option to enable RTSP over TCP, which in tests that myself and some Users have conducted in the last few months, could make a remarkable difference for both issues.

  3. For 4K camera Users who notice some frames dropped while being on a good reliable connection (LAN or fast WiFi, as dropped frames at 4K via Internet could be caused by the line speed), then it’s possible that increasing the video buffer could help keep the frame rate smooth at 4K. Now this option is available, though it won’t be necessary (and it is not recommended, because it necessarily increases the memory used by the app, even though GlanceCam remains super-efficient) for Users with 1080p or lower-resolution cameras, and also for 4K cameras with already smooth playback.

As always, feedback is more than welcome at support@cdf1982.com. Oh, 5 star reviews are great too 😃, if you are so inclined!


TameTime 1.1

🔗 June 6, 2020

App Review was so fast, a new release of TameTime hit the App Store before I could blog about it.

TameTime is my utility for being aware of the time spent in front of your Mac without taking breaks (which are automatically detected) and can help in fighting RSI and other computer-related stress.

Version 1.1 adds a feature requested by a User: the app can now alert you not only when your session lasts over a certain amount of time, but also multiple times when you are so much in the zone that you keep working for 2, 3 times longer your original alert threshold. As always, alerts can be sounds, notifications, even a screen overlay, or a combination of these methods, at your preference.


New items with creation date in the past in Apple Notes

🔗 June 1, 2020

I never blogged during this pandemic, not even once, because it felt pointless with all that was (is) going on. I understand my reaction is the opposite of what many have done with the additional time at hand, being stuck at home, and I am in no way expressing a negative judgement; on the contrary, all those posts kept me sane and entertained, and I am very grateful for them! Of course the world had to continue spinning, and we were all looking for some normalcy, but still… I did not feel like writing here (additional proof that this refrain was not rational: I had no issues tweeting many unimportant things in the past weeks) and I don’t really feel like blogging even now. Most likely this will be a ramble more than a regular post, but I have the silliest thing to share and I’m going to pretend it’s just a day in January.

If I wasn’t against very long titles, you would be reading a post titled “No, you spent two hours figuring out how to create new notes with dates in the past in Apple Notes, in order to move your 80ish Day One entries there, only to learn after the fact that Notes.app cannot lock items that have PDF attachments”. Which is insane. As is it insane that you cannot password-protect an entire folder and have to go note by note instead. And don’t even let me start to comment about the fact that Notes.app does not allow to manually edit a date and avoid the whole point of this post…

But this is not (only) a rant about Apple Notes, which probably is still the best free note taking app with reliable sync and inline attachments, these limits notwithstanding. No, since I’ve done this not insignificant amount of research for nothing, because attachments & password-protection are both required for me, let me at least share the acquired knowledge and tell you, dear visitor from Google, how to create notes in the past in Apple Notes.

It’s a 4 steps process:

  1. You need a template Evernote XML file (.enex); here’s my basic one.
  2. In this file, with a text editor customise the title and body (both optionals, as you’ll be able to edit them later in Notes) and set the creation date (field ‘created’) in the YYYYMMDDTHHmmssZ format; don’t necessarily bother with the last edit date (field ‘updated’), because as soon as you’ll modify the note inside Notes.app, it will change to the current date.
  3. Add this “Evernote note” inside Notes via the Import in Notes in the File menu, which supports ENEX files.
  4. Check the new item in the newly created Imported Notes ƒ inside Notes.app; clicking on the date at the top toggles creation date and last edit.

TIL the Z at the end of a date stands for Zulu (see, a long journey but I learned something!), which is the same of UTC 🤯! Since we’re talking letters, and not only about the things I did not know, be careful to keep the T for separating the time and the Z at the end, or this time machine won’t work.

All this trouble because multi-platform journaling apps with inline images and sync are unicorns if you’re not willing to pay big money for subscriptions. Not that I’m against recurring food for developers, but I averaged 1 Day One entry per month in the years I’ve used the app, and 3 $ to save each one of my inner ramblings is a bit on the expensive side.

Finally, just to explain why it took me two hours for this project, be advised that you could theoretically add attachments to these new notes by embedding them, base64 encoded, inside the XML; you need to also store the MD5 hash for the file in the XML. I found this quite unreliable, but YMMV; if you decide to try creating a finished, rich note, from a XML, I suggest you download Evernote, create a free account, add and export a note with an attachment, so that you can experiment on a complete ENEX file, improving your chances of success.

Finally, if you managed to read this far, notes note note, notes! Notes? Just in case I didn’t write “note” enough time in this post.

Stay safe! I’ll try to return to a less infrequent posting schedule.


Always There free at last, but not for long

🔗 February 15, 2020

A week ago I received an email from Apple announcing that my third app, Always There, had “won” the outdated apps lottery and would be removed from the App Store in 30 days unless a new update is issued and approved.

While Always There still works perfectly for its small purpose, it never received an updated in almost four years, so I was expecting that someday Apple might knock on my door. This is okay and I have absolutely zero complaints, it’s actually great that they’re keeping an eye on old apps.

There was no rational reason to spend time on updating a very small utility that never surpassed 100 $ in revenue (#devlife 🤑), but I was still willing to try: the app continues to work fine, and is actually more “useful” than ever on iPads now that widgets can be always on screen, so I was considering a small emergency update to officially support the “latest” screen sizes (iPhone X, anyone?) and iOS versions.

Always There on iPadOS 13, showing the prettiest & smartest wolf ever

Sadly, tonight my intentions collided with the hard reality of early Swift development: the last commit of Always There is a 3-year old migration to Swift 2, but after that I never ported the codebase to Swift 3; so, today I’d need Xcode 8 to migrate to Swift 3, and then a newer version of Xcode to actually finish the migration to the current release of Swift… thing is, Xcode 8 does not run on macOS Mojave, and it doesn’t really make sense to create a VM just for this…

So, Always There will go away in 3 weeks, but it will not leave the App Store with sadness: the app, which used to cost $ 1.99, is now free for everyone to grab, just a small gift to anyone who might like to keep a special photo, ahem, always there…

I expect the app to continue to work for quite some time (it already survived 4 iOS releases with only some minor visual glitches in the preferences view on iOS 13), so it might be a nice addition to your Notification Center or iPadOS home.

I’m less sad seeing this app go away than I was for Tasktic, but I understand letting apps go is part of the process: when I made Always There I was very new to software development (it shows, believe me) and it taught me some interesting skills, so even if it never was a success, I’m still glad it is on my devices and, maybe, after today’s pricing decision you’ll enjoy it on yours too!

Truly for a limited time only (not marketing bla bla, App Review’s clock is actually ticking… 🙃), download Always There free on the App Store!


Best of 2019

🔗 December 31, 2019

This December I didn’t really feel like writing this post, or anything really, but I also do not want to break the streak of Best of posts after a few years publishing them. So, here are my picks (same categories as 2018, no affiliate links):

Best song: An easy one for me, Lying Down by Céline Dion.

Best album: I can’t say I have a pick. I just started an Apple Music subscription, so hopefully in 2020 I’ll find something new and nice to listen to, as the year that ends today was not great for music, in my opinion.

Best book: Wish You Well by David Baldacci is a lovely, old school and heart-warming story, and definitely the best book I’ve read this year.

Best movie: I’m having a hard time choosing between Green Book, The Boy Who Harnessed the Wind and Mia and White Lion, so I’m not picking one, and recommending all three of them.

Best TV show: Another easy pick after best song, For All Mankind was a really great TV series, and I miss it already.

Best podcast: ATP is an easy choice this year, because the Mac Pro shipped and we recently got the episodes we all were expecting 😉.

Best tech podcast: I found myself listening to Automators as soon as a new episode releases, and I honestly can’t say the same for other more established podcasts.

Best investigative reporting podcast: Bundyville The Remnant was as good as the first season, which by the way was my pick for 2018.

Best news article I read: My memory these days is not good enough to pick an older article, but A Conversation With Rudy Giuliani Over Bloody Marys at the Mark Hotel is already a perfectly appropriate choice for the times we live in.

Best Mac app: I can’t say I discovered a groudbreaking new Mac app this year (how surprising, no Catalyst great app yet 😛), but I love OmniFocus as much as one year ago, so I’m confirming my pick for 2019 too.

Best iOS app: Pushcut is a very neat utility to make Shortcuts even more useful and was a good candidate, but I’m going to give my award to the Tractive iOS app, as it’s really well made, feature complete and useful to my peace of mind every single day.

Best videogame: I played so little games this year, my choice is basically restricted to the games available in Apple Arcade during the month I kept the free subscrition alive. So, not an expert opinion here, but Sayonara Wild Hearts is certainly worth playing to.

Best video: I’m leaving you with something inspirational… NASA’s How We Are Going to the Moon.

I wish you the best 2020 possible.


Black Friday discount for TameTime

🔗 November 28, 2019

So, I decided to honor the not-so-Italian tradition of Thanksgiving / Black Friday sales by discounting TameTime for a few days.

I programmed TameTime to remind myself of moving around every once in a while: my back only gives me a break if I give it a break at least once per hour, by standing and walking around. TameTime nudges me to do so with notifications, sounds and even a (brief) full-screen overlay for the times I really, really only need five more minutes on top of the last five more minutes…

TameTime can make a difference for people who suffer from computer-related stress and pain. If you or someone you know has these issue, this promo is a great way of saving 50%: until Saturday, TameTime is only $ 2,49 in the Mac App Store!

Happy Thanksgiving, and thank you for being here!


100

🔗 November 9, 2019

I feel like celebrating! 🎉

Today my IP camera viewer for macOS, GlanceCam, received its 100th rating in the App Store, a 5-star review:

For such a nerdy app, that requires Users to have some knowledge of their network and to customize URL strings in order to connect to almost every brand and model of IP camera out there, I think it’s a great average (and it the US App Store it’s even better at 4.2 stars with 45 ratings).

The 1-star reviews sting a lot, to be honest, but are to be expected because the app is not really plug and play, as I try to make clear before the purchase, in the App Store description.

To help make the camera manual configuration process easier, I reply to all reviews and support requests, usually in less 24 hours, volunteering to research the proper string for the specific camera a User owns; sometimes I can’t find it because the camera does not support standard protocols, other times people don’t get in touch at all, and in a few cases they didn’t read the app description in the first place and expected a different product, but hey, that not only happens in the App Store, but with every kind of product sale everywhere. In all these situations where I can’t help, I immediately point discontent Users towards Apple refund procedure, but the return rate for GlanceCam is very low, again a great result for this kind of application.

Overall I think GlanceCam has the most generous and supportive customers possible: having had a 100 people take the time to rate the app, and 36 of them to actually write a review, is such a privilege for an indie app developer, and I wanted to take the time to acknowledge that.

P.S. Today’s 5-star review renews GlanceCam’s most frequent feature request: “Really hoping the ability to view multiple cameras at the same time comes soon”. I’m not really ready to give a timeline for it (I’m trying to learn a page or two from this blog post from Brent Simmons), because work on this feature has proven time and again to be a lot longer and difficult than I expected, but I have a decent prototype working on my Mac, and GlanceCam 3.0 will certainly include multi-windows support when it ships, hopefully not too far in the future. Sorry I can only promise that it will come, but not how soon!


GlanceCam 2.9

🔗 October 28, 2019

GlanceCam 2.9 is now available in the App Store, less than a week after that version 2.8 shipped.

This release adds the ability to export your list of cameras and actions (Glances, in GlanceCam’s parlance) for backup and also for deploying the same set of cameras on multiple machines quickly and easily.

Obviously, since you can export, you can also import those files later or on different machines running GlanceCam; please, store your backups files safely, as they will include your devices IP addresses and credentials in human-readable format.

You can find Import Glances and Export Glances in the File menu and inside the app Preferences.

Under the hood this version also adopts a newer version of Swift, to future proof things even more.

A lot of work is going into GlanceCam’s development: this is the 16th free update in around a year and a half!

This week I also updated the app’s mini-site to streamline the description a bit and make it clear that DVR/NVRs are not supported; finally, I began writing a FAQs to help clarify some doubts perspective customers might have.

If GlanceCam provides you value, please consider leaving a 5 star review and, maybe, sending a tip (you can do so from the app Preferences). Thanks!


GlanceCam 2.8

🔗 October 24, 2019

GlanceCam 2.8 is now available in the App Store and brings improvements to the app’s automation capabilities:

  • The already existent URL scheme (glancecam://?camera=01, where 01 is the camera number as ordered in the app Preferences) now also works when the app is not running: it launches GlanceCam and then selects the camera you specified in the URL scheme.
  • There’s also a new action available via URL scheme: glancecam://?fullscreen=true (or false) sets the fullscreen mode of GlanceCam on and off; please be advised that this is not a toggle: if GlanceCam is already fullscreen and you ask it to enter it again, by design nothing will happen.
  • You can also combine multiple URL scheme actions in a single string: glancecam://?camera=02&fullscreen=true selects the second camera AND enters fullscreen… how convenient!
  • GlanceCam now supports AppleScript too, both for switching cameras and setting the fullscreen mode:
    tell application "GlanceCam"
      select camera 2
      set fullscreen true
    end tell
    

Shipping this update took longer than usual due to some hiccups in my code related to tips… a warm thank you goes to the very patient person (or persons) of Apple’s App Review who very gracefully waited for a bug to be squashed and to Matt, who once again helped me when I found myself out of my depth. Go take a sneak peak at his amazing Go editor for macOS, Chime! As much as you’ll want to, you can’t lay your hands on it yet, because it’s still in closed beta, but it looks amazing and it will be worth the wait.


PhotosUpload 1.2

🔗 October 19, 2019

PhotosUpload version 1.2 is now available and introduces an op­tio­nal High Con­tra­st the­me for the user in­ter­fa­ce.

This the­me can replace the clas­sic oran­ge with dark grey for most in­ter­fa­ce ele­men­ts and is more rea­da­ble in dif­fi­cult si­tua­tions like when using the app in full sun­light; High Con­tra­st can be toggled in Pre­fe­ren­ces.

The up­da­te also in­clu­des mi­nor bug fi­xes.

PhotosUpload 1.2 is a free update available right now on the iOS App Store.


Introducing TameTime: Awareness Timer

🔗 October 2, 2019

Last August, while I was on vacation and had some time on my hands, I listened to episode 340 - You Are a Computer Athlete of ATP and found myself nodding along with everything John Siracusa said about RSI; then I continued nodding while creating a new Xcode project, and here we are today.

Context: my back always hurt a little, but since 2013 things got a bit worse and I have to manage my behaviour to avoid pain: if I don’t lift heavy weights, I don’t stand in the same position for too long or sit still for hours on end I am mostly fine, but a single mistake generally means a few days of annoying pain. Overall I am lucky, lots of people have it much, much worse, but I tend to try avoiding any kind of pain, if possible 🙃.
Skipping heavy-lifting and standing still on my feets is easily accomplished, but the sitting part is a completely different beast: if you work in an office, enjoy programming in your free time and your hobby is reading, it’s not rare that you end up spending many hours in the same position, and in my experience a full hour is the longest I can sit without any consequences.
I find the Apple Watch, with its standing reminders, incredibly helpful, and I’ve been using a specific Mac application for years to track how long I’m using my computer without taking pauses, but the Watch notifications are sometimes easily missed when I’m “in the zone” and that old app is going to die in Catalina (32 bit winter is coming) and already hangs on Mojave more often than not, stopping all alerts without letting me know that something went wrong.

So, if you are a hobbyist programmer listening to a podcast discussing RSI, you obviously think: “I can build a tool to help me take care of my back! How hard can it be?”.

Honestly hard it was not, even though it took longer than I expected, because programming and also because I lost some time following a bit of a scare I had with my main app GlanceCam… but today, finally, I am happy to introduce TameTime: Awareness Timer to those who feel pain and discomfort because of the many hours spent in front of their monitor.

Honestly I’m not announcing a unique product, but what is unique these days? Execution is all that matters anyway, and the app I used before missed features I wanted, crashed and had only an annoying gong for notifications, while TameTime is exactly the better, more polished app I would have bought if it existed.

I’ll let the product page describe my new app in detail, but here’s the gist of what this 1.0 version does (obviously, I have ideas for future releases…):

  • TameTime automatically tracks how long you use your Mac.
  • The app lives only in the menubar and shows the active session duration in hours and minutes, with an emoji that lets you know how you’re doing… it starts happy like the all of us, but sit too long and you’ll make it cry and maybe even 🤬…
  • You can set up 2 thresholds, let’s say for 20 minutes and an hour, that have different levels of alerts: a sound (with system defaults and some custom tones that I find appropriate for the task… but yes, there’s also a more pleasant gong than the one included in the app I used before), a notification and even a 3-seconds overlay of your screen; you can mix and match these alerts to your heart’s content, or disable them and only keep the timer in the menubar (the emoji can be disabled too, if you’re a sad person 👻).
  • No manual interactions are required: TameTime detects pauses after a customisable delay and automatically resets its timers.
  • Obviously the app can launch at login, is compatible with macOS 10.15 Catalina including support for Dark Mode (but also works on older versions of Mac OS X), and doesn’t do nasty stuff: no analytics, no network connections, no special permissions… it’s completely sandboxed; it is also very light, using almost no CPU or memory resources.

TameTime is available in the Mac App Store starting today. It’s a one-time purchase for $ 3.99, no IAPs, no subscriptions.

My app is obviously not a medical device, and I am not a doctor (just like Siracusa recommended in ATP’s episode mentioned above, please talk to a good doctor if you’re having pain or any kind of discomfort!) but I think it can help you become more aware of the time you spend at your computer, which is an important first step for reducing RSI, CVS and other causes of discomfort and pain that are caused or worsened by sitting for too long in front of a screen. It certainly is helping my back, making it the perfect kind of app to build: one that you need yourself!

But sales are good too 😁, so please share TameTime with friends and family you know can take advantage of a bit more awareness in their lives. Thank you!


Sunsetting Tasktic (for now)

🔗 September 29, 2019

A little less than four years ago, my second app Tasktic debuted in the App Store. Sadly, I’m here to report that today I have removed it from sale.

Before explaining the reasoning behind my decision, let me pay my respect:

In many ways, I could say that Tasktic was actually my first true app, and certainly it was my first Swift (version 1.0!) project… It’s actually a quite complex piece of software for a beginner (and certainly I was a beginner - if I’m not still today - in 2014 when I started working on it…), being a Universal app with support for iPhone, iPad and Apple Watch that had reliable sync from day one (after multiple rewrites during development… a full month of my life I’ll never get back 🙃) and offered a lot of capabilities that at the time rarely appeared in free task managers, especially when made by a solo developer: a reasonable and customizable GTD approach, optional notifications, both projects and multiple tags, recurring tasks, Siri support (when it was hard & hacky to achieve it), in-app statistics for motivation, a widget and a share extension; the app has always been free, with multiple levels of in-app purchases, and was 100% respectful of users privacy.

To be honest, Tasktic was never a commercial success (in hindsight, maybe refusing on principle to include banner ads in the free version was a bad call), but it was loved by some and noticed in ways I would have never imagined during my many months of hard work developing it: the app received very nice reviews from Users and press, it even showed up in a PRINTED NEWSPAPER (!), Sydney’s The Daily Telegraph (proof), and it was - and I am still shocked, shocked by it - featured among the top 10 products of Product Hunt’s Tech page on Christmas day 2015:

tasktic_on_producthunt_homepage.png

What a journey!

Tasktic is also somehow a victim of my other apps and of the continuous evolution of Swift in its first years: the last major update shipped over 3 years ago and the big 2.0 I’ve poured so many hours into (my guess: over 200… it had themes, habits tracking, a more modern UI and much more) sits 80% completed on my hard drive and never launched in the App Store, again slowed down to a halt by my newest apps (after Tasktic I launched Always There, Walk More, ContactsAMI, GlanceCam and PhotosUpload) and, not insignificantly, by the huge cost of migrating to a new Swift version apparently every time I opened Xcode, something that either you diligently did every time, or became a really big burden if you accumulated technical debt.

Having said all this, it’s very sad - incredibly sad - for me to pull the plug on Tasktic, and I truly hope I’ll be able to resuscitate the project some day in the future.

Most of what I know as a programmer, I have to thank Tasktic for.

But it makes sense to remove it from sale for the time being: the app is out of date, doesn’t fit modern devices right, in a few cases (as far as I know, only for myself and one user) is also crashing on iOS 13 (when in-app statistics are enabled); on top of that, the market has evolved, more modern apps are available and it would be difficult to justify the work necessary to ship version 2. I have a lot on my plate right now, with GlanceCam and the upcoming TameTime, and sooo little time… so, dear Tasktic, goodbye for now 😥.


GlanceCam compatibility issues with beta 8 of Catalina

🔗 September 14, 2019

Update 3 - Tuesday, September 24
Great news! macOS 10.15 Catalina beta 9, launched yesterday, completely fixed the compatibility issue that affected GlanceCam and other apps relying on OpenGL since with the previous beta 8.

Everything is fine as the currently shipping version of GlanceCam, 2.7, is already 100% compatible with macOS 10.15 Catalina; I’m so happy that the post below is now obsolete… 🥳

The past two weeks were a bit of a rollecoaster 🎢, but thanks to Apple fixing that scary beta 8 bug in no time, and also the help of friends old and new (a special thanks to Steve 🙏, he knows why), not only my app is now back to the usual reliability and compatibility (and I am proud that GlanceCam is compatible not only with the latest - even future - OSes, but that it also keeps support back to OS X 10.11), but it is in a much better position to leave behind OpenGL in a future release.

Just this morning, before knowing that beta 9 resolved the crash at its root, I had a breakthrough in the implementation of an alternative, Metal-based, engine for GlanceCam. I will keep working on this major migration, thankfully without the pressure of an upcoming crisis, but keeping it at high priority: I still see great value in leaving OpenGL behind before Apple decides that it really is time to let it go.

The fact that my app is 100% ready for Catalina is what I am here to write about, but there are a couple more thoughts I’d like to share:

  • Friends, file radars Bug Reports! I wasn’t very hopeful that a 🐛 appeared in beta 8 was going to be resolved before the official launch of Catalina, and obviously the fact that Apple applications were crashing helped a lot, but I’m sure that my report, together with the many others I’ve seen filed in the last ten days or so, helped significantly in escalating the priority of this crash.

  • Since in my previous update I mentioned an emergency app update I submitted to Apple to warn users before the launch of Catalina, I think it’s only fair to let you know that it did not pass App Review, as I honestly expected even before submitting it: you can’t mention a future release of macOS, no exceptions; you also can’t wait for the new OS to ship, because an app would not be approved if it crashes with the shipping version of macOS. Quite a catch 22, uh? But the App Review person I interacted with was very kind (dare I say he or she felt my pain? I dare, because they clearly did!) during the whole process, and it sparked an extended and helpful conversation 💯.

I’m leaving the original post and update 1 and 2 “for archive purposes”, but below this line, everything is now obsolete.


Update 2 - Wednesday, September 18
I have updates on multiple fronts about the crash described in the original post below:

First, I am aware of multiple Bug Reports filed to Apple in addition of mine (FB7276584): FB7253859, FB7283002, FB7265136, FB7281945. One of these reports yesterday received the following, somewhat encouraging, comment in Feedback Assistant:

Recent Similar Reports:More than 10
Resolution:Potential fix identified - For a future OS update

From that feedback we can think that Apple is aware of the issue and it is possible that a fix is coming, though it is unclear when (next beta? later?). It’s an encouraging development, but I still need to figure out something myself (VLCKit team, on their forum, also seemed “in stand-by” for a solution from Apple) in case the “future OS update” is too much in the future for my Users.

So, tonight I submitted GlanceCam 2.7.1 to App Review, which contains an explicit alert to users in the app description, the release notes and, most important, inside an in-app warning that will appear the first time users will launch GlanceCam after updating:

I am not sure App Review will approve an app that a) acknowledges the existence a future version of macOS and b) mentions the fact that it is currently incompatible with it. But I had to try, at least to start the conversation with the always kind and open to communication, in my experience, App Review Team and will let you know how it goes.

Third, I’m moving my first, timid steps with SGPlayer, the ffmpeg and Metal library that was recommended to me and seems very promising; a couple of days ago I did build a small prototype working with local videos, but not with RTSP yet, so there’s still a lot of work to do before I can know if this is a viable replacement of VLC, and honestly I wanted to get 2.7.1 out of the door first.

Last thing, I’m extracting the FAQs at the bottom of the original post below and move them, updated accordingly to the new informations that became available in the last few days, to a specific FAQs page, which is now also explicitly mentioned inside GlanceCam’s product page, so that prospective customers are informed in advance of the pending issue, before making a purchase.

The next update to this post will probably be published after Apple reviews version 2.7.1. As always, please don’t hesitate getting in touch at support@cdf1982.com.


Update 1 - Sunday, September 15
A slightly better day, thanks first and foremost to the warm support of nice people on Twitter! Steve Troughton-Smith in particular brought me hope with something actionable to try, pointing me to SGPlayer, a ffmpeg and Metal library that on paper seems a good candidate for replacing VLCKit.
Also important, given how soon Catalina will be in the hands of end-users, I’ve filed radar Feedback FB7276584 to Apple, with attached crash reports and a sample project that “reliably” crashes on Catalina beta 8, but is stable on previous versions of macOS. I really, really hope someone at Apple has time to look at it.


TLDR: Yesterday I found out that, in the latest beta 8 of macOS 10.15, my app GlanceCam crashes when switching camera stream. My tests show that this is caused by Catalina’s OpenGL support; I read online that the same crash is happening to other apps using OpenGL.
Below I try to describe all details of this complex situation in the most transparent way I’m capable of, and at the bottom of the post there’s a FAQ that every GlanceCam user or prospective customer should read.
This post and the FAQ will be updated whenever new details are available.
Hopefully I’ll be able to find a solution soon. In the meantime, I deeply apologize to all GlanceCam users. Please know that I am trying my best to resolve the issue, but it’s not clear to me how and when (days? weeks? worse?) I’ll be able to if Apple did actually intentionally disrupt OpenGL support and won’t fix it in the next release.
For any questions you might still have after reading this post, please get in touch at support@cdf1982.com.


This is not an easy post to write.

Soon after Apple introduced the first beta of macOS 10.15 Catalina, I installed it and thoroughly tested GlanceCam, my app that makes possible to monitor IP webcams directly from your Mac and works with almost every camera model without using their (often horrible) web interfaces. With much relief, after those tests I could confidently report that GlanceCam was compatible with the next release of macOS.

This remained true at least up to Catalina beta 5, in the early days of August: with each beta release, I kept testing GlanceCam and everything kept working properly.

Why test with every new beta? A new release of macOS was a bit stressful for me because:

  1. Just one year ago another app I introduced six months earlier, ContactsAMI, was basically put out of its misery by the fact that macOS 10.14 Mojave removed support for Contacts.app plugins, which were the way the app was providing most of its functionality.
  2. With Mojave, Apple announced that OpenGL support was deprecated in favor of their own framework Metal; under the hood, GlanceCam relies on VLCKit for the video playback, which in turn uses OpenGL, so I was on the lookout for possible problems. I was cautious, but wasn’t necessarily expecting any issue in this update cycle, since in most cases a deprecation does not mean that some functionality is immediately taken away: usually deprecated code keeps working for many years, and I was confident that in the meantime the amazing team behind VLCKit could figure out a transition to Metal (and I still am).

So, when I saw that 5 betas in a row did not break my beloved app, I relaxed a bit and got back to work on my long-term project for GlanceCam, multi-windows support, that I felt could come in version 3.0 as soon as mid October, after many months of development (I’m a self-taught programmer with a day job in a completely different field, so most coding for me happens very early in the mornings, in brief stretches).
Inspired by ATP’s episode 340 talk about RSI, a few weeks ago I also started a new project, TameTime: Mac awareness timer, that as of yesterday was planned to launch this month; it’s a tiny menu bar app that alerts you with multiple configurable visual and acustic clues when you sit at your computer for too long.

And sitting at my computer for a very long time is indeed something I now see in my future, because Friday I got a very kind email from a GlanceCam user reporting that, with macOS Catalina beta 8 introduced on September 10, GlanceCam was launching properly, but crashing as soon as he switched to a different camera.

Friday night I immediately installed Catalina beta 8 and was able to reproduce the crash when switching cameras. Every single time. And always with the same error in the crash report:

assertion failure: “((void *)0) == tsd->NSCurrentOpenGLContext” -> %lld

Test on Mojave? Everything’s fine.

I did not despair, though. I downloaded and compiled the newest release of VLCKit and built GlanceCam with it, using the latest Xcode beta, which is actually the Golden Master, just to be safe.

Same crash.

And it’s a bad one, because Xcode’s debugger does not point anywhere in my code, it just logs that the app was killed with one of the most generic and obscure error messages: “terminated due to signal 9”. Sometimes this error refers to memory leaks, but I’m 100% sure it’s not the case here, and actually the error 9 seems to just be a generic feedback that the app was terminated by the OS.

At this point I started feeling really uneasy; first I digged through the console for clues about the crash (something you do with signal 9 errors), finding none, and then I Googled that crash report error message, landing on a unique result for my search: a 4 days old post on Apple forums where users complain about the same crash in many other apps, starting with Apple’s own Final Cut Pro, and in general confirming my suspicion that the issue is with OpenGL compatibility in the latest beta 8 of Catalina.

I am now at the end of an exhausting Saturday and I have tried what follows:

  • Placed breakpoints everywhere in GlanceCam’s code to at least narrow down where the issue is; it’s now certain that it is triggered by a VLCKit method that handles playback, not by my own code.
  • Posted my experience in the same Apple forum mentioned above, asking for suggestions from other developers who also wrote there (no replies so far, everyone is just bummed because the latest beta broke their work tools);
  • Asked for help in the VLCKit forum, where I met the usual kindness, but at least for now had only a sad confirmation: since OpenGL is deprecated and they’re not sure things will improve without a Metal port that is not currently ready, there’s no immediate fix. Since we’re on a week-end, I still hope that the conversation on that forum will lead me to a solution or a temporary fix, especially given the fact that I was also able to regurarly crash VLC video player itself getting the same crash report error, so this will be a priority for them too.
  • Built the smallest video player app possible, a true VLCKit MVP just to test where the crash occurs without all the overhead that a complex project like GlanceCam obviously has; this actually helped narrow the crash at exactly one VLCKit-related command: when you stop the playback, the app immediately crashes. Thing is, you can’t have playback run forever, you need to stop when you switch to a different camera, the screensaver starts or you close the app, so I did indeed narrow down on the issue, but I’m not closer to an actual solution. If you’re a programmer, you can download the Xcode 11 MVP project here, complete with a sample video and the VLCKit library already compiled and linked, and have it crash on your instance of Catalina beta 8 as soon as you press the stop button after starting the playback; and, fellow programmer, if you have any idea, I can really use your help.

More important, I started drafting a Radar for Apple that will also include the sample project mentioned above sent Bug Report FB7276584 to Apple with attached crash reports and the sample project mentioned above: if the first betas did not present this crash, maybe they’re not planning to actually kill OpenGL off so soon; on the other hand, we’re so close to Catalina’s launch that I feel like a fix ready for the next beta or even day one is a bit unlikely.

A personal note: it is possible that I am overreacting – I’ve only been aware of this issue for less than 48 hours and I am now quite tired, so maybe I’ll figure something out soon and we’ll laught at this post – but at the time of this writing the problem appears to be quite complex: it touches the basic architecture of the operating system, not only of my app, and it seems caused by technical decisions / bugs mostly out of my control, so I feel the right thing to do is to publish this post right away, and maybe have soon good news to follow up with.


Having taken stock of the situation without sugarcoating things, the very last thing I’m doing today is to write an exhaustive disclaimer / FAQs document (that I am now posting only here on the blog, but in a few days will go on the GlanceCam product page as well if the situation does not improve) that is available and kept updated here.


Again, I am deeply sorry for any disruption this might cause to your workflow, if you were planning to install Catalina at launch or you are already using the betas. I’ll do anything I can to restore GlanceCam functionality for all users and to keep you posted.


Printing HTML pages to PDF with wkhtmltopdf

🔗 September 11, 2019

Today I discovered a pretty neat command line tool, wkhtmltopdf, that allows to print a website (or a local HTML document) to PDF preserving the original page style (CSS, images, tables, etc.) in a way that is much truer to the original compared to what a regular browser does, at least in my experience; it also runs headless, if desired, so it can integrate nicely in other automation workflows.

It’s very easy to use:

  1. Install wkhtmltopdf, either downloading a precompiled binary or compiling the source code yourself; I went with the ready-to-install package.

  2. Run the following command with just two parameters, the source URL / local file path and the destination file (or add additional parameters, if you need to tweak things a little):
    wkhtmltopdf www.apple.com ~/Desktop/test.pdf
    
  3. Enjoy your PDF document, possibly without printing it to paper because this tool by default preserves the original page background, which is likely not the most environmentally-friendly choice.

For comparison, here’s apple.com homepage saved with this tool versus the same page printed to PDF from Safari:

wkhtmltopdf_vs_safari.png

Pretty cool, uh?


PhotosUpload 1.1

🔗 July 12, 2019

A few days ago I had to take a few photos at work, and my extended usage of PhotosUpload “in the field” brought up a few tweaks I felt were could improve the app.

Enter PhotosUpload 1.1. This new version includes:

  • A new upload progression view (basically, a HUD with a progress indicator and a 7/20 upload counter);
  • A recap, at the bottom of the list, of the total number of photos and the number of images already uploaded;
  • Minor bug fixes (the main one being a jumpy scrolling of the tableview while uploading many photos that is now gone).

I also edited the metadata in the App Store from a plain app name to “PhotosUpload - FTP uploader”, hopefully helping discoverability, and added the system-default “ask for review” prompt after a successful upload operation. Marketing!

After launching the app, I got feedback requesting SFTP support; I’m pretty busy right now (mainly my jobby job and, when I can, working on GlanceCam 3.0), but I can see that coming sometimes in the future. Stay tuned!

Obviously PhotosUpload 1.1 is a free update available right now on the iOS App Store.


Introducing PhotosUpload. Finally.

🔗 June 20, 2019

Over a year ago, at my day job I had to look for an iOS app for taking photos and uploading them to the company FTP server; bonus points were awarded if an app was easy and quick to operate because it would be sometimes used by “non-technical” people. Surprisingly, very few apps could provide that functionality, and even less were kept up to date and polished.

So, on May 17, 2018, I pushed the first commits of a new app, but any real work on its’ core features (take photos > add tags > upload image files via FTP) started 5 months later; by mid November - ~ 300 commits and many early mornings later - the app was 95% ready to be published, when I decided that I liked the idea to have it supported by subscriptions, given the very niche market it was addressing. A slow and painful phase followed, with edge cases to consider and everchanging requirements for the subscription copy, until I almost lost passion for the project: subscriptions code is soporific code and, meanwhile, GlanceCam was gaining a little bit of traction.

About a week ago, while thinking about my summer plans after WWDC, I realized that I’ve been sitting on a finished, useful app, and that I only needed to switch business model (to a very reasonable, IMHO, buy-once-use-forever $ 4.99 price) and be ready to share a little, but professional, piece of software we use and appreciate at work every day with the rest of the world (or, at least, the subset of the world that still uses FTP).

Enter PhotosUpload, available right now on the iOS App Store and compatible with iPhone and iPads, offering tags, multitasking support, a solid Core Data backend, an introductory tutorial to help users get started and a reliable uploading system that worked with every FTP server I tried it with.

You can find more details on its product page, but in summary, if your job includes taking photos and uploading them to a FTP server in an organized way, PhotosUpload is the professional app you were looking for:

  1. Shoot photos or select images from your Photo Library;
  2. Add tags! They are optional, but very useful to group related photos together (they are included in file names, after the date and time);
  3. When you are ready, upload your photos to a FTP server you configured. There’s no step 4!

I’m happy to be back in the game of iOS development after a nice period working on Mac apps, and I hope PhotosUpload will prove useful to many users: FTP is not the most modern technology, but if you still need it, I think it’s nice to have a polished and modern app in your pocket. Please, check it out!


#wwdc2019: Everything else

🔗 June 7, 2019

I’d like to close the week with a quick(ish) mention of many intersting things, including major ones, I didn’t have the chance to talk about in my previous posts:

  • macOS 10.15 Catalina & Project Catalyst: with much less friction than I expected, given the fact that the OS is now moved in a read-only APFS volume (already causing issues for other apps and really odd side-effects), the installation of Beta 1 on my special Mac went smoothly and I had the chance to play around in the new operating system for a bit. Obviously, support for 32 bit apps is gone - and that means I won’t be able to install Catalina at work in September, which is a bummer - but OpenGL is still there with much relief for the compatibility of my own app and in general I found the system really snappy, most likely because it was a clean install. The Catalyst apps look less alien than before, but I need more time to judge and I am still afraid that a side effect of Catalyst will be that we will see a lot of blown-up iPhone apps that were already turned into bad iPad citizens now being converted into terrible Mac applications by only clicking a checkbox, while in the meantime driving down discoverability in the App Store and reducing average prices for quality products; doomed-predictions aside (we’ll see in time), I appreciate that Catalyst apps will be distributable outside the App Store and I’m perfectly fine with the Notarization requirement. Finally, Catalina brings some lovely additions: Sidecar, Accessibility Improvements and Screen Time; about the latter, I’m under the impression that every window open currently counts towards the global time, even if it’s not actively interacted with; I’ll look more into it, and if that’s the case, there I’ll have my first Radar for the year.

  • Since I mentioned Radar, this tweet brought me sheer joy:

    Apple now tells you how and why a radar was closed. Duplicates are now referred to as similar issues, and it will actually tell you if a fix has been shipped

  • Apple Sign In, a.k.a. 🖕 Google and FB, is Apple at its best; meanwhile, some press is focusing solely on the requirement of Apple Sign In whenever other third-party login methods are present in an app. That’s as smart as it was for the DoJ to sue Apple for anti-competitive behavior in distributing books while Amazon had 95% of the market.

  • ARKit: boooring. Please, never mention it again until 🍎Glasses actually ship.

  • SF Symbol will make app development so much more convenient for me: hunting for glyphs or - worse - drawing some myself was always very time consuming.

  • tvOS’ main news is probably the addition of multi-user support: nice, but I’d rather have it on iPads. Oh, and real console gamepads are now a thing.

  • Speaking of iPad: iOS on tablets is now iPadOS, a clear sign that Apple is willing to accept for the OSes to actually diverge where needed. It’s a great sign, first and foremost, because the dedicated name forces them to deliver some new iPad feature every year; for 2019, we have significant - overdue - Files improvements, USB drives support and - for lack of a better term - multiple windows. I’m curious to try the new gestures, and especially to understand how quickly I’ll be able to ingrain them in my muscle memory (about gestures and the language of iPad, I recommend Dieter Bohn’s video for The Verge). Overall, I count this as a great year for iPad (as does everyone else out there 😜).

  • Deeply connected to iPad future is Shortcuts (don’t get me wrong, Workflow’s successor is also very useful on iPhone, but making new automations from scratch is an iPad-only activity for me), an app that keeps getting better at an amazing speed. Automatic triggers for Shortcuts was one of my only 3 wishes for WWDC 2019 - the others were to not screw up macOS, which we’ll see in 3 to 5 years, and to finally bring Xcode to iPad, something that got closer with SwiftUI - but even after I posted about them the other day I kept thinking about how important is also the conversational expansion of Siri: parameters and follow up questions are what really is missing from a truly useful personal assistant. Future looks bright ☀️ on the road to SiriOS.

  • iOS 13. As an early adopter of Dark Mode on Mojave, I don’t care much for dark background on phones: I prefer apps to be distinguishable one from the other, and white backgrounds work better in sunlight, but it was probably inevitable to come, and to each their own! The new iPhoneOS (jk, next year not so much?) should also bring faster launch times for apps, smaller downloads, general refinements to apps like Find My (what a deeply creative name) and the overhaul of Reminders; no improvements to Mail, sadly (third year in a row hoping for them to add a snooze function so that I can leave nosy 3rd party clients behind… 2020 will be my year, I hope). Overall, I count 2019 as a well-deserved and completely reasonable break from the absolute focus on iPhone that Apple had for years.

  • And finally, the funniest bit of the Keynote: Stealth mesh Bluetooth L.E. antitheft system (not the actual name) is the coolest combination of cryptography and sheer volume of devices out there I’ve ever seen, so very Person of Interest’s mesh network.

And that’s all for WWDC 2019.

No, not really, it’s not all: even though I tried to post more here on the blog (here’s a list of my 6 posts this week), there’s still so much that we still have to discover and analyze, and most important, there’s a lot of things to learn and so much work to do… (sneak peak that could lead to nothing: there’s an old, unfinished project of mine that would be perfect for Catalyst… but I also want to ship GlanceCam 3 and PhotosUpload in the next couple of months, so I really need to make a plan and stick to it)

It will be a good summer 😎


GlanceCam and macOS 10.15 Catalina

🔗 June 6, 2019

I am happy to report that, after an extensive batch of tests on Beta 1, the current version of GlanceCam is already 100% compatible with the just announced new release of macOS, 10.15 Catalina.


#wwdc2019: Xcode 11

🔗 June 5, 2019

In today’s episode of Mac Power Users Doug Brooks, Apple’s Product Manager for the new Mac Pro, among many other interesting things mentioned their internal Pro division is working with professionals not only to reduce render/computation times, but also to bring down small delays in repetitive actions that users perform daily using software, such as improving responsiveness in dialog boxes you have to interact with very often.

That attention to speed was paramount to Xcode 11 development was very clear to me immediately after launching it the other night, just after the State of the Union: resizing the window, jumping around in code, scrolling, everything seems a bit snappier, like milliseconds have been shaved around and animations have been shortened.

Xcode 11 just feels fast, not in terms of compile time (haven’t timed anything yet), but of user interactions, and I think it’s something I will appreciate every day, if I’ll actually be a good boy and open Xcode every day…

On top of that, touches like the Mini Map to glance at all your code in the sidebar, and the general revision of the Assistant Editor paradigm look like improvements that can build up significat savings in terms of time and concentration, day after day.

As I mentioned yesterday, I haven’t had the chance to actually play around with the SwiftUI canvas, so I still miss real world experience with the most groundbreaking new feature.

I also still have to look into the integration of Swift Packages management inside Xcode; on paper, it seems like a really good reason to start thinking to leave CocoaPods behind whenever possible.

One thing I’d like to immediate take advantage of, on the other hand, is the inline viewer for code changes inside the source editor: no more copy, paste & comment of a block of code before a massive refactor to keep the original code available at a glance.

Obviously, as with every new release, there’s much more to Xcode 11, but my first impression is that my favourite IDE got even better.


#wwdc2019: Siri Shortcuts awakes

🔗 June 4, 2019

As a lover of automation on the Mac who sometimes attempts timid experiments with Siri Shortcuts, yesterday was more than interesting.

For many, the “conversational part” (the possibility to add paramenters to the request and have Siri ask follow-up questions) is the most interesting news, because it will lead to a more natural experience; for me the game-changer is the introduction of automatic triggers that will allow to perform multi-steps shortcuts when something external / planned occurs.

The possibility are endless, because there are already lots of different triggers (specific time, arriving or leaving at a location, launching a specific app, changing the state of the device like enabling Wifi, etc…) and we can already imagine that more will follow:

  • When I leave home, send an SSH command to my computer to start running some operations, turn off the lights and enable DND on the phone;
  • Every Friday at 7 p.m. blast “The Final Countdown” at maximum volume and trigger an AppleScript via SSH to copy some files to a specific location;
  • When I launch Tweetbot after 10 p.m., automatically search Google for “productivity killers”;
  • If I enable Airplane mode, also lower the device volume; when I disable it, send a message to a family member to tell I’m back online.

I could go on forever on the most implausible automations… it’s so freaking cool that we will finally have access to all that power without the need to manually start any action.

For now I can only dream, though: Shortcuts comes preinstalled with iOS 13 but I don’t plan to rush with the new operating system on my phone, so I tried playing with automatic triggers in the Simulator, where they don’t seem to cause any actions yet.


#wwdc2019: SwiftUI

🔗 June 4, 2019

From a developer standpoint, there’s no luxury display or mythical computer that can rival the big surprise Apple reserved for us yesterday: SwiftUI.

The actual true star of the show is a declarative UI framework that before yesterday was only rumored, and not for this year; cherry on top, it actually debuts on all platforms (iOS, iPadOS, macOS and even watchOS).

I never actually looked into React or similar development tools, but I played a bit with Cocoa Bindings, so I can see why having the interface actually reflect changes in the data model, and viceversa, is a truly big deal; an even bigger deal was the speed it releaved in the demo: seeing very few lines of code produce an UI that updates in realtime is a big leap from the tedious Build and Run dance, and the inverse process of tweaking the UI in the canvas and have the changes inserted inside the code looked like magic. Better, it is magic.

My plan immediately became to stay up really late after the SOTU (which ended at around 1:30 a.m. my time) and play with it for a good part of the night, but sadly Xcode 11 does not show nor let you interact with the canvas unless you’re running macOS 10.15 (currently not very viable on, cough, computers that run macOS without actually coming from Cupertino).

So for now I can only follow along the amazing tutorials Apple published, and try to wrap my mind around the Combine framework, which I understand is the second part of the equation, but that I wait for smarter people to explain to me in a tutorial / video of some kind in the next few days.

Before the event a friend joked about changing the Swift syntax again, but actually Apple set the stage for an even bigger change on how we write code and how fast we can iterate, and I am very excited for the possibilities.


#wwdc2019: Mac Pro

🔗 June 4, 2019

In many ways, a “You asked for pro machines? Here’s your 🤬 pro machine!” silent statement (make your comparisons with that explicit “can’t innovate anymore my…” of yore), Apple now offers a true successor of the Power Mac / Mac Pro that erases all the mistakes made with the Trashcan introduced in 2013 and let languish until yesterday.

First, let me say I couldn’t have been more wrong about 👏 every 👏 single 👏 prediction 👏:

Starting at 4.499 $
ARM only, base model 16 cores
32GB ram - 1 TB storage
Apple-only GPU
Small tower
Ships in early 2020

I don’t mind, though, because the real product is something to behold.

I like the look of the case, even though the Cheese-grater was even cooler in my opinion (because it was more square), but what matters is that it is big, it will cool its components, and it is very much expandable and upgradeable.

It also costs like a car, and the base configuration (8 core Xeon, 256 Gb M.2 drive) is a bit underwhelming.

I disagree with the idea that pro desktops need to start at 5.000 $ (iMac Pro) or more (look, at least, at 8.000 $ for a better-speced Mac Pro in the real world) and are mostly used for producing video; my impression is also that the Apple tax is increasing steeply on some wrong use-cases assumptions, and that there is still space for a middle way between the Mac Mini and the new Pro.

Having said that, if you need something like this, you need it and it’s great they still make computers that push the limits… just a couple of years ago, it wasn’t really the case. Hoping for a true pro machine from Apple, not a powered-up iMac, was more about the statement it would give us about their actual commitment to the future of the Mac than anything else, so complaining about the price is actually beside the point: let it cost what it needs to cost for them to keep innovating, and just admire it without buying (at that price, not really a choice ;)… it’s basically a halo car, and the things they’ll learn here will improve other Macs in the future.


#wwdc2019: Pro Display XDR

🔗 June 4, 2019

I understand many will make fun of its price and especially of the fact that, out of the box, you can’t actually use a 5.000 Dollars monitor, but to me this was the funniest announcement.

A few days ago, I wrote:

The thing I’m most excited about Monday’s event is the monitor: so little changes in that space, basically the only innovations were the 30” 2560x1600 Cinema Display 14 years ago & the 27” 5120x2880 introduced in 5k 🖥 5 years ago. Apple is the only driver for innovation.

and:

Yes, I’ve seen those 21:9 monitors, but in 2019 non retina is not an option, and I find them ineffficient: the aspect ratio MS chose for the Surface Studio is much more suited to desktop application (ok, not Final Cut, but we’re not all video producers).

Apple delivered on all my hopes in a big, loud way:

  • 32 inches, 16:9 aspect-ratio (yay!)
  • 6016x3384 pixels (Retina: 218 ppi)
  • Full-P3, 1.000 nits sustainted in HDR (but peaks at 1.600) and 500 in SDR, amazing contrast (1,000,000:1) for an IPS LCD

All this comes with an unexpectedly high sticker price: $ 4.999 (more if you want the very futuristic matte option), plus $ 999 for an astonishingly beautiful stand that supports 90° rotation, or $ 199 for the Vesa mount. Why they didn’t include the Vesa mount in the box (which for a pro monitor would make absolutely sense to be the default) and avoid to be made fun of, I’ll never understand…

That’s a lot of money, certainly many, many times more than I could ever think to spend on a display, but it truly is pro (let’s get straight to it: for today’s Apple, pro mainly means video / photo editing; such an expensive monitor makes very little sense for Xcode) and it really moves the entire world of monitors forward. It’s also a statement I 100% agree with: you don’t need to go ultra-wide, this monitor adds around 17% more pixels in width and 5% more in eight compared to my 2006 Cinema Display 30”, and that just looks perfect to me.

One thing I don’t love: the inputs are not placed in an elegant way, and I find the “Pro Display XDR” name written on the back not very Apple-y:

This product brings at least a little closer a similar-resolution, aspect-ratio and size “consumer” display, maybe not from Apple, so - even though I’ll never be able to buy the Apple Cheesegrater Display - I am so happy it exists in the world.

And, now, speaking of unaffordable things… my next post.


#wwdc2019

🔗 June 4, 2019

My beloved 🤯 emoji pretty much sums up the beginning of WWDC week: yesterday’s Keynote and State of the Union contained so much, it’s not easy to unpack and process everything.

I’ve already tweeted some thoughts, mostly without snark, because I honestly believe Apple delivered an amazing series of announcements in a tightly-packed and completely fun to watch presentation, but the blog is a much better place for non-reactive comments and it will be entertaining - at least for me - to revisit this post in a few years, as I can now do with 2017’s.

Throughout the week I should be able to post my thoughts and impressions, so hopefully you’ll decide to stay tuned by subscribing via RSS.

Oh, while you’re here, I also have a great plan figured out that involves lots and lots of GlanceCam sales 🤑:


Jokes aside, here’s what I have posted so far for WWDC week; obviously I’ll keep the list updated:

Thanks for reading!


Siri, tell Alexa to connect my phone

🔗 May 24, 2019

I usually fall asleep listening to podcasts, which means that every night I have to tell the Echo Dot to connect to my phone via Bluetooth and ask Siri to resume playing Overcast while setting a sleep timer.

For a while now I have had the second part automated in Shortcuts, inside a night-time routine that involves other steps too, but a bug with the Echo forced me to ask twice for my phone to connect to the Echo, combining a futuristic automation on the phone with the actual human (me) forced to the following dance 👏every👏single👏night👏:

Me: “Alexa, connect my phone”

Alexa: Your phone is already connected

(it is not)

Me: “Alexa, connect my 🤬 phone!”

(the phone finally connects)

Yesterday, a miraculous over-the-air update to the Echo fixed this annoyance, and the phone now connects at first try.

The resulting joy motivated me to walk the final line and automate the Bluetooth connection with Shortcuts too… #thefuture

It wouldn’t make much sense to share the actual shortcut, because it is personalized with my apps and needs, but here are the steps, in case you want to make your ladies in the tubes talk to each other:

  1. Record yourself saying “Alexa, connect my phone”;
  2. Save the audio file into the Shortcuts folder in iCloud Drive;
  3. Edit your “Going to bed” shortcut to play the audio file outloud and then proceed with the podcast playback with a preconfigured sleep timer.

I also added the reverse “Alexa, disconnect my phone” recording to the morning routine shortcut for maximum laziness; about that, a warning: when the phone is actually connected, Alexa does not listen to herself speaking, so the shortcut includes a “disconnect Bluetooth -> wait 3 seconds -> reconnect Bluetooth” step before playing the disconnection audio file. Here’s a screenshot:


Amelie's Approved Cat Games

🔗 May 19, 2019

My sister’s cat Amelie has always been very much into YouTube cat games (yes, they are a thing), so I accepted a recent suggestion to make some games for her.

Since this is a rainy weekend, that has quickly escalated to a new YouTube channel: Amelie’s Approved Cat Games.

Third video’s uploading now, but please don’t judge them with human standards: just place your feline friend in front of a big screen, and if they enjoy it, than mission accomplished!


Snapthread 2.0

🔗 May 15, 2019

A couple of days ago Snapthread, my go-to app for sharing short video montages, has been updated to version 2.0.

As described on its new website, “Snapthread is a simple, casual video editor and slideshow maker for iOS that works with videos, still images, and Live Photos.”

Version 2.0 is a solid update that brings an easier flow for editing, lots of new functionality including filters and bounce effects, a greatly polished UI and an iPad version that takes full advantage of the device’s big canvas.

I’ve been using the new version in beta for a while, and it’s rock solid, so I can’t recommend Snapthread enough for stitching together multiple videos and photos – still and Live – and sharing them on social media or with friends.

You should absolutely check it out: Snapthread is free to download, has a stellar 4.4 reviews average on the App Store and offers a generous 30 seconds limit for export, with a discrete watermark, but I recommend to go straight for the one-time purchase, conveniently priced at $ 5.99, to unlock Snapthread Premium forever, removing any limitation and supporting the development of an indispensable indie app!


A couple of Keyboard Maestro macros

🔗 May 15, 2019

I’ve had a bit of fun with Keyboard Maestro today; I posted two new macros on the excellent KM forum, but seems only appropriate to link to them here on the blog too:

  1. The first macro starts the local Jekyll server and open my localhost website in Safari and is great because my mind treats bundle exec jekyll serve like a random sequence, inverting the order of the words every time I type them.

  2. The second one opens all the App Store Connect sections I visit every day in separate tabs, setting the date to the previous day as I used to do manually 👏 every 👏 single 👏 day 👏.

Hope these automation examples are useful / inspiring!


Post to Slack from Terminal using slack-cli

🔗 May 7, 2019

Since I haven’t posted in a while, I decided to share a nice utility I discovered today; as usual, this is not a tutorial, but you’ll be able to follow along and fill in the gaps.

At work, I wanted the ability to send documents to a specific Slack channel, so that multiple people can see them in an unobtrusive way (email would be too much for these low-priority docs). I was also looking to create a highly-automated process, ideally scanning each document from an office copier, sending it “somewhere” from there and having it magically appear in Slack; this would be possible for a paid Slack plan using this email Slack app, but we’re on the free tier and can’t use that.

The solution was slack-cli and I have to say it was both pretty convenient and fun to set up:

  1. Create a custom bot for Slack and save its API key for later; no need to configure hooks or anything else, just type a name, pick an icon and add an optional description.

  2. Add the new bot to the Slack channel where you want it to post.

  3. Install slack-cli via brew as described in the instructions on GitHub; please consider that you’ll have to quit and re-enter Terminal after installation, before initializing it.

  4. Execute the Terminal command ‘slack init’ and paste the bot API key.

  5. Almost there! Try the bot, both sending a message and uploading a file:

slack chat send ‘Hello from Terminal’ –channel ‘#mychannel’

slack file upload /Users/myuser/Desktop/file.pdf ‘#mychannel’ –comment ‘File uploaded from Terminal’ –title ‘FYI, this is the file for today’

Finally, apply some magic with Apple Script or with your automation app of choice: retrieve each email sent from the office copier, temporarily save the attachment and post it to Slack using slack-cli; we’re doing this using our 4D database, so I can’t post the actual steps for that because they are very much custom-tailored to our environment.

Hope this helps someone else along the way!


🎂 GlanceCam is one year old! 🎂

🔗 March 29, 2019

One year ago today GlanceCam debuted in the Mac App Store, after just 3 weeks of very intense development at the most improbable hours (I have a day job, so most of my coding has to happen very, very early in the morning).

As I wrote back then, my second Mac app saw the light out of laziness:

…one day I found myself alone at the office and I had to get up from my chair a bazillion times, like an animal, to open the front gate. So, the most “straightforward” thing to do was to get ourselves a nice IP camera and an ethernet relay, and make them work together in a well made macOS app, so that we can keep a small window showing the gate video stream on our desktops, and open to visitors with just one clic.

I honestly did not expect many people to be interested in such a niche app, and by all means GlanceCam’s audience has not been large, but surprisingly (at least to me), there are Users out there who are looking for a well made, native Mac camera viewer: since the beginning and with no marketing on my part (I know, I know… more on this later), a few people have been buying the app almost every day and, from the feedback I receive via email, the occasional in-app tip and the reviews, they are very happy to have found an app that really solves a problem they had:

“The perfect app for keeping an eye on a webcam”

“Very nice app, works flawlessly and exelent and very quick support if needed!!”

“Finally, A Cam Viewer that Works!”

“no more stupid web interface”

“Great app and great support!”

That enthusiasm translates into a 4.0 stars overall average from 45 ratings in the App Store, and 4.2 stars in the US store. Not bad 😜 for an app that, in order to be useful, requires you to know the specific custom string and credentials to access the video stream of your camera!

I think Users particurarly appreciate that, with 16 updates so far, GlanceCam has steadily became more capable: soon after launch it got extended support for keyboard shortcuts and for audio playback, added the ability to save snapshot images and introduced multi-cameras and multi-actions in version 2.0; it then gained support for full screen, including side-by-side with other apps, and insta-zoom. Recently I added compatibility to RTMP in addition to the original HTTP(s) and RTSP protocols and implemented touch gestures to navigate between cameras. Just a couple of days ago version 2.7 added TouchBar support and an URL scheme, and in the meantime I have also implemented native Apple Script support, which will come soon in the next release.

All this while improving stability and performances… the usual “bug fixes and improvements” you read in every release note. My favourite is from version 2.1 🙃:

GlanceCam took the “always on top” preference a little too literally, and stayed actually on top of everything, including the screensaver…

One year later, I am more excited than ever to be working on GlanceCam and I have an extensive list of features I want to add. The main priority going forward, both for my direct use of the app and from Users’ requests, is my personal Moby Dick 🐳: concurrent multi-camera support (either in a single window with grid/list or with multiple windows… currently you can view one camera at a time, which is fine but not what I envisioned when I started developing the app); I think I spent at least 150 hours on multi-cameras so far, and still haven’t found a way to keep the app perfectly stable because of an OpenGL bug that seems to be outside of my control (in Mojave Apple deprecated OpenGL) and that causes a lock when more than one video stream is overlayed with buttons. Nevertheless, this will be the landmark feature of GlanceCam 3.0 and I will get it to work, I simply can’t announce a launch date yet… After that, there are other nice things I’d like to add: if possible, Onvif support for camera discovery, maybe PTZ control, certainly the ability to loop through cameras, and someday the option to coalesce the HTTP GET commands from different computers (so that, when 2 people on the same network clic to open a gate, only the first command is sent).

For this to happen, the development needs to become a bit more sustainable (i.e. more Users, or a price higher that $ 2.99 before the Apple cut… I think the app would really deserve a more “niche, pro app with personalized human support” price, but I am afraid to kill growth and then become disenchanted by a lower number of downloads), and some marketing will be needed. I know I should have done something on that front already, but unlike iOS, there aren’t that many Mac software review sites I can contact for an app that serves an oddly specific need.

I guess we will see what the future holds for GlanceCam, in the meantime happy birthday 🎂 little app always sitting in a corner of my screen!


GlanceCam 2.7 coming soon

🔗 March 27, 2019

I am very excited about the new features in GlanceCam 2.7:

  • The toolbar in the upper-right corner now includes a couple of additional buttons: the first to toggle audio on and off (if the camera supports it) and the other to reload the video stream if, for any reason like a lost network connection, the playback would freeze.

  • The lucky owners of a MacBook with TouchBar can now change cameras and control the app directly from their 2170x60 magic strip.

  • GlanceCam now has an URL scheme that allows to switch camera from outside the app! Any custom application or AppleScript can call the glancecam://?camera=17 URL and switch to that video stream; just replace “17” in the example URL with the camera number you want to switch to (as listed, counting from 1, in the app Preferences). A couple of additional informations for nerds: if the camera number is out of range or the URL string is incorrect, the switch operation fails “silently” to avoid interrupting the video stream and, for now and pending additional improvements, you can only switch to a different camera if GlanceCam was already running.

GlanceCam 2.7 is currently in review by Apple and will be available as a free update in the next couple of days (or so).


GlanceCam compatibility with OC835-ADT cameras

🔗 March 25, 2019

So, there’s only little chance that this post will be seen by the person requesting informations about it, but since I have no email to reply to it’s worth a try…

mindy_support_request.jpg

Mindy, I believe there is a good chance your OC835-ADT camera will be compatible with GlanceCam using a string like the following: http://USER:PASSWORD@IP_ADDRESS/img/video.mjpeg

If, by any chance, it would prove not be compatible, then I will be able to point you in the right direction to get a refund from Apple. I am sorry I can’t give you 100% confirmation, but every camera model and manufacturer does things a little different, and the only certain way to know is to try.

I’m here if you need any further informations… thank you for your interest in GlanceCam!


GlanceCam 2.6.1

🔗 March 5, 2019

GlanceCam 2.6.1 automatically stops playback just before your Mac goes to sleep, and resumes it immediately after the system wakes up.

This helps stabilize the behavior of some camera models with the new continuous playback (an option to never pause the stream when the app is minimized or the screen is locked) introduced in GlanceCam 2.6: occasionally I did experience an issue after the Mac woke from sleep and the video stream stayed frozen for a few seconds (or, in rare cases, did not resume at all). Now the system’s sleep/wake cycle determines the stream to be properly stopped and resumed, avoiding freezes of any kind.

GlanceCam 2.6.1 is now available as a free update.


GlanceCam 2.6

🔗 February 28, 2019

GlanceCam 2.6 is now available as a free update.

This version introduces a couple of features requested by Users; being special behaviors, both are off by default and can be manually enabled in the app Preferences.

  • Swipe left/right (with 2 fingers on trackpads or 1 finger on a Magic Mouse) to switch to the previous / next camera.

  • By default, GlanceCam pauses playback when the screen is locked (i.e. the screensaver is running) or the app is minimized, but you can now enable continuous playback and never pause video/audio playback; if you enable this feature, on some camera models it might take a while before playback resumes when you wake your Mac from sleep (if you experience delays longer than 15 seconds after waking up your computer, would you please let me know?).

If you need help with anything, please get in touch at support@cdf1982.com and, if you have time, I would be incredibly grateful if you’d leave a review.


App updates and a freebie!

🔗 January 23, 2019

I like that this January I am being able to spend a little more time in Xcode than my usual, but I should probably apologize because all my posts are product announcements… I promise the next time you’ll read me I will cover more entertaining topics!

First, an announcement: starting tomorrow and for a week only, one of my first apps, Always There, will be completely free to download. The app allows you to put a special photo in Notification Center, both on iPhone and iPad, and is perfectly useful even with the latest Apple devices. Always There usually costs $ 1.99 (it’s my only iOS app paid upfront), but I’m trying to understand if there’s potentially a wider market with a different business model: I have ideas for new features, but I need to understand if spending a significant amount of time on them makes at least some sense. If you’re curious, tomorrow check Always There out and tell your friends about it!

And now, the app updates…

A few days ago Apple approved GlanceCam 2.5, with support for the RTMP protocol. I can hear you scream “booooring”, but it’s a useful compatibility update if your camera didn’t support RTSP or HTTP for streaming.

Tonight I also submitted an update for Walk More, my free iOS pedometer. I wasn’t expecting to update it so soon, but a few bugs emerged and I had to fix them right away:

  • Steps, distance and floors are again centered vertically near each bar.
  • If you ever saw days’ labels duplicated on the Y axis of the graph, rejoice: everything is back to normal.
  • Sometimes the widget crashed and showed no progress in Notification Center; now it works perfectly.

Hopefully the approval process will go smoothly and in a couple of days tops version 1.4 will be available for download.

Thanks for reading!


GlanceCam 2.4.4

🔗 January 12, 2019

Apple just approved a new update of GlanceCam; here’s what is improved in version 2.4.4:

  • Insta-zoom (the feature introduced in version 2.4 that allows you to clic and hold the right mouse button to temporarily zoom the view) works better with high-resolution streams because now the zoomed window can never resize more than the actual screen size.
  • When GlanceCam was not active, the “Save snapshot” floppy and the always on top “Eye” icons were a bit pale; now they are more defined and look better.


App updates: Walk More 1.3 and GlanceCam 2.4.2

🔗 January 7, 2019

Apple has approved a couple of app updates to help me kick off the new year in a good way.

Walk More, my iOS pedometer, got some developer love and now supports iPhone XS / XS Max screen resolutions; I also fixed a couple of bugs that sometimes affected the charts’ labels.
Walk More is now even more polished and pleasant to use and, while I’d still like to add an Apple Watch component sometimes in 2019, for the time being this update makes the app really solid for most users, who only carry their iPhone with them and don’t wear a Watch.
Walk More is still free, and is great if you’ve never used a pedometer or know someone who made a new year’s resolution to be more active, so check it out!

GlanceCam has been updated with a few minor bug fixes and the addition of its Privacy Policy to the Support menu.

I am so thankful for some of the reviews GlanceCam is getting and I found them very motivating to keep improving it:

  • “Finally, A Cam Viewer that Works!”
  • “I use GlanceCam pretty much all day”
  • “This app makes viewing all of my cameras possible from one interface and I LOVE THAT”
  • “Remarkable and instant support”

Hopefully, in January I’ll be able to ship something more, but don’t want to jinx it.


Mojave Quick Actions

🔗 January 3, 2019

I must admit that, when macOS 10.14 Mojave was announced last June, I quickly dismissed the new Finder’s Quick Actions as a gimmick, and never looked back. Then this week a couple of things made me revisit my superficial dismissal of this new automation feature and proved me wrong.

I was looking for a way to quickly move files from the Downloads ƒ to other frequent destinations and I was almost ready to try Power Menu for Finder, but the lack of a trial was a bit of a bummer. Then I took advantage of the embedded “Rotate image” action a couple of times and immediately realized that I could try that route to automate some files operations, and I’m here to testify that it is both very effective and incredibly easy to implement.

These “shortcuts” are made in Automator, simply by opening it and selecting to create a new Quick Action: mojave_quick_actions_1.png (Sorry for the screenshots in Italian instead of English, but I thought the arrows would be enough to point you in the right direction without having to reboot my Mac to change language…)

Then you select some conditions for when the action should appear in Finder and build the workflow according to your needs. Here’s one I made for moving video files to my NAS; the notification is there because the copy operation happens without triggering the usual copy/move window and I wanted some kind of feedback: mojave_quick_actions_2.png

After saving the action in Automator, it appears in Finder; the cool thing is that the action is only shown when appropriate (meaning, when the file type matches what you did set in Automator), so you can have specific Quick Actions for different kind of files: mojave_quick_actions_3.png

I already made multiple actions for other operations, like retrieving subtitles for video files, and I’m very happy with this addition to Finder, so if you also didn’t look at it twice in September, maybe take another look at it.

The only thing I hope Apple will improve in future releases is the number of concurrent actions shown in Finder, currently two plus a more button that groups the others. I’d love to be able to see more actions when I enlarge the pane.


Link: I've Coded 365 Days Straight and Here's What I've Learned

🔗 January 2, 2019

If you build it, they will come.

Well, not they, but it. The drive to want to code increased with everyday I coded.

I don’t link to other blogs often, but this post by @BekahHW really means something to me.

I absolutely can’t say that I’ve coded every day in 2018, and I’m not sure I‘ll be able to do it this year either, but it’s absolutely true for me: the more I write code, the more I want to immerse myself in Xcode the next day.


Best of 2018

🔗 December 28, 2018

For the last few years, I’ve made an habit of writing a short list of the best things I’ve experienced in the last 12 months.

This is something I write mostly for myself, to be able to revisit these posts (and, previously, tweets) in the future and maybe rediscover contents I enjoyed, but hopefully something I liked so much to be listed here will be enjoyable to whomever reads my blog too. Yes, the three of you ;)

For 2018, I’m mostly keeping the same categories of 2017; choosing podcasts was extremely easy, as it’s the media I consumed the most. I’ve watched very little TV and read an embarrassing low number of books, so those categories were a bit harder, but I can live with my picks.

Best song: Head Above Water by Avril Lavigne; I also love the colors of the video.

Best album: A Star Is Born Soundtrack, and I haven’t seen the movie yet.

Best book: after loving the movie, I finally got around reading Wild by Cheryl Strayed and it was even better. A part of me would love to walk the PCT sometimes during this life, but another part is sorely aware that it would also probably be the last thing happening in said life 👻…

Best movie: Funny coincidence, I have an ex aequo and both movie star the same actress, Jessica Chastain, who I previously didn’t even know: Miss Sloane and Molly’s Game.

Best TV show: I think this year has been pretty terrible for TV shows, and actually the best thing I’ve watched, and the one I feel the most to recommend, is from 2008… John Adams was truly a revelation and you should not miss it.

Best podcast: I’m going with an obscure choice here 😝… Serial’s season 3 was very, very good and I don’t care if it’s everyone’s favorite of the year; if you, like me, didn’t love the first two seasons, give this one a chance, end especially to episode 2 and episode 8.

Best tech podcast: I am an admirer of Brent Simmons and The Omni Group makes my favorite app (see the Mac app category below), so it’s not a surprise that the short interviews to Omni people by Brent in The Omni Show were really enjoyable to me; I recommend 3 episodes to start, if you never listened to it: Tami Snyder’s interview, How we built OmniFocus for the web and Tim Wood’s interview.

Best investigative reporting podcast: Serial would obviously fit here too, and this was a competitive category with both In The Dark’s season 2 and Bundyville being really interesting, but I found Bag Man the most surprising, because I didn’t know anything about Spiro Agnew’s uncanny story.

Best news article I read: The Patrician President and the Reporterette: A Screwball Story. I miss the times when Americans chose great human beings for the higher office in their land and, therefore, in the world.

Best Mac app: OmniFocus 3 is an obvious winner for me: my day starts and ends in OmniFocus, and all the work that happens in between is mostly organized there; this new version with Tags and Dark Mode really makes me happy every day. I also have a runner up: Xcode 10 is an amazing IDE and I love it, every year it gets better and is a pleasure to use!

Best iOS app: Another competitive category… my most used app is by far Overcast, and I am positively impressed by Working Copy, that I started using a few weeks ago, but I have to give the award to Shortcuts: Apple showed us a compelling version of the automation future and, while I haven’t used it much so far and I don’t see replace the automations I have running on my Mac, the app is so well executed and promising that deserves the first spot.

Best videogame: I have played almost zero videogames during most of the year, but in the first few months I remember I was still enjoying Super Mario Odissey, so yes, I’m picking the same game for two years in a row… but there’s a good chance that, if I had more time to play with it, this year’s best game would have been Ori and the Blind Forest: the intro I’m linking to is a masterpiece and almost made me tear up, and I really want to play it in 2019.

Best video: This category had an oddly specific name in the previous years, “Most moving TV moment”, so I’m renaming and expanding it’s purpose… but it’s still pretty hard to pick just one thing with all the content, fun, serious and useful, that’s available online. I’m choosing something inspirational, since we’re starting a new year: Simone Giertz’s TED Talk Why you should make useless things

And these are my choices for 2018, a year that honestly I won’t miss. Let’s all have an amazing new year instead!


Website milestone

🔗 December 17, 2018

I feel like today this website reached a milestone: finally, all product pages are online, albeit some descriptions could be improved and I could add more screenshots of the apps.

Jekyll is proving a really good engine, very easy to extend, and I really love the theme I chose (though I still need to figure out how to change the CSS for a specific product page); working with markdown files and Git for version control is a blessing in flexibility and is truly making me want to post more.

I hope you like my website too, and please let me know if you find anything that’s broken (I’m not aware of bugs, but that never stopped them from existing).


AppleScript for DarkSky weather forecast

🔗 December 12, 2018

For a while now, me and my sister wanted to make an habit of a Thursday walk with my 🐺. Trying to actually remember it with our brains would have been enough, or we could have made an appointment in a shared calendar. Instead, I had fun assembling the following AppleScript, a.k.a. the nerdiest solution to a non-existing problem ever; I awarded myself bonus points for scheduling a cron job to run it every Thursday morning.

I’ll let the actual script, with a few comments, explain itself. Please be advised that I’m no AppleScript expert and I recognize that this script could be written better (the variable names are unusually bad for my standards), but it works and it’s enough for such a toy.

# Get local weather forecast from DarkSky for Thursday, send a local notification and an iMessage.

# This script requires JSON Helper, the most amazing app ever, that let you access JSON directly from AppleScript; it's free,  more details and download link here: http://www.mousedown.net/mouseware/JSONHelper.html
# The weather-fetching portion of this script is heavily based (read copied) on this gist: https://gist.github.com/Pe8er/a37729b8fd55a7fd5f9674103659827a
# The DarkSky API, also required for this to work, is pretty straightforward, but here's a link to the documentation: https://darksky.net/dev/docs; you can access this API for free with a limit of 1.000 calls per day, more than enough for this kind of use.


set APIKey to "YOUR_API" # Replace with your DarkSky API key


# 1. I want to know if today is Thursday, and if it's not, I want the date for the next Thursday.

set nextThursday to current date

if nextThursday's weekday is Thursday then set nextThursday to nextThursday

repeat until nextThursday's weekday is Thursday
	set nextThursday to nextThursday + days
end repeat

set {year:nextThursdaysYear, month:nextThursdaysMonth, day:nextThursdaysDay} to nextThursday

set forecastDate to (nextThursdaysYear as string) & "-" & nextThursdaysMonth * 1 & "-" & nextThursdaysDay & "-13-30-00" # I'm fine hardcoding the time, YMMV

set dateString to ((nextThursdaysDay as string) & "-" & nextThursdaysMonth * 1 & "-" & nextThursdaysYear & " 13:30:00")
set theDate to date (dateString)
set aDateObject to theDate

# 2. I prefer to feed the date to DarkSky API in Unix format (seconds since January 1st, 1970); for this to happen, a very odd thing is necessary: we need to convert it to another format and then to string to get rid of the exponential notation introduced by AppleScript. Trust me on this, it works.

set unixSecsExponential to aDateObject - (time to GMT) - (date "giovedì 1 gennaio 1970 00:00:00") # Adjust according to your locale.

set conversionString to unixSecsExponential as inches

set unixDate to conversionString as string

# 3. Now, let's fetch the forecast
tell application "JSON Helper"
	try
		set latLonDate to "YOUR_LATITUDE,YOUR_LONGITUDE," & unixDate # Replace with your location; you can fetch the latitude and longitude with https://www.latlong.net/; beware of the commas.
		set weather to fetch JSON from "https://api.darksky.net/forecast/" & APIKey & "/" & latLonDate & "?exclude=minutely,hourly,daily,alerts,flags&units=ca" # See documentations for the parameters.
	on error e
		return e
	end try
	
	try
		set temperature to temperature of currently of weather
		set weatherStatus to icon of currently of weather
		set summary to summary of currently of weather
	on error
		return "¯\\_(ツ)_/¯"
	end try
end tell

# 4. Emojis, just because

if weatherStatus is equal to "clear-day" then
	set myIcon to "☀️"
else if weatherStatus is equal to "clear-night" then
	set myIcon to "🌙"
else if weatherStatus is equal to "partly-cloudy-day" then
	set myIcon to "🌤"
else if weatherStatus is equal to "partly-cloudy-night" then
	set myIcon to "☁️🌙"
else if weatherStatus is equal to "cloudy" then
	set myIcon to "☁️"
else if weatherStatus is equal to "rain" then
	set myIcon to "🌧"
else if weatherStatus is equal to "sleet" then
	set myIcon to "⛈"
else if weatherStatus is equal to "fog" then
	set myIcon to "🌫️"
else if weatherStatus is equal to "wind" then
	set myIcon to "🌀"
else if weatherStatus is equal to "snow" then
	set myIcon to "❄️"
else
	set myIcon to weatherStatus
end if

# 5. Prepare a string with the received forecast

set weatherMessage to "Forecast for " & theDate & ": " & myIcon & ", " & (round (temperature)) & "° C"

# 6. If the weather is bad, nothing happens; if it's good enough, a local notification is triggered and an iMessage is sent to the specified contact.

if weatherStatus is equal to "rain" or weatherStatus is equal to "snow" then
	return "Sad wolf today... " & weatherMessage
else
	set messageForFriend to weatherMessage & ". Let's walk the 🐺?"
	display notification messageForFriend sound name "Purr"
	tell application "Messages" to send messageForFriend to buddy "YOUR_BUDDY@icloud.com" of (service 1 whose service type is iMessage) # Replace with the iMessage account for the recipient.
end if


GlanceCam 2.4.1

🔗 December 11, 2018

No matter how much you test a feature, bugs find a way to sail off and keep company to your code when you ship…

GlanceCam 2.4.1 has just been approved and fixes a bug that occasionally prevented the app to enter fullscreen mode and to appear in Exposè; it happened only when visibility in all Spaces was enabled, and it turns out I didn’t test those cases well enough. Sorry!

This is a good occasion to remind you that GlanceCam has a lot of convenience features and shortcuts:

  • You can double-clic anywhere inside the camera view to enter and exit fullscreen mode (and GlanceCam is a good Mac citizen at that, properly supporting split view);
  • Holding the right mouse button down zooms the window temporarly;
  • Pressing + o - changes camera, as does the Space key… and if you already know the camera number, you can access it directly with the number keys 1 through 9;
  • CMD + 0 resizes the window at 50%, CMD + 1 at 100% and, guess what, CMD + 2 at 200%;
  • CMD + S saves a snapshot to your Pictures folder and CMD + Y toggles the “Always on top” option that keeps the app floating above all others and visible in every Space.


wePads

🔗 December 4, 2018

I almost missed a post about an issue I wanted to write about again for a very long time, and now I am glad I haven’t because Dan Moren did (obviously) a much better job!

“What the iPad needs in this case is nothing less than separate accounts, linked to separate Apple IDs and iCloud accounts, providing access to each user’s individual settings, apps, and media. Each user has a separate passcode to log in to their account or, better yet, on the new iPad Pro, it simply recognizes who you are via Face ID.”

This is so true. Everybody understands Apple earns more money from selling a gizmo to every person in a household, but our favorite fruit company has never been one to deliberately compromise user experience for money; knowing that many devices, especially iPads, are shared between family members and ignoring the fact that these users are unable to access a customized Springboard, settings and iCloud data to me is nothing short of articially worsening their experience to push sales, and that’s not the Apple I love. On top of that, I believe many base storage iPads currently sold would be iPad Pros (or at lease regular iPads with larger capacity) if the device would provide full value to more users.

But these are only my opinions, and I recommend you to read “The iPad, HomePod, and Apple TV need multi-user support. Here’s why” over on Macworld for a more complete analysis.


GlanceCam 2.4 with insta-zoom + Privacy Policy

🔗 November 30, 2018

I finally got around adding a small but very useful GlanceCam feature that I always wanted for myself 😃.

Version 2.4, currently waiting for review from Apple, is great if you usually keep a small GlanceCam window in a corner of your screen to keep an eye on a camera: you can now right-click and hold down the mouse button anywhere inside the window to temporarily zoom the camera at 2x of the natural size; when you release the mouse key, the window will return to its original size and position.

No animations, no manual resizing or keyboard shortcuts necessary: just an additional, quick way to get the most out of your cameras directly from your mouse and without interrupting your workflow.

Keep an eye to the App Store to download GlanceCam 2.4 while it’s fresh out of the oven!

I also formalized GlanceCam’s Privacy Policy, so you can have absolute peace of mind about your data.


Getting started with PHP and TCPDF

🔗 November 29, 2018

For years I wondered how PHP scripts actually worked and yesterday I found out that it’s not too hard to start playing with them, as often is the case in this lucky age we live in… most answers are just a Google search away and things are only hard until we actually look at them with purpose.

First, my use case: generate PDF files in code with TCPDF. TCPDF is a well established library, with no dependencies, but it’s actually been discontinued in favor of a new version; for my needs, this mature product is fine and it’s with it that I made the experiments I describe here.

A quick way to get something running in just a few minutes is to download TCPDF from Github, extract it to a folder and open Terminal in that location; then we launch the local PHP server with just a command:

php -S localhost:8000

Now, before we can actually generate a PDF, we need to pick one of the samples from the library ‘examples’ sub folder, open it with a text editor and change the import statement to:

require_once(‘../tcpdf.php’);

Last, we load that script in Safari, pointing at a URL structured like the following:

http://localhost:8000/examples/the_example_you_chose_and_edited.php

Boom, if everything went smoothly (this post is not a real tutorial, so you might need to figure out some things yourself), that local server running in Terminal is serving you a PDF document generated from the script.

From this starting point, a lot of experimenting can follow; for instance, changing the output statement in the script to the following will save the PDF file directly to disk (you probably need to change the permissions of the folder to r/w for everyone in order to make this test work):

$pdf->Output(“test.pdf”, “F”);

If you’re interested and got this far, both the documentation and StackOverflow will help you achieve anything you desire with this library; myself, I’m happy to finally be able to look at a PHP script with at least an idea about how to run it.

One last note: obviously, you won’t usually run something like this from the php local server in Terminal… I instead use the Apache webserver that ships with macOS, also a pretty easy thing to start to play with, provided that you need to manually launch it after enabling PHP in its httpd configuration file, but that’s a post for another day.


Another tool in my belt

🔗 November 19, 2018

Today I was asked for a way, maybe a small custom iOS app with bonus points if it had a CarPlay extension, to occasionally retrieve an audio file via HTTP and play it in the car. The path for the file is known and remains the same, but the file name changes every day and it corresponds to the date in yyyyMMdd format. No need to archive the file for posterity or retrieve previous days, the goal was just a quick way to fetch this MP3 and treat it like a podcast while being on the move.

Since I remembered CarPlay apps being limited by Apple to specific use cases, I immediately gave up the bonus points and focused on the quickest way to achieve the goal. I should also confess I’m trying to reduce the number of new apps I work on concurrently, so I wasn’t excited by the prospect of opening Xcode for this…

The next idea involved a cron job, Apple Script and iTunes, plus the existing Apple Music subscription of the person requesting my suggestion: I began imagining to write a script, schedule it for running every day and either add the file as a song to iTunes and have it uploaded to the Music library in the cloud or copy the file to iCloud to play it directly from the Files app when needed. Maybe Overcast Premium could have been a part for this and resurrect the CarPlay part, but it seemed overly complicated: I was thinking of repeating an operation every day on a different device for just an occasional need.

Then I thought of Shortcuts, and boy it was easy, effective and elegant to achieve a functional solution with it!

I actually made two alternatives, spending less than 10 minutes total: one saves the file to iCloud and the other opens it directly in VLC, where playback starts automatically. Both have 3 steps and a variable to format the date, and couldn’t be simpler.

Every time I have the chance to use it, Siri Shortcuts stands out as an amazing tool for automation, with great flexibility and an outstanding approachability. It truly deserves a spot in my tool belt, and you should think of it more often too!

P.S. In the ongoing effort to add tools to my belt, I should point out that this post has been written, committed and published using only an iPad and an iPhone. This includes the screenshots placed in the device frames, made using this Shortcut made by Viticci that is pure witchcraft.

P.P.S. The more I work on an iPad, the more I believe the worst limit to productivity here is not iOS, it is the Smart Keyboard not having backlighting and switching between locales by accidentally pressing the dedicated button… but this is a post for another day.


New RSS feed

🔗 November 12, 2018

Squarespace gave me a parting gift: I have no idea how to adopt the same format I had there for the RSS feed.

So, it’s time to move on: my new RSS feed is online at cdf1982.com/feed.xml.

I apologize for the inconvenience, and hope you’ll take the time to subscribe and keep reading my occasional updates and ramblings.


New website (still under construction)

🔗 November 11, 2018

This is a post I should have written about two months ago, and I kept postponing because life, work, Xcode and Milla…

As you might have noticed, this website has looked a bit different for a while now, the reason being I decided to stop spending too much money on Squarespace, and went with a GitHub + Jekyll free solution I’m liking a lot (thanks for the inspiration, Rob!). I especially love the theme I picked, Forty by HTML5 converted for Jekyll by Andrew Banchich, because the home page now looks like a showcase for all my apps.

From a technical standpoint, the nicest thing about this change is the ability to write a markdown post on any device, commit it and have it appear on this blog. My hope is to write a bit more, and I must admit it is pretty nice to seat here on the couch, near the fire, typing on the first gen Smart Keyboard I never get to use; I still need to figure out my software setup (currently Drafts 4 saving to Dropbox), though, and inexpensive writing apps / GIT clients suggestions are very much appreciated!

As for the contents, I have to review and publish the product pages for most of my apps, so there’s still work to do, but putting a revised website online for two months without spending a word about it felt weird… I hope to remove all the ‘under construction’ placeholders immediately after the release of a new app I’m working on, PhotosUpload. More details about that ASAP but, shocker, be advised it’s a niche product…

There’s also a relatively bad thing I have to write about: in the migration, I broke the RSS feed and haven’t found the time to repair it yet, so probably I’m writing this just for myself. There’s actually a chance that the RSS URL will change, so I risk losing the few subscribers I had and write everything just for myself going forward.

Please, let me know if you notice anything not working and, if you don’t hate the content, please keep an eye open for new posts until I restore the RSS feed. Thank you!


GlanceCam 2.3 coming soon

🔗 October 3, 2018

GlanceCam 2.3, submitted today to the Mac App Store for review and hopefully available for download in the next few days, will contain some features requested by its Users:

  • GlanceCam now supports full screen mode (including side-by-side full screen with other apps); you can enter this mode by double clicking anywhere inside the app window, or with the usual green button in the upper left corner of the title bar. If you just want to maximize GlanceCam without going full screen (the previous behavior), press the ALT key while clicking the green button.

  • The Next and Previous camera actions introduced in the last update are now available also by right-clicking GlanceCam’s icon in the Dock.

  • GlanceCam pop-up list of cameras (present only when multiple webcams are configured) can now be moved to the upper left corner or at the top center of the window; that’s useful if your camera places informations like time or its name in the upper right corner, where the pop-up list used to be (and, by default, still is). You can choose your favorite position from the app Preferences.

I always appreciate Users’ feedback, and I think the features suggested recently and implemented with this update really helped improve GlanceCam in everyday use. If you agree and the app is useful to you too, please consider leaving a 5 star review and, maybe, sending a tip (you can do so from the app Preferences). Thanks!


GlanceCam 2.2 launched today

🔗 September 29, 2018

GlanceCam 2.2 has just been released!

This is a minor update that:

  • Fixes little visual glitches with Mojave: now GlanceCam, which has always had a cool dark interface, looks and works great with the latest macOS.

  • Introduces useful keyboard shortcuts to switch between cameras: just press + or the spacebar to show the next camera and, you won’t believe it, the - key to return to the previous one.

Multi-camera support (meaning, multiple cameras shown at the same time in a single window) is proving a harder task than expected, and lately I haven’t been able to work on that as much as I would have liked to, but it’s still coming…


GlanceCam 2.1

🔗 May 17, 2018

GlanceCam just introduced multi-cameras and multi-actions support in version 2.0, but there’s already something new and improved for you in the 2.1 release already available in the App Store:

  • Tooltips everywhere! If you’re not sure about a button or a field, just hover your mouse and a helpful suggestion will appear.
  • When you resize the window with a keyboard shortcut (CMD + 0, CMD +1 or CMD + 2) and the new size extends outside the screen, the resized window will bounce back to be fully visible.
  • Sometimes, GlanceCam took the “always on top” preference a little too literally, and stayed actually on top of everything, including the screensaver; now that bug has been fixed.
  • Another bug fix: in Preferences, when you added a new camera, the tabulation between textfields didn’t behave properly; now everything works as expected. I’m trying to make GlanceCam the best IP camera viewer possible, and Users’ support helps a lot; if you can, please show your love with a review on the App Store or by leaving a nice tip inside GlanceCam’s Preferences. Thank you!


🚀 GlanceCam 2.0 - the multi-cameras edition

🔗 May 8, 2018

About a month ago, I shared the plan for the future of GlanceCam, my macOS app that lets you keep an eye on a webcam and optionally perform custom actions via HTTP(s) requests.

The most significant step towards that future is here today: GlanceCam 2.0, available today on the Mac App Store as a free update for existing Users (and still very low priced for new Customers at only $ 2.99), introduces multi-cameras and multi-actions support!

I’m very excited for this feature-rich release:

You can now add as many webcams as you like (Settings > Add camera). The amount of actions you can perform for every camera is doubled: you can add up to 2 buttons with separate custom actions to every webcam. You can view one webcam at a time and switch between them with a popup button, by pressing the number keys (1, 2, etc…), and by selecting the camera name from the Dock icon or the Glance menu. From the menu bar and the Dock icon, you are also able to invoke actions for a camera that’s currently not displayed. On top of that, a few bugs have been squashed. I’m trying to make GlanceCam the best IP camera viewer possible, and Users’ support helps a lot; if you can, please tell your techie friends download it, and if you’re already a User, show your love with a review on the App Store or by leaving a nice tip inside GlanceCam’s Settings (also new in version 2.0! 🤑). Thank you!

P.S. On a personal note, GlanceCam is now my most important app and, as it deserves, it is now displayed on the home page… I’m very happy to see a new product grow, but also a little sad for the apparent “demotion” of Tasktic, my first complex and somewhat successful iOS app. I still love all my children equally, though! 😉


Mac development is (not) hard

🔗 April 26, 2018

Brent Simmons perfectly described a belief I’ve had since I started Cocoa development:

“Assuming there’s a data model, maybe a database, some networking code, that kind of thing, then you can use that exact same code in your Mac app, quite likely without any changes whatsoever.

That leaves the 20% or whatever that’s user interface. AppKit is not the same as UIKit, but it’s recognizable. Same patterns and concepts, and often similar names (UITableView/NSTableView).

Given that you’ve done the hard thing — learning UIKit, Xcode, and Swift and/or Objective-C — taking the next step and learning AppKit seems like a very small thing. You’ve climbed the mountain already, after all.”
This has been exactly my experience: moving from iOS to Mac development has been absolutely painless, with most of the knowledge I acquired on iOS being useful and relevant, and with the “platform-specific stuff” absolutely learnable in the same way you understand how to use a new mobile framework. I don’t know if I’ve climbed the mountain already, but sure I am having fun climbing.

I expect to find harder topics along the way, but what I have encountered so far are myths and misconceptions that actually made me delay the transition to Mac development for reasons that, in hindsight, were simply bad.
So, here’s what I learned in my spare time (while mantaining a day job in a completely unrelated field, an information I provide just to prove that this is not something that will consume all your waking hours) since I started developing for Mac six months ago:

  • You will find tutorials and Stack Overflow answers to your Cocoa questions. Yes, there might be more resources available online for iOS development, but I find plenty of quality help every time I need it.
  • Window controllers and menus are not hard; check out any tutorial out there and, if you’ve got this far, there’s no way you won’t learn how to use them; same thing for menus, open at login capabilities, menu bar utilities and so on.
  • UICollectionView/NSCollectionView are not the same, nor are UITableViews/NSTableViews, but I never need to look up the documentation for standard implementations, and when I need something peculiar, Apple provides pretty great docs.
  • Sandboxing is not painful per se, but (big surprise) can be annoying when you’re trying to do some things. That’s the reason you can disable it: in ContactsAMI, I needed to share some files between a Contacts.app plugin and the main app and, since the plugin must be sandboxed, the only solution I found was to disable sandboxing for the app and write into the plugin sandbox. Clean? Probably not. Am I distributing the app via the App Store? Nope. The app is available for download nonetheless? Absolutely, because one of the great things about the Mac is that you can get software wherever you want.
  • I’m convinced that bindings can drastically reduce the amount of lines written, but since they looked hardly debuggable to me, I chose to avoid them completely; I’m probably writing more “iOS style” code for that reason, and I’m confident it’s fine and that you can do that too, if you feel so inclined.
  • UI is hard on every platform, it’s not just a Mac thing. This is certainly the area I’m struggling the most with, but there is a pretty good reason I feel the design of my apps is somewhat inadequate: that’s because Mac apps are so well designed, the bar is up there. Your mileage may vary, I will always feel more confident writing code than designing interfaces, but the important thing is that an iOS developer already knows the tools and has familiarity with the platform, so great native UI/UXs can be achieved.

So, if you are an iOS developer who has ever considered developing for the Mac, think about this: we may never reach the mountaintop, but we already know how to walk, we’ve trained a little in the woods nearby and already bought good shoes… we might as well continue climbing!


GlanceCam 1.3 and the road ahead

🔗 April 7, 2018

GlanceCam launch went so much better than I expected, confirming that an app I built out of lazyness is actually proving useful to others (which is simply the best thing for an app developer).

So, it’s time to take stock and plan for the future.

First and foremost,** I want to thank you for the support and kind words**. Users’ feedback, word of mouth and App Store reviews (reviews that, with the new version, you can leave directly from the Support menu inside the app) are essential, and you’re helping on all fronts! Please, don’t stop…

Starting today, GlanceCam 1.3 is available in the App Store with the following changes:

  • Some IP cameras offer both audio and video in their stream; you can now enable/disable the audio from Preferences.
  • Improved reliability of window resizing.
  • Minor user interface tweaks.

With this update, the basics of a single-camera, single-action app are mostly covered. So it’s time to start thinking, and building, GlanceCam 2.0.

The next logical step, and I have already heard some feedback confirming this, is to go from one camera to multiple webcams. Doing so requires some deep rewriting, which I started yesterday, but expect this change to take a while before showing up in the App Store app.

Since I’m in the starting phase of the redesign process, there are a few decision to make, and I’ll really appreciate your opinion about 3 possible approaches to multi-camera:

  1. Would you like GlanceCam to remain a single-window application, showing one camera at a time, and switch between cameras with buttons / keyboard shortcuts?
  2. Do you prefer to be able to open a separate GlanceCam window for each camera, rearranging and resizing them separately?
  3. You’d rather have a single window showing multiple cameras (i.e., a 2x2 layout, or 5 cameras stacked one above the other in a tall window)?

At least initially, I am probably going with #1, unless your feedback points me in a different direction: approach #2 seems nice on paper, but it can get really messy on your desktop if you have 4 cameras open in separate windows, and #3 poses some hard design challenges… a 2 camera layout should be very different from a 5, and some arrangements like the vertical stack are good for taking a glance with relatively small videos, but not great for resizing to a large view.

If you have an opinion on this, even if you’re not currently a GlanceCam user, please let me know on Twitter or via email!

I’ll do my best to build a great 2.0, wish me luck!


How to symbolicate macOS apps crash logs

🔗 April 6, 2018

Alternate title: TIL Xcode does not symbolicate Mac applications .crash files, that only works for iOS apps.

I made a pretty obscure mistake in GlanceCam 1.3 that lead to a crash during its app review.

I’m very sorry for wasting app review some time (they have been amazing, both understanding and allowing an hedge-case for sandboxing and giving GlanceCam lighting fast reviews, usually less than a day!) , but they have been so kind to attach a crash report and I had to symbolicate it (“Symbolication replaces memory addresses with human-readable function names and line numbers”).

Having done that a few times in the past directly in Xcode, I went straight there, but as I mentioned above, no luck. There’s plenty of resources online on how to do that “by hand”, but I want to point out a couple, very useful, solutions for other fellow developers:

Bob Matcuk’s gist perfectly describes all the steps to manually symbolicate a crash report, including checking the build number; this involves using the atos command in Terminal, which is not bad at all, but it can get a bit repetitive if you want to check more addresses (lines). Tomaz’s Symbolicator is a Swift Xcode project that compiled right out the box (sometimes, with Swift the language fast-paced evolution makes you work a bit before a project from the Internet actually builds) generating a very easy to use command line application that automatically fetches the DSYM files from the Xcode archives and overwrites the crash report with functions and line numbers that a simple human being like myself can actually understand.


GlanceCam 1.2

🔗 April 4, 2018

I’m very thankful for how well the launch of GlanceCam is going: being another niche product, I wasn’t sure there would be a market for it, and instead the number of sales has so far exceeded my (modest) expectations. Thank you!

Here’s what’s new in GlanceCam 1.2, already available on the Mac App Store:

  • You can now save a PNG snapshot of the video to the your Pictures folder by hitting CMD+S, clicking the Save icon, or selecting “Save snapshot” in the File menu.
  • GlanceCam didn’t restore the window size and position between sessions; now that bug has been fixed, and it will stay just where you want it on your screen every time you launch the app.

Thank you for using GlanceCam! If you know someone who might find it useful, I’ll really appreciate the word of mouth!


🐣 GlanceCam 1.1

🔗 April 1, 2018

A quick update to GlanceCam… Version 1.1 introduces:

  • New keyboard shortcuts for resizing the window to 50% (CMD+0), 100% (CMD+1) or 200% (CMD+2) of the original stream video size.
  • A bug fix: GlanceCam 1.0 prevented the screensaver from starting; now the screensaver works as expected, and the video stream is paused not only when the app is minimized in the Dock, but also whenever the screen is locked.

You can find GlanceCam 1.1 on the Mac App Store.

Happy Easter! 🐣


GlanceCam is here

🔗 March 29, 2018

I’m glad to introduce another nerdy and niche Mac app: starting today, GlanceCam - IP webcam viewer is available on the Mac App Store.

GlanceCamIcon256.png

GlanceCam is a highly configurable app that lets you keep an eye on an IP camera (webcam) and optionally perform custom actions via HTTP(s) requests, all without a browser.

GlanceCam is a product of lazyness: one day I found myself alone at the office and I had to get up from my chair a bazillion times, like an animal, to open the front gate. So, the most “straightforward” thing to do was to get ourselves a nice IP camera and an ethernet relay, and make them work together in a well made macOS app, so that we can keep a small window showing the gate video stream on our desktops, and open to visitors with just one clic.

You can read more about what GlanceCam can do for your Internet of Things setup, and learn about its hardware requirements, here; if you’re intrigued, you can already purchase GlanceCam for only $ 2.99 on the Mac App Store.


Introducing ContactsAMI

🔗 February 1, 2018

Some say that the most useful apps are made to fulfill a need of their developers. That’s certainly the case for ContactsAMI, a simple utility that I made to save myself a lot of time.

I’ve recently installed a VOIP PBX and phones at work (in the next few weeks I plan to write a brief tutorial about that, for beginners like I was 3 months ago), and finally something I’ve always wanted was within reach: dial a phone number without typing it on the phone, something we do with cell phones but seems so hard on desk handsets.

Enter ContactsAMI, a macOS app that lives in your menu bar with a complimentary plugin for your Mac’s default Contacts app.

With ContacsAMI, you can initiate (originate, for Asterisk connoisseurs) VOIP phone calls using your existing PBX supporting AMI (Asterisk Manager Interface): just select who you want to call and your VOIP phone will start ringing; when you’ll pick up, a new phone call will be made to the contact you selected.

ContactsAMI is now available to anyone who wants to leave the past behind and never type a phone number again.

You can try ContactsAMI for free for 7 days and experience its convenience while verifying that it is compatible with your setup; if the trial will convince you that typing phone numbers is archaic, and it absolutely is, you’ll be able to purchase an unlimited license for just $ 9.99.

Never type a phone number again, let ContactsAMI make your calls!


Best of 2017

🔗 December 30, 2017

It’s been a while since the last time I wrote here, so I thought to stop by and do something different for this New Year’s Eve: instead of posting my favorite things of 2017 on Twitter, like I did last year, I thought about making my “best of” post a bit more permanent here on the blog.

I’ll start by saying that, as far as music, movies and TV, I believe my picks for 2016 where stronger and will resist to the passage of time better than this year’s, and overall I think 2017 hasn’t been the best year possible for entertainment. Or almost everything else.

On the other hand, this year I’ve listened to so many amazing podcasts, making a selection was terribly difficult and, while I believe I picked my favorites, there’s so much good stuff out there, and so little time to listen to it, that I should probably write more about the podcasts I enjoy in the future.

But let’s start. Please add drumrolls after reading every category.

Best song: Dear Hate, Maren Morris & Vince Gill

Best album: Melodrama, Lorde

Best book: Raven Rock, Garrett M. Graff

Best movie: Dogville (I know, I know, it is 14 years old… but I never saw it before; it would be really hard for me to pick a really good 2017 movie… maybe Gifted)

Best TV show (debut): Godless (I know, a western… who would have thought?)

Best TV show (continued): Halt and Catch Fire final season… it started slowly but concluded a great show perfectly

Best podcast: NPR’s Up First

Best tech podcast: Welcome to Macintosh, and especially episode 15 The Orchard

Best investigative reporting podcast: I’m stretching the category a bit and choose What Trump Can Teach Us About Con Law

Best news article I read: How science found a way to help coma patients communicate

Best videogame: an easy one… Super Mario Odissey

Most moving TV moment: without a doubt, this MSNBC interview with Vice President Biden

And that’s all… here’s to a great new year and best wishes!


Magic

🔗 August 3, 2017

The last few days were so exciting: Steve Troughton-Smith dug into a mysteriously early public release of HomePod’s firmware and found proof that a new iPhone Pro - codename D22 - will have face unlock, Guilherme Rambo discovered the actual device icon confirming the very much speculated edge-to-edge design, and from there Allen Pike made some incredibly thoughtful mockups of how iOS could change to better suit the new form factor, and Mad Rudberg built upon his work with 4 hypothetical designs for the top notch and the bottom of the screen.

I’ve played along, retweeting and commenting. Federico Viticci is right:

“I haven’t felt this excitement around the new version of an iPhone from the design and developer community in years.”

All this time, while appreciating the amazing investigative work and design skills displayed by the tweets and blog posts linked above, I also felt a little uneasy… I kept thinking about what Phil Schiller said to Gruber during The Talk Show Live from WWDC 2017:

“At the end of the day, it’s really great when your team has worked so hard… a couple years of your life on something… and you get the opportunity to have Craig, me or someone else present it…”

Craig Federighi was even more explicit:

“They get really angry when one of these [leaks] happens.”

And now I wonder: what have I gained by knowing about this new design and exciting features 1.5 months earlier? Would I have been happier knowing most details of the iPhone on January 8, 2007? Is all this speculation fair to the people working so hard on these products we love so much?

Let me be clear: I don’t criticize Steve, Guilherme, Allen and Mad for what they have posted in the last few days. I absolutely don’t. I have retweeted their work, thought about it more than it was reasonable and publicly commented their findings as facts (I believe they are), so if there’s guilt in this process, I’m no innocent.

The fact is, Apple events are so well crafted that, if you’re into tech and don’t know about a product in advance, they feel like magic. Honestly, I felt a little less magic and excitement in the last few years, because I knew so much in advance. Boy, in 2014 I told a friend a new programming language was coming days before WWDC, and I’m not good at predicting things…

I know it’s impossible to avoid leaks, both from Apple’s standpoint - no matter how hard they try, it’s still a huge operation with thousands of people involved and tens of millions of devices manufactured before launch - and from mine as a devote user (should I disconnect from the Internet for three months? Stop reading the websites I enjoy the most?). I am also aware that this scrutiny comes from a deep love for Apple… it’s doubtful things will change in the future, I don’t have a solution to suggest and probably most people would not like more secrecy.

Still, I really feel for Apple’s Teams working on new products (just think at the poor guy who published the HomePod firmware 😱), and it would be so nice to feel the same magic again during a keynote…


Nǐ hǎo Walk More 1.2

🔗 July 24, 2017

After an amazingly quick Sunday app review, Walk More 1.2 is here. Download it for free and tell your friends about it!

This new version introduces two localizations, Simplified Chinese and Italian, and the possibility to brag about your steps count via the iOS share sheet.

A quick note that will probably be of interest only for other fellow developers: before submitting, I’ve noticed a warning in iTunes Connect regarding my in-app purchases. Turns out that consumable IAPs that remove ads need to be replaced, since Apple wants that kind of behavior to be restorable and available across devices, which completely makes sense. So, I kept the good and great “tip” in-app purchases (changing their tiers to the alternate categories with round values in the process) and replaced the “small tip” with a new “remove ads” non consumable IAP before submitting version 1.2. The approval process went smoothly, even though after submitting I worried about the lack of a restore button, usually requested for restorable purchases (I’ll add it in the next version, just to be safe).

After this minor update, I have quite a few ideas for Walk More’s future, but they’ll be put in the parking lot™️ for a while: my August will be completely focused on the development of Tasktic 2.0.


An iPad, multiple users

🔗 July 19, 2017

This year Apple gave a lot of love to iPads: we’re all in awe for how well they’ve implemented drag and drop, and I’m personally even happier for system-wide markup.

The new iPad Pro 10.5” is probably the best incarnation of the most versatile tablet form factor, and the combination of a Dock and an app switcher that both feel very Mac-like and platform native at the same time made this WWDC one of the best Apple events ever for iPad users.

There is one thing, though, that iOS still misses, and it’s something the operating system always had under the hood: the ability to allow multiple users to use the same device with a separate environment, giving each person in a family access to her own data, apps and settings. They made something last year for education, but it was pretty limited in scope and a bit different from regular users’ needs.

I am not saying that adopting multiple logins would be an easy feat for Apple, nor that it would be viable on all devices: since iOS apps save data inside their own app containers, I guess it would be a serious challenge for Apple engineers and app developers, and many devices haven’t enough disk space to allow the comfortable coexistence of different people on one device. The list of problems wouldn’t stop there: Touch ID would certainly be a requirement for quick user switching, inter-user document sharing would soon emerge as a need… the list of challenges would be long indeed.

Maybe more important than the technical reasons, which I believe Apple would be able to overcome in a reasonable amount of time if they decided to put their technical resources at work, I’ve read in the past that our favorite fruit company would never allow multiple users on the same iOS device, since iPhone and iPads are very personal appliances, and it’s also good for business to have each family member to buy a separate one. This is an argument I don’t buy: while it actually makes perfect sense for every person who can afford it to have a personal smartphone, for many households a tablet covers completely different needs, and actually most families can get by with just one iPad, and they are doing it right now.

I actually believe allowing multiple users on iPads would be great business for Apple, given how many old tablets are still around since they are already so good people don’t see the need to update: make iOS 12 accept multiple users just on iPad Pros (they started at 32 gigs from the beginning and all have Touch ID and a lot of processing power), and you’ll give families the most compelling reason to buy a much more expensive device (the 10.5” Pro costs almost twice as much as the new iPad, which by the way is almost too good for that price point, posing a challenge right there for Apple revenue, since it could be very tempting for most users to renounce Pencil support and some other advanced features in order to spend significantly less money).

This ship has sailed for iOS 11, but the silver lining is that now Apple has almost a year to make it happen the right way, just like they did with drag and drop.


Core Data + cloud sync = dilemma

🔗 July 11, 2017

My friend Becky recently wrote a post about the dilemma she’s facing with a new, interesting app she’s making.

She likes Core Data, and would like to use it for her project; she also wants to add sync capabilities, as that’s a requirement for most modern apps.

Here lies her dilemma. And my dilemma. And many developers’ dilemma… There’s no clear path towards a Core Data app with cloud sync.

sync_is_hard.jpg

Becky doesn’t want to use Core Data + iCloud since it’s deprecated. I might add, I don’t want a friend to use it, because I value her sanity… when I was setting up Tasktic’s sync mechanism, I spent 4 months and 3 complete rewrites before realizing my code wasn’t the problem: it was the actual API that was an almost un-debuggable black box that sometimes, very rarely but still too often, lost an object during the sync process with apparently no reason, and no way to get it back.

A few weeks ago, I suggested Ensembles to Becky, since it was the solution I adopted for Tasktic and given how well it behaved for me, restoring my sanity after those awful 4 months. But the free version of Ensembles still uses Core Data + iCloud under the hood***, so it’s not very future proof given the deprecation mentioned above, and on top of that there’s a more modern, faster solution provided by Apple that everybody want to use: CloudKit.

CloudKit is very tempting because everyone has experienced how fast and reliable it is with Notes.app and Photos.app for macOS and iOS; the most important thing for an app that sync is to never, ever lose users’ data, and CloudKit passes that test with flying colors. It is also very modern, with private/public data, web support via CloudKitJS, and most important, it is what Apple has chosen for the future, and following Apple’s lead is always a good idea.

The thing is, in order to get CloudKit to play nice with Core Data, you have to write most of the sync logic yourself, converting NSManagedObjects to CKRecords, handling updates, reacting to duplication, etc. It can be done, and many developers do it “by hand”.

As Becky notes, it can also be done via libraries like Seam3, which is currently the best open source implementation I found (and I looked really long and hard) of a Core Data - CloudKit bridge, albeit only if you don’t have many-to-many relationships in your schema…

The fact is, I really don’t want a dependency for my sync code anymore, especially when starting a new project. If I were willing to accept the risk of my sync code being abandoned someday in the future, I might as well look into Realm (not that such a loved mobile stack is going anywhere, but as we’ve seen in the past, companies get acquired, or sometimes move on to different projects…).

Where does this leave us? To Apple, of course.

Apple made such an amazing object graph and persistence framework with Core Data, and a fantastic syncing backend with CloudKit. They never connected those dots officially, though.

Becky’s post reminded me of something I really wanted (needed) for a really long time: an Apple sample project showing their idea of the best, most modern and Swifty implementation of Core Data for local persistence + CloudKit for sync implementation.

This is a step they really should take: while it’s great that they provide sample projects for ARKit, data persistence and sync is top priority for a lot of developers, and it would only be appropriate for Apple to show how they think a “great” implementation should look like.

So, if you have a friend who works at the best fruit company in the world, pass along the message: the indie developer community, and especially us beginners, would love some help in this area!

** This is true only if you want to stick with native cloud solutions, like I prefer, otherwise you can also pair Ensembles with your own backend or use Dropbox: the great thing about Ensembles is that it’s actually backend agnostic, but for CloudKit you need Ensembles 2, which isn’t free and so it’s not an option for most indie developers like myself.


App Store reviews, no authentication required

🔗 June 10, 2017

A few weeks ago I’ve realized that Apple made a huge improvement to the App Store user review system, and I haven’t seen it mentioned anywhere: we can now leave ratings and reviews without authentication! No password required, no Touch ID… just tap Write a review or simply the stars.

Maybe this has been around for a while and I didn’t notice, but if you haven’t realized this was possible too, there’s never been a better time to leave a review for your favorite apps!


Walk More

🔗 June 7, 2017

As I announced earlier this week, I submitted a new app to Apple.

Walk More: powerful pedometer for step counting is my fourth app and it is available for download.

Walk More is a simple iPhone app with a dynamic dark look and lively orange accents. It helps you to keep track of:

  • Every step you take when you have your iPhone with you.
  • The distance you walk (in miles or kilometers).
  • How many stairs you climb (iPhone 6 or newer required).

You can set a daily goal, see your progress inside the Notification Center widget and review your statistics and top results with the help of simple graphs.

Walk More is free, and you should download it right now: seeing your progress every day can really help you achieving a healthier lifestyle!


WWDC 2017

🔗 June 6, 2017

Some thoughts on yesterday’s Keynote and Platform State of the Union:

  • Appocalypse intro video: not particularly funny, but the ending message “Keep making apps. The world is depending on you” was a nice touch and a good way to kick off a 2+ hours developer (-ish) event.
  • tvOS: as expected, just the Amazon Prime announcement, but I’m pretty sure a 4K Apple TV is coming this fall, so yesterday wasn’t this platform’s day…
  • WatchOS 4: the new Siri face is very Googley, and the trippy one was designed by the same team who picked the name for macOS High Sierra; but the night notification containing a specific nudge (“you need a 12 minutes brisk walk to reach your goal”) to fill the rings is a very nice touch.
  • macOS High Sierra: I kept thinking they were replaying the 2014 WWDC naming video, but they actually went with macOS version 4:20 🙄. Anyway, not a lot to see on a mature operating system (though, a tablet mode for iPad Pro connected to Macs would have opened the doors to some cool new workflows), but that huge blow at Google with Intelligent Tracking Prevention is Apple at its best: protecting its customers’ privacy. It’s worth noting that starting next year Apple will begin abandoning support for 32 bit apps (which is already true in iOS 11).
  • Macs: Kaby Lake across the line is good news, albeit a little late; getting iMacs to be able to execute (and create) VR content was long overdue. The iMac Pro sure will be a beast, and it’s priced accordingly; I’m very happy to see Apple commit to a niche pro machine, but I have no doubt that its specs confirm that they were determined to drop the Mac Pro ‘til a few months ago… and it’s a good thing they reversed that decision, because a 5.000 $ (more likely, a 6.500 $) pro machine without user replaceable parts makes very little sense to me… It would have been cool if they went with a bigger, curved screen for the pro model (32 inches? 34?), but at this point it’s pretty safe to assume that curved Macs won’t be a thing.
  • Metal 2: the interwebs picked a better name, Heavy Metal. It seems really nice, but I bet VR developer would have liked at least a mention of OpenGL.
  • A wireless keyboard with numeric keypad: finally, we have the technology 😱. Sadly, it’s so advanced this futuristic device has to cost 129 $…
  • Apple Pay: direct money transfers between users just raised the level of the ocean: it was VCs funding Venmo & co. crying.
  • Siri (and machine learning, machine learning, machine learning everywhere): I think they are being cautious touting new Siri capabilities at this stage, but I’m pretty optimistic. The translation part was cool. I would have expected a few more new intents, but I got what I wanted 🤐, so I’m cool…
  • iOS 11 on iPhone: I like the new lock screen, and this could be their chance to make it a bit customizable (change the default calculator app, place a HomeKit button in the main view…). I expected a more substantial, system-wide redesign, but as they made clear in the Platform State of the Union, the Music-style big headlines are now available to everyone almost for free, and Apple uses them in most of their apps (they should fix this, though…), setting the new platform standard. The car DND is a very nice and safe idea.
  • Augmented Reality: very cool demos (the table one was amazing, but my arms hurt just watching the presenter hold that iPad for so long), I’ve never seen this resolution and realistic effect in HoloLens videos. This should be one of the major headlines today: Apple went from 0 to 11 (see what I did there? It’s the joke of the week!) keeping their work completely secret. This should probable silence (it won’t) all those critics voicing concern about Cupertino’s position in AR and VR (which too they acknowledged more than ever in the Mac part, confirming they are aware that it’s one of the next big things, though maybe less huge than many expected).
  • iPad 10.5”: I would have expected something a bit bolder on the design front, or at least a few new colors, but it’s still a great device. I use my mother’s 12.9 iPad Pro pretty often, and while I like it, it’s really, really big and heavy. This will probably be the best iteration ever of the original form factor, which happened to also be the perfect one. The six-core A10X is cool too.
  • iOS 11 on iPad: this is a huge step forward. Obviously, it’s not like computers never had drag and drop and file managers before 💁‍, but they seem really well implemented, and drag and drop is also really easy to adopt on the developer side. I also liked the Dock implementation and the new app switcher. All those features and the system-wide markup capabilities really got me excited about using the iPad more… I think that 12.9” will be the first device I’ll install the beta on, when the next version will be released (I’m not *that young and reckless anymore…).
  • HomePod: first, I dig the name, and I don’t think the price is excessive (I paid that exact amount in 2006 for the iPod Hi-Fi, and this thing does a couple of things more…). I’m curious to see how it sounds, and also to see it in person, because I’m not particularly impressed by its design. Given what they showed feature-wise, I don’t think it’s a device I’m interested to buy at this time, but of course they would be the only company I trust with a microphone in my home.
  • Swift Playgrounds on iPad: really neat stuff that I should probably check out.
  • Xcode 9: Apple’s IDE in my opinion was the absolute star of the Platform State of the Union. They seem to have fulfilled almost every possible wish a developer could have had: new source editor, faster indexing and compile times, clearer warnings (no dots anymore!), amazing refactoring capabilities, wireless deployment to test devices, Swift 4 adoption not mandatory when opening a Swift 3 project. I’m in love 😍, and I can’t install it because my 2008 Mac Pro can’t run Sierra or Fully Baked Sierra 😭.

I can only express my congratulations to the teams at Apple that made all this (and the many things I forgot to mention) possible. Thank you!

With so many sessions bookmarked to watch, this will be a fun week…

  • Squarespace doesn’t let me use the boy emoji…


It's been a while...

🔗 June 5, 2017

The last post here on cdf1982.com was appropriately named “Cultivate bad ideas”, and I have indeed pursued a lot of ideas in the last 8 months.

One (me) might actually say that I have bitten off more than I can chew, considering my day job and other personal commitments…

To be specific, I have worked on - and skillfully avoided completion of:

  • Tasktic 2.0 (80% done, but the last 20%… let’s just say it will take a few more months to release it);
  • A new Apple TV media player (currently nothing more than a stub);
  • Walk More, my take on pedometer apps (more on that later);
  • A secret project;
  • Setting up a Virtual Private Server, just to see how hard it was (it’s not) and to be prepared for future needs.

I believe that all those ideas are good and worth pursuing, just not all at the same time.

So, today I submitted Walk More to the App Store; I would have liked to add a couple more features to version 1.0, but tbh the core functionality is there (and has been for months), as is the overall look and feel of the app (which I very much like), and it’s time to start shipping products again.

Reaching the release of an app, and placing another (the media player) in the parking lot, will free up a bit of mental space and, also important, should stop me from feeling guilty every time I think of opening TextMate instead of Xcode: I completely stopped blogging in the last months because I tried to prioritize software development, but writing more commentary posts about tech news was one of my goals for 2017.

So, let’s start WWDC week planning to watch a lot of sessions, blog a bit more and focus all my development work on one app at a time (starting with that secret project mentioned above)!

In the meantime, I’ll let you know when Walk More will be available for download… please let me know if you’ll enjoy it!


Cultivate bad ideas

🔗 August 17, 2016

I don’t usually link to articles and blog posts here, but Shawn Blanc’s You have ideas today is really worth your attention and time:

“Out of ten thousand ideas, only one of them might be truly great. If you sit around waiting for the great one, how are you going to get it?”

— Shawn Blanc


Laying the foundations for the future: Tasktic 1.5

🔗 July 25, 2016

Later today Tasktic 1.5 will be available for download on the App Store as a free update for all our Users.

We have no revolutionary features to announce today, but this is a good release: under the hood we’ve worked long and hard to adopt new technologies (a new version of Swift, iOS 9 and watchOS 2 capabilities, updated libraries and a crash reporting and analytics system that’s respectful of our Users’ privacy, as we’ll describe in detail later) and to lay the foundations for the future development of Tasktic.

Here’s a quick recap of what’s new and what is improved in Tasktic 1.5, plus a few details about our thought process on important questions like analytics and App Store reviews:

  • Tasktic now works with iPad multitasking modes (of course, only on devices that support them), so you can be even more productive. We’ll look forward to your feedback on this much requested feature.

  • Tasktic for Apple Watch has been rewritten for watchOS 2 and now it is much faster!

  • While the free version of Tasktic is powerful enough for many Users, we’ve made Tasktic Pro more affordable for students, veterans and unemployed people: the new Tasktic Pro Value Edition offers everything (every. single. feature.) Tasktic Pro does, but for an even lower price. This is purely based on trust: if you’re a student (from first grade to college / university, age doesn’t count, it never does), a veteran or you are currently looking for a job, and you’re interested in the advanced features of Tasktic Pro (recurring tasks, multiple tags, statistics and achievements, export to file, overdue tasks in Tasktic Today and Tasktic for Apple Watch, etc.), you can get Tasktic Pro Value Edition - as usual, buy once and use forever on every iOS device you own - and enjoy those features for an exceptionally low price. If you’re not part of those categories, please purchase Tasktic Pro or, if you feel like it, show us your love and buy Tasktic Pro Big Supporter (as over a quarter of our customers do)!

  • Starting from this release, Tasktic requires iOS 9 and watchOS 2; we’ve supported iOS 8 and watchOS 1 for as long as possible, but with less than two months to the introduction of iOS 10 and watchOS 3, and with so many interesting features that were precluded to us by our legacy support, it is time to move to the current versions of Apple operating systems.

  • We’ve squashed some bugs: one prevented the task selected in Tasktic Today, inside Notification Center, from being opened by the main app; another, in Tasktic Share, caused both buttons to show the same “Cancel” label instead of “Save to Inbox”… and we’ve also made other minor bug fixes (some rare issues caused by iOS 8) and improvements.

  • Adopting the latest versions of iOS and watchOS is part of our continuous effort to get rid of every single bug and, Heaven forbid, crash. To accomplish this goal for our Users and move Tasktic forward, we’ve realized we need a little more knowledge about crashes and what happens within the app (meaning, which features and sections are most popular and which need more work, but not of course the content you save in Tasktic). As we’ve always said, and we’re proud to repeat today, we’re committed to completely avoid being creepy with your data; not only we don’t have access to what you save inside Tasktic by design, we don’t even want to know who you are: you purchase Tasktic directly from Apple on the App Store and you don’t need to create an account, nor provide personal details such as name, payment informations or email, to use Tasktic. Having said that, we think we’ve found a great balance between getting useful, anonymous and aggregated statistics and respect our Users’ privacy by implementing Fabric, Twitter’s well respected and secure developer service for analytics and crash reporting that has been an essential part of many popular apps (Spotify, Foursquare, Pinterest, Evernote, Overcast… it’s a long list!) for years. Let us be clear at risk of repeating ourselves: starting with Tasktic 1.5, we’ll use Fabric only to collect anonymous and aggregated crash and usage informations; no personal details about the content of your tasks (task names, notes), project names, tag names, etc. is collected with Fabric or in any other way. We can’t connect any information with a specific user, nor we want to. Most apps need this kind of generic informations, and we believe we’ve found a way to improve Tasktic and feel good about ourselves at the same time; if you’d like more informations about this change, please take a look at our updated privacy policy and don’t hesitate to contact us for clarifications!

  • We get a significant amount of positive feedback (and many great suggestions / feature requests, all of them really precious to us) from our Users, especially via email, but honestly the number of reviews in the App Store has constantly been a bit low. We know the process of leaving a review for an app is slightly painful, we’ve written about it before, but Users’ feedback really makes or breaks a product in today’s App Store… so we’ve decided to be a little more proactive (hopefully not annoying) asking for reviews inside Tasktic. As anybody else, we don’t like to be prompted for reviews whenever an app starts and then again every two minutes, so that’s not what we have done before, nor it is what we’ll do from now on: up to Tasktic 1.4, we showed you a subtle reminder for the review only inside the first view, on the background of Tasktic Today, and only after you completed at least 3 tasks in one session and had no more tasks left for the day… so many conditions, chances are most of you never even saw that request. Starting with Tasktic 1.5, we’ll show you a quick prompt for review after you complete 3 tasks in a session and you haven’t been asked about it for the current release (it is important that users review new versions of the apps they love, since the App Store resets the “stars” for every new release, almost punishing updates) or you chose to be reminded about it later. If you agree to review Tasktic, you’re our new best friend; if you tap “No”, we’re still friends, but you won’t be asked to leave a review again until the next version. But seriously, we need your reviews! As mentioned before, you can also tap “later” to dismiss the alert without refusing to review the current version and you’ll be asked again the next time you open the app and complete 3 tasks in a row.

So, as we said earlier, this isn’t a feature-packed release, but it opens the way for a lot of features and improvements we plan to introduce in the next months. And since you’ve read so much, a sneak peak is in order: when Tasktic 1.6 ships in a few weeks, you’ll love to work with Tasktic at night.

As usual, thanks for your time! Please subscribe to our RSS feed to never miss an update and, if you have any question, please contact us at tasktic@cdf1982.com or send us a tweet at @TaskticApp, we love hearing from you!


Tasktic 1.4 with recurring tasks

🔗 June 15, 2016

Since launch, the most requested feature for Tasktic has been the possibility to repeat tasks. I assume this is because we all want to pay our bills on time, and maybe reinforce a few good habits.

I’m happy to announce that Tasktic 1.4 is now available in the App Store, and it finally introduces recurring tasks for Tasktic Pro and Tasktic Pro Big Supporter.

Recurring tasks are conceptually harder than they seem: do you want them to repeat forever, or until a certain date? Is the repetition frequency set in hours, days, weeks or months? Do you want to repeat a task every Friday and Sunday on odd weeks? Does a task repeat if its previous instance hasn’t been completed yet, or it stays overdue and does not notify you again?

I believe Tasktic 1.4 answers to those questions are reasonable and flexible:

  • You can configure certain activities to repeat, both when you create a new task or when you edit an existing one. By default, a new task does not repeat unless you decide it to.

  • Tasks can repeat every n hours, days, weeks or months.

  • When you select a task to repeat with weekly frequency, you can pick on which weekdays (Monday, Friday, etc…) it will repeat. And of course you can select multiple weekdays.

  • You can create a monthly recurring task today and set its first due date 4 months in the future; the first due date acts like a “start date”, so you’ll be notified of this task for the first time in 4 months, then again 2 months later, and so on…

  • By default, a task repeats forever, until you disable the repetition or delete it. But you can also set an end date, after which the task will not repeat.

  • A recurring task can have a reminder (visual and audio notification), or can repeat without notifying you: if you enable the notification when creating a recurring task, all its subsequent instances will also have a notification.

  • A task repeats if you completed its previous instance, otherwise it stays overdue. This is really important and deserves an example: let’s say you created a “read a book”task, with a reminder, that will repeat every Saturday morning at 10.00.
    The first Saturday comes, Tasktic sends you a notification and you remember to read a few chapters of that great Grisham novel; then you mark the task as completed, and immediately a new copy of it (completely identical, except for the due date) is automatically created by Tasktic for the next Saturday. A week later, as expected you receive a notification, but this time you’re too busy playing You Must Build a Boat on your iPhone and skip the task. At this point, the “read a book” task stays active, and overdue, in your list of uncompleted activities, so you can maybe complete it later. But You Must Build a Boat is such a good game, and in the next week you do nothing but playing with it; when the next Saturday comes, you DON’T receive a notification reminding you to read. Why? Because you didn’t complete the previous, overdue instance of the task, so a new one hasn’t been created. When you think about it, this approach makes absolute sense, but it is important that you are aware of this behavior when planning and completing your recurring tasks.

  • When you complete an overdue recurring task, its next instance might be in the past, because Tasktic doesn’t skip occurrences: let’s continue with the previous example and say that after another week you finally beat You Must Build a Boat in hard mode; now you have a life again, and you catch up with reading, so you finally complete that overdue “read a book” task from two weeks ago.
    After that, Tasktic automatically creates the next instance of the task, but the next “read a book” task is also overdue, with the due date set to the past Saturday, and not the next one. Why this behavior? Because not all tasks can actually be skipped for a week without consequences, and it’s not Tasktic job to decide to omit one or more occurrences of a recurring task.

  • Of course, you can edit the repetition parameters for an active (uncompleted) recurring task every time you want, and the new settings will apply from that moment going forward. So if you skipped a few weeks of an activity (no judgment, we all do), you can edit that task and move its next due date to a future date, when you actually want to be reminded about it.

  • When you’re configuring the repetition parameters, a dynamic label at the bottom of the screen will tell you in real time how often this task will repeat and when its first occurrence will be.

  • Last but not least, we’re introducing two new fanTasktic buttons to help you recognize recurring tasks at a glance:

This task will repeat

This task will repeat

This task task will repeat and also has a due date

 This task task will repeat and also has a due date

Recurring tasks might sound complicated, but actually they’re not: Tasktic behaves the way you would expect it to, but I believe a detailed explanation of the thought process behind every decision was in order for such an important feature.

I suggest you to create a couple of recurring tasks to familiarize with Tasktic’s new capabilities, and in case you need help, you can find a tutorial inside Tasktic’s Settings, and of course you should not hesitate contacting us via email or Twitter.

We took our time to ship recurring tasks in a way we felt complete, powerful and clever; we hope you’ll enjoy this feature. If so, please take the time to leave a review in the App Store: they really make a difference!


Tasktic reviews roundup

🔗 April 24, 2016

This is a post I have postponed for a while… I’m not sure if I was trying to be humble or if I was too absorbed by a couple of projects (recurring tasks coming soon in Tasktic 1.4 and the new app we just launched, Always There), but here we are…
I want to take a moment and tell you about the amazing feedback Tasktic received in the last few months, after the first reviews roundup I published last November:

  • As you might have read before, last Christmas was very special for us, since Tasktic made it into the Top 10 Tech section of Product Hunt. We’re still amazed, proud and motivated by this acknowledgement.

  • On December 28, 2015 AppGratis.com team chose Tasktic as the app of the day and wrote that “luckily there’s Tasktic, a powerful task manager set to turn your productivity up to 11” by creating tasks that can be “as mundane as a reminder to water a plant or as long-term as investigating the rise of the robots. Either way Tasktic is the app for the job”.

  • The Daily Telegraph Sidney wrote about Tasktic in the newspaper published January 13, 2016: “If ‘being more organised’ is one of your resolutions, this could get you started”: Tasktic “stands out of its simplicity”. Seeing Tasktic in an actual newspaper was a moment of true joy!

  • ILoveFreeSoftware reviewed Tasktic on January 16, 2016 highlighting how it is “an amazing free iPhone app to add tasks via Siri” and pointing out that “Tasktic also comes with a beautiful and intuitive interface for managing your daily tasks”.

  • appPicker published a review, Tasktic app review: the only to do reminder app you will ever need, on January 23, 2016, writing that “Tasktic is one of the best reminder apps you’ll find in the App Store” and listing as pros “Great user interface, No ads, Includes excellent tutorials, You can alternate between viewing today’s tasks and all tasks, Create reminders for any task, Each reminder you create can include an extensive amount of information”.

  • The Popular Apps chose Tasktic as the popular app of the day of March 1st, 2016.

  • On April 11 Passione iPhone described Tasktic as an “easy to use task manager, but fully featured” that is “ideal for particurarly busy users”.
    On top of these professional reviews, Tasktic received an amazing feedback from users, and this is something with appreciated even more (by the way, Tasktic doesn’t bother you to leave a review, but if you like it and can take the time to write a few words in the App Store, they really mean the world to us!).

Here are a just a few of the reviews we’re so proud of:

  • This is the task app I have been looking for! It has a nice clean design. It is easy to add tasks, especially a number of them in a row. Love being able to organize them in projects and labels. You can add due dates and it is easy to switch views on what is due, past due, or all. Also, their support is amazing!!!” - User on the US App Store

  • Well designed, both useful and fun. I like that I can organize my everyday tasks into projects without the effort or complication some of the other apps require. The support is fabulous.” - User on the Canadian App Store

  • Great app, all said in two words. It is down to the point and you do not get dragged away in options. Then, it works fast.” - User on the French App Store
    What can I say? Thank you so much, this really inspires us to work even harder to bring you all the features and improvements our users deserve!


Always There is here

🔗 April 20, 2016

Today a brand new app joins Tasktic and Weightrack: Always There!

Always There allows you to keep your most precious photo always there (ahem….) in a Notification Center widget of your iPhone and iPad.

Just pull down Notification Center and an amazing picture of the person you love, a funny photo of your puppy or an image that inspires and motivates you will be there for you!

Always There is a simple but meaningful app. Learn more here, download it now on the App Store and tell your loved ones about it!


Touch ID for app reviews

🔗 March 28, 2016

There’s an ongoing discussion about how Apple could improve the App Store for users and, yes, developers.

An online store with over 1.6 million apps and hundreds of millions of active users is a delicate mechanism, and it is understandable Apple treads carefully with any change. I think there’s a low hanging fruit for Apple to pick, though, and it’s about how users review apps, a fundamental part of the discovery and purchase process.

A couple of days ago I wanted to leave a review for a nice videogame I discovered recently, Deemo. I opened the App Store app, searched for the game and pressed Write a review; at this point the app asked for my password, which is pretty long and complicated, and I almost gave up on my intention of leaving that favorable comment. And I know the prospect of typing my password (yep, it’s that bad/good) made me give up on reviewing other deserving apps in the past

I then tweeted:

Dear @pschiller, please let users authenticate with Touch ID when leaving @AppStore reviews: it’s safe for payments, it is for feedback too!

— cdf1982 (@cdf1982) March 26, 2016

And that’s my whole point, but a tweet is easily missed: long and complicated passwords are important, and hopefully more users adopt them every day, but safe passwords are a pain to type, and Apple already has a secure system to avoid that annoyance.
Touch ID is safe to authenticate your device and your online and offline purchases, so it sure can be used for confirming one’s identity before leaving a review.

Removing any pain point in the users’ evaluation process could lead to more reviews, and we all know more reviews are good for users and, yes, again, developers, since they impact the app ranking in the search results… I sure know I’d love more (hopefully good) reviews for Tasktic.

I hope someone at Apple will see and consider this small proposal… if you agree, please share this post, and don’t forget to review the apps you love!


It's about time

🔗 March 23, 2016

Tasktic 1.3 is now available for download on the App Store, and it brings our task manager much closer to you, right on your wrist!

Tasktic for Apple Watch is a simple app, designed for quick interactions on the go: it allows you to quickly add tasks to Inbox by dictating them to Siri and it also lets you review all your tasks due today and tomorrow.

Tasktic Pro and Pro Big Supporter users can also view overdue tasks directly from Tasktic for Apple Watch by enabling the option inside Tasktic for iOS Settings.

Tasktic for Apple Watch is the first in a series of new features we’re working on and plan to introduce this spring… follow us on Twitter and subscribe to our RSS feed to never miss an update! And if you have any question, please don’t hesitate to send us an email!


The PH effect

🔗 December 28, 2015

“‘Twas the night before Christmas, when all through the house
not a creature was stirring, not even a mouse.”

It all really started like in 1822 Clement Clarke Moore poem, except what made me sprang from my bed on December 24th wasn’t a miniature sleigh and eight reindeer, with a little old driver so lively and quick. No, ‘twas a tweet from my friend Chris of AppRecap.net:

@cdf1982 I got an invite for PH recently, so I’ve added Tasktic for you! https://t.co/Scf9SX1nEw

— Christopher Hannah (@chrishannah) December 24, 2015

Quickly three emojis appeared in my mind (we all see emojis in our minds, right?): 🙀🎄🎁

And indeed for a task manager like Tasktic, launched just 43 days before, is there a better Christmas gift than being posted on Product Hunt?

Receiving so much exposure, to the right people, could really make the difference in an App Store that has probably already surpassed 1.6 million apps. On top of that, let’s admit it, that kind of validation also feels amazingly good, after 10 months of development without knowing if your product will actually be downloaded by someone who isn’t related to you.

Turns out, though, that there is an even better gift a developer can receive, and it takes the form of being actually featured among the top ten products of PH Tech page on Christmas day, scoring (at the time I’m writing this) over 110 upvotes… I still can’t believe Tasktic was on the home page of Product Hunt (and yet I have an embarrassing amount of screenshots to prove it 👻)!

 Let's face it: when your task manager is up against The Donald, it's the real deal...

It is so rare that your expectations survive a meeting with reality, and yet here I am with some comforting data:

  • On the day of the feature, downloads increased 470% vs. the daily average, with the second highest number of installations since launch day (I must say that Tasktic already had a pretty good launch, thanks to the reviews on AppRecap.net and Macitynet.it and to some direct marketing I made in Slack channels and by email). The next day, downloads were still 293% higher than the **average and on December 27** (the last day I have iTunes Connect data for) they actually sky-rocketed to 539% of the pre-feature average. So, the third day after the feature Tasktic had the highest number of installations ever! I was expecting the effect of the feature of December 25th to slow down quickly and to return to my regular numbers very soon, and sure that’s going to happen 😞, but the “Product Hunt” effect is being much longer and stronger than I imagined. Yay!

  • The new users I’m acquiring are willing to pay 💰! The free version of Tasktic offers a pretty-complete feature set, but there’s also a Pro version (unlocked with a single, non recurring in-app purchase that costs just $4.99) that offers unlimited projects, tags, stats & achievements, export to file, etc. and, since appearing on Product Hunt, the conversion rate to Pro is almost double than the pre-feature average.

  • For the most loving users, there’s even a Pro Big Supporter version that costs $9.99 and actually offers the same feature-set of the “regular” Pro version (plus a special badge!). I chose to offer two price options because I believe people are willing to spend a little more to support the apps they love, and looks like I’m not wrong: since launch, over 30% of in-app purchases have been Pro Big Supporter. I can confirm the same ratio after the feature, which was a surprise to me: Hunters try a lot more apps than the average user, so I assumed they would have been a little more difficult to “upsell”. As a matter of fact, Hunters are people too 😸, and while they don’t spend their money like water, they’re pretty fair and don’t hesitate to show their love in a big way.

  • One thing I wasn’t expecting was the huge amount of traffic the PH feature brought to Tasktic’s website, compared to the daily average (which, honestly, has been pretty low after launch week). On the day of the feature, cdf1982.com had 1.800% more visits than the average, on Dec. 26 1.100% more and on Dec. 27 it bounced again to +1.466%.
    Usually, when I see an app on Product Hunt I visit its website and download it from there; turns out, I’m not the only one who prefers checking out the webpage before downloading it (or not).

  • Compared to the number of installations, I’ve had a pretty low feedback via email, and almost none on Twitter. Those who contacted me were amazing, though, so I made up quantity with quality, and in the process got some pretty good suggestions for future features too!

In the end, yes, I have a completely predictable conclusion: being feature on Product Hunt can generate an amazing amount of interest around your app.
What surprised me the most is how long the effect continues after the feature: according to RankUp, Tasktic right now (5.30 PM CET of December 28, 2015) is ranked in the top 200 free Productivity section (sic, not in the top grossing list 💸) of the App Stores of 30 countries, including UK, Germany, France, Spain, Mexico, Argentina and Brazil.

Now is up to me to continue improving Tasktic and build upon this amazing exposure. If you want to follow our next steps, pleasesubscribe to our RSS feed and follow Tasktic (or myself) on Twitter. And if I can do anything for you, please don’t hesitate to send an email, I always answer! Last but not least, if you haven’t tried Tasktic for iPhone or iPad yet, download it now for free!

Thank you Hunters, from myself and from the Tasktic Kittens, Amélie and Remy, who you can see expressing the usual feline Christmas spirit in the picture above!


Now, this is a merry Christmas

🔗 December 24, 2015

I had a quick post planned for today, to wish you and your families a merry Christmas and to officially announce the much requested new feature that’s coming in Tasktic 1.3 next January, but a few minutes ago I’ve received an amazing gift from Tasktic’s best friend Chris Hannah of AppRecap.net: today he submitted Tasktic to Product Hunt!

So, I’m here to wish you the best Christmas possible, and also to ask you to check Tasktic out on PH, and maybe - if you think it deserves it - give it the gift of your upvote, helping it to reach the home page

What about the new feature in version 1.3, you ask? Let’s just say that I hope you’ll find a certain timepiece under the tree.

Merry Christmas, I already know mine will be good because having the chance of being on Product Hunt is a dream come true!


Do we really want big data peeking into our to-do lists?

🔗 December 20, 2015

Yesterday I saw the image above on ProductHunt.

It made me wonder: do we really want our personal informations aggregated this way? Do we need to? Do we really benefit from it, or someone else does?

I understand it might seem not appropriate for me to write about a competing app, but honestly Tasktic is so small compared to Wunderlist (I don’t see Microsoft purchasing my app for a sum between 100 and 200 million USD anytime soon… but hey, I’d love to be proved wrong!) and those questions still stand:

  • Do we really need this kind of reports?
  • Do we want all our activities and plans aggregated by a big company?
  • Are we really aware our day-to-day informations might become part of a wider profile a corporation could build about us (maybe not now, but it could happen in the future just by editing those Terms and Conditions nobody reads), merging all the data points it collects from its many services into a pretty accurate picture of who we are?

Of course, in the case of Wunderlist’s Your year in Review, each user only sees her own data and I understand it might feel nice to see that you complete most to-dos on Fridays (really, who does that?) and that you’re more productive than another random dude on the Internet. It’s not something you actually “need” to know, but we’re all big fans of the quantified self, aren’t we? Only, be aware that in this case the company behind the service sees **everything, much more than it’s shown on that shiny infographic**, for every single user, including yourself…

When you create a Wunderlist account (and you must in order to use the app), you give them your name and email address right away; if you go Pro, you also provide them billing informations, completing your unique profile. And then you start providing personal informations every time you add an item to a list, because what you’re going to buy, your plans, work activities and so on, all become items in the lists you create. In some way, you almost admit to them that you’re a bit lazy, if you keep adding items and never tick them off…

I’m not sure everybody understands how personal a task manager can become and how many informations it ends up containing about its user.
I’m no luddite and I’m not here to say that we shouldn’t use online services (though, I believe we should always know their business model) or provide any kind of information about us to tech companies. But we shouldn’t necessarily give them everything in exchange for a pretty graph at the end of the year, when there are so many alternatives out there that keep your informations private (yes, including Tasktic, which doesn’t require you to have an account and keeps all your data on your devices and in your own personal, accessible only-by-you iCloud container, without any chance for us to see that you’re not getting much done on Sundays…).

Big Data will be the big theme for 2016. As it was for 2015, and will be for 2017… Let’s choose ourselves what part of our data really needs to be part of Big Data.


Show your 💕

🔗 December 10, 2015

Just a quick note to ask for your support…

If you enjoy using Tasktic, please take 5 seconds to rate it 🌟🌟🌟🌟🌟 on The Great Apps and give it the boost it needs to be noticed by lots of users.

I really appreciate your vote!

Since we’re here, I also want you to know that Tasktic 1.2 is coming soon (it will be submitted later today to Apple for review) and I’m already at work for Tasktic 1.3, which will bring a much requested new feature!


A sweet, sweet deal

🔗 November 26, 2015

Tasktic Pro is 40% off for Black Friday 2015 🎉!

For just $2.99, instead of $4.99 (already a pretty sweet deal), you’ll have access to all the most powerful features, forever:

  • Create unlimited projects (you can have up to 3 in the normal version)
  • Add multiple tags
  • See stats about your tasks and get motivational achievements
  • Select the view shown when Tasktic starts: Today, All tasks or New task
  • Get the option to also view overdue tasks, not just the next ones, in Notification Center
  • Export all your tasks to file
  • Delete all completed tasks in a single step, if you want to clean up

Try Tasktic for free and, if you’ll enjoy being more organized, purchase Tasktic Pro between November 26 and November 29 for this amazing price!

Happy Thanksgiving to all our American friends!


Just start over

🔗 November 24, 2015

Insightful post from Dr. Drang:

“I’ve come to accept that there will be times when I stop maintaining my to-do lists, and I don’t worry about it anymore. There are reasons it happens, and overall it doesn’t hurt my productivity.”

This is an important point, especially if you’re new to task management: it’s a common belief that if you adopt a list-based approach to manage your tasks, that method can only work if you zealously update your lists every day.

I’m not here to tell you that you shouldn’t keep your lists up to date, obviously there are advantages in a continuous and active GTD implementation, but please know that you can have great benefits from making lists of tasks even if you don’t check and update them all the time.

“The most common reason I stop maintaining my lists is that I get heavily involved in a single project for an extended period, and I just don’t see any reason to keep writing down what I’m going to do.”

Me too, but I know people who do just the opposite and that works magic for them. Just find what seems to fit you the best, be sure it’s fast and unobtrusive and go for it.

The best solution for you might be pen and paper on the bedside table, it might be the preinstalled basic app on your phone, or maybe it will be Tasktic on all your mobile devices…

After a while you notice that you haven’t had time to look at your lists in days? No problem, just bring them up to date and start over, maybe adjusting some details you think didn’t help you being effective last time (don’t have time to look at your list in the morning? try doing it last thing before leaving the office, etc…).

You won’t form a habit in a day, but it’s not worth it to give up a great organization method just because once in a while you find yourself temporarily abandoning it.


Reviews roundup

🔗 November 23, 2015

I’m a bit late with this post… Taskic 1.1 is already available in the Store and I’m already working on version 1.2 (it might actually take a few weeks to ship it, though), but I really want to aknowledge the time a few reviewers took to try Tasktic and write about it. Thanks, I really appreciate every kind word!

A few highlights from the first reviews:

  • *Ideal for users who are particurarly busy with day-by-day activities, who need a single hub for all their appointments and daily commitments. **- *Macitynet
  • *My personal favourite part of this app, is massively useful for people who like to add a bulk load of tasks in one go. There is a completely different tab for adding tasks, and you enter the usual project details, priority, tags, etc. But unlike the majority of other task manager apps, these details stay after you’ve actually created the task. So for example if I get a piece of coursework through for University, I can create a new project for that piece of work, then all the various individual tasks in one go. It just makes things much easier, and of course more productive. - *AppRecap
  • *A distinctive trait of the app, compared to many other apps of the same kind, is fanTasktic button, which helps users to understand on the fly, with a quick glance, if the task is due, if it’s still active or if, instead, it’s already been completed. **- *Macitynet

Other mentions: iSpazio, MagazineApp.it, ThursdayAppDay.

Again, thanks a lot for these reviews!

If you have a blog or website and you are so kind to consider reviewing Tasktic, please take a look at our PressKit and get it touch!


Tasktic 1.1 coming soon

🔗 November 15, 2015

Just a quick update, before a longer post I plan to write in a couple of days to tell you everything about Tasktic’s launch and to link to the amazing reviews it has received so far.

Today I submitted Tasktic 1.1 to the App Store for review. Here’s what’s new in this first update:

  • You can now change the name of projects and tags after you’ve created them: go to Projects & Tags and swipe from left to right on the cell containing the project or tag you want to rename, then tap Edit name.
  • Minor bugs have ben squashed.

Tasktic 1.1 has been submitted to Apple just 5 days after Tasktic 1.1 launched. Too soon? I don’t think so: I’m going to release new versions as soon as the features and improvements I’m working on are ready; this means that some updates will be released in a short window of time, and others will sometimes take a little longer.

Of course, Tasktic evolution will benefit greatly from Users’ feedback. Please, get it touch if you have any suggestions or - let’s hope not, but nobody’s perfect - any issues.

You can expect to receive the update to Tasktic 1.1 in about 10 - 12 days, after the review process from Apple will be completed.


Tasktic launches today!

🔗 November 10, 2015

Well, it took a few days longer than I initially planned, but starting today you can become a more organized person with a little help from Tasktic, our powerful and easy to use task manager!

Download Tasktic now, free on the App Store for your iPhone and iPad, and manage your tasks to accomplish more!

Tasktic offers many advanced functionalities usually available only in expensive productivity apps:

  • Unlimited tasks, with optional due date and notification
  • Projects
  • Tags
  • Sync between devices (via iCloud)
  • Siri and Reminders for Mac integration
  • Statistics and achievements

Try it for free, share it with family and friends and subscribe to our RSS feed to never miss an update about Tasktic and for a few more posts about its development and launch that are coming in the next weeks!


Being too optimistic

🔗 November 5, 2015

As it happens when you don’t account for delays, I’ve made a mistake: I planned to launch Tasktic today, November 5, and I announced the date when I submitted the app to the App Store Review.

Turns out, I’ve been a little too optimistic about the approval time, also because I had to fix a small error I made not with the app itself, but with the metadata submitted to Apple: the app name I initially chose was a bit too long and explanatory, so I’ve had to shorten it to “Tasktic - manage your tasks, not a task manager”.

I’m very sorry to miss my own, self-imposed launch date. Tasktic will launch very very soon, I’ll let you know here and on Twitter as soon as it’s approved.


Update November 10, 2015

Tasktic is now available for download on the App Store! Please, get it now and share it with family and friends!


Paying more for the same?

🔗 November 3, 2015

In my previous post about the importance of knowing the business model behind any app or service you trust with your data, I mentioned than my new app Tasktic is free, but offers more than one in-app purchase to unlock the Pro version.

Actually, Tasktic has a Pro version that costs $4.99 and a Pro Big Supporter version at $9.99. The thing is, they actually offer the same features, so why users should willingly pay more? Am I insane thinking people will spend more for the same, when many actually complain about .99 cents apps?

If you purchase Tasktic Pro at $4.99, you’ll support the future development of Tasktic, make my day and unlock every single advanced feature forever:

  • Create unlimited projects (you can have up to 3 in the normal version)
  • Add multiple tags
  • See stats about your tasks and get motivational achievements
  • Select the view shown when Tasktic starts: Today, All tasks or New task
  • Get the option to also view overdue tasks, not just the next ones, in Notification Center
  • Export all your tasks to file
  • Delete all completed tasks in a single step, if you want to clean up

In an app category that often has prices as high as $40 for apps you can’t even try before purchase, Tasktic Pro is a pretty sweet deal.

Sadly, that price (minus the 30% distribution cut for the App Store, which I honestly think it’s more than reasonable if we consider Apple made this entire ecosystem out of nowhere) makes sense in such a competitive world, but won’t cover much of the costs of an eight-months development stretch, unless sales are very high (I obviously hope so, but I also believe, 😔, that most people will probably stick with the free version of Tasktic, since that’s already pretty feature-rich).

Enter Tasktic Pro Big Supporter. At twice the price, it’s still much less than most alternatives, but it gives me room to grow this app the way I want (one example: Tasktic for Mac). Yes, Tasktic Pro Big Supporter offers the same features of Tasktic Pro (with the cherry on top of a special achievement, reserved to just the most loving fans who choose this version!) and costs a bit more, but what are 5 Dollars more for an app that you’ll either use every day for a long time, or won’t open at all (it’s a fact task managers don’t work for everybody, but if you are one of those persons, you aren’t going to buy any Pro version of Tasktic anyway, so this is an abstract post for you, maybe something you’ll consider for other apps…)?

Tasktic is a passion project I’ll continue developing for a long time, but if you’ll like it, please consider going the more expensive way: I am not insane for giving you the option to show your love, and you won’t be for choosing to support an app you like by paying a reasonable price.


Always look for the business model

🔗 November 1, 2015

This post probably won’t reveal you anything you didn’t already know, but you should read it anyway and, maybe, share it with your loved ones: no matter if you plan to download my new app Tasktic or even if you don’t care about what that is or why I made a task manager when many alternatives already exist, the stuff we’re going to talk about matters a lot for every app you start using or online service you subscribe to, and not everybody knows it.

In today’s world, you can expect an app or an online service to have one of the following business models:

  • Paid upfront, you pay before downloading (on iOS, this means opening your wallet before even having a chance to try if the app actually does what you need);
  • Free, ad supported;
  • Free with in-app purchases (IAP) to unlock advanced features or more contents (once-and-forever or for a given amount of time, via recurring subscriptions);
  • Free with consumable IAP (you buy a certain amount of a virtual resource, let’s say gems in a game, and then spend it on items and improvements; just like the real money you used to buy them, virtual currencies stop being available to you after you spent them to upgrade some weapon or to avoid waiting for something to happen);
  • Free with no form of revenue (have yet to figure it out, it’s just a hobby, a venture capitalist was passing by…);
  • Crowdfunded (Kickstarter, Indiegogo, etc).

As you know, the frequency of the models listed above changes widely depending on the category of app you consider:

  • Many games rely on the consumable IAP model (you purchase and spend virtual currency to avoid artificially-inserted waiting times, or to improve your skills) and make a lot of money while they’re at it.
  • Ads are also very common in games, while it looks to me they’re much less frequent in “normal” apps than a few years ago, with the exception of social networks (Facebook, Twitter, etc. business model is actually selling adverts against the information they collect about their users).
  • Professional apps are (decreasingly) paid upfront or (increasingly) free with limited functionality that can be extended through single or recurring IAP.
  • In many cases, Uber-for-bathing-cats apps that are venture capital funded are free and have no idea whatsoever about how they’ll make money (except with the textbook exit strategy: sell to someone else who also doesn’t have a clue and buy a private island)… of course, having landed the vc money in the first place, these are the smart guys.
  • Crowdfunding, while nice and growing in popularity, at the moment is not very common for apps and online services, so I won’t explore it in detail today.

Many business models, one main difference: the product for sale can actually be the app or service itself, or it can be the user. By now, chances are you already know that if you’re not paying for the product, you are the product.

How does this recap of the most common revenue models for apps and online services relate to task management / GTD apps in general and with my own app Tasktic in particular?

If you’re looking for apps in this category today, you’ll encounter 4 different business models:

Approach #1: you pay upfront for the app, usually quite a sum. 30 / 40 bucks is not an unusual price (in some cases you have to make separate purchases for every kind of device you want to use the app on, spending even more) and, while this isn’t much IRL, sadly for developers it is Ferrari-price in the App Store. If you go down this route, you’ll have a probably good (and in a couple of cases even great) app that you couldn’t try before buying, and you will be lighter of a significant amount of 💵. This isn’t the cheap approach, but it’s a good one if you’re willing to pay the price. Another upside, in this case, is that there’s a very high chance that since you paid, you and your data are not the product. I love the paid upfront model made in a serious way (meaning: if the user paid you good money, there’s no way in the world that you get her data while syncing and then sell it), and most developers do it just right, asking prices that are adequate for excellent apps targeted to power users. We can’t deny, though, that such prices are a huge barrier for discovery, especially for regular users who don’t know (yet) how useful a task manager can be. Not everybody is a power user, but everyone has things to do and can use a little help staying organized and focused, so a less expensive solution is very much needed.

Approach **#**2: you don’t pay at all. Since I’m not aware of a major free GTD app that is ad supported, the free tag price means that you are not paying for the product directly in any way. Congratulations, dear friend: this is a textbook case in which it’s very likely that you are the product. This might be a less expensive solution, it’s actually free and free is good, but I personally don’t believe is a safe one for anybody. Maybe you think your data will be alright and private because the app or service is from a heavily-fundend start-up with noble ideas, but what happens to your informations and metadata if the founders decide that they really need the private island I mentioned above and therefore sell their company to SomeEvilConglomerate?

Approach **#**3: you can download and use the app for free, but you can subscribe to a pro, fully-featured version for a monthly / yearly fee. This is a very common model these days. I must admit that as a user I’m OK with this approach, but I don’t love it: recurring revenue is great for the creator as it can support steady development over time, but the customer needs to be aware that she’s going to pay a small amount for a very long time, if she likes the app, probably ending up spending more than in a single transaction as in the case described in the approach #1 above. On top of that, some users aren’t often aware of what happens to their data when they decide to let the subscription expire: will the data be completely accessible, editable and exportable? From the moment the subscription expires, is it ok for the app creator or service provider to use data saved by the users, while they were paying, for data-mining and commercial purposes? You guessed my opinion, no, it’s never ok, but how many persons do you know who carefully read the Terms and Conditions to check that’s the case before they start using a service?

Approach **#**4: you can download and use the app without spending any money upfront, but to unlock its full potential you can pay a single in-app purchase, spending a clear, final amount once to get access to the features you want forever. As a user, this is my favorite model for every kind of app (not just productivity, but also games… oh, videogames were so much better when people actually paid for them upfront instead of rewarding developers for adding thousands of pain points as incentive for micro-transactions, but I’m digressing…), and is also the one I, as a developer, chose for my new app Tasktic. I love this approach because you can try as many apps as you’d like, until you find the perfect one that fits exactly your needs, but I also like it because it is not a trial in the old, shareware-like sense: the free app doesn’t expire after a certain amount of time, instead it must provide real value in order to compel the most passionate users to want “more” and therefore pay for the full, most advanced version. I, for one and after many years of discussions in the development community, applaude Apple for not allowing trials in the App Store: the audience there is so broad and diverse that you can’t expect everyone to understand exactly the limits of a trial version (risking people to input data into apps that stop working after a few days), but it’s very simple to understand that a free app is providing certain functionalities and will keep having them forever, and that if you want more, or if you really enjoy the product and intend to support its future growth, you can pay for it. Of course, there are cases where you need to show the user how a complex functionality actually works and that are therefore better suited for time-limited trials that give access to all the features the app can offer. This isn’t common on iOS, but it can still be achieved in free apps with IAP: for instance, Marco Arment allowed a brief “demo” of Smart Speed and Voice Boost in version 1 of his awesome podcatcher Overcast, before moving to a different, highly innovative model, patronage (I sadly don’t have much time to comment on this new model of support - this is already going to be a long post - except for saying that it looks really promising and that I, as many other developers, look forward to know from Marco Arment how this “experiment” will work for him).

Having stated my preference for free apps with a single, non-recurring IAP, I also have to say that users who look at apps built around this business model should also be inquisitive about two more aspects :

  1. It must be clear - written in plain english - that free users’ data are as sacred as those from paying customers (meaning: it’s not that, since a user isn’t paying yet, the developer can data-mine his data like it’s Christmas morning at Google’s HQ).
  2. If the free model is supported by advertising, these ads must come from a reliable source, not one that collects information to build a profile of the user; I personally believe that this can only be said for Apple’s own iAd platform, since Apple has “a few” others sources of revenue that are more significant to its bottom line than ads and since it has publicly declared, in unequivocal words from its CEO and in a clear policy regarding users’ privacy, that it doesn’t want any more informations about its users than those strictly needed to operate its devices and services. If you’re interested in the subject, I plan to write more on iAd, even if Tasktic doesn’t have any ads, in the next few weeks; subscribe to our RSS feed if you don’t want to miss it. By now, you have a pretty clear picture of what I believe and want as a user: I have issues, a lot of them, in being the product, so I don’t like apps and services that are free and that I can’t pay for with a direct, transparent, transaction. Free with IAP? Great. Free with generic ads? Fine by me as long as those ads aren’t chisel-targeted to me. Free because you’re data-mining the hell out of what I’m doing and selling it to shady advertisers? Nope, no way, not a chance in this life.

Even before I began developing Tasktic last February, I wanted my new app’s business model to reflect my beliefs as user:

  1. I wanted to make an easy to approach, and yet powerful, task manager for everyone;
  2. I wanted to make it free, because free apps are more convenient for users to discover and try;
  3. I wanted an app that absolutely doesn’t make its users the end product: privacy means a lot to me, so Tasktic business model had to have user privacy front and center.
  4. For a business model to be a business model, of course it also had to be sustainable: I wanted to offer pro features for a single, non-recurring and not expensive in-app purchase, also giving the most passionate users an opportunity to show their love by paying a little more (more on this in the next, way shorter post). I initially thought to support the free version with ads done the right, privacy-respectful way (meaning, using iAd), but then I opted for the best experience possible for every user.

Is well known that being free is a necessity if you want a lot of people to try your app and, maybe, love it and use it every day in their busy lives. But after all that I’ve written about free products, let me be crystal clear on my purpose in making Tasktic available for free: my hope is to “lure” a lot of users into installing Tasktic and, after trying it out and evaluating if its features and design pattern fit their needs, maybe pay to unlock it’s more powerful features. My goal as a developer is to convert free users to Pro users, I want to be completely straightforward on this. You want developers to be straightforward on this.

Having said that, I hope a lot of people will buy the Pro versions of Tasktic when it launches in a few days, but I know that there’s a certain number of users who will like the app, but are never going to pay. This is fine by me, I intend to preserve the trust of those free users no less than of the paying customers; I can’t be sure I won’t change anything in Tasktic business model in the future, after seeing how the launch goes (I’m talking specifically about iAd in the free version). But this won’t change: users’ data, even if they don’t pay a dime, belong to them. The pillars upon which Tasktic is built are, and forever will be, 1. only you can access your own data and 2. your data syncs exclusively via iCloud (again, only accessible by you).

If you got this far, chances are you care about privacy and data protection, and you’re absolutely right because, as I said at the beginning of this long post, this stuff matters a lot. I hope you’ll think about it, in the future, when you download any app or subscribe to an online service: always, always look for the business model!
I also hope that you’ll consider giving Tasktic a try when it launches on the App Store, next November 5. It’s free, you know? And it keeps your privacy safe. Also, it’s fanTasktic because I made it with love and I’m better at app development than at puns like this. But, most important, I ask you to consider sharing this post with people you care about, but that you know aren’t always as tech-savvy as you are: they won’t like you implied they’re not tech experts, but they can use these informations to make better, safer choices.


Building Tasktic

🔗 October 27, 2015

Next November 5, the project I’ve been working on since February will see the light of day.

Tasktic is a task manager app for iPhone and iPad that is very easy to use, and yet offers many power-user features usually reserved to much more expensive productivity apps (Tasktic is free, with a $4.99 Pro version that unlocks the most advanced features forever). You can find more info, screenshots and a quick video preview everywhere else on this website.

In the days leading to the launch, I’d like to share with you some thoughts about the development of Tasktic: I enjoy “behind the curtains” development posts as much as the next guy 😏, so I can’t help myself…

Let’s start today with the elephant in the room: why did I feel the need of another task manager app and how do I think Tasktic can gain traction in such a crowded market?

Well, at least we aren't all going with the same idea for our icons...

Well, at least we aren’t all going with the same idea for our icons…

It’s true that there are a lot of task manager / GTD / to-do list apps out there, and some of them are really great and fully-featured products. But the good and most powerful apps in this category are often rather expensive and not many people want to spend 30 or 40 bucks on an app, so they’re stuck with built-in options that are quite basic or, worse, with fully-featured apps that are only apparently* “free”*, but instead collect and analyze users data (more on this in one of the next posts).

So, I thought that a task manager with a really friendly learning curve, but many advanced features, and with no entry price (but with absolutely no access to users data) could make a lot of sense for a lot of people. Not everybody with a smartphone is using a to-do list or a task manager, but almost everyone needs one. So, the market can be crowded of apps, but people buy new iPhones and iPads every second of every day and not every potential user is well served by the current options.

I think there’s still lot of potential for productivity apps, and I believe Tasktic has a place in this crowded category because:

  1. It’s very easy to start using Tasktic and adding new tasks never requires more than a few seconds and taps.
  2. The workflow can be as simple or as advanced as the user wants, with due dates, notifications, projects, tags, priority and notes. On top of that, Tasktic offers Siri and Reminders integration, a feature usually available only in the most expensive apps.
  3. It is a free universal app for iPhone and iPad that syncs via iCloud, so we have no way (nor we want) to access users’ data. Power users who need the most advanced functionalities can of course (and, please, do 😍) upgrade to the Pro versions (more on why I wrote “versions” instead of “version” in the next few days).

I’m not hoping to have millions of downloads (that’d be nice, though), but I do believe that happy users will find out that Tasktic can be a very helpful companion, and therefore they will tell their families and friends about it.

Feel free to start telling people about Tasktic now, if you feel so inclined, and please subscribe to this website via RSS to get the next posts about the design decisions and building process behind Tasktic.


Where am I?

In sunny Italy ☀️ 🇮🇹