Typefully Adds Images Support, User Mentions, and Other Improvements

Typefully, the great web-based tweet composer has received a very welcome update. Bringing images and GIFs support, user mentions, quoted tweets, and more.

Just like most Twitter clients, you can add up to 4 images per tweets. And because you just see a text representation in the editor, it’s pretty easy to move them around and get the perfect composition.

It also now supports username suggestions, which are pretty handy, since I for one have become used to this being standard. Which means there’s a good chance I’ll make a mistake if I have to do it manually.

There’s a ton more improvements as well, like quoted tweets correctly appearing in the preview, being able to copy a link to a thread from the sidebar, seeing your time zone when scheduling tweets, and even being able to escape HTML correctly.

While I don’t use Typefully as my main tweet composer, I have used it a fair few times when writing threads, or scheduling tweets.

I planned to use it quite a lot with the recent release of Text Case. I wanted to have an announcement thread scheduled, with maybe a few related tweets going out at later times as well. But the only thing that held me back was image support, so I can definitely see the value of these features.

Up next in the plans for Typefully are features like being able to see a calendar of your tweets, and also analytics. It sounds like Typefully could become a really useful tool.

Mac Power Users #569: Contextual Computing

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.

David Sparks also wrote a great blog post about contextual computing over at MacSparky, which you should check out if you’re intrigued by the idea.

You Can Now Send From an External Address in Hey

One hell of a feature has been added to Hey:

Now you can send email from your @hey.com address plus external email addresses, domains hosted elsewhere, work accounts on other systems, etc.
— Send from an external email address using SMTP

While this won’t entice me to make the switch, since I’m pretty happy with my email solution now. But had this option been available before my experiment, I might have given Hey a try.

I still think they should add proper custom domain support. Then I might be tempted to give Hey a try. Mainly because I could then keep my email address the same, and it should be relatively pain free (except the migration of actual emails if needed).

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.

It was too complex for me to even attempt using Shortcuts, and I’d need a few libraries if I wanted to write some JavaScript, so I couldn’t use Scriptable either.

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
  • Upload Image
  • Create Post

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.

Image Upload

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:

Post Creation

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:

  • Title
  • Slug
  • Content
  • Status (Draft/Published)
  • Tags

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:

  • Title
  • Slug (I thought this would be helpful, not so sure now)
  • URL
  • 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.

The App

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.

iOS 14.5 tries to solve Face ID’s mask problem with your Apple Watch

Chris Welch, writing for The Verge about the latest iOS 14.5 beta:

As first reported by Pocket-lint, the new iOS 14.5 update, which went into beta today, uses the Apple Watch on your wrist to quickly authenticate and unlock your iPhone. Apple already offers this convenient trick on the Mac, but now it’s coming to the iPhone as well.

It works similarly here. You lift your iPhone to turn on the screen, and you’ll feel a little nudge of haptic feedback on your Apple Watch to indicate that your iPhone has been unlocked. The devices must be in close proximity for this to work in the first place, which is a measure to keep your data secure. (If the Apple Watch is locked, this won’t work either.) And this Apple Watch shortcut is only good for unlocking your iPhone; App Store and iTunes purchases will still require other authentication if your face is covered.

This is a very interesting feature, and one I think will push a lot of people back on the beta builds again.

It's something that probably should have been done sooner. Especially since the Mac has been able to be unlocked from an Apple Watch for a long time. Nevertheless, it's certainly going to be welcomed by a lot of people.

My only hope is that it's more reliable than its Mac counterpart.

Text Case 2021.1

The major update to Text Case that I've been working on for a while is finally here!

🌟 Flows

The major feature of this update is the addition of flows!

These are customisable combinations of formats, that can be put together to create more complex and personal text transformations.

  • Tap on the + in the top-right to create a flow.
  • Tap on a flow to have it apply the transformation to your copied text.
  • Tap on the pencil to edit a flow.
  • Tap on the play button to open a scratchpad with the flow to test the transformation.
  • Long-press or right-click on a flow to access all functionality:
    • Format Clipboard
    • Edit Flow
    • Preview Flow
    • Duplicate Flow
    • Delete Flow

