The Crystal Programming Language Forum

Ktistec - an ActivityPub Server

I’m posting this here for project feedback.

Ktistec is an ActivityPub server. I’ve gotten it to the point where it meets my needs – it federates with Mastodon and most other mature servers, it handles posting, following, sharing/boosting/announcing, liking, etc. and it performs well. I’ve been running it in production at Epiktistes for ~6 months with no real snags. I’m interested in your thoughts on what it needs.

Note: a few limitations are features – it’s not intended to support large numbers of users, and it’s not designed to support databases other than SQLite. It is meant to be the perfect home for a single-user in the Fediverse.



Very cool! I’ve been meaning to try and find time for an ActivityPub implementation in crystal, so great that you’re bringing it to the ecosystem.

I’d love to read a blog post or something a bit more in-depth about the development process.

1 Like

Wow, good job! I’m surprised to see an ActivityPub related project in Crystal…plus you’re using Kemal :slight_smile: Keep up the good work.


Thanks! Kemal has been perfect for this project. That and Spectator are my two most relied upon projects is Crystal-land.


Nice project!

I once tried to implement ActivityPub in Go… not a great succes :sweat_smile:

Is there a way to use your project as a lib? Like using the part that talks ActivityPub, sends and receives messages, without the UI. This could be useful to make any project talks ActivityPub.

The complexity in ActivityPub isn’t very reusable though. The issue is that people think, understandable so since it’s wrongly promoted as such everywhere and by everyone, that it’s a standard or protocol for federated social networking, something that defines entities and interactions well, while in reality it really doesn’t achieve being much more than a wire protocol. That is a way to encode entities and interactions and so it leaves defining those entities and interactions to being whatever implementation details a particular author chooses. So you’re still left with figuring out what the projects you want to be compatible with actually do. The reusable part of encoding and decoding stuff isn’t the hard part here unfortunately.

@erdnaxeli it could in theory, but in practice, it’s not general enough – i implemented enough for my use cases, but there’s a lot it doesn’t do. and as @jhass points out, there would still be a lot of work to do to implement the interactions.

True. While I was experimenting in go it was actually more “reverse engineering Mastodon” than implementing ActivityPub.

@tsundsted ok, I would look at it anyway, maybe it will motivate me to actually do that project :slight_smile:

One loose goal of mine is to add scripting capability into Ktistec. (Ideally Ruby syntax, but probably something like Lua because I don’t want to yak-shave an interpreter side project.) If your goal is to build tools on top of ActivityPub, this may help accomplish that. But it wouldn’t be enough to, for example, build a PeerTube alternative in Crystal on top of Ktistec.

@wrq i’ve finally linked together all of my posts about ktistec into a devlog of sorts. the tail of the series starts here: