Mastodon miscellany

I’ve been collecting odds and ends about Mastodon over the past couple of weeks. Time to dump them all out of my head into this post.

Let me be the last to tell you about Ivory, the iOS/iPadOS Mastodon client by Tapbots, the folks who made Tweetbot. If you listen to Applecentric podcasts and read Applecentric blogs, you probably learned that Ivory is the greatest app in the history of apps, and you should send them all your money right now, even though it’s still incomplete.

As you may have gathered, I was a little annoyed by the hoopla. Tapbots and I have always had a good business relationship. I bought Tweetbot, liked it, and continued to buy updates when they came out. When it switched to subscription, I hesitated a bit—I was in one of my periodic “I should get away from Twitter” phases—but signed up. Fundamentally, the deal was that they made something I wanted, priced it reasonably, so I paid for it. This is how it should be.

The thing I didn’t like about the Ivory hysteria was that it was treating Tapbots as sort of a charity, which it is not. If you’re thinking about subscribing to Ivory, you should know that other apps are more complete clients—they provide more of the full Mastodon experience, and you can do more with them. Tapbots has always been up-front about this. Ivory is a bit of a rush job, put into the App Store earlier than planned because Twitter killed Tweetbot when it killed other third-party apps.

Don’t get me wrong. I like Ivory. I was lucky enough to get in on the beta (or was it still alpha?) back in December and have been using it ever since. I’m a subscriber because I’ve weighed the pluses and minuses and decided it’s worth the subscription fee. This is still a business relationship, not philanthropy.

The reason I pay for Ivory is the look-and-feel argument that John Gruber laid out. Except that I’m not comparing Ivory to Android Mastodon clients; I’m comparing it to the other iOS clients. While I like Metatext, Ice Cubes, and Tusker—all of which are on my phone—they’re just not as comfortable to use as Ivory is. This is a subjective thing, of course, and is undoubtedly due in part to my many years of using Tweetbot. But I can’t force myself to prefer another app. I really wish I was more comfortable using Ice Cubes, because it includes the ability to edit posts, a key Mastodon feature. But I keep opening Ivory instead (and keep hoping to see post editing in every beta I download).

I switched Mastodon instances recently. I started on back in 2018 and moved to for a couple of reasons:

  1. I’d been hearing negative things (mainly from Anil Dash, who left a month or so ago) about the people who took over the instance. The complaints were kind of vague, so I didn’t take immediate action, but it did put the idea of switching into my head.
  2. is using an older version of the server software which didn’t allow editing of posts. You might wonder why I care about this if I’m using a client that can’t edit posts. Because it’s easy to switch clients (or go to the website) for a minute or two to make an edit. If I’m on an instance that doesn’t allow editing, I’m stuck. And I didn’t want to be stuck anymore.

So I put in a request for an account at and got approved a few hours later. I exported my archive and the list of people I was following from and began the migration.

Mastodon has a set of instructions for migrating servers, but I found this guide at Nerds Chalk to be more useful. It’s more explicit about all the steps and about which server you’re looking at when you do each step. While following the process, I had three Safari tabs open: on the left, the instructions in the center, and on the right. This helped ensure I was doing the right step on the right server.

After you’ve completed the process, the instances that your followers use are supposed to be notified and automatically switch to your new instance. Because this is distributed across many servers, it might take a while to complete. I started my migration around noon and it seemed to be complete by the end of the day. I got a notification every time a follower’s instance did the automatic switch, so there were lots of notifications that day. I know my follower count went down slightly in the switch, but I believe the lost followers were associated with inactive accounts.

The people you follow (and the lists you’ve made, the people you block or mute, and any bookmarks you’ve created—I didn’t have any of these) are not automatically migrated to your new instance. That’s why you download these lists as CSV files before moving. After you’re set up on the new instance, you upload the CSV files. The people you follow will get notified that your new you is following them. I lost a handful of people I follow during this step. I think all of them were on the defunct (but see below) instance that Jason Snell had set up several years ago for The Incomparable panelists. So the failure to follow them made sense. They were no longer at a address, and I had followed them at their new instances without deleting their old addresses.

Overall, I’d say the migration was fairly painless, especially after I found those Nerds Chalk instructions. Much easier than getting a new email address and letting all your friends know about it.

Last night, Jason revived, so I got to see the migration process from the other side. It was a little more confusing than I expected. I’ll use Dan Moren’s migration as an example.

