Skip to content

Commit c7eca24

Browse files
authored
Add crossposting FAQ and reference snippets in the docs (#3483)
1 parent f7a8cf3 commit c7eca24

7 files changed

Lines changed: 85 additions & 7 deletions

File tree

docs/faq/crossposting.md

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# Can the plugin crosspost to my existing Mastodon account?
2+
3+
Short answer: no, and that is a deliberate design choice rather than a missing feature.
4+
5+
This is one of the most common questions in the [support forum](https://wordpress.org/support/plugin/activitypub/), usually phrased as *"How do I connect the plugin to my Mastodon account?"* or *"Why doesn't my post show up on my Mastodon profile?"* The honest answer is that the plugin is not a crossposter and is not trying to be one. This page explains the difference, why crossposting will not be added, and what to do if mirroring to an existing account is genuinely what you want.
6+
7+
## Crossposter vs. native federation
8+
9+
These are two fundamentally different models, and the plugin sits firmly on the federation side.
10+
11+
| | Crossposter | *ActivityPub for WordPress* |
12+
|---|---|---|
13+
| **Where your identity lives** | On a third-party Mastodon server (`@you@mastodon.social`) | On your own site (`@you@example.com`) |
14+
| **What gets sent** | A *copy* of each post, pushed to that account | The *original* post, fetched and followed directly |
15+
| **Who your followers follow** | Your Mastodon account | Your website |
16+
| **Where replies land** | On the remote account, separate from your site | Back on your site, as WordPress comments |
17+
| **Accounts you need** | A separate Mastodon account, plus your site | Just your site |
18+
19+
A crossposter takes a copy of your WordPress post and publishes it to a *separate* account you already have somewhere else. Your identity, your followers, and every reply stay over there. WordPress is only a feed that pushes copies out.
20+
21+
*ActivityPub for WordPress* works the other way around. It turns your own site into a first-class member of the Fediverse, so `@you@example.com` **is** the account. People on Mastodon, Pixelfed, Threads, and other platforms follow your site directly, your posts are the originals instead of copies, and likes, boosts, and replies come back to your site as comments. You own both the identity and the conversation.
22+
23+
## Why the plugin will not crosspost
24+
25+
Crossposting and native federation pull in opposite directions, and bolting one onto the other reintroduces the very problems federation is meant to solve:
26+
27+
- **Split identity.** Your audience has to choose between following your site and following your Mastodon account, and neither one ever has the full picture.
28+
- **Lost conversations.** Replies would land on the remote account, disconnected from the original post, so your site's comments section would never see them.
29+
- **Duplicate content.** The same post would exist in two places, with two follower lists, two comment threads, and two link targets. That is confusing for readers and bad for search engines.
30+
31+
> [!NOTE]
32+
> This is about keeping the plugin focused, not about a technical limitation. Crossposting to an account you control elsewhere is a real, useful workflow. It is simply a different job, and dedicated tools already do it well.
33+
34+
## "But I already have a big Mastodon account"
35+
36+
This is the most understandable reason people ask, and there are a few legitimate paths depending on what you want your main presence to be.
37+
38+
**Option 1: Make your WordPress site your primary Fediverse identity.**
39+
If you would rather consolidate around your own domain, you can bring your existing Mastodon followers with you. Mastodon's account-migration tool can move your followers to `@you@example.com`, after which new posts reach them natively, with replies arriving as comments. See the [Account Migration guide](../how-to/account-migration.md).
40+
41+
**Option 2: Keep your big Mastodon account and have it boost your posts.**
42+
If you want to keep your established account but still surface new articles to its followers, [FediBoost](https://github.com/kraftbj/fediboost) is a good middle ground. Instead of copying your post, it has your connected Mastodon account automatically *boost* (reblog) the original post that this plugin already federated from your site. The post stays the single canonical version, replies still come back to your site as comments, and your Mastodon followers see it through the boost.
43+
44+
**Option 3: Keep your Mastodon account as your main presence and mirror articles to it.**
45+
If your established Mastodon account is where you want your audience to live, that is a crossposting job. Use a [dedicated crossposter plugin](https://wordpress.org/plugins/search/mastodon/) built for exactly this. They work happily alongside this plugin or entirely on their own.
46+
47+
> [!TIP]
48+
> These options are not either/or. Keep *ActivityPub for WordPress* running so your site has its own Fediverse presence, then layer FediBoost or a crossposter on top to also reach your existing Mastodon audience. They coexist without conflict.
49+
50+
## Related
51+
52+
- [Account Migration](../how-to/account-migration.md) — move your Mastodon followers to your WordPress site.
53+
- [What is "ActivityPub for WordPress"?](../../readme.txt) — the bigger picture of how the plugin federates your site.

docs/faq/missing-comments.md

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,18 @@ Work through this checklist in order:
1313
The most common "missing" comment is sitting in a queue:
1414

1515
- **Comments → Spam**: Akismet and friends regularly misclassify federated comments (see below).
16-
- **Comments → Pending**: **Settings → Discussion → "Comment must be manually approved"** or **"must have a previously approved comment"** holds federated replies like any other comment. If you want Fediverse interactions to skip moderation, use the official [auto-approve-reactions snippet](https://github.com/Automattic/wordpress-activitypub/tree/trunk/snippets/auto-approve-reactions).
16+
- **Comments → Pending**: **Settings → Discussion → "Comment must be manually approved"** or **"must have a previously approved comment"** holds federated replies like any other comment. If you want Fediverse interactions to skip moderation, use the official [auto-approve-reactions snippet](../../snippets/auto-approve-reactions).
1717
- **Comments → Trash**: entries on the Disallowed Comment Keys list land here (see below).
1818

19-
**Beware of "silently discard" options.** Akismet's "Silently discard the worst and most pervasive spam" and similar auto-delete settings (e.g. Antispam Bee's honeypot delete) remove comments without a trace — it looks exactly like they never arrived. Switch such options to "mark as spam" at least while debugging.
19+
> [!WARNING]
20+
> **Beware of "silently discard" options.** Akismet's "Silently discard the worst and most pervasive spam" and similar auto-delete settings (e.g. Antispam Bee's honeypot delete) remove comments without a trace — it looks exactly like they never arrived. Switch such options to "mark as spam" at least while debugging.
2021
2122
### 2. Captcha and honeypot plugins
2223

23-
**The headline cause.** Captcha plugins usually do not distinguish between a comment submitted via the form and one created via an API — and a federated reply can never pass a captcha. Confirmed examples from support threads and issues:
24+
> [!IMPORTANT]
25+
> Captcha plugins are the single most common cause. They usually do not distinguish between a comment submitted via the form and one created via an API, and a federated reply can never pass a captcha.
26+
27+
Confirmed examples from support threads and issues:
2428

2529
- **hCaptcha**: the comment-form integration blocks all federated replies. Disable hCaptcha for the comment form (keep it for login etc.).
2630
- **Advanced Google reCAPTCHA**: blocked all incoming replies; a telltale sign was that comment **notification emails still arrived** while the comments themselves never materialized.
@@ -62,6 +66,7 @@ If a caching layer serves cached HTML where the remote server expects JSON ([con
6266
Some "missing comments" are protocol semantics, not bugs:
6367

6468
- **Only actual replies become comments.** A post that merely @-mentions you — written from scratch instead of using the Reply button — has no `inReplyTo` and cannot be matched to a post.
69+
- **Quotes are not replies.** A post that *quotes* yours is shown as a reaction (in the facepile), not as a comment. If you would rather see quotes in the comments, use the [Quotes as Comments snippet](../../snippets/quotes-as-comments).
6570
- **Visibility matters.** Replies with "mentioned people only" visibility are treated as private messages, not public comments.
6671
- **Deep threads:** replies to *other people's* replies arrive via the thread; in some setups replies addressed to a local WordPress comment rather than the post are still not imported — a known limitation under investigation.
6772
- **Companion plugins:** if you run the [Friends plugin](https://wordpress.org/plugins/friends/), mention-only posts appear there as feed items rather than as comments — that is intentional routing.
@@ -70,4 +75,6 @@ Some "missing comments" are protocol semantics, not bugs:
7075

7176
Update the plugin first to rule out long-fixed bugs. Then test with all antispam/captcha/security plugins temporarily disabled — if the reply arrives, re-enable them one at a time to find the culprit.
7277

78+
To see whether the reply even reached your site, the [Inspect Internal Storage snippet](../../snippets/inspect-internal-storage) exposes the plugin's Inbox and Outbox in the WordPress admin: if the activity is there, the problem is local filtering (steps 1-4); if it is not, it was blocked before processing (steps 5-6).
79+
7380
If none of this helps, open a thread in the [support forum](https://wordpress.org/support/plugin/activitypub/) and include: which antispam/captcha/caching/security plugins you run, whether comment notification emails arrive, and the status code your server log shows for the inbox POST.

docs/faq/pending-follow-requests.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ The plugin **always accepts follow requests automatically** — there is no manu
1010

1111
If step 1 is blocked, your site never learns about the follow. If step 2 or 3 fails, your site knows about the follower but the remote server never hears back. The first thing to check tells you which half is broken:
1212

13+
> [!TIP]
1314
> **Does the follower appear in WordPress?** Check **Users → Followers** (or **Settings → ActivityPub → Followers** for the blog profile).
1415
>
1516
> - **No** → the follow request never reached your site. Work through [Inbound checks](#inbound-checks).
@@ -31,7 +32,8 @@ These block the follow request before your site ever sees it. Your server's acce
3132

3233
### 1. Host firewall (mod_security)
3334

34-
**The most common cause on shared hosting.** Many hosts (HostGator, Bluehost, OVH, Strato, and other cPanel-based hosts are recurring examples) run mod_security rules that block `POST` requests with the `application/activity+json` content type.
35+
> [!IMPORTANT]
36+
> **The most common cause on shared hosting.** Many hosts (HostGator, Bluehost, OVH, Strato, and other cPanel-based hosts are recurring examples) run mod_security rules that block `POST` requests with the `application/activity+json` content type.
3537
3638
There is nothing the plugin can do about this — only your host can fix it. Contact their support with something like:
3739

@@ -115,4 +117,6 @@ If outbound requests fail, contact your host.
115117

116118
Update the plugin first — several historic causes (subdirectory signatures, the 4.0.0 inbox regression, Pixelfed follows without addressing) were plugin bugs that are long fixed.
117119

120+
To pinpoint which half of the round-trip broke, the [Inspect Internal Storage snippet](../../snippets/inspect-internal-storage) exposes the plugin's Inbox and Outbox in the WordPress admin: a missing `Follow` in the Inbox points to the [Inbound checks](#inbound-checks), while a stuck `Accept` in the Outbox points to the [Outbound checks](#outbound-checks).
121+
118122
If none of this helps, open a thread in the [support forum](https://wordpress.org/support/plugin/activitypub/) and include: your hosting provider, active security/caching/antispam plugins, whether the follower appears in WordPress, and the status code your server log shows for inbox POSTs.

docs/faq/readme.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
# Frequently Asked Questions
22

3-
Answers to questions and problems that come up regularly in the [support forum](https://wordpress.org/support/plugin/activitypub/) and on [GitHub](https://github.com/Automattic/wordpress-activitypub/issues). Each answer is a checklist, ordered by how often the cause turns out to be the culprit.
3+
Answers to questions and problems that come up regularly in the [support forum](https://wordpress.org/support/plugin/activitypub/) and on [GitHub](https://github.com/Automattic/wordpress-activitypub/issues). Most answers are troubleshooting checklists, ordered by how often the cause turns out to be the culprit; a few explain how the plugin is meant to work.
44

55
If your question is missing, please [open an issue](https://github.com/Automattic/wordpress-activitypub/issues/new/choose) or [submit a pull request](https://github.com/Automattic/wordpress-activitypub/pulls). For guides on configuring specific setups, see the [How-To section](../how-to/readme.md).
66

7+
Several answers point to community [snippets](../../snippets/README.md): small, optional plugins that adjust or extend the plugin's behavior, for example to auto-approve reactions, show quotes as comments, or inspect the internal Inbox and Outbox while debugging.
8+
79
## Table of Contents
810

911
- [Why is a follow request stuck on "pending"?](pending-follow-requests.md) — The remote side shows "Follow requested" / "Cancel request" forever.
1012
- [Why don't comments from the Fediverse show up?](missing-comments.md) — Replies on Mastodon & Co. never appear as WordPress comments, often caused by captcha and antispam plugins.
13+
- [Can the plugin crosspost to my existing Mastodon account?](crossposting.md) — Why this is native federation rather than a crossposter, and what to do if you want to mirror posts instead.

docs/how-to/account-migration.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,5 +89,7 @@ Only if both checks pass will the server transfer followers from the old account
8989

9090
- **Migration moves followers, not content.** Your posts, media, and other content stay on the original platform. Only the follower relationships are transferred.
9191
- **Not all servers support Move.** Most Mastodon-compatible servers do, but some smaller Fediverse platforms may not process `Move` activities.
92-
- **Migration is essentially one-way.** While you can technically migrate back, followers who already transferred may not automatically follow back to the original account.
9392
- **Add aliases before initiating the move.** The target account must have the origin listed in its aliases, or the move will be rejected.
93+
94+
> [!CAUTION]
95+
> **Migration is essentially one-way.** While you can technically migrate back, followers who already transferred may not automatically follow back to the original account.

docs/how-to/reverse-proxy.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22

33
If you are using a reverse proxy with Apache to serve your site, you may find that followers are unable to follow your blog. This happens because the proxy rewrites the `Host` header to your server’s internal DNS name, which the plugin then uses to sign replies. However, remote servers expect replies to be signed with your public DNS name. To resolve this, you need to use the `ProxyPreserveHost On` directive to ensure that the external host name is passed through to the backend server.
44

5-
If you are using SSL between the reverse proxy and the internal host, you may also need to set `SSLProxyCheckPeerName off` if the internal host does not present the correct SSL certificate. Be aware that this can introduce a security risk in some environments.
5+
If you are using SSL between the reverse proxy and the internal host, you may also need to set `SSLProxyCheckPeerName off` if the internal host does not present the correct SSL certificate.
6+
7+
> [!WARNING]
8+
> Disabling `SSLProxyCheckPeerName` stops the proxy from verifying the internal host's certificate, which can introduce a security risk in some environments. Only use it when you trust the network between the proxy and the backend.
69
710
## Example
811

readme.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,12 @@ This plugin connects your WordPress blog to popular social platforms like Mastod
6161

6262
*ActivityPub for WordPress* adds Fediverse features to WordPress, but it is not a replacement for platforms like Friendica or Mastodon. If you're looking to host a decentralized social network, consider using [Mastodon](https://joinmastodon.org/) or [Friendica](https://friendi.ca/).
6363

64+
= Is this a Mastodon crossposter? Can it post to my existing Mastodon account? =
65+
66+
No. A crossposter pushes copies of your posts to a *separate* account you already have on someone else's server. *ActivityPub for WordPress* does the opposite: it makes your own site a first-class Fediverse account (`@you@example.com`), so people follow your site directly and replies come back as WordPress comments, with no second account required.
67+
68+
The plugin will not add crossposting to an existing account; that is a deliberate choice, not a missing feature. If you would rather mirror articles to an established Mastodon account, that is a job for a dedicated crossposter plugin.
69+
6470
= Why "ActivityPub"? =
6571

6672
The name ActivityPub comes from the two core ideas behind the protocol:

0 commit comments

Comments
 (0)