👀 New Formats

There are 8 new formats to use now!

These formats are more complex than the previous formats, since they all have customisable parameters.

There are:

  • Add prefix
  • Add suffix
  • Replace all occurrences of a given string with another string
  • Replace the first occurrence of a given string with another string
  • Replace the last occurrence of a given string with another string
  • Remove all occurrences of a given string
  • Remove the first occurrence of a given string
  • Remove the last occurrence of a given string

All of these new formats are available to use within a flow, and also via dedicated actions in the Shortcuts app.

⚙️ Share Extension Customisation

  • It can be configured to show just flows, just formats, or both.
  • You can also choose whether you want formats to have their default colour styling.

❇️ New Icons

There are 12 new icons to choose from! Alongside the previous 21.

💽 Download

This update is available right now for iOS, iPadOS, and macOS!

Experimenting with Email

I've been annoyed with email for a while, and I wrote recently that I wanted to find a new way to deal with it. I was mainly thinking about services like Hey, but I was also concerned that it's essentially an email replacement, not an email service that can be linked to other accounts or clients. So I had some thinking to do.

I decided to try and keep a log of my thinking while I tried various things, and then this log began.

The main reason behind keeping a log like this was to keep me trying new things. Even if it was a small tweak, just try one thing and see if it works. And at "the end", I could see my thought process behind the decisions, and the steps I made. I think this is important because I might have made a decision based on a whim, rather than treating it objectively.

There's also the fact that I find experiments fun, and it might be fun for other people to see my thought process.

Current State

I'll start with the current state of my email solution. I have three email addresses, my "primary" email address which is on iCloud, a Gmail account, and also a G Suite account which is linked to this custom domain.

Ideally, I want to switch to using one address, the G Suite one, but I know there's a lot of emails going to the other accounts. So it might be a painful process.

I also want some sort of system of organisation or automatic sorting. Because even if all emails go to one account, not all of them are important. And eventually, I want an inbox that has only important and urgent emails.

So now that's what I have currently, and also a few ideas for where I want to end up.

Monday, 25th January

Entry 1: After many recommendations, I signed up to SaneBox. I connected all three of my email accounts.

Entry 2: I shortly realised that dealing with SaneBox folders on three accounts would be a hassle. So I set one of my email addresses (least commonly used one) to forward to my ideal address.

The plan is to write off the third address by slowly dealing with all forwarded emails until none come through. Then I can focus on going from 2 to 1.

That leaves me with this:

  • Two email addresses:
    • iCloud (Primary)
    • Gmail → Forwarded to G Suite
    • G Suite (Ideal)
  • Email Client: Apple Mail (All devices)
  • Email Services: SaneBox

Tuesday, 26th January

Entry 3: Today I made the decision to remove SaneBox from my iCloud account, leaving it only enabled on the email I want to use long-term.

I plan on slowly moving important accounts and information to my desired address as they arrive in iCloud. Although I’ll have to be aggressive with deleting junk emails when they come in since I want to be able to keep on top of that account still.

Entry 4: I've seen a few emails being picked up by SaneBox and placed in the @SaneNews folder, it seems to be fairly accurate.

Entry 5: Strangely, it's becoming easier to deal with emails in my iCloud account. Maybe it's because I know I plan to eventually stop using that account, but whenever an email comes through that I like, I tend to quickly switch it to my ideal address. And the same with emails I don't want, they either get unsubscribed from, placed in the junk folder, or deleted.

Wednesday, 27th January

Entry 6: My use of email seems to have been whittled down to 6 places, which are probably quite predictable:

  • Inbox (Combined iCloud + G Suite)
  • @SaneArchive
  • @SaneBlackHole
  • @SaneLater
  • @SaneNews
  • @SaneNoReplies

To be honest, I'm not sure if I'll need to keep @SaneNoReplies around since I've only glanced at it once. And I can't remember a time where I've needed to wait a long time to receive an expected reply.

But it leaves me thinking that right now may be a good idea to try out a few email clients. Since I'm not exactly doing anything complicated. Thanks to SaneBox, everything is handled by moving emails between folders, which I assume every email client can do.

Entry 7: It's time to check out Spark. After a small amount of customisation, I think the macOS app will suit me. I slightly prefer the design to the built-in Mail app, although that's not a big enough reason to switch. But I do like how the sidebar only contains the inbox and favourite folders. It annoyed me that inside Mail, all accounts would be visible. Which was annoying if there was an unread email in the junk folder because for some reason it thinks that's important and shows it next to the account name.

I tried Spark a long time ago and didn't quite like it, but this time I've turned off a few of the features that got in the way. Such as showing avatars, smart notifications, calendar, snoozing, and a few more. It's left me with quite a modern email client.

Although I did leave one feature on, Smart Inbox. I have a theory that alongside SaneBox, this feature may be of some use. It means that any email that isn't automatically sorted by SaneBox may be sorted into separate groups like newsletters, pins, or seen emails. I think I'll have to wait a few days to see how good this actually is.

Entry 8: After today, my email situation is basically the same, but with a small tweak:

  • Two email addresses:
    • iCloud (Primary)
    • Gmail → Forwarded to G Suite
    • G Suite (Ideal)
  • Email Client:
    • Mac: Spark
    • iPhone/iPad: Mail
  • Email Services: SaneBox (G Suite only)

Thursday, 28th January

Entry 9: This morning I decided to go all-in on Spark. So my iPhone, iPad, and Mac all have Spark set up. All with the minimal configuration.

Everything seems to be good, except that I've noticed I'm getting a ton of junk mail today. Maybe Thursday is a popular day to send email? Although this does seem to be only happening on my iCloud email. Maybe that's because more people know about that email address, or because I have SaneBox on the G Suite account, I'm not sure. One thing is for sure, and that's I'm looking forward to not dealing with this account in the future.

Entry 10: I listened to episode 62 of Cal Newport's Deep Questions podcast where he answered questions regarding email. It mostly work scenarios, where you deal heavily with email, rather than a personal inbox. But I did come out with two things to think about:

  • Not everything needs to be an email. Maybe instead of finding a fix for an email problem, the solution is to create a separate process that doesn't use email.
  • Not all emails are equal. Some are more important and urgent than others.

Friday, 29th January

Entry 11: After settling making the change to having just two email addresses, I'm really contemplating making the switch to just the one very soon.

When I made the decision to forward all emails from a Gmail account to my G Suite account, I imagined I would need to deal with a lot of emails coming through that I needed to migrate. However, this hasn't been the case. This could be the fact that SaneBox is dealing well with the spam, or maybe I just don't get that through that account. Either way, I think I can mark that account as resolved.

The main issue I'm annoyed with at the moment is that my previous primary address (iCloud) just has so much rubbish going to it. I made the decision to not enable SaneBox for this account because I don't want to manage two versions of every SaneBox folder. But I think the organisation and filtering benefits of SaneBox are what I need with this iCloud account. Because otherwise, it might be a bit unmanageable. Therefore, I expect I'll end up setting my iCloud to forward all emails to my G Suite account.

Entry 12: I had a look through some more email apps on the App Store again, and I decided to try out Canary. Straight away I was presented with the option to upgrade to some kind of pro account, which I wasn't expecting. I don't mind paying for apps, but at least tell me why I should first.

After I found the trial button, I set up one of my email addresses in the app, and I was immediately turned off but the design. It seems like they've taken the native look of Mail but then tried to add their own functionality on top. Except it just looks a bit brutal to me. So I've already given up on that one.

Entry 13: I did end up forwarding my iCloud emails to my G Suite account, which means I finally have the one inbox to keep on top of. And also, I've got everything going through SaneBox, which I'm finding very helpful.

That means my email situation has changed even more:

  • One active email address
    • iCloud → Forwarded to G Suite
    • Gmail → Forwarded to G Suite
    • G Suite (Primary)
  • Email Client:
    • Mac: Spark
    • iPhone/iPad: Spark
  • Email Services: SaneBox

Saturday, 30th January

Entry 14: After looking at loads more email apps on iOS, I can't really find one that stands out as being better than Spark for my needs. Mainly because I don't need that many "smart" features, I have SaneBox to do its magic via folders, and that's it.

It led me to try to personalise Spark even more, and I think with what I've managed to do, I'll be settling on Spark on all of my devices.

As I wrote before, I've already customised what folders appear in the sidebar and turned off a lot of features like snoozing, so it was already customised. But now I've had a look at swipe actions and also the toolbar.

For swipe actions, I have these four:

  • Left Short - Toggle Read/Unread
  • Left Long - Move to @SaneLater
  • Right Short - Delete
  • Right Long - Move to @SaneBlackHole

I think they're a good fit, and will allow me to do nearly every common action via a swipe.

As for the toolbar, the items I have are pretty similar:

  • Toggle Read/Unread
  • Reply
  • Move To
  • Junk
  • Delete

I think I'd prefer it if I could add more specific folder actions, rather than a single action that brings up a list every time. But I think I'm pretty happy with my client set up right now.

Entry 15: Since I've got all my emails going to the singular email address now (even if most are being forwarded from other accounts), and that account has SaneBox enabled, I decided to enable notifications for all of my emails.

I wouldn't have done that before this experiment, because I would be getting too many notifications about emails I don't care about. But now I know that most of the unimportant or junk email will be being sorted before arriving in my inbox, I feel a bit better about being notified about my emails.

Hopefully, I'll only see important emails. But if I don't, I know I can move them to various SaneBox folders to further train the service.

Entry 16: I just read Matt Birchler's blog post, 'How I'm Using Hey Email, Almost One Year Later', and I think the way I've been using my email over the past few days is quite similar. Although, not using Hey.

So it's good to see that how I deal with email, is probably possible to an extent via Hey. I'm not sure I'd use Hey now, because of the lock-in, and lack of custom domain support, but maybe in the future? Who knows.

Sunday, 31st January

Entry 17: There's been no changes today, and to be honest I don't see myself making any changes for a while. My solution is working well, and I'm pretty please.

I now have four places where my email goes:

  • @SaneNews - Newsletters and mailing lists.
  • @SaneLater - This is a trained folder that has everything that isn't urgent.
  • Apps - This is a custom trained folder that will filter out anything related to my apps.
  • Inbox - Everything else goes here. And if it shouldn't belong in the inbox, I can move it to the correct folder, and SaneBox will do the same next time.

Final Results

I'm pleased to say that I have achieved my goal of reducing the email I receive, only using the one account, having a level of automated sorting, and also having methods to permanently block annoying emails via SaneBox's Black Hole feature.

I'm now using one G Suite email account, Spark as my client on all my devices, and SaneBox to keep everything working smoothly. I'm honestly surprised that I didn't need a ton of extra services to achieve a good solution.

Now, I know this post is very long. And to be honest, I didn't expect my entries to be as large as they are. Some of them could have probably been blog posts on their own. But I do think that having everything together and in order is much more valuable.

Even for myself, having this log to refer back to while doing this experiment has been helpful. That's why I think it might also be helpful to others that are wondering about what to do with their email solution.

I could have simply written a post at the end of the experiment with my final decisions and how I ended up with a solution. But I think with that, a lot of thinking would have been missed. So not every decision would have been clear. It reminds me of having to include your working out" when doing maths at school, rather than just writing the answer.

I'll probably end up doing more experiments like this in the future. It seems effective, and hopefully interesting to read.


