Apple Asked For Feedback

Apple asked for feedback from developers today in an email survey. I try to keep this blog positive and restrict most of my snark to Twitter, but I figured I might as well post it here, too.

If you can’t see that image for some reason, here’s what I wrote:

I’m a long-time, independent Mac developer. I’ve traditionally sold directly to customers and, now, with the Mac App Store, still push customers to my website first. The value Apple provides with the store is simply not even near worth the 30% cut. When selling directly to customers, after credit card fees, etc. I pay around 8%. I’d be happy to give Apple (maybe) 15% for the (limited) exposure the App Store offers. But not more than that.

Also, in general, the Mac App Store is a kafkaesque hellscape full of scam artists that erode customers’ trust in the overall system and shitty apps that are nowhere near the level of quality that long-time Mac users expect from 3rd party software.

Add to that the arbitrariness of App Review, which seems more interested in penalizing legitimate developers for the most insignificant of reasons, while big name companies get away with flaunting the rules, and fly-by-night developers actively ship malicious, misleading, predatory, and outright-broken software. I have no idea what the point of App Review is if they’re not going to enforce the rules consistently and actually vet the apps in the store.

I absolutely love developing for Apple’s platforms, but if you weren’t the 800-pound gorilla in the industry, there’s absolutely no way in hell I would put up with the shit you throw at honest, hard-working developers trying to better your platform and earn a living.

Missing Rdio and Making the Best of Apple Music with Shortcuts

Man, I miss Rdio. I mean, I really miss it. I loved that service.

When I was a teenager, I’d spend hours on the weekend and get lost in new and used music stores (CD’s) just digging through stacks of beautiful album artwork and unfamiliar band names. I’d talk with other customers and ask the clerk to let me sample a few tracks when something caught my eye. The joy was in the discovery as much as the actual purchase and listening that came later.

Rdio was the first streaming music service I used. It was like walking into an infinitely large music store. And it was all free! (Well, $10/month.) Their UI was wonderful. Websites today are walled gardens designed to keep you on the property for as long as possible. But Rdio, like the web of the late 90’s and early 2000’s, was overflowing with links leading through a maze designed to get lost in. Each album page – in addition to the artwork and song listing – had detailed info about the band, their other music, related artists, genres, etc. (The only similar mainstream experience I can think of today is when you fall down a Wikipedia rabbit hole.) And the majority of the pages had an in-depth critic’s take on the music in addition to listener submitted reviews that were generally well written and free of the awfulness we see in YouTube’s and Facebook’s comments section today.

What I’m trying to say is Rdio came very close to recreating the record store experience in digital form. Apple tried and failed with Ping and has since made additional social attempts inside Apple Music. I can’t really speak about what Spotify is like now. I was a subscriber for a few months after Rdio died, but it never really stuck for me – and Apple Music’s tight integration with Mac and iOS have kept me tied to their service instead.

So using Apple Music the last few years has been fine I guess. I can play what’s in my own collection (usually), and search their streaming library, but I find it extremely difficult to organically discover new music. It’s sort-of possible on the desktop with iTunes, but the iOS app (and I took a look just now to double-check) only shows “other albums by this artist.” The “For You” tab makes an attempt by showing other genres similar to what you already listen to, but I find their algorithmic recommendations lacking. And, again, if you do tap on one of the suggested albums, that’s about as far as you can go. You can’t further explore beyond that artist. And don’t even get me started on the “Browse” section or whatever the hell Beats 1 is doing. That’s a dumpster fire of shitty editorialized content that I can only assume is mass promoted by the record labels for the masses. (Yes, I might just be snobby and elitist about my music, but I really do have a lot of pop music in my collection that I enjoy. I just find most of Apple’s selections…shallow.)

Anyway, like I said, it’s fine. Not anything special, but fine.

But over the last few months I’ve made a conscious effort to start listening to more music again. I used to always have something playing in my bedroom, dorm, various apartments, and later houses. But I think once my kids were born, their needs and noise took over and music fell to the wayside. But now I’m using the wonderful Anesidora app to keep Pandora shuffling through songs in my office where I sit all day. I need to stay focused on my work, and having to think about and choose something to play takes me out of the zone. I like that I can just tell Pandora to play something it thinks I’ll enjoy and it will take care of the rest. It’s mindless and exactly what I want.

