Fox News in the, uhm, news today reminds me of last month when I was in Dallas. I worked from a coffee shop near my hotel one morning, Flying Horse Cafe. They had Fox News on the TV. Took me by surprise as an Austinite... No way you'd ever see that here, but oh yeah, I live in Texas.
2023-04-24
Why Micro.blog is supporting Bluesky now
Today we enabled Bluesky as an option in Micro.blog. This adds to our existing cross-posting feature that supports platforms such as Mastodon, Tumblr, Medium, and Flickr. When you post to your blog, Micro.blog can copy the post to any of these platforms automatically.
As Twitter continues to implode, we are seeing a renewed interest in the open web and decentralized social media. It's an exciting time. Mastodon and the larger fediverse have grown to nearly 9 million users. Micro.blog is part of that with its support for ActivityPub, so Mastodon users can follow and reply to Micro.blog users directly.
While Mastodon and ActivityPub have most of the attention, I'm not entirely sure how this next generation of open protocols is going to shake out. I like how Bluesky is focused on domain names and data portability, principles that are shared by the IndieWeb and Micro.blog. Whatever happens with Bluesky, I think there's inspiration here that can benefit other platforms as well.
That's why we're adding support for Bluesky now, even before the Bluesky folks have rolled it out to everyone on their waiting list. Micro.blog has never been about a single protocol. It's about putting your blog at the center of your online identity, the place where you can post short posts, longer essays, photos, podcasts, or whatever else you want to share.
It's still early. I'll be watching how Bluesky evolves. There will be challenges to potentially intertwine different approaches to federation. But now is not the time to build walls. Let's try a few things, new ways to connect platforms, knowing some might not pan out, because that's how the open web gets better.
2023-04-24
This is not exactly a commentary on any specific platform, but you can just tell when the creators of a tool use their own stuff and engage with the community. The farther you get away from that, the less confidence users will have.
2023-04-25
Added a basic import in Micro.blog for folks migrating from Substack. For now, just blog posts. Still need to think through email address import for newsletters... Want to make sure it can't be abused by spammers. (Substack's HTML is so verbose. Tried to clean it up a little on import.)
2023-04-25
U2 tickets for the Sphere in Vegas going on sale later this week. Need to somehow fit this into my plans for the fall.
2023-04-26
Some technologies just keep coming back... Currently writing XML-RPC code, this time for JavaScript. Despite the new-ish JSON APIs in WordPress, not to mention Micropub, MetaWeblog is still the best way to talk to WordPress without any extra plugins or configuration.
2023-04-26
I'm always fascinated when our new AI bot overlords get really basic facts wrong. They know the answer, but can't put it together until you press them on it. Here's a quick transcript from ChatGPT that I ran into today.
2023-04-26
I'm seeing lots of Bluesky takes that are a variation of: "Oh jeez, we just moved from Twitter to Mastodon, now there's another new thing?" But indie microblogging is about moving away from centralized platforms to blogs and open web-friendly protocols. Anything in that spirit should be explored.
2023-04-26
I know I've written about this before, but it's worth repeating: Micro.blog is constantly shifting priorities based on what people are talking about. If we only hear a feature request every few months instead of every week, it is probably going to drop off our radar, even if we want to do it.
2023-04-26
Just released a new 3.0 beta of Micro.blog for iOS. This includes a big change, borrowed from the 2.x versions: Markdown syntax highlighting when writing new posts. We are getting close to release. The only major feature left is WordPress posting support. TestFlight here to follow along.
2023-04-26
Sometimes coding is hard, but not usually. It's figuring out how something should work that takes all the time.
2023-04-27
Continuing to tweak our Bluesky cross-posting support. Should work better with inline links in blog posts now.
2023-04-28
I've been impressed with Bluesky's performance. It has inspired me to shave off a little time for some Micro.blog API requests. We usually think of "under a second" as fast enough, but 0.8 seconds vs. 0.4 seconds is actually pretty noticeable.
2023-04-28
The renewed interest in open, social web protocols has been a long time coming. It's like we were in a drought for most of the 2010s, subsisting on the water leftover from the early blogosphere, and now it's raining. Drink up, folks! The skies are blue and the future's bright.
2023-04-28
Finished reading: Spinning Silver by Naomi Novik. I really enjoyed this story. First-person for multiple characters was a little awkward, though, and maybe held it back from what it could’ve been. 📚
2023-04-28
Austin sky before thunderstorms arrive in a few hours, supposedly. ☁️
We updated the Micro Camp web site for 2023. Register for free if you'd like to join us May 19-20. Everyone gets a new sticker too! Special thanks to @Burk for the sticker design.
2023-04-28
Listening to Dithering today about game consoles... If you have 2 consoles, you have Playstation + Switch, or Xbox + Switch. If you have 2 social networks, maybe you have [insert popular network] + Micro.blog. The hard part is carving out a unique, invaluable niche.
2023-04-28
The storm is about to hit. Waiting it out downtown instead of on the highway. ⛈️
Getting started with Bluesky XRPC
I’ve done a little work now with the XRPC layer of the AT Protocol, supporting cross-posting to Bluesky from Micro.blog. This post is about what I've learned.
(As an aside, there have been questions about whether Micro.blog supporting Bluesky means we believe in everything they’re doing. No, right now I’m mostly interested in the technology. It’s still too early for judgements on the Bluesky leadership, user experience, or ultimately how this is all going to fit together with other social web protocols.)
Bluesky authenticates with a username and password. For third-party apps, the password can be an app-specific password. I hope that eventually Bluesky will support IndieAuth, a flavor of OAuth designed for signing in to web sites that should also work well for a distributed service like Bluesky.
The HTTP POST with JSON for signing in looks like this:
POST /xrpc/com.atproto.server.createSession
Content-Type: application/json
{
“identifier”: “email-address-here”,
“password”: “password-here”
}
You’ll get back an access token and refresh token. Sessions do not last very long, only a couple hours last time I checked, so it’s important to keep the refresh token. The response looks like this:
{
"did": "did:plc:abcdef12345",
"handle": "manton.org",
"email": "email-address-here",
"accessJwt": "abcdefghijklmnopqrstuvxyz",
"refreshJwt": "zyxvutsrqponmlkjihgfedcba"
}
The DID is a unique identifier for your account that is stored with posts on an AT Protocol server. Even if you change your handle, the DID persists and helps make data portable across servers.
When cross-posting from Micro.blog, I first try to use the auth token and if it fails, I use the refresh token to establish a new session. In this case, we pass the refresh token in the Authorization
header:
POST /xrpc/com.atproto.server.refreshSession
Authorization: Bearer zyxvutsrqponmlkjihgfedcba
Sending a simple text post to Bluesky looks like this. For the rest of these requests, we pass the usual access token for authorization:
POST /xrpc/com.atproto.repo.createRecord
Authorization: Bearer abcdefghijklmnopqrstuvxyz
Content-Type: application/json
{
“repo”: “did:plc:abcdef12345”,
“collection”: “app.bsky.feed.post”,
“validate”: true,
“record”: {
“text”: “Hello world.”,
“createdAt”: “2023-04-20T16:46:32+00:00”
}
}
It can get more complicated. To include a photo with the post, first upload it to storage as a blob. In my early testing, there were low limits for photo file size, so Micro.blog scales photos down quite a bit before sending them over to Bluesky.
Here’s uploading the photo, passing the raw JPEG bytes in the content body:
POST /xrpc/com.atproto.repo.uploadBlob
Authorization: Bearer abcdefghijklmnopqrstuvxyz
Content-Type: image/jpeg
image-data-here
You’ll get back a media CID (Content ID) in the ref
field that can be used to attach the photo to a new post. The response after uploading a photo looks like this:
{
"blob": {
"$type": "blob",
"ref": {
"$link": "abcdefgh"
},
"mimeType": "image/jpeg",
"size": 200000
}
}
Then when posting, use the embed
field with an array of the uploaded media CIDs:
POST /xrpc/com.atproto.repo.createRecord
Authorization: Bearer abcdefghijklmnopqrstuvxyz
Content-Type: application/json
{
“repo”: “did:plc:abcdef12345”,
“collection”: “app.bsky.feed.post”,
“record”: {
“text”: “Hello world with photo.”,
“createdAt”: “2023-03-08T16:46:32+00:00”,
“embed”: {
“$type”: “app.bsky.embed.images”,
“images”: [
{
“image”: {
“cid”: “abcdefgh”,
“mimeType”: “image/jpeg”
},
“alt”: ""
}
]
}
}
}
Bluesky also supports inline hyperlinks in the post text through “facets” that can be added to a post, similar to attaching a photo. I don’t love this because we already have HTML as a perfectly good way to format posts. I strongly believe that the social web should use HTML and HTTP wherever possible.
In Micro.blog, I automatically convert Markdown or HTML inline links to Bluesky’s facets. An example of linking the first word “Hello” in this post would look like this, using the character position and length of the word:
POST /xrpc/com.atproto.repo.createRecord
Authorization: Bearer abcdefghijklmnopqrstuvxyz
Content-Type: application/json
{
“repo”: “did:plc:abcdef12345”,
“collection”: “app.bsky.feed.post”,
“validate”: true,
“record”: {
“text”: “Hello world with link.”,
“createdAt”: “2023-04-20T16:46:32+00:00”,
“facets”: [
{
“features”: [
{
“uri”: “https://manton.org/”,
“$type”: “app.bsky.richtext.facet#link”
}
],
“index”: {
“byteStart”: 0,
“byteEnd”: 5
}
}
]
}
}
There is also a growing list of open source libraries for the AT Protocol. Unfortunately I wrote all my code before I realized this, so I stumbled through deciphering the API more than I needed to. Maybe this post will save you some time if you’re rolling your own thing.
2023-04-29
Today is the day that Twitter said they would shut off the old API and force upgrades to the new plans. But they say a lot of things. I haven't paid yet. Also confused why April 29th (Saturday) and not May 1st (Monday).
2023-04-29
Core Intuition episode 555! We talk all about Bluesky. (And Mastodon and Nostr and Micro.blog.)
2023-04-30
Final decision on the Twitter API
Not content with banning native third-party apps, Twitter has continued to cripple their API and move to paid plans for very basic access. I was committed to support Twitter cross-posting as long as possible because there are still Micro.blog customers who want to keep a foot in the Twitter world. But we knew it couldn’t last forever.
July 15th will be our last day to support cross-posting blog posts to Twitter. Even though Twitter has been effectively dead to me since I stopped tweeting in 2012, I’m a little sad to finally have to cut the platform off.
I picked July 15th to give people a couple months to wind down their use of Twitter. We now have to pay Twitter for API access, and that is the longest I can justify doing so.
It’s all another reminder that centralized platforms with closed APIs can’t last. While it’s easy to blame Elon Musk, the writing has been on the wall for a decade.
For more of the Twitter history that brought us to this point, see the chapter in my book called Leaving Twitter. Newly updated for Elon.
So, what’s next?
- Updating the Micro.blog web site to remove mention of Twitter. Luckily, we can now mention Bluesky instead! (When one door closes, another opens.)
- Emailing all Micro.blog customers who currently have Twitter cross-posting enabled, letting them know that the feature will go away on July 15th.
- Hiding the Twitter cross-posting option for new Micro.blog users.
- Later, shutting off the feature and removing all the Twitter code. At least we can do a little code cleanup because of this.
End of an era. Seeya on the open web.
2023-04-30
Went to see the Super Mario Bros movie this afternoon. So much fun. 🍄
2023-04-30