{"id":13559170,"url":"https://github.com/matrix-org/matrix-appservice-bridge","last_synced_at":"2025-10-08T21:57:50.019Z","repository":{"id":36733198,"uuid":"41039785","full_name":"matrix-org/matrix-appservice-bridge","owner":"matrix-org","description":"Bridging infrastructure for Application Services","archived":false,"fork":false,"pushed_at":"2025-09-02T15:02:29.000Z","size":7820,"stargazers_count":176,"open_issues_count":68,"forks_count":74,"subscribers_count":26,"default_branch":"develop","last_synced_at":"2025-09-19T15:19:36.985Z","etag":null,"topics":["bridge","library","matrix","nodejs"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/matrix-org.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2015-08-19T14:36:53.000Z","updated_at":"2025-08-30T06:44:19.000Z","dependencies_parsed_at":"2024-01-05T12:24:00.124Z","dependency_job_id":"ff69b916-5826-4393-8c12-7704dbfa7af2","html_url":"https://github.com/matrix-org/matrix-appservice-bridge","commit_stats":{"total_commits":1424,"total_committers":30,"mean_commits":47.46666666666667,"dds":0.523876404494382,"last_synced_commit":"533f27cb9a779a905b6b408ebd04f4c49963c84e"},"previous_names":[],"tags_count":99,"template":false,"template_full_name":null,"purl":"pkg:github/matrix-org/matrix-appservice-bridge","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matrix-org%2Fmatrix-appservice-bridge","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matrix-org%2Fmatrix-appservice-bridge/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matrix-org%2Fmatrix-appservice-bridge/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matrix-org%2Fmatrix-appservice-bridge/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/matrix-org","download_url":"https://codeload.github.com/matrix-org/matrix-appservice-bridge/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matrix-org%2Fmatrix-appservice-bridge/sbom","scorecard":{"id":625158,"data":{"date":"2025-08-11","repo":{"name":"github.com/matrix-org/matrix-appservice-bridge","commit":"e79d1051b8c7158b6fcb2bfab008f13ef0ed65e5"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.7,"checks":[{"name":"Maintained","score":5,"reason":"7 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 5","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Code-Review","score":2,"reason":"Found 6/30 approved changesets -- score normalized to 2","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/changelog.yml:1","Warn: no topLevel permission defined: .github/workflows/docs.yml:1","Warn: no topLevel permission defined: .github/workflows/npm-publish.yml:1","Warn: no topLevel permission defined: .github/workflows/release.yml:1","Warn: no topLevel permission defined: .github/workflows/sign-off.yml:1","Warn: no topLevel permission defined: .github/workflows/test.yml:1","Warn: no topLevel permission defined: .github/workflows/triage-incoming.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/changelog.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/matrix-org/matrix-appservice-bridge/changelog.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/changelog.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/matrix-org/matrix-appservice-bridge/changelog.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/docs.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/matrix-org/matrix-appservice-bridge/docs.yml/develop?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docs.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/matrix-org/matrix-appservice-bridge/docs.yml/develop?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docs.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/matrix-org/matrix-appservice-bridge/docs.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/docs.yml:34: update your workflow using https://app.stepsecurity.io/secureworkflow/matrix-org/matrix-appservice-bridge/docs.yml/develop?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docs.yml:44: update your workflow using https://app.stepsecurity.io/secureworkflow/matrix-org/matrix-appservice-bridge/docs.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/npm-publish.yml:9: update your workflow using https://app.stepsecurity.io/secureworkflow/matrix-org/matrix-appservice-bridge/npm-publish.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/npm-publish.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/matrix-org/matrix-appservice-bridge/npm-publish.yml/develop?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/npm-publish.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/matrix-org/matrix-appservice-bridge/npm-publish.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:9: update your workflow using https://app.stepsecurity.io/secureworkflow/matrix-org/matrix-appservice-bridge/release.yml/develop?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/matrix-org/matrix-appservice-bridge/release.yml/develop?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/sign-off.yml:9: update your workflow using https://app.stepsecurity.io/secureworkflow/matrix-org/matrix-appservice-bridge/sign-off.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/matrix-org/matrix-appservice-bridge/test.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/matrix-org/matrix-appservice-bridge/test.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:27: update your workflow using https://app.stepsecurity.io/secureworkflow/matrix-org/matrix-appservice-bridge/test.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:52: update your workflow using https://app.stepsecurity.io/secureworkflow/matrix-org/matrix-appservice-bridge/test.yml/develop?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/triage-incoming.yml:9: update your workflow using https://app.stepsecurity.io/secureworkflow/matrix-org/matrix-appservice-bridge/triage-incoming.yml/develop?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/changelog.yml:17","Info:   0 out of  11 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   7 third-party GitHubAction dependencies pinned","Info:   0 out of   1 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: github.com/matrix-org/.github/SECURITY.md:1","Info: Found linked content: github.com/matrix-org/.github/SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: github.com/matrix-org/.github/SECURITY.md:1","Info: Found text in security policy: github.com/matrix-org/.github/SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"SAST","score":7,"reason":"SAST tool is not run on all commits -- score normalized to 7","details":["Warn: 11 commits out of 15 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"17 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-p8p7-x288-28g6","Warn: Project is vulnerable to: GHSA-72xf-g2v4-qvf3","Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-qwcr-r2fm-qrc7","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-pxg6-pf52-xh8x","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-rv95-896h-c2vc","Warn: Project is vulnerable to: GHSA-qw6h-vgh9-j6wx","Warn: Project is vulnerable to: GHSA-mwcw-c2x4-8c55","Warn: Project is vulnerable to: GHSA-76c9-3jph-rj3q","Warn: Project is vulnerable to: GHSA-9wv6-86v2-598j","Warn: Project is vulnerable to: GHSA-rhx6-c78j-4q9w","Warn: Project is vulnerable to: GHSA-rm97-x556-q36h","Warn: Project is vulnerable to: GHSA-m6fv-jmcg-4jfg","Warn: Project is vulnerable to: GHSA-cm22-4g7w-348p"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-21T06:10:58.908Z","repository_id":36733198,"created_at":"2025-08-21T06:10:58.908Z","updated_at":"2025-08-21T06:10:58.908Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279000686,"owners_count":26082837,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-08T02:00:06.501Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bridge","library","matrix","nodejs"],"created_at":"2024-08-01T12:05:23.893Z","updated_at":"2025-10-08T21:57:50.013Z","avatar_url":"https://github.com/matrix-org.png","language":"TypeScript","funding_links":[],"categories":["TypeScript","nodejs"],"sub_categories":[],"readme":"# Matrix Application Service Bridging Infrastructure\n\nThis library sits on top of the\n[core application service library](https://github.com/matrix-org/matrix-appservice-node)\nand provides an API for setting up bridges quickly. Check out the\n[HOW-TO](HOWTO.md) for a step-by-step tutorial on setting up a new bridge.\n\n`matrix-appservice-bridge` requires Node JS 22.x or greater.\n\nIf you are looking to contribute to this library, please check out our [CONTRIBUTING](./CONTRIBUTING.md) guide.\n\n# API\n\nA hosted reference can be found on\n[GitHub Pages](http://matrix-org.github.io/matrix-appservice-bridge).\nAlternatively, build the docs using `yarn gendoc`. Each component's class\nconstructor is exposed on `require(\"matrix-appservice-bridge\")` so check each\nclass for more information on how to use each component.\n\n# Architecture\n\n```\n __________________________\n|                          |\n|   Your bridge e.g. IRC   |\n|__________________________|\n __|___________________|___\n|                          |\n| matrix-appservice-bridge |\n|__________________________|\n __|___________________|___\n|                          |\n|    matrix-appservice     |\n|__________________________|\n\n```\n\nThe bridge relies on [`matrix-appservice`](https://github.com/matrix-org/matrix-appservice-node)\nand [`matrix-bot-sdk`](https://github.com/vector-im/matrix-bot-sdk) for their of the [Application\nService API](https://spec.matrix.org/latest/application-service-api/) (AS API) and [Client-Server\nAPI](https://spec.matrix.org/latest/client-server-api/) (CS API) respectively. The bridge manages\nstate for virtual users and provides many useful helper functions bridges may desire.\n\n## Components\nThe bridge is formed around \"components\". You can pick and choose which\ncomponents you use, though some components depend upon other components.\nAll components operate on data models defined in the bridge. You can directly\nconstruct components: the bridge exposes the class constructor.\n\n### `Bridge`\nThe component which orchestrates other components: a \"glue\" component. Provides\na way to start the bridge. This is the component most examples use. Has\ndependencies on most of the components listed above.\n\n### `BridgeStore`\nProvides basic document store (key-value) CRUD operations.\n\n### `UserBridgeStore`\nProvides storage for matrix and remote users. Provides CRUD operations and\nmapping between different types of users.\n\n### `RoomBridgeStore`\nProvides storage for matrix and remote rooms. Provides CRUD operations and\nmapping between different types of rooms.\n\n### `EventBridgeStore`\nProvides storage for matrix and remote event ids.\n\n### `Request` / `RequestFactory`\nAn abstraction provided to identify a single request through the bridge.\nCan be used for request-context logging (each request has a unique ID)\nand metrics (each request can succeed or fail and has timers for how long\nthey take to go through the bridge).\n\n### `Intent`\nProvides a way to perform Matrix actions by *intent* rather than by raw\nAPI calls. This can be thought of as an extension to the client-server JS SDK.\nFor example, `intent.invite(roomId, invitee)` would make sure that you are\nactually joined to the room `roomId` first (and will automatically join it if\nyou aren't) before trying to send the invite.\n\nPerforming actions by *intent* makes creating bridges a lot easier. For example,\nif your bridge has no concept of inviting or joining rooms, then you don't need\nto care about it either in the bridge. Simply calling\n`intent.sendMessage(roomId, text)` would make sure that you are joined to the\nroom first before sending the message.\n\n### `ConfigValidator`\nProvides a way to validate a YAML file when provided with a schema file.\nUseful for setting your bridge-specific configuration information.\n\n### `Cli`\nProcesses command line arguments and runs the `Bridge`.\n\n### `AppServiceBot`\nA wrapper around the JS SDK `MatrixClient` designed for use by the application\nservice *itself*. Contains helper methods to get all rooms the AS is in, how\nmany virtual / real users are in each, etc.\n\n## `Logging`\n\nThis component exposes access to the bridges log reporter.\nTo use the component, use `Logger.configure` to setup \nthe logger.\n\n```js\n// Configure the logger by providing these options\nLogger.configure({ level: \"info\" });\n\n// In each module, instantiate the Logger class with a module name.\nconst log = new Logger('MyModule');\n\n// Then log away!\nlog.info('Hello, this is a log from my module');\nlog.debug('Some debug info');\nlog.error('Oh no, something went wrong!', new Error('an error'));\n```\n\nYou **MUST** configure the logger before anything will be emitted to the console.\n\n## `RoomLinkValidator`\nThis component validates if a room can be linked to a remote channel based on\nwhether it conflicts with any rules given in a rule file. The filename is given\nin `opts.roomLinkValidation.ruleFile` for `Bridge`, though you may also set the\nrules as an object instead by setting `opts.roomLinkValidation.rules`.\nThe format for the file (in YAML) or the object is as follows:\n```javascript\n{\n    // This rule checks the memberlist of a room to determine if it will let\n    // the bridge create a link to the room. This is useful for avoiding conflicts\n    // with other bridges.\n    \"userIds\": {\n        // Anyone in this set will be ALWAYS exempt from the conflicts rule.\n        // Here anyone whose localpart starts with nice is exempt.\n        \"exempt\": [\"@nice.+:example.com\"]\n        // This is a regex that will exclude anyone who has \"guy\" at the end of their localpart.\n        // evilbloke is also exempt.\n        \"conflict\": [\"@.+guy:example.com\", \"@evilbloke:example.com\"]\n    }\n}\n```\n\nIf you set `opts.roomLinkValidation.triggerEndpoint` to `true`, then you may use\n`/_bridge/roomLinkValidator/reload` to reload the config from file. This endpoint\noptionally takes the `filename` parameter if you want to reload the config from\nanother location.\n\n\n## `RoomUpgradeHandler`\nThis component automatically handles [Room Upgrades](https://matrix.org/docs/spec/client_server/unstable.html#post-matrix-client-r0-rooms-roomid-upgrade)\nby changing all associated room entries to use the new room id as well as leaving\nand joining ghosts. It can also be hooked into so you can manually adjust entries,\nor do an action once the upgrade is over.\n\nThis component is disabled by default but can enabled by simply defining `roomUpgradeOpts`\nin the options given to the bridge (simply `{}` (empty object)). By default, users\nwill be copied on upgrade. Upgrade events will also be consumed by the bridge, and\nwill not be emitted by `onEvent`. For more information, see the docs.\n\n\n## Data Models\n * `MatrixRoom` - A representation of a matrix room.\n * `RemoteRoom` - A representation of a third-party room.\n * `MatrixUser` - A representation of a matrix user.\n * `RemoteUser` - A representation of a third-party user.\n\n\n## Signaling Bridge Errors\n\n**Warning**: This feature is experimental and not part of the matrix specification\nyet. [MSC2162](https://github.com/matrix-org/matrix-doc/pull/2162) is currently ongoing\nwhich means that changes will likely happen to the format of the errors. Do not use\nthis in production bridges.\n\nThis section applies when you are using `Bridge` and want to notify your users\nabout problems while processing their events.\n\nOne thing the bridge requires you to do is fulfilling or rejecting the\n`request` promise which is handed to you as argument of the\n`controller.onEvent` callback. When rejecting the promise, the `Error` you\nreject with will indicate to the bridge library how to behave:\n\n- On an `EventNotHandledError` (and all its subtypes) the bridge will declare\n  the event as permanently failed. It will mark it as such by sending a\n  `de.nasnotfound.bridge_error` room event, which will make clients show an\n  error message to their users.\n- On all other `Error` types no message is sent to the clients. The bridge\n  still uses the information that the event was handled for queuing purposes.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmatrix-org%2Fmatrix-appservice-bridge","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmatrix-org%2Fmatrix-appservice-bridge","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmatrix-org%2Fmatrix-appservice-bridge/lists"}