New blog post: Understanding ActivityPub - Part 4: Threads

A first detailed look into how Threads implements ActivityPub. Learn about the data that is shared (or not), an interesting implementation of HTTP signatures, and Threads' take on quote posts in ActivityPub.

https://seb.jambor.dev/posts/understanding-activitypub-part-4-threads/

#ActivityPub #Threads #Fediverse

Understanding ActivityPub - Part 4: Threads

I take a first look at how Threads implements ActivityPub.

The weird implementation of HTTP signatures seems to have been a bug in Threads. It is now fixed and the signatures work as expected. I updated the blog post accordingly.
Thanks @jahfer for looking into this!

Quote posts in Threads now include a link to the ActivityPub data of the quoted posts. This makes it possible for Fediverse services like Firefish and Misskey to fetch the quoted post and show it inline in the quote post. I updated the blog post with some information on this https://seb.jambor.dev/posts/understanding-activitypub-part-4-threads/

Thanks @pcottle for the heads-up, and for some information about design choices that went into this.

Understanding ActivityPub - Part 4: Threads

I take a first look at how Threads implements ActivityPub.

@crepels Nice article! In particular, this is the best explanation I've seen yet of the "infinite signature recursion" problem, and the way around it.

I haven't tried to talk to Threads from my own toy implementation yet. I have a suspicion that the "instance actor" requirement is going to give me a headache.

@FenTiger Thanks :)

I can't really make sense of the instance actor requirement. I only tried this from ActivityPub.Academy (i.e., Mastodon); it would be interesting if there are any differences with other services. If you try this out with your implementation at some point, I'd be interested to know what you find.

@crepels @FenTiger I spent *way* too long trying to figure out how to get my library (https://github.com/jahfer/clj-activitypub) to talk to Threads. Thank you! Your post was the thing that helped me to pull an actor document.

Being stubborn, I tried to get to the bottom of why the instance actor stuff was required. Turns out...it's not! Threads just requires that the signing actor has a `url` field, which isn't common except for the instance actor. How anticlimactic 😑 I'm going to flag this to the Threads folks.

GitHub - jahfer/clj-activitypub: An ActivityPub library for Clojure

An ActivityPub library for Clojure. Contribute to jahfer/clj-activitypub development by creating an account on GitHub.

GitHub
@jahfer Hm, I tried to reproduce this right now, but I see that on Mastodon, all actors have a `url` field. For example, for my actor it is `https://mastodon.social/@crepels`. Am I missing something?

@crepels You’re right that Mastodon does specify the `url` field for all of their actors, hmm.

When you say you tried to reproduce this, did Threads reject your request using a normal actor?

I just tried again using an instance actor, plain actor with `url`, and a plain actor missing a `url`, and all of them succeeded. I’m going to guess @csu and co. fixed this already? But if you are still being rejected, I can share my actor document which is pretty minimal but *is* working.

@jahfer @csu You're right, I can confirm that it now works with the signature of any actor. So it seems like it wasn't intended behavior (it would have been weird if it was).
@jahfer @crepels yup, should be fixed now to not require 'url'!
@crepels I just found out about your blog thanks to your systemd breakdown. The idea of going in a container and breaking everything systemd down to its basest level was a great one that helps make the concepts more understandable.

The posts are so jam-packed with information that it's going to take me a while to get to the activity pub section but I'm sure it will be useful, especially if I decide to host my own instance for myself