“Who is this built for?” It’s a good question to consider from time to time.
If you’re an app user, you might think it’s you. You did, in fact, navigate to it in an app store and then download it to your device. You also signed in and chose what you wanted to see — but ask yourself: Which content can you fly through — fast-forwarding or rewinding to your leisure — or even skip if you want? Is it the content that you sought out, or is it the ads?
I’ll give you a hint, the content you can’t skip through…that’s what the platform was built to serve. Its creator and their interests. Too often, that’s not the end user, and their experience degrades accordingly.
I really wish that ‘Weave’ had won out as the brand name for the smart home communication standard over ‘Matter’.
Weave was the protocol that Nest had developed to go with their ‘Thread’ radios (think similar to Bluetooth or Wi-fi radios).
Seeing as Thread radios are still at the heart of interconnected devices with Matter, that whimsical many-threads-make-a-strong-weave analogy would be easier to explain than something as esoteric as ‘Matter’.
I like names that make sense, and Matter-the-home-standard doesn’t have one of them. At least Matter-the-reading-app has some logic behind its name. It comes from a quote and book by storied author Ursula K. LeGuin:
Typically the most tight-lipped tech company regarding future products, Apple has intentionally revealed what to expect from them over the next ten years. That’s right, even though something as longstanding as WWDC gets the “Apple today announced” treatment each spring, we can write in an entire decade of products on our BINGO boards.
Okay, enough of a lede. Which product is it? Major League Soccer on Apple TV, of course. Apple announced in November that they were committed to a ten-year deal with MLS to be its exclusive streamer, with deep hooks into the matches and how they’re presented.
That’s big. Really big. Especially since Apple TV+ has only been around since 2019 — just three years. In striking this deal, Apple has communicated to the world that it’s in it for the long haul with Apple TV content. I don’t know if it has ever pledged to ten years of anything before. MLS Season Pass is a massive commitment to the Apple TV streaming platform.
3️⃣ This three-minute episode of The Good News Podcast made my day. It warms my heart when people humor children and play within their imagination. [🔗 The Good News Podcast // overcast.fm]
5️⃣ I’ve started testing out the beta of Reader by Readwise. It’s an impressive read-it-later and highlighting app, contending against my long-term favorite Reeder. You can sign up to try it out for free, too! [🔗 Reader by Readwise // readwise.io]
6️⃣ I feel like I’ve been just one step behind Greg Morris on his whole internet presence journey for a while. So I guess this post about re-splitting social media from blogging could be a look at what I’m doing next. [🔗 Greg Morris // gr36.com]
A weekly list of interesting things I found on the internet, posted on Sundays. Sometimes themed, often not.
1️⃣ I saw that the Craft team added a new AI tool to their writing app, but hadn’t yet looked into it in detail. David Sparks has a good summary of its features, but the Craft AI Assistant produced an astounding summary of his summary. Not just good for a new beta tool; it’s all-around well-written. These tools are taking off at the speed of light, and I’m equally impressed, wary, and excited about how they’ll be used next. [Link - David Sparks // macsparky.com]
2️⃣Speaking of Lachlan’s incredible website, here’s their list of other web design marvels. Seeing all this stuff makes me sort of wish that I’d studied web development. I suppose there’s always still time. [Link - @lachlanjc // notebook.lachlanjc.com]
3️⃣ Such highs and lows in this story of love found, and the grief in losing it. I can’t imagine the pain of losing my life adventure buddy, but this superb storytelling gets me close. Caution: It got me emotional. 😢 [Link - Dirtbag Diaries // pod.link]
4️⃣ Here’s a tip I learned on Mac Power Users: Apparently, even when your watch is turned off if you hold the digital crown down for just a moment, it will display the time. I guess this would be part of Power Reserve, but it works even if you turn your watch off manually with plenty of battery charge left. Handy! [Link - Mac Power Users // overcast.fm]
5️⃣ Cyclemeter is an incredibly customizable bike computer app for your phone. I want to share more on this soon, but it’s both exactly what I wanted and the only thing I’ve found that allows me to combine the smarts from my phone, watch, and third-party cadence and speed sensors for my bike rides — without having to purchase a dedicated bike computer and heart monitor. [Link - Cyclemeter // apps.apple.com]
6️⃣ My favorite screenshot tool for Mac, CleanShot X, got an awesome new update this week. Now you can fix up misaligned captures, and add beautiful background colors and images at specific aspect ratios, and more. I’ve already gotten use out of the new features. Matt Birchler made the official announcement video for CleanShot X, and a more personal video about it on his A Better Computer YouTube channel. I watched and enjoyed them both. [Link - A Better Computer // youtube.com]
7️⃣ Another podcast recommendation incoming. Micro Monday is a delightful little show in which Jean MacDonald, Community Manager at Micro.blog, interviews a Micro.blog member about their blogging origins. Usually 20 minutes or less. [Link - Micro Monday // pod.link]
That was a neat way to archive the day’s major headlines for future reference, so I added the shortcut to my library and gave it a whirl. It had a couple of issues on the first run, possibly due to Shortcuts itself, so I updated it to use the latest Day One ‘Create Entry’ action and to save the cover as a PDF file rather than a JPEG or PNG. Oh, and I made it name the PDF something sensible while I was rooting around in there. With those changes, the shortcut worked beautifully, so I created a Personal Automation to have it run in the background every day at noon.
But, if the point was to save these covers as reference items, did I want my archive to only go back to December 11th, 2022? As a completionist, that was unacceptable. Fortunately, Shortcuts makes repeating an action over and over and over again a breeze with the ‘Repeat’ action. With just a few quick additions, I created a companion shortcut that allowed me to save over ten years of NYT covers in a matter of minutes.1
1️⃣ We start with an ‘Ask for Input’ action and set it to ask for a date (time isn’t necessary). I put the default date to be August 1, 2012, because that was the month furthest back that returned a cover for each day.
2️⃣ You might think that with the addition of Magic Variables in Shortcuts way back when it was still Workflow, there’d no longer be a need for manually setting or getting variables. I certainly did for a while. But it turns out that those actions do have their uses. In this case, it’s to change the variable we use for each round of the ‘Repeat’ block later.
With that in mind, we use a ‘Set Variable’ action to save the starting date as the Date variable.
3️⃣ Here, we use a ‘List’ action to provide options for the number of days we might want to save in a row. I added some helper text next to some of them as a reminder of which months and years have certain numbers of days. Watch out for those Leap Years if you’re saving a year at a time, lest you miss December 31st’s cover.
4️⃣ A ‘Choose from List’ action allows us to pick the number of days and pass it on to subsequent actions. Because of that helper text, though, we need to isolate the number of days from the rest of the chosen item to use it in our ‘Repeat’ block below. We accomplish that with a ‘Split Text’ action which breaks the Chosen Item variable by spaces, followed by a ‘Get Item from List’ action to grab the first of the split items.
5️⃣ Next, we add the ‘Repeat’ action and set the number of times parameter to the chosen item variable from the last step. I’ve named it Number of Days.
It’s critical that we put a ‘Get Variable’ action here to call up the latest version of Date. On the first round, it’ll be the literal date you selected. But on subsequent repeats, that Date will change, and we need to get it each time.
After that, a ‘Text’ action lets us format how we want the PDF and Day One entry to be named eventually. I went with “New York Times - Month Day, Year”, but you can change it if you want. Add the Date variable in that text, and then tap or right-click it to select the date format; in my case, it’s the long version.
6️⃣ The meat of this shortcut is downloading the NYT cover, which we do by using their (blessedly) consistent static URL scheme. Putting the Date variable within the ‘URL’ action — using the custom “yyyy/MM/dd” format — gets us to the right place on the internet.
A ‘Get Contents of URL’ action, using the GET method, downloads the file as a PDF.
7️⃣ We use a ‘Set Name’ action with the Text variable from earlier to avoid the PDF being named a generic “Scan.pdf” and then save it to Day One with their ‘Create Entry’ action. Use the Text variable again to give the journal entry the same name.
Hit ‘Show More’ on that action to reveal optional parameters like which journal to save it to, which tags to add, and the creation date you want it to be saved under.
8️⃣ The last actions for the ‘Repeat’ block are the all-important ‘Adjust Date’ and ‘Set Variable’. We add one day to the Date variable and then reset Date to the new Adjusted Date. That way, Date will be the next calendar day when the ‘Repeat’ block goes again.
And that’s it!
Click to reveal the ‘Repeat’ block with all actions expanded.
This was a fun challenge and a great way to reprime my brain to think about how setting and getting variables within ‘Repeat’ or ‘If’ blocks can unlock much more powerful workflows. Plus, now, when I use the ‘On This Day’ feature of Day One, I can remind myself of what was noteworthy around the wider world in years past.
Well, getting the process started took mere minutes. But beware, once the covers start having pictures (the earliest available years don’t include them), the downloads slow down significantly.↩︎
They say that opposites attract. While I don’t think that’s always true, I will say that my wife is a self-confessed non-techie. So I was both surprised and delighted when she took me up on an offer to learn how to build an automation in Shortcuts.
You see, she had asked if there was a way that we could get the heat turned up earlier in the morning now that she’s starting new shifts at work that require her to get up around 5:30am. Our Ecobee thermostat is programmed to cool off to 62°F while we sleep or are out of the house and rise to a nice 69°F starting at 7:00am.
The frugal part of me was reluctant to have the house heat so early, seeing as her early shifts are sporadic, and it seemed wasteful to have it heat for an extra hour or two while we’re usually in bed.
I thought about how we could easily instruct the thermostat to heat the house extra early only on her 7am-7pm shift days. My mind started whirling through the possibilities: Could I build something that looked through her calendar to identify the early shifts? Maybe she should run a shortcut that writes a value to Data Jar the night before, and then we’d scheduled Shortcuts to check that value to determine the heating time. All complex, convoluted, and hard to explain; not, therefore, a winning pitch for someone who prefers the house to be less “smart”.
Luckily, sanity won out in the end, and the perfect solution popped into my mind: a personal automation in Shortcuts that triggers when her phone’s alarm goes off. I’m the sort of person that sets a different alarm every morning based on how late I stay up, but my wife is quite consistent on when she gets up for work. And Shortcuts offers an automation trigger based on specific alarms. I explained how it would work — namely that she wouldn’t have to do anything differently; she’d continue to use the same alarm that she always does for the early shifts — and offered to help her set it up on her phone. Here’s what she made:
You can select among all your existing alarms for the specific one you want to be the trigger. I recommend naming it first, so you don’t lose track! She went with action starting when the alarm goes off — as opposed to when it’s stopped — so that the furnace can do its thing even if she hits snooze once (or twice). In the ‘Control My Home’ action, you select the accessory or scene you want to set and then long-press it to adjust it to the desired setting.
Back on the overview page, we turned off the ‘Ask Before Running’ and ‘Notify When Run’ toggles so that there are no extra barriers between the alarm sounding and the furnace starting.
Automations don’t get much more straightforward than this. It’s just a knowable trigger and a single action. But despite being a cinch, this automated task could bring more value to my wife than any of the countless tech tips I’ve shared with her over the years. And I can feel vindicated that the smart home is an improvement. It may end up being the gateway drug to more convenience automations… Only time will tell. In any case, for a few days now, my wife hasn’t had to endure a cold start to her already early mornings, and I haven’t had to worry about it either.
Now that’s technology at its best.
Or as Apple calls them, ‘When’ and ‘Do’. I applaud them for the approachable terminology.↩︎
I’ve been kicking the tires on Micro.blog lately. I’ll have more to say on the subject soon, but the gist of my interest is that owning each of my homes on the internet — including social media — is very appealing. But I’m not yet ready to abandon the friends and relationships I’ve made on Twitter and Instagram. Micro.blog has a handy guide for importing old Instagram posts, but not new stuff. So I’ve been looking for a way to get new posts from Instagram to Micro.blog automatically. The two established ways were non-starters for me. Zapier requires a costly premium subscription to use the necessary Webhook action. And it sounds like OwnYourGram is being hamstrung by Instagram and won’t
work for new users, if at all.
So I created a solution myself!
Enter Make.com
After recreating the Zapier recipe using this post as a guide, I found it would cost $19.99 per month to use the premium actions. So I looked for a more cost-effective solution, remembering something called Integromat was an up-and-coming Zapier/IFTTT competitor.
Integromat is now Make.com and has a much more generous free tier than Zapier. After five modules and lots of trial-and-error, I got a working scenario (as Make calls them) that works as a (relatively) simple and free way to cross-post from Instagram to Micro.blog and retain control over that aspect of your social posting.
Note that you may need to run each module individually as you build it to make the necessary fields available to map in later modules. This was the trickiest part for me since it didn’t want to pass the latest Instagram post along more than once.
(Step 1) Watch Media from Instagram
This first module connects to your Instagram account and watches for new posts. It collects information about the post when it runs.
(Step 2) Download Media from Instagram
Next, map the Media ID from Step 1 so it can hold onto the image for later modules.
(Step 3) Make an HTTPGET request
Use the https://micro.blog/micropubURL, GET Method, and for Headers, make sure you leave just one space between “Bearer” and your Access Token generated from your Micro.blog account settings. The Query String name and value are q and config And don’t forget to switch ‘Parse response’ to Yes so you can get the granular bit you need for the next module.
I’m actually not convinced this step is necessary since we know the media-endpointURL will be https://micro.blog/micropub/media, but the their API documentation recommends it.
(Step 4) Make an HTTPPOST request
Here’s where it’s a little complicated. For the top URL field, https://micro.blog/micropub/media will do, or map it from the previous module. Use the POST method. Headers are the same as in Step 4. You’ll select ‘Multipart/form-data’ for the body type and add three fields. The first two are Text fields, with keys / values of h / entry and type / image/jpeg. The third field item is ‘File’ with the key of file. For the value, you’ll select the Download Media we got in Step 2. Again, select Yes for ‘Parse Response’.
In the screenshot, you’ll notice that I didn’t use the data parsed from Step 4 for the URL, as noted above. You can select the data: media-endpoint ingredient from the previous HTTP request module to ensure you’re always getting the correct endpoint URL.
(Step 5) Make an HTTPPOST request
We make another POST request and reuse the https://micro.blog/micropubURL. No Headers or Query Strings are necessary this time. Body type is ‘Multipart/form-data’, and we’ll make three field items again. They’re all ‘Text’ fields this time, with keys / values of h / entry and access_token / YOURACCESSTOKEN. The third ‘Text’ item is what we’ve been aiming toward: the Micro.blog post. The key is content; for the value, you’ll type out what you want the post to look like and include the image’s new URL on Micro.blog as mapped from the result of Step 4. That’s the 5. data: url bit you see in the screenshot. You can customize this value to your heart’s delight, but I styled it with the Caption item mapped from Step 1 first, followed by the 📷 emoji, so it gets grouped by Micro.blog’s emoji tags. I left a blank line and then an
<img src="UPLOADED-IMAGE'S-NEW-MICRO.BLOG-URL.jpg"/>. This style aligns with the default formatting of image posts when uploaded directly to Micro.blog.
And that’s it! Post something new to Instagram, and then run the whole scenario as a test before turning on the scheduling feature. After scheduling is turned on, it’ll take care of posting any photos to your Micro.blog automatically. You could then use cross-posting in your Micro.blog settings to get that photo elsewhere, too.
Limitation: The method described above is limited to single photo posts or just the first photo from multi-photo posts. If you want to exclude multi-photo posts and videos, add a filter after the first module that matches the ‘Media Type’ to ‘IMAGE’. Multi-photo posts (CAROUSEL_ALBUM) and videos (VIDEO) will get stopped from moving on to the next steps.
Or follow along below to split the scenario to create either a single-image post or a video post based on the Instagram media retrieved.
Going Further to Support Video Posts
Unable to leave well enough alone, I wanted to ensure that if I posted a video to Instagram, the scenario wouldn’t break. It turns out that adapting it to also fully support posting videos was pretty easy. You can add a Router module and branch off to different outcomes using filters.
In the top route for images, I used a Filter that checks for the ‘Media type’ of either IMAGE or CAROUSEL_ALBUM and designated it as the fallback route. This ensures that at least one image will get uploaded from whatever is pulled from Instagram.
For the bottom route for videos, I added a separate filter looking for the VIDEO media type. Then I copied and pasted the HTTP requests to hook them up.
Finally, I just had to edit two fields to work with videos rather than images.
For the first POST request, video/mp4 is the new value for the type key:
Likewise, using a <video> tag, instead of the image syntax, for the content value is all you need to change:
Make.com has some powerful modules and might become my new go-to tool rather than IFTTT or Zapier. Perhaps grabbing multiple photos from a CAROUSEL_ALBUM and putting them all into one Micro.blog post will also be possible, but that’s an endeavor for another time.
A big thanks to Khürt Williams, who showed the way with Zapier, and to Greg Morris for creating this shortcut, which I used to debug my GET/POST requests.
UPDATE 2024-01-03: I significantly improved this workflow and added automatic image description (alt text) generation to boot. Detailed here on the Make.com community forum.
Apple’s surprise move yesterday to get the rest of iCloud data1, including, critically, iCloud Backups, end-to-end encrypted is an unequivocal win for user privacy. But there were a few loose ends that weren’t clear to me from the announcement. Luckily, the corresponding support document offers answers.
For one, there was this stipulation, quoted by many publications, that gave me pause about turning on Advanced Data Protection myself: “iWork collaboration and the Shared Albums feature in Photos don’t support Advanced Data Protection.” Losing access to my Shared Albums would be a non-starter. It’s how I share photos with a bunch of family members after leaving Facebook. But the knowledge base article offers good news here:
When users collaborate on an iWork document, or open an iWork document from a shared folder in iCloud Drive, the encryption keys for the document are securely uploaded to iWork servers in Apple data centers. This is because real-time collaboration in iWork requires server-side mediation to coordinate document changes between participants. Photos added to Shared Albums are stored with standard data protection, as the feature permits albums to be publicly shared on the web.
I take that to mean you can still use Shared Albums and iWork collaboration, but with the understanding that those features will use the old protection model — that is, encryption in transit but not end-to-end. Likewise with “anyone with a link” sharing:
Selecting the “anyone with a link” option when enabling collaboration will make the content available to Apple servers under standard data protection, as the servers need to be able to provide access to anyone who opens the URL.
And then there’s iCloud.com. It would have been a shame if the fancy new iCloud.com design was useless to folks with the additional protection turned on. But that doesn’t seem to be the case:
When a user first turns on Advanced Data Protection, web access to their data at iCloud.com is automatically turned off. This is because iCloud web servers no longer have access to the keys required to decrypt and display the user’s data. The user can choose to turn on web access again, and use the participation of their trusted device to access their encrypted iCloud data on the web.
After turning on web access, the user must authorize the web sign-in on one of their trusted devices each time they visit iCloud.com. The authorization “arms” the device for web access. For the next hour, this device accepts requests from specific Apple servers to upload individual service keys, but only those corresponding to an allow list of services normally accessible on iCloud.com. In other words, even after the user authorizes a web sign-in, a server request is unable to induce the user’s device to upload service keys for data that isn’t intended to be viewed on iCloud.com, (such as Health data or passwords in iCloud Keychain).
I’m glad Apple built this temporary access for getting at your data on iCloud.com. They could have — with much less effort — just said web access was a feature you lose when turning on Advanced Data Protection. Apple wasn’t shy about the fact that you lose a fair bit of convenience when running your device in Lockdown Mode, including blocking most message attachments entirely, for example.
I do wonder what the authentication process will be like. It could be similar to the current two-factor authentication PIN, or maybe something more exotic like a passkey. Perhaps passkeys were one of the final pieces to this puzzle.
On the Abandonment of CSAM Detection
One aspect of yesterday’s announcements that I remain disappointed by is that Apple is officially abandoning its introduced-then-shelved-due-to-backlash CSAM scanning system.
It’s a complex and sticky subject, that people, rightfully, have strong opinions about. I understand the reluctance to having the device you own scanning your photos for images matching known child sexual abuse material, and I appreciate the slippery slope nature of introducing any kind of scanning system like this. But, personally, I thought Apple had proposed a worthy compromise: scan only as part of the transit of photos from your device to Apple’s servers for syncing/backup, and alert authorities only if the number of matches (to a database provided by NCMEC, the globally-respect authority on CSAM) cross a threshold, signifying a very high degree of confidence.
That, plus the fact that Apple would offer users the ability to opt out by turning off iCloud Photos was enough for me to give the feature a thumbs up. I felt it balanced protection and privacy, and prevented Apple from resorting to scanning unencrypted photos on it’s own servers — which, honestly, feels creepier to me.
But Apple has closed the door to on-device detection. And when Advanced Data Protection is turned on, server-side scanning those end-to-end encrypted photos for known CSAM won’t be an option.
Except for iCloud Mail, Contacts, and Calendars which, understandably, can’t be end-to-end encrypted and still work with other global email, contacts, and calendar systems.↩︎