Skip to content

Bob unfollows Alice

given: "Alice" created an actor on "banach" called "Alice" with username "Alice"

send.Alice.request.create_actor
{
  "base_url": "http://banach",
  "preferred_username": "Alice",
  "profile": {},
  "automatically_accept_followers": null,
  "name": null
}
receive.Alice.response.create_actor
{
  "attachment": null,
  "published": "2026-03-20T15:23:16.084801",
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://w3id.org/security/v1",
    {
      "manuallyApprovesFollowers": "as:manuallyApprovesFollowers"
    }
  ],
  "publicKey": {
    "id": "http://banach/actor/1qjsEgupIYfu3AUhQaS1SQ#legacy-key-1",
    "owner": "http://banach/actor/1qjsEgupIYfu3AUhQaS1SQ",
    "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqpqP6dZQDFKOEX479sGU\nGkIqnW7FBF4I1gCbXHtxuVIQn1C9X1qy1QMmHPudgtxeaBpAJu97wfh6IFNEvVsd\nsA8gLimFo+jE6hnGTiu0YsJu9UQPcBK+HniPwh1A6+mn+/pVrSFBKawqPk+hgBx5\n+RsuLDsydXLqVKx+lj8GU8/+4e6ON9icGE4HKQPh9TkKI9egtkz/ZsqqcSPhj0ik\nwOnys89AZYSQngP6P7f1/gSQbc0RAsO9DH/0SI8LUiW+TdVtvaKO3GcoSDu+lowo\n50igqTYUY7DRCvpT41jGKljy+4kj884cAPllQJdH4mIwLeRTagTihex9YlKNamyT\nPwIDAQAB\n-----END PUBLIC KEY-----\n"
  },
  "id": "http://banach/actor/1qjsEgupIYfu3AUhQaS1SQ",
  "type": "Person",
  "inbox": "http://banach/inbox/pPZaOQ0tzHWW2MNh4QbJJQ",
  "outbox": "http://banach/actor/1qjsEgupIYfu3AUhQaS1SQ/outbox",
  "followers": "http://banach/actor/1qjsEgupIYfu3AUhQaS1SQ/followers",
  "following": "http://banach/actor/1qjsEgupIYfu3AUhQaS1SQ/following",
  "preferredUsername": "Alice",
  "name": "Alice",
  "identifiers": [
    "acct:Alice@banach",
    "http://banach/actor/1qjsEgupIYfu3AUhQaS1SQ"
  ],
  "endpoints": {
    "sharedInbox": "http://banach/shared_inbox"
  },
  "manuallyApprovesFollowers": true
}

given: "Bob" created an actor on "abel" called "Bob" with username "Bob"

send.Bob.request.create_actor
{
  "base_url": "http://abel",
  "preferred_username": "Bob",
  "profile": {},
  "automatically_accept_followers": null,
  "name": null
}
receive.Bob.response.create_actor
{
  "attachment": null,
  "published": "2026-03-20T15:23:16.682870",
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    "https://w3id.org/security/v1",
    {
      "manuallyApprovesFollowers": "as:manuallyApprovesFollowers"
    }
  ],
  "publicKey": {
    "id": "http://abel/actor/58EZPHWCnz3E_5CRvroRng#legacy-key-1",
    "owner": "http://abel/actor/58EZPHWCnz3E_5CRvroRng",
    "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqmPrIlYoOaVb0v35Zd4h\nSdyuD7eE1UaN9YfVnvKV25KRvhF81a6vZ77j+0pmnOc0PT/I82pdGdXt3gZS7mna\n36I4AQ70vrBOS8+YIeLD1hsvQaJDMa+2bimx9HlCfR7hMcVGyi9gfCDq9SnSHaMU\njb4ZSK0o0NXuobM3CQy7fpEDqKNVXhGhBTchgy1kjuvj7Ch2WQ+caGq521mwSq/T\nIy/SGIR8uuh7Vrc7kkUv3QYmIZMAvaMurO4AHgmelOsfKHdDcQ1f2rV05p3N6rJG\n/zGtREPo7cweTrwvPgO1GB93iD0X2dASYKJHUt5mBC6M8z7FPk/wuknh/EeKUIFu\n+QIDAQAB\n-----END PUBLIC KEY-----\n"
  },
  "id": "http://abel/actor/58EZPHWCnz3E_5CRvroRng",
  "type": "Person",
  "inbox": "http://abel/inbox/nSl4eHQzOi8j33IZCAIIFQ",
  "outbox": "http://abel/actor/58EZPHWCnz3E_5CRvroRng/outbox",
  "followers": "http://abel/actor/58EZPHWCnz3E_5CRvroRng/followers",
  "following": "http://abel/actor/58EZPHWCnz3E_5CRvroRng/following",
  "preferredUsername": "Bob",
  "name": "Bob",
  "identifiers": [
    "acct:Bob@abel",
    "http://abel/actor/58EZPHWCnz3E_5CRvroRng"
  ],
  "endpoints": {
    "sharedInbox": "http://abel/shared_inbox"
  },
  "manuallyApprovesFollowers": true
}

when: "Bob" sends "Alice" a Follow Activity

send.Bob.trigger.send_message
{
  "actor": "http://abel/actor/58EZPHWCnz3E_5CRvroRng",
  "data": {
    "@context": "https://www.w3.org/ns/activitystreams",
    "type": "Follow",
    "actor": "http://abel/actor/58EZPHWCnz3E_5CRvroRng",
    "to": [
      "http://banach/actor/1qjsEgupIYfu3AUhQaS1SQ"
    ],
    "id": "follow:2f7affe0-275c-4748-be5d-6c022c662aa6",
    "published": "2026-03-20T15:23:16Z",
    "object": "http://banach/actor/1qjsEgupIYfu3AUhQaS1SQ"
  }
}
receive.Bob.outgoing.Follow
{
  "data": {
    "raw": {
      "@context": "https://www.w3.org/ns/activitystreams",
      "type": "Follow",
      "actor": "http://abel/actor/58EZPHWCnz3E_5CRvroRng",
      "to": [
        "http://banach/actor/1qjsEgupIYfu3AUhQaS1SQ"
      ],
      "id": "follow:2f7affe0-275c-4748-be5d-6c022c662aa6",
      "published": "2026-03-20T15:23:16Z",
      "object": "http://banach/actor/1qjsEgupIYfu3AUhQaS1SQ"
    }
  },
  "actor": "http://abel/actor/58EZPHWCnz3E_5CRvroRng",
  "event_type": "outgoing",
  "history_id": null
}
receive.Alice.incoming.Follow
{
  "data": {
    "raw": {
      "@context": "https://www.w3.org/ns/activitystreams",
      "type": "Follow",
      "actor": "http://abel/actor/58EZPHWCnz3E_5CRvroRng",
      "to": [
        "http://banach/actor/1qjsEgupIYfu3AUhQaS1SQ"
      ],
      "id": "follow:2f7affe0-275c-4748-be5d-6c022c662aa6",
      "published": "2026-03-20T15:23:16Z",
      "object": "http://banach/actor/1qjsEgupIYfu3AUhQaS1SQ"
    }
  },
  "actor": "http://banach/actor/1qjsEgupIYfu3AUhQaS1SQ",
  "event_type": "incoming",
  "history_id": null
}

when: "Alice" sends an Accept to this Follow Activity

send.Alice.trigger.send_message
{
  "actor": "http://banach/actor/1qjsEgupIYfu3AUhQaS1SQ",
  "data": {
    "@context": "https://www.w3.org/ns/activitystreams",
    "type": "Accept",
    "actor": "http://banach/actor/1qjsEgupIYfu3AUhQaS1SQ",
    "to": [
      "http://abel/actor/58EZPHWCnz3E_5CRvroRng"
    ],
    "published": "2026-03-20T15:23:17Z",
    "object": "follow:2f7affe0-275c-4748-be5d-6c022c662aa6",
    "id": "accept:d23213e6-1563-4055-b28f-047ca039a1f1"
  }
}
receive.Alice.outgoing.Accept
{
  "data": {
    "raw": {
      "@context": "https://www.w3.org/ns/activitystreams",
      "type": "Accept",
      "actor": "http://banach/actor/1qjsEgupIYfu3AUhQaS1SQ",
      "to": [
        "http://abel/actor/58EZPHWCnz3E_5CRvroRng"
      ],
      "published": "2026-03-20T15:23:17Z",
      "object": "follow:2f7affe0-275c-4748-be5d-6c022c662aa6",
      "id": "accept:d23213e6-1563-4055-b28f-047ca039a1f1"
    }
  },
  "actor": "http://banach/actor/1qjsEgupIYfu3AUhQaS1SQ",
  "event_type": "outgoing",
  "history_id": null
}
receive.Bob.incoming.Accept
{
  "data": {
    "raw": {
      "@context": "https://www.w3.org/ns/activitystreams",
      "type": "Accept",
      "actor": "http://banach/actor/1qjsEgupIYfu3AUhQaS1SQ",
      "to": [
        "http://abel/actor/58EZPHWCnz3E_5CRvroRng"
      ],
      "published": "2026-03-20T15:23:17Z",
      "object": "follow:2f7affe0-275c-4748-be5d-6c022c662aa6",
      "id": "accept:d23213e6-1563-4055-b28f-047ca039a1f1"
    }
  },
  "actor": "http://abel/actor/58EZPHWCnz3E_5CRvroRng",
  "event_type": "incoming",
  "history_id": null
}

