Search
Hong Minhee

SE Radio 657: Hong Minhee on ActivityPub and the Fediverse

Hong Minhee, an open source developer and creator of the Fedify ActivityPub library, discusses the ActivityPub protocol and the fediverse with SE Radio’s Jeremy Jung. They explore ActivityPub use cases, including microblogging applications such as Mastodon and Misskey, as well as activities built into the specification such as Like, Follow, and Accept. They also discuss extending the specification to include properties like Discoverable and Suspended, how different implementations communicate when they don’t implement the same extensions, ND the use of JSON-LD and why it is challenging to implement. Finally, they consider the HTTP-based inbox communication model, difficulties with scaling when using a push rather than a pull model, account migration, and resources for implementing the ActivityPub specification.

Brought to you by IEEE Computer Society and IEEE Software magazine.



Show Notes

Hong’s projects

Specifications:

ActivityPub Implementations

ActivityPub Tools


Transcript

Transcript brought to you by IEEE Software magazine and IEEE Computer Society. This transcript was automatically generated. To suggest improvements in the text, please contact [email protected] and include the episode number.

Jeremy Jung 00:00:19 This is Jeremy Jung for Software Engineering Radio. Today I am talking to Hong Minhee. He is the developer of Fedify, a TypeScript library for building ActivityPub server applications. Hong, welcome to Software Engineering Radio.

Song Minhee 00:00:33 Thank you for having me.

Jeremy Jung 00:00:35 The first thing I think we should start with is defining ActivityPub. What is ActivityPub?

Song Minhee 00:00:42 ActivityPub is the protocol that lets social networks talk to each other and is officially recommended by WCC is what powers this thing we call the fediverse, which is basically a way for different social media platforms to work together.

Jeremy Jung 00:01:03 Can you give some examples that people might have heard of? Of either users of ActivityPub or things that are a part of this fediverse?

Song Minhee 00:01:13 Mastodon is probably the biggest one out there. And you know what’s interesting? Metaís Threads has actually started implementing ActivityPub this summer, so this still pretty much a one-way street right now. In East Asia, especially Japan, there’s this really popular microblogging platform called Misskey. It’s got so many forks that people actually joke around and call them Forkeys, but it’s not just about Twitter style microblogging. There’s Pixelfed, which is kind of like Instagram but for the fediverse. And the same folks recently launched Loops, which is basically doing what TikTok does, but in the fediverse. Then you’ve got stuff like Lemmy and Mbin which are doing the Reddit thing out in the fediverse.

Jeremy Jung 00:02:15 Oh like Reddit?

Song Minhee 00:02:16 Yeah. There are so much more out there that I haven’t even mentioned. Most of it is open source, which is pretty cool.

Jeremy Jung 00:02:26 So the first few examples you gave Mastodon and Meta’s Threads, they’re very similar to Twitter. Right? So that’s what you were calling the microblogging applications. And I think what you had said, which is a little bit interesting is you had said Meta’s Threads is only one way. So could you kind of describe like what you mean by that?

Song Minhee 00:02:47 Currently Metaís Threads only can be followed by other ActivityPub applications, but you can follow other people in the fediverse.

Jeremy Jung 00:03:01 People who are using another microblogging platform like Mastodon can follow someone on Meta’s Threads platform. But the other way is not true. If you’re on Threads, you can’t follow someone on Mastodon.

Song Minhee 00:03:14 Yes, that’s right.

Jeremy Jung 00:03:15 And that’s not a limitation of the protocol itself. That’s a design decision or a decision made by Meta?

Song Minhee 00:03:23 Yeah, they slowly implementing ActivityPub and I hope they will implement complete ActivityPub in the future.

Jeremy Jung 00:03:31 And then the other examples you gave, one is, I believe it was Pixelfed is very similar to Instagram and then the last examples you gave was, I think it was Lemmy. You said it’s similar to Reddit? Because you mentioned the term fediverse before and you mentioned that these all use ActivityPub and since these seem like different kinds of applications, what does it mean for them to interact? Because with Mastodon and Threads, I can kind of understand because they’re both similar to Twitter. So you’re posting messages and replying, but what does it mean for example, for someone on Mastodon to interact with someone on Lemmy, which is like Reddit because they seem very different.

Song Minhee 00:04:17 People in Lemmy and Mastodon are called actors and they can follow each other. They have interactions between them called activities. They are several types of activities like Create, Follow, Undo, Like and so on. So ActivityPub applications tend to use this vocabulary to implement their features. So for example, Lemmy uses Like activities for offboarding and Dislike activities for down voting and is translated to Likes in Mastodon. So if you submit a post on Lemmy and it show up on your Mastodon timeline if you Like, that post is importing in Lemmy.

Jeremy Jung 00:05:19 And probably similarly with Pixelfed, which you said is like Instagram. If you follow someone’s Pixelfed account in Mastodon and they post a photo in Pixelfed, they would see it as a post in Mastodon natively and they could give it a Like there. And these activities that you mentioned, so the Like and the Dislike, are those part of ActivityPub itself?

Song Minhee 00:05:45 Yes. And this vocabulary can be extended.

Jeremy Jung 00:05:49 So you can add additional actions or are you adding information to the existing actions?

Song Minhee 00:05:56 It’s called activity vocabularies. There are things like Accept, Add, Enlist, Arrive, Block, Create lead, Dislike, Flag, Follow, Ignore, Invite, Join and so on. So basically almost everything you need to build social media is already there in the vocabulary, but if you want to extend some more, you can define your own vocabulary.

Jeremy Jung 00:06:29 Most of the things that an Instagram or a Twitter or Reddit would need is already there. But you’re saying that you can have your own vocabulary, so if there’s an action or an activity that is not covered by the specification, you can create one yourself.

Song Minhee 00:06:45 Yes. For example, Misskey and Pleroma defined emoji to represent emoji reactions.

Jeremy Jung 00:06:55 Because the systems can extend the vocabulary. What are some other examples of cases where Mastodon or any other of these systems has found that the existing vocabulary is not enough? What are some other examples of applications extending it?

Song Minhee 00:07:14 For example, Mastodon define Suspended, yeah, suspended properties. They are not activities but they are properties in the activity. ActivityPub consists of several types of objects and there are activities and normal objectives like article, they can have properties and there are several existing properties but they can be also extended. So Mastodon extended some properties they need. So for example, they define suspended or discoverable.

Jeremy Jung 00:08:00 Discoverable?

Song Minhee 00:08:01 Yeah. Suspended to tell if an actor is suspended by moderators; discoverable tells if an actor itself wants to be searched and indexed, there are much more properties Mastodon extended.

Jeremy Jung 00:08:23 These are properties of the actor? These are properties of the user?

Song Minhee 00:08:29 Yes. Actors.

Jeremy Jung 00:08:31 Because I think earlier you mentioned that the concept of a user is an actor and it sounds like what you’re saying is an actor can have all these properties, there’s probably a username and things like that, but Mastodon has extended the properties so that you can have a property on whether you want to be searched or indexed. You can have a property that says you’re suspended. So I guess your account is still there but can’t be used anymore. Yes. Something we should probably talk about then is, so you have these actors, you have these activities that I’m assuming the actors are performing on one another. What does that data look like and what does the communication look like?

Song Minhee 00:09:14 Actors have their own the reference of URI and when you look up that URI, you get all the info about the actor in JSON LD format.

Jeremy Jung 00:09:26 JSON LD?

Song Minhee 00:09:27 Yeah, JSON LD, Linked Data. Actor has all the stuff you expect to find on a social account: Name, Bio, URL to the profile page, profile picture, head image and more. There are five main types of actors: Application, Group, Organization, Person and Service. And you know how sometimes on Mastodon on USC on account market is a bot?

Jeremy Jung 00:09:55 A bot?

Song Minhee 00:09:57 Yeah, bot. And that’s what an actor of type service looks like and the activity prospect actually let to correct other types beyond this five, but I haven’t seen anymore actually do that yet.