But Pandora typically only plays music I’ve already listened to and given a thumbs-up. It rarely surfaces new music. That’s what I still have to try and use Apple Music for. And I typically try and do that when I’m in the car.

Using your phone for anything while driving is stupid. So if I want to queue up some music, I have to do it when I’m still in the driveway or if I think I have time and it’s safe while stopped at a traffic light. But I need to be fast about it. And that’s where Marvis, Launch Center Pro, and Apple’s Shortcuts app come into play.

I discovered Marvis last month from Ryan Christoffel at MacStories. It’s a highly-customizable client for Apple Music. All of your songs, playlists, and the entire Apple Music catalog in a gorgeous, functional UI that you can design around your own needs. Here’s what my setup looks like:

Marvis Pro Screenshot

I’ve got the Home screen organized so that I can tap and play my most listened to playlists and albums without scrolling or having to dig through Music.app’s tabs and navigation stacks.

Specifically, at the top I can start any music I’ve recently added to my library. I’ll often go on a music adding binge and add a ton of stuff at once then finally listen to it days or a week or so later. This section collects all those albums in one spot so I don’t forget to try something new that looked interesting to me.

Beneath that are three of Apple Music’s main auto-generate playlists. Again, I have one-tap access to my Favorites when I want to hear something familiar and New Music that Apple thinks I might like (which is often hit or miss).

Further down the screen is “New For You”, which is a stream of new releases from artists already in your library. I’ve wanted this feature in iTunes for years, and I’m thrilled Apple Music delivered.

Of note: I’ve used the display settings in Marvis to pack as much music into as small a space as possible. This puts as many tap targets within “thumb reach” as possible and minimizes any scrolling I need to do. Very important when that red light could turn green at any moment.

Next up, if I want even faster access to my most common playlists, I’ve created three shortcuts in Shortcuts.app to play Apple’s “New Music for You”, “Your Favorites”, and their top Alternative songs and added them to Launch Center Pro’s excellent Today widget. From my phone’s home screen, I can swipe left and tap to start playing.

Launch Center Pro Screenshot

And going a bit further with Shortcuts, I’ve added two as icons on my home screen:

  • “Play Album”, which starts playing the full album that the current song belongs to. This is super useful when I’m listening to a suggested music playlist and it plays a new artist I’d like to hear more of.
  • And “Bookmark Song”. This adds the current song to a playlist I made called “Bookmarks”. I treat it like an Instapaper for music that I can come back to later when I have time to explore.

Shortcuts Screenshot

So, that’s my music setup at the moment. I achingly miss Rdio but am trying to make the best of Apple Music by making it as easy as possible to listen to the music I love and explore the new songs it thinks I’ll enjoy.

Starting and Finishing More Long-Form Writing in Drafts.app

I’m writing this blog post in Drafts.app on my Mac. But before I publish it, I’ll also probably do some light editing of it on my iPad before bed. And I’ve been capturing ideas, short thoughts, and building a basic outline on my phone over the past few days as things occur to me or I find myself with a bit of downtime.

I’ve been a heavy Drafts.app user on iOS for years. But this workflow is relatively new for me and came about with the release of its Mac counterpart two months ago.

Previously, for going on I don’t know how many years, all of my long-form writing, which typically means blog posts, has lived exclusively in MarsEdit. (Really long-form stuff like magazine articles and a few aborted attempts at writing a book are done in Scrivener.) The app syncs perfectly with WordPress and allows me to write in Markdown and preview my words in a live, pixel-perfect preview of my blog’s template.

But MarsEdit doesn’t sync between my desktop and laptop. And there’s no iOS counterpart for writing on-the-go. So that forced me to write the whole post from first draft to published version on the same machine. It also meant the outlines for my longer posts and short scribblings lived in other apps – sometimes OmniOutliner, other times Apple Notes, and occasionally OmniFocus and Drafts.app. I didn’t have a single unified workspace for all my thoughts.

Drafts for Mac has changed that. With seamless sync, I can begin writing anywhere I want, come to a stopping point, and pick back up later exactly where I left off on any device.

