Since getting my new Mac a few days ago, I’ve been trying to move my iOS writing automations over. However, one of the main shortcuts just wasn’t possible on the Mac. It’s the “Link Post” shortcut that I’ve been using for quite some time on my iPad.
It doesn’t exactly do much, but it saves a lot of time and effort. It essentially uses the share menu in Safari to pass the article and the highlighted text to a shortcut. From there, it extracts the title, author, and url of the article, along with formatting the selected text as a markdown blockquote (using my app, Text Case), formats it nicely, and creates a new sheet in Ulysses. Leaving me to add some comments to the sheet, before publishing it to my blog.
Turns out the Mac’s a bit more complicated, as while there’s a share menu, you can’t use it to launch a shortcut. So, my existing solution was out the window.
I tried a few other options that sounded promising, such as the “Get Article from Safari Reader” action that seemed to be precisely what I wanted. I’d be able to detect the URL somehow, and then be able to extract any information manually. Unfortunately, this action doesn’t work, and I’ve been told it hasn’t been working for some time.
After some experimenting, I realised that as long as I could have the URL and highlighted text, then I would be able to come up with something sufficient. Because from the URL, I can make a quick GET request, and get the page title. I haven’t worked out how to get the author using this method, but it wasn’t exactly reliable on iOS anyway.
My last option was to try to use macOS Services. I discovered that if I used a service from Safari, then it received the selected text as the input. And to top it off there was also a way to receive the “onscreen content” inside a shortcut, which in the case of Safari, returns the URL of the current page.
That meant I was able to combine the selected text from the input, and the URL from the onscreen content, and put together a link post generator.
After fetching the page title and url, the only thing it needs to do is to format the selected text as a Markdown blockquote using Text Case, and put it together into a nice format.
It’s definitely not the quickest shortcut, with it taking around 5 seconds to create the Ulysses sheet, but it’s definitely better than doing all of this manually. I also added a notification after the sheet is created, so you can be sure it’s done. And you also get an option to open the sheet straight away.
Inboxes can be wonderful things. They can be a source for news, communications, and more general notifications. But like most things, inboxes can become overgrown. And a little gardening is required to keep everything tidy and make the inbox as efficient as possible.
Most people call this a “triage”, which is essentially a process where you analyse your inbox, either when new items arrive or regularly, and immediately do a form of manual filtering and sorting.
What About Some Real Examples?
The most common example would be the email inbox. Everyone seems to have at least one email address, and all email (without any automated systems) lands in your inbox. It’s then up to you to deal with it. A triage process here could be regularly visiting your inbox, immediately dealing with junk email, filtering out any actions that need to be taken, and moving the rest of the emails to their appropriate place. Maybe you want to store email confirmations in a folder, or there’s some news that you want to read.
This process can take many forms and can be used in a vast number of situations. Many of them can be narrowed down to a form of an inbox, be it for emails, RSS feeds, or even the notifications on a device. But I also think triage happens in life, especially when you need to deal with many decisions as you go through life.
In my opinion, we all need to do a bit more triage nowadays because of the abundance of choice. Whether it’s content being thrown at you from various places, people/companies trying to get your attention or just a stream of decisions you’re presented with. With a bit of manual triage, you can discard unnecessary choices early on, prioritise essential decisions, and leave the rest for when you’re more interested later on.
How I Perform Triage
When I think about triage myself, I’m essentially sorting things into five categories:
Anything that I need to do
Actions that aren’t urgent but maybe interesting
The first action I do is remove the junk and anything else that I’m not interested in. I’m usually quite harsh with this part. Because I’ve noticed that if I think that I’m probably not interested in something, then it will just linger in my inbox until I’ve deleted it at a later date, so I may as well deal with it as soon as possible.
The second thing is to filter out any actions that I need to take. Maybe a bill needs paying, and I’ve received an email, perhaps a user of one of my apps has contacted me, and I need to get back to them. No matter what it is, if it’s something I need to do, it gets placed in my task manager (GoodTask) and prioritised.
After that, I work out if there are any actions that I want to do but don’t necessarily need to do. These things may be interesting newsletters, any interesting article that comes through RSS, or a notification that I might want to deal with soon.
At this stage, I’ve dealt with everything urgent and potentially interesting. The final steps are relatively quick because any important information is sorted into relevant places. For example, emails with account information go in a specific folder, order confirmations in another, etc. Everything else can then be archived or deleted depending on whether it could be needed in the future.
Of course, after this process, nothing is finished. I’m left with actions in my task manager, interesting newsletters, a trimmed down reading list in my RSS reader of compelling articles, and maybe a few notifications on my phone that I’ll need to deal with. But at least for that moment, the triage process is finished. And everything is more prepared for when I actually want to deal with the tasks later on. It’s essentially keeping on top of things, trying and please my future self, and ultimately saving time and effort.
A Few Tips
After dealing with inboxes of many kinds and slowly working out how to quickly and efficiently triage items, here are a few tips that I think may help people:
Delete all junk and anything useless straight away. This may sound obvious. Because, why wouldn’t you delete junk? My point specifically is that you should do this first. Because filtering out nonsense is probably the least taxing part of this process, so I find it best to get this out of the way first before taking a bit more effort to sort items on things like urgency and importance.
Don’t be afraid to remove something that isn’t interesting. This follows the same aim as the above point, where the idea is to clean first and then deal with whatever is left. I found that I usually kept “interesting” articles in my RSS reader for ages, and while it bugged me that the kist kept growing, I was sure that these things might interest my future self. It turns out they never did. I’ve now learned that if I’m not interested in something, whether it’s a newsletter, article, or anything, I archive it. My future self can search through the archive if it turns out to be important.
Try not to take too long. The purpose of triage is to filter and sort items that come in an inbox quickly. So the longer you spend on this task, the less valuable it becomes. Because if your triage process is lengthy, you may as well deal with the actual items properly.
Determining non-negotiable can cut down time. I think this applies to most life decisions and can apply to things like triaging email, cleaning your RSS feed, choosing a holiday destination, buying a computer… Because you can make nearly every decision faster if you can eliminate anything non-negotiable early on. Maybe it’s that your holiday destination needs to be a certain distance from a beach, your computer needs to be light and easy to travel with, or that you’re not interested in a particular topic. By eliminating these things early, you can reduce the mental load of a decision and spend more time on what remains or spend less time and make decisions quicker. One example that I have is that I’m not interested in US politics, so if I get a podcast episode in my inbox or an article in my RSS reader that’s focussed on US politics, then I get rid of it without hesitation. I can then spend my energy on something more important to me.
Going a Step Further With Automation
I wrote about my experimentation with email a while ago, and a major part of my end solution was the addition of SaneBox. The main benefit of SaneBox for me was to act as an automated form of triage. So when emails come into my inbox, news gets moved into a specific folder, the junk gets filtered out, and some emails that aren’t important are moved to a “Later” folder.
A lot of this functionality can be built up manually with email rules that most providers support, but the advantage of SaneBox is that you can teach it. So, for example, if I get a newsletter that it hasn’t picked up, I can manually move it to the @SaneNews folder, which will inform SaneBox that this is a news item, and it will be automatically sorted the next time an email from that sender is delivered.
I haven’t had a lot of dealings with email automation, but I have set up various sorting rules in a few email accounts before, and it can be a very valuable tool. And like I just said, SaneBox is a level up from that, so if you want even more power, I would suggest giving that a try. I know Hey also has some interesting automatic sorting features, so again, that’s one to look at if you’re interested.
GlanceCam is an app developed by my friend, Cesare Forelli, and it’s once that I’ve admired for a long time. In short, it’s an app that lets you view IP cameras from your Mac. But in reality it’s so much more, especially with the recent major update.
It’s a relatively minimal design, however it’s still packed full of functionality. It support multi-windows, always on top, 4K streams, you can use it to sent HTTP GET commands to your devices, keyboard shortcuts, a URL scheme, AppleScript support, and so much more.
This app is probably the main reason why I’m thinking of investing in some cameras for my house.
As much as I’m a fan of automation, I can’t say I’ve ever done much of it on the Mac. When I was very young, I used Windows computers and wrote quite a few batch scripts, but nothing that complex. When I switched to a Mac, I didn’t really have the need for automation, or at least I wasn’t aware of how it could benefit me. It only really clicked for me on iOS with Workflow Shortcuts.
As I’ve been a programmer for quite a few years, I have made a few tools for myself in the past. But weirdly never any automation. I’ve checked out Keyboard Maestro and Text Expander before, but to be perfectly honest, I didn’t think they were that interesting. The most I’ve done is set up Hazel to move screenshots into a certain folder, and to empty the trash when it gets to a certain size.
But even the minimal experiences of automation I’ve done on the Mac have been after I was really introduced to the concept of automation over on the iPad. And while I think Shortcuts can be improved in so many ways, I much prefer the simplicity of any Mac automation tool.
I think the problem comes from myself never really being a “power user” of the Mac. I’ve used it as a tool for school work, to develop software, and to play games. I don’t use Automator, I can’t be bothered to write scripts, and in general, I’ve never felt I needed anything automated. It’s also why Text Case for Mac has only just gained support for Services because I don’t use them myself.
Perhaps I should at some point attempt to try out automation on the Mac again, but I’d think it has to be a third-party tool, rather than anything built-in. But what I’d really want is for Shortcuts to come to the Mac. It would obviously need to work slightly differently, but I still think that it would provide a much more user-friendly experience than anything like Automator.
This may be incorrect, but at least my perception of automation on the Mac has always been something that’s only done by really professional users, or people with super complex workflows. But on iOS, automation is something that anyone can do.
I don’t link to podcast episodes that often here on the blog (maybe never?), but I had to share this episode about contextual computing, since I found it really clicked with me, and I think others may find it useful.
They talk about how you can build yourself processes on your computer which are specific to certain contexts, and allow you to reduce any friction or distraction when trying to complete tasks.
A few examples:
Launching your task app and opening a specific project instead of being presented with all of your tasks.
Launching a document from a task instead of having to navigate and find it manually.
Storing URLS in an easy access location, like a Shortcut with a Show in Menu action with all the links, so you can access them without being distracted on the web.
Adding content to a document without needing to open the app, find the document, etc. I use this to save interesting links in Craft that I may want to write about at a later point.
This idea resonated with me a lot, and I think it’s because partially I do this already, although at a smaller scale, and also because it just makes sense.
If you have a project to do, and that project has various tasks, documents, links, associated emails, etc. You can just create a central document in an app such as Craft, that can contain links to all the relevant information. So there’s no browsing to find a webpage, or searching through your email app, all the relevant pieces of information can be collected in a single place.
It might sound a bit weird, but after you listen to the episode I guarantee it will make sense.
How I Managed to Automate Posting to My Ghost Blog #
For those that don’t know, this blog runs on the Ghost blogging platform. A platform that is notoriously not that good at dealing with automation, or working from iOS devices, since they don’t have their own apps, and rely on third-parties integrating with their API.
The app I use for writing right now is iA Writer, and luckily for me, it has integrated with the Ghost API. So after I created an API token from my blog’s admin panel, I was able to publish to my blog. Except that you can only publish drafts, you can’t control things like tags or the slug, and the title is the name of the file, not the typical H1 title from the Markdown content.
I wasn’t happy with the process, since I had to use the web interface for every post, but I just got on with it because there wasn’t an alternative.
But, I’ve been looking into Craft recently, and it reminded me that my publishing workflow isn’t flexible at all. So there would be no chance of me publishing anything from Craft.
Ghost Admin API
That lead me to have a look at the [documentation for the Ghost Admin API]. Which to be honest I think is pretty bad, it’s written like a blog post, rather than clearly defining each request. Plus they override the ⌘ + F keyboard shortcut for a stupid search tool, so that made it more difficult to find anything.
After I got to grips with how it worked, I realised that it would be too much of a hassle to interact with the API just using the Shortcuts app. Simply because of the authentication method. It uses a signed JWT token, which isn’t a bad thing, but it is when you have to construct and sign the token yourself.
After you add a custom integration to your blog, you can find an “Admin API key”, which sounds pretty good. Except this isn’t a ready-made key that you can use for authorisation. First of all, this key is actually two things, one half is a key that goes as part of the kid inside the JWT token, and the other half is a string that you need convert from hexadecimal into bytes, and then use that to sign the JWT token.
Which meant the only option was to write an app instead.
Although, not a fully functioning app, I only actually wanted a few Shortcut actions. So I ended up creating a SwiftUI app that looks like this:
However, there are actually three Shortcut actions that it provides:
Get Blog Info
The first one isn’t actually needed, but I used that to test out the Shortcuts action and API integration, since it has no parameters, and doesn’t require authentication. It just fetches some basic information about a Ghost blog.
But the first real action I worked on was uploading images. It was a bit tricky, dealing with accepting a file as an input, and then getting the data in a state where it could be uploaded. I had an issue for a while where the app didn’t have permission to access the file, so I had to copy the data, write it to the app, and upload it to the blog.
I’m not too sure how stable this action is, especially since the endpoint only accepts a few image formats (not HEIC). So I have to do a conversion first. Although I’m doing this in Shortcuts for simplicity. But at least it works!
Here is the Shortcut I’ve created to upload an image:
Now the big one, creating posts. This was a slightly bigger task, but a relatively straightforward one to build.
There are five parameters in the Create Post action:
Essentially, they just all need to be passed on to the API. A bit of formatting is involved, with the tags being parsed from a comma-separated list to an array of strings, and the HTML content being wrapped in Mobiledoc format (which is what Ghost uses).
There is a ton of data in the response, but since I don’t see most of it being useful, I only look for four pieces of information:
Slug (I thought this would be helpful, not so sure now)
Featured Image URL
I’m only using the title and URL in my shortcut right now, as it’s still pretty simple.
The first part of the Shortcut deals with the title. First of all, it removes the first H1 from the document and also extracts the title without formatting for later. This was taken from Federico Viticci’s Publish to WordPress shortcut.
After that, I use my app Text Case to format the title into AP Title Case, convert the Markdown content into HTML, and also to create a slug from the title.
Then I run it through the new Create Post action.
From there I have the post information, which means I can automate sending a tweet about the new blog post and launch the page in Safari.
It’s good to have publishing to the blog and Twitter in one place because I plan on experimenting with different types of posts on my blog soon, so it’s nice to have control.
To be honest, I don’t think the app will ever go public. That thought did pop into my head a few times while building it, but it will take a bit of work to make it user-friendly. I’d have to untie it from my blog, add some stability, and maybe even do error handling. Because right now, it either works or it doesn’t.
But you never know, maybe this is an idea I can take further? Not sure how much I’d need to charge for it though, since the number of people that have a blog, use Ghost, want to automate the process, and also want to pay money for it, is probably quite low.
In iOS/iPadOS 14.3, a long awaited Shortcut action will return. The ‘Set Wallpaper’ action. Couple this with the automation feature of Shortcuts, and you can build something simple, but very fun. It’s still in beta right now, so if you’re running the public release you will unfortuantely have to wait just a bit longer.
But for people that are running 14.3, you can make use of these two shortcuts I’ve created that rotate your wallpaper.
The first one simply looks in an album for photos, gets a random one, and sets it as the wallpaper. So you can just add/remove photos from the selected album, and let the shortcut pick it up.
The other is a bit smarter, as it has the option to choose a seperate for light and dark backgrounds. so depending on the current appearance that is set, it will choose from a seperate group of photos.
To use the shortcuts, you will need to specify the albums before you run them, but apart from that they’re ready to go.
While these shortcuts will change your wallpaper, the magic comes in the automation. Using the Shortcuts app, you can use various triggers to run a shortcut. I haven’t found a way to pick a time interval to have it automatically repeat, but you can just pick certain times of the day and have them each trigger the sa me shortcut.
I’ve just gone with a simple trigger of sunset every day, because I don’t personally want it changing all the time. But having a new wallpaper every day seems good.
What I would like in the future, is if you could trigger an automation based on dark/light mode being toggled. Or if you could somehow create one of the adaptive wallpapers that switch between light/dark mode automatically.
When making an automation, make sure to disable ‘Ask Before Running’, otherwise you will need to okay it every time it runs.
As soon as I read the article, I was instantly struck with ideas on how I could make use of a similar integration.
Personally, I don’t have a big problem with being able to save money. I have a structure to my savings, and I’m very strict with myself to make sure I separate a portion of my wage every time I am paid.
What I do have a problem with is choosing when to spend money. I mean to say I have so much money I don’t know what to do with it. I wish. But in general, I have a problem associating value to a purchase. For example, I purchased an iPhone 12 not long ago, but I probably wouldn’t spend over £15 on a t-shirt, or even £60 on a pair of shoes. Whereas there are a lot of people that see enough value in a pair of shoes to spend quite a lot of money on them.
I tend to place a higher value on computers, whether it be a smartphone, tablet, or real computer. The main reason is that it’s what I’m interested in. But I also use these products as tools in my life, and also to get work done. I use these products to develop apps, write for this blog, and the usual stuff like gaming and social media.
You’d think I’d be fine spending money on new iPhones, iPads, and Macs. But instead, the “normal” part of me usually decides that a new device probably isn’t worth it, since a lot of times the current device can cope with what I’ll end up doing on it. It’s the reason why I own an iPad Pro 10.5", even though I’ve been wanting a 12.9" pro ever since they were available. I must admit, I was close to buying the model that came out earlier this year, but it didn’t seem like a big enough update to force my hand.
But I still have that constant thought in my head that I need that 12.9" iPad Pro, and especially the new Magic Keyboard. Although to be fair, I don’t need it, no-one needs an iPad. I want it, for quite a few reasons, but that’s not relevant here (I’ve already dragged this out too far anyway). Let’s now get to the point.
There would be no point of all this fuss if I didn’t have some kind of goal, or to be specific, an amount of money I want to save. So the goal I’m setting myself is enough to buy a 12.9" iPad Pro (I guess that should be obvious by now). The model I want will be around £1000 I reckon, so that will be my target.
Alongside the iPad, I will also want the Magic Keyboard to do my writing on. But I’ll leave that as a secondary goal to do after if this one goes well.
In the article by Matt Brunt, he set up an automation as a fun way to put some money away. But I’ve also seen other people in the past use it as a punishment, where they track some performance metric, and if they don’t hit it then some money gets donated to charity (or somewhere else). Or others that use it for saving may use an environmental action to trigger the saving, something like every time it rains, a tiny bit of money is saved for a future holiday.
I have a theory that this automated saving technique could be used as an incentive, rather than something negative. Instead of punishing bad behaviour by putting money away, I plan on rewarding good behaviour by allocating money towards something I want to buy.
In this case, the reward will be buying an iPad Pro for myself, and the behaviour I want to use as the trigger will be publishing blog posts.
To me, this seems like a perfect fit. I want to get myself into a habit where I’m writing at a good pace, and regularly publishing to my blog. And I’d really love to eventually be doing that on the big iPad. So while I’m building up a habit, I’m also going to use this experiment as a way to prove to myself that I do actually want to write “long-term” and it’s not just an occasional hobby.
For the automation, I’ll be using a combination of the blogs RSS feed, IFTTT, and a specific pot in Monzo with an associated goal (Which has a cool image that I built using Robb Knight’s tool, and is the featured image of this post).
It’s a pretty simple process. Whenever there’s a new item in my blogs RSS feed, money will be transferred into my pot in Monzo. Eventually, I’ll hit the target, I’ll order the iPad, and all my life’s worries will go away (I think this is how it works?).
I’ve chosen the amount to be £1 per blog post, so it’s pretty easy to calculate how many I’ll need to publish before hitting my goal. 1000.
I had an idea on somehow basing the amount on the length of the post, or if it’s a simple link post, but I think if I add to complex I probably won’t ever complete it.
Anyway, this post will serve as the first out of 1000, and will fortunately/unfortunately cost me £1. Which means I’ve now got to go and write and publish another 999! Wish me luck.
A bit of a weird headline, I know. However, to be honest, this post was originally going to be a short aside, about myself being delighted with the delay function on my washing machine.
For content, I bought a house with my girlfriend a little over 18 months ago, and the seller left a perfectly functioning washing machine. It was always something we were thinking about replacing at some point in the future, especially when after a few months we noticed that it would occasionally leak water from the door. Probably just needed a new seal, but it was old anyway, and it didn’t fit the style in our kitchen anymore.
Luckily for us, a few weeks ago someone in my girlfriends family had a washing machine going spare (moving house), and it was in pretty good condition. So we gladly took it off their hands.
Fortunately for me, it had a delay function. I know it’s not advanced technology, I’ve seen what you can get for stupid amounts of money. But it’s enough to do the job for me.
The only issue I have with doing the laundry is that I always feel the need to do it at weird times. For example, it’s 22:00 and I’ve only just put a load of washing on. That’s not a problem in itself though, the issue is that I would prefer to have it freshly washed at a time where the sun is out and I am free to put it outside to dry. Right now, that time is around 12:30pm. Because that’s around the time I take my lunch break, and it means I can get it put in a few minutes, and it dries pretty quickly.
So by having a delay function, I’m able to be sporadically productive at weird times, put a load of washing in the machine, and set it to be ready for exactly when I need it. Except, the delay is exactly that, a period of time before the function starts, not a set time for it to run or finish by. Also, the precision is to an hour. So the only calculation I need to do is to work out the number of hours until noon the next day, and then subtract however long the wash duration is. Not exactly a hard calculation, but I’m lazy. So I came up with a needlessly complicated shortcut to do it for me.
If you’re expecting something minimal that just does the job, then look away now. This may look a mess, but it produces a pretty nice output.
First of all, it asks for the time that I wish the washing to be ready. In most cases this will be 12:00, so that’s the default value. It then formats this time, so it can be used later in the format, and stores it in the Washing Time variable.
Afterwards, it calculates the time between the current date and time and the selected time (which by default uses the current date). It’s to check whether that time has already passed in the current day or not. If it has passed, then I must mean tomorrow, if not, then it’s today. I could simply prompt for input, but if I can save any interaction then I will.
If it determines that I must mean tomorrow, then it adds 1 day to the date stored in the Washing Time variable, and also sets a new variable called Today or Tomorrow to “tomorrow”.
If it’s for today, then the date stays the same, and Today or Tomorrow is set to “today”. This variable is nothing special, just a string that I use later on in the final message that appears. This if statement was just a good place to put it, to avoid duplicate logic.
Now it knows the date and time that the wash needs to be ready by, it also needs to take into consideration the duration of the wash. Similarly to the previous input, the most used wash on my washing machine is 76 minutes, so I put that as the default to make it easier.
That duration is subtracted from the earlier calculated wash time, this will be the time that the wash needs to start. It then calculates how minutes there are until that time.
That duration is now formatted into an Hour:Minute format. The minutes are first calculates using the modulus operation, and the hours are calculated by removing the aforementioned “minutes” value, and diving by 60.
There is a little if statement afterwards to check if the minutes value is less than 10. This is to make sure the minutes are always formatted as two digits. There could be a better way for this, but I know that this way works.
After calculating the delay needed, it wraps it into a friendly message with all the information I may or may not need.
Example: 🕰 The required delay for a 76 minute wash to finish today at 12:00 is 10:32 🧼
Now I’ve finished writing about this, it has occurred to me that I’ve blown this problem completely out of proportion. But it was fun, so who cares?
I came across Charty recently on Twitter, and it looks like it’s going to be a great addition to the growing collection of apps that are designed to slot directly into the Shortcuts app.
After playing around with it, I was going to write an in-depth article on what I thought about it, but instead I’ve found three articles that I think explain it really well. And they also include examples so you can see what type of charts you can create.
This is one of those apps that at first you dismiss, but when actually looking around the app you realise just how helpful it can be. That’s because developer Rodrigo Araújo has thought about almost every aspect of the app. Building on the success of his first app ChartStat he aims to make it easy for everyone to visualise any kind of data.
Making charts by hand is labor intensive. But it gets easier if you can make the chart one time and just update the data as new numbers flow in. If that sounds like a job for user automation, you’re singing my tune—and I’m happy to report that the new app Charty is built to add charting capabilities to the iOS Shortcuts app.
There are lots of Shortcuts actions and routines that generate data and could easily benefit from a simple bar graph or pie chart to provide useful insights more quickly and effectively. One example that comes to mind is graphing time-tracking data from Toggl once every week, let’s say, to see what tasks or projects you’ve been the most busy with — all without having to open the unpleasant Toggl app or the clunky web client from your iOS device. Charty is the perfect companion for those who accumulate lots of meta-data about their lives and want to frequently revisit and reassess the areas they are seeking to improve — whether that be calories burned, books read, or tasks completed, Charty plugs right into your existing Shortcuts routines and allows you to quickly turn those datasets into easily-digestible graphics. The option to create default chart format settings and custom “Export Profiles” of chart size, font size, and background color both help to add consistency in how your charts are formatted before saving them for yourself or sharing with the world.