Skip to content

[Federation]: Relay subscription stuck in pending; no Accept from relay or loops.video after successful actor fetch #1429

Description

@diegosgithub1

Description

Outbound Follow activities from my instance are never answered with Accept or
Reject by Loops-operated servers. The same code path completes successfully
against Mastodon, so this does not appear to be a signing or reachability
problem on my end.

Two cases:

  1. Official relay. Subscribed to https://relay.loopsplatform.com/actor. The
    Follow was delivered and the HTTP request succeeded. The subscription has
    been pending since 2026-08-29 10:47:26 UTC. No Accept, no Reject, and no
    inbound request of any kind from the relay.

  2. Direct user follow. Followed dansup@loops.video at 11:42:30 UTC. Two seconds
    later loops.video resolved my instance successfully:

    11:42:32Z  GET /.well-known/webfinger  -> 200
    11:42:32Z  GET /ap/actor               -> 200
    11:42:34Z  GET /.well-known/nodeinfo   -> 200
    11:42:34Z  GET /nodeinfo/2.1           -> 200
    from 64.225.4.82, UA: Loops/1.0.0-beta.14 (Laravel/13.x; +https://loops.video)
    

    So the Follow arrived and discovery completed, four requests, all 200. Then
    nothing. following_state is still 0 and no Accept was ever delivered.

Because a normal user follow is affected as well as the relay, this looks like
inbound Follow handling rather than anything relay-specific.

Expected: the Follow is answered with Accept (or Reject), and the relay
subscription moves from pending to active.

Actual: the remote completes discovery, then the Follow is silently dropped. No
Accept, no Reject, no error surfaced to the sending instance. The admin UI shows
"Awaiting acceptance" indefinitely, which is indistinguishable from the request
never having been processed.

Ruled out on my side:

  • Instance keypair matches the published publicKeyPem
  • Instance-actor key signature accepted 202 by mastodon.social (this is the key
    RelayService::deliverActivityAsInstance signs relay Follows with)
  • User key signature accepted 202 by mastodon.social, and Mastodon's Accept was
    delivered back to my inbox and processed 202
  • Signature format: (request-target) host date digest, rsa-sha256, Digest present
  • /ap/actor valid, correct inbox / sharedInbox / publicKey
  • /ap/actor/inbox and /ap/inbox reachable, correctly 401 unsigned POSTs
  • nodeinfo valid, reports "name": "loops", "version": "1.0.0-beta.14"
  • Reverse proxy access logging is enabled, so the absence of an Accept is
    measured, not inferred

Full round trip with Mastodon works in both directions. Only Loops-operated
endpoints are silent.

Searched existing issues. #583, #527, #392 and #60 are related but all closed,
and none covers a Follow to the official relay staying pending after a
successful actor fetch.

Deployment: Docker, Caddy reverse proxy, Horizon running, federation enabled.
Instance: loops.dembo.io (single user, no local posts yet).
Reverse proxy access logs available on request.

Running the latest release (v1.0.0-beta.14, 2026-08-03). loops.video reports the
same version via nodeinfo, so both ends of the failing follow are on identical code.

Steps to reproduce

  1. Stand up a fresh Loops instance (1.0.0-beta.14) with federation enabled and
    a valid instance actor.
  2. Subscribe to the official relay: RelayService::subscribe('https://relay.loopsplatform.com/actor')
  3. Observe the Follow is delivered and the subscription row is created with
    status pending.
  4. Wait. No Accept or Reject is received; status stays Awaiting Acceptance indefinitely.
  5. Separately, follow any loops.video account (e.g. dansup@loops.video) from a
    local user.
  6. Check reverse proxy access logs: loops.video fetches webfinger, /ap/actor and
    nodeinfo, all 200.
  7. Observe that no Accept is ever delivered and following_state remains 0.
Image

Loops version

1.0.0-beta.14

Acknowledgements

Yes

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions