Ramblings from a Researcher-In-Training

Peer Reviewed

Posts in iOS
A Home Screen Widget for Relay FM's Annual St. Jude Fundraiser

Every year, Relay FM and its surrounding community of tech nerds and podcast listeners rally together to raise money for St. Jude Children’s Research Hospital — one of the premier pediatric cancer research institutions in the world. The fundraiser is back and better than ever with sticker rewards for certain donors, donation thresholds for Flight Simulator streams, a horrifying amount of stickers, and the annual Podcastathon live stream on September 17th. Relay hopes to raise $333,333.33 (though I have a feeling that goal will be raised, since they racked up $456,000 last year to bring their cumulative total to well-over $1,000,000. I’m always delighted to donate to this cause because St. Jude does such amazing work, and this year I also worked out a way to track their progress live right on my iPhone home screen.

Relay runs their St. Jude fundraiser using Tiltify — a service that focuses entirely on campaigns like this, and importantly has a public-facing API. Because of that, it’s fairly easy to pull updates from Relay’s donation page using a POST request and parsing the (rather large) JSON dictionary that returns. An intrepid member of the Relay FM members Discord discovered this fact and created a Siri Shortcut to quickly display the total amount raised…but that gave me a better idea: what about a home screen widget?

When you need to call an API and create a dynamic home screen widget, two apps come to mind: Scriptable and Pyto — given that my only serviceable programming know-how is in Python, I chose the latter and got to work cobbling together a script.

Displaying Campaign Data, Dr. Drang-Style

The first thing I needed to do was connect to the Tiltify campaign with a POST request — big thanks to Ben in the Relay Discord for doing most of the heavy lifting with his Siri Shortcut! Tiltify expects a nightmarishly-long JSON payload in a POST request, but the JSON data it returns is much more straight-forward. Using Pyto, I called the API and parsed the JSON key:value pairs in the returned data to snag the totalAmountRaised and goal values from Relay’s 2021 St. Jude campaign. A little conversion turns those raw floats into properly-formatted dollar values with thousands-commas and dollar signs.

#Pull data from the returned JSON payload.
info = (r.json())
rawraised = info["data"]["campaign"]["totalAmountRaised"]["value"]
rawgoal = info["data"]["campaign"]["goal"]["value"]
# Convert pulled values into properly-formatted dollar values:
raised = "$" + '{0:,.2f}'.format(float(rawraised))
goal = "$" + '{0:,.2f}'.format(float(rawgoal))

Once I was able to pull the fundraiser's goal and the current amount raised, the next challenge was displaying that information within an iOS home screen widget. First and foremost, I really wanted a dynamic progress bar but wanted to generate one as simply as possible. My brother (a much more experienced programmer) helped me write this clever snippet of code to simply display a string of emojis 12 characters long, with two emojis (⬜ and 🟩) proportionally placed to form the progress bar. Here's what the code looks like:

# Generate a progress bar using emojis
def progressbar(raised, goal):
    # Modify these emoji to change the "empty" and "full" sections of the progress bar.
    progress_full = "🟩" 
    progress_empty = "⬜"
    bar_length = 12 # Modify this number to adjust the max width of the progress bar.
    progress_percent = float(raised)/float(goal)
    progress = ""
    progress = progress_full * int(bar_length * progress_percent)
    return '{:⬜<{x}}'.format(progress, x=bar_length) 
    #If you modify progress_empty above, you need to put it in this return statement as well.

The length of the progress bar needs to be fiddled with based on the width of the device; I'm sure there are much more clever ways to generate the proper number of emojis based on the device the code is being run on, but that was above my pay grade! Twelve emojis wide was just about perfect for a medium widget on my iPhone XS — your mileage may vary based on your device.

All that's left is to actually generate the widget to display all of this data on my home screen. I was expecting this to be much more challenging, since I had never used Pyto or its widget library, but luckily when you open a new script Pyto offers to automatically populate an example widget! A bit of hacking around with the example code and some digging in their widget documentation let me insert the variables I was interested in, change the background color, and remove the option of a small widget (it's just too small). In short order, I could present the amount raised, the fundraiser goal, the percent progress, and a delightful emoji progress bar right on my home screen! Here's the code:

if wd.link is None:
    widget = wd.Widget()
    wd.wait_for_internet_connection()
    background = wd.Color.rgb(219.7/255, 182.8/255, 72.2/255) 
    #You can modify the background color by altering the RGB values to your liking

    # Populate four rows of data, and accompanying font sizes:
    text1 = wd.Text("Raised: " + raised) 
    text1.font = wd.Font.bold_system_font_of_size(20)
    text2 = wd.Text("Goal: " + goal)
    text2.font = wd.Font.bold_system_font_of_size(20)
    text3 = wd.Text("Progress: " + progress)
    text3.font = wd.Font.bold_system_font_of_size(20)
    text4 = wd.Text(bar) #Progress bar
    text4.font = wd.Font.bold_system_font_of_size(18)

    # Supported layouts (the small widget is too small)
    layouts = [widget.medium_layout, widget.large_layout]
    for layout in layouts:
        layout.add_row([text1])
        layout.add_row([text2])
        layout.add_row([text3])
        layout.add_row([wd.Spacer()])
        layout.add_row([text4])
        layout.set_background_color(background)
        layout.set_link("https://stjude.org/relay")
    wd.schedule_next_reload(900) # Suggested refresh time in seconds
    wd.show_widget(widget)
else:
    open(wd.link) #This opens the link above when the widget is tapped.

And here's what the resulting widget looks like:

A screenshot of my home screen widget displaying the fundraiser’s progress.
The widget looks quite nice to me, and can be further modified in the Pyto code to your liking!

I think it looks pretty nice, given that I spent almost zero time optimizing the padding, font size, and background color in the Pyto code. Their widget documentation has many more UI customization options that intrepid readers can explore to make more advanced or aesthetically appealing widgets for themselves, but I'm pretty happy with where this simple version landed. As a nice bonus, Pyto also has a way to alter what tapping on the widget does — you'll notice that the entire widget generation code is wrapped in an IF-ELSE statement; tapping the widget sets wd.link to TRUE and instead runs the open(wd.link) function...which naturally directs to Relay's St. Jude Fundraiser page (if you've read this far and haven't donated yet, now's the time!). I think that having to bounce back into Pyto to make this happen is a bit clunky, but beggars can't be choosers. The widget also seems to refresh relatively often — Apple says that widgets dynamically refresh somewhere between 15-70 minutes depending on user behavior, which is more than enough to keep the raised amount relatively up-to-date.

I Don't Want to Read Your Code, I Just Want the Widget!

Fair enough, let's actually walk through the steps for you, dear reader, to get this widget on your iPhone:

  1. Download Pyto from the app store. Pyto has a 3-day free trial, but you'll need to pay the $2.99 in-app purchase to run this script beyond then.
  2. Download this python script from my GitHub page. It handles all of the steps I discussed above: Pulling the fundraiser data, generating a progress bar, and creating the widget using Pyto. Save it in the Files app so you can run it using Pyto (please don't judge my horrendous code too harshly, I'm still new to programming!) If you're feeling adventurous, you can also modify the font size and color, background color, and even what text is displayed — just dive into the code!
  3. Run the script once using Pyto
  4. Edit your home screen, and add the Run Script widget from Pyto (Medium or Large, your choice). Configure that widget to run the StJudeRelay2021.py script you just saved in Pyto

And just like that, you'll be able to monitor Relay's annual St. Jude fundraiser from your home screen. If you still haven't donated, you absolutely should click here now and do so — there's no better cause than St. Jude, and the Relay folks' partnership with them is exceptionally wholesome. And after you donate, you'll want to mark your calendar for the culmination of the campaign: the Podcastathon on September 17th over on Relay's Twitch channel. It's always a wild and wacky event full of fun shenanigans, all for a spectacular cause.

My Hope-Filled Wish List for WWDC 2021

We are just about one month away from the WWDC 2021 virtual keynote address, and excitement for the annual Apple announcement of major changes to its various software platforms is starting to simmer. I wrote last year about how WWDC 2020 brought with it a new, somewhat-unusual sort of excitement in stark contrast to the challenges of the pandemic lock-down — this year is vastly different in some ways and painfully similar in others. Many are fully vaccinated (myself and my family included, thank goodness) and many places are cautiously reopening; however, in other places the pandemic rages on, its dark shadow still clouding over any positive feelings or experiences. It's in this way that what I wrote about last year still rings true:

Excitement for the week of WWDC is not new to me — it’s the unusually-joyless six months preceding the conference that have made my excitement feel almost shameful, somewhat stolen. It feels very wrong to become engrossed in subtle home screen changes on my $1,000 iPhone, as so much bad news continues to surround me. But in many ways, not relishing in the joys of life can stifle our ability to endure (and eliminate) the hardships. That’s the way I’m choosing to interpret WWDC week this year: as another bulwark against madness in these especially maddening times.

I'm choosing to go into WWDC 2021 with much the same mindset. So, with that prelude out of the way, this year I wanted to actually collect some software changes I am really hoping are announced at WWDC — portions of my WWDC wish list have been circulating in the usual rumor mills, and some items are so insignificant that I've put them into a "Paper Cuts" section all their own. I've almost certainly overlooked something either obvious or entirely novel and clever — drop me a tweet with the feature you are most hoping for this year so I can share in your anticipation!

