Takahe / 29th Apr 2023

A Takahē refactor, as a treat

I had taken two months off from developing Takahē in the run up to PyCon US; both due to pressures at work (and then, more recently, half the company being laid off around me), as well as not quite being sure what I wanted to build, exactly.

When I started the project, my main goal was to show that multi-domain support for a single ActivityPub server was possible; once I had achieved that relatively early on, I sort of fell down the default path of implementing a lightweight clone of Mastodon/Twitter.

While this was good in terms of developing out the features we needed, it always felt a bit like overhead I didn't really want; after all, if you're implementing the Mastodon API like we do, all the dedicated apps for viewing timelines and posting are always going to be better than what you ship with a server.

In that sense, I think the GoToSocial folks had a better insight into this from the beginning than I did; they just built a server that provides the backend bits of ActivityPub and the Mastodon Client API, with minimal web pages to serve posts and user profiles.

While I like this, there was a bit more I wanted to do; I've talked in the past about how I wanted to make a bit more of a "homepage" experience as well as serving ActivityPub, and some discussions at PyCon US really helped me form a better vision for what I want to build.

Focusing On Identities

So, my new design goal is now to really take advantage of the multi-domain support and provide an experience that lets a diverse set of people, projects or companies, with a set of different domain names, logos and design ideas, all exist on the same server but still have their own profiles and identities that they can shape more in line with what they want.

While it'll focus on microblogging at first, I also want to provide some other "homepage" functionality that allows our profile pages to act as someone, or something's, home on the web.

Thus, I want to build a somewhat customisable profile page, with the ability to:

There's also some potentially more "out there" ideas:

My goal here is something that your average power user feels can be a good "home on the internet" for them. I might even convince myself to stop maintaining a separate blog if I can make it nice enough, though I know I'm such an edge case that I shouldn't really design for me.

In addition, all of this will be built on a somewhat-extensible plugin system, so that if people have ideas they want to explore on the Fediverse, they can do so without having to author the majority of a server themselves.

Along with this, I'm removing all the Timeline UI from the web server; Takahē's web interface will now focus on two primary goals:

Here's how a profile looks in the new design; you can see how it's much more pared back than before, and even though I'm logged in, there's no timeline sidebar or compose options:

The new profile page

We'll push users to apps to consume timelines, author content, and others; while we already support the Mastodon API, I do wonder if we could also support other client app APIs, like the Pixelfed one, for people who are primarily posting images.

More Domain Power

The other part of this is more flexibility on the part of domains; before, domains were mostly just a thing that affected the @name@domain handle people could use to find or mention you. Now, they're considerably more powerful.

For starters, each domain can have a custom site name, icon and theme. Here's a screenshot of another profile on the same server as before, but this time with its domain overrides set up for different branding:

Another profile with domain overrides

You can see that, even though it's on the same server, with shared moderation and hosting, it looks quite separate to my normal profile above. While this is obviously useful for people like me with too many side projects, this is also aimed at organisations and companies; I believe a healthy Fediverse includes these kinds of presences (along with the ability for you to completely block them should you wish!).

I want to position Takahē installations less as individual communities and more as a place where multiple people, projects or organisations can co-exist and share the burden of running a social media presence.

Importing and Search

There are some other big requests I've heard quite often; importing old posts is one of them, be it from Twitter or from Mastodon, so this is something I plan to add in the near future - the ability to provide a dump from another service, and import all the posts with correct historical dates and images preserved where possible.

While we can't preserve the URLs, boosts or likes for either of these import targets, it is still nice to be able to take historical content and present it on one service, so you can link back to them or search through them as you desire.

Yes, search - the other big change that is in fact already in (unlike the importing, which will take a while) is full-text search of an identity's posts. General search across the Fediverse is still a bit of a hot topic, but I think per-identity search (that you can disable in your settings) is the right way to start.

It's currently shown on an identity's profile page if it's enabled, and uses PostgreSQL's full-text search capabilities; notice the "Search" tab in the screenshots above. I might consider adding a per-domain search feature in future as well; that seems like something a news organisation, for example, would want.


The other thing that's been developing recently is the uptake of BlueSky as another Twitter alternative. BlueSky is meant to be based on a federated protocol called the AT Protocol, and from my reading of its design docs, I believe Takahē should be able to support both AT and ActivityPub at the same time.

BlueSky are still working on a lot of this, and federation of the protocol is not yet possible and the docs are rather incomplete; this recent influx is adding a big stressor on their side, I imagine, so I'm not going to go hound them about it not being ready yet.

That said, once they get it ready to federate, it's my intention to start working on federation support for that protocol as well; I am not certain it's possible, as there's a bit of a difference in how identity and content sync works, but the Takahē data model is sufficiently abstracted from ActivityPub that I think it's possible.


So, with a change this big, how will it roll out?

Well, it'll be a whole new minor release (0.9.0), but continuing with an upgrade path from previous releases; after all, I've not really changed the core functionality, but instead ripped out a lot of UI and changed around some other parts.

takahe.social will be updated before the release as a testbed, but only after I've given sufficient warning to the users there that the change is coming; anyone who was still using the web UI will have to switch to something like Elk.

Once that's done, I'll be organising my larger project priorities a bit (importing, more profile options, AT protocol support) and working through those, as well as continuing to do small improvements and bugfixes, with the goal of hitting 1.0 relatively soon.

While I'll be sad to lose the vision of a lightweight web UI built into the server, it will result in significantly less code for me to maintain, as well as the new focus on profiles and posts as the main webpages feeling very right to me. And, who knows, maybe we'll get even closer to my vision of "what if GeoCities but with social networking?".