ActivityPub: Use title & excerpt, rather than full article

Is this possible?

For various copyright-of-things-to-be-turned-into-books reasons, I’m not particularly comfortable with having the full content of my posts replicated everywhere, and given the length of some of them, I don’t think most Mastodon, etc., users would be all that happy with getting screens-long toots in their feeds either.

But I would like to provide excerpts and the ability to click through and read the post on my site.

Can this be done?

That’s not currently supported, really.

Two options:

  1. Turn ActivityPub off (/ghost >settings > network). Post manually to your Mastodon account, or use an automation that does so (separate from Ghost), perhaps triggered from a webhook.

  2. Mark your post content as members only, and put a public preview line after the first paragraph or so. Last time I tested (which was a bit before release, so be sure to confirm), that caused the public content to go out to the Fediverse, but not anything after the paywall. But that means website visitors will also need a (free) account on your site.

2 Likes

Hm.

Well, looks like it will be (a) for me for now, but I’ll submit the notion over in Ideas, too. I think it’d be a useful option for more people than just me.

2 Likes

EDIT: Apparently I was wrong on my claims here. Check @cerebrate’s message below.

My original message:


That’s already the case. The full article that you see on your Ghost Admin, is a feature of Ghost’s Reader experience, and it’s dynamically pulling article from your website’s Content API and it respects your content visibility settings. If it’s a paywalled content, even your Ghost subscribers will not able to see the full content.

But normally, actual activitypub post is consists of just title, excerpt and the link. Here an example screenshot of a post seen on mastodon.social, which is an automated article from my Ghost site:

And this is how I see a paywalled content on my Ghost Admin, in reader mode:

4 Likes

Okay, but, here’s what a post of mine looked like on Mastodon, which is where most of my readers who’ve expressed interest in ActivityPub subscriptions are:

That’s the entire post content, without the title or a link to the post itself (only the links on the posts).

If there’s a configuration I can use to get the result that you seem to be getting in your first example, I haven’t been able to find it. The default gets me this.

1 Like

What reader are you using? That’s not what I’m seeing.

Just the normal Mastodon web interface.

(edit: I’m on qoto.org, specifically, but I don’t think they’ve customized it. It looks and works the same as other Mastodon servers I’ve used before.)

1 Like

Something is different. Here’s my web view on mastodon.social’s website:

1 Like

Date of the post you show is from 2015. Are you sure you are looking at the correct post?

1 Like

Oh, that’s another whole interop issue I haven’t got into yet in which Mastodon doesn’t do any filtering/sorting by the dates of posts and nor does Ghost ActivityPub, meaning that if I adjust the tags on an old post (like that one, from 2015) in August 2025, the whole thing gets posted to the feed at the top as if it were new.

I just used that as my example because it happened to be (a) the most recent, and (b) short enough to screen-shot in one go while being long enough to really demonstrate the issue.

1 Like

Well, that’s interesting. I just looked at the 404 Media feed from over on my Mastodon to compare, and that same post looks like this:

where the “Read more >” is inserted by the server, and clicking on it expands the post to the complete multi-page text of the article.

Hm.

I may need to dig into the intricacies of how exactly Ghost ActivityPub is formatting what it sends out and how Mastodon clients parse them to figure out what’s making the difference in presentation here, but that I am getting the whole article on Qoto does demonstrate that it’s sending out the entire contents whether or not all the clients choose to display it.

(And feature-wise, I’d very much like to have the ability to not do that, please, and only publish the title/excerpt/link.)

Okay, so I don’t actually speak TypeScript, but I took a look at the source code anyway, which seems to back up my hypothesis. The posts that get published to ActivityPub are created in Post.createArticleFromGhostPost here, and relevantly, include all the relevant data - title, excerpt, summary, content, URL, etc., per lines 459-477.

Per line 464 in particular, it publishes these to ActivityPub as a post/payload of type Article.

Turning to the Mastodon documentation on payloads here, we see that it doesn’t support articles as a first-class object type, but rather converts them “as best as possible”. Specifically, it uses the “content” field, if available, to generate status text (which is what produces the whole-article-in-the-post result).

It does appear, though, that various forks of the Mastodon server and, of course, other AP clients have varied a lot from this: in theory, per that documentation, we should be seeing the “summary” field (containing the excerpt) used as the content warning and the “url” field (containing the original post link) appended, which doesn’t perfectly match what either I on qoto.org or @Cathy_Sarisky on mastodon.social are seeing; it looks like the former is just using “content” as the status and ignoring the other fields, and as best as I can tell from the screenshot, the latter is appending the URL but using “summary” as the status rather than “content”.

Suggestion:

My suggestion here is to give us the option of not broadcasting the full article content by adding a configuration option (either in .env or by a switch on the Network page) which changes the behavior of Post.createArticleFromGhostPost. Call it “Publish post summary only”, say.

Set “off”, it maintains the current behavior. Set “on”, it replaces the full-content preparation routine (lines 403-452) with one which assembles the “content” field from a formatted version of the title/excerpt/URL of the Ghost post.

That way, both clients which use the “content” field and those which use the other fields in the ActivityPub article should display the teaser-and-link version of the post which people like me are looking for.

3 Likes

Nice catch. I also checked my ActivityPub server database, and noticed that it really holds the full post contents of the articles from Ghost sites that is not hosted on my server.

So apparently I was wrong with my claim that Ghost was dynamically pulling posts from Content API of the source Ghost site. Now I see that it was a wishful thinking, because I thought it’s obviously the best way of achieving current Reader mode. I’m sorry for the wrong claim.

Now, I think that’s a very valid request to “not” include full content on ActivityPub posts. @Cathy_Sarisky also mentioned similar wishes on her latest blog post. And I fully agree. We need to have some options about how we’ll share our articles on Fediverse.

1 Like

I agree, and particularly like the suggestion @Cathy_Sarisky made in her blog post to have a post-specific switch of whether to include everything or not. It could default to whatever is preferred in some higher level setting, but it’s at the “put this out there” stage that the final decision needs to be active. We already make similar decisions on newsletter choice, scheduling etc.

The other logical inclusion would be a ‘reader’ preview mode, at least whilst there are differences between the reader and a web page. It would be good to see what’s missing/mashed before it goes out.

1 Like

Just read this thread. Ghost actually sends the whole article content into the Fediverse?!? Wow, that’s def a deal breaker for me. As a news and commentary site, I publish anywhere from 4 to 10 articles a day, and some are pretty long (> 1,000 words, or longer). Sending the whole article will both irritate my followers, AND expose the content to AI scraping, which I’m doing my best to avoid.

FWIW – I have a setup where I use Zapier to publish to multiple social media channels through Buffer. Took some work and $$, but seems to work pretty well. (I left CoSchedule when they didn’t support some of the channels I use.) I was hopeful that Ghost would make the Zapier-Buffer thing unnecessary, but it looks like I’ll have to keep it for a while.

1 Like

I was thinking about this, and remembered that RSS feed is publishing full article content as well, if you don’t provide a custom RSS feed. I think this fact makes this discussion more interesting.