First, I got the notifications that Dan (at was following me. This was well before I started following him at the new instance. Here’s what his account page looked like in Ivory:

Dan Moren page in Ivory

The Follow button indicates I’m not following him, which is true but certainly not the whole story. I’m not following him yet because the migration of his followers isn’t complete.

On the web, Dan’s account page looked like this:

Dan Moren page on web

Here, the button suggests (to me, anyway) that I’ve made a follow request to Dan and he’s still thinking about it. It sounds like that to me because you can set up your Mastodon account so that followers have to be approved. But Dan wouldn’t do that, would he? Of course not. The “request” mentioned in the button came, in a sense, from Dan when he migrated. More accurately, it’s a request from one computer to another as part of the automated migration process. I would suggest to the folks at Mastodon that they should come up with different language for this situation.

And I’d suggest to Tapbots that they need to work on their entire approach to these conditions. Ivory makes it look as if Dan were just anyone in the Fediverse that I’m not following. It makes it look as if the migration process screwed up, when all that’s happened is that it’s running a little slowly.

And yet I’m still using Ivory because of how much I like the look and feel.

I’ve been fiddling around with the Mastodon API and have found that it’s more or less as easy to use as the Twitter API (yes, we’ll get to that, too). Here’s a simple example inspired by Glenn Fleishman.

If you follow Glenn, you’ve noticed that he was keeping close track of his follower count as it approached 10,000 (he’s using the occasion to offer 10% off his books). I wondered how easy it would be to track that figure with the API instead of going through an app or the web.

Pretty easy, as it turns out. I’m going to use curl to make the API calls and jq to process their JSON output. curl comes preinstalled on macOS, but you’ll have to install jq on your own (I used Homebrew).

You can use your Mastodon ID to make the API call, but it’s not necessary. We’ll use the lookup API call, and we’ll give curl the -s option to silence the download progress meter:

curl -s '' | jq '.followers_count'

This returns my count of followers. You have to call lookup at the instance where the user lives. Asking for Glenn’s follower count at, for example, wouldn’t work. The call to lookup returns a JSON object with lots of info about the given user’s account, but by passing that through jq, we can extract just the follower count. We can get the following count similarly:

 curl -s | jq '.following_count'

Even better, we can put both of these together, along with some other info, in a simple pipeline:

curl -s |\
jq -r '.followers_count, .following_count, .statuses_count, .last_status_at' |\
paste -d ' ' <(printf "Followers:\nFollowing:\nStatuses:\nLast status:") -

As I sit here, this returns

Followers: 4344
Following: 96
Statuses: 74
Last status: 2023-02-05

which is pretty nice. jq is now being asked to return four pieces of information. The call to paste puts the headings in front of the values. You can make this quickly accessible by using it in a Shortcut or a Keyboard Maestro macro.

Update 2/6/2023 8:22 AM
Thanks to David Marsh for showing me jq’s -r option for avoiding quotation marks in the output of string values. I originally had a call to sed to strip out the quotation marks, which was unnecessary.

David also suggested doing all of the formatting in jq:

curl -s |\
jq -r '{
        "Followers": .followers_count,
        "Following": .following_count,
        "Statuses": .statuses_count,
        "Last status": .last_status_at
} | to_entries[] | "\(.key): \(.value)"'

There are definitely advantages to this. The connection between the headers and the values is more explicit, which is a big help. But I’m still partial to my paste solution, mainly because paste is the longstanding Unix solution to the problem of putting text together column by column. I understand paste in a way I simply don’t (and may never) understand that last line of jq code.

This is, without question, a failing on my part. I haven’t dug into jq deeply enough to know what to_entries is doing. And I’m not sure I want to do that digging. For me, jq is mainly a quick way to explore JSON (its pretty-printing is a marvel all by itself) and extract pieces of data from it. If I need to do more, I’ll switch to Python, which gives me more programming power overall and a more comfortable syntax.

It should go without saying that I may eat these words if people like David keep showing me more I can do with jq itself.

You may have noticed that the number of statuses shown above is kind of small. That’s because it’s counting only what I’ve done at Which got me thinking that my profile page tells people only how long I’ve been at this new instance. It makes it look like I just started with Mastodon when I’ve really been using it off and on (mostly off) since 2018. So I decided to add a link to my previous Mastodon profile page.

Mastodon profile page with link to previous instance

OK, let’s finish with a little Twitter talk.

Last week, Twitter announced that it was shutting down free access to its API as of February 9. This meant that a lot of fun bots and other automatic posting scripts would stop working. I had two main concerns:

  1. My script that automatically tweets out a link to newly published blog posts would fail.
  2. NetNewsWire would no longer be able to show me the tweets of accounts that haven’t moved to Mastodon.

Of these, the latter is more important. I figure the people who read this blog are either using RSS directly, or have started following me on Mastodon, so that takes care of #1. But I will miss seeing those English canal bridges. I won’t miss them enough to open Twitter, though.

Last night, shortly before API access was to go behind a paywall, Elon Musk tweeted out a change to the change in policy. Now—unless he changes his mind again—bots that provide “good content that is free” will be allowed to keep using the API at no charge. Who meets this criterion? Who knows? I hope NetNewsWire does, but I wouldn’t be surprised if the chuckleheads left at Twitter would look at NNW and think it’s a commercial product.

As for me, certainly I like to think I provide good content that is free, but I’m not interested in keeping track of how the Twitter API is being doled out. This will be the last post that gets an announcement tweet. I’ll save the autotweeting script as a bit of nostalgia, but I’m taking it out of service.