Problems with Matrix homeserver implementations

Conduit

Ineffective governance

Timo, Conduit’s creator, had been generally unavailable for a long time due to other obligations (which is reasonable). Unfortunately, this meant the project had stagnated. After much community pressure, one new maintainer was appointed, but Timo required all Rust code changes to be reviewed by him before being merged, which essentially defeated the point.

The newly appointed maintainer was Charles, who put in a lot of effort to clean up CI before burning out due to the issues enumerated in this section. After this, he essentially just became a defense mechanism against questions like “why is project development still so slow” and “will you appoint more maintainers”. Eventually, another maintainer was appointed and Charles stepped down.

Technical disagreements

Timo seems fixated on maintaining backwards compatibility of configuration and secrets handling forever, but there are issues with these that require breaking changes to fix.

Disregard for testing

Timo claims to care about testing and reliability. Conduit once had sytest running in CI, but no longer does. Charles thinks Complement never worked. Timo says this is because he doesn’t maintain CI. This claim and these (in)actions are in conflict.

Prior dishonesty about the state of the project

After months of making unmateralized claims that a Conduit release will be made soon, a release was finally made, but only because of the threat of being overshadowed by a fork (Conduwuit). As a result, the release was very rushed and incomplete. Several users reported issues in Conduit’s Matrix room regarding the release shortly after its announcement.

There are many other instances of unmaterilized claims that something will happen soon, which gives the project the appearance of being active when it is actually not.

To be clear, it’s perfectly okay to not have the time to work on these things, the problem is about communicating this. More recently, Timo has since admitted to and apologized for not having enough time to dedicate to Conduit, hence the “prior” in this section’s header.

Conduwuit

Fork point

Conduwuit was not forked off of a release version of Conduit. Conduwuit’s first commit is 40908b24e74bda4c80a5a6183602afcc0c04449b, which is on top of Conduit’s 3bfdae795d4d9ec9aeaac7465e7535ac88e47756, which is not tagged as a release. The implication is that the Conduit’s maintainers did not feel that the code was production-ready at this point in time, which makes it a questionable foundation for a fork. In practice, however, it seems most HS operators using Conduit run the latest code anyway, so this doesn’t have that much weight.

Commit history

The early post-fork commits are messy because the project was not originally intended to become a serious fork, just a personal one. It’s hard to get a good overview of what exactly changed since the fork and why.

Examples:

High-friction development workflow

In Conduwuit’s beginning, Strawberry would add a large number of commits to a dev branch and then merge them into main when they were satisfied with the code in order to make a release. Pushes to the dev branch were not gated on CI passing, and pull requests were intended to target the dev branch. This meant that any time an external contributor wanted to open a PR, there was a high chance CI would fail for their branch because CI was already failling on the base (dev) branch.

For some contributors, instead of going through PRs, Strawberry would cherry-pick their changes directly from their fork into the dev branch. Occasionally these changes were not even ready according to the commit’s author.

PR 322 exemplifies both of these problems. Charles wanted to work on a feature but first had to fix brokenness introduced on the dev branch, some of which was caused by a commit being cherry-picked into dev that was not ready according to its author.

Charles discussed this issue in DMs with Strawberry and proposed the alternative standard PR-based workflow used by most other projects on GitHub, which Strawberry was receptive to. For a period of time, this workflow was used.

However, it seems like Strawberry has reverted to adding an unreviewably large number of commits to a single branch and then self-merging without any reviews, as seen in PR 419. This brings us to the next section.

Lack of code review

Large changes have been accepted with no scrutiny that result in many problems that other people have to spend hours of their life trying to solve, when the original changes should have simply not been accepted in the first place. The most egregious example of this was the merging of the hot-reloading PR, after which Olivia put in a lot of effort to fix build-related things here and here that were made much harder by the hot-reloading changes.

Irresponsible disclosure

Strawberry, Conduwuit’s creator, irresponsibly disclosed a security vulnerability to the public before Conduit had a chance to ship a release with a fix. Strawberry only knew about this vulnerability because a Conduit maintainer was kind enough to inform them despite having no incentive to do so.

Here you can see Strawberry making fun of Conduit for not having made a release with a fix for the security vulnerability yet:

{
  "content": {
    "body": "also conduit is still vulnerable ",
    "msgtype": "m.text"
  },
  "origin_server_ts": 1715011819091,
  "room_id": "!n8DKU1BeeJilOJXDPr:seirdy.one",
  "sender": "@strawberry:puppygock.gay",
  "type": "m.room.message",
  "unsigned": {},
  "event_id": "$Wexiein_XOVYAi2KT4_R98mCjqHBh2GxMLrUroRE6WM",
  "user_id": "@strawberry:puppygock.gay"
}

And here (and around this message) you can see them explaining what the vulnerability is:

{
  "content": {
    "body": "rendering untrusted HTML is not intended, end of story",
    "msgtype": "m.text"
  },
  "origin_server_ts": 1715013727510,
  "room_id": "!n8DKU1BeeJilOJXDPr:seirdy.one",
  "sender": "@strawberry:puppygock.gay",
  "type": "m.room.message",
  "unsigned": {},
  "event_id": "$aTpHtyh9ZZCk_kNg8_g1G8bqXplNAxqz0Mk9Rep0I9c",
  "user_id": "@strawberry:puppygock.gay"
}

Double standards about handling security issues

In a direct message conversation between Charles and Strawberry, Strawberry made it clear that they expect Conduit to find a way to report security vulnerabilities if they find any, despite Strawberry having banned the Conduit maintainers from the Conduwuit room and leaving their DM with Timo.

Later on, https://github.com/girlbossceo/conduwuit/pull/406 was created to fix security vulnerabilities that are shared with Conduit before so much as informing Conduit of the existence of these problems. Conduit has since fixed these issues in https://gitlab.com/famedly/conduit/-/commit/48c1f3bdba95d6f0522923ec0cea65393ee8bfd1 and https://gitlab.com/famedly/conduit/-/commit/c453d45598f1043b432149b714e2565f12f32360, notably well after Conduwuit publicized the issues by making their patches public.

Handling of dissent

Dissenting discussion about the project’s direction and management is often met with censorship. Dissent is often assumed to be rooted in bad faith, despite a lack of evidence to suggest it.

Olivia, Charles, and Lambda/Xiretza were all banned from Conduwuit’s Matrix room and GitHub repository at roughly 2024-06-01T12:00:00-07:00 for “malicious libel/defamation against conduwuit”. K900 was also banned due to “association with hostile users”. Presumably, this happened because Strawberry read this document. Charles feels this proves the point.

Matrix ban events JSON
[
  {
    "content": {
      "membership": "ban",
      "reason": "malicious libel/defamation against conduwuit"
    },
    "origin_server_ts": 1717268250442,
    "room_id": "!n8DKU1BeeJilOJXDPr:seirdy.one",
    "sender": "@strawberry:puppygock.gay",
    "state_key": "@charles:computer.surgery",
    "type": "m.room.member",
    "unsigned": {
      "replaces_state": "$aoF1lEvG1WXW6dpA6-rbdRlw1LH-WvBI9_iP1Ax27NA",
      "prev_content": {
        "avatar_url": "mxc://computer.surgery/JZw3HhMjUXieIyyGl9tE5dcHys5ywUVU",
        "displayname": "Charles 👉️👈️",
        "membership": "join"
      },
      "prev_sender": "@charles:computer.surgery"
    },
    "event_id": "$53oXJ26QVJzoMiln-r3oIt_2Y6s7IbK11R2FQkvjbAo",
    "user_id": "@strawberry:puppygock.gay",
    "replaces_state": "$aoF1lEvG1WXW6dpA6-rbdRlw1LH-WvBI9_iP1Ax27NA",
    "prev_content": {
      "avatar_url": "mxc://computer.surgery/JZw3HhMjUXieIyyGl9tE5dcHys5ywUVU",
      "displayname": "Charles 👉️👈️",
      "membership": "join"
    }
  },
  {
    "content": {
      "membership": "ban",
      "reason": "malicious libel/defamation against conduwuit"
    },
    "origin_server_ts": 1717268257729,
    "room_id": "!n8DKU1BeeJilOJXDPr:seirdy.one",
    "sender": "@strawberry:puppygock.gay",
    "state_key": "@xiretza:xiretza.xyz",
    "type": "m.room.member",
    "unsigned": {
      "replaces_state": "$LqPZHuFfknBrf2VEaYJ5WxEygFIWoqULRzzo6zGJCh8",
      "prev_content": {
        "avatar_url": "mxc://xiretza.xyz/EnKIfRKPubPbJUvjzWRfOjMj",
        "displayname": "xiretza",
        "membership": "join"
      },
      "prev_sender": "@xiretza:xiretza.xyz"
    },
    "event_id": "$dC2NT9U9PpFDsQEXy90g_4CoXqEwOpIgSnEQWZiFjx8",
    "user_id": "@strawberry:puppygock.gay",
    "replaces_state": "$LqPZHuFfknBrf2VEaYJ5WxEygFIWoqULRzzo6zGJCh8",
    "prev_content": {
      "avatar_url": "mxc://xiretza.xyz/EnKIfRKPubPbJUvjzWRfOjMj",
      "displayname": "xiretza",
      "membership": "join"
    }
  },
  {
    "content": {
      "membership": "ban",
      "reason": "malicious libel/defamation against conduwuit"
    },
    "origin_server_ts": 1717268305363,
    "room_id": "!n8DKU1BeeJilOJXDPr:seirdy.one",
    "sender": "@strawberry:puppygock.gay",
    "state_key": "@benjamin:computer.surgery",
    "type": "m.room.member",
    "unsigned": {
      "replaces_state": "$waCFFL2OgQt5wt0nvCOEgboCl_vOqq_fMmZerfeP1ck",
      "prev_content": {
        "avatar_url": "mxc://computer.surgery/SK68XyD4pa5vA58lQ0yQYRt90KLa6pHz",
        "displayname": "benjamin",
        "membership": "leave"
      },
      "prev_sender": "@benjamin:computer.surgery"
    },
    "event_id": "$vukhhI_1koqxWB7w-S8JTuMgbbc5tuAFagRnmIrsylM",
    "user_id": "@strawberry:puppygock.gay",
    "replaces_state": "$waCFFL2OgQt5wt0nvCOEgboCl_vOqq_fMmZerfeP1ck",
    "prev_content": {
      "avatar_url": "mxc://computer.surgery/SK68XyD4pa5vA58lQ0yQYRt90KLa6pHz",
      "displayname": "benjamin",
      "membership": "leave"
    }
  },
  {
    "content": {
      "membership": "ban",
      "reason": "malicious libel/defamation against conduwuit"
    },
    "origin_server_ts": 1717268327222,
    "room_id": "!n8DKU1BeeJilOJXDPr:seirdy.one",
    "sender": "@strawberry:puppygock.gay",
    "state_key": "@lambda:blep.space",
    "type": "m.room.member",
    "unsigned": {
      "replaces_state": "$nLWmzRfC-1MkabyfX342dxnZcU3jyus2tCAk6qOYekE",
      "prev_content": {
        "avatar_url": "mxc://blep.space/GPT5ou9mlSXU98l8fyep6YDZghxVY2mf",
        "displayname": "Lambda 🏳️‍⚧️",
        "membership": "leave"
      },
      "prev_sender": "@lambda:blep.space"
    },
    "event_id": "$pN-iDdKHJbB6nAuludvAyRR3OHtWUlpWo1A2q8rLl7w",
    "user_id": "@strawberry:puppygock.gay",
    "replaces_state": "$nLWmzRfC-1MkabyfX342dxnZcU3jyus2tCAk6qOYekE",
    "prev_content": {
      "avatar_url": "mxc://blep.space/GPT5ou9mlSXU98l8fyep6YDZghxVY2mf",
      "displayname": "Lambda 🏳️‍⚧️",
      "membership": "leave"
    }
  },
  {
    "content": {
      "membership": "ban",
      "reason": "association with hostile users"
    },
    "origin_server_ts": 1717273653854,
    "room_id": "!n8DKU1BeeJilOJXDPr:seirdy.one",
    "sender": "@strawberry:puppygock.gay",
    "state_key": "@k900:0upti.me",
    "type": "m.room.member",
    "unsigned": {
      "replaces_state": "$JYlc_2NPiblq3IAqqBc57BJ0VOq_28shtVTNIX1UdaM",
      "prev_content": {
        "avatar_url": "mxc://0upti.me/nGiebPxAshoa4R1tEINhpcQe2itAj5ce",
        "displayname": "K900",
        "membership": "join"
      },
      "prev_sender": "@k900:0upti.me"
    },
    "event_id": "$l_nLbzZliwHt8zm_5-sVjkgHYkrkWOJPf-zx2YozR2o",
    "user_id": "@strawberry:puppygock.gay",
    "replaces_state": "$JYlc_2NPiblq3IAqqBc57BJ0VOq_28shtVTNIX1UdaM",
    "prev_content": {
      "avatar_url": "mxc://0upti.me/nGiebPxAshoa4R1tEINhpcQe2itAj5ce",
      "displayname": "K900",
      "membership": "join"
    }
  }
]