Dr. Drang wrote last week

Drafts has become the place “where text is.”

I couldn’t agree more. Looking through my Drafts Archive section, it’s now overflowing not just with short beginnings and snippets that got quickly shuttled off to other apps, but real writing. It’s my one place for everything in-progress as well as a history of final outcomes.

As for the specifics of my new blogging workflow, all of my posts are assigned a tag of blog. (It’s currently the only tag I use for anything.) Then, I have two custom Workspaces.

One called “Blog Posts” which only shows drafts tagged blog, defaults to Markdown syntax highlighting, and automatically switches to my Markdown helper keyboard on iOS.

And then there’s another workspace titled “Everything”. It doesn’t actually show everything. Rather, it’s everything that’s not tagged with blog. I’ve currently got about twenty unfinished posts in some form or another in my Inbox. I don’t want those clogging up and crowding all my other notes which tend to be more “action oriented”.

These two workspaces let me quickly switch between notes that I might need to do something with or reference and those that stick around longer and require a more focused, creative mood to tackle.

And as an added bonus, the Mac app can now show a live preview of your post rendered in your website’s theme, too – just like MarsEdit. (The iOS app has been able to do this for a while as well, but it doesn’t let you see the preview and edit text at the same time.)

Anyway, that’s all a long way of saying that I couldn’t be happier with this new setup. Drafts truly is where all of my text starts.

Losing Faith

I posted this to Twitter earlier today, but thought I’d add it here for posterity…

Last week I mentioned that I had been yelling about Apple a lot on here lately and was going to try and be more positive. But allow me one more thought before I shut up…

We went on vacation this past week. Before we left I updated my phone to iOS 12.3 – my wife remained on the previous version. (This is where you all collectively go “uh-oh”.)

Spent five days at a state park shooting tons of video of the kids swimming, hiking, fishing, playing with their grandparents, etc. Irreplaceable stuff.

Get home, back on WiFi, start uploading everything to iCloud and Google Photos. After an hour or two everything’s synced.

Problem: All videos, of any length, stutter, stall, and skip frames in both Photos.app (macOS) and Google Photos on every Mac I try. Completely unwatchable. Time to debug things.

I export the raw files out of Photos.app to Finder and try opening with QuickTime. Same problem. Next, I use Photos.app to import directly from my phone via USB. Still broken.

But they play fine on iOS, so I never noticed any problems while filming last week.

Investigate further. It’s only MY videos that are broken. Videos my wife took are fine. Remember: I’m on 12.3. She’s on whatever 12.2 release was before.

All those videos of my kids? Gone.

This is a core competency of iOS that should never, ever fucking break for any reason. Apple markets iPhone’s camera as a top selling point – if not THE selling point.

Lucky for me, I’m tech savvy enough to know about Image Capture.app buried inside macOS’s Utilities folder. So I give it one last try using that to transfer the corrupted videos manually off my phone and into Photos.app and Google Photos.

It works. My memories are safe.

But would a normal Apple customer have thought to try that? Would an Apple Genius have figured it out? (Assuming they could even get an appointment.)

No. They would have simply lost everything.

This is fucking inexcusable on Apple’s part. DO NOT fuck with me when it comes to my photo library.

Apple needs to get off their goddamned pedestal, stop hosting self-congratulatory Lady Gaga concerts, and fix their fucking QA process, years-old bugs, and keyboards.

On the bright side, while I may never be able to trust Apple again with my photos (or type vowels on their laptops), at least they’re about to roll out a new credit card and custom-branded television content.

Courage.

Why Many of my Apps Failed And What Comes Next

I’ve started building something new.

I’m about four weeks in and already finding it incredibly useful in my day-to-day.

I’ve built many different apps over the years, thrown them against the wall, and excitedly watched which ones developed a following and which ones failed miserably.

Most of my apps have fallen into two categories. There are the ones that solve a personal need I face, that I can inform and direct with my own experiences. And there are those where I saw a market opportunity or just thought they might be fun to build.

Almost all of the ones in that second category have failed. Incoming!, Nottingham, Highwire. They each had their share of a few passionate and engaged users, but mostly were ignored. (The jury is still out on Triage.)

But that first category of apps? Those have flourished.

I was a web developer for ten years before I started building Mac apps. I know the industry well. And working at an agency meant I was juggling many different websites at once. I needed a faster/easier way to spin up local development environments, and that led to me creating VirtualHostX. Which, in turn, led to Hostbuddy and Hobo years later.

My core set of apps, as I think of them, found a wonderful niche among solo web designers and developers and the small companies they work for. And the apps have succeeded beyond my wildest dreams. From 2012 to 2014 they were my full time and only job.

But since their heyday in 2014, sales have steadily declined. A big part of that, I think, is because the world has moved on from the LAMP-based standards of 2004 – 2012. Nginx, NodeJS, etc. have led to a sea change. If it weren’t for WordPress’s continued dominance, I’m not sure if I’d have any more sales at all.

So, I’ve seen the writing on the wall for a few years now, and have been on the lookout for ways to branch out and diversify my app portfolio.

I’ve done some freelance jobs here and there, and tried a few new things on my own, but nothing has taken off. And as I talked about earlier, I think a lot of that is due to none of those new ventures being true passion projects that I could bring my own experiences as a user with specific needs.

But four weeks ago I finally became fed-up with the awfulness of Mint.com. I know they’re able to provide a free service because they plaster the site with advertisements and sell my data, and I’d be ok with that if they weren’t so intrusive. But they’re taking over nearly the entire browser window now. Add to that the cumbersome Web 2.0 UI and lack of any real reporting capabilities, and I’d had enough.

What I really want is a fast, powerful, native Mac app that automatically imports my financial data and gives me the ability to slice, dice, filter, organize, and export my data in every possible way. The flexibility and power of an Excel sheet with the learning curve of iOS and the familiar paradigms of a real Mac app. Something that keeps me in control of my data, respects my privacy, and syncs to all my devices.

So I built it.

Preview1

Most of it. It’s not done yet, but all the major pieces are in place, and I’m using it to track my family’s budget every day.

I’ve taken a heavy dose of inspiration from one of my favorites apps – OmniFocus – both from a UI perspective (a clean, modern, attractive Mac interface) and from the power they afford users over their data by way of custom perspectives.

My app is smart. It auto-categorizes your transactions. You can just let the app do its thing and everything will end up in the (mostly) appropriate place. Or you can categorize each transaction manually. Or you can setup smart rules to do it for you automatically. Whatever fits your workflow.

Each transaction can belong to a single category. But categories can be nested. With one click you can see all the dining out you did last month. Or just the fast food orders. Or just what you spent at McDonalds.

And then there are tags. Assign multiple tags to a transaction. Do it manually, or create a smart rule to assign them automatically. Then use the app’s powerful search feature to find any combination of AND / OR.

Take search further by combining tags with categories and date based filtering. Find every Uber ride tagged #business during the last quarter and export the results to a CSV you can send to your boss to get reimbursed. Snapped a picture of the receipt with your iPhone? Yep, you can attach files, too.

And once you’ve got that perfect search query and set of filters in place, save it as a new Report that you can recall at any time. Just like an OmniFocus perspective.

And, just for fun, why not view all of your transactions plotted on a map?

Preview2

I’ve got all of this working (albeit without the necessary UI/UX polish) and it’s totally opened my eyes to some aspects of our financial situation that I’d overlooked. The last major piece is adding a budgeting component. I know the system I want to adhere to, but I’m still working through how it will fit in the interface.

Of course, I’m leaving out the iOS counterpart. But I’m saving that for later. The model layer is still a bit too much in flux. But I’ve written all the business logic to be platform agnostic. So the plan is to reimplement the appropriate features in UIKit (not everything the Mac app can do would make sense or be needed on a mobile device) and reuse as much of the existing codebase as possible.

But don’t forget syncing. As I said in my requirements, I want this app to be privacy-focused and have the user be in charge of their own data. So, no financial data will ever touch my server. Unless they enable syncing, no data will ever leave their device. But if they do want to sync, that’s all privately handled by CloudKit so I, the developer, can’t see their info even if I wanted to.

So, that’s it. That’s what I’ve built and am working towards completing. I have no idea when it will be ready. CloudKit could easily throw a big wrench into everything. And I’ve also got major updates to VirtualHostX and Hostbuddy underway and due out this Fall.

But I’m excited. It’s an app I’m passionate about and I have a clear direction and feature set in mind. It caters to a broader audience than my developer-focused products and could potentially save my tiny company if they continue to trend downwards.

iTunes Match Failed Me

Remember iTunes Match? It's great. But Apple stopped promoting it (probably rightly so) a couple years ago when they realized they could make more money charging $10/month for Apple Music than Match's $25/year.

Anyway, I loved it and still do. It uploads all of your digital music to Apple's cloud and makes it streamable on all of your devices. And I mean all of it – especially your ripped mp3s, live albums, or anything else not in the iTunes Store. And if they can "match" any of those unofficial mp3s to a song from the store, they'll "upgrade" you to the higher-quality AAC file for free. I had thousands of low quality mp3s ripped in the early 2000's and late 90's. Now they're metadata tagged appropriately, with artwork, and sound better.

When I first joined iTunes Match (seven?) years ago, I uploaded all my music, made a backup of my local library, deleted everything, and just streamed from then on to save hard drive space.

As I acquired new music, it went to Apple's cloud, but I never got around to backing it up offline.

As I've been writing about this month, I'm re-evaluating my backups strategy. This week I got around to looking at my music collection and decided it was time to retire that old external drive and put everything in B2 – around 300GB.

Knowing that drive was out of date, I figured I'd just download a fresh, complete copy from Apple.

I selected everything in iTunes, and clicked the download button. And waited.

The next morning I found my nearly 25,000 tracks stored locally – and a ton of errors.

Out of the 25,000, nearly 1,500 had failed to download and reported all sorts of various network errors.

I made a quick smart playlist showing all songs in the cloud but not available locally. This made it easy to isolate the problem items.

I tried downloading all the missing songs, but each one failed again. So I tried downloading a few individually with no luck. You can see where this is going.

After much testing and troubleshooting these 1,500 songs (all from various albums, some from ripped CD's, some purchased from the iTunes Store) are seemingly gone.

It's not the end of the world. If I really want some of them, I'm sure I could just re-purchase or stream from Apple Music. But others, especially some amazing live albums I collected in college are gone.

So I uploaded what I had to B2. And then made a csv export of the playlist of missing songs for good measure.

And while I love and take advantage of the cloud's convenience, this is why I don't trust my data to be in only one place. It's my fault for not backing up this part of my data if it was important to me. It's the first real data loss I've experienced in years – maybe since 2010. Maybe it's just a bug that Apple will eventually fix.

But I've learned my lesson.

Moving back to Google – just a little bit

I’ve been hosting my company‘s email with FastMail since 2008. They’re amazing. But my personal email had been with Gmail since the service was in beta in 2004. (And everything before Gmail lost to time and bit rot. Sigh.)

Around five years ago, I started getting nervous with so much of my online identity tied to an address that I was essentially borrowing and had no real control over. I was never worried about Google losing any of my data, but I had heard countless horror stories of Google’s AI flagging an account for some type of violation and locking out the user with no recourse.

If I ever lost access to my primary email account, I’d be dead.

So I began the rather annoying process of moving all of my online accounts over to use a new address at a domain I control. FastMail imported everything from my old Gmail and Google Calendar account, and with the help of 1Password, I was able to methodically switch my email everywhere else over the course of a few weeks.

I’ve been using my new address full-time for the last five years and now get only two or three non-spam emails a month to my old Gmail account.

Soon after switching emails, I began to question my other dependencies on Google. Along with Facebook, I started worrying about all the data they were collecting on me. I was also concerned about how I was playing a part in their monopoly over the web as a whole.

So I switched to using Duck.com as my full-time search engine. And I gave up Chrome in favor of Firefox. I even tried using Apple Maps as much as possible. In short, even if the alternative service wasn’t on par with their bigger competitor, I felt it was worthwhile to give them my support to encourage a more balanced ecosystem.

The switch mostly went well. I felt like the search results I got with Duck.com were good enough. I only had to fall back to Google for the occasional technical query. Firefox also made great strides with its support for macOS during that time with their Quantum project. And Apple Maps, despite all the awful reviews online, worked just fine navigating around Nashville for me.

But over the last year I’ve started, slowly, coming back to Google’s services.

It all started with Google Photos. I (mostly with the help of my own backup strategies) trust iCloud with my family’s photo archives. But Apple just makes it too inconvenient to use with a partner. Because of the way iCloud is siloed per user, my library is completely walled off from my wife’s. That means I can’t see photos of my kids that she takes. And she can’t see mine. Google Photos supports connecting your library with another person’s. (While that’s a super useful feature, we don’t do that. For our workflow, it’s easier just to sign into my Google account in Google Photos on my wife’s phone so everything funnels into one primary account.)

And while Apple’s Photos.app AI-powered search is mostly-good, it’s limited by their privacy stance and what they can process on-device. And the result is that it can’t even begin to compete with the ways I’m able to slice, dice, sort, and organize my photos with Google.

Is Google using the faces and location data in my photos to train their robot overlords? Most definitely. Do I care? Yes. But is it enough to outweigh the benefits I get from their otherwise amazing offering that I pay $10/month for? For me, no.

Added to that is the degradation in quality I’ve seen in Duck.com’s search results since last year. I’m not sure what changed under-the-hood, but I found myself having to search a second time in Google way more frequently to the point where I just gave up and made Google my default choice in January.

I’ve been a paying customer of Dropbox since 2008 (or 2009?). But because of the $10/month I was paying Google for extra photo storage space (2TB) (which I get to share with my wife’s Google account), and the $10/month I pay for extra iCloud storage (which I also get to share with my wife), it just didn’t make sense to keep paying for Dropbox as well when I could use Drive instead. And you know what? After using Drive for the last six months I’ve found that it’s really quite nice. Especially with the added benefits of everything integrating with Docs and Spreadsheets and their very capable (but decidedly non-iOS and ugly!) mobile apps.

Further, although not really that important, I’ve also migrated my calendars from FastMail back to Google Calendar simply because every other service in the world that wants to integrate with my calendar data (and that I want to give permission to) supports Google’s protocol but not standard CalDAV. It’s a shame, but I’ve decided to make my life easier and just go with it than wall myself off by taking a principled stand for open data.

What does this all mean?

I still use Firefox. I stick with Apple Maps when possible. But I’ve slowly moved back to Google’s services in cases where they’re so far ahead of the competition I just can’t help it, which has created a bit of a halo-effect with their complimentary services.

And in a most-decidedly un-Googly turn of events, customers of their Google One extra-storage plans can now talk to a Real Live Human if something goes wrong. That gives me much more confidence in my precious data’s longevity with them, which is what drove me away from Gmail in the first place.

Dammit, Google. I don’t trust you. But I can’t quit you, either.

Finder Folder Actions not being triggered when files are added with rsync

A couple weeks ago I wrote about how I was automatically capturing the photos and videos my kids’ daycare emails to me and importing them into Photos.app. The major pieces of that script worked fine – parsing the emails, downloading the images, and then rsync’ing them down to my Mac every hour.

But what was failing was the Finder Folder Action I setup that was supposed to import the files into Photos.app whenever new ones were added to that folder.

For some reason, the Folder Action would only occasionally fire. Maybe for one out of every ten items. Sometimes, if I navigated to the folder in the Finder, the action would kick-in and import everything. But sometimes not.

All I can think is that because the files were being added to the folder via rsync – using some BSD-like filesystem APIs instead of the higher-level macOS ones – the Folder Action was never being triggered. Again, it occasionally worked, but mostly failed. So I could be entirely wrong about all of this.

Anyway, I rewrote the whole thing to just run an AppleScript every hour via cron, which handles the whole process itself. Since making that change it’s been working perfectly.

Maybe someone reading this will find it helpful.

Fixing Broken Backblaze B2 Scripts when Run From cron

Just a quick note for my future self and anyone else who might be running into this problem.

Last week I migrated all of my backups off of Amazon S3 and rsync.net to Backblaze B2. The cost savings are enormous – especially for a small business like myself. And the server-to-server transfer speeds using their b2 Python script, while not as fast as using a raw rsync connection, are quite a bit quicker than using S3.

Before committing to B2, I gave it a really thorough test by seeding it with 350,000 files totaling 450GB. The whole process took about eight hours coming from my primary Linode server in Atlanta. I was quite pleased.

Anyway, after testing all of my scripts, I put them into cron and ignored them for the next few days assuming they’d “just work”. But when I went back to check on them, I found every one had been failing silently.

At first I thought maybe the b2 command wasn’t found in $PATH when running via cron for some reason, but that wasn’t it. Next I double-checked that b2 was using the correct credentials I had previously authorized it with by hand. Nope.

Turns out, b2 was throwing this Python exception.

Creating a Pipfile for this project...
Creating a virtualenv for this project...
Traceback (most recent call last):
  File "/usr/local/bin/pew", line 7, in <module>
    from pew.pew import pew
  File "/usr/local/lib/python2.7/site-packages/pew/__init__.py", line 11, in <module>
    from . import pew
  File "/usr/local/lib/python2.7/site-packages/pew/pew.py", line 36, in <module>
    from pew._utils import (check_call, invoke, expandpath, own, env_bin_dir,
  File "/usr/local/lib/python2.7/site-packages/pew/_utils.py", line 22, in <module>
    encoding = locale.getlocale()[1] or 'ascii'
  File "/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/locale.py", line 564, in getlocale
    return _parse_localename(localename)
  File "/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/locale.py", line 477, in _parse_localename
    raise ValueError, 'unknown locale: %s' % localename
ValueError: unknown locale: UTF-8

I’m hardly a Python expert, and I’ve traditionally had nothing but problems anytime I’ve had to do anything with pip, so this didn’t surprise me. What did surprise me was that this error was happening both locally on my Mac (10.14.4) and on my remote Ubuntu 18.04 box.

After some googling I found this bug in pipenv. The solution is to add the following to your b2 scripts that are run by cron:

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8

And that fixed it.

I know macOS ships with a mostly-broken installation of Python, but the latest Ubuntu LTS? Anyway, if this is common Python/pip knowledge, at least now I know, too.

A Faster Way to Create Multiple Tasks in OmniFocus (with all sorts of details!) Using Drafts.app

Following-up on my previous post about using Drafts to create new GitHub issues, here’s another action I built and use all the time.

This allows you to create multiple tasks in OmniFocus with defer dates, due dates, and tags in one step.

It does this by parsing a compact, easy-to-write syntax that I’ve adopted from other OmniFocus actions and tweaked to my liking and then converting it into TaskPaper format, which can be “pasted” into OmniFocus in one go. This removes the need to confirm each individual action separately.

Yes, you could also do this by writing your tasks in TaskPaper format directly, but I find its syntax (while innovative!) a bit cumbersome for quick entry. The format this action uses isn’t as feature-rich, but it does everything I need and with less typing.

Instructions:

Each line in your draft becomes a new task in OmniFocus, with the exception of “global” tags and dates, which I’ll describe later.

Each task goes on its own line and looks like this:

Some task title @defer-date !due-date #tag1 #tag2 --An optional note

The defer date, due date, tags, and note are all optional. If you use them, the only requirement is that they come AFTER the task’s title and the “–note contents” must be LAST.

The defer and due dates support any syntax/format that OmniFocus can parse. This means you can write them as @today, @tomorrow, @3d, @5w, etc. If you want to use a date format that includes characters other than letters, numbers, and a dash (-), you’ll need to enclose it in parenthesis like this: @(May 5, 2019) or !(6/21/2020).

Global Defer/Due Dates:

By default, tasks will only be assigned defer/due dates that are on the same line as the task title. However, if you add a new line that begins with a @ or ! then that defer or due date will be applied to ALL tasks without their own explicitly assigned date.

Global Tags:

Similarly, if you create a new line with a #, then that tag will be added to ALL tasks. If a task already has tags assigned to it, then the global tag(s) will be combined with the other tags.

Full Featured (and contrived) Example:

Write presentation !Friday #work
Research Mother's Day gifts @1w !(5/12/2019) --Flowers are boring
Asparagus #shopping
#personal
@2d

You can install the action into your own Drafts.app from the action directory.