Jeremy Jung 00:10:12 And you mentioned that these are all JSON objects, but the LD part, the linked data part I’m not familiar with. So what is different about the linked data part of the JSON?

Song Minhee 00:10:24 JSON LD is the special way of writing IDF, which was originally used in the Semantic Web. Usually IDF uses formats is called Triples.

Jeremy Jung 00:10:37 Triples?

Song Minhee 00:10:38 Yeah. Subject, predicate and object.

Jeremy Jung 00:10:42 Subject, predicate, object. Can you give an example of what those three would be?

Song Minhee 00:10:47 For example is a person, it’s a triple. John is a subject and Is a predicate.

Jeremy Jung 00:10:56 Is is the predicate, okay.

Song Minhee 00:10:58 And person is an object. That’s great for showing how things are connected but is pretty different from how we usually handle data in restful APIs and stuff. Like normally we say a personal object has property like name, DOB, bio and so on and now bunch of subject predicate, object triples. That’s where this JNet comes in is designed to look more like the JSON we are used to working with while still being able to represent IDF graphs.

Jeremy Jung 00:11:33 IDF graph, what is that?

Song Minhee 00:11:35 IDF graphs are ontology.

Jeremy Jung 00:11:39 Ontology?

Song Minhee 00:11:40 Yeah. It’s a way to represent factual data but it is quite different from how we represent data in relational database. It’s a bunch of triples. Each subject and objects are nodes and predicate connect these nodes.

Jeremy Jung 00:12:01 You mentioned the semantic web. What does that mean? What is the semantic web?

Song Minhee 00:12:07 It’s a way to represent web in the structural way is much need so that you can scan the data in the web using scrapers or crawling.

Jeremy Jung 00:12:24 Scrapers or crawling. Okay.

Song Minhee 00:12:26 Yeah. Then you can have a graph data of web and you can query information about things from the data.

Jeremy Jung 00:12:38 So is the web as it exists now, is that the semantic web or is it something different?

Song Minhee 00:12:46 I think it is partially semantic web. You have several metadata in your SMR for example, there are several specifications for semantic web, like open graph metadata.

Jeremy Jung 00:13:02 Because when I think about open graph, I think about the metadata on a webpage that tells other applications or websites that if you link to this page, show this image or show this title and description, you’re saying that specifically you consider part of the semantic web?

Song Minhee 00:13:21 That’s a semantic web to make your website semantic web, your website should be able to provide structural data and other people can make scrappers to scan structural data from your website. They are bunch of attributes and text for a semantic web to represent metadata. For example, you have relation attribute real. So if you have a link with rare equal me to your another social profile, then other people can tell two web pages represent the same parts.

Jeremy Jung 00:14:11 Oh, I see. So you could have more than one website, maybe one is your blog and maybe one is your favorite birds or something like that. But you could put a relation tag in both the REL tag with information about you as a person so that someone who scrapes both websites could look at that tag and see that both of these websites are by Hong, by this person.

Song Minhee 00:14:39 Yeah, I think JSON LD is designed for semantic web but in new reality activities pop implementation, the most of them are not aware of semantic web.

Jeremy Jung 00:14:53 The choice of JSON linked data that JSON LD by the people who made the specification. They had this idea that things that implemented ActivityPub would be a part of this semantic web, but the actual implementation of a Mastodon or a Pixelfed, they use JSON LD because it’s part of the specification but the way they use it is, it ends up not really being a part of this semantic web.

Song Minhee 00:15:23 Yeah, that’s exactly.

Jeremy Jung 00:15:25 You’ve mentioned that implementing it is difficult. What makes implementing JSON LD particularly hard?

Song Minhee 00:15:35 The JSON LD peg is complex, which is why a lot of programming languages don’t even have a JSON LD implementation. And it’s pretty slow compared to just working with the regular JSON. So what happens is a lot of ActivityPub implementations just treat JSON LD like it’s regular JSON without using a proper JSON LD processor. You can do that, but it creates all sorts of headaches. In JSON LD, there are equivalencies. Like if a property is missing or if it is an empty array that means the same thing or if a property has one value versus an array with just that one value in it. Same thing. So when you are writing code to JSON LD, you’ve got to keep checking if something’s an array how long it is, and all that is super easy to mess up. It’s not just reading JSON LD that’s tricky. Creating it is just as bad. Like, you might forget to include the right context metadata for our vocabulary and end up with the JSON LD document that’s either invalid or means something totally different from what you wanted. Even the activitypub implementations miss this pretty often. With Fedify, we’ve got JSON LD process built in and we keep running into issues where major activity power implementations create invalid JSON LD. We had to create workaround for all of them, but it’s not pretty and the course kind of a mess.

Jeremy Jung 00:17:23 Even though there is a specification for JSON LD, it sounds like the implementers don’t necessarily follow it. So you are kind of parsing JSON LD but not really You’re parsing something that looks like JSON LD but isn’t quite it.

Song Minhee 00:17:42 Yes, that’s right.

Jeremy Jung 00:17:43 And is that true in the biggest implementations, Mastodon for example, are there things that it sends in its activities that aren’t valid JSON LD?

Song Minhee 00:17:55 Those implementations that had bad JSON LD tends to fix them soon as a password, but legal regressions are so often made, yeah.

Jeremy Jung 00:18:09 Even within Mastodon, which is probably one of the largest implementers of ActivityPub, there are cases where it’s not valid JSON LD and somebody fixes it, but then later on there are other messages or other activities that were valid but aren’t valid anymore. And so it’s this back and forth of fixing them and causing new issues it sounds like.

Song Minhee 00:18:36 Yeah, yeah right.

Jeremy Jung 00:18:38 Yeah, that sounds very difficult to deal with. We’ve been talking about the messages themselves are these special format of JSON that’s very particular, but how do these instances communicate with one another?

Song Minhee 00:18:52 Most of the time it all starts with, follow. Like when John follows Alice. Then Alice adds John’s inbox URI to her firewall list and after John follows Alice, whenever Alice posts something new, that activity get sent to John’s inbox. Behind the scene, this is just an HTTP post recast. Even though ActivityPub is built on HTTP, it doesn’t really care about the HTTP response beyond did it work or not. If you want to reply to an activity, you need to figure out the senderís inbox URI and send or reply activity there.

Jeremy Jung 00:19:40 If we define all the terms, there’s the actor, which is the person, each actor can send different activities. Those activities are in the form of JSON linked data, and everybody has an inbox. And an inbox is an HTTP URL that people post to. Right. And so when you think about that, you had mentioned that if you have a list of followers, let’s say you have a hundred followers, would that mean that you have the URLs to all a hundred of those followers inboxes and that you would send one HTTP post to each inbox every time you had a new message?

Song Minhee 00:20:24 Pretty much our activity point implementations have a thing called share the inbox is exactly what it sounds like. One inbox that are actors on or server share private stuff like DM don’t go there is just for public posts and thoughts.

Jeremy Jung 00:20:42 I think we haven’t really talked about the fact that when you have multiple users, usually they’re on a server, right, that somebody chooses. So you could have tens of thousands, I don’t know how many people can fit on the same server, but rather than you having to post to each user individually, you can post to the shared inbox on this server. So let’s say of your 100 followers, 50 of them are on the same server and you have a new post, you only need to post to the shared inbox once.

Song Minhee 00:21:20 Yes, that’s right.

Jeremy Jung 00:21:21 In that message you would, I assume have links to each of the profiles or actors that you wanted to send that message to?

Song Minhee 00:21:30 Yeah.

Jeremy Jung 00:21:31 Something that I’ve seen in the past is there are people who have challenges with scaling their, Mastodon instance or their implementations of ActivityPub. As the number of followers grow, I’ve seen a post about Ghost, one of the companies you work with mentioning that they’ve had challenges there. What are the challenges there and how do you think those can be resolved?

Song Minhee 00:22:02 To put this in context, when Ghost mentioned the scaling issue, they are not using MessageQ yet. I’m pretty sure using MessageQ would have a lot of their scaling problems that say it is definitely true that a lot of activity for software has trouble with scaling right now. I think part of the problem is that everyone’s using this purely event driven approach to sending activities around. One of the big issues is that when the delivery fails, it is the sender who has to try not the receiver plus there are this overhead because the sender has to authenticate itself with HP signatures every time. Actually the activity prospect suggests to using polling tool. So I’d love to see more activity post software try using both approaches together.

Jeremy Jung 00:23:03 You mean the followers would poll who they’re following instead of the person posting the messages having to send their posts to everyone’s inboxes? Yeah. I see. Yeah. So that’s a part of the ActivityPub specification but not implemented in a lot of ActivityPub implementations.

Song Minhee 00:23:26 Yes.

Jeremy Jung 00:23:27 It sounds like maybe that puts a lot of burden on the servers that have people with a lot of followers because they have to post to every single follower server and maybe the server is slow or they can’t reach it and like you said, they have to just keep trying and trying. There could be a lot of challenges there.

Song Minhee 00:23:52 Yes. Right.

Jeremy Jung 00:23:53 We’ve talked a little bit about the fact that each actor is hosted by a server and those servers can host multiple actors, but if you want to move to another server either because your server is shutting down or you just would like to change servers, what are some of the challenges there?

Song Minhee 00:24:15 ActivityPub and fediverse already have the specification for account move is called FEP 7628 Move Actor. First thing you need to do when moving on account is prove that both the old and new accounts belong to the same parts. You do this by adding the old accounts after URI to the new accounts also known as property. Then all the accounts or the other instances is moving by sending out move activity. When a server gets this move activity, it checks that both accounts really to belong to the same parts and it makes all the accounts that were following the all the accounts start to following the new one instead. That’s how the new account gets to keep our, the all the accounts follow us. Pretty much all the major activity post software has this feature built in. For example, Mastodon, Misskey you name it.

Jeremy Jung 00:25:24 This is very similar to the post where when you execute a move the server that originally hosted that actor, they need to somehow tell every single other server that was following that account that you’ve moved. And so if there’s any issues with communicating with one of those servers or you miss one, then it just won’t recognize that you’ve moved. You have to make sure that you’ve, you talk to every single server.

Song Minhee 00:25:55 That’s right.

Jeremy Jung 00:25:56 I could see how that could be a difficult problem sometimes if you have a lot of followers.

Song Minhee 00:26:00 Yeah.

Jeremy Jung 00:26:00 You’ve created a TypeScript library, Fedify for building ActivityPub powered applications. What was the reason you decided to create Fedify?

Song Minhee 00:26:11 Fedify is ActivityPub’s servers framework I built for Typescript. It basically takes away a lot of headaches. You get trying to implement ActivityPub server from scratch. The whole thing started because I wanted to build Hollo single user micro platform I built. But when I tried to implement activity from ground up, it was kind of a nightmare imagine trying to write a CGI program in power or C back in the late nineties where you are manually printing out HTTP headers and HMR as base. There just wasn’t any good abstraction layer to go with. There were already some libraries and frameworks for ActivityPub out there, but none of them really hit the sweet spot I was looking for. They were either too high level and rigid like you could only build a Mastodon clone. They barely did anything at all or they were not written in language,I didn’t really know.

Jeremy Jung 00:27:26 I saw that you are doing some work with Ghost. How is Ghost using Fedify?

Song Minhee 00:27:32 Ghost is an open-source publishing platform. They have put some money into Edify, which is why I get to work on it full-time now. Their power feature is still in private beta but it should be a available to everyone pretty soon. We work together to improve Fedify. Basically they are a user of Fedify. They report bugs, request new features to Fedify, then I fix them or implement them.