when: "Bob" sends "Alice" an Undo Follow Activity

send.Bob.trigger.send_message
{
  "actor": "http://abel/actor/58EZPHWCnz3E_5CRvroRng",
  "data": {
    "@context": "https://www.w3.org/ns/activitystreams",
    "type": "Undo",
    "actor": "http://abel/actor/58EZPHWCnz3E_5CRvroRng",
    "to": [
      "http://banach/actor/1qjsEgupIYfu3AUhQaS1SQ"
    ],
    "published": "2026-03-20T15:23:17Z",
    "object": "follow:2f7affe0-275c-4748-be5d-6c022c662aa6",
    "id": "undo:ddd51645-c419-454e-a6a8-3aeb7ded5296"
  }
}
receive.Bob.outgoing.Undo
{
  "data": {
    "raw": {
      "@context": "https://www.w3.org/ns/activitystreams",
      "type": "Undo",
      "actor": "http://abel/actor/58EZPHWCnz3E_5CRvroRng",
      "to": [
        "http://banach/actor/1qjsEgupIYfu3AUhQaS1SQ"
      ],
      "published": "2026-03-20T15:23:17Z",
      "object": "follow:2f7affe0-275c-4748-be5d-6c022c662aa6",
      "id": "undo:ddd51645-c419-454e-a6a8-3aeb7ded5296"
    }
  },
  "actor": "http://abel/actor/58EZPHWCnz3E_5CRvroRng",
  "event_type": "outgoing",
  "history_id": null
}
receive.Alice.incoming.Undo
{
  "data": {
    "raw": {
      "@context": "https://www.w3.org/ns/activitystreams",
      "type": "Undo",
      "actor": "http://abel/actor/58EZPHWCnz3E_5CRvroRng",
      "to": [
        "http://banach/actor/1qjsEgupIYfu3AUhQaS1SQ"
      ],
      "published": "2026-03-20T15:23:17Z",
      "object": "follow:2f7affe0-275c-4748-be5d-6c022c662aa6",
      "id": "undo:ddd51645-c419-454e-a6a8-3aeb7ded5296"
    }
  },
  "actor": "http://banach/actor/1qjsEgupIYfu3AUhQaS1SQ",
  "event_type": "incoming",
  "history_id": null
}

then: The "followers" collection of "Alice" does not include "Bob"

send.Alice.request.fetch
{
  "actor": "http://banach/actor/1qjsEgupIYfu3AUhQaS1SQ",
  "uri": "http://banach/actor/1qjsEgupIYfu3AUhQaS1SQ/followers"
}
receive.Alice.response.fetch
{
  "actor": "http://banach/actor/1qjsEgupIYfu3AUhQaS1SQ",
  "uri": "http://banach/actor/1qjsEgupIYfu3AUhQaS1SQ/followers",
  "data": {
    "@context": "https://www.w3.org/ns/activitystreams",
    "type": "OrderedCollection",
    "id": "http://banach/actor/1qjsEgupIYfu3AUhQaS1SQ/followers",
    "orderedItems": [],
    "totalItems": 0
  }
}

then: The "following" collection of "Bob" does not include "Alice"

send.Bob.request.fetch
{
  "actor": "http://abel/actor/58EZPHWCnz3E_5CRvroRng",
  "uri": "http://abel/actor/58EZPHWCnz3E_5CRvroRng/following"
}
receive.Bob.response.fetch
{
  "actor": "http://abel/actor/58EZPHWCnz3E_5CRvroRng",
  "uri": "http://abel/actor/58EZPHWCnz3E_5CRvroRng/following",
  "data": {
    "@context": "https://www.w3.org/ns/activitystreams",
    "type": "OrderedCollection",
    "id": "http://abel/actor/58EZPHWCnz3E_5CRvroRng/following",
    "orderedItems": [],
    "totalItems": 0
  }
}