WWDC Wish List

  • An iPadOS Release Worthy of the iPad. The iPad Pro hardware has far outpaced its software since at least 2018, and April's latest update to the much-loved pro tablet only exacerbates that untenable situation. However, the evolution of the iPad hardware in late-2018 foretold big improvements on the software side at WWDC in 2019: iPadOS 13 and its multiple window support, desktop-class Safari browsing, external storage support...the list goes on). Perhaps the inclusion of the M1 chip in the 2021 iPads Pro and the significant advances in screen technology (at least on the 12.9" model) are premonitions of major improvements to iPadOS — I would certainly hope so, because anything less than significant advances won't be enough to keep up with the ever-widening hardware-software divide. For starters, can we get real support for home screen Widgets on iPadOS? It’s almost laughable that these did not ship with the launch of iOS 14 last September, especially considering how quickly aesthetic iPhone home screens took over the cultural zeitgeist (and likely drove faster-than-usual uptake of iOS 14). In addition, real support for external peripherals like monitors, microphones, and headsets would be a huge boon to a machine ostensibly created to be a modular creativity machine. A completely-rethought method for displaying iPad content on a high-resolution external display would remove a lot of the limitations of the iPad's multitasking system — imagine having an entire other screen that you can park reference documents on without taking up half (or a third) of your iPad screen's real estate! Advanced audio input and output controls would also be a great addition to iPadOS, allowing users to route input audio to the correct application and simultaneously record the local audio to disk, for instance. A larger offering of "pro" apps from Apple would also be a welcome sign that iPadOS is worthy to run on the unimpeachable iPad hardware. None of these complaints are new, nor are the requested improvements to iPadOS — iPad Pro power users have long put up with the hard limitations of iPadOS, and desperately pushed the envelope further and further on our preferred device. At a certain point, Apple needs to finally fulfill the promise of the iPad Pro and open the release valve on all of this pent-up demand for software capability that matches the hardware; as Jason Snell put it on a recent episode of Upgrade, at a certain point "...you can't push past the envelope; you're stuck in the envelope."

    Jason Snell lays out the long-standing frustration of iPad Pro power users with the hard edges of iPadOS on a recent episode of Upgrade.
  • A Fully-Liberated Apple Watch. Last year’s release of the Apple Watch SE was a meaningful stride towards an inevitable end: an Apple Watch entirely independent of the iPhone. Beyond the obvious benefit to Apple of access to the broader market of smart watch consumers without iPhones, freeing the Apple Watch lowers the financial barrier of entry to what is increasingly becoming an invaluable health monitoring device — which necessarily increases access, equity, and hopefully outcomes. The Apple Watch is also quickly becoming one of the most popular medical research devices on the planet, with countless studies using its various sensors to gather important study data to inform better healthcare decision-making — it is vital that this research is conducted in an equitable and accessible manner, and an independent Apple Watch is a big step in that direction.

  • Some Sign That Apple Hasn’t Abandoned the Smart Home. I’d take a redesign of the Home app as a start — so much potential, all locked behind a mess of tiles, rooms, zones, scenes, and painfully limited automation options. John Voorhees over at MacStories called for a complete redesign of the Home app three years ago, and based on the included screenshots and the familiar frustrations, very little has changed in the interim. Apple also needs to double-down on smart home hardware — the HomePod Mini (and its secret humidity and temperature sensors) was a glimmer of hope for a cogent home strategy, but that check hasn’t posted yet. I, for one, vote for some sort of Apple TV/soundbar chimera (preferably with actual audio-in ports).
  • An “I Know What I’m Doing” Toggle in Shortcuts. iOS 13 gave us a built-in Shortcuts app and the Automations tab, and iOS 14 added a good assortment of Automations triggers (some of which that could even run, well, automatically); it’s time for iOS 15 to finally let Shortcuts power users self-identify as such and unlock the ability to automate any shortcut with any Automation trigger. I understand why Apple has limited the list of triggers that can silently fire off a shortcut in the background with the user none the wiser, but frankly many of us are perfectly aware of the risks (and more importantly: the benefits) of setting up an Automation triggered by a location, an email, or a specific WiFi network. It’s the final frontier of Shortcuts, and we can’t wait to show you what we do with it.
  • Advanced Notification Controls on iOS. The available notification settings on iOS have been lacking for a long time — CGP Grey has been begging for more granular controls for years at this point. Based on some recent Bloomberg reporting, he may finally get his wish in the form of some additional "statuses" in Settings that change the way notifications are delivered. This sounds extremely interesting, long-overdue, and potentially inadequate all at the same time. Some additional components of this new notifications system I would love to see include the ability to set a contact as an "always notify me" contact — whether that be a phone call, an iMessage, or a FaceTime. Heck, integrate that feature with an API third-party developers can plug in to so that contacts in messaging apps like Discord or WhatsApp can also break through Do Not Disturb. I know Apple is always averse to adding too many toggles and knobs to its Settings, but I think even average users would appreciate more fine-tuned ways of managing when and how their phone interrupts their day.

Paper Cuts

  • Make iMessage Image Previews Automatically Resize. I send a lot of photos, screenshots, and yes, memes via iMessage — predominantly to my brother. We often will share screenshots of funny tweets, but the punchline or the funny reply is just outside of the iMessage image preview — this is so often the case that appending “Expand” right after such an image is basically second nature for us. This is silly and unnecessary — just make the iMessage image preview resizable based on the image. Sure, there will have to be some limitations for obscenely large images, but if Twitter can improve their image scaling, so can Apple.
Three screenshots of an iMessage search query for “Expand” with many results.
I’m honestly surprised I found so few instances.
  • Add an "Archive" Option to the Wallet App. This paper cut was brought to my attention during a discussion in the RelayFM Members Discord, when some folks were sharing screenshots of old live events passes in their Wallet apps...which immediately made me recoil in horror at the mountain of old passes cluttering up their screens. I'm the type of person that immediately deletes plane tickets, events passes, and the like from my Wallet app once I no longer need them — why make a mess out of a screen I see every time I buy groceries with Apple Pay? That said, many people pointed out that they keep their old digital tickets for much the same reason used to collect old movie ticket stubs: nostalgia. And they have a point! So, Apple: give us an option to "Archive" old Wallet passes instead of forcing us to choose between deleting old passes or drowning in them.
  • Give Us a "Silence Siri" Option in Settings. Currently, Siri Responses can be set to "Always", "When Silent Mode is Off", or "Only With 'Hey Siri'" — when what I really want is an "Only When Asked a Question" option. Siri's talkativeness is particularly irksome to me on my HomePods Mini when controlling smart outlets in my apartment. Depending on which light I want to turn off, and which HomePod Mini catches my request, I'll either hear nothing back from Siri (ideal), or get a needlessly-wordy "Okay...turning off Bedroom Light" as I am trying to go to sleep at 11PM. I can see that the lamp is no longer on, Siri, but thank you for the update. There's a way Apple can strike a balance between providing useful voice feedback when necessary — like when I am directly asking Siri a question, or if there is an error of some kind — while keeping Siri as unobtrusive as possible in all other cases.
  • Correct the Emoji Search/QWERTY Keyboard Conundrum. It wasn't until recently that this paper cut was brought to my attention on Twitter (via Federico Viticci and Gavin Nelson), and that's when I realized I had subconsciously hated this situation since iOS 14 made Emoji search available last September. As it stands, initiating an Emoji search requires you to tap two buttons to escape back to the typical QWERTY keyboard: one to close the Emoji search by opening the Emoji keyboard, and once to swap from that keyboard to QWERTY. This confusing dance is extremely unintuitive (why would I click the button covered in Emojis when I want the opposite?), and could be solved with something as simple as a small "X"-to-close button tucked into the Emoji search UI.

Hopeful Anticipation

A portion of WWDC's allure is certainly about what changes are coming to our iPhones (or for developers: "what new features do I have to implement?") — but for me, an enamored observer of Apple's tech? WWDC is about being excited for something; it's about identifying how my software life could be better and hoping that Apple helps make that a reality; it's the community-feel of a Discord group-watch with like-minded folks similarly excited for ultimately trivial differences in our everyday lives. WWDC, for me, brings out feelings of hope — for shallow things like software updates, and for deeper, more meaningful things like connection and belonging. Part of what makes hope real, for me, is writing those hopes down in a silly listicle like this one — so, if you've made it this far, I encourage you to do the same; give your hopes (about WWDC and about life) words to the tune they're singing in your heart.

Hope is the thing with feathers that perches in the soul and sings the tune without the words and never stops at all.

The Software Apple TV Remote Is Also Terrible

Much has been said about the abysmal experience of using the Apple TV’s Siri Remote for anything more than accidentally turning on the TV. I often feel the way Merlin Mann and many others do: that I use the Apple TV and its atrocious remote an order of magnitude more often than the folks at Apple who are responsible for its design. Lately, rumors of a redesigned Siri Remote have been circulating in anticipation of the next-generation Apple TV — including the discovery of a new-but-not-actually-new remote design, complete with actual buttons. There’s no argument that the current Siri Remote is terrible and desperately needs a replacement — but I’m here to remind everyone that the software Apple TV Remote built into all of our iOS devices is also horrendous, perhaps even more so than it’s slippery sofa side-kick.

Is This The “Revolutionary User Interface”?

Apple has long prided itself on both designing remarkably intuitive user interfaces and seamlessly integrating software and hardware — the iOS Apple TV Remote is a failure on both fronts. For starters, when you compare the software remote to the widely-panned hardware Siri Remote you’ll quickly notice that the software remote actually has one fewer button (it gains the Search button but loses both volume buttons). This is in spite of the fact that by its very nature, the software Apple TV Remote could have 10 or 20 or 100 buttons if it wanted to — or if we’re being reasonable, maybe just a few more useful ones? The obvious and painful dedication to replicating the “feel” of the physical Siri Remote in the UI of the digital iOS Apple TV Remote only serves to transport one bad experience to an environment with a higher quality ceiling, making that experience comparatively even worse. There’s a reason why folks like Matthew Cassineli make complicated Siri Shortcuts to entirely replace their Apple TV Remote as best they can.

Two screenshots of the iOS Apple TV remote UI.
All the power of the iPhone and its spacious screen real estate, and this is all we get?

And speaking of integrating software and hardware — why on earth can’t the Apple TV be controlled via an entirely mirrored UI on the iPhone? It’s perfectly possible to take advantage of the entire iPhone screen and duplicate tvOS’s interface, allowing users to navigate Netflix and YouTube and Apple TV+ directly with their fingers — the current iOS Apple TV Remote already takes over the entire screen when in use! Why swipe around on a glass diving board (or a digital one) when your iPhone screen can show you your list of tvOS apps and just as easily allow you to tap one? Forget complicated ideas like a dynamic software remote UI that changes based on what tvOS app is open (although I would happily welcome that) — just let me directly tap the icons and menus on my Apple TV through the “revolutionary user interface” in my pocket. Add some volume buttons and the Menu/Home button to one side, and you’ve got yourself an intuitive UI.

I once heard a really great quote about no-good hardware user interfaces and the flexibility of good software UI from this quirky guy named Steve Jobs:

And, what’s wrong with their user interfaces? ...they all have these control buttons that are fixed in plastic and are the same for every application. Well, every application wants a slightly different user interface, a slightly optimized set of buttons, just for it. And what happens if you think of a great idea six months from now? You can’t run around and add a button to these things. They’re already shipped....Well, how do you solve this? Hmm. It turns out, we have solved it! We solved it in computers 20 years ago. We solved it with a bit-mapped screen that could display anything we want. Put any user interface up.

It’s been more like 30 years now since this problem has been solved, Apple, and yet the iOS Apple TV Remote insists upon remaining mystifyingly married to its displeasing hardware cousin. It’s a bad UI citizen completely failing to live up to its potential — and to the promise of the iPhone that Jobs laid out way back in 2007.

iOS, NewsMatt VanOrmeriOS, iPhone
Using In-Line HTML to Preview Images in iA Writer

On last week’s episode of Connected, Federico Viticci described the way in which he embeds images as he writes in iA Writer and subsequently uploads those images to the MacStories CMS. You can listen to this section of the latest episode, but in short: Federico uses iA Writer’s Content Block feature to insert images and view them right in the editor’s preview window — and then uses Scriptable to upload all of the images one-by-one and replace the Content Block with the actual image embed. I also use iA Writer for all of the posts on Peer Reviewed, but I have a different (and perhaps more efficient) way of handling images as I put together my posts: in-line HTML.

Marking Up Your Markdown

One of the many benefits of writing in Markdown is that most editors natively parse HTML as well, because Markdown and HTML are intended to work seamlessly with each other — as John Gruber himself explains here:

For any markup that is not covered by Markdown’s syntax, you simply use HTML itself. There’s no need to preface it or delimit it to indicate that you’re switching from Markdown to HTML; you just use the tags.

What this means is that iA Writer can natively parse and preview HTML tags inside my Markdown documents — including the figure and figcaption tags. Whenever I want to embed an image in a blog post, I simply paste in a snippet of HTML that points to the permalink of the image, and includes an image caption and alt text. Here’s what it looks like in both the editor window and the preview window in iA Writer:

Side-by-side screenshots of the iA Writer editor and preview windows.
iA Writer natively parses the HTML on the left to show the image in the preview window on the right.

This strategy for inserting images makes it very clear where in the editor you have images inserted (because the HTML sticks out so plainly), while also allowing you to preview a post as it would appear on the web right inside iA Writer. An added bonus being that your final draft is already 100% ready for the web, since everything you have written is already either Markdown or HTML.

Generating HTML Snippet with Shortcuts

The other advantage of using in-line HTML instead of iA Writer’s Content Block system is the speed with which the appropriate HTML snippet can be generated — with the help of Shortcuts, of course. As a general rule, images in my blog posts are either screenshots from an Apple device, or a photo I’ve taken of a physical product, like a keyboard or a CPU heatsink. As such, I have two Siri Shortcuts I use to generate the HTML snippets for each of these scenarios — framed device screenshots are generated with a modified version of Federico’s own Apple Frames shortcut, and any other images are uploaded via my own Image Uploader shortcut.

Both of these shortcuts effectively do the same thing (after device frames are added to any screenshots):

  1. Upload the image (in my case, to Imgur)
  2. Get the permalink of the image
  3. Ask for descriptive alt text and a caption
  4. Combine the image URL, alt text, and caption in an HTML figure snippet
  5. Copy the snippet to the clipboard and kick me back into iA Writer
Screenshot of the Shortcuts editor window showing how HTML snippets are generated.
An all-in-one shortcut for adding a device frame, uploading, captioning, and generating the final HTML for an image really streamlines the process.

It only takes a few moments for the shortcut to finish running, plus or minus the time it takes for me to come up with a punchy caption for the image I’m uploading. Once it’s finished, all I have to do is paste the HTML where I want the image to appear in my post and iA Writer will natively allow me to preview the image as well as its caption just as it would appear on the web (CSS notwithstanding). And if I decide to reword a caption or change the image I want to use, all I have to do is edit the HTML snippet in the iA Writer document itself — the beauty of an all-text system for composing an article.

</blogpost>

This system for quickly uploading and inserting images while still being able to preview them in iA Writer has worked very well for me. The aspect I like most about this method is how little effort is needed to go from a completed post in iA Writer to publishing it on Peer Reviewed — I literally copy and paste the text and it is ready to publish. I think Federico’s system for uploading to the MacStories CMS and publishing articles to his site might necessarily be a bit more complex than mine, but I have a feeling that this method for handling images might be slightly more streamlined than using Content Blocks and custom Scriptable scripts to swap out file paths with HTML while editing.

Dark Noise 2 — The Best Ambient Noise App on iOS, Amplified

In a time when so many are working from home, finding ways to stay focused on your work in an environment full of distractions is especially critical. I’ve found that my best work is so often facilitated by the active noise-cancellation of my AirPods Pro and the calming sounds of a crackling campfire provided by Dark Noise — the delightful ambient noise app from developer Charlie Chapman. I’ve written about my love of Dark Noise before, and today marks the release of Dark Noise 2 — the biggest update to the app since it launched in August of last year.

Ambient Noise Mixology

Dark Noise 2 brings with it the hotly-requested feature of mixing multiple sounds together to form unique soundscapes that suit the user’s fancy. Is Heavy Rain insufficient precipitative percussion for your nighttime white noise needs? Create a custom mix to play Heavy Rain, Drippy Rain, Rain, Thunderstorm, and Distant Thunder all at once to really flood your senses. Or if, like me, you want to create an immersive beach experience in this summer-sans-travel, combine Beach, Seagulls, and Wind Chimes to evoke an island feel.

Three screenshots of Dark Noise’s new Sound Mixing feature.
When making a custom mix, you can adjust the volume of each individual noise separately to tune things just right.