Photo: (Yannik Mika via Unsplash)

Listen to Random Forests

I wrote a while ago about ASMR Rooms and what I called 'Adaptive Background Environments', and I've just come across something similar via Kottke, called Tree.fm.

Tree.fm places you in random forests, immersing you in the sounds, and also providing some nice photography of nature.

I really like listening to nature, forests especially. So I think I'll be using this for some background noise when I'm working, or even when I'm just relaxing. Like now, I'm reading some blogs, and listening to a forest.

All of the sounds are from a project called 'Sounds of the Forest', which form an open source library for anyone use. If you go to the website, you get a world map where you can see exactly where each recording came from.


If like me, you are a fan of nature, then I would encourage you to check out Ecologi. Essentially, it's a subscription service to plant trees and help fund climate projects.

One cool feature of Ecologi is that as you plant more trees, your online forest grows. My forest, Christopia (I couldn't think of a better name) has been going for 4 months, has 418 trees, and has offset over 9 tonnes of CO2e. __ If you use this magical link, we both get 30 extra trees.


Photo: (kazuend via Unsplash)

Being Late on the Internet

The internet can sometimes seem everlasting. Until it's not. And you notice that more when you're late to something.

That happens to me quite a lot.

This time, I've noticed a story involving GameStop, Reddit, and hedge funds. Apparently the Redditors did something together, which made rich people lose money. Or something.

Either way, I was late to the party.

I seemed to find the conversation after everything had happened, it had been picked up in the press, and everyone was offering their hot takes on it.

Maybe it's my personality, but when something gets to that stage, I just ignore it. Sure, I'll most likely see things mentioned on Twitter, so I'll possibly grasp a basic understanding. But I tend to just actively ignore things that I've missed out on, especially when it feels like a lot of effort to go back and understand a situation, that I just don't think will provide me any benefit.

What I need is for someone to say something like "Something interesting happened, X did Y, to do Z, but then A, did B, because of C". Then I'd say "Oh! That's interesting.", and move on with my life.

That might sound a tad drastic. But it's honestly how I treat news and events nowadays.

A while ago, I would treat every event and piece of knowledge as something I needed to understand. But recently I've realised that sometimes I'm just not that interested.

Dealing with Email

I’ve been thinking a lot about email recently. It’s been a thing that’s mildly annoyed me for some time. But the episode Federico Viticci and John Voorhees did on App Stories about email and switching to Hey, triggered me to properly think about my situation and my options.

So to explain my situation, I have three email addresses that I regularly deal with. An iCloud one that's kind of been my primary account for quite some time, a Gmail address that is tied to my Google account and a few other things online, and a G Suite account with my chrishannah.me domain.

One thing I've wanted to do for a while is to use a singular email address for everything. Ideally my @chrishannah.me one. I think I could make that work relatively easily, but it would most likely take quite a long time until I could be sure that everything important has been migrated. However, that's only one improvement I want with my email.

I also want a new way to deal with email. I find that too much nonsense gets through to my inbox, and even if I have filters to move some emails to various folders, it's still visible and distracting. So I want to stop some emails getting through to me, but also once I’ve dealt with an email I want it to get out of the way.

All of this is very much making me think about giving Hey a try. Except for the fact that I don’t want an @hey.com email address. I don’t want any new email addresses. But, if they add support for custom domains, I think I would at least give it a try. Although I do have some more reservations about Hey. Such as paying quite a large amount of money for an email service, when others are free. And also that from what I’ve seen, I’m not sure if I like how emails are organised once they are dealt with.

Maybe what I need is a client-side change, and that’s certainly possible since I only use email on the usual devices — iPhone, iPad, and Mac. Or maybe it’s something like SaneBox that I should try since I could migrate my emails slowly to one, and at the same time keep my current client apps (The default Mail app on all devices).

No matter what happens, I guess I’ll be thinking about email for some time.

I’ll try to write about anything I try along the way, and hopefully, I can find a solution that fits my needs.