Just 2 more tables, come on.

Just 2 more tables, come on.

There were even more positive comments on last week's edition than our first one, and only one email asking if "everything is ok" — so we're taking that as a clear sign that none of you know how to spot a cry for help.

It's been a busy week of building for our little team, so let's get this over with started.

What's new with ActivityPub?

Last week we promised you earth-shattering innovation in the form of database persistence. Did we achieve that? We did not. So, like every tired product manager in the history of ever, I will now attempt to explain that away and still sound totally optimistic — leading you to believe that our initial time estimates remain both accurate and relevant.

Without any context, the obvious questions are "Doesn't Ghost already have a database?" and "Why don't you just put things in it?" — and the answers, naturally, are "yes" and "well..." followed by a lot of uncomfortable looks around the table.

When we first built Ghost in 2013 its data needs were extraordinarily simple. You had staff, posts, tags and settings. The whole database had about 5 tables. Over the course of the past decade or so, though, the functionality of the platform has expanded to meet the growing demands of users (that's you). We added members, emails, paid subscriptions, offers, analytics, history... the list goes on.

So yeah, we're making the case here that it's actually your fault that we didn't ship ActivityPub data persistence this week. Some common advice you'll read on the internet is "never blame the user" — but that advice typically comes from people who don't have to deal with hosting ~25,000 databases which today contain almost 2million tables. Over 70 tables for each install.

In short, over the years we've treated Ghost's database tables much in the same way Los Angeles treats its highway traffic problems.

So when we turned to our colleagues on the Ghost core team last week and asked for "just 2 more tables, come on, we promised it in the newsletter" — it didn't go down nearly as well as we'd hoped.

Something about "unsustainable" and "who is writing this fucking newsletter".

In any event, we're regrouping a bit to think about how we can build and test ActivityPub with minimal (really: zero) impact to existing installations. We may end up just stubbing things in a separate SQLite database. This is totally doable, but it's a new pattern and not as trivial as just re-using something that already exists — so it's going to take a little more time to figure out.

In the meantime, though, we made some good progress on the clientside of the ActivityPub reader experience.

Last week we showed you the first version of a working inbox and a very basic unstyled reader. This week, we've got styling in for the reader. Now when you click into a post, it has all the styles it needs to be able to support rich media embeds and blocks that people use within the Ghost editor.

Behold, a definitely-not-AI generated story about ActivityPug:


If you're reading this in an email client then you'll need to click on this in order to see the video playing. On the plus side once you've made it over to the browser, you might as well leave a comment asking us why we don't just use Postgres.

We're pretty happy with the way the client-side of things is progressing, and once we've got the data persistence figured out we'll be getting pretty close to being able to have a few of you join us in (extremely early) testing.

To give you a sense of what to expect over the next month or so:

We're shooting for an initial minimal feature set where Ghost sites can follow, unfollow, read and like each other's posts. Once we've got those in place, we're going to spend time figuring out how to scale them with a healthy architecture, get people testing what we've got so far, and use both of those things to inform how to prioritize what comes next.

Answering your questions:

There were some great questions in the comments last week. We've been responding inline to a few of them, but where there's a common theme (or a really great question) — we'll try to publish answers here so everyone gets a chance to see them.

Can I try yet? Is this not available yet?

Not yet. We're only a few weeks in, but as soon we're ready for testers, you'll be the first to know: via this newsletter.

How does ActivityPub factor into the need to build community into my Ghost membership site [which already has comments]?

The honest answer is we're not totally sure yet, we're learning ActivityPub as we work on this and seeing where it fits. But, one idea we're exploring is that all Ghost Members will be automatically provisioned as ActivityPub actors.

So if your name is Sarah and you're a member of the Platformer News community, then by default you'd get an automatic ActivityPub handle of something like @sarah@community.platformer.news — and (ideally) you could also sign-in/sign-up with an existing ActivityPub handle, if you already have one.

In this way we would be able to connect individual communities with the wider ActivityPub network, creating an opportunity for community growth outside of just your website. So far this is just an idea, but we're curious to experiment with it and see how it feels.

Looks like there are a lot of Gandalfs there!

Thank you? I think.

So, in summary, everything is totally on track for our Q2 deliverables.

Until next week.

pug covered with blanket on bedspread