The volume of each sound you add to the mix can be individually adjusted to quickly put one sound in the “foreground” and another in the “background” of your custom mix. Custom mixes can also be given a custom icon — choose from any of the existing animated noise icons in any color, or upload an image of your own.

The simplicity with which Charlie has implemented this ostensibly complex sound mixing interface is evidence of the great care taken to make Dark Noise the most elegant and intuitive white noise app on the market.

New Sounds, iPadOS Pointer Support, and More

Dark Noise 2 adds eight new sounds to the long list of options already included with the app — Rain on Tent, Wind Chimes, Windy Trees, Seagulls, Lake, Ship Deck, Flag, and Lullaby — bringing the total to 50 sounds in various genres. My personal favorite remains Campfire (for whatever reason, crackling logs really do it for me), but Windy Trees and Lake are both sneaking into my rotation.

Screenshots of three new sounds in Dark Noise 2
Dark Noise 2 adds eight new, relaxing sounds (and custom animations) to the already-extensive list.

Additional improvements to Siri Shortcuts, including the ability to set arbitrary sleep timers directly within a shortcut action, continue to enhance the experience of users who want to integrate Dark Noise into their bedtime routines and productivity workflows. Add the cherry on top of two new custom app icons: a skeuomorphic icon in the style of MacOS Big Sur, and the quintessential “Launched” icon in the design of Charlie’s podcast of the same name. Oh, and full pointer support on iPadOS for those oddballs with the Magic Keyboard for iPad Pro — because why not.

Excellent Sounds, and Sound Priorities

Whether for a calming prelude to a restful night’s sleep, relaxing ambiance during moments of mindfulness, or augmented focus during periods of productivity, Dark Noise is the ideal white noise app for iOS users who sweat the details. It’s opinionated design choices, extensive system integrations, whimsical animations, and immersive sounds all come together to form a polished experience that doesn’t just sound good, but looks good and feels good too. I praised Dark Noise extensively when it was first released, and this latest update doubles down on the app’s reputation for a fluid user experience. Dark Noise is available for $5.99 on the app store.

Stop Your Car Radio From Auto-Playing Apple Music With Shortcuts Automation

If you’ve ever connected your iPhone to a CarPlay receiver, a Bluetooth head unit, or just a USB cable connected to your dash, you’ve undoubtedly had the experience of the alphabetically-first song in your Apple Music library immediately blaring through your car speakers. This attempt at “smarts” by Apple is really nothing more than an annoyance unless you specifically want to listen to “99 Red Balloons” every time you get into your car. Luckily, this annoying audio automation can be corrected with more automation, thanks to Shortcuts.

Fighting System Integrations With Shortcuts Automations

Apple Music thinks that every time you connect your phone to a car receiver of some kind, you’d like to hear whatever happens to be at the top of your library — despite how obviously wrong that assumption is. I have some good news though: connecting your phone to CarPlay, a specific Bluetooth receiver, or even just a USB port can all serve as Shortcuts Automation triggers — and we can use that to undo Apple Music’s attempted cleverness.

Screenshot of three automation triggers in Shortcuts.
Depending on your car radio, you can use one of these automation triggers to stop Apple Music from auto-playing annoyingly!
First, create a Shortcut that only contains the “Play/Pause” action (set specifically to “Pause” audio). Then, you’ll need to set up a Personal Automation in the Shortcuts app that gets triggered by connecting to CarPlay, your car’s Bluetooth device, or connecting to a power if you use a standard USB connection (It’s worth noting that using “When Connecting to Power” will run this automation whenever you connect your iPhone to a power source, not necessarily just your car USB port). Then simply add the “Run Shortcut” action and select the Shortcut you just created that pauses audio playback.

Screenshot of the automation actions and Play/Pause shortcut in iOS.
Having the automation run a completely separate Shortcut avoids the “Pause” action running before Apple Music actually begins playing — intentional abstraction!
 

Did you find this article helpful? Consider buying me a coffee to help support this site!
Buy me a coffeeBuy me a coffee

Now, whenever you connect to your phone to your car’s head unit, Apple will try to be smart and auto-play your Music library...and then your Automation will run and immediately pause it again. And now that you’ve stopped an annoyance with Shortcuts Automations, think about what improvements you can make to this flow — perhaps you want it to pause Apple Music and then immediately open Spotify? Maybe you’d like to automatically start a route to your next appointment? View a playlist in Overcast? All of these can simply be added to the one-action Shortcut you made at the start to enhance this automation to your heart’s content.

The "Live Listen" Feature in iOS Could One Day Replace Hearing Aids

Last week I saw this 9to5mac article from Filipe Espósito describing the new real-time audio level Control Center tile in the iOS 14 developer beta. I immediately went to check out this nifty feature on my own iPhone (also running iOS 14), and discovered an additional feature within this Control Center tile: “Live Listen”. At first I thought I had discovered another new addition in iOS 14 — but as it turns out, this feature has been available since iOS 12.

With a “compatible audio device” (AirPods Pro, in my case), Live Listen uses your iPhone’s speaker to capture the audio in your environment, process it noticeably, and reroute it to your AirPods Pro with the ability to adjust the volume. This feature was able to significantly amplify both the sound of my TV and my wife talking in another room.

Screenshot of the Live Listen feature.
Live Listen uses compatible headphones to amplify the world around you.

When the AirPods Pro were released with both noise cancellation and the magic of Transparency Mode, many (myself included) speculated that Apple was just getting started in the “augmented reality” space — and my belated discovery of this years-old augmented audio feature is only more evidence of that fact. According to the AARP, the average price of a single hearing aid is $2,300 (that’s $4,600 for a pair!), but an iPhone SE and a pair of AirPods could be as affordable as $500 for the hard-of-hearing in need of auditory augmentation.

iOSMatt VanOrmeriOS
YarnBuddy — The Project Tracking App for Knitters and Crocheters

I am neither a knitter nor a crocheter. I would quite easily confuse knitting needles for chopsticks, and a crochet hook for a dental pick. However, I do consider myself a maker — I spend an inordinate amount of my free time in my garage/wood shop working with my hands to turn an idea into a physical good. Although my crafting medium is wood, makers of all stripes are quick to appreciate the tools of other disciplines — and YarnBuddy from developer Becky Hansmeyer deftly demonstrates how digital tools can be as invaluable to hobbyists as the physical tools of their trade.

A Tailor-Made Task Manager

YarnBuddy is what happens when you take a general-purpose task manager like Todoist or Things and tailor it to an extremely specific use-case — specialization that pays dividends for those so-specialized. At its core, YarnBuddy allows you to create a list of knitting and crocheting projects with custom fields geared specifically towards aspects of needlework like “Yarn Selection” or “Needle Size”. The ability to tag a given project with categories or project types allows even the most prolific knitters to quickly organize their many works-in-progress using YarnBuddy. In addition, the ability to upload an instruction sheet for a given project complete with a movable line highlighter is super convenient for both keeping your place and accessible use for those who have more difficulty reading small text.

A screenshot of YarnBuddy’s project view
The project view’s instruction sheet highlighter is one of my favorite features of YarnBuddy.

Custom project due dates, an image uploader for either examples or the finished product itself, and a notes field for helpful hints or useful links all make for an extensive project management system entirely centered around knitting and crocheting.

Built-In Tools of the Trade

Beyond the feature-rich project tracking components of YarnBuddy, a number of useful tools and quality-of-life conveniences are stitched right into the app. Customizable counters — for specific projects or one-off use — allow the user to keep track of rows as they knit a given design. These counters can be configured to automatically repeat a given increment — for instance, if there are a given number stitches in a row — and automatically display notes on a preset interval to help remind you of the pattern at the beginning of each row.

Screenshots of YarnBuddy’s counter tool
Project counters, quick counters, and advanced counter settings are super handy for tracking rows and loops as you go.

YarnBuddy also includes features that allow users to keep track of their yarn inventory, and utilities for deciding on a yarn to use on a given project. The “Yarn Stash” serves as a repository of what yarn you have on hand, and can quickly import the specifications of that yarn into any project in YarnBuddy. The Yarn Substitution tool allows you to quickly determine what amount of a substitute yarn you need to adequately replace another yarn of perhaps different length/skein or weight/skein. As a woodworker, I am constantly checking my hardwood and scrap wood stash to figure out what exactly I have available to use on a given project — I imagine the Yarn Stash will be the favorite feature for many YarnBuddy users who also want to keep track of what raw materials they have on-hand. Adding a built-in unit conversion tool is the cherry on top of the long list of utilities that make YarnBuddy an invaluable resource for needleworkers of every description.

Screenshot of yarn selection, yarn substitution, and conversion tool in YarnBuddy
Creating your own repository of yarn and quickly converting units is painless in YarnBuddy.

Utility, Embroidered With Whimsy

Beyond being an incredibly feature-dense app in terms of project management, YarnBuddy still manages to have an inviting aesthetic, with the developer’s design flourishes shining through brightly. The Quick Tips page serves as both a delightful iMessage conversation between balls of yarn and as a friendly introduction to the basics of using YarnBuddy — frankly, I would suggest this page be shown to every first-time user of the app!

Screenshot of custom icons and helpful tips in YarnBuddy.
Delightful custom icons and a whimsical helpful hints page are both pleasant additions to this art-centered app.

Custom app icons are becoming table-stakes in the iOS development community, and YarnBuddy’s numerous app icons so clearly evoke the personality of the app itself — a smiling yarn ball symbolizing the many knitters and crocheters who find their joy in a box of yarn.

Closing the Loop

Beyond my jealousy towards a project management app specifically made for a given hobby, nothing beats the experience of using an app made by someone who actually uses it, and has lovingly injected so much of their passion into the app’s design. It’s this sewn-in consideration and care that explains how this app still connects with me, despite my lack of knitting knowledge — it subtly evokes the feeling of joy that crafting inspires in so many. From planning of a project, to carefully selecting the appropriate materials, to documenting the finished product in your Project Archive, YarnBuddy manages to capture both the important details and the powerful emotions that knitters and crocheters undoubtedly feel when working with their hands.

YarnBuddy for iPhone and iPad is available for free in the App Store, and unlimited projects, tags, project reminders, and custom icons can be unlocked with YarnBuddy Pro for $14.99/year or $49.99 as a one-time purchase.

The Indie Sticker Pack

A group of 90+ indie app developers and designers combined their efforts to create a lovely sticker pack of including app icons and custom designs — with all proceeds being split 50/50 between the World Health Organization’s COVID Response Fund and the Equal Justice Initiative.

Beyond the fact that the developers spearheading this project include many names I recognize and respect, and ignoring the really slick stickers I’ll be getting in the mail sometime down the road, these are two incredibly important causes whose I am delighted to support through this project (and directly!), and encourage you to do the same.

While scrolling through Twitter today, I noticed a lot of folks outside the US have been disappointed at the high cost of international shipping on these sticker packs — in some cases the shipping exceeds the cost of the pack itself. Now, there’s nothing I personally can do to change the market rate for global shipping, but I can help out folks who might otherwise not be able to pay that higher shipping cost. As such, if you live outside the US and can verify a donation of $15 or more dollars directly to either the WHO COVID response fund or the Equal Justice Initiative, I’ll personally cover the full cost of an Indie Sticker Pack shipped right to your door. I’ll cover up to five (5) sticker packs for international folks who can verify a $15+ donation. You can reach out via Twitter or email me at matt@peerreviewed.io to verify your donation and coordinate ordering your sticker pack.

And while you’re here, check out this awesome promo video that motion graphic artist extraordinaire (and part-time white noise connoisseur) Charlie Chapman made for the Indie Sticker Pack:

iOSMatt VanOrmer
Sending Hand-Written Tasks from GoodNotes to Todoist Using Shortcuts

After listening to Cortex #101: Productivity 101, I’ve finally decided to give a real task manager an honest try. Thanks to the helpful folks on the Relay FM Members Discord, I’ve settled on Todoist as the task manager that best suits my needs. My previous system involved a mix of calendar events, Due reminders (an app I’ve praised highly before), and hand-written task lists in various GoodNotes documents spanning all areas of my life. I very frequently jot down to-dos during meetings and brainstorming sessions in GoodNotes, but this method has the major flaw of my quickly-scribbled tasks disappearing in GoodNotes and never actually being completed. It’s this bit of my legacy system that need some integration with the new system centered around Todoist.

Step 1: A Template for Hand-Written To-Dos

The first step in connecting my GoodNotes task lists with Todoist is creating a standardized format for when I do jot down to-dos in a given GoodNotes document. Luckily, GoodNotes has excellent support for custom notebook templates, so I set out to modify the standard GoodNotes line-ruled notebook template for my purposes. This was simple enough — export a blank GoodNotes page to PDF, and use Graphic (or any other vector graphic app) to add an area to the document specifically to accept hand-written to-dos in a consistent format. I opted for a small bubble in the bottom left with enough space for five tasks at any given time. I intentionally chose to match the font and bullet colors with the the standard GoodNotes ruled lines, so that when I didn’t need to add any tasks that area would not be too distracting.

A screenshot of a template being edited in Graphic on the iPad.
I also added a subtle “Date” line to my usual GoodNotes template, since I was going through all this effort anyway.

The small degree of structure added by five bulleted lines in a roundrect enclosure is an important ingredient in the success of this system (more on that in a moment) — that said, your own custom GoodNotes template may work just as well (if not better) for your specific needs.

Step 2: Tying GoodNotes and Todoist Together with Shortcuts

Perhaps a lesser-known feature of GoodNotes is its built-in ability to convert handwriting into text for saving or sharing to other apps, presumably using the same Vision framework that powers its document OCR. Using the lasso tool to select a handful of to-do items in the template we just made gives us the option to “Convert” those items into text. It ends up looking something like this:

Two screenshots of ink-to-text conversion in GoodNotes on iPad.
Using the Lasso Tool to select hand-written tasks allows you to convert it to text and share it with another app...like Shortcuts.

Importantly, the generated text also maintains the separate lines we enforced with our five-bullet custom GoodNotes template — which means parsing this snippet of text with Shortcuts is a trivially easy task. All we need to get this list of tasks from GoodNotes to Todoist is a Shortcut with five actions:

A screenshot of the Shortcuts app showing all of the actions in the GoodNotes to Todoist Shortcut.
Five simple actions takes my handwritten task list and sends each individual item to my Todoist Inbox.

Sharing the converted text from GoodNotes to this shortcut takes each line of text, converts it to Title Case, and add it as an individual task to my Todoist Inbox. With this simple shortcut, I can quickly convert all of my hand-written tasks from a meeting into actionable tasks in Todoist that are much harder to forget about. All I have to do is regularly triage my Todoist Inbox by adding due dates and reminders as needed to these imported tasks and sorting them into their appropriate projects. That said, the smallest of tweaks to the shortcut above lets you triage each item right away — simply change each of the parameters in the “Add Todoist Item” action to “Ask When Run”:

A screenshot of a Siri Shortcut with expanded Todoist actions on iPad.
If you’d rather triage your tasks right when adding them to Todoist, only a small modification is needed.

One Less Point of Friction

As I experiment with Todoist and task management in general, it’s been convenient to maintain “backwards compatibility” with some of my harder-to-shake habits — like writing down things I need to do in my meeting notes document on the fly. The ability to take these quick to-dos and funnel them directly into my task management system helps keep important items from falling into the cracks, and motivates me to rely more heavily on Todoist going forward.

You can click the following links to download the simple “GoodNotes ⭢ Todoist Inbox” shortcut, or the more complex “GoodNotes ⭢ Todoist Project Picker” shortcut for your own use. You can also download a PDF of my custom GoodNotes template here.