Jeremy Jung 00:28:09 First, Ghost to my understanding is a blogging platform and a newsletter platform. So what does it mean for them to implement ActivityPub? What would somebody using Mastodon for example get when they follow somebody using Ghost?

Song Minhee 00:28:28 Ghost will have fediverse handles for their each blog. If you follow them in your Mastodon or something like then a new post is published, these posts will show up your timeline in Mastodon, and you can like them or share them and in the dashboard of Ghost you can see who liked their posts or shared their posts and so on. It is pretty like how Mastodon works but in Ghost.

Jeremy Jung 00:29:09 I see. So if you are writing a Ghost blog and somebody follows your blog from Mastodon, sort of like we were talking about earlier, they can like your post and on the blog itself you could show oh I have 200 likes and those aren’t necessarily people who were on your Ghost website. They could be people that were liking your post from Mastodon.

Song Minhee 00:29:37 Yes.

Jeremy Jung 00:29:38 Something you mentioned at the beginning was there is a community of developers in Asia making forks of I believe of Mastodon, right? Yeah. Do you have experience working in that development community? What’s different about it compared to the more Western centric community?

Song Minhee 00:30:01 They are very similar in most ways. The key difference is language. Of course they communicate in Japanese primarily. They are also accept poorly cast with English, but there are tons of comments in Japanese in their code. So you need to translate them into English or your first language to understand what code those. So I think that makes barrier for Western developers. In fact, many western developers that contribute to Misskey or Forkey(?) are able to speak a little Japanese I think. Many of the developers of Misskey and Forkey are kind of Otaku.

Jeremy Jung 00:30:57 Oh Otaku? Okay.

Song Minhee 00:30:59 It’s not a big deal but you can see difference in a glance.

Jeremy Jung 00:31:04 Yeah. You mentioned one of the things that I believe Misskey implemented was the emoji reactions and maybe one of the reasons they wanted that was so that they could react to each other’s posts with, you know, anime pictures or things like that.

Song Minhee 00:31:20 Yeah.

Jeremy Jung 00:31:21 You’ve mentioned Misskey and Forkey. So is Misskey a fork of Mastodon and then is Forkey a fork of Misskey?

Song Minhee 00:31:30 No, Misskey is not a fork of Mastodon is from scratch. Itís it own implementation and Forkeys are forks of Mastodon.

Jeremy Jung 00:31:40 Oh I see, I see. But both of those are primarily built by Japanese developers?

Song Minhee 00:31:47 Yes. Whereas Mastodon is written in Ruby, Ruby on Rails, but Misskey is built in TypeScript.

Jeremy Jung 00:31:56 And because of ActivityPub they all implement it. So you can communicate with people between Mastodon and Misskey because they all understand the same activities. Yes. You did mention since there are extensions, like Misskey has the emoji reactions when there is an activity that an implementation doesn’t support what happens between the two servers? Do you send it to a server’s inbox and then the server just doesn’t do anything with it?

Song Minhee 00:32:27 Some implementers coincide or compatibility. So they designed to work it with other implementation that doesn’t support that activity. For example, Misskey uses Like activity for image election. So if you put on emoji to a Mastodon post, then in Mastodon you get one like so it’s intended behavior of by risky developers that they fall back to normal rights. But sometimes activity power implementers introduce a new entirely new activity type. For example, plan introduce emoji react and if you put emoji reaction to Mastodon post from Pleroma, in Mastodon you have nothing to see because Mastodon just ignores them.

Jeremy Jung 00:33:30 If I understand correctly, both Misskey and Pleroma are independent implementations of ActivityPub, but with Misskey their message is backwards compatible where it’s, if you don’t understand the emoji reaction it’ll be embedded inside of a like message. Whereas with Pleroma they send an activity that Mastodon can’t understand at all. So it just doesn’t do anything.

Song Minhee 00:33:58 Yes. Right. But Misskey also understand emoji react activity. So between player and Misskey they have exchange emoji reactions with no problem.

Jeremy Jung 00:34:11 Oh I see. So they both understand that activity. They both implement it the same way, but then when Misskey communicates with Mastodon or with an instance that it knows doesn’t understand it, it sends something different. Yeah,

Song Minhee 00:34:27 Yeah, that’s right.

Jeremy Jung 00:34:27 The servers, can they query one another to know which activities they support?

Song Minhee 00:34:32 Usually ActivityPub implementation, ISO implement, node for specification

Jeremy Jung 00:34:38 Node info? Yeah,

Song Minhee 00:34:40 Yeah, it’s like usual agents like seeing in fediverse. So implementations tell the other instance is Masteron or something other, you can call it the type of server.

Jeremy Jung 00:34:55 Okay. So within ActivityPub are each of the servers is the term node, is that where they use for each server?

Song Minhee 00:35:03 Yes. Right.

Jeremy Jung 00:35:03 You have the nodes which can have any number of actors and the servers send activities to one another, to each other’s inboxes. So those are all the, I guess the way they all communicate. Yeah. You’ve implemented ActivityPub with fedify because you found like there weren’t good enough implementations or resources already. Did you implement it based off of the specification or did you look at existing implementations while you were building your implementation?

Song Minhee 00:35:38 To be honest, install, just diving into the spec, I usually start by looking at actually activity pulse software code first. The activity pulse spec is also value that you can really build something just from reading it. So when we talk about ActivityPub, we are actually talking about a whole bunch of other technical standards too. WebFinger, HP signatures and more. So you need to understand all of these as well.

Jeremy Jung 00:36:09 With the specification alone, you were saying it’s too vague and so what ends up being, I’m not sure if it’s right to call it a spec, but looking at the implementations that people have already made that collectively becomes the spec because trying to follow the spec just by itself is maybe too difficult. Maybe that brings up the issues you were talking about before where you have specifications like JSON LD where they’re so complicated that even the biggest implementations aren’t quite following it exactly. If somebody wanted to get started with understanding a little bit more about ActivityPub or building something with it, where would you recommend they start?

Song Minhee 00:36:57 I recommend to dig into a lot of code from actual implementations first. Mastodon, Misskey, Akkoma and so on. There are also some really cool tools. For example, ActivityPub Academy is this awesome Mastodon server for debugging ActivityPub it makes it super easy to create a temporary account and see what activities are going back and forth. There are also BrowserPub. BrowserPub is this new tool for looking up and browsing ActivityPub objects. It’s really handy when you want to see how different ActivityPub software handles various features. I also recommend to use fedify. I’ve got to mention the fedify CLI, which comes with some really easy tools.

Jeremy Jung 00:37:49 So if someone uses fedify, they’re rating an application in TypeScript, then it sounds like they have to know the high level concepts. They have to know what are the different activities, what is inside of an actor, but the actual implementation of how do I create and parse JSON link data, those kinds of things are taken care of by the library.

Song Minhee 00:38:13 Yes, yes. Right.

Jeremy Jung 00:38:15 In some ways it seems like it might be good to, like you were saying, use the tools you mentioned to create a task Mastodon account, look at the messages being sent back and forth and then when you’re trying to implement it, starting with something like fedify might be good because then you can really just focus on the concepts and not worry so much about the implementation details.

Song Minhee 00:38:37 Yes, that’s right.

Jeremy Jung 00:38:38 Is there anything else you wanted to mention or thought we should have talked about?

Song Minhee 00:38:44 I want to talk about a lot of stuff of activity part, but it is difficult to speak in English for me, so it’s a shame to talk about it very little.

Jeremy Jung 00:38:59 We need everybody to learn Korean, right?

Song Minhee 00:39:03 Yes, please.

Jeremy Jung 00:39:04 Well, I want to thank you for taking the time. I know it must have been really challenging to give an interview and you know, a language that’s not your native one. So thank you for spending the time to talk with me.

Song Minhee 00:39:16 Thank you for having me.

Jeremy Jung 00:39:18 This has been Jeremy Jung for Software Engineering Radio. Thanks for listening.

[End of Audio]

Join the discussion

More from this show