Jason Volk

Jason has been involved in Matrix for many years, during which he developed his notoriety for being very difficult to work with due to his historically toxic behavior. He has been a high-volume contributor to Conduwuit’s codebase and its Matrix room’s chat logs. For unknown reasons, Strawberry tolerated his behavior for a very long time, despite having an otherwise very low tolerance for toxicity, which is one of the reasons Conduwuit was created in the first place. Eventually, Jason dug a very deep hole during a conversation that has since been deleted by Strawberry (but Charles has a chat export). After this, Strawberry banned him from the Matrix room, giving the following statement:

{
  "content": {
    "body": "> * <@travis:t2l.io> looks to the moderators for what the culture/expectations are here\n\nto speak to this:\nthe conversation absolutely did not need any assumed malice or toxicity, and that's most certainly not the standards or goals of this room and i do not wish this community to behave like that.\n\n\nto speak to the room:\n\nit's extremely unfortunate that his has happened numerous times and it's completely my fault for continuing to let this happen and not deal with it early on. so i sincerely apologise and hope the community does not see any negativity in me from this point forward.\nsimilar users have been banned from the conduwuit community for this exact behaviour historically, and i should have identified this to be the same pattern from the start, same way i did with those users.\n\neither way, to set the precedence for how this room should behave, and to deal with the issue;\n\nJason will be banned from the community as this has happened multiple times before. Jason is a highly valuable contributor, but their actions are not how this room/community should behave and has happened repeatedly.\n\n\nagain i truly apologise and it's completely my fault for letting this happen far too long, and not doing anything about it. i hope all of you will accept my apology and the actions taken, we can move forwards with conduwuit as a whole, and i take this as a lesson learned on my part here. i will be taking a short break from development on my part as all of this has taken a huge toll on my mental health on top of what i'm already dealing with. again, i'm sorry, i won't let this happen again, and i hope i can earn all of your trust back.",
    "format": "org.matrix.custom.html",
    "formatted_body": "<mx-reply><blockquote><a href=\"https://matrix.to/#/!n8DKU1BeeJilOJXDPr:seirdy.one/$dkc96kaPlSvzlnjh35QMyuS7esbjorogXIAnIaKfo_c?via=awawawawawawawawawawawawawawawawawawawawawawawawawawawawawawaw.gay&via=transfem.dev&via=matrix.org\">In reply to</a> * <a href=\"https://matrix.to/#/@travis:t2l.io\">@travis:t2l.io</a><br>looks to the moderators for what the culture/expectations are here</blockquote></mx-reply><p>to speak to this:<br>the conversation absolutely did not need any assumed malice or toxicity, and that's most certainly not the standards or goals of this room and i do not wish this community to behave like that.</p>\n<p>to speak to the room:</p>\n<p>it's extremely unfortunate that his has happened numerous times and it's completely my fault for continuing to let this happen and not deal with it early on. so i sincerely apologise and hope the community does not see any negativity in me from this point forward.<br>similar users have been banned from the conduwuit community for this exact behaviour historically, and i should have identified this to be the same pattern from the start, same way i did with those users.</p>\n<p>either way, to set the precedence for how this room should behave, and to deal with the issue;</p>\n<p>Jason will be banned from the community as this has happened multiple times before. Jason is a highly valuable contributor, but their actions are not how this room/community should behave and has happened repeatedly.</p>\n<p>again i truly apologise and it's completely my fault for letting this happen far too long, and not doing anything about it. i hope all of you will accept my apology and the actions taken, we can move forwards with conduwuit as a whole, and i take this as a lesson learned on my part here. i will be taking a short break from development on my part as all of this has taken a huge toll on my mental health on top of what i'm already dealing with. again, i'm sorry, i won't let this happen again, and i hope i can earn all of your trust back.</p>\n",
    "m.relates_to": {
      "m.in_reply_to": {
        "event_id": "$dkc96kaPlSvzlnjh35QMyuS7esbjorogXIAnIaKfo_c"
      }
    },
    "msgtype": "m.text"
  },
  "origin_server_ts": 1717040913033,
  "room_id": "!n8DKU1BeeJilOJXDPr:seirdy.one",
  "sender": "@strawberry:puppygock.gay",
  "type": "m.room.message",
  "unsigned": {},
  "event_id": "$eB_HRba2DzN6q1XGfLfR74n_UreAgbhIfm6j9vXDXPg",
  "user_id": "@strawberry:puppygock.gay"
}

After banning us, Strawberry seems to have compromised on their statement above (in particular, “Jason will be banned from the community”, emphasis Charles’), because new commits authored by Jason are being added to the repository, the first of which is faa2b95c84794f993fde68588c2ff6d59d66fdcf.

Some time later, Strawberry unbanned Jason from the project’s Matrix room too, entirely doubling back on their statement.

Poor cherry-picking ethics

The following commits were cherry-picked from Grapevine but had their commit metadata wiped so it appears as if Strawberry is the sole author:

  1. https://github.com/girlbossceo/conduwuit/commit/aef25ea1f752b60d1e8db9ed54b94089aed02101
  2. https://github.com/girlbossceo/conduwuit/commit/023fb41c4969ea48a85b3ae12b78d9bacb1bfcd0
  3. https://github.com/girlbossceo/conduwuit/commit/b63937af0b603b35c850c87c5f824447231b5c1a
  4. https://github.com/girlbossceo/conduwuit/commit/79fb8091dcaac4abaa5db64af5679fd81ffe30de

Banning people for using Grapevine

Conduwuit has issued at least one ban to someone purely because they were using Grapevine to participate in their room.

Issues

Issues we would open on their GitHub repository but can’t because we’re banned.

Incorrect authenticated media fallback logic

https://github.com/girlbossceo/conduwuit/blob/5b8464252c2c03edf65e43153be026dbb768a12a/src/service/media/remote.rs#L57-L65

The specification says authenticated media should be checked first and unauthenticated media should be used as a fallback if that fails (source). Conduwuit is doing it backwards.

Grapevine

Conflict of interest

The author of this document is also the person who started the Grapevine project.

Slow pace of development

Grapevine does not see as high development velocity as other homeserver implementations. This is partially a deliberate choice in an attempt to ensure reliability and avoid burnout, and partially due to the demoralizing state of Matrix as a whole.

Dendrite

Under-resourced

According to their FAQ.

Synapse

Performance/scalability/operational issues

Synapse can be hard to operate because it requires the configuration of workers to stay performant, and to Charles’ knowledge it struggles to run on hardware that Conduit and its derivatives can do just fine on. Its performance is also deliberately not as good as it could be to sell more Synapse Pro.

CLA

The project has a Contributor License Agreement. We all know how this goes. See also Synapse Pro.

Synapse Pro

Self-explanatory

This does not necessitate explanation.